From b6ca992bcb3dd8b1a0391e7bd5df38357d3a10e6 Mon Sep 17 00:00:00 2001
From: Docile-Alligator <25734209+Docile-Alligator@users.noreply.github.com>
Date: Fri, 28 Nov 2025 14:55:40 -0500
Subject: [PATCH] Start implementing copying multireddits.
---
app/build.gradle | 30 +++++--
app/src/main/AndroidManifest.xml | 29 ++++---
.../infinityforreddit/AppComponent.java | 3 +
.../infinityforreddit/Infinity.java | 2 +
.../activities/CopyMultiRedditActivity.kt | 85 +++++++++++++++++++
.../activities/LinkResolverActivity.java | 10 +--
.../ViewMultiRedditDetailActivity.java | 19 +++--
.../customtheme/CustomThemeDao.java | 11 +++
.../customtheme/CustomThemeWrapper.java | 4 +
.../LocalCustomThemeRepository.java | 23 ++++-
.../customviews/compose/AppTheme.kt | 54 ++++++++++++
.../CopyMultiRedditActivityRepository.kt | 8 ++
.../CopyMultiRedditActivityViewModel.kt | 9 ++
.../view_multi_reddit_detail_activity.xml | 7 ++
app/src/main/res/values/strings.xml | 1 +
15 files changed, 265 insertions(+), 30 deletions(-)
create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/activities/CopyMultiRedditActivity.kt
create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/customviews/compose/AppTheme.kt
create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/repositories/CopyMultiRedditActivityRepository.kt
create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/viewmodels/CopyMultiRedditActivityViewModel.kt
diff --git a/app/build.gradle b/app/build.gradle
index 88f654d1..e41f9962 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,6 +1,7 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
+ id 'org.jetbrains.kotlin.kapt'
}
android {
@@ -54,8 +55,14 @@ android {
buildFeatures {
buildConfig = true
viewBinding = true
+ compose = true
}
namespace 'ml.docilealligator.infinityforreddit'
+
+ composeOptions {
+ kotlinCompilerExtensionVersion = "1.5.14"
+ }
+
kotlinOptions {
jvmTarget = '11'
}
@@ -86,7 +93,7 @@ dependencies {
implementation 'androidx.recyclerview:recyclerview:1.4.0'
def roomVersion = "2.6.1"
implementation "androidx.room:room-runtime:$roomVersion"
- annotationProcessor "androidx.room:room-compiler:$roomVersion"
+ kapt "androidx.room:room-compiler:$roomVersion"
implementation "androidx.room:room-guava:$roomVersion"
implementation "androidx.room:room-ktx:$roomVersion"
implementation 'androidx.viewpager2:viewpager2:1.1.0'
@@ -117,7 +124,7 @@ dependencies {
// Dependency injection
def daggerVersion = '2.51.1'
implementation "com.google.dagger:dagger:$daggerVersion"
- annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
+ kapt "com.google.dagger:dagger-compiler:$daggerVersion"
// Binding
compileOnly 'com.android.databinding:viewbinding:8.5.1'
@@ -125,7 +132,7 @@ dependencies {
// Events
def eventbusVersion = "3.3.1"
implementation "org.greenrobot:eventbus:$eventbusVersion"
- annotationProcessor "org.greenrobot:eventbus-annotation-processor:$eventbusVersion"
+ kapt "org.greenrobot:eventbus-annotation-processor:$eventbusVersion"
// TransactionTooLargeException avoidance
implementation 'com.github.livefront:bridge:v2.0.2'
@@ -134,7 +141,7 @@ dependencies {
// NOTE: Deprecated
def stateVersion = "1.4.1"
implementation "com.evernote:android-state:$stateVersion"
- annotationProcessor "com.evernote:android-state-processor:$stateVersion"
+ kapt "com.evernote:android-state-processor:$stateVersion"
// Object to JSON
// NOTE: Replace with Squareup's Moshi?
@@ -155,7 +162,7 @@ dependencies {
//Image loading
def glideVersion = "5.0.5"
implementation "com.github.bumptech.glide:glide:$glideVersion"
- annotationProcessor "com.github.bumptech.glide:compiler:$glideVersion"
+ kapt "com.github.bumptech.glide:compiler:$glideVersion"
implementation 'jp.wasabeef:glide-transformations:4.3.0'
implementation 'com.github.santalu:aspect-ratio-imageview:1.0.9'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.29'
@@ -203,6 +210,19 @@ dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5'
+ // Compose
+ def composeBom = platform('androidx.compose:compose-bom:2025.11.01')
+ implementation composeBom
+ androidTestImplementation composeBom
+ implementation 'androidx.compose.material3:material3'
+ implementation 'androidx.compose.ui:ui-tooling-preview'
+ debugImplementation 'androidx.compose.ui:ui-tooling'
+ //implementation 'androidx.compose.material3.adaptive:adaptive'
+ implementation 'androidx.activity:activity-compose:1.10.1'
+ implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.9.4'
+ implementation 'androidx.compose.runtime:runtime-livedata'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0'
+
/**** Builds and flavors ****/
// debugImplementation because LeakCanary should only run in debug builds.
//debugImplementation 'com.squareup.leakcanary:leakcanary-android:x.y'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d75c2e09..f72fd35f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -28,22 +28,24 @@
+
-
+ android:parentActivityName=".activities.MainActivity"
+ android:theme="@style/AppTheme.NoActionBar">
@@ -54,7 +56,6 @@
android:host="localhost"
android:scheme="infinity" />
-
+ android:exported="false"
+ android:permission="android.permission.BIND_JOB_SERVICE" />
+ android:exported="false"
+ android:permission="android.permission.BIND_JOB_SERVICE" />
+ android:exported="false"
+ android:permission="android.permission.BIND_JOB_SERVICE" />
+ android:exported="false"
+ android:permission="android.permission.BIND_JOB_SERVICE" />
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java
index a0eff30e..5a1e2126 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java
@@ -11,6 +11,7 @@ import ml.docilealligator.infinityforreddit.activities.AccountSavedThingActivity
import ml.docilealligator.infinityforreddit.activities.CommentActivity;
import ml.docilealligator.infinityforreddit.activities.CommentFilterPreferenceActivity;
import ml.docilealligator.infinityforreddit.activities.CommentFilterUsageListingActivity;
+import ml.docilealligator.infinityforreddit.activities.CopyMultiRedditActivity;
import ml.docilealligator.infinityforreddit.activities.CreateMultiRedditActivity;
import ml.docilealligator.infinityforreddit.activities.CustomThemeListingActivity;
import ml.docilealligator.infinityforreddit.activities.CustomThemePreviewActivity;
@@ -318,6 +319,8 @@ public interface AppComponent {
void inject(ProxyPreferenceFragment proxyPreferenceFragment);
+ void inject(CopyMultiRedditActivity copyMultiRedditActivity);
+
@Component.Factory
interface Factory {
AppComponent create(@BindsInstance Application application);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java
index 4e2da121..def07fef 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java
@@ -60,6 +60,8 @@ public class Infinity extends Application implements LifecycleObserver {
private boolean canStartLockScreenActivity = false;
private boolean isSecureMode;
@Inject
+ public RedditDataRoomDatabase mRedditDataRoomDatabase;
+ @Inject
@Named("default")
SharedPreferences mSharedPreferences;
@Inject
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CopyMultiRedditActivity.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CopyMultiRedditActivity.kt
new file mode 100644
index 00000000..5146125c
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CopyMultiRedditActivity.kt
@@ -0,0 +1,85 @@
+package ml.docilealligator.infinityforreddit.activities
+
+import android.content.SharedPreferences
+import android.os.Bundle
+import androidx.activity.compose.setContent
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Scaffold
+import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
+import androidx.compose.material3.TopAppBarDefaults
+import ml.docilealligator.infinityforreddit.Infinity
+import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase
+import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper
+import ml.docilealligator.infinityforreddit.customviews.compose.AppTheme
+import retrofit2.Retrofit
+import java.util.concurrent.Executor
+import javax.inject.Inject
+import javax.inject.Named
+
+@OptIn(ExperimentalMaterial3Api::class)
+class CopyMultiRedditActivity : BaseActivity() {
+ @Inject
+ @Named("oauth")
+ lateinit var mOauthRetrofit: Retrofit
+
+ @Inject
+ lateinit var mRedditDataRoomDatabase: RedditDataRoomDatabase
+
+ @Inject
+ @Named("default")
+ lateinit var mSharedPreferences: SharedPreferences
+
+ @Inject
+ @Named("current_account")
+ lateinit var mCurrentAccountSharedPreferences: SharedPreferences
+
+ @Inject
+ lateinit var mCustomThemeWrapper: CustomThemeWrapper
+
+ @Inject
+ lateinit var mExecutor: Executor
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ ((application) as Infinity).appComponent.inject(this)
+
+ super.onCreate(savedInstanceState)
+
+ setContent {
+ AppTheme(customThemeWrapper.themeType) {
+ Scaffold(
+ topBar = {
+ TopAppBar(
+ colors = TopAppBarDefaults.topAppBarColors(
+ containerColor = MaterialTheme.colorScheme.primaryContainer,
+ titleContentColor = MaterialTheme.colorScheme.primary,
+ ),
+ title = {
+ Text("Small Top App Bar")
+ }
+ )
+ },
+ ) { innerPadding ->
+
+ }
+ }
+ }
+ }
+
+ override fun getDefaultSharedPreferences(): SharedPreferences? {
+ return mSharedPreferences
+ }
+
+ override fun getCurrentAccountSharedPreferences(): SharedPreferences? {
+ return mCurrentAccountSharedPreferences
+ }
+
+ override fun getCustomThemeWrapper(): CustomThemeWrapper? {
+ return mCustomThemeWrapper
+ }
+
+ override fun applyCustomTheme() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/LinkResolverActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/LinkResolverActivity.java
index 41fd98a8..4e7b5d0e 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/LinkResolverActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/LinkResolverActivity.java
@@ -50,7 +50,6 @@ public class LinkResolverActivity extends AppCompatActivity {
private static final String SHARELINK_SUBREDDIT_PATTERN = "/r/[\\w-]+/s/[\\w-]+";
private static final String SHARELINK_USER_PATTERN = "/u/[\\w-]+/s/[\\w-]+";
private static final String SIDEBAR_PATTERN = "/[rR]/[\\w-]+/about/sidebar";
- private static final String MULTIREDDIT_PATTERN = "/user/[\\w-]+/m/\\w+/?";
private static final String MULTIREDDIT_PATTERN_2 = "/[rR]/(\\w+\\+?)+/?";
private static final String REDD_IT_POST_PATTERN = "/\\w+/?";
private static final String REDGIFS_PATTERN = "/watch/[\\w-]+$";
@@ -201,6 +200,11 @@ public class LinkResolverActivity extends AppCompatActivity {
} catch (Exception e) {
deepLinkError(uri);
}
+ } else if(segments.size() == 4 && segments.get(0).equals("user") && segments.get(2).equals("m")) {
+ // Multireddit
+ Intent intent = new Intent(this, ViewMultiRedditDetailActivity.class);
+ intent.putExtra(ViewMultiRedditDetailActivity.EXTRA_MULTIREDDIT_PATH, path);
+ startActivity(intent);
} else if (path.matches(POST_PATTERN) || path.matches(POST_PATTERN_2)) {
int commentsIndex = segments.lastIndexOf("comments");
if (commentsIndex >= 0 && commentsIndex < segments.size() - 1) {
@@ -263,10 +267,6 @@ public class LinkResolverActivity extends AppCompatActivity {
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, path.substring(3, path.length() - 14));
intent.putExtra(ViewSubredditDetailActivity.EXTRA_VIEW_SIDEBAR, true);
startActivity(intent);
- } else if (path.matches(MULTIREDDIT_PATTERN)) {
- Intent intent = new Intent(this, ViewMultiRedditDetailActivity.class);
- intent.putExtra(ViewMultiRedditDetailActivity.EXTRA_MULTIREDDIT_PATH, path);
- startActivity(intent);
} else if (path.matches(MULTIREDDIT_PATTERN_2)) {
String subredditName = path.substring(3);
Intent intent = new Intent(this, ViewSubredditDetailActivity.class);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewMultiRedditDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewMultiRedditDetailActivity.java
index 2b2de8ae..45683d2a 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewMultiRedditDetailActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewMultiRedditDetailActivity.java
@@ -116,9 +116,6 @@ public class ViewMultiRedditDetailActivity extends BaseActivity implements SortT
@Named("current_account")
SharedPreferences mCurrentAccountSharedPreferences;
@Inject
- @Named("bottom_app_bar")
- SharedPreferences bottomAppBarSharedPreference;
- @Inject
@Named("nsfw_and_spoiler")
SharedPreferences mNsfwAndSpoilerSharedPreferences;
@Inject
@@ -383,7 +380,7 @@ public class ViewMultiRedditDetailActivity extends BaseActivity implements SortT
navigationWrapper.floatingActionButton.setLayoutParams(lp);
}
- fabOption = bottomAppBarSharedPreference.getInt(SharedPreferencesUtils.OTHER_ACTIVITIES_BOTTOM_APP_BAR_FAB, SharedPreferencesUtils.OTHER_ACTIVITIES_BOTTOM_APP_BAR_FAB_SUBMIT_POSTS);
+ fabOption = mBottomAppBarSharedPreference.getInt(SharedPreferencesUtils.OTHER_ACTIVITIES_BOTTOM_APP_BAR_FAB, SharedPreferencesUtils.OTHER_ACTIVITIES_BOTTOM_APP_BAR_FAB_SUBMIT_POSTS);
switch (fabOption) {
case SharedPreferencesUtils.OTHER_ACTIVITIES_BOTTOM_APP_BAR_FAB_REFRESH:
navigationWrapper.floatingActionButton.setImageResource(R.drawable.ic_refresh_day_night_24dp);
@@ -717,7 +714,7 @@ public class ViewMultiRedditDetailActivity extends BaseActivity implements SortT
autoCompleteRunnable = () -> {
subredditAutocompleteCall = mOauthRetrofit.create(RedditAPI.class).subredditAutocomplete(APIUtils.getOAuthHeader(accessToken),
currentQuery, nsfw);
- subredditAutocompleteCall.enqueue(new Callback() {
+ subredditAutocompleteCall.enqueue(new Callback<>() {
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) {
subredditAutocompleteCall = null;
@@ -812,6 +809,14 @@ public class ViewMultiRedditDetailActivity extends BaseActivity implements SortT
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.view_multi_reddit_detail_activity, menu);
+ if (multiReddit == null && multiPath != null) {
+ String[] segments = multiPath.split("/");
+ if (segments.length > 2 && !segments[1].equals(accountName)) {
+ menu.findItem(R.id.action_edit_view_multi_reddit_detail_activity).setVisible(false);
+ menu.findItem(R.id.action_delete_view_multi_reddit_detail_activity).setVisible(false);
+ menu.findItem(R.id.action_copy_view_multi_reddit_detail_activity).setVisible(true);
+ }
+ }
applyMenuItemTheme(menu);
return true;
}
@@ -882,6 +887,10 @@ public class ViewMultiRedditDetailActivity extends BaseActivity implements SortT
.setNegativeButton(R.string.cancel, null)
.show();
return true;
+ } else if (itemId == R.id.action_copy_view_multi_reddit_detail_activity) {
+ Intent intent = new Intent(this, CopyMultiRedditActivity.class);
+ startActivity(intent);
+ return true;
}
return false;
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/customtheme/CustomThemeDao.java b/app/src/main/java/ml/docilealligator/infinityforreddit/customtheme/CustomThemeDao.java
index 172d36e5..5f4acf00 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/customtheme/CustomThemeDao.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/customtheme/CustomThemeDao.java
@@ -8,6 +8,8 @@ import androidx.room.Query;
import java.util.List;
+import kotlinx.coroutines.flow.Flow;
+
@Dao
public interface CustomThemeDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
@@ -40,6 +42,15 @@ public interface CustomThemeDao {
@Query("SELECT * FROM custom_themes WHERE is_amoled_theme = 1 LIMIT 1")
LiveData getAmoledCustomThemeLiveData();
+ @Query("SELECT * FROM custom_themes WHERE is_light_theme = 1 LIMIT 1")
+ Flow getLightCustomThemeFlow();
+
+ @Query("SELECT * FROM custom_themes WHERE is_dark_theme = 1 LIMIT 1")
+ Flow getDarkCustomThemeFlow();
+
+ @Query("SELECT * FROM custom_themes WHERE is_amoled_theme = 1 LIMIT 1")
+ Flow getAmoledCustomThemeFlow();
+
@Query("SELECT * FROM custom_themes WHERE name = :name COLLATE NOCASE LIMIT 1")
CustomTheme getCustomTheme(String name);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/customtheme/CustomThemeWrapper.java b/app/src/main/java/ml/docilealligator/infinityforreddit/customtheme/CustomThemeWrapper.java
index bb49a776..f26c9630 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/customtheme/CustomThemeWrapper.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/customtheme/CustomThemeWrapper.java
@@ -48,6 +48,10 @@ public class CustomThemeWrapper {
}
}
+ public int getThemeType() {
+ return themeType;
+ }
+
public void setThemeType(int themeType) {
this.themeType = themeType;
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/customtheme/LocalCustomThemeRepository.java b/app/src/main/java/ml/docilealligator/infinityforreddit/customtheme/LocalCustomThemeRepository.java
index 3a610ec9..81886d7e 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/customtheme/LocalCustomThemeRepository.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/customtheme/LocalCustomThemeRepository.java
@@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData;
import java.util.List;
+import kotlinx.coroutines.flow.Flow;
import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
public class LocalCustomThemeRepository {
@@ -12,11 +13,19 @@ public class LocalCustomThemeRepository {
private final LiveData mCurrentDarkCustomTheme;
private final LiveData mCurrentAmoledCustomTheme;
- LocalCustomThemeRepository(RedditDataRoomDatabase redditDataRoomDatabase) {
+ private final Flow mCurrentLightCustomThemeFlow;
+ private final Flow mCurrentDarkCustomThemeFlow;
+ private final Flow mCurrentAmoledCustomThemeFlow;
+
+ public LocalCustomThemeRepository(RedditDataRoomDatabase redditDataRoomDatabase) {
mAllCustomThemes = redditDataRoomDatabase.customThemeDao().getAllCustomThemes();
mCurrentLightCustomTheme = redditDataRoomDatabase.customThemeDao().getLightCustomThemeLiveData();
mCurrentDarkCustomTheme = redditDataRoomDatabase.customThemeDao().getDarkCustomThemeLiveData();
mCurrentAmoledCustomTheme = redditDataRoomDatabase.customThemeDao().getAmoledCustomThemeLiveData();
+
+ mCurrentLightCustomThemeFlow = redditDataRoomDatabase.customThemeDao().getLightCustomThemeFlow();
+ mCurrentDarkCustomThemeFlow = redditDataRoomDatabase.customThemeDao().getDarkCustomThemeFlow();
+ mCurrentAmoledCustomThemeFlow = redditDataRoomDatabase.customThemeDao().getAmoledCustomThemeFlow();
}
LiveData> getAllCustomThemes() {
@@ -34,4 +43,16 @@ public class LocalCustomThemeRepository {
LiveData getCurrentAmoledCustomTheme() {
return mCurrentAmoledCustomTheme;
}
+
+ public Flow getCurrentLightCustomThemeFlow() {
+ return mCurrentLightCustomThemeFlow;
+ }
+
+ public Flow getCurrentDarkCustomThemeFlow() {
+ return mCurrentDarkCustomThemeFlow;
+ }
+
+ public Flow getCurrentAmoledCustomThemeFlow() {
+ return mCurrentAmoledCustomThemeFlow;
+ }
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/customviews/compose/AppTheme.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/customviews/compose/AppTheme.kt
new file mode 100644
index 00000000..473c9191
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/customviews/compose/AppTheme.kt
@@ -0,0 +1,54 @@
+package ml.docilealligator.infinityforreddit.customviews.compose
+
+import android.content.Context
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.staticCompositionLocalOf
+import androidx.compose.ui.platform.LocalContext
+import kotlinx.coroutines.flow.map
+import ml.docilealligator.infinityforreddit.Infinity
+import ml.docilealligator.infinityforreddit.customtheme.CustomTheme
+import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper
+import ml.docilealligator.infinityforreddit.customtheme.LocalCustomThemeRepository
+import ml.docilealligator.infinityforreddit.utils.CustomThemeSharedPreferencesUtils
+
+val LocalAppTheme = staticCompositionLocalOf {
+ error("No default theme values")
+}
+
+@Composable
+fun AppTheme(themeType: Int, content: @Composable () -> Unit) {
+ val context = LocalContext.current
+ val localCustomThemeRepository = LocalCustomThemeRepository(((context.applicationContext) as Infinity).mRedditDataRoomDatabase)
+
+ val currentThemeFlow = when(themeType) {
+ CustomThemeSharedPreferencesUtils.LIGHT -> localCustomThemeRepository.currentLightCustomThemeFlow
+ CustomThemeSharedPreferencesUtils.DARK -> localCustomThemeRepository.currentDarkCustomThemeFlow
+ CustomThemeSharedPreferencesUtils.AMOLED -> localCustomThemeRepository.currentAmoledCustomThemeFlow
+ else -> localCustomThemeRepository.currentLightCustomThemeFlow
+ }
+
+ val customTheme by currentThemeFlow.map {
+ it ?: getDefaultTheme(context, themeType)
+ }.collectAsState(
+ getDefaultTheme(context, themeType)
+ )
+
+ CompositionLocalProvider(LocalAppTheme provides customTheme) {
+ MaterialTheme {
+ content()
+ }
+ }
+}
+
+private fun getDefaultTheme(context: Context, themeType: Int): CustomTheme {
+ return when(themeType) {
+ CustomThemeSharedPreferencesUtils.LIGHT -> CustomThemeWrapper.getIndigo(context)
+ CustomThemeSharedPreferencesUtils.DARK -> CustomThemeWrapper.getIndigoDark(context)
+ CustomThemeSharedPreferencesUtils.AMOLED -> CustomThemeWrapper.getIndigoAmoled(context)
+ else -> CustomThemeWrapper.getIndigo(context)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/repositories/CopyMultiRedditActivityRepository.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/repositories/CopyMultiRedditActivityRepository.kt
new file mode 100644
index 00000000..e2037a66
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/repositories/CopyMultiRedditActivityRepository.kt
@@ -0,0 +1,8 @@
+package ml.docilealligator.infinityforreddit.repositories
+
+import retrofit2.Retrofit
+
+class CopyMultiRedditActivityRepository(
+ oauthRetrofit: Retrofit
+) {
+}
\ No newline at end of file
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/viewmodels/CopyMultiRedditActivityViewModel.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/viewmodels/CopyMultiRedditActivityViewModel.kt
new file mode 100644
index 00000000..c48d074b
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/viewmodels/CopyMultiRedditActivityViewModel.kt
@@ -0,0 +1,9 @@
+package ml.docilealligator.infinityforreddit.viewmodels
+
+import androidx.lifecycle.ViewModel
+import ml.docilealligator.infinityforreddit.repositories.CopyMultiRedditActivityRepository
+
+class CopyMultiRedditActivityViewModel(
+ copyMultiRedditActivityRepository: CopyMultiRedditActivityRepository
+): ViewModel() {
+}
\ No newline at end of file
diff --git a/app/src/main/res/menu/view_multi_reddit_detail_activity.xml b/app/src/main/res/menu/view_multi_reddit_detail_activity.xml
index aabbdc96..247464e4 100644
--- a/app/src/main/res/menu/view_multi_reddit_detail_activity.xml
+++ b/app/src/main/res/menu/view_multi_reddit_detail_activity.xml
@@ -39,4 +39,11 @@
android:orderInCategory="6"
android:title="@string/action_delete_multi_reddit"
app:showAsAction="never" />
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 9d116ff7..89f3ab0e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -74,6 +74,7 @@
Save
Edit MultiReddit
Delete Multireddit
+ Copy Multireddit
Share
Preview
Report