Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ public static final class Reddit {
public static final String PATH_MULTIREDDITS_MINE = "/api/multi/mine.json";
public static final String PATH_COMMENTS = "/comments/";
public static final String PATH_ME = "/api/v1/me";
public static final String PATH_MULTIREDDIT = "/api/multi";


public static String getScheme() {
return SCHEME_HTTPS;
Expand Down
8 changes: 7 additions & 1 deletion src/main/java/org/quantumbadger/redreader/common/General.kt
Original file line number Diff line number Diff line change
Expand Up @@ -308,9 +308,15 @@ object General {
if(status == 404) {
title = R.string.error_404_title
message = R.string.error_404_message
} else {
} else if (status == 403) {
title = R.string.error_403_title
message = R.string.error_403_message
} else if (status == 401) {
title = R.string.error_401_title
message = R.string.error_401_message
} else {
title = R.string.error_400_title
message = R.string.error_400_message
}
}
}
Expand Down
19 changes: 19 additions & 0 deletions src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import org.quantumbadger.redreader.reddit.PostSort;
import org.quantumbadger.redreader.reddit.UserCommentSort;
import org.quantumbadger.redreader.reddit.api.RedditAPICommentAction;
import org.quantumbadger.redreader.reddit.api.RedditAPISubredditCombinationAction;
import org.quantumbadger.redreader.reddit.api.RedditPostActions;
import org.quantumbadger.redreader.reddit.things.InvalidSubredditNameException;
import org.quantumbadger.redreader.reddit.things.SubredditCanonicalId;
Expand Down Expand Up @@ -1789,6 +1790,24 @@ public static String pref_reddit_client_id_override() {
return valueTrimmed;
}

public static EnumSet<RedditAPISubredditCombinationAction.SubredditCombinationAction>
pref_menus_subreddit_combination_context_items() {
final Set<String> strings = getStringSet(
R.string.pref_menus_subreddit_combinations_context_items_key,
R.array.pref_menus_subreddit_combinations_context_items_return);

final EnumSet<RedditAPISubredditCombinationAction.SubredditCombinationAction> result
= EnumSet.noneOf(
RedditAPISubredditCombinationAction.SubredditCombinationAction.class);

for(final String s : strings) {
result.add(RedditAPISubredditCombinationAction.SubredditCombinationAction.valueOf(
StringUtils.asciiUppercase(s)));
}

return result;
}

private static final String REDDIT_USER_AGREEMENT_PREF = "accepted_reddit_user_agreement";
private static final int REDDIT_USER_AGREEMENT_DECLINED = -1;
private static final int REDDIT_USER_AGREEMENT_APRIL_2023 = 1;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
/*******************************************************************************
* 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 <http://www.gnu.org/licenses/>.
******************************************************************************/

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.EditText;
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.RedditAccount;
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.views.liststatus.ErrorView;

import java.util.List;

public class CreateMultiredditDialog {

private final static String TAG = "CreateMultiredditDialog";

public static void show(
final AppCompatActivity activity,
final List<String> subredditNames,
final RedditAccount user) {

final MaterialAlertDialogBuilder alertBuilder
= new MaterialAlertDialogBuilder(activity);

final View root = activity.getLayoutInflater().inflate(
R.layout.create_multireddit,
null);

final EditText editText
= root.findViewById(R.id.selected_multireddit);

alertBuilder.setView(root);

alertBuilder.setNegativeButton(R.string.dialog_cancel, null);

alertBuilder.setPositiveButton(
R.string.dialog_go,
(dialog, which) -> createMultireddit(activity, subredditNames, user, editText));

final AlertDialog alertDialog = alertBuilder.create();

editText.setOnEditorActionListener((v, actionId, event) -> {
if(actionId == EditorInfo.IME_ACTION_GO
|| event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
createMultireddit(activity, subredditNames, user, editText);
alertDialog.dismiss();
}
return false;
});

alertDialog.getWindow()
.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE
| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
alertDialog.show();
}

private static void createMultireddit(
final AppCompatActivity activity,
final List<String> subredditNames,
final RedditAccount user,
final EditText editText) {

final String multiredditName = editText.getText()
.toString()
.trim()
.replace(" ", "");

RedditAPI.createMultireddit(
CacheManager.getInstance(activity),
new APIResponseHandler.ActionResponseHandler(activity) {

@Override
protected void onCallbackException(final Throwable t) {
Log.e(
TAG, "Error while creating 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("Created %s", multiredditName),
Toast.LENGTH_SHORT).show());

RedditMultiredditSubscriptionManager.getSingleton(
activity,
RedditAccountManager.getInstance(activity).getDefaultAccount())
.triggerUpdate(null, TimestampBound.NONE);
}
},
user,
multiredditName,
subredditNames,
activity
);

Toast.makeText(
activity,
String.format("Creating %s", multiredditName),
Toast.LENGTH_SHORT).show();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
import org.quantumbadger.redreader.reddit.PostSort;
import org.quantumbadger.redreader.reddit.RedditPostListItem;
import org.quantumbadger.redreader.reddit.RedditSubredditManager;
import org.quantumbadger.redreader.reddit.api.RedditAPISubredditCombinationAction;
import org.quantumbadger.redreader.reddit.api.RedditSubredditSubscriptionManager;
import org.quantumbadger.redreader.reddit.kthings.JsonUtils;
import org.quantumbadger.redreader.reddit.kthings.MaybeParseError;
Expand Down Expand Up @@ -101,6 +102,7 @@
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
Expand Down Expand Up @@ -292,7 +294,6 @@ public void onScrolled(

case FRONTPAGE:
case ALL:
case SUBREDDIT_COMBINATION:
case ALL_SUBTRACTION:
case POPULAR:
setHeader(
Expand All @@ -302,6 +303,12 @@ public void onScrolled(
CacheManager.getInstance(context).makeRequest(mRequest);
break;

case SUBREDDIT_COMBINATION:
setSubredditCombinationHeader(
mPostListingURL.humanReadableName(getActivity(), true),
mPostListingURL.humanReadableUrl(),
subredditPostListURL.subredditNames());

case RANDOM:
case SUBREDDIT: {

Expand Down Expand Up @@ -492,6 +499,28 @@ private void setHeader(
}
}

private void setSubredditCombinationHeader(
@NonNull final String title,
@NonNull final String subtitle,
@NonNull final List<String> subredditNames) {

final PostListingHeader postListingHeader = new PostListingHeader(
getActivity(),
title,
subtitle,
mPostListingURL,
null);

setHeader(postListingHeader);

postListingHeader.setOnLongClickListener(view -> {
RedditAPISubredditCombinationAction.showActionMenu(
getActivity(),
subredditNames);
return true;
});
}

private void setHeader(final View view) {
getActivity().runOnUiThread(() -> mPostListingManager.addPostListingHeader(view));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ class OKHTTPBackend private constructor() : HTTPBackend() {
val status = response.code
val body = response.body

if (status == 200 || status == 202) {
if (status in 200..299) {

val bodyStream: InputStream?
val bodyLength: Long?
Expand Down
42 changes: 42 additions & 0 deletions src/main/java/org/quantumbadger/redreader/reddit/RedditAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.quantumbadger.redreader.account.RedditAccount;
import org.quantumbadger.redreader.activities.BugReportActivity;
import org.quantumbadger.redreader.cache.CacheManager;
Expand Down Expand Up @@ -959,6 +962,45 @@ public void onFailure(@NonNull final RRError error) {
));
}

public static void createMultireddit(
final CacheManager cm,
final APIResponseHandler.ActionResponseHandler handler,
final RedditAccount user,
final String multiredditName,
final List<String> subredditNames,
final Context context) {

final Uri.Builder builder = Constants.Reddit.getUriBuilder(
Constants.Reddit.PATH_MULTIREDDIT)
.appendPath("user")
.appendPath(user.username)
.appendPath("m")
.appendPath(multiredditName);

final JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("display_name", multiredditName);
jsonObject.put("subreddits", subredditNamesJson(subredditNames));
} catch (final JSONException e) {
throw new RuntimeException(e);
}

cm.makeRequest(createPostRequest(
UriString.from(builder.build()),
user,
new ArrayList<>(Collections.singleton(
new PostField("model", jsonObject.toString()))),
context,
new GenericResponseHandler(handler)));
}

private static JSONArray subredditNamesJson(final List<String> subredditNames) {
final JSONArray jsonArray = new JSONArray();
subredditNames.stream().forEach(
sn -> jsonArray.put(new JSONObject(Collections.singletonMap("name", sn))));
return jsonArray;
}

@Nullable
private static APIResponseHandler.APIFailureType findFailureType(final JsonValue response) {

Expand Down
Loading