Continue implementing copying multireddits. Minor bugs fixed in CreateMultiRedditActivity.

This commit is contained in:
Docile-Alligator
2025-12-25 23:03:08 -05:00
parent cd899496f5
commit 1e92df7552
28 changed files with 338 additions and 108 deletions

View File

@ -1,6 +1,13 @@
package ml.docilealligator.infinityforreddit
import androidx.annotation.StringRes
sealed class APIResult<out T> {
data class Success<T>(val data: T): APIResult<T>()
data class Error(val message: String): APIResult<Nothing>()
data class Error(val error: APIError): APIResult<Nothing>()
}
sealed class APIError {
data class Message(val message: String) : APIError()
data class MessageRes(@StringRes val resId: Int) : APIError()
}

View File

@ -1,8 +1,15 @@
package ml.docilealligator.infinityforreddit
import androidx.annotation.StringRes
sealed interface ActionState {
object Idle: ActionState
object Running: ActionState
data class Success<T>(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()
}

View File

@ -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");
}
};
}

View File

@ -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
}

View File

@ -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<MultiReddit>).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)
}

View File

@ -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<String> mSubreddits;
private ArrayList<ExpandedSubredditInMultiReddit> 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

View File

@ -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<String> subredditNames = data.getStringArrayListExtra(
SubredditMultiselectionActivity.EXTRA_RETURN_SELECTED_SUBREDDITS);
updateSubredditsUsersNames(subredditNames, binding.excludesSubredditsTextInputEditTextCustomizePostFilterActivity);
ArrayList<SubredditWithSelection> 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<String> subredditNames = data.getStringArrayListExtra(
SubredditMultiselectionActivity.EXTRA_RETURN_SELECTED_SUBREDDITS);
updateSubredditsUsersNames(subredditNames, binding.containsSubredditsTextInputEditTextCustomizePostFilterActivity);
ArrayList<SubredditWithSelection> 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<String> usernames = data.getStringArrayListExtra(SearchActivity.RETURN_EXTRA_SELECTED_USERNAMES);
updateSubredditsUsersNames(usernames, binding.excludesUsersTextInputEditTextCustomizePostFilterActivity);

View File

@ -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

View File

@ -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<String> subredditNameList = new ArrayList<>();
subredditNameList.add(subredditData.getName());
returnIntent.putStringArrayListExtra(RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES, subredditNameList);
ArrayList<SubredditData> 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));

View File

@ -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<String> selectedSubredditNames = ((SubredditListingFragment) mFragment).getSelectedSubredditNames();
ArrayList<SubredditData> 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();
}

View File

@ -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<String> subreddits;
private ArrayList<ExpandedSubredditInMultiReddit> 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<SubredditWithSelection> 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());
}
}

View File

@ -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<String> selectedSubreddits = mAdapter.getAllSelectedSubreddits();
ArrayList<String> searchedSubreddits = data.getStringArrayListExtra(SearchActivity.RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES);
ArrayList<SubredditWithSelection> selectedSubreddits = mAdapter.getAllSelectedSubreddits();
ArrayList<SubredditData> 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();
}

View File

@ -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<RecyclerView.ViewHolder> {
private final BaseActivity activity;
private final CustomThemeWrapper customThemeWrapper;
private final ArrayList<String> subreddits;
private final RequestManager glide;
private final ArrayList<ExpandedSubredditInMultiReddit> subreddits;
public SelectedSubredditsRecyclerViewAdapter(BaseActivity activity, CustomThemeWrapper customThemeWrapper, ArrayList<String> subreddits) {
public SelectedSubredditsRecyclerViewAdapter(BaseActivity activity, CustomThemeWrapper customThemeWrapper,
RequestManager glide,
ArrayList<ExpandedSubredditInMultiReddit> 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<String> 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<ExpandedSubredditInMultiReddit> 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<String> getSubreddits() {
public ArrayList<ExpandedSubredditInMultiReddit> getSubreddits() {
return subreddits;
}

View File

@ -86,11 +86,11 @@ public class SubredditMultiselectionRecyclerViewAdapter extends RecyclerView.Ada
notifyDataSetChanged();
}
public ArrayList<String> getAllSelectedSubreddits() {
ArrayList<String> selectedSubreddits = new ArrayList<>();
public ArrayList<SubredditWithSelection> getAllSelectedSubreddits() {
ArrayList<SubredditWithSelection> selectedSubreddits = new ArrayList<>();
for (SubredditWithSelection s : subscribedSubreddits) {
if (s.isSelected()) {
selectedSubreddits.add(s.getName());
selectedSubreddits.add(s);
}
}
return selectedSubreddits;

View File

@ -257,17 +257,17 @@ public class SubredditListingFragment extends Fragment implements FragmentCommun
return sortType;
}
public ArrayList<String> getSelectedSubredditNames() {
public ArrayList<SubredditData> getSelectedSubredditNames() {
if (mSubredditListingViewModel != null) {
List<SubredditData> allSubreddits = mSubredditListingViewModel.getSubreddits().getValue();
if (allSubreddits == null) {
return null;
}
ArrayList<String> selectedSubreddits = new ArrayList<>();
ArrayList<SubredditData> selectedSubreddits = new ArrayList<>();
for (SubredditData s : allSubreddits) {
if (s.isSelected()) {
selectedSubreddits.add(s.getName());
selectedSubreddits.add(s);
}
}
return selectedSubreddits;

View File

@ -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;
}
}

View File

@ -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<AnonymousMultiredditSubreddit>)
}

View File

@ -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<String>() {
params).enqueue(new Callback<>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> 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<String> subreddits,
List<ExpandedSubredditInMultiReddit> 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<AnonymousMultiredditSubreddit> 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<AnonymousMultiredditSubreddit> 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));
}
});
}
}

