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,23 +496,20 @@ 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 switch (item.getItemId()) {
public boolean onMenuItemClick(MenuItem item) { case R.id.decrypt_open:
switch (item.getItemId()) { displayWithViewIntent(result, index, false, true);
case R.id.decrypt_open: break;
displayWithViewIntent(result, index, false, true); case R.id.decrypt_share:
break; displayWithViewIntent(result, index, true, true);
case R.id.decrypt_share: break;
displayWithViewIntent(result, index, true, true); case R.id.decrypt_save:
break; // only inside the menu xml for Android >= 4.4
case R.id.decrypt_save: saveFileDialog(result, index);
// only inside the menu xml for Android >= 4.4 break;
saveFileDialog(result, index);
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,23 +1005,16 @@ 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 if (model.mResult.success()) {
public void onClick(View view) { displayWithViewIntent(model.mResult, idx, false, false);
if (model.mResult.success()) {
displayWithViewIntent(model.mResult, idx, false, false);
}
} }
}); });
@@ -1036,48 +1024,32 @@ 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 Activity activity = getActivity();
public void onClick(View view) { if (activity == null) {
Activity activity = getActivity(); return;
if (activity == null) {
return;
}
Intent intent = ViewKeyActivity.getViewKeyActivityIntent(requireActivity(), keyId);
activity.startActivity(intent);
} }
Intent intent = ViewKeyActivity.getViewKeyActivityIntent(requireActivity(), keyId);
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 Activity activity = getActivity();
public void onClick(View view) { if (activity == null) {
Activity activity = getActivity(); return;
if (activity == null) {
return;
}
mMenuClickedModel = model;
PopupMenu menu = new PopupMenu(activity, view);
menu.inflate(R.menu.decrypt_item_context_menu);
menu.setOnMenuItemClickListener(DecryptListFragment.this);
menu.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(PopupMenu popupMenu) {
mMenuClickedModel = null;
}
});
menu.getMenu().findItem(R.id.decrypt_delete).setEnabled(mCanDelete);
menu.show();
} }
mMenuClickedModel = model;
PopupMenu menu = new PopupMenu(activity, view);
menu.inflate(R.menu.decrypt_item_context_menu);
menu.setOnMenuItemClickListener(DecryptListFragment.this);
menu.setOnDismissListener(popupMenu -> mMenuClickedModel = null);
menu.getMenu().findItem(R.id.decrypt_delete).setEnabled(mCanDelete);
menu.show();
}); });
} }
@@ -1086,17 +1058,14 @@ 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 Activity activity = getActivity();
public void onClick(View v) { if (activity == null) {
Activity activity = getActivity(); return;
if (activity == null) {
return;
}
Intent intent = new Intent(activity, LogDisplayActivity.class);
intent.putExtra(LogDisplayFragment.EXTRA_RESULT, model.mResult);
activity.startActivity(intent);
} }
Intent intent = new Intent(activity, LogDisplayActivity.class);
intent.putExtra(LogDisplayFragment.EXTRA_RESULT, model.mResult);
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>