package com.dji.sdk.sample.demo.bluetooth;
import android.app.Service;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import com.dji.sdk.sample.R;
import com.dji.sdk.sample.internal.controller.DJISampleApplication;
import com.dji.sdk.sample.internal.utils.DialogUtils;
import com.dji.sdk.sample.internal.utils.ToastUtils;
import dji.common.error.DJIError;
import dji.common.util.CommonCallbacks;
import dji.sdk.sdkmanager.BluetoothDevice;
import dji.sdk.sdkmanager.BluetoothProductConnector;
import java.util.ArrayList;
import java.util.List;
public class BluetoothView extends LinearLayout implements View.OnClickListener {
public BluetoothView(Context context) {
super(context);
initUI(context);
}
private Spinner mSpinnerSelection;
private TextView mTextDevicesInformation;
private List<String> strDevicesList = new ArrayList<String>();
private ArrayAdapter<String> adapter;
private BluetoothProductConnector connector = null;
private ArrayList<BluetoothDevice> devicesList = null;
private BluetoothProductConnector.BluetoothDevicesListCallback bluetoothProductCallback =
new BluetoothProductConnector.BluetoothDevicesListCallback() {
@Override
public void onUpdate(ArrayList<BluetoothDevice> devices) {
if (devicesList == null) {
devicesList = devices;
updateTextTV(devices);
updateList(devicesList);
} else if (!compareDevice(devicesList, devices)) {
devicesList = devices;
updateTextTV(devices);
updateList(devicesList);
}
}
};
private void initUI(Context context) {
setOrientation(VERTICAL);
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Service.LAYOUT_INFLATER_SERVICE);
layoutInflater.inflate(R.layout.content_bluetooth, this, true);
Button mBtnSearchBluetooth = (Button) findViewById(R.id.btn_SearchBluetooth);
mSpinnerSelection = (Spinner) findViewById(R.id.spin_Connect);
Button mBtnDisconnect = (Button) findViewById(R.id.btn_Disconnect);
Button mBtnConnect = (Button) findViewById(R.id.btn_Connect);
mTextDevicesInformation = (TextView) findViewById(R.id.text_DevicesInformation);
mBtnSearchBluetooth.setOnClickListener(this);
mBtnDisconnect.setOnClickListener(this);
mBtnConnect.setOnClickListener(this);
connector = DJISampleApplication.getBluetoothProductConnector();
if (connector == null) {
DialogUtils.showDialog(getContext(), "connect is null");
return;
} else {
connector.setBluetoothDevicesListCallback(this.bluetoothProductCallback);
}
adapter = new ArrayAdapter<String>(getContext(), R.layout.simple_list_item, strDevicesList);
mSpinnerSelection.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_SearchBluetooth:
connector.searchBluetoothProducts(new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError error) {
if (error != null) {
ToastUtils.setResultToToast(error.getDescription());
} else {
ToastUtils.setResultToToast("Searching...");
}
}
});
break;
case R.id.btn_Connect:
final int chosen = mSpinnerSelection.getSelectedItemPosition();
final Runnable runSetDevice = new Runnable() {
@Override
public void run() {
if (chosen != -1 && chosen != 0) {
if (devicesList != null) {
connector.connect(devicesList.get(chosen - 1),
new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError error) {
if (error == null) {
ToastUtils.setResultToToast("Connected");
} else {
ToastUtils.setResultToToast(error.getDescription());
}
}
});
} else {
ToastUtils.setResultToToast("device list has expired");
}
}
}
};
if (devicesList != null) {
if (devicesList.size() != 0) {
runSetDevice.run();
} else {
ToastUtils.setResultToToast("devices list is empty.");
}
} else {
ToastUtils.setResultToToast("devices list is null");
}
break;
case R.id.btn_Disconnect:
connector.disconnect(new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError error) {
if (error == null) {
ToastUtils.setResultToToast("Disconnected");
} else {
ToastUtils.setResultToToast(error.getDescription());
}
}
});
break;
default:
break;
}
}
private static void addLineToSB(StringBuilder sb, String name, Object value) {
sb.append(name + ": ").
append(value == null ? "" : value + "").
append("\n");
}
private void updateTextTV(ArrayList<BluetoothDevice> devices) {
if (devices == null) {
return;
}
final StringBuilder sb = new StringBuilder();
addLineToSB(sb, "Devices", null);
for (int i = 0; i < devices.size(); i++) {
addLineToSB(sb, "Device Name", devices.get(i).getName());
addLineToSB(sb, "Address", devices.get(i).getAddress());
addLineToSB(sb, "Status", devices.get(i).getStatus());
addLineToSB(sb, "RSSI", devices.get(i).getRssi());
}
sb.append("\n");
ToastUtils.setResultToText(mTextDevicesInformation, sb.toString());
}
private void updateList(ArrayList<BluetoothDevice> devices) {
if (devices == null) {
return;
}
if (strDevicesList != null) {
strDevicesList.clear();
strDevicesList.add("Select Devices");
for (int i = 0; i < devices.size(); i++) {
strDevicesList.add(devices.get(i).getName());
}
}
post(new Runnable() {
@Override
public void run() {
adapter.notifyDataSetChanged();
mSpinnerSelection.setSelection(0);
}
});
}
private boolean compareDevice(ArrayList<BluetoothDevice> ar1, ArrayList<BluetoothDevice> ar2) {
if (ar1.size() != ar2.size()) {
return false;
}
for (int i = 0; i < ar1.size(); i++) {
if (!ar1.get(i).equals(ar2.get(i))) {
return false;
}
}
return true;
}
}