package org.droidplanner.android.fragments.mode;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceFragmentCompat;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
import com.o3dr.services.android.lib.drone.connection.ConnectionType;
import org.droidplanner.android.R;
import org.droidplanner.android.dialogs.ClearBTDialogPreference;
import org.droidplanner.android.dialogs.ClearBTPreferenceFragmentCompat;
import org.droidplanner.android.utils.prefs.DroidPlannerPrefs;
public class ModeDisconnectedFragment extends PreferenceFragmentCompat {
private final static IntentFilter filter = new IntentFilter();
static {
filter.addAction(DroidPlannerPrefs.PREF_CONNECTION_TYPE);
filter.addAction(DroidPlannerPrefs.PREF_BT_DEVICE_ADDRESS);
}
private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
switch(intent.getAction()){
case DroidPlannerPrefs.PREF_CONNECTION_TYPE:
updateConnectionSettings();
break;
case DroidPlannerPrefs.PREF_BT_DEVICE_ADDRESS:
updateBluetoothDevicePreference();
break;
}
}
};
private DroidPlannerPrefs prefs;
private PreferenceScreen rootPref;
private PreferenceCategory usbPrefs;
private PreferenceCategory tcpPrefs;
private PreferenceCategory udpPrefs;
private PreferenceCategory bluetoothPrefs;
@Override
public void onCreatePreferences(Bundle bundle, String s) {
prefs = DroidPlannerPrefs.getInstance(getActivity().getApplicationContext());
setPreferencesFromResource(R.xml.preferences_connection, s);
loadConnectionPreferences();
updateBluetoothDevicePreference();
}
@Override
public void onStart(){
super.onStart();
DialogFragment dialogFragment = getDialogFragment();
if(dialogFragment != null){
dialogFragment.dismissAllowingStateLoss();
}
updateConnectionSettings();
LocalBroadcastManager.getInstance(getActivity().getApplicationContext()).registerReceiver(receiver, filter);
}
@Override
public void onDisplayPreferenceDialog(Preference preference) {
if (preference instanceof ClearBTDialogPreference) {
DialogFragment dialogFragment = getDialogFragment();
if (dialogFragment == null) {
dialogFragment = ClearBTPreferenceFragmentCompat.newInstance(preference);
dialogFragment.setTargetFragment(this, 0);
dialogFragment.show(getFragmentManager(), "android.support.v7.preference.PreferenceFragment.DIALOG");
}
} else {
super.onDisplayPreferenceDialog(preference);
}
}
private void updateConnectionSettings() {
if(this.rootPref == null)
return;
hideAllPrefs();
final int connectionType = prefs.getConnectionParameterType();
switch(connectionType){
case ConnectionType.TYPE_USB:
this.rootPref.addPreference(this.usbPrefs);
break;
case ConnectionType.TYPE_TCP:
this.rootPref.addPreference(this.tcpPrefs);
break;
case ConnectionType.TYPE_UDP:
this.rootPref.addPreference(this.udpPrefs);
break;
case ConnectionType.TYPE_BLUETOOTH:
this.rootPref.addPreference(this.bluetoothPrefs);
break;
case ConnectionType.TYPE_SOLO:
break;
}
}
@Override
public void onStop(){
super.onStop();
DialogFragment dialogFragment = getDialogFragment();
if(dialogFragment != null){
dialogFragment.dismissAllowingStateLoss();
}
LocalBroadcastManager.getInstance(getActivity().getApplicationContext()).unregisterReceiver(receiver);
}
private DialogFragment getDialogFragment(){
return (DialogFragment) getFragmentManager().findFragmentByTag("android.support.v7.preference.PreferenceFragment.DIALOG");
}
private void hideAllPrefs(){
if(this.rootPref != null)
this.rootPref.removeAll();
}
private void loadConnectionPreferences(){
this.rootPref = getPreferenceScreen();
this.usbPrefs = (PreferenceCategory) findPreference("pref_usb");
this.tcpPrefs = (PreferenceCategory) findPreference("pref_server");
this.udpPrefs = (PreferenceCategory) findPreference("pref_server_udp");
this.bluetoothPrefs = (PreferenceCategory) findPreference("pref_bluetooth");
}
private void updateBluetoothDevicePreference(){
final ClearBTDialogPreference preference = (ClearBTDialogPreference) findPreference(DroidPlannerPrefs.PREF_BT_DEVICE_ADDRESS);
if(preference == null)
return;
String deviceAddress = prefs.getBluetoothDeviceAddress();
if(TextUtils.isEmpty(deviceAddress)) {
preference.setEnabled(false);
preference.setTitle(R.string.pref_no_saved_bluetooth_device_title);
preference.setSummary("");
}
else{
preference.setEnabled(true);
preference.setSummary(deviceAddress);
final String deviceName = prefs.getBluetoothDeviceName();
if(deviceName != null){
preference.setTitle(getString(R.string.pref_forget_bluetooth_device_title, deviceName));
}
else
preference.setTitle(getString(R.string.pref_forget_bluetooth_device_address));
}
}
}