diff --git a/src/main/java/org/quantumbadger/redreader/adapters/MainMenuListingManager.java b/src/main/java/org/quantumbadger/redreader/adapters/MainMenuListingManager.java index c2fa94d1d..fbe364bac 100644 --- a/src/main/java/org/quantumbadger/redreader/adapters/MainMenuListingManager.java +++ b/src/main/java/org/quantumbadger/redreader/adapters/MainMenuListingManager.java @@ -48,6 +48,7 @@ import org.quantumbadger.redreader.common.ScreenreaderPronunciation; import org.quantumbadger.redreader.common.SharedPrefsWrapper; import org.quantumbadger.redreader.common.UriString; +import org.quantumbadger.redreader.fragments.AddToMultiredditDialog; import org.quantumbadger.redreader.fragments.MainMenuFragment; import org.quantumbadger.redreader.receivers.announcements.Announcement; import org.quantumbadger.redreader.receivers.announcements.AnnouncementDownloader; @@ -117,7 +118,8 @@ public enum SubredditAction { UNPIN(R.string.unpin_subreddit), SUBSCRIBE(R.string.options_subscribe), UNSUBSCRIBE(R.string.options_unsubscribe), - EXTERNAL(R.string.action_external); + EXTERNAL(R.string.action_external), + ADD_TO_MULTIREDDIT(R.string.add_subreddit_to_multireddit); public final int descriptionResId; @@ -820,6 +822,13 @@ public static void showActionMenu( } } } + + if(itemPref.contains(SubredditAction.ADD_TO_MULTIREDDIT)) { + menu.add(new SubredditMenuItem( + activity, + R.string.add_subreddit_to_multireddit, + SubredditAction.ADD_TO_MULTIREDDIT)); + } } final String[] menuText = new String[menu.size()]; @@ -941,6 +950,11 @@ private static void onSubredditActionMenuItemSelected( Toast.LENGTH_SHORT).show(); } break; + + case ADD_TO_MULTIREDDIT: + + AddToMultiredditDialog.show(activity, subredditCanonicalId); + break; } } diff --git a/src/main/java/org/quantumbadger/redreader/common/Constants.java b/src/main/java/org/quantumbadger/redreader/common/Constants.java index 8b5d1d629..e8046ace7 100644 --- a/src/main/java/org/quantumbadger/redreader/common/Constants.java +++ b/src/main/java/org/quantumbadger/redreader/common/Constants.java @@ -147,6 +147,7 @@ public static final class Reddit { = "/subreddits/mine/moderator.json?limit=100"; public static final String PATH_SUBREDDITS_POPULAR = "/subreddits/popular.json"; public static final String PATH_MULTIREDDITS_MINE = "/api/multi/mine.json"; + public static final String PATH_MULTIREDDIT = "/api/multi"; public static final String PATH_COMMENTS = "/comments/"; public static final String PATH_ME = "/api/v1/me"; diff --git a/src/main/java/org/quantumbadger/redreader/fragments/AddToMultiredditDialog.java b/src/main/java/org/quantumbadger/redreader/fragments/AddToMultiredditDialog.java new file mode 100644 index 000000000..004c136a5 --- /dev/null +++ b/src/main/java/org/quantumbadger/redreader/fragments/AddToMultiredditDialog.java @@ -0,0 +1,162 @@ +/******************************************************************************* + * This file is part of RedReader. + * + * RedReader is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RedReader is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RedReader. If not, see . + ******************************************************************************/ + +package org.quantumbadger.redreader.fragments; + +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; + +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +import org.quantumbadger.redreader.R; +import org.quantumbadger.redreader.account.RedditAccountManager; +import org.quantumbadger.redreader.cache.CacheManager; +import org.quantumbadger.redreader.common.RRError; +import org.quantumbadger.redreader.common.TimestampBound; +import org.quantumbadger.redreader.reddit.APIResponseHandler; +import org.quantumbadger.redreader.reddit.RedditAPI; +import org.quantumbadger.redreader.reddit.api.RedditMultiredditSubscriptionManager; +import org.quantumbadger.redreader.reddit.things.SubredditCanonicalId; +import org.quantumbadger.redreader.views.liststatus.ErrorView; + +import java.util.ArrayList; +import java.util.Collections; + +public class AddToMultiredditDialog { + + private final static String TAG = "AddToMultiredditDialog"; + + public static void show( + final AppCompatActivity activity, + final SubredditCanonicalId subredditCanonicalId) { + + final MaterialAlertDialogBuilder alertBuilder + = new MaterialAlertDialogBuilder(activity); + + final View root = activity.getLayoutInflater().inflate( + R.layout.add_to_multireddit, + null); + + final RedditMultiredditSubscriptionManager multiredditManager + = RedditMultiredditSubscriptionManager.getSingleton( + activity, + RedditAccountManager.getInstance(activity).getDefaultAccount()); + + final ArrayList multireddits = multiredditManager.getSubscriptionList(); + Collections.sort(multireddits); + + final ArrayAdapter autocompleteAdapter = new ArrayAdapter<>( + activity, + android.R.layout.simple_dropdown_item_1line, + multireddits); + + final AutoCompleteTextView editText + = root.findViewById(R.id.selected_multireddit); + editText.setAdapter(autocompleteAdapter); + + alertBuilder.setView(root); + + alertBuilder.setNegativeButton(R.string.dialog_cancel, null); + + alertBuilder.setPositiveButton( + R.string.dialog_go, + (dialog, which) -> addToMultireddit(activity, editText, subredditCanonicalId)); + + final AlertDialog alertDialog = alertBuilder.create(); + + editText.setOnEditorActionListener((v, actionId, event) -> { + if(actionId == EditorInfo.IME_ACTION_GO + || event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { + addToMultireddit(activity, editText, subredditCanonicalId); + alertDialog.dismiss(); + } + return false; + }); + + alertDialog.getWindow() + .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE + | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); + alertDialog.show(); + } + + private static void addToMultireddit( + final AppCompatActivity activity, + final AutoCompleteTextView editText, + final SubredditCanonicalId subredditCanonicalId) { + + final String multiredditName = editText.getText() + .toString() + .trim() + .replace(" ", ""); + final String subredditName = subredditCanonicalId.getDisplayNameLowercase(); + + RedditAPI.addSubredditToMultireddit( + CacheManager.getInstance(activity), + new APIResponseHandler.ActionResponseHandler(activity) { + + @Override + protected void onCallbackException(final Throwable t) { + Log.e( + TAG, "Error while adding subreddit to multireddit", t); + throw new RuntimeException(t); + } + + @Override + protected void onFailure(@NonNull final RRError error) { + activity.runOnUiThread(() -> { + final MaterialAlertDialogBuilder builder + = new MaterialAlertDialogBuilder(activity); + builder.setView(new ErrorView(activity, error)); + builder.create().show(); + }); + } + + @Override + protected void onSuccess() { + activity.runOnUiThread(() -> Toast.makeText( + activity, + String.format("Added %s to %s", subredditName, multiredditName), + Toast.LENGTH_SHORT).show()); + RedditMultiredditSubscriptionManager.getSingleton( + activity, + RedditAccountManager + .getInstance(activity).getDefaultAccount()) + .triggerUpdate(null, TimestampBound.NONE); + } + }, + RedditAccountManager.getInstance(activity).getDefaultAccount(), + multiredditName, + subredditName, + activity + ); + + Toast.makeText( + activity, + String.format("Adding %s to %s", subredditName, multiredditName), + Toast.LENGTH_SHORT).show(); + } +} diff --git a/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java b/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java index 51199ddce..94ea0bf46 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java @@ -25,6 +25,7 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; +import org.json.JSONObject; import org.quantumbadger.redreader.account.RedditAccount; import org.quantumbadger.redreader.activities.BugReportActivity; import org.quantumbadger.redreader.cache.CacheManager; @@ -65,6 +66,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -959,6 +961,35 @@ public void onFailure(@NonNull final RRError error) { )); } + public static void addSubredditToMultireddit( + final CacheManager cm, + final APIResponseHandler.ActionResponseHandler handler, + final RedditAccount user, + final String multiredditName, + final String subredditName, + final Context context) { + + final Uri.Builder builder = Constants.Reddit.getUriBuilder( + Constants.Reddit.PATH_MULTIREDDIT) + .appendPath("user") + .appendPath(user.username) + .appendPath("m") + .appendPath(multiredditName) + .appendPath("r") + .appendPath(subredditName); + + final Map jsonData = new HashMap<>(); + jsonData.put("name", subredditName); + + cm.makeRequest(createPutRequest( + UriString.from(builder.build()), + user, + new ArrayList<>(Collections.singleton( + new PostField("model", new JSONObject(jsonData).toString()))), + context, + new GenericResponseHandler(handler))); + } + @Nullable private static APIResponseHandler.APIFailureType findFailureType(final JsonValue response) { diff --git a/src/main/res/layout/add_to_multireddit.xml b/src/main/res/layout/add_to_multireddit.xml new file mode 100644 index 000000000..00f516367 --- /dev/null +++ b/src/main/res/layout/add_to_multireddit.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + diff --git a/src/main/res/values/arrays.xml b/src/main/res/values/arrays.xml index 9d3502316..96b5fc1e5 100644 --- a/src/main/res/values/arrays.xml +++ b/src/main/res/values/arrays.xml @@ -495,6 +495,7 @@ @string/pin_subreddit @string/options_subscribe @string/block_subreddit + @string/add_subreddit_to_multireddit @@ -505,6 +506,7 @@ pin subscribe block + add_to_multireddit diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index fce1e1d34..7e8918616 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -1908,4 +1908,6 @@ Reddit says that you are not logged in or have provided invalid credentials. Bad Request Reddit says that you have submitted something invalid. + + Add to New or Existing Multireddit