diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ApiPendingIntentFactory.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ApiPendingIntentFactory.java index 9dfb8f1ff..085299aaf 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ApiPendingIntentFactory.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ApiPendingIntentFactory.java @@ -156,7 +156,7 @@ public class ApiPendingIntentFactory { return createInternal(data, intent); } - PendingIntent createSelectAuthenticationKeyIdPendingIntent(Intent data, String packageName) { + public PendingIntent createSelectAuthenticationKeyIdPendingIntent(Intent data, String packageName) { Intent intent = new Intent(mContext, RemoteSelectAuthenticationKeyActivity.class); intent.putExtra(RemoteSelectAuthenticationKeyActivity.EXTRA_PACKAGE_NAME, packageName); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java index 7abead888..e85806428 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java @@ -89,7 +89,7 @@ public class AppSettingsAllowedKeysListFragment extends RecyclerFragment data) { if (keyChoiceAdapter == null) { - keyChoiceAdapter = KeyChoiceAdapter.createMultiChoiceAdapter(data, null); + keyChoiceAdapter = KeyChoiceAdapter.createMultiChoiceAdapter(requireContext(), data, null); setAdapter(keyChoiceAdapter); Set checkedIds = apiAppDao.getAllowedKeyIdsForApp(packageName); keyChoiceAdapter.setSelectionByIds(checkedIds); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectPublicKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectPublicKeyFragment.java index 8603a1b62..f696f78e3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectPublicKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectPublicKeyFragment.java @@ -123,7 +123,7 @@ public class SelectPublicKeyFragment extends RecyclerFragment public void onLoadUnifiedKeyData(List data) { if (keyChoiceAdapter == null) { - keyChoiceAdapter = KeyChoiceAdapter.createMultiChoiceAdapter(data, (keyInfo -> { + keyChoiceAdapter = KeyChoiceAdapter.createMultiChoiceAdapter(requireContext(), data, (keyInfo -> { if (keyInfo.is_revoked()) { return R.string.keychoice_revoked; } else if (keyInfo.is_expired()) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdListFragment.java index c7a52d2f8..557f606df 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdListFragment.java @@ -116,7 +116,7 @@ public class SelectSignKeyIdListFragment extends RecyclerFragment data) { if (keyChoiceAdapter == null) { - keyChoiceAdapter = KeyChoiceAdapter.createSingleClickableAdapter(data, this::onSelectKeyItemClicked, (keyInfo -> { + keyChoiceAdapter = KeyChoiceAdapter.createSingleClickableAdapter(requireContext(), data, this::onSelectKeyItemClicked, (keyInfo -> { if (keyInfo.is_revoked()) { return R.string.keychoice_revoked; } else if (keyInfo.is_expired()) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/DialogKeyChoiceAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/DialogKeyChoiceAdapter.java new file mode 100644 index 000000000..7e3b0864f --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/DialogKeyChoiceAdapter.java @@ -0,0 +1,109 @@ +package org.sufficientlysecure.keychain.remote.ui.dialog; + + +import java.util.List; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.RecyclerView.Adapter; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; +import org.sufficientlysecure.keychain.remote.ui.dialog.DialogKeyChoiceAdapter.KeyChoiceViewHolder; +import org.sufficientlysecure.keychain.ui.util.KeyInfoFormatter; + + +class DialogKeyChoiceAdapter extends Adapter { + private final LayoutInflater layoutInflater; + private List data; + private Drawable iconUnselected; + private Drawable iconSelected; + private Integer activeItem; + private KeyInfoFormatter keyInfoFormatter; + + DialogKeyChoiceAdapter(Context context, LayoutInflater layoutInflater) { + this.layoutInflater = layoutInflater; + this.keyInfoFormatter = new KeyInfoFormatter(context); + } + + @NonNull + @Override + public KeyChoiceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View keyChoiceItemView = layoutInflater.inflate(R.layout.api_select_identity_item, parent, false); + return new KeyChoiceViewHolder(keyChoiceItemView); + } + + void setActiveItem(Integer activeItem) { + this.activeItem = activeItem; + notifyDataSetChanged(); + } + + @Override + public void onBindViewHolder(@NonNull KeyChoiceViewHolder holder, int position) { + UnifiedKeyInfo keyInfo = data.get(position); + boolean hasActiveItem = activeItem != null; + boolean isActiveItem = hasActiveItem && position == activeItem; + + Drawable icon = isActiveItem ? iconSelected : iconUnselected; + holder.bind(keyInfo, icon); + + holder.itemView.setVisibility(!hasActiveItem || isActiveItem ? View.VISIBLE : View.INVISIBLE); + } + + @Override + public int getItemCount() { + return data != null ? data.size() : 0; + } + + public void setData(List data) { + this.data = data; + notifyDataSetChanged(); + } + + void setSelectionDrawables(Drawable iconSelected, Drawable iconUnselected) { + this.iconSelected = iconSelected; + this.iconUnselected = iconUnselected; + + notifyDataSetChanged(); + } + + class KeyChoiceViewHolder extends RecyclerView.ViewHolder { + private final TextView vName; + private final TextView vCreation = (TextView) itemView.findViewById(R.id.key_list_item_creation); + private final ImageView vIcon; + + KeyChoiceViewHolder(View itemView) { + super(itemView); + + vName = itemView.findViewById(R.id.key_list_item_name); + vIcon = itemView.findViewById(R.id.key_list_item_icon); + } + + void bind(UnifiedKeyInfo keyInfo, Drawable selectionIcon) { + Context context = vCreation.getContext(); + + keyInfoFormatter.setKeyInfo(keyInfo); + + String email = keyInfo.email(); + String name = keyInfo.name(); + if (email != null) { + vName.setText(context.getString(R.string.use_key, email)); + } else if (name != null) { + vName.setText(context.getString(R.string.use_key, name)); + } else { + vName.setText(context.getString(R.string.use_key_no_name)); + } + + keyInfoFormatter.formatCreationDate(vCreation); + + vIcon.setImageDrawable(selectionIcon); + } + } +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteDeduplicatePresenter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteDeduplicatePresenter.java index 5b9de599c..6464b4add 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteDeduplicatePresenter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteDeduplicatePresenter.java @@ -63,7 +63,7 @@ class RemoteDeduplicatePresenter { private void onLoadKeyInfos(List data) { if (keyChoiceAdapter == null) { - keyChoiceAdapter = KeyChoiceAdapter.createSingleChoiceAdapter(data, (keyInfo -> { + keyChoiceAdapter = KeyChoiceAdapter.createSingleChoiceAdapter(context, data, (keyInfo -> { if (keyInfo.is_revoked()) { return R.string.keychoice_revoked; } else if (keyInfo.is_expired()) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectAuthenticationKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectAuthenticationKeyActivity.java index 9614297d7..931ddb44a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectAuthenticationKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectAuthenticationKeyActivity.java @@ -40,27 +40,22 @@ import android.support.v4.content.res.ResourcesCompat; import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.Adapter; -import android.text.format.DateUtils; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; -import android.widget.TextView; import com.mikepenz.materialdrawer.util.KeyboardUtil; import org.openintents.ssh.authentication.SshAuthenticationApi; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.livedata.GenericLiveData; -import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; import org.sufficientlysecure.keychain.daos.ApiAppDao; import org.sufficientlysecure.keychain.daos.KeyRepository; +import org.sufficientlysecure.keychain.livedata.GenericLiveData; +import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; import org.sufficientlysecure.keychain.remote.ui.RemoteSecurityTokenOperationActivity; import org.sufficientlysecure.keychain.remote.ui.dialog.RemoteSelectAuthenticationKeyPresenter.RemoteSelectAuthenticationKeyView; import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder; -import org.sufficientlysecure.keychain.ui.util.KeyInfoFormatter; import org.sufficientlysecure.keychain.ui.util.ThemeChanger; import org.sufficientlysecure.keychain.ui.util.recyclerview.DividerItemDecoration; import org.sufficientlysecure.keychain.ui.util.recyclerview.RecyclerItemClickListener; @@ -203,7 +198,7 @@ public class RemoteSelectAuthenticationKeyActivity extends FragmentActivity { @NonNull private RemoteSelectAuthenticationKeyView createMvpView(View view, LayoutInflater layoutInflater) { final ImageView iconClientApp = view.findViewById(R.id.icon_client_app); - final KeyChoiceAdapter keyChoiceAdapter = new KeyChoiceAdapter(layoutInflater, getResources()); + final DialogKeyChoiceAdapter keyChoiceAdapter = new DialogKeyChoiceAdapter(requireContext(), layoutInflater); keyChoiceList.setAdapter(keyChoiceAdapter); return new RemoteSelectAuthenticationKeyView() { @@ -231,7 +226,14 @@ public class RemoteSelectAuthenticationKeyActivity extends FragmentActivity { @Override public void setTitleClientIcon(Drawable drawable) { iconClientApp.setImageDrawable(drawable); - keyChoiceAdapter.setSelectionDrawable(drawable); + + Resources resources = getResources(); + ConstantState constantState = drawable.getConstantState(); + Drawable iconSelected = constantState.newDrawable(resources); + Drawable iconUnselected = constantState.newDrawable(resources); + DrawableCompat.setTint(iconUnselected.mutate(), ResourcesCompat.getColor(resources, R.color.md_grey_300, null)); + + keyChoiceAdapter.setSelectionDrawables(iconSelected, iconUnselected); } @Override @@ -258,92 +260,4 @@ public class RemoteSelectAuthenticationKeyActivity extends FragmentActivity { (view, position) -> presenter.onKeyItemClick(position))); } } - - private static class KeyChoiceAdapter extends Adapter { - private final LayoutInflater layoutInflater; - private final Resources resources; - private List data; - private Drawable iconUnselected; - private Drawable iconSelected; - private Integer activeItem; - - KeyChoiceAdapter(LayoutInflater layoutInflater, Resources resources) { - this.layoutInflater = layoutInflater; - this.resources = resources; - } - - @NonNull - @Override - public KeyChoiceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View keyChoiceItemView = layoutInflater.inflate(R.layout.authentication_key_item, parent, false); - return new KeyChoiceViewHolder(keyChoiceItemView); - } - - @Override - public void onBindViewHolder(@NonNull KeyChoiceViewHolder holder, int position) { - UnifiedKeyInfo keyInfo = data.get(position); - Drawable icon = (activeItem != null && position == activeItem) ? iconSelected : iconUnselected; - holder.bind(keyInfo, icon); - } - - @Override - public int getItemCount() { - return data != null ? data.size() : 0; - } - - public void setData(List data) { - this.data = data; - notifyDataSetChanged(); - } - - void setSelectionDrawable(Drawable drawable) { - ConstantState constantState = drawable.getConstantState(); - if (constantState == null) { - return; - } - - iconSelected = constantState.newDrawable(resources); - - iconUnselected = constantState.newDrawable(resources); - DrawableCompat.setTint(iconUnselected.mutate(), ResourcesCompat.getColor(resources, R.color.md_grey_300, null)); - - notifyDataSetChanged(); - } - - void setActiveItem(Integer newActiveItem) { - Integer prevActiveItem = this.activeItem; - this.activeItem = newActiveItem; - - if (prevActiveItem != null) { - notifyItemChanged(prevActiveItem); - } - if (newActiveItem != null) { - notifyItemChanged(newActiveItem); - } - } - } - - private static class KeyChoiceViewHolder extends RecyclerView.ViewHolder { - private final TextView vName; - private final TextView vCreation; - private final ImageView vIcon; - - KeyChoiceViewHolder(View itemView) { - super(itemView); - - vName = itemView.findViewById(R.id.key_list_item_name); - vCreation = itemView.findViewById(R.id.key_list_item_creation); - vIcon = itemView.findViewById(R.id.key_list_item_icon); - } - - void bind(UnifiedKeyInfo keyInfo, Drawable selectionIcon) { - vName.setText(keyInfo.name()); - - KeyInfoFormatter keyInfoFormatter = new KeyInfoFormatter(itemView.getContext(), keyInfo, null); - keyInfoFormatter.formatCreationDate(vCreation); - - vIcon.setImageDrawable(selectionIcon); - } - } - } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectIdKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectIdKeyActivity.java index ce5eb16c0..3370ebfb6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectIdKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/dialog/RemoteSelectIdKeyActivity.java @@ -45,8 +45,6 @@ import android.support.v4.content.res.ResourcesCompat; import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.Adapter; -import android.text.format.DateUtils; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; @@ -60,18 +58,17 @@ import android.widget.Toast; import com.mikepenz.materialdrawer.util.KeyboardUtil; import org.openintents.openpgp.util.OpenPgpApi; import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.daos.KeyRepository; import org.sufficientlysecure.keychain.livedata.GenericLiveData; import org.sufficientlysecure.keychain.livedata.PgpKeyGenerationLiveData; import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; -import org.sufficientlysecure.keychain.daos.KeyRepository; import org.sufficientlysecure.keychain.remote.ui.dialog.RemoteSelectIdentityKeyPresenter.RemoteSelectIdentityKeyView; import org.sufficientlysecure.keychain.service.ImportKeyringParcel; import org.sufficientlysecure.keychain.ui.MainActivity; import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper; import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper.AbstractCallback; import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder; -import org.sufficientlysecure.keychain.ui.util.KeyInfoFormatter; import org.sufficientlysecure.keychain.ui.util.ThemeChanger; import org.sufficientlysecure.keychain.ui.util.recyclerview.DividerItemDecoration; import org.sufficientlysecure.keychain.ui.util.recyclerview.RecyclerItemClickListener; @@ -246,7 +243,7 @@ public class RemoteSelectIdKeyActivity extends FragmentActivity { @NonNull private RemoteSelectIdentityKeyView createMvpView(final ViewGroup rootView, LayoutInflater layoutInflater) { // final ImageView iconClientApp = rootView.findViewById(R.id.icon_client_app); - final KeyChoiceAdapter keyChoiceAdapter = new KeyChoiceAdapter(layoutInflater); + final DialogKeyChoiceAdapter keyChoiceAdapter = new DialogKeyChoiceAdapter(requireContext(), layoutInflater); final TextView titleText = rootView.findViewById(R.id.text_title_select_key); final TextView addressText = rootView.findViewById(R.id.text_user_id); final TextView autocryptHint = rootView.findViewById(R.id.key_import_autocrypt_hint); @@ -446,91 +443,6 @@ public class RemoteSelectIdKeyActivity extends FragmentActivity { importOpHelper.cryptoOperation(); } - private static class KeyChoiceAdapter extends Adapter { - private final LayoutInflater layoutInflater; - private List data; - private Drawable iconUnselected; - private Drawable iconSelected; - private Integer activeItem; - - KeyChoiceAdapter(LayoutInflater layoutInflater) { - this.layoutInflater = layoutInflater; - } - - @NonNull - @Override - public KeyChoiceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View keyChoiceItemView = layoutInflater.inflate(R.layout.api_select_identity_item, parent, false); - return new KeyChoiceViewHolder(keyChoiceItemView); - } - - void setActiveItem(Integer activeItem) { - this.activeItem = activeItem; - notifyDataSetChanged(); - } - - @Override - public void onBindViewHolder(@NonNull KeyChoiceViewHolder holder, int position) { - UnifiedKeyInfo keyInfo = data.get(position); - boolean hasActiveItem = activeItem != null; - boolean isActiveItem = hasActiveItem && position == activeItem; - - Drawable icon = isActiveItem ? iconSelected : iconUnselected; - holder.bind(keyInfo, icon); - - holder.itemView.setVisibility(!hasActiveItem || isActiveItem ? View.VISIBLE : View.INVISIBLE); - } - - @Override - public int getItemCount() { - return data != null ? data.size() : 0; - } - - public void setData(List data) { - this.data = data; - notifyDataSetChanged(); - } - - void setSelectionDrawables(Drawable iconSelected, Drawable iconUnselected) { - this.iconSelected = iconSelected; - this.iconUnselected = iconUnselected; - - notifyDataSetChanged(); - } - } - - private static class KeyChoiceViewHolder extends RecyclerView.ViewHolder { - private final TextView vName; - private final TextView vCreation = (TextView) itemView.findViewById(R.id.key_list_item_creation); - private final ImageView vIcon; - - KeyChoiceViewHolder(View itemView) { - super(itemView); - - vName = itemView.findViewById(R.id.key_list_item_name); - vIcon = itemView.findViewById(R.id.key_list_item_icon); - } - - void bind(UnifiedKeyInfo keyInfo, Drawable selectionIcon) { - Context context = vCreation.getContext(); - - String email = keyInfo.email(); - String name = keyInfo.name(); - if (email != null) { - vName.setText(context.getString(R.string.use_key, email)); - } else if (name != null) { - vName.setText(context.getString(R.string.use_key, name)); - } else { - vName.setText(context.getString(R.string.use_key_no_name)); - } - - KeyInfoFormatter keyInfoFormatter = new KeyInfoFormatter(itemView.getContext(), keyInfo, null); - keyInfoFormatter.formatCreationDate(vCreation); - - vIcon.setImageDrawable(selectionIcon); - } - } - @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (importOpHelper.handleActivityResult(requestCode, resultCode, data)) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DebugActionsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DebugActionsActivity.java index 7be6d945a..1e15a1e84 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DebugActionsActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DebugActionsActivity.java @@ -110,6 +110,11 @@ public class DebugActionsActivity extends Activity { new Intent(), BuildConfig.APPLICATION_ID, getPackageSig(), "test@openkeychain.org", false); startPendingIntent(pendingIntent); }); + addButtonToLayout(context, verticalLayout, "Select Authentication Key").setOnClickListener((v) -> { + PendingIntent pendingIntent = pendingIntentFactory.createSelectAuthenticationKeyIdPendingIntent( + new Intent(), BuildConfig.APPLICATION_ID); + startPendingIntent(pendingIntent); + }); addButtonToLayout(context, verticalLayout, "Select Signing Key (Autocrypt)").setOnClickListener((v) -> { PendingIntent pendingIntent = pendingIntentFactory.createSelectSignKeyIdPendingIntent( new Intent(), BuildConfig.APPLICATION_ID, getPackageSig(), "test@openkeychain.org", true); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java index 68da58389..72b97b352 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java @@ -75,6 +75,7 @@ import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper; import org.sufficientlysecure.keychain.ui.base.RecyclerFragment; import org.sufficientlysecure.keychain.ui.keyview.GenericViewModel; import org.sufficientlysecure.keychain.ui.keyview.ViewKeyActivity; +import org.sufficientlysecure.keychain.ui.util.KeyInfoFormatter; import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.ui.util.Notify.Style; import org.sufficientlysecure.keychain.util.FabContainer; @@ -141,6 +142,7 @@ public class KeyListFragment extends RecyclerFragment { @@ -34,41 +34,40 @@ public class KeyChoiceAdapter extends FlexibleAdapter { private final KeyDisabledPredicate keyDisabledPredicate; @Nullable private Integer activeItem; + private KeyInfoFormatter keyInfoFormatter; - public static KeyChoiceAdapter createSingleClickableAdapter(List items, - OnKeyClickListener onKeyClickListener) { - return new KeyChoiceAdapter(items, Objects.requireNonNull(onKeyClickListener), Mode.IDLE, null); + public static KeyChoiceAdapter createSingleClickableAdapter(Context context, List items, + OnKeyClickListener onKeyClickListener, + KeyDisabledPredicate keyDisabledPredicate) { + return new KeyChoiceAdapter(context, items, Objects.requireNonNull(onKeyClickListener), Mode.IDLE, + keyDisabledPredicate + ); } - public static KeyChoiceAdapter createSingleClickableAdapter(List items, - OnKeyClickListener onKeyClickListener, - KeyDisabledPredicate keyDisabledPredicate) { - return new KeyChoiceAdapter(items, Objects.requireNonNull(onKeyClickListener), Mode.IDLE, keyDisabledPredicate); + public static KeyChoiceAdapter createSingleChoiceAdapter(Context context, List items, + KeyDisabledPredicate keyDisabledPredicate) { + return new KeyChoiceAdapter(context, items, null, Mode.SINGLE, keyDisabledPredicate); } - public static KeyChoiceAdapter createSingleChoiceAdapter(List items) { - return new KeyChoiceAdapter(items, null, Mode.SINGLE, null); + public static KeyChoiceAdapter createMultiChoiceAdapter(Context context, List items, + KeyDisabledPredicate keyDisabledPredicate) { + return new KeyChoiceAdapter(context, items, null, Mode.MULTI, keyDisabledPredicate); } - public static KeyChoiceAdapter createSingleChoiceAdapter(List items, KeyDisabledPredicate keyDisabledPredicate) { - return new KeyChoiceAdapter(items, null, Mode.SINGLE, keyDisabledPredicate); - } - - public static KeyChoiceAdapter createMultiChoiceAdapter(List items, KeyDisabledPredicate keyDisabledPredicate) { - return new KeyChoiceAdapter(items, null, Mode.MULTI, keyDisabledPredicate); - } - - private KeyChoiceAdapter(List items, @Nullable OnKeyClickListener onKeyClickListener, int idle, + private KeyChoiceAdapter(Context context, List items, + @Nullable OnKeyClickListener onKeyClickListener, int idle, @Nullable KeyDisabledPredicate keyDisabledPredicate) { - super(getKeyChoiceItems(items, keyDisabledPredicate)); + super(null, null, true); setMode(idle); addListener((OnItemClickListener) (view, position) -> onClickItem(position)); + updateDataSet(getKeyChoiceItems(items, keyDisabledPredicate), false); + this.keyInfoFormatter = new KeyInfoFormatter(context); this.onKeyClickListener = onKeyClickListener; this.keyDisabledPredicate = keyDisabledPredicate; } @Nullable - private static ArrayList getKeyChoiceItems(@Nullable List items, + private ArrayList getKeyChoiceItems(@Nullable List items, @Nullable KeyDisabledPredicate keyDisabledPredicate) { if (items == null) { return null; @@ -174,7 +173,7 @@ public class KeyChoiceAdapter extends FlexibleAdapter { return result; } - public static class KeyChoiceItem extends AbstractFlexibleItem { + public class KeyChoiceItem extends AbstractFlexibleItem { private UnifiedKeyInfo keyInfo; @StringRes private Integer disabledStringRes; @@ -220,7 +219,7 @@ public class KeyChoiceAdapter extends FlexibleAdapter { } } - public static class KeyChoiceViewHolder extends FlexibleViewHolder { + public class KeyChoiceViewHolder extends FlexibleViewHolder { private final TextView vName; private final TextView vCreation; private final CheckBox vCheckbox; @@ -236,9 +235,10 @@ public class KeyChoiceAdapter extends FlexibleAdapter { } void bind(UnifiedKeyInfo keyInfo, int choiceMode, boolean isActive, boolean isEnabled) { + keyInfoFormatter.setKeyInfo(keyInfo); + vName.setText(keyInfo.user_id()); - KeyInfoFormatter keyInfoFormatter = new KeyInfoFormatter(itemView.getContext(), keyInfo, null); keyInfoFormatter.formatCreationDate(vCreation); switch (choiceMode) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/bindings/ImportKeysBindingsUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/bindings/ImportKeysBindingsUtils.java index 3f6aea805..c88d31aac 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/bindings/ImportKeysBindingsUtils.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/bindings/ImportKeysBindingsUtils.java @@ -31,7 +31,8 @@ public class ImportKeysBindingsUtils { public static Highlighter getHighlighter(Context context, String query) { Highlighter highlighter = highlighterCache.get(query); if (highlighter == null) { - highlighter = new Highlighter(context, query); + highlighter = new Highlighter(context); + highlighter.setQuery(query); highlighterCache.put(query, highlighter); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/chips/EncryptRecipientDropdownAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/chips/EncryptRecipientDropdownAdapter.java index 069019c80..3ca48d72b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/chips/EncryptRecipientDropdownAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/chips/EncryptRecipientDropdownAdapter.java @@ -21,11 +21,13 @@ import org.sufficientlysecure.keychain.ui.util.KeyInfoFormatter; public class EncryptRecipientDropdownAdapter extends ChipsInput.ChipDropdownAdapter { private final LayoutInflater layoutInflater; + private final KeyInfoFormatter keyInfoFormatter; EncryptRecipientDropdownAdapter(Context context, List keyInfoChips) { super(keyInfoChips); layoutInflater = LayoutInflater.from(context); + keyInfoFormatter = new KeyInfoFormatter(context); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -42,6 +44,14 @@ public class EncryptRecipientDropdownAdapter extends ChipsInput.ChipDropdownAdap vStatusIcon = itemView.findViewById(R.id.key_list_item_status_icon); vCreationDate = itemView.findViewById(R.id.key_list_item_creation); } + + public void bind(EncryptRecipientChip chip) { + keyInfoFormatter.setKeyInfo(chip.keyInfo); + + keyInfoFormatter.formatUserId(vMainUserId, vMainUserIdRest); + keyInfoFormatter.formatCreationDate(vCreationDate); + keyInfoFormatter.formatStatusIcon(vStatusIcon); + } } @NonNull @@ -54,10 +64,6 @@ public class EncryptRecipientDropdownAdapter extends ChipsInput.ChipDropdownAdap @Override public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { EncryptRecipientChip chip = getItem(position); - - KeyInfoFormatter keyInfoFormatter = new KeyInfoFormatter(layoutInflater.getContext(), chip.keyInfo, null); - keyInfoFormatter.formatUserId(holder.vMainUserId, holder.vMainUserIdRest); - keyInfoFormatter.formatCreationDate(holder.vCreationDate); - keyInfoFormatter.formatStatusIcon(holder.vStatusIcon); + holder.bind(chip); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Highlighter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Highlighter.java index e1488e09d..39ea04187 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Highlighter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Highlighter.java @@ -30,9 +30,12 @@ public class Highlighter { private Context mContext; private String mQuery; - public Highlighter(Context context, String query) { + public Highlighter(Context context) { mContext = context; - mQuery = query; + } + + public void setQuery(String mQuery) { + this.mQuery = mQuery; } public Spannable highlight(CharSequence text) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyInfoFormatter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyInfoFormatter.java index ab82d025f..940f01776 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyInfoFormatter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyInfoFormatter.java @@ -11,6 +11,7 @@ import android.widget.TextView; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.model.SubKey; +import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo; import java.util.List; @@ -19,13 +20,20 @@ public class KeyInfoFormatter { private static final long JUST_NOW_THRESHOLD = DateUtils.MINUTE_IN_MILLIS * 5; private Context context; - private SubKey.UnifiedKeyInfo keyInfo; private Highlighter highlighter; + private UnifiedKeyInfo keyInfo; - public KeyInfoFormatter(Context context, SubKey.UnifiedKeyInfo keyInfo, String highlightString) { + public KeyInfoFormatter(Context context) { this.context = context; + highlighter = new Highlighter(context); + } + + public void setKeyInfo(UnifiedKeyInfo keyInfo) { this.keyInfo = keyInfo; - highlighter = new Highlighter(context, highlightString); + } + + public void setHighlightString(String highlight) { + highlighter.setQuery(highlight); } public void formatUserId(TextView name, TextView email) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyChoiceSpinnerAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyChoiceSpinnerAdapter.java index 570336050..b41b7adc8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyChoiceSpinnerAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyChoiceSpinnerAdapter.java @@ -19,14 +19,17 @@ import java.util.List; class KeyChoiceSpinnerAdapter extends BaseAdapter { + private final LayoutInflater layoutInflater; + private final KeyInfoFormatter keyInfoFormatter; + private Integer noneItemString; private List data; - private final LayoutInflater layoutInflater; KeyChoiceSpinnerAdapter(Context context) { super(); layoutInflater = LayoutInflater.from(context); + keyInfoFormatter = new KeyInfoFormatter(context); } public void setData(List data) { @@ -114,28 +117,26 @@ class KeyChoiceSpinnerAdapter extends BaseAdapter { } UnifiedKeyInfo keyInfo = getItem(position); - viewHolder.bind(view.getContext(), keyInfo, isEnabled(position)); + viewHolder.bind(keyInfo, isEnabled(position)); return view; } - public static class KeyChoiceViewHolder { - private View mView; + public class KeyChoiceViewHolder { private TextView mMainUserId; private TextView mMainUserIdRest; private TextView mCreationDate; private ImageView mStatus; KeyChoiceViewHolder(View view) { - mView = view; mMainUserId = view.findViewById(R.id.key_list_item_name); mMainUserIdRest = view.findViewById(R.id.key_list_item_email); mStatus = view.findViewById(R.id.key_list_item_status_icon); mCreationDate = view.findViewById(R.id.key_list_item_creation); } - public void bind(Context context, UnifiedKeyInfo keyInfo, boolean enabled) { - KeyInfoFormatter keyInfoFormatter = new KeyInfoFormatter(context, keyInfo, null); + public void bind(UnifiedKeyInfo keyInfo, boolean enabled) { + keyInfoFormatter.setKeyInfo(keyInfo); keyInfoFormatter.formatUserId(mMainUserId, mMainUserIdRest); keyInfoFormatter.formatCreationDate(mCreationDate); keyInfoFormatter.formatStatusIcon(mStatus); diff --git a/OpenKeychain/src/main/res/layout/api_remote_select_authentication_key.xml b/OpenKeychain/src/main/res/layout/api_remote_select_authentication_key.xml index 953d05ba1..3246f1801 100644 --- a/OpenKeychain/src/main/res/layout/api_remote_select_authentication_key.xml +++ b/OpenKeychain/src/main/res/layout/api_remote_select_authentication_key.xml @@ -85,7 +85,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/authentication_key_list" - tools:listitem="@layout/authentication_key_item" + tools:listitem="@layout/key_choice_item" tools:layout_height="100dp" /> diff --git a/OpenKeychain/src/main/res/layout/authentication_key_item.xml b/OpenKeychain/src/main/res/layout/authentication_key_item.xml deleted file mode 100644 index 5e8ed1477..000000000 --- a/OpenKeychain/src/main/res/layout/authentication_key_item.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - diff --git a/OpenKeychain/src/main/res/layout/key_choice_item.xml b/OpenKeychain/src/main/res/layout/key_choice_item.xml index f808b08ab..2f176fac2 100644 --- a/OpenKeychain/src/main/res/layout/key_choice_item.xml +++ b/OpenKeychain/src/main/res/layout/key_choice_item.xml @@ -6,7 +6,9 @@ android:paddingTop="6dp" android:paddingBottom="6dp" android:gravity="center_vertical" - android:orientation="horizontal"> + android:orientation="horizontal" + android:background="?selectableItemBackground" + android:minHeight="?listPreferredItemHeight">