mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-19 14:19:53 +01:00
Merge branch 'merge-settings' into 'master'
Fix a couple of bugs in settings 1. SettingsFragment wasn't receiving events because it extended BaseFragment rather than BaseEventFragment 2. Removed broken logic for deciding whether to broadcast a SettingsUpdatedEvent 3. Added the namespace to SettingsUpdatedEvent so listeners can decide whether to react See merge request !97
This commit is contained in:
@@ -13,7 +13,6 @@ import org.briarproject.android.contact.ConversationActivity;
|
|||||||
import org.briarproject.android.forum.ForumActivity;
|
import org.briarproject.android.forum.ForumActivity;
|
||||||
import org.briarproject.api.android.AndroidExecutor;
|
import org.briarproject.api.android.AndroidExecutor;
|
||||||
import org.briarproject.api.android.AndroidNotificationManager;
|
import org.briarproject.api.android.AndroidNotificationManager;
|
||||||
import org.briarproject.api.db.DatabaseComponent;
|
|
||||||
import org.briarproject.api.db.DatabaseExecutor;
|
import org.briarproject.api.db.DatabaseExecutor;
|
||||||
import org.briarproject.api.db.DbException;
|
import org.briarproject.api.db.DbException;
|
||||||
import org.briarproject.api.event.Event;
|
import org.briarproject.api.event.Event;
|
||||||
@@ -24,6 +23,7 @@ import org.briarproject.api.forum.ForumManager;
|
|||||||
import org.briarproject.api.lifecycle.Service;
|
import org.briarproject.api.lifecycle.Service;
|
||||||
import org.briarproject.api.messaging.MessagingManager;
|
import org.briarproject.api.messaging.MessagingManager;
|
||||||
import org.briarproject.api.settings.Settings;
|
import org.briarproject.api.settings.Settings;
|
||||||
|
import org.briarproject.api.settings.SettingsManager;
|
||||||
import org.briarproject.api.sync.ClientId;
|
import org.briarproject.api.sync.ClientId;
|
||||||
import org.briarproject.api.sync.GroupId;
|
import org.briarproject.api.sync.GroupId;
|
||||||
import org.briarproject.util.StringUtils;
|
import org.briarproject.util.StringUtils;
|
||||||
@@ -42,6 +42,7 @@ import static android.content.Context.NOTIFICATION_SERVICE;
|
|||||||
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
|
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
|
||||||
import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;
|
import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;
|
||||||
import static java.util.logging.Level.WARNING;
|
import static java.util.logging.Level.WARNING;
|
||||||
|
import static org.briarproject.android.fragment.SettingsFragment.SETTINGS_NAMESPACE;
|
||||||
|
|
||||||
class AndroidNotificationManagerImpl implements AndroidNotificationManager,
|
class AndroidNotificationManagerImpl implements AndroidNotificationManager,
|
||||||
Service, EventListener {
|
Service, EventListener {
|
||||||
@@ -56,8 +57,8 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
|
|||||||
private static final Logger LOG =
|
private static final Logger LOG =
|
||||||
Logger.getLogger(AndroidNotificationManagerImpl.class.getName());
|
Logger.getLogger(AndroidNotificationManagerImpl.class.getName());
|
||||||
|
|
||||||
private final DatabaseComponent db;
|
|
||||||
private final Executor dbExecutor;
|
private final Executor dbExecutor;
|
||||||
|
private final SettingsManager settingsManager;
|
||||||
private final MessagingManager messagingManager;
|
private final MessagingManager messagingManager;
|
||||||
private final ForumManager forumManager;
|
private final ForumManager forumManager;
|
||||||
private final AndroidExecutor androidExecutor;
|
private final AndroidExecutor androidExecutor;
|
||||||
@@ -75,12 +76,12 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
|
|||||||
private volatile Settings settings = new Settings();
|
private volatile Settings settings = new Settings();
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public AndroidNotificationManagerImpl(DatabaseComponent db,
|
public AndroidNotificationManagerImpl(@DatabaseExecutor Executor dbExecutor,
|
||||||
@DatabaseExecutor Executor dbExecutor,
|
SettingsManager settingsManager, MessagingManager messagingManager,
|
||||||
MessagingManager messagingManager, ForumManager forumManager,
|
ForumManager forumManager, AndroidExecutor androidExecutor,
|
||||||
AndroidExecutor androidExecutor, Application app) {
|
Application app) {
|
||||||
this.db = db;
|
|
||||||
this.dbExecutor = dbExecutor;
|
this.dbExecutor = dbExecutor;
|
||||||
|
this.settingsManager = settingsManager;
|
||||||
this.messagingManager = messagingManager;
|
this.messagingManager = messagingManager;
|
||||||
this.forumManager = forumManager;
|
this.forumManager = forumManager;
|
||||||
this.androidExecutor = androidExecutor;
|
this.androidExecutor = androidExecutor;
|
||||||
@@ -97,7 +98,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
|
|||||||
dbExecutor.execute(new Runnable() {
|
dbExecutor.execute(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
settings = db.getSettings("settings-activity");
|
settings = settingsManager.getSettings(SETTINGS_NAMESPACE);
|
||||||
} catch (DbException e) {
|
} catch (DbException e) {
|
||||||
if (LOG.isLoggable(WARNING))
|
if (LOG.isLoggable(WARNING))
|
||||||
LOG.log(WARNING, e.toString(), e);
|
LOG.log(WARNING, e.toString(), e);
|
||||||
@@ -135,7 +136,8 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
|
|||||||
|
|
||||||
public void eventOccurred(Event e) {
|
public void eventOccurred(Event e) {
|
||||||
if (e instanceof SettingsUpdatedEvent) {
|
if (e instanceof SettingsUpdatedEvent) {
|
||||||
loadSettings();
|
SettingsUpdatedEvent s = (SettingsUpdatedEvent) e;
|
||||||
|
if (s.getNamespace().equals(SETTINGS_NAMESPACE)) loadSettings();
|
||||||
} else if (e instanceof MessageValidatedEvent) {
|
} else if (e instanceof MessageValidatedEvent) {
|
||||||
MessageValidatedEvent m = (MessageValidatedEvent) e;
|
MessageValidatedEvent m = (MessageValidatedEvent) e;
|
||||||
if (m.isValid() && !m.isLocal()) {
|
if (m.isValid() && !m.isLocal()) {
|
||||||
|
|||||||
@@ -25,10 +25,8 @@ import org.briarproject.android.util.FixedVerticalSpace;
|
|||||||
import org.briarproject.android.util.HorizontalBorder;
|
import org.briarproject.android.util.HorizontalBorder;
|
||||||
import org.briarproject.android.util.LayoutUtils;
|
import org.briarproject.android.util.LayoutUtils;
|
||||||
import org.briarproject.android.util.ListLoadingProgressBar;
|
import org.briarproject.android.util.ListLoadingProgressBar;
|
||||||
import org.briarproject.api.db.DatabaseComponent;
|
|
||||||
import org.briarproject.api.db.DbException;
|
import org.briarproject.api.db.DbException;
|
||||||
import org.briarproject.api.event.Event;
|
import org.briarproject.api.event.Event;
|
||||||
import org.briarproject.api.event.EventBus;
|
|
||||||
import org.briarproject.api.event.SettingsUpdatedEvent;
|
import org.briarproject.api.event.SettingsUpdatedEvent;
|
||||||
import org.briarproject.api.settings.Settings;
|
import org.briarproject.api.settings.Settings;
|
||||||
import org.briarproject.api.settings.SettingsManager;
|
import org.briarproject.api.settings.SettingsManager;
|
||||||
@@ -38,6 +36,7 @@ import java.util.logging.Logger;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import static android.app.Activity.RESULT_OK;
|
||||||
import static android.graphics.Typeface.DEFAULT_BOLD;
|
import static android.graphics.Typeface.DEFAULT_BOLD;
|
||||||
import static android.media.RingtoneManager.ACTION_RINGTONE_PICKER;
|
import static android.media.RingtoneManager.ACTION_RINGTONE_PICKER;
|
||||||
import static android.media.RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI;
|
import static android.media.RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI;
|
||||||
@@ -55,16 +54,15 @@ import static android.widget.LinearLayout.VERTICAL;
|
|||||||
import static java.util.logging.Level.INFO;
|
import static java.util.logging.Level.INFO;
|
||||||
import static java.util.logging.Level.WARNING;
|
import static java.util.logging.Level.WARNING;
|
||||||
import static org.briarproject.android.TestingConstants.SHOW_TESTING_ACTIVITY;
|
import static org.briarproject.android.TestingConstants.SHOW_TESTING_ACTIVITY;
|
||||||
import static android.app.Activity.RESULT_OK;
|
|
||||||
import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
|
import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
|
||||||
import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP_1;
|
import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP_1;
|
||||||
|
|
||||||
public class SettingsFragment extends BaseFragment implements
|
public class SettingsFragment extends BaseEventFragment implements
|
||||||
View.OnClickListener {
|
View.OnClickListener {
|
||||||
|
|
||||||
public final static String TAG = "SettingsFragment";
|
public static final String TAG = "SettingsFragment";
|
||||||
|
|
||||||
public static final int REQUEST_RINGTONE = 2;
|
public static final int REQUEST_RINGTONE = 2;
|
||||||
|
public static final String SETTINGS_NAMESPACE = "android-ui";
|
||||||
|
|
||||||
private static final Logger LOG =
|
private static final Logger LOG =
|
||||||
Logger.getLogger(SettingsFragment.class.getName());
|
Logger.getLogger(SettingsFragment.class.getName());
|
||||||
@@ -80,11 +78,9 @@ public class SettingsFragment extends BaseFragment implements
|
|||||||
private ImageButton testingButton = null;
|
private ImageButton testingButton = null;
|
||||||
|
|
||||||
// Fields that are accessed from background threads must be volatile
|
// Fields that are accessed from background threads must be volatile
|
||||||
@Inject private volatile DatabaseComponent db;
|
|
||||||
@Inject private volatile SettingsManager settingsManager;
|
@Inject private volatile SettingsManager settingsManager;
|
||||||
@Inject private volatile EventBus eventBus;
|
|
||||||
private volatile Settings settings;
|
private volatile Settings settings;
|
||||||
private volatile boolean bluetoothSetting = true, torSetting = false;
|
private volatile boolean bluetoothSetting = false, torSetting = false;
|
||||||
|
|
||||||
public static SettingsFragment newInstance() {
|
public static SettingsFragment newInstance() {
|
||||||
|
|
||||||
@@ -282,7 +278,7 @@ public class SettingsFragment extends BaseFragment implements
|
|||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
settings = settingsManager.getSettings("settings-activity");
|
settings = settingsManager.getSettings(SETTINGS_NAMESPACE);
|
||||||
Settings btSettings = settingsManager.getSettings("bt");
|
Settings btSettings = settingsManager.getSettings("bt");
|
||||||
Settings torSettings = settingsManager.getSettings("tor");
|
Settings torSettings = settingsManager.getSettings("tor");
|
||||||
long duration = System.currentTimeMillis() - now;
|
long duration = System.currentTimeMillis() - now;
|
||||||
@@ -360,7 +356,8 @@ public class SettingsFragment extends BaseFragment implements
|
|||||||
notifyPrivateMessages.isChecked());
|
notifyPrivateMessages.isChecked());
|
||||||
storeSettings(s);
|
storeSettings(s);
|
||||||
} else if (view == panicSettings || view == panicSettingsHint) {
|
} else if (view == panicSettings || view == panicSettingsHint) {
|
||||||
startActivity(new Intent(getActivity(), PanicPreferencesActivity.class));
|
startActivity(new Intent(getActivity(),
|
||||||
|
PanicPreferencesActivity.class));
|
||||||
} else if (view == notifyForumPosts) {
|
} else if (view == notifyForumPosts) {
|
||||||
Settings s = new Settings();
|
Settings s = new Settings();
|
||||||
s.putBoolean("notifyForumPosts", notifyForumPosts.isChecked());
|
s.putBoolean("notifyForumPosts", notifyForumPosts.isChecked());
|
||||||
@@ -431,8 +428,7 @@ public class SettingsFragment extends BaseFragment implements
|
|||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
settingsManager
|
settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE);
|
||||||
.mergeSettings(settings, "settings-activity");
|
|
||||||
long duration = System.currentTimeMillis() - now;
|
long duration = System.currentTimeMillis() - now;
|
||||||
if (LOG.isLoggable(INFO))
|
if (LOG.isLoggable(INFO))
|
||||||
LOG.info("Merging settings took " + duration + " ms");
|
LOG.info("Merging settings took " + duration + " ms");
|
||||||
@@ -475,10 +471,15 @@ public class SettingsFragment extends BaseFragment implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void eventOccurred(Event e) {
|
public void eventOccurred(Event e) {
|
||||||
if (e instanceof SettingsUpdatedEvent) {
|
if (e instanceof SettingsUpdatedEvent) {
|
||||||
LOG.info("Settings updated");
|
String namespace = ((SettingsUpdatedEvent) e).getNamespace();
|
||||||
loadSettings();
|
if (namespace.equals("bt") || namespace.equals("tor")
|
||||||
|
|| namespace.equals(SETTINGS_NAMESPACE)) {
|
||||||
|
LOG.info("Settings updated");
|
||||||
|
loadSettings();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import org.briarproject.R;
|
|||||||
import org.briarproject.android.BriarActivity;
|
import org.briarproject.android.BriarActivity;
|
||||||
import org.briarproject.api.android.ReferenceManager;
|
import org.briarproject.api.android.ReferenceManager;
|
||||||
import org.briarproject.api.crypto.CryptoComponent;
|
import org.briarproject.api.crypto.CryptoComponent;
|
||||||
import org.briarproject.api.db.DatabaseComponent;
|
|
||||||
import org.briarproject.api.db.DbException;
|
import org.briarproject.api.db.DbException;
|
||||||
import org.briarproject.api.identity.AuthorId;
|
import org.briarproject.api.identity.AuthorId;
|
||||||
import org.briarproject.api.identity.IdentityManager;
|
import org.briarproject.api.identity.IdentityManager;
|
||||||
@@ -54,7 +53,6 @@ implements InvitationListener {
|
|||||||
private String contactName = null;
|
private String contactName = null;
|
||||||
|
|
||||||
// Fields that are accessed from background threads must be volatile
|
// Fields that are accessed from background threads must be volatile
|
||||||
@Inject private volatile DatabaseComponent db;
|
|
||||||
@Inject private volatile IdentityManager identityManager;
|
@Inject private volatile IdentityManager identityManager;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -596,8 +596,10 @@ class TorPlugin implements DuplexPlugin, EventHandler,
|
|||||||
|
|
||||||
public void eventOccurred(Event e) {
|
public void eventOccurred(Event e) {
|
||||||
if (e instanceof SettingsUpdatedEvent) {
|
if (e instanceof SettingsUpdatedEvent) {
|
||||||
// Wifi setting may have been updated
|
if (((SettingsUpdatedEvent) e).getNamespace().equals("tor")) {
|
||||||
updateConnectionStatus();
|
// Wifi setting may have been updated
|
||||||
|
updateConnectionStatus();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,4 +3,13 @@ package org.briarproject.api.event;
|
|||||||
/** An event that is broadcast when one or more settings are updated. */
|
/** An event that is broadcast when one or more settings are updated. */
|
||||||
public class SettingsUpdatedEvent extends Event {
|
public class SettingsUpdatedEvent extends Event {
|
||||||
|
|
||||||
|
private final String namespace;
|
||||||
|
|
||||||
|
public SettingsUpdatedEvent(String namespace) {
|
||||||
|
this.namespace = namespace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNamespace() {
|
||||||
|
return namespace;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -935,7 +935,11 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
|
|||||||
try {
|
try {
|
||||||
T txn = db.startTransaction();
|
T txn = db.startTransaction();
|
||||||
try {
|
try {
|
||||||
if (!s.equals(db.getSettings(txn, namespace))) {
|
Settings old = db.getSettings(txn, namespace);
|
||||||
|
Settings merged = new Settings();
|
||||||
|
merged.putAll(old);
|
||||||
|
merged.putAll(s);
|
||||||
|
if (!merged.equals(old)) {
|
||||||
db.mergeSettings(txn, s, namespace);
|
db.mergeSettings(txn, s, namespace);
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
@@ -947,7 +951,7 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
|
|||||||
} finally {
|
} finally {
|
||||||
lock.writeLock().unlock();
|
lock.writeLock().unlock();
|
||||||
}
|
}
|
||||||
if (changed) eventBus.broadcast(new SettingsUpdatedEvent());
|
if (changed) eventBus.broadcast(new SettingsUpdatedEvent(namespace));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void receiveAck(ContactId c, Ack a) throws DbException {
|
public void receiveAck(ContactId c, Ack a) throws DbException {
|
||||||
|
|||||||
@@ -24,12 +24,14 @@ import org.briarproject.api.event.MessageToRequestEvent;
|
|||||||
import org.briarproject.api.event.MessageValidatedEvent;
|
import org.briarproject.api.event.MessageValidatedEvent;
|
||||||
import org.briarproject.api.event.MessagesAckedEvent;
|
import org.briarproject.api.event.MessagesAckedEvent;
|
||||||
import org.briarproject.api.event.MessagesSentEvent;
|
import org.briarproject.api.event.MessagesSentEvent;
|
||||||
|
import org.briarproject.api.event.SettingsUpdatedEvent;
|
||||||
import org.briarproject.api.event.SubscriptionAddedEvent;
|
import org.briarproject.api.event.SubscriptionAddedEvent;
|
||||||
import org.briarproject.api.event.SubscriptionRemovedEvent;
|
import org.briarproject.api.event.SubscriptionRemovedEvent;
|
||||||
import org.briarproject.api.identity.Author;
|
import org.briarproject.api.identity.Author;
|
||||||
import org.briarproject.api.identity.AuthorId;
|
import org.briarproject.api.identity.AuthorId;
|
||||||
import org.briarproject.api.identity.LocalAuthor;
|
import org.briarproject.api.identity.LocalAuthor;
|
||||||
import org.briarproject.api.lifecycle.ShutdownManager;
|
import org.briarproject.api.lifecycle.ShutdownManager;
|
||||||
|
import org.briarproject.api.settings.Settings;
|
||||||
import org.briarproject.api.sync.Ack;
|
import org.briarproject.api.sync.Ack;
|
||||||
import org.briarproject.api.sync.ClientId;
|
import org.briarproject.api.sync.ClientId;
|
||||||
import org.briarproject.api.sync.Group;
|
import org.briarproject.api.sync.Group;
|
||||||
@@ -1319,4 +1321,47 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
2, 456);
|
2, 456);
|
||||||
return new TransportKeys(transportId, inPrev, inCurr, inNext, outCurr);
|
return new TransportKeys(transportId, inPrev, inCurr, inNext, outCurr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMergeSettings() throws Exception {
|
||||||
|
final Settings before = new Settings();
|
||||||
|
before.put("foo", "bar");
|
||||||
|
before.put("baz", "bam");
|
||||||
|
final Settings update = new Settings();
|
||||||
|
update.put("baz", "qux");
|
||||||
|
final Settings merged = new Settings();
|
||||||
|
merged.put("foo", "bar");
|
||||||
|
merged.put("baz", "qux");
|
||||||
|
Mockery context = new Mockery();
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
final Database<Object> database = context.mock(Database.class);
|
||||||
|
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||||
|
final EventBus eventBus = context.mock(EventBus.class);
|
||||||
|
context.checking(new Expectations() {{
|
||||||
|
// mergeSettings()
|
||||||
|
oneOf(database).startTransaction();
|
||||||
|
will(returnValue(txn));
|
||||||
|
oneOf(database).getSettings(txn, "namespace");
|
||||||
|
will(returnValue(before));
|
||||||
|
oneOf(database).mergeSettings(txn, update, "namespace");
|
||||||
|
oneOf(database).commitTransaction(txn);
|
||||||
|
oneOf(eventBus).broadcast(with(any(SettingsUpdatedEvent.class)));
|
||||||
|
// mergeSettings() again
|
||||||
|
oneOf(database).startTransaction();
|
||||||
|
will(returnValue(txn));
|
||||||
|
oneOf(database).getSettings(txn, "namespace");
|
||||||
|
will(returnValue(merged));
|
||||||
|
oneOf(database).commitTransaction(txn);
|
||||||
|
}});
|
||||||
|
|
||||||
|
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
||||||
|
shutdown);
|
||||||
|
|
||||||
|
// First merge should broadcast an event
|
||||||
|
db.mergeSettings(update, "namespace");
|
||||||
|
// Second merge should not broadcast an event
|
||||||
|
db.mergeSettings(update, "namespace");
|
||||||
|
|
||||||
|
context.assertIsSatisfied();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user