diff --git a/briar-android/AndroidManifest.xml b/briar-android/AndroidManifest.xml
index 78a4e81b8..92340fd50 100644
--- a/briar-android/AndroidManifest.xml
+++ b/briar-android/AndroidManifest.xml
@@ -168,6 +168,19 @@
android:name=".android.StartupFailureActivity"
android:label="@string/startup_failed_activity_title">
+
+
+
+
+
+
+
diff --git a/briar-android/res/layout/activity_settings.xml b/briar-android/res/layout/activity_settings.xml
new file mode 100644
index 000000000..4e629ca51
--- /dev/null
+++ b/briar-android/res/layout/activity_settings.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/briar-android/res/values/arrays.xml b/briar-android/res/values/arrays.xml
new file mode 100644
index 000000000..be699e2a2
--- /dev/null
+++ b/briar-android/res/values/arrays.xml
@@ -0,0 +1,15 @@
+
+
+
+ - true
+ - false
+
+
+ - @string/bluetooth_setting_enabled
+ - @string/bluetooth_setting_disabled
+
+
+ - @string/tor_mobile_setting_enabled
+ - @string/tor_mobile_setting_disabled
+
+
\ No newline at end of file
diff --git a/briar-android/res/values/color.xml b/briar-android/res/values/color.xml
index bf0f61bd9..52bb1feb1 100644
--- a/briar-android/res/values/color.xml
+++ b/briar-android/res/values/color.xml
@@ -17,11 +17,12 @@
#2D3E50
#0f1720
#2D3E50
+ #0f1720
#75ab0d
#95d220
#75ab0d
- #333333
+ #808080
#ffffff
diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml
index 9195c26a5..cf63cf76b 100644
--- a/briar-android/res/values/strings.xml
+++ b/briar-android/res/values/strings.xml
@@ -96,18 +96,17 @@
- %d new forum posts.
Settings
- BLUETOOTH
+ Networks
Connect via Bluetooth
Whenever contacts are nearby
Only when adding contacts
- TOR
- Connect via Tor
- Only when using Wi-Fi
- When using Wi-Fi or mobile data
- Panic Button Setup
- PANIC BUTTON
+ Connect via Tor
+ When using Wi-Fi or mobile data
+ Only when using Wi-Fi
+ Panic button setup
+ Panic button
Configure how Briar will react when you use a panic button app
- NOTIFICATIONS
+ Notifications
Show alerts for private messages
Show alerts for forum posts
Vibrate
diff --git a/briar-android/res/xml/settings.xml b/briar-android/res/xml/settings.xml
new file mode 100644
index 000000000..706d44ff9
--- /dev/null
+++ b/briar-android/res/xml/settings.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/briar-android/res/xml/settings_debug.xml b/briar-android/res/xml/settings_debug.xml
new file mode 100644
index 000000000..e977ac7f9
--- /dev/null
+++ b/briar-android/res/xml/settings_debug.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/briar-android/src/org/briarproject/android/BriarFragmentActivity.java b/briar-android/src/org/briarproject/android/BriarFragmentActivity.java
index 573866aff..7b1e6ff53 100644
--- a/briar-android/src/org/briarproject/android/BriarFragmentActivity.java
+++ b/briar-android/src/org/briarproject/android/BriarFragmentActivity.java
@@ -7,11 +7,10 @@ import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar;
import org.briarproject.R;
-import org.briarproject.android.fragment.BaseFragment;
import org.briarproject.android.contact.ContactListFragment;
-import org.briarproject.android.fragment.DashboardFragment;
import org.briarproject.android.forum.ForumListFragment;
-import org.briarproject.android.fragment.SettingsFragment;
+import org.briarproject.android.fragment.BaseFragment;
+import org.briarproject.android.fragment.DashboardFragment;
/**
* This class should be extended by classes that wish to utilise fragments in
@@ -26,8 +25,6 @@ public abstract class BriarFragmentActivity extends BriarActivity {
if (fragmentTag.equals(DashboardFragment.TAG)) {
actionBar.setTitle(R.string.dashboard_toolbar_header);
- } else if (fragmentTag.equals(SettingsFragment.TAG)) {
- actionBar.setTitle(R.string.settings_toolbar_header);
} else if (fragmentTag.equals(ContactListFragment.TAG)) {
actionBar.setTitle(R.string.contacts_toolbar_header);
} else if (fragmentTag.equals(ForumListFragment.TAG)) {
diff --git a/briar-android/src/org/briarproject/android/NavDrawerActivity.java b/briar-android/src/org/briarproject/android/NavDrawerActivity.java
index 017608692..c6bc58b78 100644
--- a/briar-android/src/org/briarproject/android/NavDrawerActivity.java
+++ b/briar-android/src/org/briarproject/android/NavDrawerActivity.java
@@ -22,7 +22,6 @@ import org.briarproject.R;
import org.briarproject.android.contact.ContactListFragment;
import org.briarproject.android.forum.ForumListFragment;
import org.briarproject.android.fragment.BaseFragment;
-import org.briarproject.android.fragment.SettingsFragment;
import org.briarproject.android.util.CustomAnimations;
import org.briarproject.api.TransportId;
import org.briarproject.api.android.ReferenceManager;
@@ -225,7 +224,7 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
startFragment(ForumListFragment.newInstance());
break;
case R.id.nav_btn_settings:
- startFragment(SettingsFragment.newInstance());
+ startActivity(new Intent(this, SettingsActivity.class));
break;
case R.id.nav_btn_signout:
signOut();
diff --git a/briar-android/src/org/briarproject/android/SettingsActivity.java b/briar-android/src/org/briarproject/android/SettingsActivity.java
new file mode 100644
index 000000000..4841c6db9
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/SettingsActivity.java
@@ -0,0 +1,46 @@
+package org.briarproject.android;
+
+import android.os.Bundle;
+import android.support.v7.app.ActionBar;
+import android.view.MenuItem;
+
+import org.briarproject.R;
+import org.briarproject.api.event.EventBus;
+import org.briarproject.api.settings.SettingsManager;
+
+import javax.inject.Inject;
+
+public class SettingsActivity extends BriarActivity {
+ @Inject private SettingsManager settingsManager;
+ @Inject private EventBus eventBus;
+
+ @Override
+ public void onCreate(Bundle bundle) {
+ super.onCreate(bundle);
+
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setHomeButtonEnabled(true);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+
+ setContentView(R.layout.activity_settings);
+ }
+
+ public SettingsManager getSettingsManager() {
+ return settingsManager;
+ }
+
+ public EventBus getEventBus() {
+ return eventBus;
+ }
+
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == android.R.id.home) {
+ onBackPressed();
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git a/briar-android/src/org/briarproject/android/fragment/SettingsFragment.java b/briar-android/src/org/briarproject/android/fragment/SettingsFragment.java
index 89590d4fe..e38eeff71 100644
--- a/briar-android/src/org/briarproject/android/fragment/SettingsFragment.java
+++ b/briar-android/src/org/briarproject/android/fragment/SettingsFragment.java
@@ -1,32 +1,28 @@
package org.briarproject.android.fragment;
import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
import android.content.Intent;
-import android.content.res.Resources;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
-import android.support.annotation.Nullable;
+import android.support.v7.preference.CheckBoxPreference;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceFragmentCompat;
+import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
-import android.view.View;
import android.view.ViewGroup;
-import android.widget.CheckBox;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
-import android.widget.ScrollView;
-import android.widget.TextView;
import org.briarproject.R;
-import org.briarproject.android.TestingActivity;
-import org.briarproject.android.panic.PanicPreferencesActivity;
+import org.briarproject.android.SettingsActivity;
import org.briarproject.android.util.AndroidUtils;
-import org.briarproject.android.util.FixedVerticalSpace;
-import org.briarproject.android.util.HorizontalBorder;
-import org.briarproject.android.util.LayoutUtils;
-import org.briarproject.android.util.ListLoadingProgressBar;
+import org.briarproject.android.widget.PreferenceDividerDecoration;
import org.briarproject.api.db.DbException;
import org.briarproject.api.event.Event;
+import org.briarproject.api.event.EventBus;
+import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.SettingsUpdatedEvent;
import org.briarproject.api.settings.Settings;
import org.briarproject.api.settings.SettingsManager;
@@ -34,10 +30,7 @@ import org.briarproject.util.StringUtils;
import java.util.logging.Logger;
-import javax.inject.Inject;
-
import static android.app.Activity.RESULT_OK;
-import static android.graphics.Typeface.DEFAULT_BOLD;
import static android.media.RingtoneManager.ACTION_RINGTONE_PICKER;
import static android.media.RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI;
import static android.media.RingtoneManager.EXTRA_RINGTONE_EXISTING_URI;
@@ -47,230 +40,122 @@ import static android.media.RingtoneManager.EXTRA_RINGTONE_TITLE;
import static android.media.RingtoneManager.EXTRA_RINGTONE_TYPE;
import static android.media.RingtoneManager.TYPE_NOTIFICATION;
import static android.provider.Settings.System.DEFAULT_NOTIFICATION_URI;
-import static android.view.Gravity.CENTER;
-import static android.view.View.GONE;
-import static android.view.View.VISIBLE;
-import static android.widget.LinearLayout.VERTICAL;
import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING;
import static org.briarproject.android.TestingConstants.SHOW_TESTING_ACTIVITY;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP_1;
-public class SettingsFragment extends BaseEventFragment implements
- View.OnClickListener {
+public class SettingsFragment extends PreferenceFragmentCompat
+ implements EventListener, Preference.OnPreferenceChangeListener {
- public static final String TAG = "SettingsFragment";
public static final int REQUEST_RINGTONE = 2;
public static final String SETTINGS_NAMESPACE = "android-ui";
private static final Logger LOG =
Logger.getLogger(SettingsFragment.class.getName());
- private ScrollView scroll = null;
- private TextView enableBluetooth = null, enableBluetoothHint = null;
- private CheckBox notifyPrivateMessages = null, notifyForumPosts = null;
- private CheckBox notifyVibration = null;
- private TextView torOverWifi = null, torOverWifiHint = null;
- private TextView panicSettings = null, panicSettingsHint = null;
- private TextView notifySound = null, notifySoundHint = null;
- private ListLoadingProgressBar progress = null;
- private ImageButton testingButton = null;
+ private SettingsActivity listener;
+ private ListPreference enableBluetooth;
+ private ListPreference torOverMobile;
+ private CheckBoxPreference notifyPrivateMessages;
+ private CheckBoxPreference notifyForumPosts;
+ private CheckBoxPreference notifyVibration;
+ private Preference notifySound;
// Fields that are accessed from background threads must be volatile
- @Inject private volatile SettingsManager settingsManager;
+ private volatile SettingsManager settingsManager;
+ private volatile EventBus eventBus;
private volatile Settings settings;
private volatile boolean bluetoothSetting = false, torSetting = false;
- public static SettingsFragment newInstance() {
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
- Bundle args = new Bundle();
-
- SettingsFragment fragment = new SettingsFragment();
- fragment.setArguments(args);
- return fragment;
+ try {
+ listener = (SettingsActivity) context;
+ settingsManager = listener.getSettingsManager();
+ eventBus = listener.getEventBus();
+ } catch (ClassCastException e) {
+ throw new ClassCastException(context.toString()
+ + " is not a SettingsActivity");
+ }
}
@Override
- public String getUniqueTag() {
- return TAG;
- }
+ public void onCreatePreferences(Bundle bundle, String s) {
+ addPreferencesFromResource(R.xml.settings);
- @Nullable
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
+ enableBluetooth =
+ (ListPreference) findPreference("pref_key_bluetooth");
+ torOverMobile =
+ (ListPreference) findPreference("pref_key_tor_mobile");
+ notifyPrivateMessages = (CheckBoxPreference) findPreference(
+ "pref_key_notify_private_messages");
+ notifyForumPosts = (CheckBoxPreference) findPreference(
+ "pref_key_notify_forum_posts");
+ notifyVibration = (CheckBoxPreference) findPreference(
+ "pref_key_notify_vibration");
+ notifySound = findPreference("pref_key_notify_sound");
- LinearLayout layout = new LinearLayout(getContext());
- layout.setOrientation(VERTICAL);
+ enableBluetooth.setOnPreferenceChangeListener(this);
+ torOverMobile.setOnPreferenceChangeListener(this);
+ notifyPrivateMessages.setOnPreferenceChangeListener(this);
+ notifyForumPosts.setOnPreferenceChangeListener(this);
+ notifyVibration.setOnPreferenceChangeListener(this);
- scroll = new ScrollView(getContext());
-
- LinearLayout settings = new LinearLayout(getContext());
- settings.setOrientation(VERTICAL);
- int pad = LayoutUtils.getPadding(getContext());
- settings.setPadding(pad, pad, pad, pad);
-
- TextView bluetoothTitle = new TextView(getContext());
- bluetoothTitle.setPadding(pad, 0, pad, 0);
- bluetoothTitle.setTypeface(DEFAULT_BOLD);
- Resources res = getResources();
- int titleText = res.getColor(R.color.settings_title_text);
- bluetoothTitle.setTextColor(titleText);
- bluetoothTitle.setText(R.string.bluetooth_setting_title);
- settings.addView(bluetoothTitle);
-
- HorizontalBorder underline = new HorizontalBorder(getContext());
- int titleUnderline = res.getColor(R.color.settings_title_underline);
- underline.setBackgroundColor(titleUnderline);
- settings.addView(underline);
-
- enableBluetooth = new TextView(getContext());
- enableBluetooth.setPadding(pad, pad, pad, 0);
- enableBluetooth.setTextSize(18);
- enableBluetooth.setText(R.string.bluetooth_setting);
- enableBluetooth.setOnClickListener(this);
- settings.addView(enableBluetooth);
-
- enableBluetoothHint = new TextView(getContext());
- enableBluetoothHint.setPadding(pad, 0, pad, pad);
- enableBluetoothHint.setOnClickListener(this);
- settings.addView(enableBluetoothHint);
-
- TextView torTitle = new TextView(getContext());
- torTitle.setPadding(pad, 0, pad, 0);
- torTitle.setTypeface(DEFAULT_BOLD);
- torTitle.setTextColor(titleText);
- torTitle.setText(R.string.tor_wifi_setting_title);
- settings.addView(torTitle);
-
- underline = new HorizontalBorder(getContext());
- underline.setBackgroundColor(titleUnderline);
- settings.addView(underline);
-
- torOverWifi = new TextView(getContext());
- torOverWifi.setPadding(pad, pad, pad, 0);
- torOverWifi.setTextSize(18);
- torOverWifi.setText(R.string.tor_wifi_setting);
- torOverWifi.setOnClickListener(this);
- settings.addView(torOverWifi);
-
- torOverWifiHint = new TextView(getContext());
- torOverWifiHint.setPadding(pad, 0, pad, pad);
- torOverWifiHint.setOnClickListener(this);
- settings.addView(torOverWifiHint);
-
- TextView panicTitle = new TextView(getContext());
- panicTitle.setPadding(pad, 0, pad, 0);
- panicTitle.setTypeface(DEFAULT_BOLD);
- panicTitle.setTextColor(titleText);
- panicTitle.setText(R.string.panic_setting_title);
- settings.addView(panicTitle);
-
- underline = new HorizontalBorder(getContext());
- underline.setBackgroundColor(titleUnderline);
- settings.addView(underline);
-
- panicSettings = new TextView(getContext());
- panicSettings.setPadding(pad, pad, pad, 0);
- panicSettings.setTextSize(18);
- panicSettings.setText(R.string.panic_setting);
- panicSettings.setOnClickListener(this);
- settings.addView(panicSettings);
-
- panicSettingsHint = new TextView(getContext());
- panicSettingsHint.setText(R.string.panic_setting_hint);
- panicSettingsHint.setPadding(pad, 0, pad, pad);
- panicSettingsHint.setOnClickListener(this);
- settings.addView(panicSettingsHint);
-
- TextView notificationsTitle = new TextView(getContext());
- notificationsTitle.setPadding(pad, 0, pad, 0);
- notificationsTitle.setTypeface(DEFAULT_BOLD);
- notificationsTitle.setTextColor(titleText);
- notificationsTitle.setText(R.string.notification_settings_title);
- settings.addView(notificationsTitle);
-
- underline = new HorizontalBorder(getContext());
- underline.setBackgroundColor(titleUnderline);
- settings.addView(underline);
-
- settings.addView(new FixedVerticalSpace(getContext()));
-
- notifyPrivateMessages = new CheckBox(getContext());
- notifyPrivateMessages.setTextSize(18);
- notifyPrivateMessages.setText(R.string.notify_private_messages_setting);
- notifyPrivateMessages.setOnClickListener(this);
- settings.addView(notifyPrivateMessages);
-
- settings.addView(new FixedVerticalSpace(getContext()));
- settings.addView(new HorizontalBorder(getContext()));
- settings.addView(new FixedVerticalSpace(getContext()));
-
- notifyForumPosts = new CheckBox(getContext());
- notifyForumPosts.setTextSize(18);
- notifyForumPosts.setText(R.string.notify_forum_posts_setting);
- notifyForumPosts.setOnClickListener(this);
- settings.addView(notifyForumPosts);
-
- settings.addView(new FixedVerticalSpace(getContext()));
- settings.addView(new HorizontalBorder(getContext()));
- settings.addView(new FixedVerticalSpace(getContext()));
-
- notifyVibration = new CheckBox(getContext());
- notifyVibration.setTextSize(18);
- notifyVibration.setText(R.string.notify_vibration_setting);
- notifyVibration.setOnClickListener(this);
- settings.addView(notifyVibration);
-
- settings.addView(new FixedVerticalSpace(getContext()));
- settings.addView(new HorizontalBorder(getContext()));
-
- notifySound = new TextView(getContext());
- notifySound.setPadding(pad, pad, pad, 0);
- notifySound.setTextSize(18);
- notifySound.setText(R.string.notify_sound_setting);
- notifySound.setOnClickListener(this);
- settings.addView(notifySound);
-
- notifySoundHint = new TextView(getContext());
- notifySoundHint.setPadding(pad, 0, pad, pad);
- notifySoundHint.setOnClickListener(this);
- settings.addView(notifySoundHint);
-
- settings.addView(new HorizontalBorder(getContext()));
-
- scroll.addView(settings);
- scroll.setLayoutParams(MATCH_WRAP_1);
- scroll.setVisibility(GONE);
- layout.addView(scroll);
-
- progress = new ListLoadingProgressBar(getContext());
- layout.addView(progress);
-
- layout.addView(new HorizontalBorder(getContext()));
+ notifySound.setOnPreferenceClickListener(
+ new Preference.OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ String title =
+ getString(R.string.choose_ringtone_title);
+ Intent i = new Intent(ACTION_RINGTONE_PICKER);
+ i.putExtra(EXTRA_RINGTONE_TYPE, TYPE_NOTIFICATION);
+ i.putExtra(EXTRA_RINGTONE_TITLE, title);
+ i.putExtra(EXTRA_RINGTONE_DEFAULT_URI,
+ DEFAULT_NOTIFICATION_URI);
+ i.putExtra(EXTRA_RINGTONE_SHOW_SILENT, true);
+ if (settings.getBoolean("notifySound", true)) {
+ Uri uri;
+ String ringtoneUri =
+ settings.get("notifyRingtoneUri");
+ if (StringUtils.isNullOrEmpty(ringtoneUri))
+ uri = DEFAULT_NOTIFICATION_URI;
+ else uri = Uri.parse(ringtoneUri);
+ i.putExtra(EXTRA_RINGTONE_EXISTING_URI, uri);
+ }
+ startActivityForResult(i, REQUEST_RINGTONE);
+ return true;
+ }
+ });
if (SHOW_TESTING_ACTIVITY) {
- LinearLayout footer = new LinearLayout(getContext());
- footer.setLayoutParams(MATCH_WRAP);
- footer.setGravity(CENTER);
- int background = res.getColor(R.color.button_bar_background);
- footer.setBackgroundColor(background);
- testingButton = new ImageButton(getContext());
- testingButton.setBackgroundResource(0);
- testingButton.setImageResource(R.drawable.action_about);
- testingButton.setOnClickListener(this);
- footer.addView(testingButton);
- layout.addView(footer);
+ addPreferencesFromResource(R.xml.settings_debug);
}
- return layout;
+ loadSettings();
+ }
+
+ @Override
+ public RecyclerView onCreateRecyclerView(LayoutInflater inflater,
+ ViewGroup parent, Bundle savedInstanceState) {
+ RecyclerView list = super.onCreateRecyclerView(inflater, parent,
+ savedInstanceState);
+ list.addItemDecoration(
+ new PreferenceDividerDecoration(getContext()).drawBottom(true));
+ return list;
}
@Override
public void onResume() {
super.onResume();
- loadSettings();
+ eventBus.addListener(this);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ eventBus.removeListener(this);
}
private void loadSettings() {
@@ -285,7 +170,7 @@ public class SettingsFragment extends BaseEventFragment implements
if (LOG.isLoggable(INFO))
LOG.info("Loading settings took " + duration + " ms");
bluetoothSetting = btSettings.getBoolean("enable", false);
- torSetting = torSettings.getBoolean("torOverWifi", false);
+ torSetting = torSettings.getBoolean("torOverMobile", true);
displaySettings();
} catch (DbException e) {
if (LOG.isLoggable(WARNING))
@@ -298,18 +183,8 @@ public class SettingsFragment extends BaseEventFragment implements
private void displaySettings() {
listener.runOnUiThread(new Runnable() {
public void run() {
- scroll.setVisibility(VISIBLE);
- progress.setVisibility(GONE);
-
- int resId;
- if (bluetoothSetting)
- resId = R.string.bluetooth_setting_enabled;
- else resId = R.string.bluetooth_setting_disabled;
- enableBluetoothHint.setText(resId);
-
- if (torSetting) resId = R.string.tor_wifi_setting_enabled;
- else resId = R.string.tor_wifi_setting_disabled;
- torOverWifiHint.setText(resId);
+ enableBluetooth.setValue(Boolean.toString(bluetoothSetting));
+ torOverMobile.setValue(Boolean.toString(torSetting));
notifyPrivateMessages.setChecked(settings.getBoolean(
"notifyPrivateMessages", true));
@@ -323,66 +198,45 @@ public class SettingsFragment extends BaseEventFragment implements
String text;
if (settings.getBoolean("notifySound", true)) {
String ringtoneName = settings.get("notifyRingtoneName");
- if (StringUtils.isNullOrEmpty(ringtoneName))
+ if (StringUtils.isNullOrEmpty(ringtoneName)) {
text = getString(R.string.notify_sound_setting_default);
- else text = ringtoneName;
+ } else {
+ text = ringtoneName;
+ }
} else {
text = getString(R.string.notify_sound_setting_disabled);
}
- notifySoundHint.setText(text);
+ notifySound.setSummary(text);
}
});
}
- public void onClick(View view) {
- if (progress == null) return; // Not created yet
- if (view == testingButton) {
- startActivity(new Intent(getActivity(), TestingActivity.class));
- } else if (view == enableBluetooth || view == enableBluetoothHint) {
- bluetoothSetting = !bluetoothSetting;
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object o) {
+ if (preference == enableBluetooth) {
+ bluetoothSetting = Boolean.valueOf((String) o);
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
if (adapter != null) {
AndroidUtils.enableBluetooth(adapter, bluetoothSetting);
}
storeBluetoothSettings();
- displaySettings();
- } else if (view == torOverWifi || view == torOverWifiHint) {
- torSetting = !torSetting;
+ } else if (preference == torOverMobile) {
+ torSetting = Boolean.valueOf((String) o);
storeTorSettings();
- displaySettings();
- } else if (view == notifyPrivateMessages) {
+ } else if (preference == notifyPrivateMessages) {
Settings s = new Settings();
- s.putBoolean("notifyPrivateMessages",
- notifyPrivateMessages.isChecked());
+ s.putBoolean("notifyPrivateMessages", (Boolean) o);
storeSettings(s);
- } else if (view == panicSettings || view == panicSettingsHint) {
- startActivity(new Intent(getActivity(),
- PanicPreferencesActivity.class));
- } else if (view == notifyForumPosts) {
+ } else if (preference == notifyForumPosts) {
Settings s = new Settings();
- s.putBoolean("notifyForumPosts", notifyForumPosts.isChecked());
+ s.putBoolean("notifyForumPosts", (Boolean) o);
storeSettings(s);
- } else if (view == notifyVibration) {
+ } else if (preference == notifyVibration) {
Settings s = new Settings();
- s.putBoolean("notifyVibration", notifyVibration.isChecked());
+ s.putBoolean("notifyVibration", (Boolean) o);
storeSettings(s);
- } else if (view == notifySound || view == notifySoundHint) {
- String title = getString(R.string.choose_ringtone_title);
- Intent i = new Intent(ACTION_RINGTONE_PICKER);
- i.putExtra(EXTRA_RINGTONE_TYPE, TYPE_NOTIFICATION);
- i.putExtra(EXTRA_RINGTONE_TITLE, title);
- i.putExtra(EXTRA_RINGTONE_DEFAULT_URI, DEFAULT_NOTIFICATION_URI);
- i.putExtra(EXTRA_RINGTONE_SHOW_SILENT, true);
- if (settings.getBoolean("notifySound", true)) {
- Uri uri;
- String ringtoneUri = settings.get("notifyRingtoneUri");
- if (StringUtils.isNullOrEmpty(ringtoneUri))
- uri = DEFAULT_NOTIFICATION_URI;
- else uri = Uri.parse(ringtoneUri);
- i.putExtra(EXTRA_RINGTONE_EXISTING_URI, uri);
- }
- this.startActivityForResult(i, REQUEST_RINGTONE);
}
+ return true;
}
private void storeTorSettings() {
@@ -390,7 +244,7 @@ public class SettingsFragment extends BaseEventFragment implements
public void run() {
try {
Settings s = new Settings();
- s.putBoolean("torOverWifi", torSetting);
+ s.putBoolean("torOverMobile", torSetting);
long now = System.currentTimeMillis();
settingsManager.mergeSettings(s, "tor");
long duration = System.currentTimeMillis() - now;
@@ -448,13 +302,11 @@ public class SettingsFragment extends BaseEventFragment implements
Uri uri = data.getParcelableExtra(EXTRA_RINGTONE_PICKED_URI);
if (uri == null) {
// The user chose silence
- notifySoundHint.setText(R.string.notify_sound_setting_disabled);
s.putBoolean("notifySound", false);
s.put("notifyRingtoneName", "");
s.put("notifyRingtoneUri", "");
} else if (RingtoneManager.isDefault(uri)) {
// The user chose the default
- notifySoundHint.setText(R.string.notify_sound_setting_default);
s.putBoolean("notifySound", true);
s.put("notifyRingtoneName", "");
s.put("notifyRingtoneUri", "");
@@ -462,7 +314,6 @@ public class SettingsFragment extends BaseEventFragment implements
// The user chose a ringtone other than the default
Ringtone r = RingtoneManager.getRingtone(getContext(), uri);
String name = r.getTitle(getContext());
- notifySoundHint.setText(name);
s.putBoolean("notifySound", true);
s.put("notifyRingtoneName", name);
s.put("notifyRingtoneUri", uri.toString());
diff --git a/briar-android/src/org/briarproject/android/widget/PreferenceDividerDecoration.java b/briar-android/src/org/briarproject/android/widget/PreferenceDividerDecoration.java
new file mode 100644
index 000000000..a848d3b1c
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/widget/PreferenceDividerDecoration.java
@@ -0,0 +1,181 @@
+package org.briarproject.android.widget;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.DimenRes;
+import android.support.annotation.DrawableRes;
+import android.support.v4.content.ContextCompat;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceCategory;
+import android.support.v7.preference.PreferenceGroup;
+import android.support.v7.preference.PreferenceGroupAdapter;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.TintTypedArray;
+import android.view.View;
+
+import org.briarproject.R;
+
+/**
+ * Use this class to add dividers between {@link Preference} items.
+ *
+ * Source: https://github.com/consp1racy/android-support-preference
+ *
+ * License: Apache License v2.0
+ */
+public class PreferenceDividerDecoration extends RecyclerView.ItemDecoration {
+
+ private boolean mDrawTop = false;
+ private boolean mDrawBottom = false;
+ private boolean mDrawBetweenItems = true;
+ private boolean mDrawBetweenCategories = true;
+
+ private Drawable mDivider;
+ private int mDividerHeight;
+
+ public PreferenceDividerDecoration(Drawable divider, int dividerHeight) {
+ mDivider = divider;
+ mDividerHeight = dividerHeight;
+ }
+
+ public PreferenceDividerDecoration(Context context, @DrawableRes int divider, @DimenRes int dividerHeight) {
+ mDivider = ContextCompat.getDrawable(context, divider);
+ mDividerHeight = context.getResources().getDimensionPixelSize(dividerHeight);
+ }
+
+ public PreferenceDividerDecoration(Context context) {
+ TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, null,
+ new int[] {R.attr.dividerHorizontal});
+ mDivider = a.getDrawable(0);
+ a.recycle();
+
+ mDividerHeight = mDivider.getIntrinsicHeight();
+ }
+
+ public boolean getDrawTop() {
+ return mDrawTop;
+ }
+
+ /**
+ * Controls whether to draw divider above the first item.
+ *
+ * @param drawTop
+ * @return
+ */
+ public PreferenceDividerDecoration drawTop(boolean drawTop) {
+ mDrawTop = drawTop;
+ return this;
+ }
+
+ public boolean getDrawBottom() {
+ return mDrawBottom;
+ }
+
+ /**
+ * Controls whether to draw divider at the bottom of the last item.
+ *
+ * @param drawBottom
+ * @return
+ */
+ public PreferenceDividerDecoration drawBottom(boolean drawBottom) {
+ mDrawBottom = drawBottom;
+ return this;
+ }
+
+ public boolean getDrawBetweenItems() {
+ return mDrawBetweenItems;
+ }
+
+ /**
+ * Controls whether to draw divider at the bottom of each {@link Preference} and {@link PreferenceScreen} item.
+ *
+ * @param drawBetweenItems
+ * @return
+ */
+ public PreferenceDividerDecoration drawBetweenItems(boolean drawBetweenItems) {
+ mDrawBetweenItems = drawBetweenItems;
+ return this;
+ }
+
+ public boolean getDrawBetweenCategories() {
+ return mDrawBetweenCategories;
+ }
+
+ /**
+ * Controls whether to draw divider above each {@link PreferenceGroup} usually {@link PreferenceCategory}.
+ *
+ * @param drawBetweenCategories
+ * @return
+ */
+ public PreferenceDividerDecoration drawBetweenCategories(boolean drawBetweenCategories) {
+ mDrawBetweenCategories = drawBetweenCategories;
+ return this;
+ }
+
+ @Override
+ public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
+ int left = parent.getPaddingLeft();
+ int right = parent.getWidth() - parent.getPaddingRight();
+
+ final PreferenceGroupAdapter adapter = (PreferenceGroupAdapter) parent.getAdapter();
+ final int adapterCount = adapter.getItemCount();
+
+ boolean wasLastPreferenceGroup = false;
+ for (int i = 0, childCount = parent.getChildCount(); i < childCount; i++) {
+ final View child = parent.getChildAt(i);
+
+ final int adapterPosition = parent.getChildAdapterPosition(child);
+ Preference preference = adapter.getItem(adapterPosition);
+
+ boolean skipNextAboveDivider = false;
+ if (adapterPosition == 0) {
+ if (mDrawTop) {
+ drawAbove(c, left, right, child);
+ }
+ skipNextAboveDivider = true;
+ }
+
+ if (preference instanceof PreferenceGroup
+ && !(preference instanceof PreferenceScreen)) {
+ if (mDrawBetweenCategories) {
+ if (!skipNextAboveDivider) {
+ drawAbove(c, left, right, child);
+ skipNextAboveDivider = true;
+ }
+ }
+ wasLastPreferenceGroup = true;
+ } else {
+ if (mDrawBetweenItems && !wasLastPreferenceGroup) {
+ if (!skipNextAboveDivider) {
+ drawAbove(c, left, right, child);
+ skipNextAboveDivider = true;
+ }
+ }
+ wasLastPreferenceGroup = false;
+ }
+
+ if (adapterPosition == adapterCount - 1) {
+ if (mDrawBottom) {
+ drawBottom(c, left, right, child);
+ }
+ }
+ }
+ }
+
+ private void drawAbove(Canvas c, int left, int right, View child) {
+ final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
+ final int top = child.getTop() - params.topMargin - mDividerHeight;
+ final int bottom = top + mDividerHeight;
+ mDivider.setBounds(left, top, right, bottom);
+ mDivider.draw(c);
+ }
+
+ private void drawBottom(Canvas c, int left, int right, View child) {
+ final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
+ final int top = child.getBottom() + params.bottomMargin - mDividerHeight;
+ final int bottom = top + mDividerHeight;
+ mDivider.setBounds(left, top, right, bottom);
+ mDivider.draw(c);
+ }
+}