View File

@ -55,7 +55,7 @@ public class EditMultiReddit {
ArrayList<ExpandedSubredditInMultiReddit> 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);

View File

@ -67,7 +67,7 @@ public class FetchMultiRedditInfo {
(ArrayList<AnonymousMultiredditSubreddit>) redditDataRoomDatabase.anonymousMultiredditSubredditDao().getAllAnonymousMultiRedditSubreddits(multipath);
ArrayList<ExpandedSubredditInMultiReddit> 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));

View File

@ -233,10 +233,6 @@ public class MultiReddit implements Parcelable {
return 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;
}

View File

@ -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?
}

View File

@ -13,7 +13,7 @@ public class MultiRedditJSONModel {
public MultiRedditJSONModel() {}
public MultiRedditJSONModel(String display_name, String description_md, boolean isPrivate,
ArrayList<String> subreddits) {
ArrayList<ExpandedSubredditInMultiReddit> 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;
}
}

View File

@ -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<MultiReddit?>
suspend fun copyMultiReddit(multipath: String, name: String, description: String, subreddits: List<ExpandedSubredditInMultiReddit>): APIResult<MultiReddit?>
//suspend fun copyMultiRedditAnonymous(multipath: String, name: String, description: String, subreddits: List<ExpandedSubredditInMultiReddit>): APIResult<MultiReddit?>
}
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<MultiReddit?> {
override suspend fun copyMultiReddit(multipath: String, name: String, description: String, subreddits: List<ExpandedSubredditInMultiReddit>): APIResult<MultiReddit?> {
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<ExpandedSubredditInMultiReddit>): APIResult<MultiReddit?> {
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<AnonymousMultiredditSubreddit> = mutableListOf()
for (s in subreddits) {
anonymousMultiRedditSubreddits.add(AnonymousMultiredditSubreddit("/user/-/m/$name", s.name, s.iconUrl))
}
redditDataRoomDatabase.anonymousMultiredditSubredditDaoKt().insertAll(anonymousMultiRedditSubreddits)
return APIResult.Success(newMultiReddit)
}
}
}

View File

@ -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<SubredditData> CREATOR = new Creator<SubredditData>() {
@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));
}
}

View File

@ -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)
)
}
}
}
}

View File

@ -2,10 +2,13 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="72dp"
android:paddingEnd="16dp">
android:padding="16dp">
<ImageView
android:id="@+id/icon_image_view_item_selected_subreddit"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_gravity="center_vertical" />
<TextView
android:id="@+id/subreddit_name_item_selected_subreddit"
@ -13,6 +16,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:layout_marginStart="32dp"
android:layout_marginEnd="16dp"
android:textSize="?attr/font_default"
android:textColor="?attr/primaryTextColor"

View File

@ -772,6 +772,7 @@
<string name="delete_multi_reddit_success">Deleted successfully</string>
<string name="delete_multi_reddit_failed">Delete failed</string>
<string name="delete_multi_reddit_dialog_message">Are you sure?</string>
<string name="copy_multi_reddit_failed">Cannot copy this multireddit.</string>
<string name="cannot_save_image">Cannot save the image</string>
<string name="cannot_save_gif">Cannot save the gif</string>