diff --git a/library/src/main/java/candybar/lib/adapters/RequestAdapter.java b/library/src/main/java/candybar/lib/adapters/RequestAdapter.java index 7eb5fc9d9..cf595e881 100644 --- a/library/src/main/java/candybar/lib/adapters/RequestAdapter.java +++ b/library/src/main/java/candybar/lib/adapters/RequestAdapter.java @@ -211,7 +211,14 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { R.string.request_not_available)); } - if (!mRequests.get(finalPosition).isAvailableForRequest()) { + if (mRequests.get(finalPosition).isRequested() && !mContext.getResources().getBoolean(R.bool.enable_icon_request_multiple)) { + // This icon was requested before and we do not allow multi-requests, so we + // keep it visually enabled in the list but disable the checkbox + contentViewHolder.content.setAlpha(1f); + contentViewHolder.title.setAlpha(1f); + contentViewHolder.icon.setAlpha(1f); + contentViewHolder.checkbox.setEnabled(false); + } else if (!mRequests.get(finalPosition).isAvailableForRequest()) { contentViewHolder.content.setAlpha(0.5f); contentViewHolder.title.setAlpha(0.5f); contentViewHolder.icon.setAlpha(0.5f); @@ -366,6 +373,11 @@ public void onClick(View view) { } } + public interface ToggleResultListener { + void onPositiveResult(); + void onNegativeResult(); + } + private class ContentViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { private final TextView title; @@ -424,9 +436,17 @@ public void onClick(View view) { if (id == R.id.container) { int position = mShowPremiumRequest || mShowRegularRequestLimit ? getBindingAdapterPosition() - 1 : getBindingAdapterPosition(); - if (toggleSelection(position)) { - checkbox.toggle(); - } + toggleSelection(position, new ToggleResultListener() { + @Override public void onPositiveResult() { + checkbox.toggle(); + try { + RequestListener listener = (RequestListener) mContext; + listener.onRequestSelected(getSelectedItemsSize()); + } catch (Exception ignored) { + } + } + @Override public void onNegativeResult() { /* Do nothing */ } + }); } } @@ -436,10 +456,18 @@ public boolean onLongClick(View view) { if (id == R.id.container) { int position = mShowPremiumRequest || mShowRegularRequestLimit ? getBindingAdapterPosition() - 1 : getBindingAdapterPosition(); - if (toggleSelection(position)) { - checkbox.toggle(); - return true; - } + toggleSelection(position, new ToggleResultListener() { + @Override public void onPositiveResult() { + checkbox.toggle(); + try { + RequestListener listener = (RequestListener) mContext; + listener.onRequestSelected(getSelectedItemsSize()); + } catch (Exception ignored) { + } + } + @Override public void onNegativeResult() { /* Do nothing */ } + }); + return true; } return false; } @@ -468,11 +496,46 @@ private StaggeredGridLayoutManager.LayoutParams getLayoutParams(@Nullable View v return null; } - private boolean toggleSelection(int position) { + private void toggleSelection(int position, ToggleResultListener toggleListener) { if (position >= 0 && position < mRequests.size()) { - if (mSelectedItems.get(position, false)) + boolean isSelected = mSelectedItems.get(position, false); + boolean isRequested = mRequests.get(position).isRequested(); + boolean isDuplicateRequestAllowed = mContext.getResources().getBoolean(R.bool.enable_icon_request_multiple); + + if (isSelected) { mSelectedItems.delete(position); - else if (!mRequests.get(position).isAvailableForRequest()) { + toggleListener.onPositiveResult(); + } else if (isRequested) { + if (isDuplicateRequestAllowed) { + // Icon was already requested but re-request is allowed + // Ask user if they really want to re-request the icon + new MaterialDialog.Builder(mContext) + .typeface(TypefaceHelper.getMedium(mContext), TypefaceHelper.getRegular(mContext)) + .title(R.string.request_already_requested) + .content(R.string.request_requested_possible) + .cancelable(false) + .canceledOnTouchOutside(false) + .negativeText(R.string.request_requested_button_cancel) + .onNegative((dialog, which) -> toggleListener.onNegativeResult()) + .positiveText(R.string.request_requested_button_confirm) + .onPositive((dialog, which) -> { + mSelectedItems.put(position, true); + toggleListener.onPositiveResult(); + }) + .show(); + } else { + // Re-requesting icons is not allowed + toggleListener.onNegativeResult(); + new MaterialDialog.Builder(mContext) + .typeface(TypefaceHelper.getMedium(mContext), TypefaceHelper.getRegular(mContext)) + .title(R.string.request_not_available) + .content(R.string.request_requested) + .negativeText(R.string.request_requested_button_cancel) + .show(); + } + } else if (!mRequests.get(position).isAvailableForRequest()) { + // Icon is not available for request + toggleListener.onNegativeResult(); if (!mRequests.get(position).getInfoText().isEmpty()) { new MaterialDialog.Builder(mContext) .typeface(TypefaceHelper.getMedium(mContext), TypefaceHelper.getRegular(mContext)) @@ -481,18 +544,14 @@ else if (!mRequests.get(position).isAvailableForRequest()) { .positiveText(android.R.string.yes) .show(); } - return false; } else { + // If nothing prevents us from reaching this point, we can select the icon mSelectedItems.put(position, true); + toggleListener.onPositiveResult(); } - try { - RequestListener listener = (RequestListener) mContext; - listener.onRequestSelected(getSelectedItemsSize()); - return true; - } catch (Exception ignored) { - } + } else { + toggleListener.onNegativeResult(); } - return false; } public boolean selectAll() { diff --git a/library/src/main/java/candybar/lib/fragments/RequestFragment.java b/library/src/main/java/candybar/lib/fragments/RequestFragment.java index c27211506..e06b613e1 100644 --- a/library/src/main/java/candybar/lib/fragments/RequestFragment.java +++ b/library/src/main/java/candybar/lib/fragments/RequestFragment.java @@ -229,11 +229,6 @@ public void onClick(View view) { int selected = mAdapter.getSelectedItemsSize(); if (selected > 0) { - if (mAdapter.isContainsRequested()) { - RequestHelper.showAlreadyRequestedDialog(requireActivity()); - return; - } - boolean requestLimit = getResources().getBoolean( R.bool.enable_icon_request_limit); boolean iconRequest = getResources().getBoolean( diff --git a/library/src/main/java/candybar/lib/helpers/RequestHelper.java b/library/src/main/java/candybar/lib/helpers/RequestHelper.java index 0423d3b30..8345e9f48 100644 --- a/library/src/main/java/candybar/lib/helpers/RequestHelper.java +++ b/library/src/main/java/candybar/lib/helpers/RequestHelper.java @@ -403,15 +403,6 @@ public static List getMissingApps(@NonNull Context context) { return requests; } - public static void showAlreadyRequestedDialog(@NonNull Context context) { - new MaterialDialog.Builder(context) - .typeface(TypefaceHelper.getMedium(context), TypefaceHelper.getRegular(context)) - .title(R.string.request_title) - .content(R.string.request_requested) - .positiveText(R.string.close) - .show(); - } - public static void showIconRequestLimitDialog(@NonNull Context context) { boolean reset = context.getResources().getBoolean(R.bool.reset_icon_request_limit); int limit = context.getResources().getInteger(R.integer.icon_request_limit); diff --git a/library/src/main/res/values/dashboard_configurations.xml b/library/src/main/res/values/dashboard_configurations.xml index 3bd9ca3e4..9b9c53f94 100644 --- a/library/src/main/res/values/dashboard_configurations.xml +++ b/library/src/main/res/values/dashboard_configurations.xml @@ -162,6 +162,12 @@ The number of icon a user can request should be specified in the "icon_request_limit" section --> false + + false +