mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-18 05:39:53 +01:00
Add revoke remote wipe status option to conversation actions menu
This commit is contained in:
@@ -499,6 +499,15 @@
|
|||||||
android:value="org.briarproject.briar.android.conversation.ConversationActivity" />
|
android:value="org.briarproject.briar.android.conversation.ConversationActivity" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name="org.briarproject.briar.android.remotewipe.revoke.RevokeRemoteWipeActivity"
|
||||||
|
android:label="@string/activity_name_revoke_remote_wipe"
|
||||||
|
android:parentActivityName="org.briarproject.briar.android.conversation.ConversationActivity">
|
||||||
|
<meta-data
|
||||||
|
android:name="android.support.PARENT_ACTIVITY"
|
||||||
|
android:value="org.briarproject.briar.android.conversation.ConversationActivity" />
|
||||||
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="org.briarproject.briar.android.logout.ExitActivity"
|
android:name="org.briarproject.briar.android.logout.ExitActivity"
|
||||||
android:theme="@android:style/Theme.NoDisplay" />
|
android:theme="@android:style/Theme.NoDisplay" />
|
||||||
|
|||||||
@@ -73,6 +73,9 @@ import org.briarproject.briar.android.remotewipe.WiperSelectorFragment;
|
|||||||
import org.briarproject.briar.android.remotewipe.activate.ActivateRemoteWipeActivity;
|
import org.briarproject.briar.android.remotewipe.activate.ActivateRemoteWipeActivity;
|
||||||
import org.briarproject.briar.android.remotewipe.activate.ActivateRemoteWipeExplainerFragment;
|
import org.briarproject.briar.android.remotewipe.activate.ActivateRemoteWipeExplainerFragment;
|
||||||
import org.briarproject.briar.android.remotewipe.activate.ActivateRemoteWipeSuccessFragment;
|
import org.briarproject.briar.android.remotewipe.activate.ActivateRemoteWipeSuccessFragment;
|
||||||
|
import org.briarproject.briar.android.remotewipe.revoke.RevokeRemoteWipeActivity;
|
||||||
|
import org.briarproject.briar.android.remotewipe.revoke.RevokeRemoteWipeState;
|
||||||
|
import org.briarproject.briar.android.remotewipe.revoke.RevokeRemoteWipeSuccessFragment;
|
||||||
import org.briarproject.briar.android.reporting.CrashFragment;
|
import org.briarproject.briar.android.reporting.CrashFragment;
|
||||||
import org.briarproject.briar.android.reporting.CrashReportActivity;
|
import org.briarproject.briar.android.reporting.CrashReportActivity;
|
||||||
import org.briarproject.briar.android.reporting.ReportFormFragment;
|
import org.briarproject.briar.android.reporting.ReportFormFragment;
|
||||||
@@ -229,6 +232,8 @@ public interface ActivityComponent {
|
|||||||
|
|
||||||
void inject(RemoteWipeActivatedActivity remoteWipeActivatedActivity);
|
void inject(RemoteWipeActivatedActivity remoteWipeActivatedActivity);
|
||||||
|
|
||||||
|
void inject(RevokeRemoteWipeActivity revokeRemoteWipeActivity);
|
||||||
|
|
||||||
// Fragments
|
// Fragments
|
||||||
|
|
||||||
void inject(AuthorNameFragment fragment);
|
void inject(AuthorNameFragment fragment);
|
||||||
@@ -330,4 +335,6 @@ public interface ActivityComponent {
|
|||||||
void inject(ActivateRemoteWipeExplainerFragment activateRemoteWipeExplainerFragment);
|
void inject(ActivateRemoteWipeExplainerFragment activateRemoteWipeExplainerFragment);
|
||||||
|
|
||||||
void inject(ActivateRemoteWipeSuccessFragment activateRemoteWipeSuccessFragment);
|
void inject(ActivateRemoteWipeSuccessFragment activateRemoteWipeSuccessFragment);
|
||||||
|
|
||||||
|
void inject(RevokeRemoteWipeSuccessFragment revokeRemoteWipeSuccessFragment);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ import org.briarproject.briar.android.forum.ForumActivity;
|
|||||||
import org.briarproject.briar.android.introduction.IntroductionActivity;
|
import org.briarproject.briar.android.introduction.IntroductionActivity;
|
||||||
import org.briarproject.briar.android.privategroup.conversation.GroupActivity;
|
import org.briarproject.briar.android.privategroup.conversation.GroupActivity;
|
||||||
import org.briarproject.briar.android.remotewipe.activate.ActivateRemoteWipeActivity;
|
import org.briarproject.briar.android.remotewipe.activate.ActivateRemoteWipeActivity;
|
||||||
|
import org.briarproject.briar.android.remotewipe.revoke.RevokeRemoteWipeActivity;
|
||||||
import org.briarproject.briar.android.socialbackup.recover.CustodianReturnShardActivity;
|
import org.briarproject.briar.android.socialbackup.recover.CustodianReturnShardActivity;
|
||||||
import org.briarproject.briar.android.util.BriarSnackbarBuilder;
|
import org.briarproject.briar.android.util.BriarSnackbarBuilder;
|
||||||
import org.briarproject.briar.android.view.BriarRecyclerView;
|
import org.briarproject.briar.android.view.BriarRecyclerView;
|
||||||
@@ -379,6 +380,13 @@ public class ConversationActivity extends BriarActivity
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// enable revoke remote wipe action if available
|
||||||
|
observeOnce(viewModel.isRemoteWiper(), this, isWiper -> {
|
||||||
|
if (isWiper != null && isWiper) {
|
||||||
|
menu.findItem(R.id.action_revoke_remote_wipe).setEnabled(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return super.onCreateOptionsMenu(menu);
|
return super.onCreateOptionsMenu(menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -417,6 +425,12 @@ public class ConversationActivity extends BriarActivity
|
|||||||
r.putExtra(CONTACT_ID, contactId.getInt());
|
r.putExtra(CONTACT_ID, contactId.getInt());
|
||||||
startActivity(r);
|
startActivity(r);
|
||||||
return true;
|
return true;
|
||||||
|
case R.id.action_revoke_remote_wipe:
|
||||||
|
if (contactId == null) return false;
|
||||||
|
Intent s = new Intent(this, RevokeRemoteWipeActivity.class);
|
||||||
|
s.putExtra(CONTACT_ID, contactId.getInt());
|
||||||
|
startActivity(s);
|
||||||
|
return true;
|
||||||
default:
|
default:
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ public class ConversationViewModel extends DbViewModel
|
|||||||
private final MutableLiveEvent<PrivateMessageHeader> addedHeader =
|
private final MutableLiveEvent<PrivateMessageHeader> addedHeader =
|
||||||
new MutableLiveEvent<>();
|
new MutableLiveEvent<>();
|
||||||
private final MutableLiveData<Boolean> amRemoteWiper = new MutableLiveData<>();
|
private final MutableLiveData<Boolean> amRemoteWiper = new MutableLiveData<>();
|
||||||
|
private final MutableLiveData<Boolean> isRemoteWiper = new MutableLiveData<>();
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
ConversationViewModel(Application application,
|
ConversationViewModel(Application application,
|
||||||
@@ -306,6 +307,10 @@ public class ConversationViewModel extends DbViewModel
|
|||||||
boolean amWiper = db.transactionWithResult(true,
|
boolean amWiper = db.transactionWithResult(true,
|
||||||
txn -> remoteWipeManager.amWiper(txn, c));
|
txn -> remoteWipeManager.amWiper(txn, c));
|
||||||
amRemoteWiper.postValue(amWiper);
|
amRemoteWiper.postValue(amWiper);
|
||||||
|
|
||||||
|
boolean isWiper = db.transactionWithResult(true,
|
||||||
|
txn -> remoteWipeManager.isWiper(txn, c));
|
||||||
|
isRemoteWiper.postValue(isWiper);
|
||||||
}
|
}
|
||||||
|
|
||||||
@DatabaseExecutor
|
@DatabaseExecutor
|
||||||
@@ -395,6 +400,10 @@ public class ConversationViewModel extends DbViewModel
|
|||||||
return amRemoteWiper;
|
return amRemoteWiper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LiveData<Boolean> isRemoteWiper() {
|
||||||
|
return isRemoteWiper;
|
||||||
|
}
|
||||||
|
|
||||||
@UiThread
|
@UiThread
|
||||||
void recheckFeaturesAndOnboarding(ContactId contactId) {
|
void recheckFeaturesAndOnboarding(ContactId contactId) {
|
||||||
runOnDbThread(() -> {
|
runOnDbThread(() -> {
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import android.widget.Button;
|
|||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.activity.ActivityComponent;
|
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||||
import org.briarproject.briar.android.fragment.BaseFragment;
|
import org.briarproject.briar.android.fragment.BaseFragment;
|
||||||
|
import org.briarproject.briar.android.remotewipe.revoke.RevokeRemoteWipeViewModel;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
@@ -24,13 +25,13 @@ public class ActivateRemoteWipeSuccessFragment extends BaseFragment {
|
|||||||
@Inject
|
@Inject
|
||||||
ViewModelProvider.Factory viewModelFactory;
|
ViewModelProvider.Factory viewModelFactory;
|
||||||
|
|
||||||
private ActivateRemoteWipeViewModel viewModel;
|
private RevokeRemoteWipeViewModel viewModel;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void injectFragment(ActivityComponent component) {
|
public void injectFragment(ActivityComponent component) {
|
||||||
component.inject(this);
|
component.inject(this);
|
||||||
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
|
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
|
||||||
.get(ActivateRemoteWipeViewModel.class);
|
.get(RevokeRemoteWipeViewModel.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -38,6 +39,7 @@ public class ActivateRemoteWipeSuccessFragment extends BaseFragment {
|
|||||||
public View onCreateView(@NonNull LayoutInflater inflater,
|
public View onCreateView(@NonNull LayoutInflater inflater,
|
||||||
@Nullable ViewGroup container,
|
@Nullable ViewGroup container,
|
||||||
@Nullable Bundle savedInstanceState) {
|
@Nullable Bundle savedInstanceState) {
|
||||||
|
// TODO change layout
|
||||||
View view = inflater.inflate(R.layout.fragment_activate_remote_wipe_success,
|
View view = inflater.inflate(R.layout.fragment_activate_remote_wipe_success,
|
||||||
container, false);
|
container, false);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
package org.briarproject.briar.android.remotewipe.revoke;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
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 org.briarproject.briar.android.fragment.BaseFragment;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
|
|
||||||
|
import static org.briarproject.briar.android.conversation.ConversationActivity.CONTACT_ID;
|
||||||
|
|
||||||
|
public class RevokeRemoteWipeActivity extends BriarActivity implements
|
||||||
|
BaseFragment.BaseFragmentListener {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
ViewModelProvider.Factory viewModelFactory;
|
||||||
|
RevokeRemoteWipeViewModel viewModel;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void injectActivity(ActivityComponent component) {
|
||||||
|
component.inject(this);
|
||||||
|
|
||||||
|
viewModel = new ViewModelProvider(this, viewModelFactory)
|
||||||
|
.get(RevokeRemoteWipeViewModel.class);
|
||||||
|
|
||||||
|
viewModel.getState().observe(this, this::onStateChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_distributed_backup);
|
||||||
|
|
||||||
|
if (savedInstanceState == null) {
|
||||||
|
Intent intent = getIntent();
|
||||||
|
int id = intent.getIntExtra(CONTACT_ID, -1);
|
||||||
|
if (id == -1) throw new IllegalStateException("No ContactId");
|
||||||
|
ContactId contactId = new ContactId(id);
|
||||||
|
viewModel.revokeRemoteWipeStatus(contactId);
|
||||||
|
// showInitialFragment(new ActivateRemoteWipeExplainerFragment());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onStateChanged(RevokeRemoteWipeState state) {
|
||||||
|
switch(state) {
|
||||||
|
case FAILED:
|
||||||
|
// TODO change text
|
||||||
|
Toast.makeText(this,
|
||||||
|
R.string.remote_wipe_activate_failure,
|
||||||
|
Toast.LENGTH_LONG).show();
|
||||||
|
break;
|
||||||
|
case SUCCESS:
|
||||||
|
showNextFragment(new RevokeRemoteWipeSuccessFragment());
|
||||||
|
break;
|
||||||
|
default: // FINISHED or CANCELLED
|
||||||
|
finish();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package org.briarproject.briar.android.remotewipe.revoke;
|
||||||
|
|
||||||
|
public enum RevokeRemoteWipeState {
|
||||||
|
FAILED,
|
||||||
|
SUCCESS,
|
||||||
|
FINISHED
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
package org.briarproject.briar.android.remotewipe.revoke;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.Button;
|
||||||
|
|
||||||
|
import org.briarproject.briar.R;
|
||||||
|
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||||
|
import org.briarproject.briar.android.fragment.BaseFragment;
|
||||||
|
import org.briarproject.briar.android.remotewipe.activate.ActivateRemoteWipeSuccessFragment;
|
||||||
|
import org.briarproject.briar.android.remotewipe.activate.ActivateRemoteWipeViewModel;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
|
|
||||||
|
public class RevokeRemoteWipeSuccessFragment extends BaseFragment {
|
||||||
|
|
||||||
|
public static final String TAG =
|
||||||
|
ActivateRemoteWipeSuccessFragment.class.getName();
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
ViewModelProvider.Factory viewModelFactory;
|
||||||
|
|
||||||
|
private ActivateRemoteWipeViewModel viewModel;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void injectFragment(ActivityComponent component) {
|
||||||
|
component.inject(this);
|
||||||
|
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
|
||||||
|
.get(ActivateRemoteWipeViewModel.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public View onCreateView(@NonNull LayoutInflater inflater,
|
||||||
|
@Nullable ViewGroup container,
|
||||||
|
@Nullable Bundle savedInstanceState) {
|
||||||
|
View view = inflater.inflate(R.layout.fragment_activate_remote_wipe_success,
|
||||||
|
container, false);
|
||||||
|
|
||||||
|
Button button = view.findViewById(R.id.button);
|
||||||
|
button.setOnClickListener(e -> viewModel.onSuccessDismissed());
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUniqueTag() {
|
||||||
|
return TAG;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package org.briarproject.briar.android.remotewipe.revoke;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.FormatException;
|
||||||
|
import org.briarproject.bramble.api.contact.ContactId;
|
||||||
|
import org.briarproject.bramble.api.db.DatabaseComponent;
|
||||||
|
import org.briarproject.bramble.api.db.DbException;
|
||||||
|
import org.briarproject.briar.android.remotewipe.activate.ActivateRemoteWipeState;
|
||||||
|
import org.briarproject.briar.api.remotewipe.RemoteWipeManager;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.lifecycle.AndroidViewModel;
|
||||||
|
import androidx.lifecycle.MutableLiveData;
|
||||||
|
|
||||||
|
public class RevokeRemoteWipeViewModel extends AndroidViewModel {
|
||||||
|
|
||||||
|
private final RemoteWipeManager remoteWipeManager;
|
||||||
|
private final DatabaseComponent db;
|
||||||
|
private final MutableLiveData<RevokeRemoteWipeState> state = new MutableLiveData<>();
|
||||||
|
private ContactId contactId;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public RevokeRemoteWipeViewModel(
|
||||||
|
@NonNull Application application,
|
||||||
|
RemoteWipeManager remoteWipeManager,
|
||||||
|
DatabaseComponent db) {
|
||||||
|
super(application);
|
||||||
|
this.remoteWipeManager = remoteWipeManager;
|
||||||
|
this.db = db;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MutableLiveData<RevokeRemoteWipeState> getState() {
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void revokeRemoteWipeStatus(ContactId c) {
|
||||||
|
contactId = c;
|
||||||
|
try {
|
||||||
|
db.transaction(false, txn -> {
|
||||||
|
remoteWipeManager.revoke(txn, contactId);
|
||||||
|
});
|
||||||
|
} catch (DbException e) {
|
||||||
|
state.postValue(RevokeRemoteWipeState.FAILED);
|
||||||
|
} catch (FormatException e) {
|
||||||
|
state.postValue(RevokeRemoteWipeState.FAILED);
|
||||||
|
}
|
||||||
|
state.postValue(RevokeRemoteWipeState.SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onCancelClicked() {
|
||||||
|
// state.postValue(ActivateRemoteWipeState.CANCELLED);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onSuccessDismissed() {
|
||||||
|
state.postValue(RevokeRemoteWipeState.FINISHED);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package org.briarproject.briar.android.socialbackup;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import org.briarproject.briar.R;
|
||||||
|
import org.briarproject.briar.android.contact.BaseContactListAdapter;
|
||||||
|
import org.briarproject.briar.android.contact.ContactItem;
|
||||||
|
import org.briarproject.briar.android.contact.ContactItemViewHolder;
|
||||||
|
|
||||||
|
public class CustodianStatusAdapter extends BaseContactListAdapter<ContactItem, ContactItemViewHolder<ContactItem>> {
|
||||||
|
|
||||||
|
CustodianStatusAdapter(Context context) {
|
||||||
|
super(context, ContactItem.class, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ContactItemViewHolder<ContactItem> onCreateViewHolder(
|
||||||
|
ViewGroup viewGroup, int i) {
|
||||||
|
View v = LayoutInflater.from(viewGroup.getContext()).inflate(
|
||||||
|
R.layout.list_item_contact_small, viewGroup, false);
|
||||||
|
return new ContactItemViewHolder<>(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -39,4 +39,11 @@
|
|||||||
android:title="@string/activate_remote_wipe"
|
android:title="@string/activate_remote_wipe"
|
||||||
android:enabled="false"
|
android:enabled="false"
|
||||||
app:showAsAction="never"/>
|
app:showAsAction="never"/>
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_revoke_remote_wipe"
|
||||||
|
android:icon="@drawable/action_delete_white"
|
||||||
|
android:title="@string/revoke_remote_wipe"
|
||||||
|
android:enabled="false"
|
||||||
|
app:showAsAction="never"/>
|
||||||
</menu>
|
</menu>
|
||||||
@@ -760,5 +760,9 @@
|
|||||||
<string name="remote_wipe_activate_explain_short">Activate a remote wipe of this contact\'s device</string>
|
<string name="remote_wipe_activate_explain_short">Activate a remote wipe of this contact\'s device</string>
|
||||||
<string name="remote_wipe_activate_explain_long">If confirmed by a second contact, sending this signal will remove all briar contacts and messages from this contact\s device.</string>
|
<string name="remote_wipe_activate_explain_long">If confirmed by a second contact, sending this signal will remove all briar contacts and messages from this contact\s device.</string>
|
||||||
|
|
||||||
|
<!-- revoke -->
|
||||||
|
<string name="activity_name_revoke_remote_wipe">Revoke Remote Wipe</string>
|
||||||
|
<string name="revoke_remote_wipe">Revoke remote wipe status</string>
|
||||||
|
|
||||||
<string name="button_confirm">Ok</string>
|
<string name="button_confirm">Ok</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user