diff --git a/app/build.gradle b/app/build.gradle index 9cfdc984..8680e42d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,6 +2,7 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'org.jetbrains.kotlin.kapt' + id 'kotlin-parcelize' } android { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CopyMultiRedditActivity.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CopyMultiRedditActivity.kt index e0c637f0..2bbfa418 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CopyMultiRedditActivity.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CopyMultiRedditActivity.kt @@ -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) ) { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/EditMultiRedditActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/EditMultiRedditActivity.java index 78d55166..59f4d689 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/EditMultiRedditActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/EditMultiRedditActivity.java @@ -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)); } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewMultiRedditDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewMultiRedditDetailActivity.java index a0e2453e..2edfd616 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewMultiRedditDetailActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewMultiRedditDetailActivity.java @@ -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; diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/apis/RedditAPI.java b/app/src/main/java/ml/docilealligator/infinityforreddit/apis/RedditAPI.java index c3aedae2..8ebc6631 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/apis/RedditAPI.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/apis/RedditAPI.java @@ -188,7 +188,7 @@ public interface RedditAPI { @POST("/api/favorite") Call favoriteThing(@HeaderMap Map headers, @FieldMap Map params); - @GET("/api/multi/mine") + @GET("/api/multi/mine?expand_srs=true") Call getMyMultiReddits(@HeaderMap Map headers); @FormUrlEncoded @@ -206,7 +206,7 @@ public interface RedditAPI { @DELETE("/api/multi/multipath") Call deleteMultiReddit(@HeaderMap Map headers, @Query("multipath") String multipath); - @GET("/api/multi/multipath/") + @GET("/api/multi/multipath?expand_srs=true") Call getMultiRedditInfo(@HeaderMap Map headers, @Query("multipath") String multipath); @FormUrlEncoded diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/apis/RedditAPIKt.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/apis/RedditAPIKt.kt index bf0402e9..8f3bd0e0 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/apis/RedditAPIKt.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/apis/RedditAPIKt.kt @@ -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, @Query("multipath") multipath: String diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/EditMultiReddit.java b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/EditMultiReddit.java index b19875f5..1b8c06f1 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/EditMultiReddit.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/EditMultiReddit.java @@ -52,10 +52,10 @@ public class EditMultiReddit { EditMultiRedditListener editMultiRedditListener) { executor.execute(() -> { ArrayList anonymousMultiredditSubreddits = new ArrayList<>(); - ArrayList subreddits = multiReddit.getSubreddits(); + ArrayList 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); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/ExpandedSubredditInMultiReddit.java b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/ExpandedSubredditInMultiReddit.java new file mode 100644 index 00000000..85f8f257 --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/ExpandedSubredditInMultiReddit.java @@ -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 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); + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/FetchMultiRedditInfo.java b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/FetchMultiRedditInfo.java index cffc3344..5414e2eb 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/FetchMultiRedditInfo.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/FetchMultiRedditInfo.java @@ -65,11 +65,11 @@ public class FetchMultiRedditInfo { MultiReddit multiReddit = redditDataRoomDatabase.multiRedditDao().getMultiReddit(multipath, Account.ANONYMOUS_ACCOUNT); ArrayList anonymousMultiredditSubreddits = (ArrayList) redditDataRoomDatabase.anonymousMultiredditSubredditDao().getAllAnonymousMultiRedditSubreddits(multipath); - ArrayList subredditNames = new ArrayList<>(); + ArrayList 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 subreddits = new ArrayList<>(); + ArrayList 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, diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/MultiReddit.java b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/MultiReddit.java index e785302d..93cb38b7 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/MultiReddit.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/MultiReddit.java @@ -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 subreddits; + private ArrayList 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 subreddits) { + boolean isSubscriber, boolean isFavorite, ArrayList 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 CREATOR = new Creator<>() { @@ -229,14 +229,22 @@ public class MultiReddit implements Parcelable { isFavorite = favorite; } - public ArrayList getSubreddits() { + public ArrayList getSubreddits() { return subreddits; } - public void setSubreddits(ArrayList subreddits) { + public ArrayList getSubredditNames() { + return new ArrayList<>((subreddits.stream().map(ExpandedSubredditInMultiReddit::getName).collect(Collectors.toList()))); + } + + public void setSubreddits(ArrayList subreddits) { this.subreddits = subreddits; } + public void setSubredditNames(ArrayList 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 diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/ParseMultiReddit.java b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/ParseMultiReddit.java index d2bbdc52..feac12cb 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/ParseMultiReddit.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/ParseMultiReddit.java @@ -76,9 +76,15 @@ public class ParseMultiReddit { boolean isFavorited = singleMultiRedditJSON.getBoolean(JSONUtils.IS_FAVORITED_KEY); JSONArray subredditsArray = singleMultiRedditJSON.getJSONArray(JSONUtils.SUBREDDITS_KEY); - ArrayList subreddits = new ArrayList<>(); - for (int j = 0; j < subredditsArray.length(); j++) { - subreddits.add(subredditsArray.getJSONObject(j).getString(JSONUtils.NAME_KEY)); + ArrayList 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,