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:
@@ -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
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
Reference in New Issue
Block a user