Skip to content

Commit 9a4d736

Browse files
committed
Create 'Add to Multireddit' action for subreddits
1 parent 0e8f4a8 commit 9a4d736

File tree

5 files changed

+234
-1
lines changed

5 files changed

+234
-1
lines changed

Diff for: src/main/java/org/quantumbadger/redreader/adapters/MainMenuListingManager.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.quantumbadger.redreader.common.ScreenreaderPronunciation;
4949
import org.quantumbadger.redreader.common.SharedPrefsWrapper;
5050
import org.quantumbadger.redreader.common.UriString;
51+
import org.quantumbadger.redreader.fragments.AddToMultiredditDialog;
5152
import org.quantumbadger.redreader.fragments.MainMenuFragment;
5253
import org.quantumbadger.redreader.receivers.announcements.Announcement;
5354
import org.quantumbadger.redreader.receivers.announcements.AnnouncementDownloader;
@@ -117,7 +118,8 @@ public enum SubredditAction {
117118
UNPIN(R.string.unpin_subreddit),
118119
SUBSCRIBE(R.string.options_subscribe),
119120
UNSUBSCRIBE(R.string.options_unsubscribe),
120-
EXTERNAL(R.string.action_external);
121+
EXTERNAL(R.string.action_external),
122+
ADD_TO_MULTIREDDIT(R.string.add_subreddit_to_multireddit);
121123

122124
public final int descriptionResId;
123125

@@ -820,6 +822,13 @@ public static void showActionMenu(
820822
}
821823
}
822824
}
825+
826+
if(itemPref.contains(SubredditAction.ADD_TO_MULTIREDDIT)) {
827+
menu.add(new SubredditMenuItem(
828+
activity,
829+
R.string.add_subreddit_to_multireddit,
830+
SubredditAction.ADD_TO_MULTIREDDIT));
831+
}
823832
}
824833

825834
final String[] menuText = new String[menu.size()];
@@ -941,6 +950,11 @@ private static void onSubredditActionMenuItemSelected(
941950
Toast.LENGTH_SHORT).show();
942951
}
943952
break;
953+
954+
case ADD_TO_MULTIREDDIT:
955+
956+
AddToMultiredditDialog.show(activity, subredditCanonicalId);
957+
break;
944958
}
945959
}
946960

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
/*******************************************************************************
2+
* This file is part of RedReader.
3+
*
4+
* RedReader is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* RedReader is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with RedReader. If not, see <http://www.gnu.org/licenses/>.
16+
******************************************************************************/
17+
18+
package org.quantumbadger.redreader.fragments;
19+
20+
import android.util.Log;
21+
import android.view.KeyEvent;
22+
import android.view.View;
23+
import android.view.WindowManager;
24+
import android.view.inputmethod.EditorInfo;
25+
import android.widget.ArrayAdapter;
26+
import android.widget.AutoCompleteTextView;
27+
import android.widget.Toast;
28+
29+
import androidx.annotation.NonNull;
30+
import androidx.appcompat.app.AlertDialog;
31+
import androidx.appcompat.app.AppCompatActivity;
32+
33+
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
34+
35+
import org.quantumbadger.redreader.R;
36+
import org.quantumbadger.redreader.account.RedditAccountManager;
37+
import org.quantumbadger.redreader.cache.CacheManager;
38+
import org.quantumbadger.redreader.common.RRError;
39+
import org.quantumbadger.redreader.common.TimestampBound;
40+
import org.quantumbadger.redreader.reddit.APIResponseHandler;
41+
import org.quantumbadger.redreader.reddit.RedditAPI;
42+
import org.quantumbadger.redreader.reddit.api.RedditMultiredditSubscriptionManager;
43+
import org.quantumbadger.redreader.reddit.things.SubredditCanonicalId;
44+
import org.quantumbadger.redreader.views.liststatus.ErrorView;
45+
46+
import java.util.ArrayList;
47+
import java.util.Collections;
48+
49+
public class AddToMultiredditDialog {
50+
51+
private final static String TAG = "AddToMultiredditDialog";
52+
53+
public static void show(
54+
final AppCompatActivity activity,
55+
final SubredditCanonicalId subredditCanonicalId) {
56+
57+
final MaterialAlertDialogBuilder alertBuilder
58+
= new MaterialAlertDialogBuilder(activity);
59+
60+
final View root = activity.getLayoutInflater().inflate(
61+
R.layout.add_to_multireddit,
62+
null);
63+
64+
final RedditMultiredditSubscriptionManager multiredditManager
65+
= RedditMultiredditSubscriptionManager.getSingleton(
66+
activity,
67+
RedditAccountManager.getInstance(activity).getDefaultAccount());
68+
69+
final ArrayList<String> multireddits = multiredditManager.getSubscriptionList();
70+
Collections.sort(multireddits);
71+
72+
final ArrayAdapter<String> autocompleteAdapter = new ArrayAdapter<>(
73+
activity,
74+
android.R.layout.simple_dropdown_item_1line,
75+
multireddits);
76+
77+
final AutoCompleteTextView editText
78+
= root.findViewById(R.id.selected_multireddit);
79+
editText.setAdapter(autocompleteAdapter);
80+
81+
alertBuilder.setView(root);
82+
83+
alertBuilder.setNegativeButton(R.string.dialog_cancel, null);
84+
85+
alertBuilder.setPositiveButton(
86+
R.string.dialog_go,
87+
(dialog, which) -> addToMultireddit(activity, editText, subredditCanonicalId));
88+
89+
final AlertDialog alertDialog = alertBuilder.create();
90+
91+
editText.setOnEditorActionListener((v, actionId, event) -> {
92+
if(actionId == EditorInfo.IME_ACTION_GO
93+
|| event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
94+
addToMultireddit(activity, editText, subredditCanonicalId);
95+
alertDialog.dismiss();
96+
}
97+
return false;
98+
});
99+
100+
alertDialog.getWindow()
101+
.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE
102+
| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
103+
alertDialog.show();
104+
}
105+
106+
private static void addToMultireddit(
107+
final AppCompatActivity activity,
108+
final AutoCompleteTextView editText,
109+
final SubredditCanonicalId subredditCanonicalId) {
110+
111+
final String multiredditName = editText.getText()
112+
.toString()
113+
.trim()
114+
.replace(" ", "");
115+
final String subredditName = subredditCanonicalId.getDisplayNameLowercase();
116+
117+
RedditAPI.addSubredditToMultireddit(
118+
CacheManager.getInstance(activity),
119+
new APIResponseHandler.ActionResponseHandler(activity) {
120+
121+
@Override
122+
protected void onCallbackException(final Throwable t) {
123+
Log.e(
124+
TAG, "Error while adding subreddit to multireddit", t);
125+
throw new RuntimeException(t);
126+
}
127+
128+
@Override
129+
protected void onFailure(@NonNull final RRError error) {
130+
activity.runOnUiThread(() -> {
131+
final MaterialAlertDialogBuilder builder
132+
= new MaterialAlertDialogBuilder(activity);
133+
builder.setView(new ErrorView(activity, error));
134+
builder.create().show();
135+
});
136+
}
137+
138+
@Override
139+
protected void onSuccess() {
140+
activity.runOnUiThread(() -> Toast.makeText(
141+
activity,
142+
String.format("Added %s to %s", subredditName, multiredditName),
143+
Toast.LENGTH_SHORT).show());
144+
RedditMultiredditSubscriptionManager.getSingleton(
145+
activity,
146+
RedditAccountManager
147+
.getInstance(activity).getDefaultAccount())
148+
.triggerUpdate(null, TimestampBound.NONE);
149+
}
150+
},
151+
RedditAccountManager.getInstance(activity).getDefaultAccount(),
152+
multiredditName,
153+
subredditName,
154+
activity
155+
);
156+
157+
Toast.makeText(
158+
activity,
159+
String.format("Adding %s to %s", subredditName, multiredditName),
160+
Toast.LENGTH_SHORT).show();
161+
}
162+
}

