extend-uid: allow changes to user ids in edit mode

This commit is contained in:
Vincent Breitmoser 2015-11-02 21:59:31 +01:00 committed by Dominik Schürmann
parent 5b6bc24a0c
commit a041acab65
7 changed files with 87 additions and 16 deletions

View file

@ -223,7 +223,8 @@ public class EditKeyFragment extends QueueingCryptoOperationFragment<SaveKeyring
getLoaderManager().initLoader(LOADER_ID_USER_IDS, null, EditKeyFragment.this);
getLoaderManager().initLoader(LOADER_ID_SUBKEYS, null, EditKeyFragment.this);
mUserIdsAdapter = new UserIdsAdapter(getActivity(), null, 0, mSaveKeyringParcel);
mUserIdsAdapter = new UserIdsAdapter(getActivity(), null, 0);
mUserIdsAdapter.setEditMode(mSaveKeyringParcel);
mUserIdsList.setAdapter(mUserIdsAdapter);
// TODO: SaveParcel from savedInstance?!

View file

@ -17,6 +17,7 @@
package org.sufficientlysecure.keychain.ui;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
@ -26,15 +27,10 @@ import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.view.ViewPager;
import android.support.v7.view.ActionMode;
import android.support.v7.view.ActionMode.Callback;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.astuetz.PagerSlidingTabStrip;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.results.OperationResult;

View file

