Continue implementing copying multireddits. ExpandedSubredditInMultiReddit.

This commit is contained in:
Docile-Alligator
2025-11-29 11:42:48 -05:00
parent 056d152557
commit 92778688d5
11 changed files with 109 additions and 28 deletions

View File

@ -2,6 +2,7 @@ plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'org.jetbrains.kotlin.kapt'
id 'kotlin-parcelize'
}
android {

View File

@ -11,6 +11,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.text.input.rememberTextFieldState
import androidx.compose.foundation.text.input.setTextAndPlaceCursorAtEnd
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
@ -38,7 +39,6 @@ import ml.docilealligator.infinityforreddit.customviews.compose.CustomLoadingInd
import ml.docilealligator.infinityforreddit.customviews.compose.CustomTextField
import ml.docilealligator.infinityforreddit.customviews.compose.LocalAppTheme
import ml.docilealligator.infinityforreddit.customviews.compose.SwitchRow
import ml.docilealligator.infinityforreddit.multireddit.MultiReddit
import ml.docilealligator.infinityforreddit.repositories.CopyMultiRedditActivityRepositoryImpl
import ml.docilealligator.infinityforreddit.viewmodels.CopyMultiRedditActivityViewModel
import ml.docilealligator.infinityforreddit.viewmodels.CopyMultiRedditActivityViewModel.Companion.provideFactory
@ -102,6 +102,14 @@ class CopyMultiRedditActivity : BaseActivity() {
val description = rememberTextFieldState()
var isPrivate by remember { mutableStateOf(true) }
LaunchedEffect(multiRedditState) {
if (multiRedditState is DataLoadState.Success) {
val multiReddit = (multiRedditState as DataLoadState.Success).data
name.setTextAndPlaceCursorAtEnd(multiReddit.name)
description.setTextAndPlaceCursorAtEnd(multiReddit.description)
}
}
AppTheme(customThemeWrapper.themeType) {
Scaffold(
topBar = {
@ -126,10 +134,10 @@ class CopyMultiRedditActivity : BaseActivity() {
CustomLoadingIndicator()
}
}
is DataLoadState.Error<*> -> {
is DataLoadState.Error -> {
}
is DataLoadState.Success<*> -> {
is DataLoadState.Success -> {
LazyColumn(
modifier = Modifier.padding(innerPadding)
) {

View File

@ -171,7 +171,7 @@ public class EditMultiRedditActivity extends BaseActivity {
binding.selectSubredditTextViewEditMultiRedditActivity.setOnClickListener(view -> {
Intent intent = new Intent(EditMultiRedditActivity.this, SelectedSubredditsAndUsersActivity.class);
if (multiReddit.getSubreddits() != null) {
intent.putStringArrayListExtra(SelectedSubredditsAndUsersActivity.EXTRA_SELECTED_SUBREDDITS, multiReddit.getSubreddits());
intent.putParcelableArrayListExtra(SelectedSubredditsAndUsersActivity.EXTRA_SELECTED_SUBREDDITS, multiReddit.getSubreddits());
}
startActivityForResult(intent, SUBREDDIT_SELECTION_REQUEST_CODE);
});
@ -215,7 +215,7 @@ public class EditMultiRedditActivity extends BaseActivity {
});
} else {
String jsonModel = new MultiRedditJSONModel(binding.multiRedditNameEditTextEditMultiRedditActivity.getText().toString(), binding.descriptionEditTextEditMultiRedditActivity.getText().toString(),
binding.visibilitySwitchEditMultiRedditActivity.isChecked(), multiReddit.getSubreddits()).createJSONModel();
binding.visibilitySwitchEditMultiRedditActivity.isChecked(), multiReddit.getSubredditNames()).createJSONModel();
EditMultiReddit.editMultiReddit(mRetrofit, accessToken, multiReddit.getPath(),
jsonModel, new EditMultiReddit.EditMultiRedditListener() {
@Override
@ -239,7 +239,7 @@ public class EditMultiRedditActivity extends BaseActivity {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == SUBREDDIT_SELECTION_REQUEST_CODE && resultCode == RESULT_OK) {
if (data != null) {
multiReddit.setSubreddits(data.getStringArrayListExtra(
multiReddit.setSubredditNames(data.getStringArrayListExtra(
SelectedSubredditsAndUsersActivity.EXTRA_RETURN_SELECTED_SUBREDDITS));
}
}

View File

@ -888,7 +888,7 @@ public class ViewMultiRedditDetailActivity extends BaseActivity implements SortT
.show();
return true;
} else if (itemId == R.id.action_copy_view_multi_reddit_detail_activity) {
CopyMultiRedditActivity.Companion.start(this, "");
CopyMultiRedditActivity.Companion.start(this, multiPath);
return true;
}
return false;

View File

@ -188,7 +188,7 @@ public interface RedditAPI {
@POST("/api/favorite")
Call<String> favoriteThing(@HeaderMap Map<String, String> headers, @FieldMap Map<String, String> params);
@GET("/api/multi/mine")
@GET("/api/multi/mine?expand_srs=true")
Call<String> getMyMultiReddits(@HeaderMap Map<String, String> headers);
@FormUrlEncoded
@ -206,7 +206,7 @@ public interface RedditAPI {
@DELETE("/api/multi/multipath")
Call<String> deleteMultiReddit(@HeaderMap Map<String, String> headers, @Query("multipath") String multipath);
@GET("/api/multi/multipath/")
@GET("/api/multi/multipath?expand_srs=true")
Call<String> getMultiRedditInfo(@HeaderMap Map<String, String> headers, @Query("multipath") String multipath);
@FormUrlEncoded

View File

@ -6,7 +6,7 @@ import retrofit2.http.HeaderMap
import retrofit2.http.Query
interface RedditAPIKt {
@GET("/api/multi/multipath/")
@GET("/api/multi/multipath?expand_srs=true")
suspend fun getMultiRedditInfo(
@HeaderMap headers: MutableMap<String, String>,
@Query("multipath") multipath: String

View File

@ -52,10 +52,10 @@ public class EditMultiReddit {
EditMultiRedditListener editMultiRedditListener) {
executor.execute(() -> {
ArrayList<AnonymousMultiredditSubreddit> anonymousMultiredditSubreddits = new ArrayList<>();
ArrayList<String> subreddits = multiReddit.getSubreddits();
ArrayList<ExpandedSubredditInMultiReddit> subreddits = multiReddit.getSubreddits();
redditDataRoomDatabase.multiRedditDao().insert(multiReddit);
for (String s : subreddits) {
anonymousMultiredditSubreddits.add(new AnonymousMultiredditSubreddit(multiReddit.getPath(), s));
for (ExpandedSubredditInMultiReddit s : subreddits) {
anonymousMultiredditSubreddits.add(new AnonymousMultiredditSubreddit(multiReddit.getPath(), s.getName()));
}
redditDataRoomDatabase.anonymousMultiredditSubredditDao().insertAll(anonymousMultiredditSubreddits);
handler.post(editMultiRedditListener::success);

View File

@ -0,0 +1,52 @@
package ml.docilealligator.infinityforreddit.multireddit;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.NonNull;
public class ExpandedSubredditInMultiReddit implements Parcelable {
private String name;
private String iconUrl;
public ExpandedSubredditInMultiReddit(String name, String iconUrl) {
this.name = name;
this.iconUrl = iconUrl;
}
protected ExpandedSubredditInMultiReddit(Parcel in) {
name = in.readString();
iconUrl = in.readString();
}
public static final Creator<ExpandedSubredditInMultiReddit> CREATOR = new Creator<>() {
@Override
public ExpandedSubredditInMultiReddit createFromParcel(Parcel in) {
return new ExpandedSubredditInMultiReddit(in);
}
@Override
public ExpandedSubredditInMultiReddit[] newArray(int size) {
return new ExpandedSubredditInMultiReddit[size];
}
};
public String getName() {
return name;
}
public String getIconUrl() {
return iconUrl;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(iconUrl);
}
}

View File

@ -65,11 +65,11 @@ public class FetchMultiRedditInfo {
MultiReddit multiReddit = redditDataRoomDatabase.multiRedditDao().getMultiReddit(multipath, Account.ANONYMOUS_ACCOUNT);
ArrayList<AnonymousMultiredditSubreddit> anonymousMultiredditSubreddits =
(ArrayList<AnonymousMultiredditSubreddit>) redditDataRoomDatabase.anonymousMultiredditSubredditDao().getAllAnonymousMultiRedditSubreddits(multipath);
ArrayList<String> subredditNames = new ArrayList<>();
ArrayList<ExpandedSubredditInMultiReddit> subreddits = new ArrayList<>();
for (AnonymousMultiredditSubreddit a : anonymousMultiredditSubreddits) {
subredditNames.add(a.getSubredditName());
subreddits.add(new ExpandedSubredditInMultiReddit(a.getSubredditName(), multiReddit.getIconUrl()));
}
multiReddit.setSubreddits(subredditNames);
multiReddit.setSubreddits(subreddits);
handler.post(() -> fetchMultiRedditInfoListener.success(multiReddit));
});
}
@ -92,10 +92,16 @@ public class FetchMultiRedditInfo {
boolean over18 = object.getBoolean(JSONUtils.OVER_18_KEY);
boolean isSubscriber = object.getBoolean(JSONUtils.IS_SUBSCRIBER_KEY);
boolean isFavorite = object.getBoolean(JSONUtils.IS_FAVORITED_KEY);
ArrayList<String> subreddits = new ArrayList<>();
ArrayList<ExpandedSubredditInMultiReddit> subreddits = new ArrayList<>();
JSONArray subredditsArray = object.getJSONArray(JSONUtils.SUBREDDITS_KEY);
for (int i = 0; i < subredditsArray.length(); i++) {
subreddits.add(subredditsArray.getJSONObject(i).getString(JSONUtils.NAME_KEY));
JSONObject subredditData = subredditsArray.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY);
subreddits.add(
new ExpandedSubredditInMultiReddit(
subredditsArray.getJSONObject(i).getString(JSONUtils.NAME_KEY),
subredditData.isNull(JSONUtils.COMMUNITY_ICON_KEY) ? subredditData.getString(JSONUtils.NAME_KEY) : subredditData.getString(JSONUtils.COMMUNITY_ICON_KEY)
)
);
}
return new MultiReddit(path, displayName, name, description, copiedFrom, iconUrl,

View File

@ -12,6 +12,7 @@ import androidx.room.Ignore;
import androidx.room.Index;
import java.util.ArrayList;
import java.util.stream.Collectors;
import ml.docilealligator.infinityforreddit.account.Account;
@ -51,7 +52,7 @@ public class MultiReddit implements Parcelable {
@ColumnInfo(name = "is_favorite")
private boolean isFavorite;
@Ignore
private ArrayList<String> subreddits;
private ArrayList<ExpandedSubredditInMultiReddit> subreddits;
public MultiReddit(@NonNull String path, @NonNull String displayName, @NonNull String name,
String description, String copiedFrom, String iconUrl, String visibility,
@ -75,7 +76,7 @@ public class MultiReddit implements Parcelable {
public MultiReddit(@NonNull String path, @NonNull String displayName, @NonNull String name,
String description, String copiedFrom, String iconUrl, String visibility,
@NonNull String owner, int nSubscribers, long createdUTC, boolean over18,
boolean isSubscriber, boolean isFavorite, ArrayList<String> subreddits) {
boolean isSubscriber, boolean isFavorite, ArrayList<ExpandedSubredditInMultiReddit> subreddits) {
this.displayName = displayName;
this.name = name;
this.description = description;
@ -106,8 +107,7 @@ public class MultiReddit implements Parcelable {
over18 = in.readByte() != 0;
isSubscriber = in.readByte() != 0;
isFavorite = in.readByte() != 0;
subreddits = new ArrayList<>();
in.readStringList(subreddits);
subreddits = in.createTypedArrayList(ExpandedSubredditInMultiReddit.CREATOR);
}
public static final Creator<MultiReddit> CREATOR = new Creator<>() {
@ -229,14 +229,22 @@ public class MultiReddit implements Parcelable {
isFavorite = favorite;
}
public ArrayList<String> getSubreddits() {
public ArrayList<ExpandedSubredditInMultiReddit> getSubreddits() {
return subreddits;
}
public void setSubreddits(ArrayList<String> subreddits) {
public ArrayList<String> getSubredditNames() {
return new ArrayList<>((subreddits.stream().map(ExpandedSubredditInMultiReddit::getName).collect(Collectors.toList())));
}
public void setSubreddits(ArrayList<ExpandedSubredditInMultiReddit> subreddits) {
this.subreddits = subreddits;
}
public void setSubredditNames(ArrayList<String> subredditNames) {
this.subreddits = new ArrayList<>(subredditNames.stream().map(name -> new ExpandedSubredditInMultiReddit(name, null)).collect(Collectors.toList()));
}
@Override
public int describeContents() {
return 0;
@ -257,7 +265,7 @@ public class MultiReddit implements Parcelable {
parcel.writeByte((byte) (over18 ? 1 : 0));
parcel.writeByte((byte) (isSubscriber ? 1 : 0));
parcel.writeByte((byte) (isFavorite ? 1 : 0));
parcel.writeStringList(subreddits);
parcel.writeTypedList(subreddits);
}
@Nullable

View File

@ -76,9 +76,15 @@ public class ParseMultiReddit {
boolean isFavorited = singleMultiRedditJSON.getBoolean(JSONUtils.IS_FAVORITED_KEY);
JSONArray subredditsArray = singleMultiRedditJSON.getJSONArray(JSONUtils.SUBREDDITS_KEY);
ArrayList<String> subreddits = new ArrayList<>();
for (int j = 0; j < subredditsArray.length(); j++) {
subreddits.add(subredditsArray.getJSONObject(j).getString(JSONUtils.NAME_KEY));
ArrayList<ExpandedSubredditInMultiReddit> subreddits = new ArrayList<>();
for (int i = 0; i < subredditsArray.length(); i++) {
JSONObject subredditData = subredditsArray.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY);
subreddits.add(
new ExpandedSubredditInMultiReddit(
subredditsArray.getJSONObject(i).getString(JSONUtils.NAME_KEY),
subredditData.isNull(JSONUtils.COMMUNITY_ICON_KEY) ? subredditData.getString(JSONUtils.NAME_KEY) : subredditData.getString(JSONUtils.COMMUNITY_ICON_KEY)
)
);
}
return new MultiReddit(path, displayName, name, description, copiedFrom,