Skip to content

Commit

Permalink
Merge pull request #160 from moertel/allow-re-requesting-icons
Browse files Browse the repository at this point in the history
Add support for re-requesting icons
  • Loading branch information
sarsamurmu authored Jan 20, 2024
2 parents a918427 + fc003fd commit 10df452
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 35 deletions.
97 changes: 78 additions & 19 deletions library/src/main/java/candybar/lib/adapters/RequestAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 */ }
});
}
}

Expand All @@ -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;
}
Expand Down Expand Up @@ -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))
Expand All @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
9 changes: 0 additions & 9 deletions library/src/main/java/candybar/lib/helpers/RequestHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -403,15 +403,6 @@ public static List<Request> 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);
Expand Down
6 changes: 6 additions & 0 deletions library/src/main/res/values/dashboard_configurations.xml
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,12 @@
The number of icon a user can request should be specified in the "icon_request_limit" section -->
<bool name="enable_icon_request_limit">false</bool>

<!-- Enable multiple requests for same icon
When enabled, users will be able to request the same icon twice. This can be useful if you
offer free and premium requests, so a free request doesn't prevent the user from submitting
a premium request for the same icon. Can also be useful for a voting system. -->
<bool name="enable_icon_request_multiple">false</bool>

<!-- Limit the numbers of icon a user can request
IGNORE if "enable_icon_request_limit" option is disabled
ex: If you set icon request limit to 10, a user will able to request only 10 icons in total
Expand Down
6 changes: 4 additions & 2 deletions library/src/main/res/values/dashboard_strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -209,8 +209,10 @@
<string name="request_fetching_data">Fetching latest data …</string>
<string name="request_build_failed">Unable to build icon request</string>
<string name="request_appfilter_failed">Unable to read appfilter.xml</string>
<string name="request_requested">Please check your request again.
Because you are trying to request app that was already requested.</string>
<string name="request_requested">You already requested this icon and cannot request it again.</string>
<string name="request_requested_possible">You already requested this icon. Are you sure you want to spend another request on it?</string>
<string name="request_requested_button_cancel">Go back</string>
<string name="request_requested_button_confirm">Select anyway</string>
<string name="request_email_client">Choose the app you want to use to send the icon request</string>
<string name="request_app_disabled">You\'re using an older version of this icon pack. The requested icons may be included in the latest version. Please update your app to latest version to request icons.</string>
<string name="connection_error_long">Unable to load data from server. Please, check your network connection.</string>
Expand Down

0 comments on commit 10df452

Please sign in to comment.