diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java index 884fb87f2..1ef1a4389 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java @@ -29,6 +29,7 @@ import org.briarproject.briar.android.contact.add.remote.PendingContactListActiv import org.briarproject.briar.android.conversation.AliasDialogFragment; import org.briarproject.briar.android.conversation.ConversationActivity; import org.briarproject.briar.android.conversation.ConversationSettingsActivity; +import org.briarproject.briar.android.conversation.ConversationSettingsFragment; import org.briarproject.briar.android.conversation.ImageActivity; import org.briarproject.briar.android.conversation.ImageFragment; import org.briarproject.briar.android.forum.CreateForumActivity; @@ -237,4 +238,6 @@ public interface ActivityComponent { void inject(ImageFragment imageFragment); + void inject(ConversationSettingsFragment conversationSettingsFragment); + } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationSettingsActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationSettingsActivity.java index 594e70181..8dd3f3c11 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationSettingsActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationSettingsActivity.java @@ -1,20 +1,40 @@ package org.briarproject.briar.android.conversation; +import android.content.Intent; import android.os.Bundle; import android.view.MenuItem; +import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.BriarActivity; +import javax.inject.Inject; + import androidx.appcompat.app.ActionBar; +import androidx.lifecycle.ViewModelProvider; +import androidx.lifecycle.ViewModelProviders; + +import static org.briarproject.briar.android.conversation.ConversationActivity.CONTACT_ID; public class ConversationSettingsActivity extends BriarActivity { + @Inject + ViewModelProvider.Factory viewModelFactory; + + private ConversationViewModel viewModel; + + private ContactId contactId; + @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); + Intent i = getIntent(); + int id = i.getIntExtra(CONTACT_ID, -1); + if (id == -1) throw new IllegalStateException(); + contactId = new ContactId(id); + ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setHomeButtonEnabled(true); @@ -22,6 +42,19 @@ public class ConversationSettingsActivity extends BriarActivity { } setContentView(R.layout.activity_conversation_settings); + + viewModel = ViewModelProviders.of(this, viewModelFactory) + .get(ConversationViewModel.class); + } + + @Override + public void onResume() { + super.onResume(); + // Trigger loading of contact data, noop if data was loaded already. + // + // We can only start loading data *after* we are sure + // the user has signed in. After sign-in, onCreate() isn't run again. + if (signedIn()) viewModel.setContactId(contactId); } @Override diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationSettingsFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationSettingsFragment.java index eae62eda3..2174a2f19 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationSettingsFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationSettingsFragment.java @@ -1,16 +1,120 @@ package org.briarproject.briar.android.conversation; +import android.content.Context; import android.os.Bundle; +import org.briarproject.bramble.api.db.DatabaseExecutor; +import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.db.TransactionManager; import org.briarproject.briar.R; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; +import java.util.concurrent.Executor; +import java.util.logging.Logger; + +import javax.inject.Inject; + +import androidx.lifecycle.ViewModelProvider; +import androidx.lifecycle.ViewModelProviders; +import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.SwitchPreference; -public class ConversationSettingsFragment extends PreferenceFragmentCompat { +import static java.util.logging.Level.WARNING; +import static org.briarproject.bramble.util.LogUtils.logException; +import static org.briarproject.briar.android.util.UiUtils.observeOnce; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; + +public class ConversationSettingsFragment extends PreferenceFragmentCompat + implements Preference.OnPreferenceChangeListener { + + private static final String DM_ENABLE = "pref_key_disappearing_messages"; + + private static final Logger LOG = + Logger.getLogger(ConversationSettingsFragment.class.getName()); + + @Inject + ViewModelProvider.Factory viewModelFactory; + + @Inject + @DatabaseExecutor + Executor dbExecutor; + + @Inject + TransactionManager db; + + @Inject + AutoDeleteManager autoDeleteManager; + + private ConversationSettingsActivity listener; + + private SwitchPreference enableDisappearingMessages; + + private volatile boolean disappearingMessages = false; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + listener = (ConversationSettingsActivity) context; + listener.getActivityComponent().inject(this); + } @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.conversation_settings); + + enableDisappearingMessages = findPreference(DM_ENABLE); + + enableDisappearingMessages.setOnPreferenceChangeListener(this); + + viewModel = ViewModelProviders.of(requireActivity(), viewModelFactory) + .get(ConversationViewModel.class); + } + + private ConversationViewModel viewModel; + + @Override + public void onStart() { + super.onStart(); + setSettingsEnabled(false); + loadSettings(); + } + + private void setSettingsEnabled(boolean enabled) { + enableDisappearingMessages.setEnabled(enabled); + } + + private void loadSettings() { + observeOnce(viewModel.getContact(), this, c -> { + dbExecutor.execute(() -> { + try { + db.transaction(false, txn -> { + long timer = autoDeleteManager + .getAutoDeleteTimer(txn, c.getId()); + disappearingMessages = timer != NO_AUTO_DELETE_TIMER; + }); + displaySettings(); + } catch (DbException e) { + logException(LOG, WARNING, e); + } + }); + }); + } + + private void displaySettings() { + listener.runOnUiThreadUnlessDestroyed(() -> { + enableDisappearingMessages.setChecked(disappearingMessages); + setSettingsEnabled(true); + }); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (preference == enableDisappearingMessages) { + boolean dmSetting = (Boolean) newValue; + viewModel.setAutoDeleteTimerEnabled(dmSetting); + } + return true; } } diff --git a/briar-android/src/main/res/xml/conversation_settings.xml b/briar-android/src/main/res/xml/conversation_settings.xml index bfd2eee82..7977add8d 100644 --- a/briar-android/src/main/res/xml/conversation_settings.xml +++ b/briar-android/src/main/res/xml/conversation_settings.xml @@ -5,7 +5,7 @@