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 0a493ab44..7abead888 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); + keyChoiceAdapter = KeyChoiceAdapter.createMultiChoiceAdapter(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 368893964..1a01edfda 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,9 @@ public class SelectPublicKeyFragment extends RecyclerFragment public void onLoadUnifiedKeyData(List data) { if (keyChoiceAdapter == null) { - keyChoiceAdapter = KeyChoiceAdapter.createMultiChoiceAdapter(data); + keyChoiceAdapter = KeyChoiceAdapter.createMultiChoiceAdapter(data, (keyInfo -> { + return keyInfo.is_revoked() ? R.string.keychoice_cannot_encrypt : null; + })); setAdapter(keyChoiceAdapter); keyChoiceAdapter.setSelectionByIds(selectedMasterKeyIds); } else { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyChoiceAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyChoiceAdapter.java index de3d18c75..b8a6d0701 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyChoiceAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyChoiceAdapter.java @@ -9,12 +9,14 @@ import java.util.Set; import android.content.Context; import android.support.annotation.Nullable; +import android.support.annotation.StringRes; import android.support.v7.widget.RecyclerView; import android.text.format.DateUtils; import android.view.View; import android.widget.CheckBox; import android.widget.RadioButton; import android.widget.TextView; +import android.widget.Toast; import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; @@ -26,43 +28,57 @@ import org.sufficientlysecure.keychain.ui.adapter.KeyChoiceAdapter.KeyChoiceItem public class KeyChoiceAdapter extends FlexibleAdapter { + @Nullable private final OnKeyClickListener onKeyClickListener; + @Nullable + private final KeyDisabledPredicate keyDisabledPredicate; + @Nullable private Integer activeItem; public static KeyChoiceAdapter createSingleClickableAdapter(List items, OnKeyClickListener onKeyClickListener) { - return new KeyChoiceAdapter(items, Objects.requireNonNull(onKeyClickListener), Mode.IDLE); + return new KeyChoiceAdapter(items, Objects.requireNonNull(onKeyClickListener), Mode.IDLE, null); } public static KeyChoiceAdapter createSingleChoiceAdapter(List items) { - return new KeyChoiceAdapter(items, null, Mode.SINGLE); + return new KeyChoiceAdapter(items, null, Mode.SINGLE, null); } - public static KeyChoiceAdapter createMultiChoiceAdapter(List items) { - return new KeyChoiceAdapter(items, null, Mode.MULTI); + public static KeyChoiceAdapter createMultiChoiceAdapter(List items, KeyDisabledPredicate keyDisabledPredicate) { + return new KeyChoiceAdapter(items, null, Mode.MULTI, keyDisabledPredicate); } - private KeyChoiceAdapter(List items, OnKeyClickListener onKeyClickListener, int idle) { - super(getKeyChoiceItems(items)); + private KeyChoiceAdapter(List items, @Nullable OnKeyClickListener onKeyClickListener, int idle, + @Nullable KeyDisabledPredicate keyDisabledPredicate) { + super(getKeyChoiceItems(items, keyDisabledPredicate)); setMode(idle); addListener((OnItemClickListener) (view, position) -> onClickItem(position)); this.onKeyClickListener = onKeyClickListener; + this.keyDisabledPredicate = keyDisabledPredicate; } @Nullable - private static ArrayList getKeyChoiceItems(@Nullable List items) { + private static ArrayList getKeyChoiceItems(@Nullable List items, + @Nullable KeyDisabledPredicate keyDisabledPredicate) { if (items == null) { return null; } ArrayList choiceItems = new ArrayList<>(); for (UnifiedKeyInfo keyInfo : items) { - KeyChoiceItem keyChoiceItem = new KeyChoiceItem(keyInfo); + Integer disabledString = keyDisabledPredicate != null ? keyDisabledPredicate.getDisabledString(keyInfo) : null; + KeyChoiceItem keyChoiceItem = new KeyChoiceItem(keyInfo, disabledString); choiceItems.add(keyChoiceItem); } return choiceItems; } private boolean onClickItem(int position) { + KeyChoiceItem item = getItem(position); + if (item != null && item.disabledStringRes != null) { + Toast.makeText(getRecyclerView().getContext(), item.disabledStringRes, Toast.LENGTH_SHORT).show(); + return false; + } + if (getMode() == Mode.MULTI) { toggleSelection(position); notifyItemChanged(position); @@ -72,8 +88,7 @@ public class KeyChoiceAdapter extends FlexibleAdapter { return true; } - KeyChoiceItem item = getItem(position); - onKeyClickListener.onKeyClick(item.keyInfo); + Objects.requireNonNull(onKeyClickListener).onKeyClick(item.keyInfo); return false; } @@ -109,7 +124,7 @@ public class KeyChoiceAdapter extends FlexibleAdapter { } public void setUnifiedKeyInfoItems(List keyInfos) { - List keyChoiceItems = getKeyChoiceItems(keyInfos); + List keyChoiceItems = getKeyChoiceItems(keyInfos, keyDisabledPredicate); updateDataSet(keyChoiceItems); } @@ -151,9 +166,12 @@ public class KeyChoiceAdapter extends FlexibleAdapter { public static class KeyChoiceItem extends AbstractFlexibleItem { private UnifiedKeyInfo keyInfo; + @StringRes + private Integer disabledStringRes; - KeyChoiceItem(UnifiedKeyInfo keyInfo) { + KeyChoiceItem(UnifiedKeyInfo keyInfo, @StringRes Integer disabledStringRes) { this.keyInfo = keyInfo; + this.disabledStringRes = disabledStringRes; setSelectable(true); } @@ -171,7 +189,8 @@ public class KeyChoiceAdapter extends FlexibleAdapter { public void bindViewHolder(FlexibleAdapter adapter, KeyChoiceViewHolder holder, int position, List payloads) { boolean isActive = adapter.isSelected(position); - holder.bind(keyInfo, adapter.getMode(), isActive); + boolean isEnabled = disabledStringRes == null; + holder.bind(keyInfo, adapter.getMode(), isActive, isEnabled); } @Override @@ -206,7 +225,7 @@ public class KeyChoiceAdapter extends FlexibleAdapter { vRadio = itemView.findViewById(R.id.radio_keychoice); } - void bind(UnifiedKeyInfo keyInfo, int choiceMode, boolean isActive) { + void bind(UnifiedKeyInfo keyInfo, int choiceMode, boolean isActive, boolean isEnabled) { vName.setText(keyInfo.name()); Context context = vCreation.getContext(); @@ -239,10 +258,20 @@ public class KeyChoiceAdapter extends FlexibleAdapter { break; } } + + vCheckbox.setEnabled(isEnabled); + vRadio.setEnabled(isEnabled); + vName.setEnabled(isEnabled); + vCreation.setEnabled(isEnabled); } } public interface OnKeyClickListener { void onKeyClick(UnifiedKeyInfo keyInfo); } + + public interface KeyDisabledPredicate { + @StringRes + Integer getDisabledString(UnifiedKeyInfo keyInfo); + } } diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index cc0fe24ab..5ad862968 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -2033,4 +2033,6 @@ Started updating all keys… Key update successful An error occurred while updating all keys + + This key cannot be used for encryption!