Merge pull request #2378 from open-keychain/decrypt-context-button

Use overflow menu instead of long click in decrypt file list
This commit is contained in:
Dominik Schürmann
2018-07-13 15:25:43 +02:00
committed by GitHub
2 changed files with 69 additions and 92 deletions

View File

@@ -54,13 +54,11 @@ import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.webkit.MimeTypeMap; import android.webkit.MimeTypeMap;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.PopupMenu; import android.widget.PopupMenu;
import android.widget.PopupMenu.OnDismissListener;
import android.widget.PopupMenu.OnMenuItemClickListener; import android.widget.PopupMenu.OnMenuItemClickListener;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
@@ -79,7 +77,6 @@ import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
import org.sufficientlysecure.keychain.operations.results.InputDataResult; import org.sufficientlysecure.keychain.operations.results.InputDataResult;
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel; import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.service.ImportKeyringParcel; import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
import org.sufficientlysecure.keychain.service.InputDataParcel; import org.sufficientlysecure.keychain.service.InputDataParcel;
import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper; import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
@@ -165,7 +162,7 @@ public class DecryptListFragment
* Inflate the layout for this fragment * Inflate the layout for this fragment
*/ */
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.decrypt_files_list_fragment, container, false); View view = inflater.inflate(R.layout.decrypt_files_list_fragment, container, false);
RecyclerView vFilesList = view.findViewById(R.id.decrypted_files_list); RecyclerView vFilesList = view.findViewById(R.id.decrypted_files_list);
@@ -240,8 +237,8 @@ public class DecryptListFragment
mInputUris = inputUris; mInputUris = inputUris;
mCurrentInputUri = null; mCurrentInputUri = null;
mInputDataResults = results != null ? results : new HashMap<Uri, InputDataResult>(inputUris.size()); mInputDataResults = results != null ? results : new HashMap<>(inputUris.size());
mCancelledInputUris = cancelledUris != null ? cancelledUris : new ArrayList<Uri>(); mCancelledInputUris = cancelledUris != null ? cancelledUris : new ArrayList<>();
mPendingInputUris = new ArrayList<>(); mPendingInputUris = new ArrayList<>();
@@ -499,9 +496,7 @@ public class DecryptListFragment
return; return;
} }
new BottomSheet.Builder(activity).sheet(R.menu.decrypt_bottom_sheet).listener(new MenuItem.OnMenuItemClickListener() { new BottomSheet.Builder(activity).sheet(R.menu.decrypt_bottom_sheet).listener(item -> {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.decrypt_open: case R.id.decrypt_open:
displayWithViewIntent(result, index, false, true); displayWithViewIntent(result, index, false, true);
@@ -515,7 +510,6 @@ public class DecryptListFragment
break; break;
} }
return false; return false;
}
}).grid().show(); }).grid().show();
} }
@@ -912,13 +906,14 @@ public class DecryptListFragment
} }
// Provide a suitable constructor (depends on the kind of dataset) // Provide a suitable constructor (depends on the kind of dataset)
public DecryptFilesAdapter() { DecryptFilesAdapter() {
mDataset = new ArrayList<>(); mDataset = new ArrayList<>();
} }
// Create new views (invoked by the layout manager) // Create new views (invoked by the layout manager)
@NonNull
@Override @Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//inflate your layout and pass it to view holder //inflate your layout and pass it to view holder
View v = LayoutInflater.from(parent.getContext()) View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.decrypt_list_entry, parent, false); .inflate(R.layout.decrypt_list_entry, parent, false);
@@ -927,7 +922,7 @@ public class DecryptListFragment
// Replace the contents of a view (invoked by the layout manager) // Replace the contents of a view (invoked by the layout manager)
@Override @Override
public void onBindViewHolder(ViewHolder holder, final int position) { public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
// - get element from your dataset at this position // - get element from your dataset at this position
// - replace the contents of the view with that element // - replace the contents of the view with that element
final ViewModel model = mDataset.get(position); final ViewModel model = mDataset.get(position);
@@ -1010,24 +1005,17 @@ public class DecryptListFragment
// save index closure-style :) // save index closure-style :)
final int idx = i; final int idx = i;
fileHolder.vFile.setOnLongClickListener(new OnLongClickListener() { fileHolder.vOverflowMenu.setVisibility(model.mResult.success() ? View.VISIBLE : View.GONE);
@Override fileHolder.vOverflowMenu.setOnClickListener(view -> {
public boolean onLongClick(View view) {
if (model.mResult.success()) { if (model.mResult.success()) {
displayBottomSheet(model.mResult, idx); displayBottomSheet(model.mResult, idx);
return true;
}
return false;
} }
}); });
fileHolder.vFile.setOnClickListener(new OnClickListener() { fileHolder.vFile.setOnClickListener(view -> {
@Override
public void onClick(View view) {
if (model.mResult.success()) { if (model.mResult.success()) {
displayWithViewIntent(model.mResult, idx, false, false); displayWithViewIntent(model.mResult, idx, false, false);
} }
}
}); });
} }
@@ -1036,31 +1024,21 @@ public class DecryptListFragment
if (sigResult != null) { if (sigResult != null) {
final long keyId = sigResult.getKeyId(); final long keyId = sigResult.getKeyId();
if (sigResult.getResult() != OpenPgpSignatureResult.RESULT_KEY_MISSING) { if (sigResult.getResult() != OpenPgpSignatureResult.RESULT_KEY_MISSING) {
holder.vSignatureLayout.setOnClickListener(new OnClickListener() { holder.vSignatureLayout.setOnClickListener(view -> {
@Override
public void onClick(View view) {
Activity activity = getActivity(); Activity activity = getActivity();
if (activity == null) { if (activity == null) {
return; return;
} }
Intent intent = ViewKeyActivity.getViewKeyActivityIntent(requireActivity(), keyId); Intent intent = ViewKeyActivity.getViewKeyActivityIntent(requireActivity(), keyId);
activity.startActivity(intent); activity.startActivity(intent);
}
}); });
} else { } else {
holder.vSignatureLayout.setOnClickListener(new OnClickListener() { holder.vSignatureLayout.setOnClickListener(view -> lookupUnknownKey(model.mInputUri, keyId));
@Override
public void onClick(View view) {
lookupUnknownKey(model.mInputUri, keyId);
}
});
} }
} }
holder.vContextMenu.setTag(model); holder.vContextMenu.setTag(model);
holder.vContextMenu.setOnClickListener(new OnClickListener() { holder.vContextMenu.setOnClickListener(view -> {
@Override
public void onClick(View view) {
Activity activity = getActivity(); Activity activity = getActivity();
if (activity == null) { if (activity == null) {
return; return;
@@ -1069,15 +1047,9 @@ public class DecryptListFragment
PopupMenu menu = new PopupMenu(activity, view); PopupMenu menu = new PopupMenu(activity, view);
menu.inflate(R.menu.decrypt_item_context_menu); menu.inflate(R.menu.decrypt_item_context_menu);
menu.setOnMenuItemClickListener(DecryptListFragment.this); menu.setOnMenuItemClickListener(DecryptListFragment.this);
menu.setOnDismissListener(new OnDismissListener() { menu.setOnDismissListener(popupMenu -> mMenuClickedModel = null);
@Override
public void onDismiss(PopupMenu popupMenu) {
mMenuClickedModel = null;
}
});
menu.getMenu().findItem(R.id.decrypt_delete).setEnabled(mCanDelete); menu.getMenu().findItem(R.id.decrypt_delete).setEnabled(mCanDelete);
menu.show(); menu.show();
}
}); });
} }
@@ -1086,9 +1058,7 @@ public class DecryptListFragment
holder.vErrorMsg.setText(model.mResult.getLog().getLast().mType.getMsgId()); holder.vErrorMsg.setText(model.mResult.getLog().getLast().mType.getMsgId());
holder.vErrorViewLog.setOnClickListener(new OnClickListener() { holder.vErrorViewLog.setOnClickListener(v -> {
@Override
public void onClick(View v) {
Activity activity = getActivity(); Activity activity = getActivity();
if (activity == null) { if (activity == null) {
return; return;
@@ -1096,7 +1066,6 @@ public class DecryptListFragment
Intent intent = new Intent(activity, LogDisplayActivity.class); Intent intent = new Intent(activity, LogDisplayActivity.class);
intent.putExtra(LogDisplayFragment.EXTRA_RESULT, model.mResult); intent.putExtra(LogDisplayFragment.EXTRA_RESULT, model.mResult);
activity.startActivity(intent); activity.startActivity(intent);
}
}); });
} }
@@ -1107,7 +1076,7 @@ public class DecryptListFragment
return mDataset.size(); return mDataset.size();
} }
public InputDataResult getItemResult(Uri uri) { InputDataResult getItemResult(Uri uri) {
ViewModel model = new ViewModel(uri); ViewModel model = new ViewModel(uri);
int pos = mDataset.indexOf(model); int pos = mDataset.indexOf(model);
if (pos == -1) { if (pos == -1) {
@@ -1131,16 +1100,11 @@ public class DecryptListFragment
notifyItemChanged(pos); notifyItemChanged(pos);
} }
public void setCancelled(final Uri uri, boolean isCancelled) { void setCancelled(final Uri uri, boolean isCancelled) {
ViewModel newModel = new ViewModel(uri); ViewModel newModel = new ViewModel(uri);
int pos = mDataset.indexOf(newModel); int pos = mDataset.indexOf(newModel);
if (isCancelled) { if (isCancelled) {
mDataset.get(pos).setCancelled(new OnClickListener() { mDataset.get(pos).setCancelled(v -> retryUri(uri));
@Override
public void onClick(View v) {
retryUri(uri);
}
});
} else { } else {
mDataset.get(pos).setCancelled(null); mDataset.get(pos).setCancelled(null);
} }
@@ -1162,7 +1126,7 @@ public class DecryptListFragment
notifyItemChanged(pos); notifyItemChanged(pos);
} }
public void resetItemData(Uri uri) { void resetItemData(Uri uri) {
ViewModel model = new ViewModel(uri); ViewModel model = new ViewModel(uri);
int pos = mDataset.indexOf(model); int pos = mDataset.indexOf(model);
model = mDataset.get(pos); model = mDataset.get(pos);
@@ -1207,12 +1171,14 @@ public class DecryptListFragment
public TextView vFilename; public TextView vFilename;
public TextView vFilesize; public TextView vFilesize;
public ImageView vThumbnail; public ImageView vThumbnail;
public ImageView vOverflowMenu;
public SubViewHolder(View itemView) { public SubViewHolder(View itemView) {
vFile = itemView.findViewById(R.id.file); vFile = itemView.findViewById(R.id.file);
vFilename = itemView.findViewById(R.id.filename); vFilename = itemView.findViewById(R.id.filename);
vFilesize = itemView.findViewById(R.id.filesize); vFilesize = itemView.findViewById(R.id.filesize);
vThumbnail = itemView.findViewById(R.id.thumbnail); vThumbnail = itemView.findViewById(R.id.thumbnail);
vOverflowMenu = itemView.findViewById(R.id.button_decryptfile_overflow);
} }
} }
@@ -1320,3 +1286,4 @@ public class DecryptListFragment
} }
} }

View File

@@ -52,4 +52,14 @@
</LinearLayout> </LinearLayout>
<ImageView
android:id="@+id/button_decryptfile_overflow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/ic_more_vert_black_24dp"
android:padding="6dp"
android:background="?selectableItemBackground"
/>
</LinearLayout> </LinearLayout>