From 5faeb5f5f060e049000e804deca5445d281f8611 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Mon, 12 Jan 2015 13:17:18 +0100 Subject: intermediate state, nothing really working yet --- .../keychain/ui/widget/HttpsPrefixedText.java | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/HttpsPrefixedText.java (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/HttpsPrefixedText.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/HttpsPrefixedText.java new file mode 100644 index 000000000..292343eb7 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/HttpsPrefixedText.java @@ -0,0 +1,38 @@ +package org.sufficientlysecure.keychain.ui.widget; + +import android.content.Context; +import android.graphics.*; +import android.support.annotation.NonNull; +import android.util.AttributeSet; +import android.widget.EditText; + +/** */ +public class HttpsPrefixedText extends EditText { + + private String mPrefix; // can be hardcoded for demo purposes + private Rect mPrefixRect = new Rect(); + + public HttpsPrefixedText(Context context, AttributeSet attrs) { + super(context, attrs); + mPrefix = "https://"; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + getPaint().getTextBounds(mPrefix, 0, mPrefix.length(), mPrefixRect); + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + @Override + protected void onDraw(@NonNull Canvas canvas) { + super.onDraw(canvas); + canvas.drawText(mPrefix, super.getCompoundPaddingLeft(), getBaseline(), getPaint()); + } + + @Override + public int getCompoundPaddingLeft() { + return super.getCompoundPaddingLeft() + mPrefixRect.width(); + } + +} \ No newline at end of file -- cgit v1.2.3 From b57bcefe080a0070a65efb6e88d76af1eface52d Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sun, 8 Mar 2015 04:41:41 +0100 Subject: return key ids from PassphraseDialogActivity, accept null userids --- .../java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java | 4 ---- 1 file changed, 4 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java index c8eceea50..b4890ac4e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java @@ -128,10 +128,6 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo } } - public long getSelectedKeyId() { - return mSelectedKeyId; - } - public void setSelectedKeyId(long selectedKeyId) { this.mSelectedKeyId = selectedKeyId; } -- cgit v1.2.3 From 99eb8725e92dde56511eafe2077e227cf9795f29 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sun, 8 Mar 2015 04:42:19 +0100 Subject: successfully certify linked ids --- .../main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java | 1 + 1 file changed, 1 insertion(+) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java index b4890ac4e..364712a48 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java @@ -269,6 +269,7 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo } return view; } + } boolean setStatus(Context context, Cursor cursor, ImageView statusView) { -- cgit v1.2.3 From ebf359634139ff2125233a78a976388082abf00c Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Mon, 9 Mar 2015 21:04:03 +0100 Subject: rearrange linked id layouts, add CertListWidget --- .../keychain/ui/widget/CertListWidget.java | 131 +++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java new file mode 100644 index 000000000..3e9cffb69 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java @@ -0,0 +1,131 @@ +package org.sufficientlysecure.keychain.ui.widget; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.LoaderManager; +import android.support.v4.content.CursorLoader; +import android.support.v4.content.Loader; +import android.text.SpannableStringBuilder; +import android.util.AttributeSet; +import android.view.View; +import android.widget.TextView; +import android.widget.ViewAnimator; + +import com.ocpsoft.pretty.time.PrettyTime; +import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.provider.KeychainContract; +import org.sufficientlysecure.keychain.provider.KeychainContract.Certs; + +public class CertListWidget extends ViewAnimator + implements LoaderManager.LoaderCallbacks { + + public static final int LOADER_ID_LINKED_CERTS = 38572; + + public static final String ARG_URI = "uri"; + public static final String ARG_RANK = "rank"; + + + // These are the rows that we will retrieve. + static final String[] CERTS_PROJECTION = new String[]{ + KeychainContract.Certs._ID, + KeychainContract.Certs.MASTER_KEY_ID, + KeychainContract.Certs.VERIFIED, + KeychainContract.Certs.TYPE, + KeychainContract.Certs.RANK, + KeychainContract.Certs.KEY_ID_CERTIFIER, + KeychainContract.Certs.USER_ID, + KeychainContract.Certs.SIGNER_UID, + KeychainContract.Certs.CREATION + }; + public static final int INDEX_MASTER_KEY_ID = 1; + public static final int INDEX_VERIFIED = 2; + public static final int INDEX_TYPE = 3; + public static final int INDEX_RANK = 4; + public static final int INDEX_KEY_ID_CERTIFIER = 5; + public static final int INDEX_USER_ID = 6; + public static final int INDEX_SIGNER_UID = 7; + public static final int INDEX_CREATION = 8; + + private TextView vCollapsed; + private View vExpanded; + private View vExpandButton; + + public CertListWidget(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + View root = getRootView(); + vCollapsed = (TextView) root.findViewById(R.id.cert_collapsed_list); + vExpanded = root.findViewById(R.id.cert_expanded_list); + vExpandButton = root.findViewById(R.id.cert_expand_button); + + // for now + vExpandButton.setVisibility(View.GONE); + } + + void setExpanded(boolean expanded) { + setDisplayedChild(expanded ? 1 : 0); + } + + @Override + public Loader onCreateLoader(int id, Bundle args) { + Uri baseUri = args.getParcelable(ARG_URI); + int rank = args.getInt(ARG_RANK); + + Uri uri = Certs.buildLinkedIdCertsUri(baseUri, rank); + return new CursorLoader(getContext(), uri, + CERTS_PROJECTION, null, null, null); + + } + + @Override + public void onLoadFinished(Loader loader, Cursor data) { + + if (data == null || !data.moveToFirst()) { + return; + } + + setVisibility(View.VISIBLE); + + // TODO support external certificates + Date userCert = null; + while (!data.isAfterLast()) { + + int verified = data.getInt(INDEX_VERIFIED); + Date creation = new Date(data.getLong(INDEX_CREATION) * 1000); + + if (verified == Certs.VERIFIED_SECRET) { + if (userCert == null || userCert.after(creation)) { + userCert = creation; + } + } + + data.moveToNext(); + } + + if (userCert != null) { + PrettyTime format = new PrettyTime(); + vCollapsed.setText("You verified and confirmed this identity " + + format.format(userCert) + "."); + } else { + vCollapsed.setText("This identity is not yet verified or confirmed."); + } + + } + + @Override + public void onLoaderReset(Loader loader) { + setVisibility(View.GONE); + } + +} -- cgit v1.2.3 From f069d9814dd5bb4dcc99be1a08da2d7bcf350cde Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Tue, 10 Mar 2015 02:22:47 +0100 Subject: minor additions to CertListWidget --- .../keychain/ui/widget/CertListWidget.java | 24 +++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java index 3e9cffb69..094a84820 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java @@ -14,6 +14,7 @@ import android.support.v4.content.Loader; import android.text.SpannableStringBuilder; import android.util.AttributeSet; import android.view.View; +import android.widget.ListView; import android.widget.TextView; import android.widget.ViewAnimator; @@ -53,7 +54,7 @@ public class CertListWidget extends ViewAnimator public static final int INDEX_CREATION = 8; private TextView vCollapsed; - private View vExpanded; + private ListView vExpanded; private View vExpandButton; public CertListWidget(Context context, AttributeSet attrs) { @@ -66,11 +67,24 @@ public class CertListWidget extends ViewAnimator View root = getRootView(); vCollapsed = (TextView) root.findViewById(R.id.cert_collapsed_list); - vExpanded = root.findViewById(R.id.cert_expanded_list); + vExpanded = (ListView) root.findViewById(R.id.cert_expanded_list); vExpandButton = root.findViewById(R.id.cert_expand_button); // for now vExpandButton.setVisibility(View.GONE); + vExpandButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + toggleExpanded(); + } + }); + + // vExpanded.setAdapter(null); + + } + + void toggleExpanded() { + setDisplayedChild(getDisplayedChild() == 1 ? 0 : 1); } void setExpanded(boolean expanded) { @@ -79,13 +93,9 @@ public class CertListWidget extends ViewAnimator @Override public Loader onCreateLoader(int id, Bundle args) { - Uri baseUri = args.getParcelable(ARG_URI); - int rank = args.getInt(ARG_RANK); - - Uri uri = Certs.buildLinkedIdCertsUri(baseUri, rank); + Uri uri = args.getParcelable(ARG_URI); return new CursorLoader(getContext(), uri, CERTS_PROJECTION, null, null, null); - } @Override -- cgit v1.2.3 From ba7d8a58673d55660bc7faf68970229f17458514 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 14 Mar 2015 23:10:58 +0100 Subject: show certificates for secret keys differently --- .../keychain/ui/widget/CertListWidget.java | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java index 094a84820..c8f80f4a5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java @@ -1,7 +1,5 @@ package org.sufficientlysecure.keychain.ui.widget; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.Date; import android.content.Context; @@ -11,7 +9,6 @@ import android.os.Bundle; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; -import android.text.SpannableStringBuilder; import android.util.AttributeSet; import android.view.View; import android.widget.ListView; @@ -29,7 +26,7 @@ public class CertListWidget extends ViewAnimator public static final int LOADER_ID_LINKED_CERTS = 38572; public static final String ARG_URI = "uri"; - public static final String ARG_RANK = "rank"; + public static final String ARG_IS_SECRET = "is_secret"; // These are the rows that we will retrieve. @@ -56,6 +53,7 @@ public class CertListWidget extends ViewAnimator private TextView vCollapsed; private ListView vExpanded; private View vExpandButton; + private boolean mIsSecret; public CertListWidget(Context context, AttributeSet attrs) { super(context, attrs); @@ -94,6 +92,7 @@ public class CertListWidget extends ViewAnimator @Override public Loader onCreateLoader(int id, Bundle args) { Uri uri = args.getParcelable(ARG_URI); + mIsSecret = args.getBoolean(ARG_IS_SECRET, false); return new CursorLoader(getContext(), uri, CERTS_PROJECTION, null, null, null); } @@ -105,8 +104,6 @@ public class CertListWidget extends ViewAnimator return; } - setVisibility(View.VISIBLE); - // TODO support external certificates Date userCert = null; while (!data.isAfterLast()) { @@ -125,12 +122,19 @@ public class CertListWidget extends ViewAnimator if (userCert != null) { PrettyTime format = new PrettyTime(); - vCollapsed.setText("You verified and confirmed this identity " - + format.format(userCert) + "."); + if (mIsSecret) { + vCollapsed.setText("You created this identity " + + format.format(userCert) + "."); + } else { + vCollapsed.setText("You verified and confirmed this identity " + + format.format(userCert) + "."); + } } else { vCollapsed.setText("This identity is not yet verified or confirmed."); } + setVisibility(View.VISIBLE); + } @Override -- cgit v1.2.3 From 01c444d63788b78781132ef5cc9998b0b4352e71 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sun, 29 Mar 2015 23:38:01 +0200 Subject: even more linked id ui work --- .../org/sufficientlysecure/keychain/ui/widget/CertListWidget.java | 2 -- .../sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java | 6 ++++++ .../java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java | 7 ++++++- 3 files changed, 12 insertions(+), 3 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java index c8f80f4a5..0f33a3b8a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertListWidget.java @@ -133,8 +133,6 @@ public class CertListWidget extends ViewAnimator vCollapsed.setText("This identity is not yet verified or confirmed."); } - setVisibility(View.VISIBLE); - } @Override diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java index 460163a47..714933b58 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java @@ -21,6 +21,7 @@ import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; +import android.support.annotation.StringRes; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.util.AttributeSet; @@ -138,4 +139,9 @@ public class CertifyKeySpinner extends KeySpinner { return true; } + public @StringRes int getNoneString() { + return R.string.choice_select_cert; + } + + } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java index 70f4e7792..5a6c61f7d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java @@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.ui.widget; import android.content.Context; import android.database.Cursor; import android.graphics.Color; +import android.support.annotation.StringRes; import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; @@ -277,7 +278,7 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo TextView vKeyEmail = (TextView) view.findViewById(R.id.keyspinner_key_email); TextView vKeyDuplicate = (TextView) view.findViewById(R.id.keyspinner_duplicate); - vKeyName.setText(R.string.choice_none); + vKeyName.setText(getNoneString()); vKeyEmail.setVisibility(View.GONE); vKeyDuplicate.setVisibility(View.GONE); vKeyStatus.setVisibility(View.GONE); @@ -296,4 +297,8 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo return true; } + public @StringRes int getNoneString() { + return R.string.choice_none; + } + } -- cgit v1.2.3 From d27925ad19b6800658a69670ceaed261776ba6d3 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Mon, 30 Mar 2015 02:42:16 +0200 Subject: rewrite EncryptKeyCompletionView with generalized KeyAdapter --- .../ui/widget/EncryptKeyCompletionView.java | 278 ++++++--------------- 1 file changed, 73 insertions(+), 205 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java index ceace1d26..b2dfb2493 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java @@ -1,5 +1,6 @@ /* - * Copyright (C) 2014 Dominik Schürmann + * Copyright (C) 2014-2015 Dominik Schürmann + * Copyright (C) 2015 Vincent Breitmoser * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,49 +18,42 @@ package org.sufficientlysecure.keychain.ui.widget; -import android.app.Activity; import android.content.Context; import android.database.Cursor; -import android.graphics.Bitmap; import android.graphics.Rect; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager; +import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; -import android.text.format.DateFormat; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; -import android.widget.ImageView; import android.widget.TextView; -import com.tokenautocomplete.FilteredArrayAdapter; import com.tokenautocomplete.TokenCompleteTextView; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.pgp.KeyRing; -import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException; -import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables; -import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; -import org.sufficientlysecure.keychain.util.ContactHelper; +import org.sufficientlysecure.keychain.ui.adapter.KeyAdapter; +import org.sufficientlysecure.keychain.ui.adapter.KeyAdapter.KeyItem; import org.sufficientlysecure.keychain.util.Log; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Locale; -import java.util.TimeZone; -public class EncryptKeyCompletionView extends TokenCompleteTextView { +public class EncryptKeyCompletionView extends TokenCompleteTextView + implements LoaderCallbacks { + + public static final String ARG_QUERY = "query"; + + private KeyAdapter mAdapter; + private LoaderManager mLoaderManager; + private String mPrefix; + public EncryptKeyCompletionView(Context context) { super(context); initView(); @@ -76,33 +70,31 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView { } private void initView() { - swapCursor(null); setPrefix(getContext().getString(R.string.label_to) + " "); + allowDuplicates(false); + mAdapter = new KeyAdapter(getContext(), null, 0); + setAdapter(mAdapter); + } + + @Override + public void setPrefix(String p) { + // this one is private in the superclass, but we need it here + mPrefix = p; + super.setPrefix(p); } @Override protected View getViewForObject(Object object) { - if (object instanceof EncryptionKey) { - LayoutInflater l = (LayoutInflater) getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE); + if (object instanceof KeyItem) { + LayoutInflater l = LayoutInflater.from(getContext()); View view = l.inflate(R.layout.recipient_box_entry, null); - ((TextView) view.findViewById(android.R.id.text1)).setText(((EncryptionKey) object).getPrimary()); - setImageByKey((ImageView) view.findViewById(android.R.id.icon), (EncryptionKey) object); + ((TextView) view.findViewById(android.R.id.text1)).setText(((KeyItem) object).getReadableName()); return view; } return null; } - private void setImageByKey(ImageView view, EncryptionKey key) { - Bitmap photo = ContactHelper.getCachedPhotoByMasterKeyId(getContext().getContentResolver(), key.getKeyId()); - - if (photo != null) { - view.setImageBitmap(photo); - } else { - view.setImageResource(R.drawable.ic_generic_man); - } - } - @Override protected Object defaultObject(String completionText) { // TODO: We could try to automagically download the key if it's unknown but a key id @@ -115,196 +107,72 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); + + mLoaderManager = ((FragmentActivity) getContext()).getSupportLoaderManager(); + if (getContext() instanceof FragmentActivity) { - ((FragmentActivity) getContext()).getSupportLoaderManager().initLoader(hashCode(), null, new LoaderManager.LoaderCallbacks() { - @Override - public Loader onCreateLoader(int id, Bundle args) { - // These are the rows that we will retrieve. - Uri baseUri = KeyRings.buildUnifiedKeyRingsUri(); - - String[] projection = new String[]{ - KeyRings._ID, - KeyRings.MASTER_KEY_ID, - KeyRings.KEY_ID, - KeyRings.USER_ID, - KeyRings.FINGERPRINT, - KeyRings.IS_EXPIRED, - KeyRings.HAS_ENCRYPT, - KeyRings.HAS_DUPLICATE_USER_ID, - KeyRings.CREATION - }; - - String where = KeyRings.HAS_ENCRYPT + " NOT NULL AND " + KeyRings.IS_EXPIRED + " = 0 AND " - + Tables.KEYS + "." + KeyRings.IS_REVOKED + " = 0"; - - return new CursorLoader(getContext(), baseUri, projection, where, null, null); - } - - @Override - public void onLoadFinished(Loader loader, Cursor data) { - swapCursor(data); - } - - @Override - public void onLoaderReset(Loader loader) { - swapCursor(null); - } - }); + mLoaderManager.initLoader(hashCode(), null, this); } else { Log.e(Constants.TAG, "EncryptKeyCompletionView must be attached to a FragmentActivity, this is " + getContext().getClass()); } } @Override - public void onFocusChanged(boolean hasFocus, int direction, Rect previous) { - super.onFocusChanged(hasFocus, direction, previous); - if (hasFocus) { - ((InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE)) - .showSoftInput(this, InputMethodManager.SHOW_IMPLICIT); - } + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + mLoaderManager = null; } - public void swapCursor(Cursor cursor) { - if (cursor == null) { - setAdapter(new EncryptKeyAdapter(Collections.emptyList())); - return; - } - ArrayList keys = new ArrayList<>(); - while (cursor.moveToNext()) { - try { - EncryptionKey key = new EncryptionKey(cursor); - keys.add(key); - } catch (Exception e) { - Log.w(Constants.TAG, e); - return; - } - } - setAdapter(new EncryptKeyAdapter(keys)); - } - - public class EncryptionKey { - private String mUserIdFull; - private KeyRing.UserId mUserId; - private long mKeyId; - private boolean mHasDuplicate; - private Date mCreation; - private String mFingerprint; - - public EncryptionKey(String userId, long keyId, boolean hasDuplicate, Date creation, String fingerprint) { - mUserId = KeyRing.splitUserId(userId); - mUserIdFull = userId; - mKeyId = keyId; - mHasDuplicate = hasDuplicate; - mCreation = creation; - mFingerprint = fingerprint; - } - - public EncryptionKey(Cursor cursor) { - this(cursor.getString(cursor.getColumnIndexOrThrow(KeyRings.USER_ID)), - cursor.getLong(cursor.getColumnIndexOrThrow(KeyRings.KEY_ID)), - cursor.getLong(cursor.getColumnIndexOrThrow(KeyRings.HAS_DUPLICATE_USER_ID)) > 0, - new Date(cursor.getLong(cursor.getColumnIndexOrThrow(KeyRings.CREATION)) * 1000), - KeyFormattingUtils.convertFingerprintToHex( - cursor.getBlob(cursor.getColumnIndexOrThrow(KeyRings.FINGERPRINT)))); - } - - public EncryptionKey(CachedPublicKeyRing ring) throws PgpKeyNotFoundException { - this(ring.getPrimaryUserId(), ring.extractOrGetMasterKeyId(), false, null, - KeyFormattingUtils.convertFingerprintToHex(ring.getFingerprint())); - } - - public String getUserId() { - return mUserIdFull; - } - - public String getFingerprint() { - return mFingerprint; - } - - public String getPrimary() { - if (mUserId.name != null) { - return mUserId.name; - } else { - return mUserId.email; - } - } - - public String getSecondary() { - if (mUserId.email != null) { - return mUserId.email; - } else { - return getCreationDate(); - } - } - - public String getTertiary() { - if (mUserId.name != null) { - return getCreationDate(); - } else { - return null; - } - } + @Override + public Loader onCreateLoader(int id, Bundle args) { + // These are the rows that we will retrieve. + Uri baseUri = KeyRings.buildUnifiedKeyRingsUri(); + String where = KeyRings.HAS_ENCRYPT + " NOT NULL AND " + KeyRings.IS_EXPIRED + " = 0 AND " + + Tables.KEYS + "." + KeyRings.IS_REVOKED + " = 0"; - public long getKeyId() { - return mKeyId; - } + if (args != null && args.containsKey(ARG_QUERY)) { + String query = args.getString(ARG_QUERY); + mAdapter.setSearchQuery(query); - public String getCreationDate() { - if (mHasDuplicate) { - Calendar creationCal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); - creationCal.setTime(mCreation); - // convert from UTC to time zone of device - creationCal.setTimeZone(TimeZone.getDefault()); - - return getContext().getString(R.string.label_creation) + ": " - + DateFormat.getDateFormat(getContext()).format(creationCal.getTime()); - } else { - return null; - } - } + where += " AND " + KeyRings.USER_ID + " LIKE ?"; - public String getKeyIdHex() { - return KeyFormattingUtils.beautifyKeyIdWithPrefix(getContext(), mKeyId); + return new CursorLoader(getContext(), baseUri, KeyAdapter.PROJECTION, where, + new String[] { "%" + query + "%" }, null); } - public String getKeyIdHexShort() { - return KeyFormattingUtils.convertKeyIdToHexShort(mKeyId); - } + mAdapter.setSearchQuery(null); + return new CursorLoader(getContext(), baseUri, KeyAdapter.PROJECTION, where, null, null); - @Override - public String toString() { - return Long.toString(mKeyId); - } } - private class EncryptKeyAdapter extends FilteredArrayAdapter { + @Override + public void onLoadFinished(Loader loader, Cursor data) { + mAdapter.swapCursor(data); + } - public EncryptKeyAdapter(List objs) { - super(EncryptKeyCompletionView.this.getContext(), 0, 0, objs); - } + @Override + public void onLoaderReset(Loader loader) { + mAdapter.swapCursor(null); + } - @Override - public View getView(int position, View convertView, ViewGroup parent) { - LayoutInflater l = (LayoutInflater) getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE); - View view; - if (convertView != null) { - view = convertView; - } else { - view = l.inflate(R.layout.recipient_selection_list_entry, null); - } - ((TextView) view.findViewById(android.R.id.title)).setText(getItem(position).getPrimary()); - ((TextView) view.findViewById(android.R.id.text1)).setText(getItem(position).getSecondary()); - ((TextView) view.findViewById(android.R.id.text2)).setText(getItem(position).getTertiary()); - setImageByKey((ImageView) view.findViewById(android.R.id.icon), getItem(position)); - return view; + @Override + public void onFocusChanged(boolean hasFocus, int direction, Rect previous) { + super.onFocusChanged(hasFocus, direction, previous); + if (hasFocus) { + ((InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE)) + .showSoftInput(this, InputMethodManager.SHOW_IMPLICIT); } + } - @Override - protected boolean keepObject(EncryptionKey obj, String mask) { - String m = mask.toLowerCase(Locale.ENGLISH); - return obj.getUserId().toLowerCase(Locale.ENGLISH).contains(m) || - obj.getKeyIdHex().contains(m) || - obj.getKeyIdHexShort().startsWith(m); - } + @Override + protected void performFiltering(CharSequence text, int start, int end, int keyCode) { + super.performFiltering(text, start, end, keyCode); + if (start < mPrefix.length()) { + start = mPrefix.length(); + } + Bundle args = new Bundle(); + args.putString(ARG_QUERY, text.subSequence(start, end).toString()); + mLoaderManager.restartLoader(hashCode(), args, this); } + } -- cgit v1.2.3 From ead7597afc95706b04430e9b4171acdfa3ca4fef Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Fri, 24 Apr 2015 15:44:53 +0200 Subject: don't show key spinner for a single entry --- .../sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java index 714933b58..e5b3df8c9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java @@ -36,6 +36,7 @@ import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; public class CertifyKeySpinner extends KeySpinner { private long mHiddenMasterKeyId = Constants.key.none; + private boolean mIsSingle; public CertifyKeySpinner(Context context) { super(context); @@ -99,6 +100,7 @@ public class CertifyKeySpinner extends KeySpinner { // - there are actually keys (not just "none" entry) // Then: // - select key that is capable of certifying, but only if there is only one key capable of it + mIsSingle = false; if (mSelectedKeyId == Constants.key.none && mAdapter.getCount() > 1) { // preselect if key can certify int selection = -1; @@ -106,9 +108,11 @@ public class CertifyKeySpinner extends KeySpinner { if (!data.isNull(mIndexHasCertify)) { if (selection == -1) { selection = data.getPosition() + 1; + mIsSingle = true; } else { // if selection is already set, we have more than one certify key! // get back to "none"! + mIsSingle = false; selection = 0; } } @@ -118,6 +122,9 @@ public class CertifyKeySpinner extends KeySpinner { } } + public boolean isSingleEntry() { + return mIsSingle && getSelectedItemPosition() != 0; + } @Override boolean setStatus(Context context, Cursor cursor, ImageView statusView) { -- cgit v1.2.3 From 6de403c21a1cf8d2ec4e62debd8eec620c63328e Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Fri, 24 Apr 2015 19:16:15 +0200 Subject: fix encrypt activity layout --- .../keychain/ui/widget/EncryptKeyCompletionView.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java index b2dfb2493..3d2e8b9df 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java @@ -108,9 +108,8 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView protected void onAttachedToWindow() { super.onAttachedToWindow(); - mLoaderManager = ((FragmentActivity) getContext()).getSupportLoaderManager(); - if (getContext() instanceof FragmentActivity) { + mLoaderManager = ((FragmentActivity) getContext()).getSupportLoaderManager(); mLoaderManager.initLoader(hashCode(), null, this); } else { Log.e(Constants.TAG, "EncryptKeyCompletionView must be attached to a FragmentActivity, this is " + getContext().getClass()); -- cgit v1.2.3 From 608b66d192fcab62ab44d28c34171f9ca1aff38b Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 25 Apr 2015 03:39:40 +0200 Subject: change HttpsEditText to generic PrefixEditText --- .../keychain/ui/widget/HttpsPrefixedText.java | 38 ------------------ .../keychain/ui/widget/PrefixedEditText.java | 45 ++++++++++++++++++++++ 2 files changed, 45 insertions(+), 38 deletions(-) delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/HttpsPrefixedText.java create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PrefixedEditText.java (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/HttpsPrefixedText.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/HttpsPrefixedText.java deleted file mode 100644 index 292343eb7..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/HttpsPrefixedText.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.sufficientlysecure.keychain.ui.widget; - -import android.content.Context; -import android.graphics.*; -import android.support.annotation.NonNull; -import android.util.AttributeSet; -import android.widget.EditText; - -/** */ -public class HttpsPrefixedText extends EditText { - - private String mPrefix; // can be hardcoded for demo purposes - private Rect mPrefixRect = new Rect(); - - public HttpsPrefixedText(Context context, AttributeSet attrs) { - super(context, attrs); - mPrefix = "https://"; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - getPaint().getTextBounds(mPrefix, 0, mPrefix.length(), mPrefixRect); - - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } - - @Override - protected void onDraw(@NonNull Canvas canvas) { - super.onDraw(canvas); - canvas.drawText(mPrefix, super.getCompoundPaddingLeft(), getBaseline(), getPaint()); - } - - @Override - public int getCompoundPaddingLeft() { - return super.getCompoundPaddingLeft() + mPrefixRect.width(); - } - -} \ No newline at end of file diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PrefixedEditText.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PrefixedEditText.java new file mode 100644 index 000000000..3cbb114e8 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PrefixedEditText.java @@ -0,0 +1,45 @@ +package org.sufficientlysecure.keychain.ui.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.*; +import android.support.annotation.NonNull; +import android.util.AttributeSet; +import android.widget.EditText; + +import org.sufficientlysecure.keychain.R; + +public class PrefixedEditText extends EditText { + + private String mPrefix; + private Rect mPrefixRect = new Rect(); + + public PrefixedEditText(Context context, AttributeSet attrs) { + super(context, attrs); + TypedArray style = context.getTheme().obtainStyledAttributes( + attrs, R.styleable.PrefixedEditText, 0, 0); + mPrefix = style.getString(R.styleable.PrefixedEditText_prefix); + if (mPrefix == null) { + mPrefix = ""; + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + getPaint().getTextBounds(mPrefix, 0, mPrefix.length(), mPrefixRect); + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + @Override + protected void onDraw(@NonNull Canvas canvas) { + super.onDraw(canvas); + canvas.drawText(mPrefix, super.getCompoundPaddingLeft(), getBaseline(), getPaint()); + } + + @Override + public int getCompoundPaddingLeft() { + return super.getCompoundPaddingLeft() + mPrefixRect.width(); + } + +} \ No newline at end of file -- cgit v1.2.3 From dd1243c31289973e238d36ca35b10539eb909239 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Mon, 27 Apr 2015 19:48:58 +0200 Subject: prevent crashes in EncryptKeyCompletionView --- .../keychain/ui/widget/EncryptKeyCompletionView.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java index 3d2e8b9df..4e691d962 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java @@ -110,7 +110,7 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView if (getContext() instanceof FragmentActivity) { mLoaderManager = ((FragmentActivity) getContext()).getSupportLoaderManager(); - mLoaderManager.initLoader(hashCode(), null, this); + mLoaderManager.initLoader(0, null, this); } else { Log.e(Constants.TAG, "EncryptKeyCompletionView must be attached to a FragmentActivity, this is " + getContext().getClass()); } @@ -154,6 +154,14 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView mAdapter.swapCursor(null); } + @Override + public void showDropDown() { + if (mAdapter.getCursor().isClosed()) { + return; + } + super.showDropDown(); + } + @Override public void onFocusChanged(boolean hasFocus, int direction, Rect previous) { super.onFocusChanged(hasFocus, direction, previous); @@ -171,7 +179,7 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView } Bundle args = new Bundle(); args.putString(ARG_QUERY, text.subSequence(start, end).toString()); - mLoaderManager.restartLoader(hashCode(), args, this); + mLoaderManager.restartLoader(0, args, this); } } -- cgit v1.2.3 From 1fd35cc23b4882e41488263f2eefd9e9d8b8335f Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Tue, 28 Apr 2015 18:21:51 +0200 Subject: fix crash when moving focus from EncryptKeyCompletionView with unknown text --- .../sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java index 4e691d962..525bc26ca 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java @@ -101,7 +101,7 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView /*if (completionText.startsWith("0x")) { }*/ - return null; + return ""; } @Override -- cgit v1.2.3 From 9668abfe9edf09f36dc361b008106708f5c1dd9c Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Tue, 1 Sep 2015 06:40:28 +0200 Subject: add simple StatusIndicator widget --- .../keychain/ui/widget/StatusIndicator.java | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java new file mode 100644 index 000000000..f5b1cf3b6 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java @@ -0,0 +1,25 @@ +package org.sufficientlysecure.keychain.ui.widget; + + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; + +import org.sufficientlysecure.keychain.R; + + +public class StatusIndicator extends ToolableViewAnimator { + + public StatusIndicator(Context context) { + super(context); + + LayoutInflater.from(context).inflate(R.layout.status_indicator, this, true); + } + + public StatusIndicator(Context context, AttributeSet attrs) { + super(context, attrs); + + LayoutInflater.from(context).inflate(R.layout.status_indicator, this, true); + } + +} -- cgit v1.2.3 From 3e55fca0e5dcad792d821c3a20fc4c404083a124 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Tue, 1 Sep 2015 07:09:53 +0200 Subject: linked: work on github design --- .../org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java index f5b1cf3b6..bef40d57c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java @@ -4,6 +4,7 @@ package org.sufficientlysecure.keychain.ui.widget; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; +import android.view.animation.AnimationUtils; import org.sufficientlysecure.keychain.R; @@ -14,12 +15,16 @@ public class StatusIndicator extends ToolableViewAnimator { super(context); LayoutInflater.from(context).inflate(R.layout.status_indicator, this, true); + setInAnimation(AnimationUtils.loadAnimation(context, R.anim.fade_in)); + setOutAnimation(AnimationUtils.loadAnimation(context, R.anim.fade_out)); } public StatusIndicator(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.status_indicator, this, true); + setInAnimation(AnimationUtils.loadAnimation(context, R.anim.fade_in)); + setOutAnimation(AnimationUtils.loadAnimation(context, R.anim.fade_out)); } } -- cgit v1.2.3 From 676b39354212eed3dcb40399c670bd721e5c753c Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Tue, 1 Sep 2015 13:59:17 +0200 Subject: statusindicator: don't redisplay child with animation if already shown --- .../org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java index bef40d57c..11fdb5df4 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java @@ -27,4 +27,10 @@ public class StatusIndicator extends ToolableViewAnimator { setOutAnimation(AnimationUtils.loadAnimation(context, R.anim.fade_out)); } + @Override + public void setDisplayedChild(int whichChild) { + if (whichChild != getDisplayedChild()) { + super.setDisplayedChild(whichChild); + } + } } -- cgit v1.2.3 From 31cfbdc5d25f79ecda7c9c9290b8d80a4df5d89a Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sun, 6 Sep 2015 00:58:10 +0200 Subject: linked: fix "navigate up" in LinkedIdWizard (imperfect) --- .../java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java index e3ec3d34b..04ed35deb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java @@ -119,8 +119,7 @@ public abstract class KeySpinner extends AppCompatSpinner implements if (getContext() instanceof FragmentActivity) { ((FragmentActivity) getContext()).getSupportLoaderManager().restartLoader(LOADER_ID, null, this); } else { - throw new AssertionError("KeySpinner must be attached to FragmentActivity, this is " - + getContext().getClass()); + // ignore, this happens during preview! we use fragmentactivities everywhere either way } } -- cgit v1.2.3 From 0db1495ea19569b3d783d7ee7cbfa18f50fe9e23 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Tue, 8 Sep 2015 15:51:27 +0200 Subject: statusindicator: method to set states by name --- .../sufficientlysecure/keychain/ui/widget/StatusIndicator.java | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java index 11fdb5df4..2784ac5f0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/StatusIndicator.java @@ -11,6 +11,10 @@ import org.sufficientlysecure.keychain.R; public class StatusIndicator extends ToolableViewAnimator { + public enum Status { + IDLE, PROGRESS, OK, ERROR + } + public StatusIndicator(Context context) { super(context); @@ -33,4 +37,9 @@ public class StatusIndicator extends ToolableViewAnimator { super.setDisplayedChild(whichChild); } } + + public void setDisplayedChild(Status status) { + setDisplayedChild(status.ordinal()); + } + } -- cgit v1.2.3