Diff for: src/main/res/layout/add_to_multireddit.xml

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<!--
4+
~ This file is part of RedReader.
5+
~
6+
~ RedReader is free software: you can redistribute it and/or modify
7+
~ it under the terms of the GNU General Public License as published by
8+
~ the Free Software Foundation, either version 3 of the License, or
9+
~ (at your option) any later version.
10+
~
11+
~ RedReader is distributed in the hope that it will be useful,
12+
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
~ GNU General Public License for more details.
15+
~
16+
~ You should have received a copy of the GNU General Public License
17+
~ along with RedReader. If not, see <http://www.gnu.org/licenses/>.
18+
-->
19+
20+
<LinearLayout
21+
xmlns:android="http://schemas.android.com/apk/res/android"
22+
xmlns:tools="http://schemas.android.com/tools"
23+
android:id="@+id/add_to_multireddit_root"
24+
android:layout_width="match_parent"
25+
android:layout_height="wrap_content"
26+
android:orientation="vertical">
27+
28+
<TextView
29+
android:id="@+id/add_to_multireddit_header"
30+
android:layout_width="match_parent"
31+
android:layout_height="wrap_content"
32+
android:layout_marginLeft="8dp"
33+
android:layout_marginRight="8dp"
34+
android:layout_marginTop="16dp"
35+
android:text="@string/add_subreddit_to_multireddit" />
36+
37+
<AutoCompleteTextView
38+
android:id="@+id/selected_multireddit"
39+
android:layout_width="match_parent"
40+
android:layout_height="wrap_content"
41+
android:layout_marginBottom="16dp"
42+
android:layout_marginLeft="16dp"
43+
android:layout_marginRight="16dp"
44+
android:layout_marginTop="16dp"
45+
android:inputType="textNoSuggestions"
46+
android:imeOptions="actionGo"
47+
android:completionThreshold="1"
48+
tools:ignore="LabelFor">
49+
50+
<requestFocus/>
51+
</AutoCompleteTextView>
52+
53+
</LinearLayout>

Diff for: src/main/res/values/arrays.xml

+2
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,7 @@
495495
<item>@string/pin_subreddit</item>
496496
<item>@string/options_subscribe</item>
497497
<item>@string/block_subreddit</item>
498+
<item>@string/add_subreddit_to_multireddit</item>
498499
</string-array>
499500

500501
<!-- Constants. Do not change. -->
@@ -505,6 +506,7 @@
505506
<item>pin</item>
506507
<item>subscribe</item>
507508
<item>block</item>
509+
<item>add_to_multireddit</item>
508510
</string-array>
509511

510512
<string-array name="pref_menus_subreddit_context_items_default">

Diff for: src/main/res/values/strings.xml

+2
Original file line numberDiff line numberDiff line change
@@ -1908,4 +1908,6 @@
19081908
<string name="error_401_message">Reddit says that you are not logged in or have provided invalid credentials.</string>
19091909
<string name="error_400_title">Bad Request</string>
19101910
<string name="error_400_message">Reddit says that you have submitted something invalid.</string>
1911+
1912+
<string name="add_subreddit_to_multireddit">Add to New or Existing Multireddit</string>
19111913
</resources>

0 commit comments

Comments
 (0)