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