@ -21,6 +21,9 @@ package org.sufficientlysecure.keychain.ui;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
@ -42,6 +45,7 @@ import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
import org.sufficientlysecure.keychain.ui.adapter.UserIdsAdapter;
import org.sufficientlysecure.keychain.ui.dialog.EditUserIdDialogFragment;
import org.sufficientlysecure.keychain.ui.dialog.UserIdInfoDialogFragment;
import org.sufficientlysecure.keychain.util.Log;
@ -59,6 +63,7 @@ public class ViewKeyAdvUserIdsFragment extends LoaderFragment implements
private Uri mDataUri;
private boolean mHasSecret;
private SaveKeyringParcel mEditModeSaveKeyringParcel;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
@ -70,14 +75,71 @@ public class ViewKeyAdvUserIdsFragment extends LoaderFragment implements
mUserIds.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
showUserIdInfo(position);
showOrEditUserIdInfo(position);
}
});
return root;
}
private void showOrEditUserIdInfo(final int position) {
if (mEditModeSaveKeyringParcel != null) {
editUserId(position);
} else {
showUserIdInfo(position);
}
}
private void editUserId(final int position) {
final String userId = mUserIdsAdapter.getUserId(position);
final boolean isRevoked = mUserIdsAdapter.getIsRevoked(position);
final boolean isRevokedPending = mUserIdsAdapter.getIsRevokedPending(position);
Handler returnHandler = new Handler() {
@Override
public void handleMessage(Message message) {
switch (message.what) {
case EditUserIdDialogFragment.MESSAGE_CHANGE_PRIMARY_USER_ID:
// toggle
if (mEditModeSaveKeyringParcel.mChangePrimaryUserId != null
&& mEditModeSaveKeyringParcel.mChangePrimaryUserId.equals(userId)) {
mEditModeSaveKeyringParcel.mChangePrimaryUserId = null;
} else {
mEditModeSaveKeyringParcel.mChangePrimaryUserId = userId;
}
break;
case EditUserIdDialogFragment.MESSAGE_REVOKE:
// toggle
if (mEditModeSaveKeyringParcel.mRevokeUserIds.contains(userId)) {
mEditModeSaveKeyringParcel.mRevokeUserIds.remove(userId);
} else {
mEditModeSaveKeyringParcel.mRevokeUserIds.add(userId);
// not possible to revoke and change to primary user id
if (mEditModeSaveKeyringParcel.mChangePrimaryUserId != null
&& mEditModeSaveKeyringParcel.mChangePrimaryUserId.equals(userId)) {
mEditModeSaveKeyringParcel.mChangePrimaryUserId = null;
}
}
break;
}
getLoaderManager().getLoader(LOADER_ID_USER_IDS).forceLoad();
}
};
// Create a new Messenger for the communication back
final Messenger messenger = new Messenger(returnHandler);
DialogFragmentWorkaround.INTERFACE.runnableRunDelayed(new Runnable() {
public void run() {
EditUserIdDialogFragment dialogFragment =
EditUserIdDialogFragment.newInstance(messenger, isRevoked, isRevokedPending);
dialogFragment.show(getActivity().getSupportFragmentManager(), "editUserIdDialog");
}
});
}
private void showUserIdInfo(final int position) {
final boolean isRevoked = mUserIdsAdapter.getIsRevoked(position);
final int isVerified = mUserIdsAdapter.getIsVerified(position);
@ -175,10 +237,11 @@ public class ViewKeyAdvUserIdsFragment extends LoaderFragment implements
activity.startActionMode(new Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mUserIdsAdapter.setEditMode(new SaveKeyringParcel(0L, new byte[0]));
mEditModeSaveKeyringParcel = new SaveKeyringParcel(0L, new byte[0]);
mUserIdsAdapter.setEditMode(mEditModeSaveKeyringParcel);
getLoaderManager().restartLoader(LOADER_ID_USER_IDS, null, ViewKeyAdvUserIdsFragment.this);
mode.setTitle("Edit User Ids");
mode.setTitle(R.string.title_edit_identities);
mode.getMenuInflater().inflate(R.menu.action_edit_uids, menu);
return true;
@ -197,6 +260,7 @@ public class ViewKeyAdvUserIdsFragment extends LoaderFragment implements
@Override
public void onDestroyActionMode(ActionMode mode) {
mEditModeSaveKeyringParcel = null;
mUserIdsAdapter.setEditMode(null);
getLoaderManager().restartLoader(LOADER_ID_USER_IDS, null, ViewKeyAdvUserIdsFragment.this);
}

View file

@ -1,5 +1,6 @@
package org.sufficientlysecure.keychain.ui.adapter;
import android.content.Context;
import android.database.Cursor;
import android.support.v4.widget.CursorAdapter;

View file

@ -23,6 +23,7 @@ import android.content.Context;
import android.database.Cursor;
import android.graphics.Typeface;
import android.net.Uri;
import android.support.annotation.Nullable;
import android.support.v4.content.CursorLoader;
import android.view.LayoutInflater;
import android.view.View;
@ -53,10 +54,6 @@ public class UserIdsAdapter extends UserAttributesAdapter {
mShowStatusImages = showStatusImages;
}
public UserIdsAdapter(Context context, Cursor c, int flags, SaveKeyringParcel saveKeyringParcel) {
this(context, c, flags, true, saveKeyringParcel);
}
public UserIdsAdapter(Context context, Cursor c, int flags) {
this(context, c, flags, true, null);
}
@ -171,7 +168,17 @@ public class UserIdsAdapter extends UserAttributesAdapter {
return isRevokedPending;
}
public void setEditMode(SaveKeyringParcel saveKeyringParcel) {
/** Set this adapter into edit mode. This mode displays additional info for
* each item from a supplied SaveKeyringParcel reference.
*
* Note that it is up to the caller to reload the underlying cursor after
* updating the SaveKeyringParcel!
*
* @see SaveKeyringParcel
*
* @param saveKeyringParcel The parcel to get info from, or null to leave edit mode.
*/
public void setEditMode(@Nullable SaveKeyringParcel saveKeyringParcel) {
mSaveKeyringParcel = saveKeyringParcel;
}

View file

@ -18,8 +18,8 @@ public class UserIdsSelectableAdapter extends UserIdsAdapter implements AdapterV
private final ArrayList<Boolean> mCheckStates;
public UserIdsSelectableAdapter(Context context, Cursor c, int flags, SaveKeyringParcel saveKeyringParcel) {
super(context, c, flags, saveKeyringParcel);
public UserIdsSelectableAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
mCheckStates = new ArrayList<Boolean>();
}

View file

@ -1705,5 +1705,7 @@
<string name="toast_no_text">"No text in shared data!"</string>
<string name="btn_search_for_query">"Search for\n'%s'"</string>
<string name="menu_uids_save">Save</string>
<string name="menu_uids_save">"Save"</string>
<string name="title_edit_identities">"Edit Identities"</string>
</resources>