package org.sugr.gearshift.ui.settings; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceManager; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AlertDialog; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.Toast; import org.sugr.gearshift.G; import org.sugr.gearshift.R; import org.sugr.gearshift.core.TransmissionProfile; import org.sugr.gearshift.service.DataService; import org.sugr.gearshift.service.DataServiceManager; import java.util.Set; public class TransmissionProfileSettingsFragment extends BasePreferenceFragment { private TransmissionProfile profile; private boolean isNew = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String id; Bundle args = getArguments(); if (args.containsKey(G.ARG_PROFILE_ID)) { id = args.getString(G.ARG_PROFILE_ID); } else { id = null; } TransmissionProfile.cleanTemporaryPreferences(); sharedPrefs = getActivity().getSharedPreferences(TransmissionProfile.getPreferencesName(), Activity.MODE_PRIVATE); Set<String> directories = sharedPrefs.getStringSet(G.PREF_DIRECTORIES, null); if (id == null) { profile = new TransmissionProfile( PreferenceManager.getDefaultSharedPreferences(getActivity())); isNew = true; profile.save(); id = profile.getId(); } else { profile = new TransmissionProfile(id, PreferenceManager.getDefaultSharedPreferences(getActivity())); profile.fillTemporatyPreferences(); } if (directories != null) { sharedPrefs.edit().putStringSet(G.PREF_DIRECTORIES, directories).apply(); profile.setDirectories(directories); } getPreferenceManager().setSharedPreferencesName(G.PROFILES_PREF_NAME); addPreferencesFromResource(R.xml.torrent_profile_preferences); PreferenceManager.setDefaultValues( getActivity(), G.PROFILES_PREF_NAME, Activity.MODE_PRIVATE, R.xml.torrent_profile_preferences, true); PreferenceManager pm = getPreferenceManager(); for (String key : G.UNPREFIXED_PROFILE_PREFERENCE_KEYS) { Preference pref = pm.findPreference(key); if (pref == null) { continue; } pref.setKey(key + id); if (!TextUtils.isEmpty(pref.getDependency())) { pref.setDependency(pref.getDependency() + id); } } summaryPrefs = new Object[][] { {G.PREF_NAME + id, getString(R.string.profile_summary_format), -1, -1, ""}, {G.PREF_HOST + id, getString(R.string.profile_summary_format), -1, -1, ""}, {G.PREF_PORT + id, getString(R.string.profile_summary_format), -1, -1, ""}, {G.PREF_USER + id, getString(R.string.profile_summary_format), -1, -1, ""}, {G.PREF_PATH + id, getString(R.string.profile_summary_format), -1, -1, ""}, {G.PREF_TIMEOUT + id, getString(R.string.profile_summary_format), -1, -1, ""}, /* {G.PREF_RETRIES + id, getString(R.string.profile_summary_format), R.array.pref_con_retries_values, R.array.pref_con_retries_entries, ""}, */ {G.PREF_FULL_UPDATE + id, getString(R.string.full_update_summary_format), -1, -1, "int"}, {G.PREF_UPDATE_INTERVAL + id, getString(R.string.update_interval_summary_format), R.array.pref_update_interval_values, R.array.pref_update_interval_entries, ""}, }; pm.findPreference(G.PREF_DIRECTORIES + id) .setOnPreferenceClickListener(preference -> { Bundle args1 = getArguments(); Bundle fragmentArgs = new Bundle(); fragmentArgs.putString(G.ARG_PROFILE_ID, profile.getId()); if (args1.containsKey(G.ARG_DIRECTORIES)) { fragmentArgs.putStringArrayList(G.ARG_DIRECTORIES, args1.getStringArrayList(G.ARG_DIRECTORIES)); } ((SettingsActivity) getActivity()).addFragment(profile.getId() + "-directories", SettingsActivity.Type.PROFILE_DIRECTORIES, fragmentArgs); return true; }); pm.findPreference(G.PREF_NAME + id).setOnPreferenceChangeListener((preference, newValue) -> { if (TextUtils.isEmpty(newValue.toString())) { showErrorDialog(R.string.con_name_cannot_be_empty); return false; } else { return true; } }); pm.findPreference(G.PREF_HOST + id).setOnPreferenceChangeListener((preference, newValue) -> { if (TextUtils.isEmpty(newValue.toString()) || newValue.toString().equals("example.com")) { showErrorDialog(R.string.con_host_cannot_be_empty); return false; } else { return true; } }); pm.findPreference(G.PREF_PORT + id).setOnPreferenceChangeListener((preference, newValue) -> { try { int port = Integer.parseInt(newValue.toString()); if (port < 1 || port > 65535) { throw new RuntimeException("Invalid port value"); } } catch (Exception ignored) { showErrorDialog(R.string.con_port_not_valid); return false; } return true; }); pm.findPreference(G.PREF_PROXY_HOST + id).setOnPreferenceChangeListener((preference, newValue) -> { if (sharedPrefs.getBoolean(G.PREF_PROXY + profile.getId(), false) && (TextUtils.isEmpty(newValue.toString()) || newValue.toString().equals("example.com"))) { showErrorDialog(R.string.con_proxy_host_cannot_be_empty); return false; } else { return true; } }); pm.findPreference(G.PREF_PROXY_PORT + id).setOnPreferenceChangeListener((preference, newValue) -> { if (sharedPrefs.getBoolean(G.PREF_PROXY + profile.getId(), false)) { try { int port = Integer.parseInt(newValue.toString()); if (port < 1 || port > 65535) { throw new RuntimeException("Invalid port value"); } } catch (Exception ignored) { showErrorDialog(R.string.con_proxy_port_not_valid); return false; } } return true; }); } @Override public void onResume() { super.onResume(); Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); if (isNew) { toolbar.setTitle(R.string.new_profile); } else { toolbar.setTitle(profile.getName()); } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menu.clear(); inflater.inflate(R.menu.torrent_profile_settings_fragment, menu); MenuItem item = menu.findItem(R.id.delete); if (isNew) { item.setTitle(android.R.string.cancel); } if (profile == null) { item.setVisible(false); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: close(); return true; case R.id.delete: LocalBroadcastManager.getInstance(getActivity()).registerReceiver( new ServiceReceiver(), new IntentFilter(G.INTENT_SERVICE_ACTION_COMPLETE)); new DataServiceManager(getActivity(), profile).removeProfile(); item.setActionView(R.layout.action_progress_bar); close(); return true; default: return super.onOptionsItemSelected(item); } } private void close() { SettingsActivity context = (SettingsActivity) getActivity(); context.closePreferences(); } private void showErrorDialog(int messageId) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.invalid_input_title); builder.setMessage(messageId); builder.setPositiveButton(android.R.string.ok, null); builder.show(); } private class ServiceReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int error = intent.getIntExtra(G.ARG_ERROR, 0); String type = intent.getStringExtra(G.ARG_REQUEST_TYPE); switch (type) { case DataService.Requests.REMOVE_PROFILE: LocalBroadcastManager.getInstance(context).unregisterReceiver(this); getActivity().invalidateOptionsMenu(); if (error != 0) { Toast.makeText(context, R.string.error_removing_profile, Toast.LENGTH_LONG) .show(); } close(); break; } } } }