Cache instances of KeyInfoFormatter
This commit is contained in:
@@ -156,7 +156,7 @@ public class ApiPendingIntentFactory {
|
|||||||
return createInternal(data, intent);
|
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 intent = new Intent(mContext, RemoteSelectAuthenticationKeyActivity.class);
|
||||||
intent.putExtra(RemoteSelectAuthenticationKeyActivity.EXTRA_PACKAGE_NAME, packageName);
|
intent.putExtra(RemoteSelectAuthenticationKeyActivity.EXTRA_PACKAGE_NAME, packageName);
|
||||||
|
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ public class AppSettingsAllowedKeysListFragment extends RecyclerFragment<KeyChoi
|
|||||||
|
|
||||||
public void onLoadUnifiedKeyData(List<UnifiedKeyInfo> data) {
|
public void onLoadUnifiedKeyData(List<UnifiedKeyInfo> data) {
|
||||||
if (keyChoiceAdapter == null) {
|
if (keyChoiceAdapter == null) {
|
||||||
keyChoiceAdapter = KeyChoiceAdapter.createMultiChoiceAdapter(data, null);
|
keyChoiceAdapter = KeyChoiceAdapter.createMultiChoiceAdapter(requireContext(), data, null);
|
||||||
setAdapter(keyChoiceAdapter);
|
setAdapter(keyChoiceAdapter);
|
||||||
Set<Long> checkedIds = apiAppDao.getAllowedKeyIdsForApp(packageName);
|
Set<Long> checkedIds = apiAppDao.getAllowedKeyIdsForApp(packageName);
|
||||||
keyChoiceAdapter.setSelectionByIds(checkedIds);
|
keyChoiceAdapter.setSelectionByIds(checkedIds);
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ public class SelectPublicKeyFragment extends RecyclerFragment<KeyChoiceAdapter>
|
|||||||
|
|
||||||
public void onLoadUnifiedKeyData(List<UnifiedKeyInfo> data) {
|
public void onLoadUnifiedKeyData(List<UnifiedKeyInfo> data) {
|
||||||
if (keyChoiceAdapter == null) {
|
if (keyChoiceAdapter == null) {
|
||||||
keyChoiceAdapter = KeyChoiceAdapter.createMultiChoiceAdapter(data, (keyInfo -> {
|
keyChoiceAdapter = KeyChoiceAdapter.createMultiChoiceAdapter(requireContext(), data, (keyInfo -> {
|
||||||
if (keyInfo.is_revoked()) {
|
if (keyInfo.is_revoked()) {
|
||||||
return R.string.keychoice_revoked;
|
return R.string.keychoice_revoked;
|
||||||
} else if (keyInfo.is_expired()) {
|
} else if (keyInfo.is_expired()) {
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ public class SelectSignKeyIdListFragment extends RecyclerFragment<KeyChoiceAdapt
|
|||||||
|
|
||||||
public void onLoadUnifiedKeyData(List<UnifiedKeyInfo> data) {
|
public void onLoadUnifiedKeyData(List<UnifiedKeyInfo> data) {
|
||||||
if (keyChoiceAdapter == null) {
|
if (keyChoiceAdapter == null) {
|
||||||
keyChoiceAdapter = KeyChoiceAdapter.createSingleClickableAdapter(data, this::onSelectKeyItemClicked, (keyInfo -> {
|
keyChoiceAdapter = KeyChoiceAdapter.createSingleClickableAdapter(requireContext(), data, this::onSelectKeyItemClicked, (keyInfo -> {
|
||||||
if (keyInfo.is_revoked()) {
|
if (keyInfo.is_revoked()) {
|
||||||
return R.string.keychoice_revoked;
|
return R.string.keychoice_revoked;
|
||||||
} else if (keyInfo.is_expired()) {
|
} else if (keyInfo.is_expired()) {
|
||||||
|
|||||||
@@ -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<KeyChoiceViewHolder> {
|
||||||
|
private final LayoutInflater layoutInflater;
|
||||||
|
private List<UnifiedKeyInfo> 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<UnifiedKeyInfo> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -63,7 +63,7 @@ class RemoteDeduplicatePresenter {
|
|||||||
|
|
||||||
private void onLoadKeyInfos(List<UnifiedKeyInfo> data) {
|
private void onLoadKeyInfos(List<UnifiedKeyInfo> data) {
|
||||||
if (keyChoiceAdapter == null) {
|
if (keyChoiceAdapter == null) {
|
||||||
keyChoiceAdapter = KeyChoiceAdapter.createSingleChoiceAdapter(data, (keyInfo -> {
|
keyChoiceAdapter = KeyChoiceAdapter.createSingleChoiceAdapter(context, data, (keyInfo -> {
|
||||||
if (keyInfo.is_revoked()) {
|
if (keyInfo.is_revoked()) {
|
||||||
return R.string.keychoice_revoked;
|
return R.string.keychoice_revoked;
|
||||||
} else if (keyInfo.is_expired()) {
|
} else if (keyInfo.is_expired()) {
|
||||||
|
|||||||
@@ -40,27 +40,22 @@ import android.support.v4.content.res.ResourcesCompat;
|
|||||||
import android.support.v4.graphics.drawable.DrawableCompat;
|
import android.support.v4.graphics.drawable.DrawableCompat;
|
||||||
import android.support.v7.widget.LinearLayoutManager;
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
import android.support.v7.widget.RecyclerView;
|
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.ContextThemeWrapper;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import com.mikepenz.materialdrawer.util.KeyboardUtil;
|
import com.mikepenz.materialdrawer.util.KeyboardUtil;
|
||||||
import org.openintents.ssh.authentication.SshAuthenticationApi;
|
import org.openintents.ssh.authentication.SshAuthenticationApi;
|
||||||
import org.sufficientlysecure.keychain.R;
|
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.ApiAppDao;
|
||||||
import org.sufficientlysecure.keychain.daos.KeyRepository;
|
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.RemoteSecurityTokenOperationActivity;
|
||||||
import org.sufficientlysecure.keychain.remote.ui.dialog.RemoteSelectAuthenticationKeyPresenter.RemoteSelectAuthenticationKeyView;
|
import org.sufficientlysecure.keychain.remote.ui.dialog.RemoteSelectAuthenticationKeyPresenter.RemoteSelectAuthenticationKeyView;
|
||||||
import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder;
|
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.ThemeChanger;
|
||||||
import org.sufficientlysecure.keychain.ui.util.recyclerview.DividerItemDecoration;
|
import org.sufficientlysecure.keychain.ui.util.recyclerview.DividerItemDecoration;
|
||||||
import org.sufficientlysecure.keychain.ui.util.recyclerview.RecyclerItemClickListener;
|
import org.sufficientlysecure.keychain.ui.util.recyclerview.RecyclerItemClickListener;
|
||||||
@@ -203,7 +198,7 @@ public class RemoteSelectAuthenticationKeyActivity extends FragmentActivity {
|
|||||||
@NonNull
|
@NonNull
|
||||||
private RemoteSelectAuthenticationKeyView createMvpView(View view, LayoutInflater layoutInflater) {
|
private RemoteSelectAuthenticationKeyView createMvpView(View view, LayoutInflater layoutInflater) {
|
||||||
final ImageView iconClientApp = view.findViewById(R.id.icon_client_app);
|
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);
|
keyChoiceList.setAdapter(keyChoiceAdapter);
|
||||||
|
|
||||||
return new RemoteSelectAuthenticationKeyView() {
|
return new RemoteSelectAuthenticationKeyView() {
|
||||||
@@ -231,7 +226,14 @@ public class RemoteSelectAuthenticationKeyActivity extends FragmentActivity {
|
|||||||
@Override
|
@Override
|
||||||
public void setTitleClientIcon(Drawable drawable) {
|
public void setTitleClientIcon(Drawable drawable) {
|
||||||
iconClientApp.setImageDrawable(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
|
@Override
|
||||||
@@ -258,92 +260,4 @@ public class RemoteSelectAuthenticationKeyActivity extends FragmentActivity {
|
|||||||
(view, position) -> presenter.onKeyItemClick(position)));
|
(view, position) -> presenter.onKeyItemClick(position)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class KeyChoiceAdapter extends Adapter<KeyChoiceViewHolder> {
|
|
||||||
private final LayoutInflater layoutInflater;
|
|
||||||
private final Resources resources;
|
|
||||||
private List<UnifiedKeyInfo> 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<UnifiedKeyInfo> 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,8 +45,6 @@ import android.support.v4.content.res.ResourcesCompat;
|
|||||||
import android.support.v4.graphics.drawable.DrawableCompat;
|
import android.support.v4.graphics.drawable.DrawableCompat;
|
||||||
import android.support.v7.widget.LinearLayoutManager;
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
import android.support.v7.widget.RecyclerView;
|
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.ContextThemeWrapper;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -60,18 +58,17 @@ import android.widget.Toast;
|
|||||||
import com.mikepenz.materialdrawer.util.KeyboardUtil;
|
import com.mikepenz.materialdrawer.util.KeyboardUtil;
|
||||||
import org.openintents.openpgp.util.OpenPgpApi;
|
import org.openintents.openpgp.util.OpenPgpApi;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
|
import org.sufficientlysecure.keychain.daos.KeyRepository;
|
||||||
import org.sufficientlysecure.keychain.livedata.GenericLiveData;
|
import org.sufficientlysecure.keychain.livedata.GenericLiveData;
|
||||||
import org.sufficientlysecure.keychain.livedata.PgpKeyGenerationLiveData;
|
import org.sufficientlysecure.keychain.livedata.PgpKeyGenerationLiveData;
|
||||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||||
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
|
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.remote.ui.dialog.RemoteSelectIdentityKeyPresenter.RemoteSelectIdentityKeyView;
|
||||||
import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
|
import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
|
||||||
import org.sufficientlysecure.keychain.ui.MainActivity;
|
import org.sufficientlysecure.keychain.ui.MainActivity;
|
||||||
import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
|
import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
|
||||||
import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper.AbstractCallback;
|
import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper.AbstractCallback;
|
||||||
import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder;
|
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.ThemeChanger;
|
||||||
import org.sufficientlysecure.keychain.ui.util.recyclerview.DividerItemDecoration;
|
import org.sufficientlysecure.keychain.ui.util.recyclerview.DividerItemDecoration;
|
||||||
import org.sufficientlysecure.keychain.ui.util.recyclerview.RecyclerItemClickListener;
|
import org.sufficientlysecure.keychain.ui.util.recyclerview.RecyclerItemClickListener;
|
||||||
@@ -246,7 +243,7 @@ public class RemoteSelectIdKeyActivity extends FragmentActivity {
|
|||||||
@NonNull
|
@NonNull
|
||||||
private RemoteSelectIdentityKeyView createMvpView(final ViewGroup rootView, LayoutInflater layoutInflater) {
|
private RemoteSelectIdentityKeyView createMvpView(final ViewGroup rootView, LayoutInflater layoutInflater) {
|
||||||
// final ImageView iconClientApp = rootView.findViewById(R.id.icon_client_app);
|
// 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 titleText = rootView.findViewById(R.id.text_title_select_key);
|
||||||
final TextView addressText = rootView.findViewById(R.id.text_user_id);
|
final TextView addressText = rootView.findViewById(R.id.text_user_id);
|
||||||
final TextView autocryptHint = rootView.findViewById(R.id.key_import_autocrypt_hint);
|
final TextView autocryptHint = rootView.findViewById(R.id.key_import_autocrypt_hint);
|
||||||
@@ -446,91 +443,6 @@ public class RemoteSelectIdKeyActivity extends FragmentActivity {
|
|||||||
importOpHelper.cryptoOperation();
|
importOpHelper.cryptoOperation();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class KeyChoiceAdapter extends Adapter<KeyChoiceViewHolder> {
|
|
||||||
private final LayoutInflater layoutInflater;
|
|
||||||
private List<UnifiedKeyInfo> 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<UnifiedKeyInfo> 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
|
@Override
|
||||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
if (importOpHelper.handleActivityResult(requestCode, resultCode, data)) {
|
if (importOpHelper.handleActivityResult(requestCode, resultCode, data)) {
|
||||||
|
|||||||
@@ -110,6 +110,11 @@ public class DebugActionsActivity extends Activity {
|
|||||||
new Intent(), BuildConfig.APPLICATION_ID, getPackageSig(), "test@openkeychain.org", false);
|
new Intent(), BuildConfig.APPLICATION_ID, getPackageSig(), "test@openkeychain.org", false);
|
||||||
startPendingIntent(pendingIntent);
|
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) -> {
|
addButtonToLayout(context, verticalLayout, "Select Signing Key (Autocrypt)").setOnClickListener((v) -> {
|
||||||
PendingIntent pendingIntent = pendingIntentFactory.createSelectSignKeyIdPendingIntent(
|
PendingIntent pendingIntent = pendingIntentFactory.createSelectSignKeyIdPendingIntent(
|
||||||
new Intent(), BuildConfig.APPLICATION_ID, getPackageSig(), "test@openkeychain.org", true);
|
new Intent(), BuildConfig.APPLICATION_ID, getPackageSig(), "test@openkeychain.org", true);
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
|
|||||||
import org.sufficientlysecure.keychain.ui.base.RecyclerFragment;
|
import org.sufficientlysecure.keychain.ui.base.RecyclerFragment;
|
||||||
import org.sufficientlysecure.keychain.ui.keyview.GenericViewModel;
|
import org.sufficientlysecure.keychain.ui.keyview.GenericViewModel;
|
||||||
import org.sufficientlysecure.keychain.ui.keyview.ViewKeyActivity;
|
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;
|
||||||
import org.sufficientlysecure.keychain.ui.util.Notify.Style;
|
import org.sufficientlysecure.keychain.ui.util.Notify.Style;
|
||||||
import org.sufficientlysecure.keychain.util.FabContainer;
|
import org.sufficientlysecure.keychain.util.FabContainer;
|
||||||
@@ -141,6 +142,7 @@ public class KeyListFragment extends RecyclerFragment<FlexibleAdapter<FlexibleKe
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
private FastScroller fastScroller;
|
private FastScroller fastScroller;
|
||||||
|
private KeyInfoFormatter keyInfoFormatter;
|
||||||
|
|
||||||
private void multiSelectDelete(long[] keyIds, boolean hasSecret) {
|
private void multiSelectDelete(long[] keyIds, boolean hasSecret) {
|
||||||
Intent intent = new Intent(getActivity(), DeleteKeyDialogActivity.class);
|
Intent intent = new Intent(getActivity(), DeleteKeyDialogActivity.class);
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ public class FlexibleKeyDetailsItem extends FlexibleSectionableKeyItem<FlexibleK
|
|||||||
private final TextView vCreationDate;
|
private final TextView vCreationDate;
|
||||||
private final ImageView vStatusIcon;
|
private final ImageView vStatusIcon;
|
||||||
private final ImageView vTrustIdIcon;
|
private final ImageView vTrustIdIcon;
|
||||||
|
private final KeyInfoFormatter keyInfoFormatter;
|
||||||
|
|
||||||
FlexibleKeyItemViewHolder(View itemView, FlexibleAdapter adapter) {
|
FlexibleKeyItemViewHolder(View itemView, FlexibleAdapter adapter) {
|
||||||
super(itemView, adapter);
|
super(itemView, adapter);
|
||||||
@@ -84,12 +85,15 @@ public class FlexibleKeyDetailsItem extends FlexibleSectionableKeyItem<FlexibleK
|
|||||||
vStatusIcon = itemView.findViewById(R.id.key_list_item_status_icon);
|
vStatusIcon = itemView.findViewById(R.id.key_list_item_status_icon);
|
||||||
vCreationDate = itemView.findViewById(R.id.key_list_item_creation);
|
vCreationDate = itemView.findViewById(R.id.key_list_item_creation);
|
||||||
vTrustIdIcon = itemView.findViewById(R.id.key_list_item_tid_icon);
|
vTrustIdIcon = itemView.findViewById(R.id.key_list_item_tid_icon);
|
||||||
|
|
||||||
|
keyInfoFormatter = new KeyInfoFormatter(itemView.getContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void bind(UnifiedKeyInfo keyInfo, String highlightString) {
|
public void bind(UnifiedKeyInfo keyInfo, String highlightString) {
|
||||||
setEnabled(true);
|
setEnabled(true);
|
||||||
|
|
||||||
KeyInfoFormatter keyInfoFormatter = new KeyInfoFormatter(itemView.getContext(), keyInfo, highlightString);
|
keyInfoFormatter.setKeyInfo(keyInfo);
|
||||||
|
keyInfoFormatter.setHighlightString(highlightString);
|
||||||
keyInfoFormatter.formatUserId(vMainUserId, vMainUserIdRest);
|
keyInfoFormatter.formatUserId(vMainUserId, vMainUserIdRest);
|
||||||
keyInfoFormatter.formatCreationDate(vCreationDate);
|
keyInfoFormatter.formatCreationDate(vCreationDate);
|
||||||
keyInfoFormatter.greyInvalidKeys(Arrays.asList(vMainUserId, vMainUserIdRest, vCreationDate));
|
keyInfoFormatter.greyInvalidKeys(Arrays.asList(vMainUserId, vMainUserIdRest, vCreationDate));
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
package org.sufficientlysecure.keychain.ui.adapter;
|
package org.sufficientlysecure.keychain.ui.adapter;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.annotation.StringRes;
|
import android.support.annotation.StringRes;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
@@ -10,21 +17,14 @@ import android.widget.RadioButton;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import org.sufficientlysecure.keychain.R;
|
|
||||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
|
||||||
import org.sufficientlysecure.keychain.ui.adapter.KeyChoiceAdapter.KeyChoiceItem;
|
|
||||||
import org.sufficientlysecure.keychain.ui.util.KeyInfoFormatter;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
||||||
import eu.davidea.flexibleadapter.items.IFlexible;
|
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||||
import eu.davidea.viewholders.FlexibleViewHolder;
|
import eu.davidea.viewholders.FlexibleViewHolder;
|
||||||
|
import org.sufficientlysecure.keychain.R;
|
||||||
|
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||||
|
import org.sufficientlysecure.keychain.ui.adapter.KeyChoiceAdapter.KeyChoiceItem;
|
||||||
|
import org.sufficientlysecure.keychain.ui.util.KeyInfoFormatter;
|
||||||
|
|
||||||
|
|
||||||
public class KeyChoiceAdapter extends FlexibleAdapter<KeyChoiceItem> {
|
public class KeyChoiceAdapter extends FlexibleAdapter<KeyChoiceItem> {
|
||||||
@@ -34,41 +34,40 @@ public class KeyChoiceAdapter extends FlexibleAdapter<KeyChoiceItem> {
|
|||||||
private final KeyDisabledPredicate keyDisabledPredicate;
|
private final KeyDisabledPredicate keyDisabledPredicate;
|
||||||
@Nullable
|
@Nullable
|
||||||
private Integer activeItem;
|
private Integer activeItem;
|
||||||
|
private KeyInfoFormatter keyInfoFormatter;
|
||||||
|
|
||||||
public static KeyChoiceAdapter createSingleClickableAdapter(List<UnifiedKeyInfo> items,
|
public static KeyChoiceAdapter createSingleClickableAdapter(Context context, List<UnifiedKeyInfo> items,
|
||||||
OnKeyClickListener onKeyClickListener) {
|
|
||||||
return new KeyChoiceAdapter(items, Objects.requireNonNull(onKeyClickListener), Mode.IDLE, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static KeyChoiceAdapter createSingleClickableAdapter(List<UnifiedKeyInfo> items,
|
|
||||||
OnKeyClickListener onKeyClickListener,
|
OnKeyClickListener onKeyClickListener,
|
||||||
KeyDisabledPredicate keyDisabledPredicate) {
|
KeyDisabledPredicate keyDisabledPredicate) {
|
||||||
return new KeyChoiceAdapter(items, Objects.requireNonNull(onKeyClickListener), Mode.IDLE, keyDisabledPredicate);
|
return new KeyChoiceAdapter(context, items, Objects.requireNonNull(onKeyClickListener), Mode.IDLE,
|
||||||
|
keyDisabledPredicate
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static KeyChoiceAdapter createSingleChoiceAdapter(List<UnifiedKeyInfo> items) {
|
public static KeyChoiceAdapter createSingleChoiceAdapter(Context context, List<UnifiedKeyInfo> items,
|
||||||
return new KeyChoiceAdapter(items, null, Mode.SINGLE, null);
|
KeyDisabledPredicate keyDisabledPredicate) {
|
||||||
|
return new KeyChoiceAdapter(context, items, null, Mode.SINGLE, keyDisabledPredicate);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static KeyChoiceAdapter createSingleChoiceAdapter(List<UnifiedKeyInfo> items, KeyDisabledPredicate keyDisabledPredicate) {
|
public static KeyChoiceAdapter createMultiChoiceAdapter(Context context, List<UnifiedKeyInfo> items,
|
||||||
return new KeyChoiceAdapter(items, null, Mode.SINGLE, keyDisabledPredicate);
|
KeyDisabledPredicate keyDisabledPredicate) {
|
||||||
|
return new KeyChoiceAdapter(context, items, null, Mode.MULTI, keyDisabledPredicate);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static KeyChoiceAdapter createMultiChoiceAdapter(List<UnifiedKeyInfo> items, KeyDisabledPredicate keyDisabledPredicate) {
|
private KeyChoiceAdapter(Context context, List<UnifiedKeyInfo> items,
|
||||||
return new KeyChoiceAdapter(items, null, Mode.MULTI, keyDisabledPredicate);
|
@Nullable OnKeyClickListener onKeyClickListener, int idle,
|
||||||
}
|
|
||||||
|
|
||||||
private KeyChoiceAdapter(List<UnifiedKeyInfo> items, @Nullable OnKeyClickListener onKeyClickListener, int idle,
|
|
||||||
@Nullable KeyDisabledPredicate keyDisabledPredicate) {
|
@Nullable KeyDisabledPredicate keyDisabledPredicate) {
|
||||||
super(getKeyChoiceItems(items, keyDisabledPredicate));
|
super(null, null, true);
|
||||||
setMode(idle);
|
setMode(idle);
|
||||||
addListener((OnItemClickListener) (view, position) -> onClickItem(position));
|
addListener((OnItemClickListener) (view, position) -> onClickItem(position));
|
||||||
|
updateDataSet(getKeyChoiceItems(items, keyDisabledPredicate), false);
|
||||||
|
this.keyInfoFormatter = new KeyInfoFormatter(context);
|
||||||
this.onKeyClickListener = onKeyClickListener;
|
this.onKeyClickListener = onKeyClickListener;
|
||||||
this.keyDisabledPredicate = keyDisabledPredicate;
|
this.keyDisabledPredicate = keyDisabledPredicate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static ArrayList<KeyChoiceItem> getKeyChoiceItems(@Nullable List<UnifiedKeyInfo> items,
|
private ArrayList<KeyChoiceItem> getKeyChoiceItems(@Nullable List<UnifiedKeyInfo> items,
|
||||||
@Nullable KeyDisabledPredicate keyDisabledPredicate) {
|
@Nullable KeyDisabledPredicate keyDisabledPredicate) {
|
||||||
if (items == null) {
|
if (items == null) {
|
||||||
return null;
|
return null;
|
||||||
@@ -174,7 +173,7 @@ public class KeyChoiceAdapter extends FlexibleAdapter<KeyChoiceItem> {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class KeyChoiceItem extends AbstractFlexibleItem<KeyChoiceViewHolder> {
|
public class KeyChoiceItem extends AbstractFlexibleItem<KeyChoiceViewHolder> {
|
||||||
private UnifiedKeyInfo keyInfo;
|
private UnifiedKeyInfo keyInfo;
|
||||||
@StringRes
|
@StringRes
|
||||||
private Integer disabledStringRes;
|
private Integer disabledStringRes;
|
||||||
@@ -220,7 +219,7 @@ public class KeyChoiceAdapter extends FlexibleAdapter<KeyChoiceItem> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class KeyChoiceViewHolder extends FlexibleViewHolder {
|
public class KeyChoiceViewHolder extends FlexibleViewHolder {
|
||||||
private final TextView vName;
|
private final TextView vName;
|
||||||
private final TextView vCreation;
|
private final TextView vCreation;
|
||||||
private final CheckBox vCheckbox;
|
private final CheckBox vCheckbox;
|
||||||
@@ -236,9 +235,10 @@ public class KeyChoiceAdapter extends FlexibleAdapter<KeyChoiceItem> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void bind(UnifiedKeyInfo keyInfo, int choiceMode, boolean isActive, boolean isEnabled) {
|
void bind(UnifiedKeyInfo keyInfo, int choiceMode, boolean isActive, boolean isEnabled) {
|
||||||
|
keyInfoFormatter.setKeyInfo(keyInfo);
|
||||||
|
|
||||||
vName.setText(keyInfo.user_id());
|
vName.setText(keyInfo.user_id());
|
||||||
|
|
||||||
KeyInfoFormatter keyInfoFormatter = new KeyInfoFormatter(itemView.getContext(), keyInfo, null);
|
|
||||||
keyInfoFormatter.formatCreationDate(vCreation);
|
keyInfoFormatter.formatCreationDate(vCreation);
|
||||||
|
|
||||||
switch (choiceMode) {
|
switch (choiceMode) {
|
||||||
|
|||||||
@@ -31,7 +31,8 @@ public class ImportKeysBindingsUtils {
|
|||||||
public static Highlighter getHighlighter(Context context, String query) {
|
public static Highlighter getHighlighter(Context context, String query) {
|
||||||
Highlighter highlighter = highlighterCache.get(query);
|
Highlighter highlighter = highlighterCache.get(query);
|
||||||
if (highlighter == null) {
|
if (highlighter == null) {
|
||||||
highlighter = new Highlighter(context, query);
|
highlighter = new Highlighter(context);
|
||||||
|
highlighter.setQuery(query);
|
||||||
highlighterCache.put(query, highlighter);
|
highlighterCache.put(query, highlighter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,11 +21,13 @@ import org.sufficientlysecure.keychain.ui.util.KeyInfoFormatter;
|
|||||||
|
|
||||||
public class EncryptRecipientDropdownAdapter extends ChipsInput.ChipDropdownAdapter<EncryptRecipientChip, ItemViewHolder> {
|
public class EncryptRecipientDropdownAdapter extends ChipsInput.ChipDropdownAdapter<EncryptRecipientChip, ItemViewHolder> {
|
||||||
private final LayoutInflater layoutInflater;
|
private final LayoutInflater layoutInflater;
|
||||||
|
private final KeyInfoFormatter keyInfoFormatter;
|
||||||
|
|
||||||
EncryptRecipientDropdownAdapter(Context context, List<EncryptRecipientChip> keyInfoChips) {
|
EncryptRecipientDropdownAdapter(Context context, List<EncryptRecipientChip> keyInfoChips) {
|
||||||
super(keyInfoChips);
|
super(keyInfoChips);
|
||||||
|
|
||||||
layoutInflater = LayoutInflater.from(context);
|
layoutInflater = LayoutInflater.from(context);
|
||||||
|
keyInfoFormatter = new KeyInfoFormatter(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
class ItemViewHolder extends RecyclerView.ViewHolder {
|
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);
|
vStatusIcon = itemView.findViewById(R.id.key_list_item_status_icon);
|
||||||
vCreationDate = itemView.findViewById(R.id.key_list_item_creation);
|
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
|
@NonNull
|
||||||
@@ -54,10 +64,6 @@ public class EncryptRecipientDropdownAdapter extends ChipsInput.ChipDropdownAdap
|
|||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
|
public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
|
||||||
EncryptRecipientChip chip = getItem(position);
|
EncryptRecipientChip chip = getItem(position);
|
||||||
|
holder.bind(chip);
|
||||||
KeyInfoFormatter keyInfoFormatter = new KeyInfoFormatter(layoutInflater.getContext(), chip.keyInfo, null);
|
|
||||||
keyInfoFormatter.formatUserId(holder.vMainUserId, holder.vMainUserIdRest);
|
|
||||||
keyInfoFormatter.formatCreationDate(holder.vCreationDate);
|
|
||||||
keyInfoFormatter.formatStatusIcon(holder.vStatusIcon);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,9 +30,12 @@ public class Highlighter {
|
|||||||
private Context mContext;
|
private Context mContext;
|
||||||
private String mQuery;
|
private String mQuery;
|
||||||
|
|
||||||
public Highlighter(Context context, String query) {
|
public Highlighter(Context context) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mQuery = query;
|
}
|
||||||
|
|
||||||
|
public void setQuery(String mQuery) {
|
||||||
|
this.mQuery = mQuery;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Spannable highlight(CharSequence text) {
|
public Spannable highlight(CharSequence text) {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import android.widget.TextView;
|
|||||||
|
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.model.SubKey;
|
import org.sufficientlysecure.keychain.model.SubKey;
|
||||||
|
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -19,13 +20,20 @@ public class KeyInfoFormatter {
|
|||||||
private static final long JUST_NOW_THRESHOLD = DateUtils.MINUTE_IN_MILLIS * 5;
|
private static final long JUST_NOW_THRESHOLD = DateUtils.MINUTE_IN_MILLIS * 5;
|
||||||
|
|
||||||
private Context context;
|
private Context context;
|
||||||
private SubKey.UnifiedKeyInfo keyInfo;
|
|
||||||
private Highlighter highlighter;
|
private Highlighter highlighter;
|
||||||
|
private UnifiedKeyInfo keyInfo;
|
||||||
|
|
||||||
public KeyInfoFormatter(Context context, SubKey.UnifiedKeyInfo keyInfo, String highlightString) {
|
public KeyInfoFormatter(Context context) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
highlighter = new Highlighter(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setKeyInfo(UnifiedKeyInfo keyInfo) {
|
||||||
this.keyInfo = keyInfo;
|
this.keyInfo = keyInfo;
|
||||||
highlighter = new Highlighter(context, highlightString);
|
}
|
||||||
|
|
||||||
|
public void setHighlightString(String highlight) {
|
||||||
|
highlighter.setQuery(highlight);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void formatUserId(TextView name, TextView email) {
|
public void formatUserId(TextView name, TextView email) {
|
||||||
|
|||||||
@@ -19,14 +19,17 @@ import java.util.List;
|
|||||||
|
|
||||||
|
|
||||||
class KeyChoiceSpinnerAdapter extends BaseAdapter {
|
class KeyChoiceSpinnerAdapter extends BaseAdapter {
|
||||||
|
private final LayoutInflater layoutInflater;
|
||||||
|
private final KeyInfoFormatter keyInfoFormatter;
|
||||||
|
|
||||||
private Integer noneItemString;
|
private Integer noneItemString;
|
||||||
private List<UnifiedKeyInfo> data;
|
private List<UnifiedKeyInfo> data;
|
||||||
private final LayoutInflater layoutInflater;
|
|
||||||
|
|
||||||
KeyChoiceSpinnerAdapter(Context context) {
|
KeyChoiceSpinnerAdapter(Context context) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
layoutInflater = LayoutInflater.from(context);
|
layoutInflater = LayoutInflater.from(context);
|
||||||
|
keyInfoFormatter = new KeyInfoFormatter(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setData(List<UnifiedKeyInfo> data) {
|
public void setData(List<UnifiedKeyInfo> data) {
|
||||||
@@ -114,28 +117,26 @@ class KeyChoiceSpinnerAdapter extends BaseAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
UnifiedKeyInfo keyInfo = getItem(position);
|
UnifiedKeyInfo keyInfo = getItem(position);
|
||||||
viewHolder.bind(view.getContext(), keyInfo, isEnabled(position));
|
viewHolder.bind(keyInfo, isEnabled(position));
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class KeyChoiceViewHolder {
|
public class KeyChoiceViewHolder {
|
||||||
private View mView;
|
|
||||||
private TextView mMainUserId;
|
private TextView mMainUserId;
|
||||||
private TextView mMainUserIdRest;
|
private TextView mMainUserIdRest;
|
||||||
private TextView mCreationDate;
|
private TextView mCreationDate;
|
||||||
private ImageView mStatus;
|
private ImageView mStatus;
|
||||||
|
|
||||||
KeyChoiceViewHolder(View view) {
|
KeyChoiceViewHolder(View view) {
|
||||||
mView = view;
|
|
||||||
mMainUserId = view.findViewById(R.id.key_list_item_name);
|
mMainUserId = view.findViewById(R.id.key_list_item_name);
|
||||||
mMainUserIdRest = view.findViewById(R.id.key_list_item_email);
|
mMainUserIdRest = view.findViewById(R.id.key_list_item_email);
|
||||||
mStatus = view.findViewById(R.id.key_list_item_status_icon);
|
mStatus = view.findViewById(R.id.key_list_item_status_icon);
|
||||||
mCreationDate = view.findViewById(R.id.key_list_item_creation);
|
mCreationDate = view.findViewById(R.id.key_list_item_creation);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void bind(Context context, UnifiedKeyInfo keyInfo, boolean enabled) {
|
public void bind(UnifiedKeyInfo keyInfo, boolean enabled) {
|
||||||
KeyInfoFormatter keyInfoFormatter = new KeyInfoFormatter(context, keyInfo, null);
|
keyInfoFormatter.setKeyInfo(keyInfo);
|
||||||
keyInfoFormatter.formatUserId(mMainUserId, mMainUserIdRest);
|
keyInfoFormatter.formatUserId(mMainUserId, mMainUserIdRest);
|
||||||
keyInfoFormatter.formatCreationDate(mCreationDate);
|
keyInfoFormatter.formatCreationDate(mCreationDate);
|
||||||
keyInfoFormatter.formatStatusIcon(mStatus);
|
keyInfoFormatter.formatStatusIcon(mStatus);
|
||||||
|
|||||||
@@ -85,7 +85,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:id="@+id/authentication_key_list"
|
android:id="@+id/authentication_key_list"
|
||||||
tools:listitem="@layout/authentication_key_item"
|
tools:listitem="@layout/key_choice_item"
|
||||||
tools:layout_height="100dp"
|
tools:layout_height="100dp"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|||||||
@@ -1,44 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingTop="6dp"
|
|
||||||
android:paddingBottom="6dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_width="24dp"
|
|
||||||
android:layout_height="24dp"
|
|
||||||
android:layout_marginRight="12dp"
|
|
||||||
android:layout_marginEnd="12dp"
|
|
||||||
android:id="@+id/key_list_item_icon"
|
|
||||||
tools:tint="@color/md_grey_600"
|
|
||||||
tools:src="@drawable/apps_k9"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/key_list_item_name"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
tools:text="@string/label_main_user_id"
|
|
||||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/key_list_item_creation"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:maxLines="1"
|
|
||||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
|
||||||
tools:visibility="visible"
|
|
||||||
tools:text="Created on 10/10/2010 10:00" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
@@ -6,7 +6,9 @@
|
|||||||
android:paddingTop="6dp"
|
android:paddingTop="6dp"
|
||||||
android:paddingBottom="6dp"
|
android:paddingBottom="6dp"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:orientation="horizontal">
|
android:orientation="horizontal"
|
||||||
|
android:background="?selectableItemBackground"
|
||||||
|
android:minHeight="?listPreferredItemHeight">
|
||||||
|
|
||||||
<RadioButton
|
<RadioButton
|
||||||
android:id="@+id/radio_keychoice"
|
android:id="@+id/radio_keychoice"
|
||||||
|
|||||||
Reference in New Issue
Block a user