From 08fd2a2de3795cf8fc4be590ba993c356c8eb67f Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Mon, 9 Mar 2015 16:30:13 +0100 Subject: use loader in LinkedIdViewFragment --- .../keychain/provider/KeychainContract.java | 10 +- .../keychain/provider/KeychainProvider.java | 7 + .../keychain/ui/ViewKeyActivity.java | 4 +- .../keychain/ui/ViewKeyFragment.java | 2 +- .../keychain/ui/adapter/LinkedIdsAdapter.java | 19 +- .../keychain/ui/adapter/LinkedIdsCertAdapter.java | 57 +++++ .../keychain/ui/adapter/UserAttributesAdapter.java | 16 +- .../keychain/ui/linked/LinkedIdViewFragment.java | 262 ++++++++++++++------- 8 files changed, 267 insertions(+), 110 deletions(-) create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/LinkedIdsCertAdapter.java (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java index a7ca613d7..08f3b5248 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java @@ -266,6 +266,7 @@ public class KeychainContract { public static Uri buildLinkedIdsUri(Uri uri) { return CONTENT_URI.buildUpon().appendPath(uri.getPathSegments().get(1)).appendPath(PATH_LINKED_IDS).build(); } + } public static class ApiApps implements ApiAppsColumns, BaseColumns { @@ -354,7 +355,14 @@ public class KeychainContract { } public static Uri buildCertsUri(Uri uri) { - return CONTENT_URI.buildUpon().appendPath(uri.getPathSegments().get(1)).appendPath(PATH_CERTS).build(); + return CONTENT_URI.buildUpon().appendPath(uri.getPathSegments().get(1)) + .appendPath(PATH_CERTS).build(); + } + + public static Uri buildLinkedIdCertsUri(long masterKeyId, int rank) { + return CONTENT_URI.buildUpon().appendPath(Long.toString(masterKeyId)) + .appendPath(PATH_LINKED_IDS).appendPath(Integer.toString(rank)) + .appendPath(PATH_CERTS).build(); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java index ac69ddd24..0f42b3934 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java @@ -63,6 +63,7 @@ public class KeychainProvider extends ContentProvider { private static final int KEY_RING_CERTS = 205; private static final int KEY_RING_CERTS_SPECIFIC = 206; private static final int KEY_RING_LINKED_IDS = 207; + private static final int KEY_RING_LINKED_ID_CERTS = 208; private static final int API_APPS = 301; private static final int API_APPS_BY_PACKAGE_NAME = 302; @@ -129,6 +130,8 @@ public class KeychainProvider extends ContentProvider { * key_rings/_/keys * key_rings/_/user_ids * key_rings/_/linked_ids + * key_rings/_/linked_ids/_ + * key_rings/_/linked_ids/_/certs * key_rings/_/public * key_rings/_/secret * key_rings/_/certs @@ -147,6 +150,10 @@ public class KeychainProvider extends ContentProvider { matcher.addURI(authority, KeychainContract.BASE_KEY_RINGS + "/*/" + KeychainContract.PATH_LINKED_IDS, KEY_RING_LINKED_IDS); + matcher.addURI(authority, KeychainContract.BASE_KEY_RINGS + "/*/" + + KeychainContract.PATH_LINKED_IDS + "/*/" + + KeychainContract.PATH_CERTS, + KEY_RING_LINKED_ID_CERTS); matcher.addURI(authority, KeychainContract.BASE_KEY_RINGS + "/*/" + KeychainContract.PATH_PUBLIC, KEY_RING_PUBLIC); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index cbb2737b6..59e0efbd0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -839,7 +839,9 @@ public class ViewKeyActivity extends BaseActivity implements mIsExpired = data.getInt(INDEX_IS_EXPIRED) != 0; mIsVerified = data.getInt(INDEX_VERIFIED) > 0; - startFragment(mIsSecret, fpData); + if (oldFingerprint == null) { + startFragment(mIsSecret, fpData); + } // get name, email, and comment from USER_ID String[] mainUserId = KeyRing.splitUserId(data.getString(INDEX_USER_ID)); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java index c0d4a376b..a7dc63122 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java @@ -131,7 +131,7 @@ public class ViewKeyFragment extends LoaderFragment implements private void showLinkedId(final int position) { Fragment frag; try { - frag = mLinkedIdsAdapter.getLinkedIdFragment(position, mFingerprint); + frag = mLinkedIdsAdapter.getLinkedIdFragment(mDataUri, position, mFingerprint); } catch (IOException e) { e.printStackTrace(); return; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/LinkedIdsAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/LinkedIdsAdapter.java index 365b8d265..ce4291101 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/LinkedIdsAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/LinkedIdsAdapter.java @@ -35,6 +35,7 @@ import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.pgp.linked.LinkedIdentity; import org.sufficientlysecure.keychain.pgp.linked.RawLinkedIdentity; +import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract.Certs; import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets; import org.sufficientlysecure.keychain.ui.linked.LinkedIdViewFragment; @@ -125,19 +126,15 @@ public class LinkedIdsAdapter extends UserAttributesAdapter { UserIdsAdapter.USER_PACKETS_PROJECTION, LINKED_IDS_WHERE, null, null); } - public Fragment getLinkedIdFragment(int position, byte[] fingerprint) throws IOException { - RawLinkedIdentity id = getItem(position); + public Fragment getLinkedIdFragment(Uri baseUri, + int position, byte[] fingerprint) throws IOException { - Integer isVerified; - if (mShowCertification) { - Cursor cursor = getCursor(); - cursor.moveToPosition(position); - isVerified = cursor.getInt(INDEX_VERIFIED); - } else { - isVerified = null; - } + Cursor c = getCursor(); + c.moveToPosition(position); + int rank = c.getInt(UserIdsAdapter.INDEX_RANK); - return LinkedIdViewFragment.newInstance(id, isVerified, fingerprint); + Uri dataUri = UserPackets.buildLinkedIdsUri(baseUri); + return LinkedIdViewFragment.newInstance(dataUri, rank, mShowCertification, fingerprint); } public static class ViewHolder { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/LinkedIdsCertAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/LinkedIdsCertAdapter.java new file mode 100644 index 000000000..5ecd9f408 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/LinkedIdsCertAdapter.java @@ -0,0 +1,57 @@ +package org.sufficientlysecure.keychain.ui.adapter; + + +import android.app.Activity; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.support.v4.content.CursorLoader; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CursorAdapter; + +import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets; + + +public class LinkedIdsCertAdapter extends CursorAdapter { + + public static final String[] USER_CERTS_PROJECTION = new String[]{ + UserPackets._ID, + UserPackets.TYPE, + UserPackets.USER_ID, + UserPackets.ATTRIBUTE_DATA, + UserPackets.RANK, + UserPackets.VERIFIED, + UserPackets.IS_PRIMARY, + UserPackets.IS_REVOKED + }; + protected static final int INDEX_ID = 0; + protected static final int INDEX_TYPE = 1; + protected static final int INDEX_USER_ID = 2; + protected static final int INDEX_ATTRIBUTE_DATA = 3; + protected static final int INDEX_RANK = 4; + protected static final int INDEX_VERIFIED = 5; + protected static final int INDEX_IS_PRIMARY = 6; + protected static final int INDEX_IS_REVOKED = 7; + + public LinkedIdsCertAdapter(Context context, Cursor c, int flags) { + super(context, c, flags); + } + + @Override + public void bindView(View view, Context context, Cursor cursor) { + + } + + @Override + public View newView(Context context, Cursor cursor, ViewGroup parent) { + return null; + } + + public static CursorLoader createLoader(Activity activity, Uri dataUri) { + Uri baseUri = UserPackets.buildLinkedIdsUri(dataUri); + return new CursorLoader(activity, baseUri, + UserIdsAdapter.USER_PACKETS_PROJECTION, null, null, null); + } + +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserAttributesAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserAttributesAdapter.java index 345ccccc0..e0abaf4b0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserAttributesAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserAttributesAdapter.java @@ -18,14 +18,14 @@ public abstract class UserAttributesAdapter extends CursorAdapter { UserPackets.IS_PRIMARY, UserPackets.IS_REVOKED }; - protected static final int INDEX_ID = 0; - protected static final int INDEX_TYPE = 1; - protected static final int INDEX_USER_ID = 2; - protected static final int INDEX_ATTRIBUTE_DATA = 3; - protected static final int INDEX_RANK = 4; - protected static final int INDEX_VERIFIED = 5; - protected static final int INDEX_IS_PRIMARY = 6; - protected static final int INDEX_IS_REVOKED = 7; + public static final int INDEX_ID = 0; + public static final int INDEX_TYPE = 1; + public static final int INDEX_USER_ID = 2; + public static final int INDEX_ATTRIBUTE_DATA = 3; + public static final int INDEX_RANK = 4; + public static final int INDEX_VERIFIED = 5; + public static final int INDEX_IS_PRIMARY = 6; + public static final int INDEX_IS_REVOKED = 7; public UserAttributesAdapter(Context context, Cursor c, int flags) { super(context, c, flags); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdViewFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdViewFragment.java index 6ad7fa443..fcb9d7bb4 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdViewFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdViewFragment.java @@ -7,12 +7,16 @@ import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Message; import android.os.Messenger; import android.support.v4.app.Fragment; -import android.support.v7.widget.CardView; +import android.support.v4.app.LoaderManager; +import android.support.v4.content.CursorLoader; +import android.support.v4.content.Loader; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@ -22,151 +26,183 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.ViewAnimator; -import org.spongycastle.util.encoders.Hex; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.operations.results.CertifyResult; import org.sufficientlysecure.keychain.operations.results.LinkedVerifyResult; -import org.sufficientlysecure.keychain.pgp.WrappedUserAttribute; import org.sufficientlysecure.keychain.pgp.linked.LinkedCookieResource; import org.sufficientlysecure.keychain.pgp.linked.LinkedIdentity; import org.sufficientlysecure.keychain.pgp.linked.LinkedResource; import org.sufficientlysecure.keychain.pgp.linked.RawLinkedIdentity; import org.sufficientlysecure.keychain.provider.KeychainContract.Certs; +import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets; +import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables; import org.sufficientlysecure.keychain.service.CertifyActionsParcel; import org.sufficientlysecure.keychain.service.CertifyActionsParcel.CertifyAction; import org.sufficientlysecure.keychain.service.KeychainIntentService; import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler; import org.sufficientlysecure.keychain.service.PassphraseCacheService; import org.sufficientlysecure.keychain.ui.PassphraseDialogActivity; -import org.sufficientlysecure.keychain.ui.adapter.LinkedIdsAdapter.ViewHolder; +import org.sufficientlysecure.keychain.ui.adapter.LinkedIdsAdapter; +import org.sufficientlysecure.keychain.ui.adapter.LinkedIdsCertAdapter; +import org.sufficientlysecure.keychain.ui.adapter.UserIdsAdapter; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; -import org.sufficientlysecure.keychain.ui.util.Notify; -import org.sufficientlysecure.keychain.ui.util.Notify.Style; import org.sufficientlysecure.keychain.ui.widget.CertifyKeySpinner; import org.sufficientlysecure.keychain.util.Log; -import org.sufficientlysecure.keychain.util.Preferences; -public class LinkedIdViewFragment extends Fragment { +public class LinkedIdViewFragment extends Fragment implements + LoaderManager.LoaderCallbacks { public static final int REQUEST_CODE_PASSPHRASE = 0x00008001; - private static final String ARG_ENCODED_LID = "encoded_lid"; - private static final String ARG_VERIFIED = "verified"; + private static final String ARG_DATA_URI = "data_uri"; + private static final String ARG_LID_RANK = "rank"; + private static final String ARG_SHOWCERT = "verified"; private static final String ARG_FINGERPRINT = "fingerprint"; + private static final int LOADER_ID_LINKED_CERTS = 1; + private static final int LOADER_ID_LINKED_ID = 2; private RawLinkedIdentity mLinkedId; private LinkedCookieResource mLinkedResource; - private Integer mVerified; + private boolean mShowCert; - private CardView vLinkedIdsCard; private Context mContext; private byte[] mFingerprint; private LayoutInflater mInflater; - private LinearLayout vLinkedCerts; - private View mCurrentCert; private boolean mInProgress; - private ViewAnimator mButtonSwitcher; - private CertifyKeySpinner vKeySpinner; + + private LinkedIdsCertAdapter mCertAdapter; + private Uri mDataUri; + private ViewHolder mViewHolder; + private View mCurrentCert; + private int mLidRank; + + public static Fragment newInstance(Uri dataUri, int rank, + boolean showCertified, byte[] fingerprint) throws IOException { + LinkedIdViewFragment frag = new LinkedIdViewFragment(); + + Bundle args = new Bundle(); + args.putParcelable(ARG_DATA_URI, dataUri); + args.putInt(ARG_LID_RANK, rank); + args.putBoolean(ARG_SHOWCERT, showCertified); + args.putByteArray(ARG_FINGERPRINT, fingerprint); + frag.setArguments(args); + + return frag; + } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle args = getArguments(); - byte[] data = args.getByteArray(ARG_ENCODED_LID); - - try { - mLinkedId = LinkedIdentity.fromAttributeData(data); - } catch (IOException e) { - // TODO um… - e.printStackTrace(); - throw new AssertionError("reconstruction of user attribute must succeed!"); - } - - if (mLinkedId instanceof LinkedIdentity) { - LinkedResource res = ((LinkedIdentity) mLinkedId).mResource; - mLinkedResource = (LinkedCookieResource) res; - } + mDataUri = args.getParcelable(ARG_DATA_URI); + mLidRank = args.getInt(ARG_LID_RANK); - mVerified = args.containsKey(ARG_VERIFIED) ? args.getInt(ARG_VERIFIED) : null; + mShowCert = args.getBoolean(ARG_SHOWCERT); mFingerprint = args.getByteArray(ARG_FINGERPRINT); mContext = getActivity(); mInflater = getLayoutInflater(savedInstanceState); - } - - public static Fragment newInstance(RawLinkedIdentity id, - Integer isVerified, byte[] fingerprint) throws IOException { - LinkedIdViewFragment frag = new LinkedIdViewFragment(); + mCertAdapter = new LinkedIdsCertAdapter(getActivity(), null, 0); + // getLoaderManager().initLoader(LOADER_ID_LINKED_CERTS, null, this); + getLoaderManager().initLoader(LOADER_ID_LINKED_ID, null, this); - Bundle args = new Bundle(); - args.putByteArray(ARG_ENCODED_LID, id.toUserAttribute().getEncoded()); - if (isVerified != null) { - args.putInt(ARG_VERIFIED, isVerified); + } + @Override + public Loader onCreateLoader(int id, Bundle args) { + switch (id) { + case LOADER_ID_LINKED_ID: + return new CursorLoader(getActivity(), mDataUri, + UserIdsAdapter.USER_PACKETS_PROJECTION, + Tables.USER_PACKETS + "." + UserPackets.RANK + + " = " + Integer.toString(mLidRank), null, null); + + case LOADER_ID_LINKED_CERTS: + return LinkedIdsCertAdapter.createLoader(getActivity(), mDataUri); + + default: + return null; } - args.putByteArray(ARG_FINGERPRINT, fingerprint); - frag.setArguments(args); - - return frag; } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) { - View root = inflater.inflate(R.layout.linked_id_view_fragment, null); + public void onLoadFinished(Loader loader, Cursor cursor) { + switch (loader.getId()) { + case LOADER_ID_LINKED_ID: - vLinkedIdsCard = (CardView) root.findViewById(R.id.card_linked_ids); - vLinkedCerts = (LinearLayout) root.findViewById(R.id.linked_id_certs); - vKeySpinner = (CertifyKeySpinner) root.findViewById(R.id.cert_key_spinner); + // TODO proper error reporting and null checks here! - View back = root.findViewById(R.id.back_button); - back.setClickable(true); - back.findViewById(R.id.back_button).setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - getFragmentManager().popBackStack(); - } - }); + if (!cursor.moveToFirst()) { + Log.e(Constants.TAG, "error"); + break; + } - ViewHolder holder = new ViewHolder(root); + try { + int certStatus = cursor.getInt(UserIdsAdapter.INDEX_VERIFIED); - if (mVerified != null) { - holder.vVerified.setVisibility(View.VISIBLE); - switch (mVerified) { + byte[] data = cursor.getBlob(UserIdsAdapter.INDEX_ATTRIBUTE_DATA); + RawLinkedIdentity linkedId = LinkedIdentity.fromAttributeData(data); + + loadIdentity(linkedId, certStatus); + } catch (IOException e) { + e.printStackTrace(); + throw new AssertionError("reconstruction of user attribute must succeed!"); + } + + break; + + case LOADER_ID_LINKED_CERTS: + mCertAdapter.swapCursor(cursor); + break; + } + } + + private void loadIdentity(RawLinkedIdentity linkedId, int certStatus) { + mLinkedId = linkedId; + + if (mLinkedId instanceof LinkedIdentity) { + LinkedResource res = ((LinkedIdentity) mLinkedId).mResource; + mLinkedResource = (LinkedCookieResource) res; + } + + if (mShowCert) { + mViewHolder.mLinkedIdHolder.vVerified.setVisibility(View.VISIBLE); + + switch (certStatus) { case Certs.VERIFIED_SECRET: - KeyFormattingUtils.setStatusImage(mContext, holder.vVerified, + KeyFormattingUtils.setStatusImage(mContext, mViewHolder.mLinkedIdHolder.vVerified, null, State.VERIFIED, KeyFormattingUtils.DEFAULT_COLOR); break; case Certs.VERIFIED_SELF: - KeyFormattingUtils.setStatusImage(mContext, holder.vVerified, + KeyFormattingUtils.setStatusImage(mContext, mViewHolder.mLinkedIdHolder.vVerified, null, State.UNVERIFIED, KeyFormattingUtils.DEFAULT_COLOR); break; default: - KeyFormattingUtils.setStatusImage(mContext, holder.vVerified, + KeyFormattingUtils.setStatusImage(mContext, mViewHolder.mLinkedIdHolder.vVerified, null, State.INVALID, KeyFormattingUtils.DEFAULT_COLOR); break; } } else { - holder.vVerified.setVisibility(View.GONE); + mViewHolder.mLinkedIdHolder.vVerified.setVisibility(View.GONE); } - holder.setData(mContext, mLinkedId); + mViewHolder.mLinkedIdHolder.setData(mContext, mLinkedId); // no resource, nothing further we can do… if (mLinkedResource == null) { - root.findViewById(R.id.button_view).setVisibility(View.GONE); - root.findViewById(R.id.button_verify).setVisibility(View.GONE); - return root; + mViewHolder.vButtonView.setVisibility(View.GONE); + mViewHolder.vButtonVerify.setVisibility(View.GONE); + return; } - View button_view = root.findViewById(R.id.button_view); if (mLinkedResource.isViewable()) { - button_view.setVisibility(View.VISIBLE); - button_view.setOnClickListener(new OnClickListener() { + mViewHolder.vButtonView.setVisibility(View.VISIBLE); + mViewHolder.vButtonView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = mLinkedResource.getViewIntent(); @@ -177,29 +213,79 @@ public class LinkedIdViewFragment extends Fragment { } }); } else { - button_view.setVisibility(View.GONE); + mViewHolder.vButtonView.setVisibility(View.GONE); + } + + } + + @Override + public void onLoaderReset(Loader loader) { + switch (loader.getId()) { + case LOADER_ID_LINKED_CERTS: + mCertAdapter.swapCursor(null); + break; + } + + } + + static class ViewHolder { + private final View vButtonView; + LinkedIdsAdapter.ViewHolder mLinkedIdHolder; + + private ViewAnimator mButtonSwitcher; + private LinearLayout vLinkedCerts; + private CertifyKeySpinner vKeySpinner; + private LinearLayout vLinkedVerify; + private final View vButtonVerify; + private final View vButtonRetry; + private final View vButtonConfirm; + private final View vButtonBack; + + ViewHolder(View root) { + vLinkedCerts = (LinearLayout) root.findViewById(R.id.linked_id_certs); + vLinkedVerify = (LinearLayout) root.findViewById(R.id.linked_id_verify); + vKeySpinner = (CertifyKeySpinner) root.findViewById(R.id.cert_key_spinner); + mButtonSwitcher = (ViewAnimator) root.findViewById(R.id.button_animator); + + mLinkedIdHolder = new LinkedIdsAdapter.ViewHolder(root); + + vButtonBack = root.findViewById(R.id.back_button); + vButtonVerify = root.findViewById(R.id.button_verify); + vButtonRetry = root.findViewById(R.id.button_retry); + vButtonConfirm = root.findViewById(R.id.button_confirm); + vButtonView = root.findViewById(R.id.button_view); } - mButtonSwitcher = (ViewAnimator) root.findViewById(R.id.button_animator); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) { + View root = inflater.inflate(R.layout.linked_id_view_fragment, null); - View button_verify = root.findViewById(R.id.button_verify); - button_verify.setOnClickListener(new OnClickListener() { + mViewHolder = new ViewHolder(root); + root.setTag(mViewHolder); + + mViewHolder.vButtonBack.setClickable(true); + mViewHolder.vButtonBack.findViewById(R.id.back_button).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - verifyResource(); + getFragmentManager().popBackStack(); } }); - View button_retry = root.findViewById(R.id.button_retry); - button_retry.setOnClickListener(new OnClickListener() { + mViewHolder.vButtonVerify.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { verifyResource(); } }); - - View button_confirm = root.findViewById(R.id.button_confirm); - button_confirm.setOnClickListener(new OnClickListener() { + mViewHolder.vButtonRetry.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + verifyResource(); + } + }); + mViewHolder.vButtonConfirm.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { initiateCertifying(); @@ -225,10 +311,10 @@ public class LinkedIdViewFragment extends Fragment { } void showButton(int which) { - if (mButtonSwitcher.getDisplayedChild() == which) { + if (mViewHolder.mButtonSwitcher.getDisplayedChild() == which) { return; } - mButtonSwitcher.setDisplayedChild(which); + mViewHolder.mButtonSwitcher.setDisplayedChild(which); } void verifyResource() { @@ -247,12 +333,12 @@ public class LinkedIdViewFragment extends Fragment { mCurrentCert = mInflater.inflate(R.layout.linked_id_cert, null); holder = new ViewHolderCert(mCurrentCert); mCurrentCert.setTag(holder); - vLinkedCerts.addView(mCurrentCert); + mViewHolder.vLinkedVerify.addView(mCurrentCert); } else { holder = (ViewHolderCert) mCurrentCert.getTag(); } - vKeySpinner.setVisibility(View.GONE); + mViewHolder.vKeySpinner.setVisibility(View.GONE); holder.setShowProgress(true); holder.vText.setText("Verifying…"); @@ -294,14 +380,14 @@ public class LinkedIdViewFragment extends Fragment { // button is 'confirm' showButton(2); - vKeySpinner.setVisibility(View.VISIBLE); + mViewHolder.vKeySpinner.setVisibility(View.VISIBLE); } private void initiateCertifying() { // get the user's passphrase for this key (if required) String passphrase; - long certifyKeyId = vKeySpinner.getSelectedItemId(); + long certifyKeyId = mViewHolder.vKeySpinner.getSelectedItemId(); try { passphrase = PassphraseCacheService.getCachedPassphrase( getActivity(), certifyKeyId, certifyKeyId); -- cgit v1.2.3