mirror of
https://github.com/Docile-Alligator/Infinity-For-Reddit.git
synced 2026-02-05 15:05:37 +00:00
Continue implementing copying multireddits. Minor bugs fixed in CreateMultiRedditActivity.
This commit is contained in:
@ -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()
|
||||
}
|
||||
@ -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()
|
||||
}
|
||||
@ -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");
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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>)
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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?
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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>
|
||||
|
||||
Reference in New Issue
Block a user