diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/APIResult.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/APIResult.kt index c1618e00..4f796886 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/APIResult.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/APIResult.kt @@ -1,6 +1,13 @@ package ml.docilealligator.infinityforreddit +import androidx.annotation.StringRes + sealed class APIResult { data class Success(val data: T): APIResult() - data class Error(val message: String): APIResult() + data class Error(val error: APIError): APIResult() +} + +sealed class APIError { + data class Message(val message: String) : APIError() + data class MessageRes(@StringRes val resId: Int) : APIError() } \ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ActionState.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/ActionState.kt index ac7b60da..3cdffac1 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ActionState.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ActionState.kt @@ -1,8 +1,15 @@ package ml.docilealligator.infinityforreddit +import androidx.annotation.StringRes + sealed interface ActionState { object Idle: ActionState object Running: ActionState data class Success(val data: T): ActionState - data class Error(val message: String): ActionState + data class Error(val error: ActionStateError): ActionState +} + +sealed class ActionStateError { + data class Message(val message: String) : ActionStateError() + data class MessageRes(@StringRes val resId: Int) : ActionStateError() } \ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java index 73c998f5..096e2cb4 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java @@ -14,6 +14,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase; import ml.docilealligator.infinityforreddit.account.Account; import ml.docilealligator.infinityforreddit.account.AccountDao; +import ml.docilealligator.infinityforreddit.account.AccountDaoKt; import ml.docilealligator.infinityforreddit.comment.CommentDraft; import ml.docilealligator.infinityforreddit.comment.CommentDraftDao; import ml.docilealligator.infinityforreddit.commentfilter.CommentFilter; @@ -24,8 +25,10 @@ import ml.docilealligator.infinityforreddit.customtheme.CustomTheme; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeDao; import ml.docilealligator.infinityforreddit.multireddit.AnonymousMultiredditSubreddit; import ml.docilealligator.infinityforreddit.multireddit.AnonymousMultiredditSubredditDao; +import ml.docilealligator.infinityforreddit.multireddit.AnonymousMultiredditSubredditDaoKt; import ml.docilealligator.infinityforreddit.multireddit.MultiReddit; import ml.docilealligator.infinityforreddit.multireddit.MultiRedditDao; +import ml.docilealligator.infinityforreddit.multireddit.MultiRedditDaoKt; import ml.docilealligator.infinityforreddit.postfilter.PostFilter; import ml.docilealligator.infinityforreddit.postfilter.PostFilterDao; import ml.docilealligator.infinityforreddit.postfilter.PostFilterUsage; @@ -46,7 +49,7 @@ import ml.docilealligator.infinityforreddit.user.UserData; @Database(entities = {Account.class, SubredditData.class, SubscribedSubredditData.class, UserData.class, SubscribedUserData.class, MultiReddit.class, CustomTheme.class, RecentSearchQuery.class, ReadPost.class, PostFilter.class, PostFilterUsage.class, AnonymousMultiredditSubreddit.class, - CommentFilter.class, CommentFilterUsage.class, CommentDraft.class}, version = 30, exportSchema = false) + CommentFilter.class, CommentFilterUsage.class, CommentDraft.class}, version = 31, exportSchema = false) @TypeConverters(Converters.class) public abstract class RedditDataRoomDatabase extends RoomDatabase { @@ -60,12 +63,14 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase { MIGRATION_17_18, MIGRATION_18_19, MIGRATION_19_20, MIGRATION_20_21, MIGRATION_21_22, MIGRATION_22_23, MIGRATION_23_24, MIGRATION_24_25, MIGRATION_25_26, MIGRATION_26_27, MIGRATION_27_28, MIGRATION_28_29, - MIGRATION_29_30) + MIGRATION_29_30, MIGRATION_30_31) .build(); } public abstract AccountDao accountDao(); + public abstract AccountDaoKt accountDaoKt(); + public abstract SubredditDao subredditDao(); public abstract SubscribedSubredditDao subscribedSubredditDao(); @@ -76,6 +81,8 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase { public abstract MultiRedditDao multiRedditDao(); + public abstract MultiRedditDaoKt multiRedditDaoKt(); + public abstract CustomThemeDao customThemeDao(); public abstract RecentSearchQueryDao recentSearchQueryDao(); @@ -88,6 +95,8 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase { public abstract AnonymousMultiredditSubredditDao anonymousMultiredditSubredditDao(); + public abstract AnonymousMultiredditSubredditDaoKt anonymousMultiredditSubredditDaoKt(); + public abstract CommentFilterDao commentFilterDao(); public abstract CommentFilterUsageDao commentFilterUsageDao(); @@ -466,5 +475,11 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase { } }; + private static final Migration MIGRATION_30_31 = new Migration(30, 31) { + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + database.execSQL("ALTER TABLE anonymous_multireddit_subreddits ADD COLUMN icon_url TEXT"); + } + }; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/account/AccountDaoKt.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/account/AccountDaoKt.kt new file mode 100644 index 00000000..b5a82cdc --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/account/AccountDaoKt.kt @@ -0,0 +1,15 @@ +package ml.docilealligator.infinityforreddit.account + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query + +@Dao +interface AccountDaoKt { + @Insert(onConflict = OnConflictStrategy.Companion.REPLACE) + suspend fun insert(account: Account) + + @Query("SELECT EXISTS (SELECT 1 FROM accounts WHERE username = '-')") + suspend fun isAnonymousAccountInserted(): Boolean +} \ No newline at end of file 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 b41a0d39..0390aa56 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CopyMultiRedditActivity.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CopyMultiRedditActivity.kt @@ -43,6 +43,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -55,6 +56,7 @@ import com.bumptech.glide.request.RequestOptions import jp.wasabeef.glide.transformations.RoundedCornersTransformation import kotlinx.coroutines.launch import ml.docilealligator.infinityforreddit.ActionState +import ml.docilealligator.infinityforreddit.ActionStateError import ml.docilealligator.infinityforreddit.DataLoadState import ml.docilealligator.infinityforreddit.Infinity import ml.docilealligator.infinityforreddit.R @@ -124,19 +126,19 @@ class CopyMultiRedditActivity : BaseActivity() { copyMultiRedditActivityViewModel = ViewModelProvider.create( this, - provideFactory(multipath, CopyMultiRedditActivityRepositoryImpl(mOauthRetrofit, accessToken ?: "")) + provideFactory(multipath, CopyMultiRedditActivityRepositoryImpl(mOauthRetrofit, mRedditDataRoomDatabase, accessToken ?: "")) )[CopyMultiRedditActivityViewModel::class.java] copyMultiRedditActivityViewModel.fetchMultiRedditInfo() setContent { AppTheme(customThemeWrapper.themeType) { + val context = LocalContext.current val scrollBehavior = enterAlwaysScrollBehavior() val multiRedditState by copyMultiRedditActivityViewModel.multiRedditState.collectAsStateWithLifecycle() val copyMultiRedditState by copyMultiRedditActivityViewModel.copyMultiRedditState.collectAsStateWithLifecycle() val name by copyMultiRedditActivityViewModel.name.collectAsStateWithLifecycle() val description by copyMultiRedditActivityViewModel.description.collectAsStateWithLifecycle() - var isPrivate by remember { mutableStateOf(true) } val scope = rememberCoroutineScope() val snackbarHostState = remember { SnackbarHostState() } @@ -145,8 +147,12 @@ class CopyMultiRedditActivity : BaseActivity() { LaunchedEffect(copyMultiRedditState) { when (copyMultiRedditState) { is ActionState.Error -> { + val error = (copyMultiRedditState as ActionState.Error).error scope.launch { - snackbarHostState.showSnackbar((copyMultiRedditState as ActionState.Error).message) + when (error) { + is ActionStateError.Message -> snackbarHostState.showSnackbar(error.message) + is ActionStateError.MessageRes -> snackbarHostState.showSnackbar(context.getString(error.resId)) + } } } is ActionState.Idle -> { @@ -159,7 +165,10 @@ class CopyMultiRedditActivity : BaseActivity() { } is ActionState.Success<*> -> { startActivity(Intent(this@CopyMultiRedditActivity, ViewMultiRedditDetailActivity::class.java).apply { - putExtra(ViewMultiRedditDetailActivity.EXTRA_MULTIREDDIT_PATH, (copyMultiRedditState as ActionState.Success).data.path) + val data = (copyMultiRedditState as ActionState.Success<*>).data + if (data is MultiReddit) { + putExtra(ViewMultiRedditDetailActivity.EXTRA_MULTIREDDIT_PATH, data.path) + } }) finish() } @@ -267,15 +276,6 @@ class CopyMultiRedditActivity : BaseActivity() { } } - item { - SwitchRow( - checked = isPrivate, - title = stringResource(R.string.private_multi_reddit) - ) { - isPrivate = it - } - } - items((multiRedditState as DataLoadState.Success).data.subreddits) { subreddit -> SubredditRow(subreddit) } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CreateMultiRedditActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CreateMultiRedditActivity.java index b5110f5c..8aca8017 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CreateMultiRedditActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CreateMultiRedditActivity.java @@ -9,7 +9,6 @@ import android.os.Handler; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.widget.CompoundButton; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -34,6 +33,7 @@ import ml.docilealligator.infinityforreddit.account.Account; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.databinding.ActivityCreateMultiRedditBinding; import ml.docilealligator.infinityforreddit.multireddit.CreateMultiReddit; +import ml.docilealligator.infinityforreddit.multireddit.ExpandedSubredditInMultiReddit; import ml.docilealligator.infinityforreddit.multireddit.MultiRedditJSONModel; import ml.docilealligator.infinityforreddit.utils.Utils; import retrofit2.Retrofit; @@ -58,7 +58,7 @@ public class CreateMultiRedditActivity extends BaseActivity { @Inject Executor mExecutor; private ActivityCreateMultiRedditBinding binding; - private ArrayList mSubreddits; + private ArrayList mSubreddits; @Override protected void onCreate(Bundle savedInstanceState) { @@ -113,7 +113,7 @@ public class CreateMultiRedditActivity extends BaseActivity { } if (savedInstanceState != null) { - mSubreddits = savedInstanceState.getStringArrayList(SELECTED_SUBREDDITS_STATE); + mSubreddits = savedInstanceState.getParcelableArrayList(SELECTED_SUBREDDITS_STATE); } else { mSubreddits = new ArrayList<>(); } @@ -123,19 +123,16 @@ public class CreateMultiRedditActivity extends BaseActivity { private void bindView() { binding.selectSubredditChipCreateMultiRedditActivity.setOnClickListener(view -> { Intent intent = new Intent(CreateMultiRedditActivity.this, SelectedSubredditsAndUsersActivity.class); - intent.putStringArrayListExtra(SelectedSubredditsAndUsersActivity.EXTRA_SELECTED_SUBREDDITS, mSubreddits); + intent.putParcelableArrayListExtra(SelectedSubredditsAndUsersActivity.EXTRA_SELECTED_SUBREDDITS, mSubreddits); startActivityForResult(intent, SUBREDDIT_SELECTION_REQUEST_CODE); }); - binding.visibilityChipCreateMultiRedditActivity.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (isChecked) { - binding.visibilityChipCreateMultiRedditActivity.setChipBackgroundColor(ColorStateList.valueOf(mCustomThemeWrapper.getFilledCardViewBackgroundColor())); - } else { - //Match the background color - binding.visibilityChipCreateMultiRedditActivity.setChipBackgroundColor(ColorStateList.valueOf(mCustomThemeWrapper.getBackgroundColor())); - } + binding.visibilityChipCreateMultiRedditActivity.setOnCheckedChangeListener((buttonView, isChecked) -> { + if (isChecked) { + binding.visibilityChipCreateMultiRedditActivity.setChipBackgroundColor(ColorStateList.valueOf(mCustomThemeWrapper.getFilledCardViewBackgroundColor())); + } else { + //Match the background color + binding.visibilityChipCreateMultiRedditActivity.setChipBackgroundColor(ColorStateList.valueOf(mCustomThemeWrapper.getBackgroundColor())); } }); } @@ -191,7 +188,7 @@ public class CreateMultiRedditActivity extends BaseActivity { @Override public void failed(int errorType) { - //Will not be called + Snackbar.make(binding.coordinatorLayoutCreateMultiRedditActivity, R.string.duplicate_multi_reddit, Snackbar.LENGTH_SHORT).show(); } }); } @@ -204,8 +201,7 @@ public class CreateMultiRedditActivity extends BaseActivity { super.onActivityResult(requestCode, resultCode, data); if (requestCode == SUBREDDIT_SELECTION_REQUEST_CODE && resultCode == RESULT_OK) { if (data != null) { - mSubreddits = data.getStringArrayListExtra( - SubredditMultiselectionActivity.EXTRA_RETURN_SELECTED_SUBREDDITS); + mSubreddits = data.getParcelableArrayListExtra(SelectedSubredditsAndUsersActivity.EXTRA_RETURN_SELECTED_SUBREDDITS); } } } @@ -213,7 +209,7 @@ public class CreateMultiRedditActivity extends BaseActivity { @Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); - outState.putStringArrayList(SELECTED_SUBREDDITS_STATE, mSubreddits); + outState.putParcelableArrayList(SELECTED_SUBREDDITS_STATE, mSubreddits); } @Override diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CustomizePostFilterActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CustomizePostFilterActivity.java index 8cd17c49..832643f9 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CustomizePostFilterActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CustomizePostFilterActivity.java @@ -31,6 +31,7 @@ import java.util.ArrayList; import java.util.concurrent.Executor; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Named; @@ -40,8 +41,10 @@ import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.databinding.ActivityCustomizePostFilterBinding; +import ml.docilealligator.infinityforreddit.multireddit.ExpandedSubredditInMultiReddit; import ml.docilealligator.infinityforreddit.postfilter.PostFilter; import ml.docilealligator.infinityforreddit.postfilter.SavePostFilter; +import ml.docilealligator.infinityforreddit.subreddit.SubredditWithSelection; import ml.docilealligator.infinityforreddit.utils.Utils; public class CustomizePostFilterActivity extends BaseActivity { @@ -587,13 +590,13 @@ public class CustomizePostFilterActivity extends BaseActivity { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && data != null) { if (requestCode == ADD_EXCLUDE_SUBREDDITS_REQUEST_CODE) { - ArrayList subredditNames = data.getStringArrayListExtra( - SubredditMultiselectionActivity.EXTRA_RETURN_SELECTED_SUBREDDITS); - updateSubredditsUsersNames(subredditNames, binding.excludesSubredditsTextInputEditTextCustomizePostFilterActivity); + ArrayList subredditWithSelections = data.getParcelableArrayListExtra(SubredditMultiselectionActivity.EXTRA_RETURN_SELECTED_SUBREDDITS); + updateSubredditsUsersNames(new ArrayList<>(subredditWithSelections.stream().map(SubredditWithSelection::getName).collect(Collectors.toList())), + binding.excludesSubredditsTextInputEditTextCustomizePostFilterActivity); } else if (requestCode == ADD_CONTAIN_SUBREDDITS_REQUEST_CODE) { - ArrayList subredditNames = data.getStringArrayListExtra( - SubredditMultiselectionActivity.EXTRA_RETURN_SELECTED_SUBREDDITS); - updateSubredditsUsersNames(subredditNames, binding.containsSubredditsTextInputEditTextCustomizePostFilterActivity); + ArrayList subredditWithSelections = data.getParcelableArrayListExtra(SubredditMultiselectionActivity.EXTRA_RETURN_SELECTED_SUBREDDITS); + updateSubredditsUsersNames(new ArrayList<>(subredditWithSelections.stream().map(SubredditWithSelection::getName).collect(Collectors.toList())), + binding.containsSubredditsTextInputEditTextCustomizePostFilterActivity); } else if (requestCode == ADD_EXCLUDE_USERS_REQUEST_CODE) { ArrayList usernames = data.getStringArrayListExtra(SearchActivity.RETURN_EXTRA_SELECTED_USERNAMES); updateSubredditsUsersNames(usernames, binding.excludesUsersTextInputEditTextCustomizePostFilterActivity); 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 59f4d689..3192a30d 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/EditMultiRedditActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/EditMultiRedditActivity.java @@ -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.getSubredditNames()).createJSONModel(); + binding.visibilitySwitchEditMultiRedditActivity.isChecked(), multiReddit.getSubreddits()).createJSONModel(); EditMultiReddit.editMultiReddit(mRetrofit, accessToken, multiReddit.getPath(), jsonModel, new EditMultiReddit.EditMultiRedditListener() { @Override diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SearchActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SearchActivity.java index bb5af469..da8e46da 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SearchActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SearchActivity.java @@ -76,7 +76,7 @@ public class SearchActivity extends BaseActivity { public static final String EXTRA_SEARCH_ONLY_SUBREDDITS = "ESOS"; public static final String EXTRA_SEARCH_ONLY_USERS = "ESOU"; public static final String EXTRA_SEARCH_SUBREDDITS_AND_USERS = "ESSAU"; - public static final String RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES = "RESSN"; + public static final String RETURN_EXTRA_SELECTED_SUBREDDITS = "RESS"; public static final String RETURN_EXTRA_SELECTED_USERNAMES = "RESU"; public static final String EXTRA_IS_MULTI_SELECTION = "EIMS"; public static final int SUICIDE_PREVENTION_ACTIVITY_REQUEST_CODE = 101; @@ -196,9 +196,9 @@ public class SearchActivity extends BaseActivity { if (searchOnlySubreddits || searchSubredditsAndUsers) { Intent returnIntent = new Intent(); if (getIntent().getBooleanExtra(EXTRA_IS_MULTI_SELECTION, false)) { - ArrayList subredditNameList = new ArrayList<>(); - subredditNameList.add(subredditData.getName()); - returnIntent.putStringArrayListExtra(RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES, subredditNameList); + ArrayList subredditList = new ArrayList<>(); + subredditList.add(subredditData); + returnIntent.putParcelableArrayListExtra(RETURN_EXTRA_SELECTED_SUBREDDITS, subredditList); } else { returnIntent.putExtra(SelectThingReturnKey.RETURN_EXTRA_SUBREDDIT_OR_USER_NAME, subredditData.getName()); returnIntent.putExtra(SelectThingReturnKey.RETURN_EXTRA_SUBREDDIT_OR_USER_ICON, subredditData.getIconUrl()); @@ -573,7 +573,7 @@ public class SearchActivity extends BaseActivity { if (requestCode == SUBREDDIT_SEARCH_REQUEST_CODE) { Intent returnIntent = new Intent(); if (getIntent().getBooleanExtra(EXTRA_IS_MULTI_SELECTION, false)) { - returnIntent.putStringArrayListExtra(RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES, data.getStringArrayListExtra(SearchSubredditsResultActivity.RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES)); + returnIntent.putParcelableArrayListExtra(RETURN_EXTRA_SELECTED_SUBREDDITS, data.getParcelableArrayListExtra(SearchSubredditsResultActivity.RETURN_EXTRA_SELECTED_SUBREDDITS)); } else { returnIntent.putExtra(SelectThingReturnKey.RETURN_EXTRA_SUBREDDIT_OR_USER_NAME, data.getStringExtra(SelectThingReturnKey.RETURN_EXTRA_SUBREDDIT_OR_USER_NAME)); returnIntent.putExtra(SelectThingReturnKey.RETURN_EXTRA_SUBREDDIT_OR_USER_ICON, data.getStringExtra(SelectThingReturnKey.RETURN_EXTRA_SUBREDDIT_OR_USER_ICON)); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SearchSubredditsResultActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SearchSubredditsResultActivity.java index 57bbef8d..bf9e6379 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SearchSubredditsResultActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SearchSubredditsResultActivity.java @@ -33,6 +33,7 @@ import ml.docilealligator.infinityforreddit.customviews.slidr.Slidr; import ml.docilealligator.infinityforreddit.databinding.ActivitySearchSubredditsResultBinding; import ml.docilealligator.infinityforreddit.events.SwitchAccountEvent; import ml.docilealligator.infinityforreddit.fragments.SubredditListingFragment; +import ml.docilealligator.infinityforreddit.subreddit.SubredditData; import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.utils.Utils; @@ -40,7 +41,7 @@ public class SearchSubredditsResultActivity extends BaseActivity implements Acti static final String EXTRA_QUERY = "EQ"; static final String EXTRA_IS_MULTI_SELECTION = "EIMS"; - static final String RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES = "RESS"; + static final String RETURN_EXTRA_SELECTED_SUBREDDITS = "RESS"; private static final String FRAGMENT_OUT_STATE = "FOS"; @@ -165,9 +166,9 @@ public class SearchSubredditsResultActivity extends BaseActivity implements Acti return true; } else if (item.getItemId() == R.id.action_save_search_subreddits_result_activity) { if (mFragment != null) { - ArrayList selectedSubredditNames = ((SubredditListingFragment) mFragment).getSelectedSubredditNames(); + ArrayList selectedSubreddits = ((SubredditListingFragment) mFragment).getSelectedSubredditNames(); Intent returnIntent = new Intent(); - returnIntent.putStringArrayListExtra(RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES, selectedSubredditNames); + returnIntent.putParcelableArrayListExtra(RETURN_EXTRA_SELECTED_SUBREDDITS, selectedSubreddits); setResult(Activity.RESULT_OK, returnIntent); finish(); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SelectedSubredditsAndUsersActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SelectedSubredditsAndUsersActivity.java index 4485190c..d3b3805b 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SelectedSubredditsAndUsersActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SelectedSubredditsAndUsersActivity.java @@ -16,21 +16,27 @@ import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; + import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Named; import ml.docilealligator.infinityforreddit.Infinity; import ml.docilealligator.infinityforreddit.R; -import ml.docilealligator.infinityforreddit.thing.SelectThingReturnKey; import ml.docilealligator.infinityforreddit.adapters.SelectedSubredditsRecyclerViewAdapter; import ml.docilealligator.infinityforreddit.bottomsheetfragments.SelectSubredditsOrUsersOptionsBottomSheetFragment; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.customviews.LinearLayoutManagerBugFixed; import ml.docilealligator.infinityforreddit.customviews.slidr.Slidr; import ml.docilealligator.infinityforreddit.databinding.ActivitySelectedSubredditsBinding; +import ml.docilealligator.infinityforreddit.multireddit.ExpandedSubredditInMultiReddit; +import ml.docilealligator.infinityforreddit.subreddit.SubredditWithSelection; +import ml.docilealligator.infinityforreddit.thing.SelectThingReturnKey; import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.utils.Utils; @@ -52,7 +58,7 @@ public class SelectedSubredditsAndUsersActivity extends BaseActivity implements CustomThemeWrapper mCustomThemeWrapper; private LinearLayoutManagerBugFixed linearLayoutManager; private SelectedSubredditsRecyclerViewAdapter adapter; - private ArrayList subreddits; + private ArrayList subreddits; private ActivitySelectedSubredditsBinding binding; @Override @@ -111,14 +117,15 @@ public class SelectedSubredditsAndUsersActivity extends BaseActivity implements setToolbarGoToTop(binding.toolbarSelectedSubredditsAndUsersActivity); if (savedInstanceState != null) { - subreddits = savedInstanceState.getStringArrayList(SELECTED_SUBREDDITS_STATE); + subreddits = savedInstanceState.getParcelableArrayList(SELECTED_SUBREDDITS_STATE); } else { - subreddits = getIntent().getStringArrayListExtra(EXTRA_SELECTED_SUBREDDITS); + subreddits = getIntent().getParcelableArrayListExtra(EXTRA_SELECTED_SUBREDDITS); } - Collections.sort(subreddits); + Collections.sort(subreddits, Comparator.comparing(ExpandedSubredditInMultiReddit::getName)); - adapter = new SelectedSubredditsRecyclerViewAdapter(this, mCustomThemeWrapper, subreddits); + adapter = new SelectedSubredditsRecyclerViewAdapter(this, mCustomThemeWrapper, Glide.with(this), + subreddits); linearLayoutManager = new LinearLayoutManagerBugFixed(this); binding.recyclerViewSelectedSubredditsAndUsersActivity.setLayoutManager(linearLayoutManager); binding.recyclerViewSelectedSubredditsAndUsersActivity.setAdapter(adapter); @@ -180,10 +187,10 @@ public class SelectedSubredditsAndUsersActivity extends BaseActivity implements if (resultCode == RESULT_OK) { if (requestCode == SUBREDDIT_SELECTION_REQUEST_CODE) { if (data != null) { - if (subreddits == null) { - subreddits = new ArrayList<>(); - } - subreddits = data.getStringArrayListExtra(SubredditMultiselectionActivity.EXTRA_RETURN_SELECTED_SUBREDDITS); + ArrayList subredditWithSelections = data.getParcelableArrayListExtra(SubredditMultiselectionActivity.EXTRA_RETURN_SELECTED_SUBREDDITS); + subreddits = new ArrayList<>(subredditWithSelections.stream().map( + (subredditWithSelection) -> new ExpandedSubredditInMultiReddit(subredditWithSelection.getName(), subredditWithSelection.getIconUrl()) + ).collect(Collectors.toList())); adapter.addSubreddits(subreddits); } } else if (requestCode == USER_SELECTION_REQUEST_CODE) { @@ -201,7 +208,7 @@ public class SelectedSubredditsAndUsersActivity extends BaseActivity implements protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); if (adapter != null) { - outState.putStringArrayList(SELECTED_SUBREDDITS_STATE, adapter.getSubreddits()); + outState.putParcelableArrayList(SELECTED_SUBREDDITS_STATE, adapter.getSubreddits()); } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SubredditMultiselectionActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SubredditMultiselectionActivity.java index 9dafa4d5..aca4fe72 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SubredditMultiselectionActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SubredditMultiselectionActivity.java @@ -22,6 +22,7 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.RequestManager; import java.util.ArrayList; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Named; @@ -33,6 +34,8 @@ import ml.docilealligator.infinityforreddit.adapters.SubredditMultiselectionRecy import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.customviews.LinearLayoutManagerBugFixed; import ml.docilealligator.infinityforreddit.databinding.ActivitySubscribedSubredditsMultiselectionBinding; +import ml.docilealligator.infinityforreddit.subreddit.SubredditData; +import ml.docilealligator.infinityforreddit.subreddit.SubredditWithSelection; import ml.docilealligator.infinityforreddit.subscribedsubreddit.SubscribedSubredditViewModel; import ml.docilealligator.infinityforreddit.utils.Utils; import retrofit2.Retrofit; @@ -163,7 +166,7 @@ public class SubredditMultiselectionActivity extends BaseActivity implements Act } else if (itemId == R.id.action_save_subreddit_multiselection_activity) { if (mAdapter != null) { Intent returnIntent = new Intent(); - returnIntent.putStringArrayListExtra(EXTRA_RETURN_SELECTED_SUBREDDITS, + returnIntent.putParcelableArrayListExtra(EXTRA_RETURN_SELECTED_SUBREDDITS, mAdapter.getAllSelectedSubreddits()); setResult(RESULT_OK, returnIntent); } @@ -184,12 +187,14 @@ public class SubredditMultiselectionActivity extends BaseActivity implements Act super.onActivityResult(requestCode, resultCode, data); if (requestCode == SUBREDDIT_SEARCH_REQUEST_CODE && resultCode == RESULT_OK && data != null && mAdapter != null) { Intent returnIntent = new Intent(); - ArrayList selectedSubreddits = mAdapter.getAllSelectedSubreddits(); - ArrayList searchedSubreddits = data.getStringArrayListExtra(SearchActivity.RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES); + ArrayList selectedSubreddits = mAdapter.getAllSelectedSubreddits(); + ArrayList searchedSubreddits = data.getParcelableArrayListExtra(SearchActivity.RETURN_EXTRA_SELECTED_SUBREDDITS); if (searchedSubreddits != null) { - selectedSubreddits.addAll(searchedSubreddits); + selectedSubreddits.addAll(searchedSubreddits.stream().map( + subredditData -> new SubredditWithSelection(subredditData.getName(), subredditData.getIconUrl()) + ).collect(Collectors.toList())); } - returnIntent.putStringArrayListExtra(EXTRA_RETURN_SELECTED_SUBREDDITS, selectedSubreddits); + returnIntent.putParcelableArrayListExtra(EXTRA_RETURN_SELECTED_SUBREDDITS, selectedSubreddits); setResult(RESULT_OK, returnIntent); finish(); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/SelectedSubredditsRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/SelectedSubredditsRecyclerViewAdapter.java index ef1afcc6..afc2acef 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/SelectedSubredditsRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/SelectedSubredditsRecyclerViewAdapter.java @@ -6,20 +6,30 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.RequestManager; +import com.bumptech.glide.request.RequestOptions; + import java.util.ArrayList; +import jp.wasabeef.glide.transformations.RoundedCornersTransformation; +import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.activities.BaseActivity; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.databinding.ItemSelectedSubredditBinding; +import ml.docilealligator.infinityforreddit.multireddit.ExpandedSubredditInMultiReddit; public class SelectedSubredditsRecyclerViewAdapter extends RecyclerView.Adapter { private final BaseActivity activity; private final CustomThemeWrapper customThemeWrapper; - private final ArrayList subreddits; + private final RequestManager glide; + private final ArrayList subreddits; - public SelectedSubredditsRecyclerViewAdapter(BaseActivity activity, CustomThemeWrapper customThemeWrapper, ArrayList subreddits) { + public SelectedSubredditsRecyclerViewAdapter(BaseActivity activity, CustomThemeWrapper customThemeWrapper, + RequestManager glide, + ArrayList subreddits) { this.activity = activity; this.customThemeWrapper = customThemeWrapper; + this.glide = glide; if (subreddits == null) { this.subreddits = new ArrayList<>(); } else { @@ -37,7 +47,12 @@ public class SelectedSubredditsRecyclerViewAdapter extends RecyclerView.Adapter< @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (holder instanceof SubredditViewHolder) { - ((SubredditViewHolder) holder).binding.subredditNameItemSelectedSubreddit.setText(subreddits.get(holder.getBindingAdapterPosition())); + glide.load(subreddits.get(holder.getBindingAdapterPosition()).getIconUrl()) + .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) + .error(glide.load(R.drawable.subreddit_default_icon) + .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))) + .into(((SubredditViewHolder) holder).binding.iconImageViewItemSelectedSubreddit); + ((SubredditViewHolder) holder).binding.subredditNameItemSelectedSubreddit.setText(subreddits.get(holder.getBindingAdapterPosition()).getName()); ((SubredditViewHolder) holder).binding.deleteImageViewItemSelectedSubreddit.setOnClickListener(view -> { subreddits.remove(holder.getBindingAdapterPosition()); notifyItemRemoved(holder.getBindingAdapterPosition()); @@ -50,18 +65,26 @@ public class SelectedSubredditsRecyclerViewAdapter extends RecyclerView.Adapter< return subreddits.size(); } - public void addSubreddits(ArrayList newSubreddits) { + @Override + public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) { + super.onViewRecycled(holder); + if (holder instanceof SubredditViewHolder) { + glide.clear(((SubredditViewHolder) holder).binding.iconImageViewItemSelectedSubreddit); + } + } + + public void addSubreddits(ArrayList newSubreddits) { int oldSize = subreddits.size(); subreddits.addAll(newSubreddits); notifyItemRangeInserted(oldSize, newSubreddits.size()); } public void addUserInSubredditType(String username) { - subreddits.add(username); + subreddits.add(new ExpandedSubredditInMultiReddit(username, null)); notifyItemInserted(subreddits.size()); } - public ArrayList getSubreddits() { + public ArrayList getSubreddits() { return subreddits; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/SubredditMultiselectionRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/SubredditMultiselectionRecyclerViewAdapter.java index 03d11465..4aae8efa 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/SubredditMultiselectionRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/SubredditMultiselectionRecyclerViewAdapter.java @@ -86,11 +86,11 @@ public class SubredditMultiselectionRecyclerViewAdapter extends RecyclerView.Ada notifyDataSetChanged(); } - public ArrayList getAllSelectedSubreddits() { - ArrayList selectedSubreddits = new ArrayList<>(); + public ArrayList getAllSelectedSubreddits() { + ArrayList selectedSubreddits = new ArrayList<>(); for (SubredditWithSelection s : subscribedSubreddits) { if (s.isSelected()) { - selectedSubreddits.add(s.getName()); + selectedSubreddits.add(s); } } return selectedSubreddits; diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/SubredditListingFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/SubredditListingFragment.java index 1c6e362c..ecfd008b 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/SubredditListingFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/SubredditListingFragment.java @@ -257,17 +257,17 @@ public class SubredditListingFragment extends Fragment implements FragmentCommun return sortType; } - public ArrayList getSelectedSubredditNames() { + public ArrayList getSelectedSubredditNames() { if (mSubredditListingViewModel != null) { List allSubreddits = mSubredditListingViewModel.getSubreddits().getValue(); if (allSubreddits == null) { return null; } - ArrayList selectedSubreddits = new ArrayList<>(); + ArrayList selectedSubreddits = new ArrayList<>(); for (SubredditData s : allSubreddits) { if (s.isSelected()) { - selectedSubreddits.add(s.getName()); + selectedSubreddits.add(s); } } return selectedSubreddits; diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/AnonymousMultiredditSubreddit.java b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/AnonymousMultiredditSubreddit.java index 036a1ab0..7c104fe3 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/AnonymousMultiredditSubreddit.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/AnonymousMultiredditSubreddit.java @@ -1,6 +1,7 @@ package ml.docilealligator.infinityforreddit.multireddit; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.ForeignKey; @@ -20,10 +21,14 @@ public class AnonymousMultiredditSubreddit { @NonNull @ColumnInfo(name = "subreddit_name") private String subredditName; + @Nullable + @ColumnInfo(name = "icon_url") + private String iconUrl; - public AnonymousMultiredditSubreddit(@NonNull String path, @NonNull String subredditName) { + public AnonymousMultiredditSubreddit(@NonNull String path, @NonNull String subredditName, @Nullable String iconUrl) { this.path = path; this.subredditName = subredditName; + this.iconUrl = iconUrl; } @NonNull @@ -43,4 +48,13 @@ public class AnonymousMultiredditSubreddit { public void setSubredditName(@NonNull String subredditName) { this.subredditName = subredditName; } + + @Nullable + public String getIconUrl() { + return iconUrl; + } + + public void setIconUrl(@Nullable String iconUrl) { + this.iconUrl = iconUrl; + } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/AnonymousMultiredditSubredditDaoKt.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/AnonymousMultiredditSubredditDaoKt.kt new file mode 100644 index 00000000..bbea6364 --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/AnonymousMultiredditSubredditDaoKt.kt @@ -0,0 +1,11 @@ +package ml.docilealligator.infinityforreddit.multireddit + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy + +@Dao +interface AnonymousMultiredditSubredditDaoKt { + @Insert(onConflict = OnConflictStrategy.Companion.REPLACE) + suspend fun insertAll(anonymousMultiredditSubreddits: MutableList) +} \ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/CreateMultiReddit.java b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/CreateMultiReddit.java index 1bbf9013..62eed7dd 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/CreateMultiReddit.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/CreateMultiReddit.java @@ -33,7 +33,7 @@ public class CreateMultiReddit { params.put(APIUtils.MULTIPATH_KEY, multipath); params.put(APIUtils.MODEL_KEY, model); oauthRetrofit.create(RedditAPI.class).createMultiReddit(APIUtils.getOAuthHeader(accessToken), - params).enqueue(new Callback() { + params).enqueue(new Callback<>() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { if (response.isSuccessful()) { @@ -64,21 +64,25 @@ public class CreateMultiReddit { public static void anonymousCreateMultiReddit(Executor executor, Handler handler, RedditDataRoomDatabase redditDataRoomDatabase, String multipath, String name, String description, - List subreddits, + List subreddits, CreateMultiRedditListener createMultiRedditListener) { executor.execute(() -> { if (!redditDataRoomDatabase.accountDao().isAnonymousAccountInserted()) { redditDataRoomDatabase.accountDao().insert(Account.getAnonymousAccount()); } - redditDataRoomDatabase.multiRedditDao().insert(new MultiReddit(multipath, name, name, description, - null, null, "private", Account.ANONYMOUS_ACCOUNT, 0, System.currentTimeMillis(), true, false, false)); - List anonymousMultiredditSubreddits = new ArrayList<>(); - for (String s : subreddits) { - anonymousMultiredditSubreddits.add(new AnonymousMultiredditSubreddit(multipath, s)); - } - redditDataRoomDatabase.anonymousMultiredditSubredditDao().insertAll(anonymousMultiredditSubreddits); + if (redditDataRoomDatabase.multiRedditDao().getMultiReddit(multipath, Account.ANONYMOUS_ACCOUNT) == null) { + redditDataRoomDatabase.multiRedditDao().insert(new MultiReddit(multipath, name, name, description, + null, null, "private", Account.ANONYMOUS_ACCOUNT, 0, System.currentTimeMillis(), true, false, false)); + List anonymousMultiredditSubreddits = new ArrayList<>(); + for (ExpandedSubredditInMultiReddit s : subreddits) { + anonymousMultiredditSubreddits.add(new AnonymousMultiredditSubreddit(multipath, s.getName(), s.getIconUrl())); + } + redditDataRoomDatabase.anonymousMultiredditSubredditDao().insertAll(anonymousMultiredditSubreddits); - handler.post(createMultiRedditListener::success); + handler.post(createMultiRedditListener::success); + } else { + handler.post(() -> createMultiRedditListener.failed(0)); + } }); } } 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 1b8c06f1..23dcc418 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/EditMultiReddit.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/EditMultiReddit.java @@ -55,7 +55,7 @@ public class EditMultiReddit { ArrayList subreddits = multiReddit.getSubreddits(); redditDataRoomDatabase.multiRedditDao().insert(multiReddit); for (ExpandedSubredditInMultiReddit s : subreddits) { - anonymousMultiredditSubreddits.add(new AnonymousMultiredditSubreddit(multiReddit.getPath(), s.getName())); + anonymousMultiredditSubreddits.add(new AnonymousMultiredditSubreddit(multiReddit.getPath(), s.getName(), s.getIconUrl())); } redditDataRoomDatabase.anonymousMultiredditSubredditDao().insertAll(anonymousMultiredditSubreddits); handler.post(editMultiRedditListener::success); 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 12ffa6af..eab09a15 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/FetchMultiRedditInfo.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/FetchMultiRedditInfo.java @@ -67,7 +67,7 @@ public class FetchMultiRedditInfo { (ArrayList) redditDataRoomDatabase.anonymousMultiredditSubredditDao().getAllAnonymousMultiRedditSubreddits(multipath); ArrayList subreddits = new ArrayList<>(); for (AnonymousMultiredditSubreddit a : anonymousMultiredditSubreddits) { - subreddits.add(new ExpandedSubredditInMultiReddit(a.getSubredditName(), multiReddit.getIconUrl())); + subreddits.add(new ExpandedSubredditInMultiReddit(a.getSubredditName(), a.getIconUrl())); } multiReddit.setSubreddits(subreddits); handler.post(() -> fetchMultiRedditInfoListener.success(multiReddit)); 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 93cb38b7..b483de82 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/MultiReddit.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/MultiReddit.java @@ -233,10 +233,6 @@ public class MultiReddit implements Parcelable { return subreddits; } - public ArrayList getSubredditNames() { - return new ArrayList<>((subreddits.stream().map(ExpandedSubredditInMultiReddit::getName).collect(Collectors.toList()))); - } - public void setSubreddits(ArrayList subreddits) { this.subreddits = subreddits; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/MultiRedditDaoKt.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/MultiRedditDaoKt.kt new file mode 100644 index 00000000..692acd20 --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/MultiRedditDaoKt.kt @@ -0,0 +1,15 @@ +package ml.docilealligator.infinityforreddit.multireddit + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query + +@Dao +interface MultiRedditDaoKt { + @Insert(onConflict = OnConflictStrategy.Companion.REPLACE) + suspend fun insert(multiReddit: MultiReddit) + + @Query("SELECT * FROM multi_reddits WHERE path = :path AND username = :username COLLATE NOCASE LIMIT 1") + suspend fun getMultiReddit(path: String, username: String): MultiReddit? +} \ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/MultiRedditJSONModel.java b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/MultiRedditJSONModel.java index 60f405ef..4fc2f649 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/MultiRedditJSONModel.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/multireddit/MultiRedditJSONModel.java @@ -13,7 +13,7 @@ public class MultiRedditJSONModel { public MultiRedditJSONModel() {} public MultiRedditJSONModel(String display_name, String description_md, boolean isPrivate, - ArrayList subreddits) { + ArrayList subreddits) { this.display_name = display_name; this.description_md = description_md; if (isPrivate) { @@ -25,7 +25,7 @@ public class MultiRedditJSONModel { if (subreddits != null) { this.subreddits = new SubredditInMultiReddit[subreddits.size()]; for (int i = 0; i < subreddits.size(); i++) { - SubredditInMultiReddit subredditInMultiReddit = new SubredditInMultiReddit(subreddits.get(i)); + SubredditInMultiReddit subredditInMultiReddit = new SubredditInMultiReddit(subreddits.get(i).getName()); this.subreddits[i] = subredditInMultiReddit; } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/repositories/CopyMultiRedditActivityRepository.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/repositories/CopyMultiRedditActivityRepository.kt index f67563ab..f964df63 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/repositories/CopyMultiRedditActivityRepository.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/repositories/CopyMultiRedditActivityRepository.kt @@ -2,8 +2,14 @@ package ml.docilealligator.infinityforreddit.repositories import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import ml.docilealligator.infinityforreddit.APIError import ml.docilealligator.infinityforreddit.APIResult +import ml.docilealligator.infinityforreddit.R +import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase +import ml.docilealligator.infinityforreddit.account.Account import ml.docilealligator.infinityforreddit.apis.RedditAPIKt +import ml.docilealligator.infinityforreddit.multireddit.AnonymousMultiredditSubreddit +import ml.docilealligator.infinityforreddit.multireddit.ExpandedSubredditInMultiReddit import ml.docilealligator.infinityforreddit.multireddit.FetchMultiRedditInfo import ml.docilealligator.infinityforreddit.multireddit.MultiReddit import ml.docilealligator.infinityforreddit.utils.APIUtils @@ -16,11 +22,13 @@ import java.io.IOException interface CopyMultiRedditActivityRepository { suspend fun fetchMultiRedditInfo(multipath: String): MultiReddit? - suspend fun copyMultiReddit(multipath: String, name: String, description: String): APIResult + suspend fun copyMultiReddit(multipath: String, name: String, description: String, subreddits: List): APIResult + //suspend fun copyMultiRedditAnonymous(multipath: String, name: String, description: String, subreddits: List): APIResult } class CopyMultiRedditActivityRepositoryImpl( val oauthRetrofit: Retrofit, + val redditDataRoomDatabase: RedditDataRoomDatabase, val accessToken: String ): CopyMultiRedditActivityRepository { override suspend fun fetchMultiRedditInfo(multipath: String): MultiReddit? { @@ -40,7 +48,11 @@ class CopyMultiRedditActivityRepositoryImpl( } } - override suspend fun copyMultiReddit(multipath: String, name: String, description: String): APIResult { + override suspend fun copyMultiReddit(multipath: String, name: String, description: String, subreddits: List): APIResult { + if (accessToken.isEmpty()) { + return copyMultiRedditAnonymous(name, description, subreddits) + } + try { val params = mapOf( APIUtils.FROM_KEY to multipath, @@ -55,15 +67,50 @@ class CopyMultiRedditActivityRepositoryImpl( } } catch (e: IOException) { e.printStackTrace() - return APIResult.Error(e.localizedMessage ?: "Network error") + return APIResult.Error(APIError.Message(e.localizedMessage ?: "Network error")) } catch (e: HttpException) { e.printStackTrace() try { val errorMessage = JSONObject(e.response()?.errorBody()?.string() ?: "").getString(JSONUtils.EXPLANATION_KEY) - return APIResult.Error(errorMessage) + return APIResult.Error(APIError.Message(errorMessage)) } catch(ignore: JSONException) { - return APIResult.Error("Cannot copy multireddit.") + return APIResult.Error(APIError.MessageRes(R.string.copy_multi_reddit_failed)) } } } + + suspend fun copyMultiRedditAnonymous(name: String, description: String, subreddits: List): APIResult { + if (!redditDataRoomDatabase.accountDaoKt().isAnonymousAccountInserted()) { + redditDataRoomDatabase.accountDaoKt().insert(Account.getAnonymousAccount()) + } + + if (redditDataRoomDatabase.multiRedditDaoKt().getMultiReddit("/user/-/m/$name", Account.ANONYMOUS_ACCOUNT) != null) { + return APIResult.Error(APIError.MessageRes(R.string.duplicate_multi_reddit)) + } else { + val newMultiReddit = MultiReddit( + "/user/-/m/$name", + name, + name, + description, + null, + null, + "private", + Account.ANONYMOUS_ACCOUNT, + 0, + System.currentTimeMillis(), + true, + false, + false + ) + + redditDataRoomDatabase.multiRedditDaoKt().insert(newMultiReddit) + val anonymousMultiRedditSubreddits: MutableList = mutableListOf() + for (s in subreddits) { + anonymousMultiRedditSubreddits.add(AnonymousMultiredditSubreddit("/user/-/m/$name", s.name, s.iconUrl)) + } + redditDataRoomDatabase.anonymousMultiredditSubredditDaoKt().insertAll(anonymousMultiRedditSubreddits) + + return APIResult.Success(newMultiReddit) + } + } } \ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/subreddit/SubredditData.java b/app/src/main/java/ml/docilealligator/infinityforreddit/subreddit/SubredditData.java index 6e9a40d3..439ad773 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/subreddit/SubredditData.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/subreddit/SubredditData.java @@ -1,5 +1,8 @@ package ml.docilealligator.infinityforreddit.subreddit; +import android.os.Parcel; +import android.os.Parcelable; + import androidx.annotation.NonNull; import androidx.room.ColumnInfo; import androidx.room.Entity; @@ -7,7 +10,7 @@ import androidx.room.Ignore; import androidx.room.PrimaryKey; @Entity(tableName = "subreddits") -public class SubredditData { +public class SubredditData implements Parcelable { @PrimaryKey @NonNull @ColumnInfo(name = "id") @@ -49,6 +52,32 @@ public class SubredditData { this.isSelected = false; } + protected SubredditData(Parcel in) { + id = in.readString(); + name = in.readString(); + iconUrl = in.readString(); + bannerUrl = in.readString(); + description = in.readString(); + sidebarDescription = in.readString(); + nSubscribers = in.readInt(); + createdUTC = in.readLong(); + suggestedCommentSort = in.readString(); + isNSFW = in.readByte() != 0; + isSelected = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public SubredditData createFromParcel(Parcel in) { + return new SubredditData(in); + } + + @Override + public SubredditData[] newArray(int size) { + return new SubredditData[size]; + } + }; + @NonNull public String getId() { return id; @@ -97,4 +126,24 @@ public class SubredditData { public void setSelected(boolean selected) { isSelected = selected; } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeString(id); + dest.writeString(name); + dest.writeString(iconUrl); + dest.writeString(bannerUrl); + dest.writeString(description); + dest.writeString(sidebarDescription); + dest.writeInt(nSubscribers); + dest.writeLong(createdUTC); + dest.writeString(suggestedCommentSort); + dest.writeByte((byte) (isNSFW ? 1 : 0)); + dest.writeByte((byte) (isSelected ? 1 : 0)); + } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/viewmodels/CopyMultiRedditActivityViewModel.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/viewmodels/CopyMultiRedditActivityViewModel.kt index 87d92bf0..d5a1fa68 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/viewmodels/CopyMultiRedditActivityViewModel.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/viewmodels/CopyMultiRedditActivityViewModel.kt @@ -8,8 +8,10 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import ml.docilealligator.infinityforreddit.APIError import ml.docilealligator.infinityforreddit.APIResult import ml.docilealligator.infinityforreddit.ActionState +import ml.docilealligator.infinityforreddit.ActionStateError import ml.docilealligator.infinityforreddit.DataLoadState import ml.docilealligator.infinityforreddit.multireddit.MultiReddit import ml.docilealligator.infinityforreddit.repositories.CopyMultiRedditActivityRepository @@ -64,12 +66,20 @@ class CopyMultiRedditActivityViewModel( _copyMultiRedditState.value = ActionState.Running viewModelScope.launch { - when (val result = copyMultiRedditActivityRepository.copyMultiReddit(multipath, _name.value, _description.value)) { + when (val result = copyMultiRedditActivityRepository.copyMultiReddit(multipath, _name.value, _description.value, (multiRedditState.value as DataLoadState.Success).data.subreddits)) { is APIResult.Success -> { _copyMultiRedditState.value = ActionState.Success(result.data) } is APIResult.Error -> { - _copyMultiRedditState.value = ActionState.Error(result.message) + val error =result.error + when (error) { + is APIError.Message -> _copyMultiRedditState.value = ActionState.Error( + ActionStateError.Message(error.message) + ) + is APIError.MessageRes -> _copyMultiRedditState.value = ActionState.Error( + ActionStateError.MessageRes(error.resId) + ) + } } } } diff --git a/app/src/main/res/layout/item_selected_subreddit.xml b/app/src/main/res/layout/item_selected_subreddit.xml index d1c26058..2c01f1ed 100644 --- a/app/src/main/res/layout/item_selected_subreddit.xml +++ b/app/src/main/res/layout/item_selected_subreddit.xml @@ -2,10 +2,13 @@ + android:padding="16dp"> + + Deleted successfully Delete failed Are you sure? + Cannot copy this multireddit. Cannot save the image Cannot save the gif