Manipulate disappearing messages settings via settings screen

This commit is contained in:
Sebastian Kürten
2020-12-14 11:01:50 +01:00
parent 87b200f0b5
commit b48811e9b8
4 changed files with 142 additions and 2 deletions

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -5,7 +5,7 @@
<SwitchPreference
android:defaultValue="true"
android:key="pref_key_lock"
android:key="pref_key_disappearing_messages"
android:summary="@string/disappearing_messages_summary"
android:title="@string/disappearing_messages_title"
app:iconSpaceReserved="false"/>