Big progress on multicomminities

Now most of the stuff is working!
This commit is contained in:
Balazs Toldi
2024-01-05 15:01:03 +01:00
parent 726eac70a9
commit 4f3e09c84b
13 changed files with 99 additions and 94 deletions

View File

@@ -49,7 +49,7 @@ public class FetchPostFilterReadPostsAndConcatenatedSubredditNames {
if (anonymousSubscribedSubreddits != null && !anonymousSubscribedSubreddits.isEmpty()) {
StringBuilder stringBuilder = new StringBuilder();
for (SubscribedSubredditData s : anonymousSubscribedSubreddits) {
stringBuilder.append(s.getName()).append("+");
stringBuilder.append(s.getQualified_name()).append(",");
}
if (stringBuilder.length() > 0) {
stringBuilder.deleteCharAt(stringBuilder.length() - 1);

View File

@@ -12,7 +12,6 @@ import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Switch;
import android.widget.TextView;
import androidx.annotation.NonNull;
@@ -25,6 +24,7 @@ import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.appbar.CollapsingToolbarLayout;
import com.google.android.material.snackbar.Snackbar;
import java.util.ArrayList;
import java.util.concurrent.Executor;
import javax.inject.Inject;
@@ -40,6 +40,7 @@ import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
import eu.toldi.infinityforlemmy.multireddit.EditMultiReddit;
import eu.toldi.infinityforlemmy.multireddit.FetchMultiRedditInfo;
import eu.toldi.infinityforlemmy.multireddit.MultiReddit;
import eu.toldi.infinityforlemmy.subreddit.SubredditWithSelection;
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
import eu.toldi.infinityforlemmy.utils.Utils;
import retrofit2.Retrofit;
@@ -69,12 +70,6 @@ public class EditMultiRedditActivity extends BaseActivity {
EditText descriptionEditText;
@BindView(R.id.divider_2_edit_multi_reddit_activity)
View divider2;
@BindView(R.id.visibility_wrapper_linear_layout_edit_multi_reddit_activity)
LinearLayout visibilityLinearLayout;
@BindView(R.id.visibility_text_view_edit_multi_reddit_activity)
TextView visibilityTextView;
@BindView(R.id.visibility_switch_edit_multi_reddit_activity)
Switch visibilitySwitch;
@BindView(R.id.select_subreddit_text_view_edit_multi_reddit_activity)
TextView selectSubredditTextView;
@Inject
@@ -125,7 +120,6 @@ public class EditMultiRedditActivity extends BaseActivity {
mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, "-");
if (mAccessToken == null) {
visibilityLinearLayout.setVisibility(View.GONE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
nameEditText.setImeOptions(nameEditText.getImeOptions() | EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING);
descriptionEditText.setImeOptions(descriptionEditText.getImeOptions() | EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING);
@@ -167,13 +161,21 @@ public class EditMultiRedditActivity extends BaseActivity {
linearLayout.setVisibility(View.VISIBLE);
nameEditText.setText(multiReddit.getDisplayName());
descriptionEditText.setText(multiReddit.getDescription());
visibilitySwitch.setChecked(!multiReddit.getVisibility().equals("public"));
}
selectSubredditTextView.setOnClickListener(view -> {
Intent intent = new Intent(EditMultiRedditActivity.this, SelectedSubredditsAndUsersActivity.class);
if (multiReddit.getSubreddits() != null) {
intent.putParcelableArrayListExtra(SelectedSubredditsAndUsersActivity.EXTRA_SELECTED_SUBREDDITS, multiReddit.getSubreddits());
if (multiReddit.getSubreddits().isEmpty()) {
String[] communities = multiReddit.getPath().split(",");
ArrayList<SubredditWithSelection> communitiesList = new ArrayList<>();
for (String community : communities) {
communitiesList.add(new SubredditWithSelection(community.substring(0, community.indexOf('@')), null, community));
}
intent.putParcelableArrayListExtra(SelectedSubredditsAndUsersActivity.EXTRA_SELECTED_SUBREDDITS, communitiesList);
} else {
intent.putParcelableArrayListExtra(SelectedSubredditsAndUsersActivity.EXTRA_SELECTED_SUBREDDITS, multiReddit.getSubreddits());
}
}
startActivityForResult(intent, SUBREDDIT_SELECTION_REQUEST_CODE);
});
@@ -203,8 +205,18 @@ public class EditMultiRedditActivity extends BaseActivity {
multiReddit.setDisplayName(name);
multiReddit.setName(name);
multiReddit.setDescription(descriptionEditText.getText().toString());
StringBuilder pathStringBuilder = new StringBuilder();
String prefix = "";
for (SubredditWithSelection s : multiReddit.getSubreddits()) {
pathStringBuilder.append(prefix);
prefix = ",";
pathStringBuilder.append(s.getQualifiedName());
}
multiReddit.setPath(pathStringBuilder.toString());
EditMultiReddit.anonymousEditMultiReddit(mExecutor, new Handler(), mRedditDataRoomDatabase,
multiReddit, new EditMultiReddit.EditMultiRedditListener() {
multiReddit, multipath, new EditMultiReddit.EditMultiRedditListener() {
@Override
public void success() {
finish();
@@ -263,7 +275,6 @@ public class EditMultiRedditActivity extends BaseActivity {
divider2.setBackgroundColor(dividerColor);
descriptionEditText.setTextColor(primaryTextColor);
descriptionEditText.setHintTextColor(secondaryTextColor);
visibilityTextView.setTextColor(primaryTextColor);
selectSubredditTextView.setTextColor(primaryTextColor);
if (typeface != null) {

View File

@@ -28,7 +28,6 @@ import eu.toldi.infinityforlemmy.ActivityToolbarInterface;
import eu.toldi.infinityforlemmy.Infinity;
import eu.toldi.infinityforlemmy.R;
import eu.toldi.infinityforlemmy.adapters.SelectedSubredditsRecyclerViewAdapter;
import eu.toldi.infinityforlemmy.bottomsheetfragments.SelectSubredditsOrUsersOptionsBottomSheetFragment;
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
@@ -109,8 +108,7 @@ public class SelectedSubredditsAndUsersActivity extends BaseActivity implements
});
fab.setOnClickListener(view -> {
SelectSubredditsOrUsersOptionsBottomSheetFragment selectSubredditsOrUsersOptionsBottomSheetFragment = new SelectSubredditsOrUsersOptionsBottomSheetFragment();
selectSubredditsOrUsersOptionsBottomSheetFragment.show(getSupportFragmentManager(), selectSubredditsOrUsersOptionsBottomSheetFragment.getTag());
selectSubreddits();
});
}

View File

@@ -62,10 +62,8 @@ import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
import eu.toldi.infinityforlemmy.customviews.NavigationWrapper;
import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
import eu.toldi.infinityforlemmy.events.GoBackToMainPageEvent;
import eu.toldi.infinityforlemmy.events.RefreshMultiRedditsEvent;
import eu.toldi.infinityforlemmy.events.SwitchAccountEvent;
import eu.toldi.infinityforlemmy.fragments.PostFragment;
import eu.toldi.infinityforlemmy.multireddit.DeleteMultiReddit;
import eu.toldi.infinityforlemmy.multireddit.MultiReddit;
import eu.toldi.infinityforlemmy.post.MarkPostAsRead;
import eu.toldi.infinityforlemmy.post.Post;
@@ -764,6 +762,7 @@ public class ViewMultiRedditDetailActivity extends BaseActivity implements SortT
Intent editIntent = new Intent(this, EditMultiRedditActivity.class);
editIntent.putExtra(EditMultiRedditActivity.EXTRA_MULTI_PATH, multiPath);
startActivity(editIntent);
finish();
return true;
} else if (itemId == R.id.action_delete_view_multi_reddit_detail_activity) {
new MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme)
@@ -771,30 +770,13 @@ public class ViewMultiRedditDetailActivity extends BaseActivity implements SortT
.setMessage(R.string.delete_multi_reddit_dialog_message)
.setPositiveButton(R.string.delete, (dialogInterface, i)
-> {
if (mAccessToken == null) {
DeleteMultiredditInDatabase.deleteMultiredditInDatabase(mExecutor, new Handler(), mRedditDataRoomDatabase, mAccountName, multiPath,
() -> {
Toast.makeText(this, R.string.delete_multi_reddit_success, Toast.LENGTH_SHORT).show();
finish();
});
} else {
DeleteMultiReddit.deleteMultiReddit(mExecutor, new Handler(), mOauthRetrofit, mRedditDataRoomDatabase,
mAccessToken, mAccountName, multiPath, new DeleteMultiReddit.DeleteMultiRedditListener() {
@Override
public void success() {
Toast.makeText(ViewMultiRedditDetailActivity.this,
R.string.delete_multi_reddit_success, Toast.LENGTH_SHORT).show();
EventBus.getDefault().post(new RefreshMultiRedditsEvent());
finish();
}
@Override
public void failed() {
Toast.makeText(ViewMultiRedditDetailActivity.this,
R.string.delete_multi_reddit_failed, Toast.LENGTH_SHORT).show();
}
});
}
DeleteMultiredditInDatabase.deleteMultiredditInDatabase(mExecutor, new Handler(), mRedditDataRoomDatabase, mAccountName, multiPath,
() -> {
Toast.makeText(this, R.string.delete_multi_reddit_success, Toast.LENGTH_SHORT).show();
finish();
});
})
.setNegativeButton(R.string.cancel, null)
.show();

View File

@@ -43,7 +43,7 @@ public class SelectedSubredditsRecyclerViewAdapter extends RecyclerView.Adapter<
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof SubredditViewHolder) {
((SubredditViewHolder) holder).subredditNameTextView.setText(subreddits.get(holder.getBindingAdapterPosition()).getName());
((SubredditViewHolder) holder).subredditNameTextView.setText(subreddits.get(holder.getBindingAdapterPosition()).getQualifiedName());
((SubredditViewHolder) holder).deleteButton.setOnClickListener(view -> {
subreddits.remove(holder.getBindingAdapterPosition());
notifyItemRemoved(holder.getBindingAdapterPosition());
@@ -58,7 +58,11 @@ public class SelectedSubredditsRecyclerViewAdapter extends RecyclerView.Adapter<
public void addSubreddits(ArrayList<SubredditWithSelection> newSubreddits) {
int oldSize = subreddits.size();
subreddits.addAll(newSubreddits);
for (SubredditWithSelection subreddit : newSubreddits) {
if (!subreddits.contains(subreddit)) {
subreddits.add(subreddit);
}
}
notifyItemRangeInserted(oldSize, newSubreddits.size());
}

View File

@@ -53,6 +53,7 @@ public class SubredditMultiselectionRecyclerViewAdapter extends RecyclerView.Ada
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof SubscribedSubredditViewHolder) {
((SubscribedSubredditViewHolder) holder).nameTextView.setText(subscribedSubreddits.get(position).getName());
((SubscribedSubredditViewHolder) holder).instanceTextView.setText(subscribedSubreddits.get(position).getQualifiedName().substring(subscribedSubreddits.get(position).getQualifiedName().indexOf("@")));
glide.load(subscribedSubreddits.get(position).getIconUrl())
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
.error(glide.load(R.drawable.subreddit_default_icon)
@@ -107,6 +108,9 @@ public class SubredditMultiselectionRecyclerViewAdapter extends RecyclerView.Ada
GifImageView iconImageView;
@BindView(R.id.name_text_view_item_subscribed_subreddit_multiselection)
TextView nameTextView;
@BindView(R.id.instance_text_view_item_subscribed_subreddit_multiselection)
TextView instanceTextView;
@BindView(R.id.checkbox_item_subscribed_subreddit_multiselection)
CheckBox checkBox;
@@ -115,10 +119,12 @@ public class SubredditMultiselectionRecyclerViewAdapter extends RecyclerView.Ada
this.itemView = itemView;
ButterKnife.bind(this, itemView);
nameTextView.setTextColor(primaryTextColor);
instanceTextView.setTextColor(primaryTextColor);
checkBox.setButtonTintList(ColorStateList.valueOf(colorAccent));
if (activity.typeface != null) {
nameTextView.setTypeface(activity.typeface);
instanceTextView.setTypeface(activity.typeface);
}
}
}

View File

@@ -438,7 +438,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
postType = getArguments().getInt(EXTRA_POST_TYPE);
mSwipeRefreshLayout.setEnabled(mSharedPreferences.getBoolean(SharedPreferencesUtils.PULL_TO_REFRESH, true) && postType != PostPagingSource.TYPE_ANONYMOUS_FRONT_PAGE);
mSwipeRefreshLayout.setEnabled(mSharedPreferences.getBoolean(SharedPreferencesUtils.PULL_TO_REFRESH, true));
mSwipeRefreshLayout.setOnRefreshListener(this::refresh);
accessToken = getArguments().getString(EXTRA_ACCESS_TOKEN);

View File

@@ -4,7 +4,6 @@ import android.os.Handler;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -73,12 +72,12 @@ public class CreateMultiReddit {
}
redditDataRoomDatabase.multiRedditDao().insert(new MultiReddit(multipath, name, name, description,
null, null, "private", accountName, 0, System.currentTimeMillis(), true, false, false));
List<AnonymousMultiredditSubreddit> anonymousMultiredditSubreddits = new ArrayList<>();
/*List<AnonymousMultiredditSubreddit> anonymousMultiredditSubreddits = new ArrayList<>();
for (SubredditWithSelection s : subreddits) {
anonymousMultiredditSubreddits.add(new AnonymousMultiredditSubreddit(multipath, s.getQualifiedName()));
}
redditDataRoomDatabase.anonymousMultiredditSubredditDao().insertAll(anonymousMultiredditSubreddits);
*/
handler.post(createMultiRedditListener::success);
});
}

View File

@@ -49,16 +49,14 @@ public class EditMultiReddit {
public static void anonymousEditMultiReddit(Executor executor, Handler handler,
RedditDataRoomDatabase redditDataRoomDatabase,
MultiReddit multiReddit,
MultiReddit multiReddit, String oldPath,
EditMultiRedditListener editMultiRedditListener) {
executor.execute(() -> {
ArrayList<AnonymousMultiredditSubreddit> anonymousMultiredditSubreddits = new ArrayList<>();
ArrayList<SubredditWithSelection> subreddits = multiReddit.getSubreddits();
redditDataRoomDatabase.multiRedditDao().anonymousDeleteMultiReddit(oldPath);
redditDataRoomDatabase.multiRedditDao().insert(multiReddit);
for (SubredditWithSelection s : subreddits) {
anonymousMultiredditSubreddits.add(new AnonymousMultiredditSubreddit(multiReddit.getPath(), s.getQualifiedName()));
}
redditDataRoomDatabase.anonymousMultiredditSubredditDao().insertAll(anonymousMultiredditSubreddits);
handler.post(editMultiRedditListener::success);
});
}

View File

@@ -19,6 +19,7 @@ import androidx.paging.PagingDataTransforms;
import androidx.paging.PagingLiveData;
import androidx.paging.PagingSource;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.regex.Pattern;
@@ -249,8 +250,9 @@ public class PostViewModel extends ViewModel {
break;
case PostPagingSource.TYPE_MULTI_REDDIT:
case PostPagingSource.TYPE_ANONYMOUS_FRONT_PAGE:
paging3PagingSource = new MulticommunityPagingSource(retrofit.getRetrofit().create(LemmyAPI.class), List.of(name.split(Pattern.quote(","))), accessToken,
sortType, executor, postFilter, readPostList, postEnricher);
String[] communities = (name != null) ? name.split(Pattern.quote(",")) : new String[0];
paging3PagingSource = new MulticommunityPagingSource(retrofit.getRetrofit().create(LemmyAPI.class), List.of(communities), accessToken,
sortType, executor, postFilter, (readPostList != null) ? readPostList : new ArrayList<>(), postEnricher);
break;
case PostPagingSource.TYPE_SEARCH:
paging3PagingSource = new PostPagingSource(executor, retrofit, accessToken, accountName,
@@ -387,12 +389,12 @@ public class PostViewModel extends ViewModel {
this.executor = executor;
this.retrofit = retrofit;
this.sharedPreferences = sharedPreferences;
// TODO is this used? because it is getting overwritten with opt
this.name = concatenatedSubredditNames;
this.postType = postType;
this.sortType = sortType;
this.postFilter = postFilter;
this.name = opt;
this.postEnricher = postEnricher;
}

View File

@@ -22,7 +22,7 @@ import java.util.concurrent.Executor
class MulticommunityPagingSource(
private val api: LemmyAPI,
private val communities: List<String>,
private val accessToken: String,
private val accessToken: String?,
private val sortType: SortType,
private val executor: Executor,
private val postFilter: PostFilter,
@@ -41,12 +41,14 @@ class MulticommunityPagingSource(
val wasCached = mutableMapOf<String, Boolean>()
// Loop through each community and fetch posts
for ((community, pageNumber) in currentPageMap) {
if (community == "all") continue // Skip all
if (undisplayedPosts.containsKey(community) && undisplayedPosts[community]!!.size > 10) {
val posts: List<Post> = undisplayedPosts[community] ?: listOf()
combinedPosts.addAll(posts)
undisplayedPosts[community]!!.clear() // Clear used posts
wasCached[community] = true
// Add a dummy future to the list
futuresList.add(Futures.immediateFuture(LoadResult.Page(posts, null, null)))
} else {
val future = fetchPostsFromCommunity(api, pageNumber, community)
futuresList.add(future)
@@ -71,6 +73,7 @@ class MulticommunityPagingSource(
// Handle other cases like LoadResult.Error
}
val sorted = when (sortType.type) {
SortType.Type.NEW -> {
sortByNewest(combinedPosts)
@@ -97,10 +100,18 @@ class MulticommunityPagingSource(
}
}
if (currentPageMap.containsKey("all")) {
nextPageMap["all"] = filteredPosts.size + currentPageMap["all"]!!
} else {
nextPageMap["all"] = filteredPosts.size
}
LoadResult.Page(
data = filteredPosts,
prevKey = null, // Define prevKey logic if needed
nextKey = nextPageMap
nextKey = if (filteredPosts.isNotEmpty()) nextPageMap else null
)
}, executor)
val partialLoadResultFuture =

View File

@@ -85,33 +85,6 @@
android:layout_width="match_parent"
android:layout_height="1dp" />
<LinearLayout
android:id="@+id/visibility_wrapper_linear_layout_edit_multi_reddit_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:padding="16dp"
tools:visibility="gone">
<TextView
android:id="@+id/visibility_text_view_edit_multi_reddit_activity"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/private_multi_reddit"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_default" />
<Switch
android:id="@+id/visibility_switch_edit_multi_reddit_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true" />
</LinearLayout>
<TextView
android:id="@+id/select_subreddit_text_view_edit_multi_reddit_activity"
android:layout_width="match_parent"

View File

@@ -18,15 +18,36 @@
android:layout_gravity="center_vertical"
android:layout_marginEnd="32dp" />
<TextView
android:id="@+id/name_text_view_item_subscribed_subreddit_multiselection"
android:layout_width="0dp"
android:layout_height="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:layout_marginEnd="32dp"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family" />
android:orientation="horizontal">
<TextView
android:id="@+id/name_text_view_item_subscribed_subreddit_multiselection"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="0dp"
android:ellipsize="end"
android:gravity="start"
android:maxLines="1"
android:fontFamily="?attr/font_family"
android:textSize="?attr/font_default" />
<TextView
android:id="@+id/instance_text_view_item_subscribed_subreddit_multiselection"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="32dp"
android:ellipsize="end"
android:gravity="start"
android:maxLines="1"
android:fontFamily="?attr/font_family"
android:textSize="?attr/font_default" />
</LinearLayout>
<CheckBox
android:id="@+id/checkbox_item_subscribed_subreddit_multiselection"