diff --git a/app/build.gradle b/app/build.gradle index f163d1e8..0cd1ba5b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,7 +28,7 @@ android { applicationId "org.pixeldroid.app" minSdkVersion 23 targetSdkVersion 32 - versionCode 15 + versionCode 16 versionName "1.0.beta" + versionCode testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -110,30 +110,30 @@ dependencies { implementation 'androidx.core:core-ktx:1.8.0' implementation 'androidx.preference:preference-ktx:1.2.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'androidx.navigation:navigation-fragment-ktx:2.4.2' - implementation 'androidx.navigation:navigation-ui-ktx:2.4.2' + implementation 'androidx.navigation:navigation-fragment-ktx:2.5.0' + implementation 'androidx.navigation:navigation-ui-ktx:2.5.0' implementation "androidx.browser:browser:1.4.0" implementation 'androidx.recyclerview:recyclerview:1.2.1' implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" - implementation 'androidx.navigation:navigation-fragment-ktx:2.4.2' - implementation 'androidx.navigation:navigation-ui-ktx:2.4.2' + implementation 'androidx.navigation:navigation-fragment-ktx:2.5.0' + implementation 'androidx.navigation:navigation-ui-ktx:2.5.0' implementation 'androidx.paging:paging-runtime-ktx:3.1.1' - implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.1' - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1' - implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.4.1' - implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-common-java8:2.4.1" - implementation "androidx.annotation:annotation:1.3.0" + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.0' + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.0" + implementation "androidx.lifecycle:lifecycle-common-java8:2.5.0" + implementation "androidx.annotation:annotation:1.4.0" implementation 'androidx.gridlayout:gridlayout:1.0.0' - implementation "androidx.activity:activity-ktx:1.4.0" - implementation 'androidx.fragment:fragment-ktx:1.4.1' + implementation "androidx.activity:activity-ktx:1.5.0" + implementation 'androidx.fragment:fragment-ktx:1.5.0' implementation 'androidx.work:work-runtime-ktx:2.7.1' implementation 'androidx.media2:media2-widget:1.2.1' implementation 'androidx.media2:media2-player:1.2.1' // Use the most recent version of CameraX - def cameraX_version = '1.1.0-rc02' + def cameraX_version = '1.1.0' implementation "androidx.camera:camera-core:$cameraX_version" implementation "androidx.camera:camera-camera2:$cameraX_version" // CameraX Lifecycle library @@ -159,45 +159,45 @@ dependencies { implementation 'com.google.android.material:material:1.6.1' //Dagger (dependency injection) - implementation 'com.google.dagger:dagger-android:2.40.5' - implementation 'com.google.dagger:dagger-android-support:2.40.5' + implementation 'com.google.dagger:dagger-android:2.42' + implementation 'com.google.dagger:dagger-android-support:2.42' // if you use the support libraries - kapt 'com.google.dagger:dagger-android-processor:2.40.5' - kapt 'com.google.dagger:dagger-compiler:2.40.5' + kapt 'com.google.dagger:dagger-android-processor:2.42' + kapt 'com.google.dagger:dagger-compiler:2.42' - implementation 'com.squareup.okhttp3:okhttp:4.9.2' + implementation 'com.squareup.okhttp3:okhttp:4.9.3' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0' - implementation 'io.reactivex.rxjava3:rxjava:3.1.3' + implementation 'io.reactivex.rxjava3:rxjava:3.1.5' implementation 'io.reactivex.rxjava3:rxandroid:3.0.0' implementation 'com.github.connyduck:sparkbutton:4.1.0' implementation 'info.androidhive:imagefilters:1.0.7' - implementation 'com.github.yalantis:ucrop:2.2.6-native' + implementation 'com.github.yalantis:ucrop:2.2.8-native' - implementation('com.github.bumptech.glide:glide:4.12.0') { + implementation('com.github.bumptech.glide:glide:4.13.2') { exclude group: "com.android.support" } - implementation 'com.github.bumptech.glide:okhttp-integration:4.12.0' - implementation('com.github.bumptech.glide:recyclerview-integration:4.12.0') { + implementation 'com.github.bumptech.glide:okhttp-integration:4.13.2' + implementation('com.github.bumptech.glide:recyclerview-integration:4.13.2') { // Excludes the support library because it's already included by Glide. transitive = false } - kapt 'com.github.bumptech.glide:compiler:4.12.0' + kapt 'com.github.bumptech.glide:compiler:4.13.2' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'com.mikepenz:materialdrawer:8.4.4' + implementation 'com.mikepenz:materialdrawer:9.0.1' // Add for NavController support - implementation 'com.mikepenz:materialdrawer-nav:8.4.4' + implementation 'com.mikepenz:materialdrawer-nav:9.0.1' //iconics - implementation 'com.mikepenz:iconics-core:5.3.3' - implementation 'com.mikepenz:materialdrawer-iconics:8.4.2' - implementation 'com.mikepenz:iconics-views:5.3.3' + implementation 'com.mikepenz:iconics-core:5.3.4' + implementation 'com.mikepenz:materialdrawer-iconics:9.0.1' + implementation 'com.mikepenz:iconics-views:5.3.4' implementation 'com.mikepenz:google-material-typeface:4.0.0.2-kotlin@aar' @@ -214,7 +214,7 @@ dependencies { //stagingImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' androidTestImplementation 'androidx.work:work-testing:2.7.1' - testImplementation 'com.github.tomakehurst:wiremock-jre8:2.32.0' + testImplementation 'com.github.tomakehurst:wiremock-jre8:2.33.2' testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0" testImplementation 'junit:junit:4.13.2' testImplementation "androidx.room:room-testing:$room_version" diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 5eb8f3e4..c0599725 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -86,4 +86,37 @@ static void checkReturnedValueIsNotNull(java.lang.Object, java.lang.String); static void checkReturnedValueIsNotNull(java.lang.Object, java.lang.String, java.lang.String); static void throwUninitializedPropertyAccessException(java.lang.String); -} \ No newline at end of file +} + +##---------------Begin: proguard configuration for Gson ---------- +# Gson uses generic type information stored in a class file when working with fields. Proguard +# removes such information by default, so configure it to keep all of it. +-keepattributes Signature + +# For using GSON @Expose annotation +-keepattributes *Annotation* + +# Gson specific classes +-dontwarn sun.misc.** +#-keep class com.google.gson.stream.** { *; } + +# Application classes that will be serialized/deserialized over Gson +-keep class com.google.gson.examples.android.model.** { ; } + +# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory, +# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter) +-keep class * extends com.google.gson.TypeAdapter +-keep class * implements com.google.gson.TypeAdapterFactory +-keep class * implements com.google.gson.JsonSerializer +-keep class * implements com.google.gson.JsonDeserializer + +# Prevent R8 from leaving Data object members always null +-keepclassmembers,allowobfuscation class * { + @com.google.gson.annotations.SerializedName ; +} + +# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher. +-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken +-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken + +##---------------End: proguard configuration for Gson ---------- \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ffc4f78..0fdbcf9d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ android:parentActivityName=".MainActivity"> + android:value=".MainActivity" /> diff --git a/app/src/main/java/org/pixeldroid/app/LoginActivity.kt b/app/src/main/java/org/pixeldroid/app/LoginActivity.kt index 90583b66..59d0caca 100644 --- a/app/src/main/java/org/pixeldroid/app/LoginActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/LoginActivity.kt @@ -10,22 +10,22 @@ import android.view.View import android.view.inputmethod.InputMethodManager import androidx.lifecycle.lifecycleScope import androidx.paging.ExperimentalPagingApi -import androidx.work.OneTimeWorkRequestBuilder -import androidx.work.WorkManager +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.launch import org.pixeldroid.app.databinding.ActivityLoginBinding import org.pixeldroid.app.utils.* import org.pixeldroid.app.utils.api.PixelfedAPI -import org.pixeldroid.app.utils.api.objects.* +import org.pixeldroid.app.utils.api.objects.Application +import org.pixeldroid.app.utils.api.objects.Instance +import org.pixeldroid.app.utils.api.objects.NodeInfo import org.pixeldroid.app.utils.db.addUser import org.pixeldroid.app.utils.db.storeInstance -import kotlinx.coroutines.* -import org.pixeldroid.app.utils.notificationsWorker.NotificationsWorker import org.pixeldroid.app.utils.notificationsWorker.makeChannelGroupId import org.pixeldroid.app.utils.notificationsWorker.makeNotificationChannels import retrofit2.HttpException import java.io.IOException -import java.lang.IllegalArgumentException -import java.lang.NullPointerException /** Overview of the flow of the login process: (boxes are requests done in parallel, @@ -42,7 +42,7 @@ since they do not depend on each other) */ -class LoginActivity : BaseActivity() { +class LoginActivity : BaseThemedWithoutBarActivity() { companion object { private const val PACKAGE_ID = BuildConfig.APPLICATION_ID diff --git a/app/src/main/java/org/pixeldroid/app/MainActivity.kt b/app/src/main/java/org/pixeldroid/app/MainActivity.kt index 23d9b3d6..0407c857 100644 --- a/app/src/main/java/org/pixeldroid/app/MainActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/MainActivity.kt @@ -6,6 +6,7 @@ import android.graphics.drawable.Drawable import android.net.Uri import android.os.Bundle import android.util.Log +import android.view.MenuItem import android.view.View import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity @@ -17,9 +18,9 @@ import androidx.paging.ExperimentalPagingApi import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 +import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback import com.bumptech.glide.Glide -import com.google.android.material.tabs.TabLayout -import com.google.android.material.tabs.TabLayoutMediator +import com.google.android.material.bottomnavigation.BottomNavigationView import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial import com.mikepenz.materialdrawer.iconics.iconicsIcon import com.mikepenz.materialdrawer.model.PrimaryDrawerItem @@ -39,9 +40,8 @@ import org.pixeldroid.app.posts.feeds.cachedFeeds.postFeeds.PostFeedFragment import org.pixeldroid.app.profile.ProfileActivity import org.pixeldroid.app.searchDiscover.SearchDiscoverFragment import org.pixeldroid.app.settings.SettingsActivity -import org.pixeldroid.app.utils.BaseActivity +import org.pixeldroid.app.utils.BaseThemedWithoutBarActivity import org.pixeldroid.app.utils.db.addUser -import org.pixeldroid.app.utils.notificationsWorker.enablePullNotifications import org.pixeldroid.app.utils.db.entities.HomeStatusDatabaseEntity import org.pixeldroid.app.utils.db.entities.PublicFeedStatusDatabaseEntity import org.pixeldroid.app.utils.db.entities.UserDatabaseEntity @@ -49,12 +49,13 @@ import org.pixeldroid.app.utils.hasInternet import org.pixeldroid.app.utils.notificationsWorker.NotificationsWorker.Companion.INSTANCE_NOTIFICATION_TAG import org.pixeldroid.app.utils.notificationsWorker.NotificationsWorker.Companion.SHOW_NOTIFICATION_TAG import org.pixeldroid.app.utils.notificationsWorker.NotificationsWorker.Companion.USER_NOTIFICATION_TAG +import org.pixeldroid.app.utils.notificationsWorker.enablePullNotifications import org.pixeldroid.app.utils.notificationsWorker.removeNotificationChannelsFromAccount import retrofit2.HttpException import java.io.IOException -class MainActivity : BaseActivity() { +class MainActivity : BaseThemedWithoutBarActivity() { private lateinit var header: AccountHeaderView private var user: UserDatabaseEntity? = null @@ -68,7 +69,6 @@ class MainActivity : BaseActivity() { @OptIn(ExperimentalPagingApi::class) override fun onCreate(savedInstanceState: Bundle?) { - setTheme(R.style.AppTheme_NoActionBar) super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) @@ -142,11 +142,12 @@ class MainActivity : BaseActivity() { } private fun setupDrawer() { - binding.mainDrawerButton.setOnClickListener{ - binding.drawerLayout.open() + binding.mainDrawerButton.setOnClickListener{ + binding.drawerLayout.openDrawer(binding.drawer) } header = AccountHeaderView(this).apply { + attachToSliderView(binding.drawer) headerBackgroundScaleType = ImageView.ScaleType.CENTER_CROP currentHiddenInList = true onAccountHeaderListener = { _: View?, profile: IProfile, current: Boolean -> @@ -158,7 +159,6 @@ class MainActivity : BaseActivity() { descriptionRes = R.string.add_account_description iconicsIcon = GoogleMaterial.Icon.gmd_add }, 0) - attachToSliderView(binding.drawer) dividerBelowHeader = false closeDrawerOnProfileListClick = true } @@ -294,7 +294,7 @@ class MainActivity : BaseActivity() { isIconTinted = true } .apply(block) -} + } private fun fillDrawerAccountInfo(account: String) { val users = db.userDao().getAll().toMutableList() @@ -353,32 +353,57 @@ class MainActivity : BaseActivity() { return tab_array.size } } - binding.tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { - override fun onTabSelected(tab: TabLayout.Tab?){} - override fun onTabUnselected(tab: TabLayout.Tab?) {} - - override fun onTabReselected(tab: TabLayout.Tab?) { - tab?.position?.let { position -> - val page = - //No clue why this works but it does. F to pay respects - supportFragmentManager.findFragmentByTag("f$position") - (page as? CachedFeedFragment<*>)?.onTabReClicked() + binding.viewPager.registerOnPageChangeCallback(object : OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + val selected = when(position){ + 0 -> R.id.page_1 + 1 -> R.id.page_2 + 2 -> R.id.page_3 + 3 -> R.id.page_4 + 4 -> R.id.page_5 + else -> null } + if (selected != null) { + binding.tabs.selectedItemId = selected + } + super.onPageSelected(position) } }) - TabLayoutMediator(binding.tabs, binding.viewPager) { tab, position -> - tab.icon = ContextCompat.getDrawable(applicationContext, - when(position){ - 0 -> R.drawable.ic_home_white_24dp - 1 -> R.drawable.ic_search_white_24dp - 2 -> R.drawable.photo_camera - 3 -> R.drawable.ic_heart - 4 -> R.drawable.ic_filter_black_24dp - else -> throw IllegalArgumentException() - }) - }.attach() + fun MenuItem.itemPos(): Int? { + return when(itemId){ + R.id.page_1 -> 0 + R.id.page_2 -> 1 + R.id.page_3 -> 2 + R.id.page_4 -> 3 + R.id.page_5 -> 4 + else -> null + } + } + + binding.tabs.setOnItemSelectedListener {item -> + item.itemPos()?.let { + binding.viewPager.currentItem = it + true + } ?: false + } + binding.tabs.setOnItemReselectedListener { item -> + item.itemPos()?.let { position -> + val page = + //No clue why this works but it does. F to pay respects + supportFragmentManager.findFragmentByTag("f$position") + (page as? CachedFeedFragment<*>)?.onTabReClicked() + } + } + } + + fun BottomNavigationView.uncheckAllItems() { + menu.setGroupCheckable(0, true, false) + for (i in 0 until menu.size()) { + menu.getItem(i).isChecked = false + } + menu.setGroupCheckable(0, true, true) } /** diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationActivity.kt b/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationActivity.kt index 2f54a5e0..cedb2290 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationActivity.kt @@ -2,7 +2,9 @@ package org.pixeldroid.app.postCreation import android.app.Activity import android.app.AlertDialog -import android.content.* +import android.content.ContentResolver +import android.content.ContentValues +import android.content.Intent import android.media.MediaScannerConnection import android.net.Uri import android.os.* @@ -26,7 +28,6 @@ import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.RecyclerView import com.arthenica.ffmpegkit.* import com.google.android.material.snackbar.Snackbar -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import org.pixeldroid.app.R import org.pixeldroid.app.databinding.ActivityPostCreationBinding @@ -34,7 +35,7 @@ import org.pixeldroid.app.postCreation.camera.CameraActivity import org.pixeldroid.app.postCreation.carousel.CarouselItem import org.pixeldroid.app.postCreation.photoEdit.PhotoEditActivity import org.pixeldroid.app.postCreation.photoEdit.VideoEditActivity -import org.pixeldroid.app.utils.BaseActivity +import org.pixeldroid.app.utils.BaseThemedWithoutBarActivity import org.pixeldroid.app.utils.db.entities.InstanceDatabaseEntity import org.pixeldroid.app.utils.db.entities.UserDatabaseEntity import org.pixeldroid.app.utils.ffmpegSafeUri @@ -58,7 +59,7 @@ data class PhotoData( var videoEncodeProgress: Int? = null, ) -class PostCreationActivity : BaseActivity() { +class PostCreationActivity : BaseThemedWithoutBarActivity() { private var user: UserDatabaseEntity? = null private lateinit var instance: InstanceDatabaseEntity diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/camera/CameraActivity.kt b/app/src/main/java/org/pixeldroid/app/postCreation/camera/CameraActivity.kt index 6071d384..8ea1eff6 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/camera/CameraActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/camera/CameraActivity.kt @@ -3,13 +3,12 @@ package org.pixeldroid.app.postCreation.camera import android.content.Intent import android.os.Bundle import android.view.MenuItem -import androidx.appcompat.app.AppCompatActivity import org.pixeldroid.app.MainActivity import org.pixeldroid.app.R -import org.pixeldroid.app.utils.BaseActivity +import org.pixeldroid.app.utils.BaseThemedWithBarActivity -class CameraActivity : BaseActivity() { +class CameraActivity : BaseThemedWithBarActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_camera) @@ -32,7 +31,7 @@ class CameraActivity : BaseActivity() { * [org.pixeldroid.app.postCreation.PostCreationActivity] instead of "returning" to a non-existent * [org.pixeldroid.app.postCreation.PostCreationActivity] */ -class CameraActivityShortcut : AppCompatActivity() { +class CameraActivityShortcut : BaseThemedWithBarActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_camera) diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/carousel/ImageCarousel.kt b/app/src/main/java/org/pixeldroid/app/postCreation/carousel/ImageCarousel.kt index e239b0a8..19b573a1 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/carousel/ImageCarousel.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/carousel/ImageCarousel.kt @@ -256,8 +256,7 @@ class ImageCarousel( if(value){ recyclerView.layoutManager = CarouselLinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) - binding.btnNext.visibility = VISIBLE - binding.btnPrevious.visibility = VISIBLE + showNavigationButtons = showNavigationButtons binding.editMediaDescriptionLayout.visibility = if(editingMediaDescription) VISIBLE else INVISIBLE tvCaption.visibility = if(editingMediaDescription) INVISIBLE else VISIBLE @@ -395,7 +394,7 @@ class ImageCarousel( showNavigationButtons = getBoolean( R.styleable.ImageCarousel_showNavigationButtons, - true + false ) layoutCarousel = getBoolean( @@ -561,6 +560,7 @@ class ImageCarousel( initOnScrollStateChange() } + showNavigationButtons = data.size != 1 } fun updateProgress(progress: Int?, position: Int, error: Boolean){ diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/PhotoEditActivity.kt b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/PhotoEditActivity.kt index 04566a8b..9a75a521 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/PhotoEditActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/PhotoEditActivity.kt @@ -5,10 +5,12 @@ import android.app.AlertDialog import android.content.Intent import android.content.pm.PackageManager import android.graphics.Bitmap +import android.graphics.Color import android.graphics.Point import android.graphics.drawable.BitmapDrawable import android.net.Uri import android.os.Bundle +import android.util.TypedValue import android.view.Menu import android.view.MenuItem import android.view.View.GONE @@ -17,17 +19,19 @@ import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import com.bumptech.glide.Glide +import com.google.android.material.color.MaterialColors import com.google.android.material.snackbar.Snackbar -import org.pixeldroid.app.R -import org.pixeldroid.app.databinding.ActivityPhotoEditBinding -import org.pixeldroid.app.postCreation.PostCreationActivity -import org.pixeldroid.app.utils.BaseActivity import com.yalantis.ucrop.UCrop import com.zomato.photofilters.imageprocessors.Filter import com.zomato.photofilters.imageprocessors.subfilters.BrightnessSubFilter import com.zomato.photofilters.imageprocessors.subfilters.ContrastSubFilter import com.zomato.photofilters.imageprocessors.subfilters.SaturationSubfilter +import org.pixeldroid.app.R +import org.pixeldroid.app.databinding.ActivityPhotoEditBinding +import org.pixeldroid.app.postCreation.PostCreationActivity +import org.pixeldroid.app.utils.BaseThemedWithBarActivity import org.pixeldroid.app.utils.bitmapFromUri +import org.pixeldroid.app.utils.getColorFromAttr import java.io.File import java.io.IOException import java.io.OutputStream @@ -44,7 +48,7 @@ private val REQUIRED_PERMISSIONS = arrayOf( android.Manifest.permission.WRITE_EXTERNAL_STORAGE ) -class PhotoEditActivity : BaseActivity() { +class PhotoEditActivity : BaseThemedWithBarActivity() { var saving: Boolean = false private val BITMAP_CONFIG = Bitmap.Config.ARGB_8888 @@ -265,8 +269,10 @@ class PhotoEditActivity : BaseActivity() { val file = File.createTempFile("temp_crop_img", ".png", cacheDir) val options: UCrop.Options = UCrop.Options().apply { - setStatusBarColor(resources.getColor(R.color.colorPrimaryDark, theme)) - setActiveControlsWidgetColor(resources.getColor(R.color.colorButtonBg, theme)) + setStatusBarColor(this@PhotoEditActivity.getColorFromAttr(R.attr.colorPrimaryDark)) + setToolbarWidgetColor(this@PhotoEditActivity.getColorFromAttr(R.attr.colorOnSurface)) + setToolbarColor(this@PhotoEditActivity.getColorFromAttr(R.attr.colorSurface)) + setActiveControlsWidgetColor(this@PhotoEditActivity.getColorFromAttr(R.attr.colorPrimary)) } val uCrop: UCrop = UCrop.of(initialUri!!, Uri.fromFile(file)).withOptions(options) uCrop.start(this) diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/ThumbnailAdapter.kt b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/ThumbnailAdapter.kt index af51f375..52448d8b 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/ThumbnailAdapter.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/ThumbnailAdapter.kt @@ -10,6 +10,7 @@ import androidx.recyclerview.widget.RecyclerView import org.pixeldroid.app.R import org.pixeldroid.app.databinding.ThumbnailListItemBinding import com.zomato.photofilters.utils.ThumbnailItem +import org.pixeldroid.app.utils.getColorFromAttr class ThumbnailAdapter (private val context: Context, private val tbItemList: List, @@ -43,9 +44,9 @@ class ThumbnailAdapter (private val context: Context, holder.filterName.text = tbItem.filterName if(selectedIndex == position) - holder.filterName.setTextColor(ContextCompat.getColor(context, R.color.filterLabelSelected)) + holder.filterName.setTextColor(context.getColorFromAttr(R.attr.colorPrimary)) else - holder.filterName.setTextColor(ContextCompat.getColor(context, R.color.filterLabelNormal)) + holder.filterName.setTextColor(context.getColorFromAttr(R.attr.colorOnBackground)) } class MyViewHolder(itemBinding: ThumbnailListItemBinding): RecyclerView.ViewHolder(itemBinding.root) { diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/VideoEditActivity.kt b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/VideoEditActivity.kt index 22f92dc9..58865a72 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/VideoEditActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/VideoEditActivity.kt @@ -28,12 +28,12 @@ import org.pixeldroid.app.R import org.pixeldroid.app.databinding.ActivityVideoEditBinding import org.pixeldroid.app.postCreation.PostCreationActivity import org.pixeldroid.app.postCreation.carousel.dpToPx -import org.pixeldroid.app.utils.BaseActivity +import org.pixeldroid.app.utils.BaseThemedWithBarActivity import org.pixeldroid.app.utils.ffmpegSafeUri import java.io.File -class VideoEditActivity : BaseActivity() { +class VideoEditActivity : BaseThemedWithBarActivity() { private lateinit var mediaPlayer: MediaPlayer private var videoPosition: Int = -1 diff --git a/app/src/main/java/org/pixeldroid/app/posts/MediaViewerActivity.kt b/app/src/main/java/org/pixeldroid/app/posts/MediaViewerActivity.kt index aa414d57..091faf72 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/MediaViewerActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/MediaViewerActivity.kt @@ -6,7 +6,6 @@ import android.content.pm.ActivityInfo import android.media.AudioManager.STREAM_MUSIC import android.os.Bundle import androidx.core.net.toUri -import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat.getInsetsController import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat @@ -15,9 +14,9 @@ import androidx.media2.common.MediaMetadata import androidx.media2.common.UriMediaItem import androidx.media2.player.MediaPlayer import org.pixeldroid.app.databinding.ActivityMediaviewerBinding -import org.pixeldroid.app.utils.BaseActivity +import org.pixeldroid.app.utils.BaseThemedWithoutBarActivity -class MediaViewerActivity : BaseActivity() { +class MediaViewerActivity : BaseThemedWithoutBarActivity() { private lateinit var mediaPlayer: MediaPlayer private lateinit var binding: ActivityMediaviewerBinding diff --git a/app/src/main/java/org/pixeldroid/app/posts/PostActivity.kt b/app/src/main/java/org/pixeldroid/app/posts/PostActivity.kt index 77c89db0..dd5ae7b0 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/PostActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/PostActivity.kt @@ -12,7 +12,7 @@ import androidx.lifecycle.lifecycleScope import org.pixeldroid.app.R import org.pixeldroid.app.databinding.ActivityPostBinding import org.pixeldroid.app.databinding.CommentBinding -import org.pixeldroid.app.utils.BaseActivity +import org.pixeldroid.app.utils.BaseThemedWithBarActivity import org.pixeldroid.app.utils.api.PixelfedAPI import org.pixeldroid.app.utils.api.objects.Mention import org.pixeldroid.app.utils.api.objects.Status @@ -23,7 +23,7 @@ import org.pixeldroid.app.utils.displayDimensionsInPx import retrofit2.HttpException import java.io.IOException -class PostActivity : BaseActivity() { +class PostActivity : BaseThemedWithBarActivity() { lateinit var domain : String private lateinit var binding: ActivityPostBinding diff --git a/app/src/main/java/org/pixeldroid/app/posts/ReportActivity.kt b/app/src/main/java/org/pixeldroid/app/posts/ReportActivity.kt index e9ab3aae..433f9201 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/ReportActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/ReportActivity.kt @@ -5,12 +5,12 @@ import android.view.View import androidx.lifecycle.lifecycleScope import org.pixeldroid.app.R import org.pixeldroid.app.databinding.ActivityReportBinding -import org.pixeldroid.app.utils.BaseActivity +import org.pixeldroid.app.utils.BaseThemedWithBarActivity import org.pixeldroid.app.utils.api.objects.Status import retrofit2.HttpException import java.io.IOException -class ReportActivity : BaseActivity() { +class ReportActivity : BaseThemedWithBarActivity() { private lateinit var binding: ActivityReportBinding @@ -56,14 +56,14 @@ class ReportActivity : BaseActivity() { private fun reportStatus(success: Boolean){ if(success){ binding.reportProgressBar.visibility = View.GONE - binding.reportButton.isEnabled = false - binding.reportButton.text = getString(R.string.reported) - binding.reportButton.visibility = View.VISIBLE + binding.reportButton.visibility = View.INVISIBLE + binding.reportSuccess.visibility = View.VISIBLE } else { binding.textInputLayout.error = getString(R.string.report_error) binding.reportButton.visibility = View.VISIBLE binding.textInputLayout.editText?.isEnabled = true binding.reportProgressBar.visibility = View.GONE + binding.reportSuccess.visibility = View.GONE } } } \ No newline at end of file diff --git a/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/hashtags/HashTagActivity.kt b/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/hashtags/HashTagActivity.kt index c45982b0..99ad2239 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/hashtags/HashTagActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/hashtags/HashTagActivity.kt @@ -3,11 +3,11 @@ package org.pixeldroid.app.posts.feeds.uncachedFeeds.hashtags import android.os.Bundle import org.pixeldroid.app.R import org.pixeldroid.app.posts.feeds.uncachedFeeds.UncachedPostsFragment -import org.pixeldroid.app.utils.BaseActivity +import org.pixeldroid.app.utils.BaseThemedWithBarActivity import org.pixeldroid.app.utils.api.objects.Tag.Companion.HASHTAG_TAG -class HashTagActivity : BaseActivity() { +class HashTagActivity : BaseThemedWithBarActivity() { private var tagFragment = UncachedPostsFragment() override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/org/pixeldroid/app/profile/FollowsActivity.kt b/app/src/main/java/org/pixeldroid/app/profile/FollowsActivity.kt index e97dde84..c89b1ced 100644 --- a/app/src/main/java/org/pixeldroid/app/profile/FollowsActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/profile/FollowsActivity.kt @@ -3,14 +3,14 @@ package org.pixeldroid.app.profile import android.os.Bundle import org.pixeldroid.app.R import org.pixeldroid.app.posts.feeds.uncachedFeeds.accountLists.AccountListFragment +import org.pixeldroid.app.utils.BaseThemedWithBarActivity import org.pixeldroid.app.utils.api.objects.Account import org.pixeldroid.app.utils.api.objects.Account.Companion.ACCOUNT_ID_TAG import org.pixeldroid.app.utils.api.objects.Account.Companion.ACCOUNT_TAG import org.pixeldroid.app.utils.api.objects.Account.Companion.FOLLOWERS_TAG -import org.pixeldroid.app.utils.BaseActivity -class FollowsActivity : BaseActivity() { +class FollowsActivity : BaseThemedWithBarActivity() { private var followsFragment = AccountListFragment() override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/org/pixeldroid/app/profile/ProfileActivity.kt b/app/src/main/java/org/pixeldroid/app/profile/ProfileActivity.kt index 48bf286e..ebe666c6 100644 --- a/app/src/main/java/org/pixeldroid/app/profile/ProfileActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/profile/ProfileActivity.kt @@ -6,10 +6,9 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.* +import android.widget.ImageView +import android.widget.Toast import androidx.appcompat.app.AlertDialog -import androidx.appcompat.content.res.AppCompatResources -import androidx.constraintlayout.motion.widget.MotionLayout import androidx.core.content.ContextCompat import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider @@ -22,6 +21,8 @@ import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.google.android.material.snackbar.Snackbar +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import org.pixeldroid.app.R import org.pixeldroid.app.databinding.ActivityProfileBinding import org.pixeldroid.app.databinding.FragmentProfilePostsBinding @@ -32,23 +33,19 @@ import org.pixeldroid.app.posts.feeds.uncachedFeeds.FeedViewModel import org.pixeldroid.app.posts.feeds.uncachedFeeds.UncachedContentRepository import org.pixeldroid.app.posts.feeds.uncachedFeeds.profile.ProfileContentRepository import org.pixeldroid.app.posts.parseHTMLText -import org.pixeldroid.app.utils.BaseActivity +import org.pixeldroid.app.utils.BaseThemedWithBarActivity +import org.pixeldroid.app.utils.BlurHashDecoder import org.pixeldroid.app.utils.ImageConverter import org.pixeldroid.app.utils.api.PixelfedAPI import org.pixeldroid.app.utils.api.objects.Account +import org.pixeldroid.app.utils.api.objects.Attachment import org.pixeldroid.app.utils.api.objects.Status import org.pixeldroid.app.utils.db.entities.UserDatabaseEntity import org.pixeldroid.app.utils.openUrl -import kotlinx.coroutines.Job -import kotlinx.coroutines.launch -import org.pixeldroid.app.databinding.ErrorLayoutBinding -import org.pixeldroid.app.postCreation.carousel.dpToPx -import org.pixeldroid.app.utils.BlurHashDecoder -import org.pixeldroid.app.utils.api.objects.Attachment import retrofit2.HttpException import java.io.IOException -class ProfileActivity : BaseActivity() { +class ProfileActivity : BaseThemedWithBarActivity() { private lateinit var domain : String private lateinit var accountId : String diff --git a/app/src/main/java/org/pixeldroid/app/searchDiscover/SearchActivity.kt b/app/src/main/java/org/pixeldroid/app/searchDiscover/SearchActivity.kt index 15825383..761abc2b 100644 --- a/app/src/main/java/org/pixeldroid/app/searchDiscover/SearchActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/searchDiscover/SearchActivity.kt @@ -12,10 +12,10 @@ import org.pixeldroid.app.R import org.pixeldroid.app.posts.feeds.uncachedFeeds.UncachedPostsFragment import org.pixeldroid.app.posts.feeds.uncachedFeeds.search.SearchAccountFragment import org.pixeldroid.app.posts.feeds.uncachedFeeds.search.SearchHashtagFragment +import org.pixeldroid.app.utils.BaseThemedWithBarActivity import org.pixeldroid.app.utils.api.objects.Results -import org.pixeldroid.app.utils.BaseActivity -class SearchActivity : BaseActivity() { +class SearchActivity : BaseThemedWithBarActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/org/pixeldroid/app/settings/AboutActivity.kt b/app/src/main/java/org/pixeldroid/app/settings/AboutActivity.kt index f4353a78..ae21ea1e 100644 --- a/app/src/main/java/org/pixeldroid/app/settings/AboutActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/settings/AboutActivity.kt @@ -5,9 +5,9 @@ import android.os.Bundle import org.pixeldroid.app.BuildConfig import org.pixeldroid.app.R import org.pixeldroid.app.databinding.ActivityAboutBinding -import org.pixeldroid.app.utils.BaseActivity +import org.pixeldroid.app.utils.BaseThemedWithBarActivity -class AboutActivity : BaseActivity() { +class AboutActivity : BaseThemedWithBarActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding = ActivityAboutBinding.inflate(layoutInflater) diff --git a/app/src/main/java/org/pixeldroid/app/settings/LicenseActivity.kt b/app/src/main/java/org/pixeldroid/app/settings/LicenseActivity.kt index 795ab47b..279793d9 100644 --- a/app/src/main/java/org/pixeldroid/app/settings/LicenseActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/settings/LicenseActivity.kt @@ -6,18 +6,19 @@ import org.pixeldroid.app.R import org.pixeldroid.app.databinding.OpenSourceLicenseBinding import org.pixeldroid.app.settings.licenseObjects.Libraries import org.pixeldroid.app.settings.licenseObjects.OpenSourceItem -import org.pixeldroid.app.utils.BaseActivity -import java.io.FileNotFoundException +import org.pixeldroid.app.utils.BaseThemedWithBarActivity +import org.pixeldroid.app.utils.themeActionBar /** * Displays licenses for all app dependencies. JSON is * generated by the plugin https://github.com/cookpad/LicenseToolsPlugin. */ -class LicenseActivity: BaseActivity() { +class LicenseActivity: BaseThemedWithBarActivity() { private lateinit var binding: OpenSourceLicenseBinding override fun onCreate(savedInstanceState: Bundle?) { + setTheme(themeActionBar()) super.onCreate(savedInstanceState) binding = OpenSourceLicenseBinding.inflate(layoutInflater) diff --git a/app/src/main/java/org/pixeldroid/app/settings/SettingsActivity.kt b/app/src/main/java/org/pixeldroid/app/settings/SettingsActivity.kt index 3ad822a1..a8bb9098 100644 --- a/app/src/main/java/org/pixeldroid/app/settings/SettingsActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/settings/SettingsActivity.kt @@ -4,15 +4,16 @@ import android.content.Intent import android.content.SharedPreferences import android.os.Build import android.os.Bundle +import androidx.fragment.app.DialogFragment import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceManager import org.pixeldroid.app.MainActivity import org.pixeldroid.app.R -import org.pixeldroid.app.utils.BaseActivity +import org.pixeldroid.app.utils.BaseThemedWithBarActivity import org.pixeldroid.app.utils.setThemeFromPreferences -class SettingsActivity : BaseActivity(), SharedPreferences.OnSharedPreferenceChangeListener { +class SettingsActivity : BaseThemedWithBarActivity(), SharedPreferences.OnSharedPreferenceChangeListener { private var restartMainOnExit = false override fun onCreate(savedInstanceState: Bundle?) { @@ -62,6 +63,9 @@ class SettingsActivity : BaseActivity(), SharedPreferences.OnSharedPreferenceCha "language" -> { recreateWithRestartStatus() } + "themeColor" -> { + recreateWithRestartStatus() + } } } @@ -79,6 +83,19 @@ class SettingsActivity : BaseActivity(), SharedPreferences.OnSharedPreferenceCha } class SettingsFragment : PreferenceFragmentCompat() { + override fun onDisplayPreferenceDialog(preference: Preference) { + var dialogFragment: DialogFragment? = null + if (preference is ColorPreference) { + dialogFragment = ColorPreferenceDialog((preference as ColorPreference?)!!) + } + if (dialogFragment != null) { + dialogFragment.setTargetFragment(this, 0) + dialogFragment.show(parentFragmentManager, "settings_fragment") + } else { + super.onDisplayPreferenceDialog(preference) + } + } + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.root_preferences, rootKey) diff --git a/app/src/main/java/org/pixeldroid/app/settings/ThemeColorPreference.kt b/app/src/main/java/org/pixeldroid/app/settings/ThemeColorPreference.kt new file mode 100644 index 00000000..beeaaee5 --- /dev/null +++ b/app/src/main/java/org/pixeldroid/app/settings/ThemeColorPreference.kt @@ -0,0 +1,192 @@ +package org.pixeldroid.app.settings + +import android.content.Context +import android.content.res.ColorStateList +import android.content.res.TypedArray +import android.os.Bundle +import android.util.AttributeSet +import android.util.TypedValue +import android.view.LayoutInflater +import android.view.View +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.annotation.ColorRes +import androidx.appcompat.app.AlertDialog +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.core.view.isVisible +import androidx.preference.DialogPreference +import androidx.preference.PreferenceDialogFragmentCompat +import androidx.preference.PreferenceViewHolder +import org.pixeldroid.app.R +import org.pixeldroid.app.databinding.ColorDialogBinding + + +/** Inspired by https://github.com/andstatus/todoagenda's color chooser. + * AndroidX version created by yvolk@yurivolkov.com + * based on this answer: https://stackoverflow.com/a/53290775/297710 + * and on the code of https://github.com/koji-1009/ChronoDialogPreference + */ +class ColorPreferenceDialog(preference: ColorPreference) : + PreferenceDialogFragmentCompat() { + private val preference: ColorPreference + private var mPicker: ColorPickerView? = null + + init { + this.preference = preference + val b = Bundle() + b.putString(ARG_KEY, preference.key) + arguments = b + } + + override fun onCreateDialogView(context: Context): View? { + val picker = ColorPickerView(context) + preference.color?.let { + picker.color = it + } + mPicker = picker + return mPicker + } + + override fun onPrepareDialogBuilder(builder: AlertDialog.Builder) { + if (preference.selectNoneButtonText != null) { + builder.setNeutralButton(preference.selectNoneButtonText, null) + } + } + + override fun onDialogClosed(positiveResult: Boolean) { + if (positiveResult) { + val color: Int = mPicker!!.color + if (preference.callChangeListener(color)) { + preference.color = color + } + } + } +} + +class ColorPreference constructor(context: Context, attrs: AttributeSet? = null) : DialogPreference(context, attrs) { + var selectNoneButtonText: String? = null + var defaultColor: Int? = null + private var thumbnail: View? = null + + override fun onBindViewHolder(viewHolder: PreferenceViewHolder) { + thumbnail = addThumbnail(viewHolder.itemView) + showColor(persistedIntDefaultOrNull) + // Only call after showColor sets any summary text: + super.onBindViewHolder(viewHolder) + } + + override fun onGetDefaultValue(a: TypedArray, index: Int): Any? { + defaultColor = readDefaultValue(a, index) + return defaultColor + } + + override fun setDefaultValue(defaultValue: Any?) { + super.setDefaultValue(defaultValue) + defaultColor = parseDefaultValue(defaultValue) + } + + override fun onSetInitialValue(defaultValue: Any?) { + color = defaultValue?.let { + parseDefaultValue(defaultValue) + } ?: color + } + + private fun addThumbnail(view: View): View { + val widgetFrameView: LinearLayout = view.findViewById(android.R.id.widget_frame) + widgetFrameView.visibility = View.VISIBLE + widgetFrameView.removeAllViews() + LayoutInflater.from(context).inflate(R.layout.color_preference_thumbnail, widgetFrameView) + return widgetFrameView.findViewById(R.id.thumbnail) + } + + private val persistedIntDefaultOrNull: Int + get() = if (shouldPersist() && sharedPreferences?.contains(key) == true) + Integer.valueOf(getPersistedInt(0)) else defaultColor!! + + private fun showColor(color: Int?) { + val thumbColor = color ?: defaultColor + thumbnail?.visibility = if (thumbColor == null) View.GONE else View.VISIBLE + @ColorRes + val colorCode: Int = when(thumbColor){ + 1 -> R.color.seed2 + 2 -> R.color.seed3 + 3 -> R.color.seed4 + else -> R.color.seed + } + thumbnail?.findViewById(R.id.colorPreview)?.imageTintList = ColorStateList.valueOf( + ContextCompat.getColor(context, colorCode) + ) + } + + private fun removeSetting() { + if (shouldPersist()) { + sharedPreferences + ?.edit() + ?.remove(key) + ?.apply() + } + } + + + var color: Int? + get() = persistedIntDefaultOrNull + set(color) { + if (color == null) { + removeSetting() + } else { + persistInt(color) + } + showColor(color) + } + + companion object { + private fun readDefaultValue(a: TypedArray, index: Int): Int? { + if (a.peekValue(index) != null) { + val type = a.peekValue(index).type + if (TypedValue.TYPE_FIRST_INT <= type && type <= TypedValue.TYPE_LAST_INT) { + return a.getInt(index, 0) + } + } + return null + } + + private fun parseDefaultValue(defaultValue: Any?): Int { + return if (defaultValue == null) 0 else if (defaultValue is Int) defaultValue else 0 + } + } +} +class ColorPickerView(context: Context?, attrs: AttributeSet? = null) : FrameLayout(context!!, attrs) { + var binding: ColorDialogBinding + + init { + binding = ColorDialogBinding.inflate(LayoutInflater.from(context),this, true) + binding.theme1.setOnClickListener { color = 0 } + binding.theme2.setOnClickListener { color = 1 } + binding.theme3.setOnClickListener { color = 2 } + binding.theme4.setOnClickListener { color = 3 } + } + + private fun changeConstraint(button2: View) { + binding.chosenTheme.isVisible = true + val params = binding.chosenTheme.layoutParams as ConstraintLayout.LayoutParams + params.endToEnd = button2.id + params.startToStart = button2.id + binding.chosenTheme.layoutParams = params + binding.chosenTheme.requestLayout() + } + /** Returns the color selected by the user */ + /** Sets the original color swatch and the current color to the specified value. */ + var color: Int = 0 + set(value) { + field = value + when(value) { + 0 -> binding.theme1 + 1 -> binding.theme2 + 2 -> binding.theme3 + 3 -> binding.theme4 + else -> null + }?.let { changeConstraint(it) } + } +} diff --git a/app/src/main/java/org/pixeldroid/app/utils/BaseThemedWithBarActivity.kt b/app/src/main/java/org/pixeldroid/app/utils/BaseThemedWithBarActivity.kt new file mode 100644 index 00000000..473dddd1 --- /dev/null +++ b/app/src/main/java/org/pixeldroid/app/utils/BaseThemedWithBarActivity.kt @@ -0,0 +1,10 @@ +package org.pixeldroid.app.utils + +import android.os.Bundle + +open class BaseThemedWithBarActivity : BaseActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + setTheme(themeActionBar()) + super.onCreate(savedInstanceState) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/pixeldroid/app/utils/BaseThemedWithoutBarActivity.kt b/app/src/main/java/org/pixeldroid/app/utils/BaseThemedWithoutBarActivity.kt new file mode 100644 index 00000000..9e339812 --- /dev/null +++ b/app/src/main/java/org/pixeldroid/app/utils/BaseThemedWithoutBarActivity.kt @@ -0,0 +1,10 @@ +package org.pixeldroid.app.utils + +import android.os.Bundle + +open class BaseThemedWithoutBarActivity : BaseActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + setTheme(themeNoActionBar()) + super.onCreate(savedInstanceState) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/pixeldroid/app/utils/PixelDroidApplication.kt b/app/src/main/java/org/pixeldroid/app/utils/PixelDroidApplication.kt index 0bc5c4cc..74905e50 100644 --- a/app/src/main/java/org/pixeldroid/app/utils/PixelDroidApplication.kt +++ b/app/src/main/java/org/pixeldroid/app/utils/PixelDroidApplication.kt @@ -2,6 +2,7 @@ package org.pixeldroid.app.utils import android.app.Application import androidx.preference.PreferenceManager +import com.google.android.material.color.DynamicColors import org.pixeldroid.app.utils.di.* import com.mikepenz.iconics.Iconics import org.ligi.tracedroid.TraceDroid @@ -26,6 +27,9 @@ class PixelDroidApplication: Application() { .aPIModule(APIModule()) .build() mApplicationComponent.inject(this) + + //TODO put condition depending on setting to apply dynamic colours (android 12+) + if(false) DynamicColors.applyToActivitiesIfAvailable(this) } fun getAppComponent(): ApplicationComponent { diff --git a/app/src/main/java/org/pixeldroid/app/utils/Utils.kt b/app/src/main/java/org/pixeldroid/app/utils/Utils.kt index e0335d88..70cc493a 100644 --- a/app/src/main/java/org/pixeldroid/app/utils/Utils.kt +++ b/app/src/main/java/org/pixeldroid/app/utils/Utils.kt @@ -3,6 +3,7 @@ package org.pixeldroid.app.utils import android.content.* import android.content.res.Resources import android.graphics.Bitmap +import android.graphics.Color import android.graphics.ImageDecoder import android.graphics.Matrix import android.net.ConnectivityManager @@ -10,16 +11,22 @@ import android.net.Uri import android.os.Build import android.provider.MediaStore import android.util.DisplayMetrics +import android.util.TypedValue import android.view.WindowManager +import androidx.annotation.AttrRes +import androidx.annotation.ColorInt +import androidx.annotation.StyleRes import androidx.appcompat.app.AppCompatDelegate import androidx.browser.customtabs.CustomTabsIntent import androidx.exifinterface.media.ExifInterface import androidx.fragment.app.Fragment import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner +import androidx.preference.PreferenceManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.arthenica.ffmpegkit.FFmpegKitConfig +import com.google.android.material.color.MaterialColors import okhttp3.HttpUrl import org.pixeldroid.app.R import kotlin.properties.ReadWriteProperty @@ -165,7 +172,7 @@ fun RecyclerView.limitedLengthSmoothScrollToPosition(targetItem: Int) { /** * @brief Updates the application's theme depending on the given preferences and resources */ -fun setThemeFromPreferences(preferences: SharedPreferences, resources : Resources) { +fun setThemeFromPreferences(preferences: SharedPreferences, resources: Resources) { val themes = resources.getStringArray(R.array.theme_values) //Set the theme when(preferences.getString("theme", "")) { @@ -187,6 +194,29 @@ fun setThemeFromPreferences(preferences: SharedPreferences, resources : Resource } } +@StyleRes +fun Context.themeNoActionBar(): Int { + return when(PreferenceManager.getDefaultSharedPreferences(this).getInt("themeColor", 0)) { + 1 -> R.style.AppTheme2_NoActionBar + 2 -> R.style.AppTheme3_NoActionBar + 3 -> R.style.AppTheme4_NoActionBar + else -> R.style.AppTheme_NoActionBar + } +} + +@StyleRes +fun Context.themeActionBar(): Int { + return when(PreferenceManager.getDefaultSharedPreferences(this).getInt("themeColor", 0)) { + 1 -> R.style.AppTheme2 + 2 -> R.style.AppTheme3 + 3 -> R.style.AppTheme4 + else -> R.style.AppTheme + } +} + +@ColorInt +fun Context.getColorFromAttr(@AttrRes attrColor: Int): Int = MaterialColors.getColor(this, attrColor, Color.BLACK) + /** * Delegated property to use in fragments to prevent memory leaks of bindings. * This makes it unnecessary to set binding to null in onDestroyView. diff --git a/app/src/main/res/drawable/bug_report_black_24dp.xml b/app/src/main/res/drawable/bug_report_black_24dp.xml index 04d0dac9..3632a6af 100644 --- a/app/src/main/res/drawable/bug_report_black_24dp.xml +++ b/app/src/main/res/drawable/bug_report_black_24dp.xml @@ -5,5 +5,5 @@ android:viewportHeight="24"> + android:fillColor="?attr/colorOnBackground"/> diff --git a/app/src/main/res/drawable/check_circle_24.xml b/app/src/main/res/drawable/check_circle_24.xml index 3cb7dd9a..86bf1fbe 100644 --- a/app/src/main/res/drawable/check_circle_24.xml +++ b/app/src/main/res/drawable/check_circle_24.xml @@ -4,9 +4,9 @@ android:viewportWidth="24" android:viewportHeight="24"> - + diff --git a/app/src/main/res/drawable/circle_black_24dp.xml b/app/src/main/res/drawable/circle_black_24dp.xml index e9a9ce1d..719f05d7 100644 --- a/app/src/main/res/drawable/circle_black_24dp.xml +++ b/app/src/main/res/drawable/circle_black_24dp.xml @@ -1,6 +1,6 @@ + android:fillColor="?attr/colorOnBackground"/> diff --git a/app/src/main/res/drawable/ic_baseline_check_24.xml b/app/src/main/res/drawable/ic_baseline_check_24.xml new file mode 100644 index 00000000..2501e9fd --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_check_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_notifications_active_24.xml b/app/src/main/res/drawable/ic_baseline_notifications_active_24.xml index 13a7aeeb..f9ea153b 100644 --- a/app/src/main/res/drawable/ic_baseline_notifications_active_24.xml +++ b/app/src/main/res/drawable/ic_baseline_notifications_active_24.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_crop_black_24dp.xml b/app/src/main/res/drawable/ic_crop_black_24dp.xml index 63d132ce..0238ec6e 100644 --- a/app/src/main/res/drawable/ic_crop_black_24dp.xml +++ b/app/src/main/res/drawable/ic_crop_black_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_dot_blue_12dp.xml b/app/src/main/res/drawable/ic_dot_blue_12dp.xml deleted file mode 100644 index 4d0726f7..00000000 --- a/app/src/main/res/drawable/ic_dot_blue_12dp.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_file_upload_24dp.xml b/app/src/main/res/drawable/ic_file_upload_24dp.xml deleted file mode 100644 index 70e55133..00000000 --- a/app/src/main/res/drawable/ic_file_upload_24dp.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_follow.xml b/app/src/main/res/drawable/ic_follow.xml index 612a4a07..80e186b9 100644 --- a/app/src/main/res/drawable/ic_follow.xml +++ b/app/src/main/res/drawable/ic_follow.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_heart.xml b/app/src/main/res/drawable/ic_heart.xml index 62239504..3d4542e2 100644 --- a/app/src/main/res/drawable/ic_heart.xml +++ b/app/src/main/res/drawable/ic_heart.xml @@ -1,4 +1,4 @@ - + diff --git a/app/src/main/res/drawable/ic_like_empty.xml b/app/src/main/res/drawable/ic_like_empty.xml index e83455b9..b21e1e5e 100644 --- a/app/src/main/res/drawable/ic_like_empty.xml +++ b/app/src/main/res/drawable/ic_like_empty.xml @@ -2,5 +2,5 @@ android:viewportWidth="110" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> + android:strokeColor="?attr/colorOnBackground" android:strokeWidth="9"/> diff --git a/app/src/main/res/drawable/ic_reblog.xml b/app/src/main/res/drawable/ic_reblog.xml index 0968c08f..c8805e0f 100644 --- a/app/src/main/res/drawable/ic_reblog.xml +++ b/app/src/main/res/drawable/ic_reblog.xml @@ -2,14 +2,14 @@ android:viewportWidth="111" android:width="31.341177dp" xmlns:android="http://schemas.android.com/apk/res/android"> - + + android:strokeColor="?attr/colorOnBackground" android:strokeWidth="9"/> - + + android:strokeColor="?attr/colorOnBackground" android:strokeWidth="9"/> diff --git a/app/src/main/res/drawable/ic_save_24dp.xml b/app/src/main/res/drawable/ic_save_24dp.xml index 74ca299c..8cf3d5a7 100644 --- a/app/src/main/res/drawable/ic_save_24dp.xml +++ b/app/src/main/res/drawable/ic_save_24dp.xml @@ -1,5 +1,5 @@ - - + diff --git a/app/src/main/res/drawable/info_black_24dp.xml b/app/src/main/res/drawable/info_black_24dp.xml index 306c7a7c..ac778774 100644 --- a/app/src/main/res/drawable/info_black_24dp.xml +++ b/app/src/main/res/drawable/info_black_24dp.xml @@ -5,5 +5,5 @@ android:viewportHeight="24"> + android:fillColor="?attr/colorOnBackground"/> diff --git a/app/src/main/res/drawable/mention_at_24dp.xml b/app/src/main/res/drawable/mention_at_24dp.xml index 1d1aa7a5..30fcec3b 100644 --- a/app/src/main/res/drawable/mention_at_24dp.xml +++ b/app/src/main/res/drawable/mention_at_24dp.xml @@ -5,5 +5,5 @@ android:viewportHeight="24"> + android:fillColor="?attr/colorOnBackground"/> diff --git a/app/src/main/res/drawable/notifications.xml b/app/src/main/res/drawable/notifications.xml new file mode 100644 index 00000000..538f5818 --- /dev/null +++ b/app/src/main/res/drawable/notifications.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/outline_home.xml b/app/src/main/res/drawable/outline_home.xml new file mode 100644 index 00000000..b6db651d --- /dev/null +++ b/app/src/main/res/drawable/outline_home.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/outline_notifications.xml b/app/src/main/res/drawable/outline_notifications.xml new file mode 100644 index 00000000..45b906f6 --- /dev/null +++ b/app/src/main/res/drawable/outline_notifications.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/outline_photo_camera.xml b/app/src/main/res/drawable/outline_photo_camera.xml new file mode 100644 index 00000000..b4e07a6d --- /dev/null +++ b/app/src/main/res/drawable/outline_photo_camera.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/palette_black_24dp.xml b/app/src/main/res/drawable/palette_black_24dp.xml index dc3df840..14c3246c 100644 --- a/app/src/main/res/drawable/palette_black_24dp.xml +++ b/app/src/main/res/drawable/palette_black_24dp.xml @@ -5,5 +5,5 @@ android:viewportHeight="24"> + android:fillColor="?attr/colorOnBackground"/> diff --git a/app/src/main/res/drawable/poll.xml b/app/src/main/res/drawable/poll.xml index b78dad8b..621ceefa 100644 --- a/app/src/main/res/drawable/poll.xml +++ b/app/src/main/res/drawable/poll.xml @@ -5,5 +5,5 @@ android:viewportHeight="24"> + android:fillColor="?attr/colorOnBackground"/> diff --git a/app/src/main/res/drawable/restore_24dp.xml b/app/src/main/res/drawable/restore_24dp.xml index af91e161..0abe38ba 100644 --- a/app/src/main/res/drawable/restore_24dp.xml +++ b/app/src/main/res/drawable/restore_24dp.xml @@ -5,5 +5,5 @@ android:viewportHeight="24"> + android:fillColor="?attr/colorOnSurface"/> diff --git a/app/src/main/res/drawable/selector_camera.xml b/app/src/main/res/drawable/selector_camera.xml new file mode 100644 index 00000000..fcb60d0d --- /dev/null +++ b/app/src/main/res/drawable/selector_camera.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_home_feed.xml b/app/src/main/res/drawable/selector_home_feed.xml new file mode 100644 index 00000000..ef4efd33 --- /dev/null +++ b/app/src/main/res/drawable/selector_home_feed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_notifications.xml b/app/src/main/res/drawable/selector_notifications.xml new file mode 100644 index 00000000..100101fa --- /dev/null +++ b/app/src/main/res/drawable/selector_notifications.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/translate_black_24dp.xml b/app/src/main/res/drawable/translate_black_24dp.xml index f0e4e67f..cf62cd35 100644 --- a/app/src/main/res/drawable/translate_black_24dp.xml +++ b/app/src/main/res/drawable/translate_black_24dp.xml @@ -5,5 +5,5 @@ android:viewportHeight="24"> + android:fillColor="?attr/colorOnBackground"/> diff --git a/app/src/main/res/layout/activity_licenses.xml b/app/src/main/res/layout/activity_licenses.xml deleted file mode 100644 index 9b8dc2d6..00000000 --- a/app/src/main/res/layout/activity_licenses.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 7dfe8a93..0f00891a 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -48,8 +48,6 @@ android:id="@+id/connect_instance_button" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:backgroundTint="@color/colorButtonBg" - android:textColor="@color/colorButtonText" android:text="@string/connect_to_pixelfed" /> - + app:menu="@menu/bottom_navigation_main" /> + app:drawableTint="?attr/colorOnError" /> @@ -148,8 +144,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" - android:inputType="textMultiLine" - android:textColor="@color/colorPrimary" /> + android:inputType="textMultiLine" /> diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml index 031b5306..17831e5a 100644 --- a/app/src/main/res/layout/activity_profile.xml +++ b/app/src/main/res/layout/activity_profile.xml @@ -15,7 +15,6 @@ android:id="@+id/collapsing_toolbar_layout" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/background" app:layout_scrollFlags="scroll|exitUntilCollapsed"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/color_preference_thumbnail.xml b/app/src/main/res/layout/color_preference_thumbnail.xml new file mode 100644 index 00000000..fff24e97 --- /dev/null +++ b/app/src/main/res/layout/color_preference_thumbnail.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/error_layout.xml b/app/src/main/res/layout/error_layout.xml index f1f0254a..99cc3715 100644 --- a/app/src/main/res/layout/error_layout.xml +++ b/app/src/main/res/layout/error_layout.xml @@ -22,7 +22,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/red_panda" - app:tint="@color/colorDrawing" /> + app:tint="?attr/colorOnBackground" /> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml deleted file mode 100644 index 712d0ecb..00000000 --- a/app/src/main/res/values-night/colors.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - #FFFFFF - #6200EE - - #000000 - #FFFFFF - #000000 - - diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..01aae04d --- /dev/null +++ b/app/src/main/res/values-night/styles.xml @@ -0,0 +1,121 @@ + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index cde9c34d..f49ee29e 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,20 +1,251 @@ - #6200EE - #FFFFFF - #6200EE - #3700B3 - #03DAC5 #FFFFFFFF #DDFFFFFF #AAFFFFFF - #6200EE - #FFFFFF - #8A8889 - #221F20 - #FF0000 - #FFFFFF + #FFFFFF - #000000 - #FFFFFF + + + #f4a261 + #924C00 + #FFFFFF + #FFDCC4 + #2F1400 + #745945 + #FFFFFF + #FFDCC4 + #2A1707 + #5D6136 + #FFFFFF + #E3E7AF + #1A1D00 + #BA1A1A + #FFDAD6 + #FFFFFF + #410002 + #FFFBFF + #201A17 + #FFFBFF + #201A17 + #F3DFD2 + #52443B + #84746A + #FBEEE8 + #362F2B + #FFB780 + #000000 + #924C00 + #924C00 + + #FFB780 + #4E2600 + #6F3800 + #FFDCC4 + #E4BFA7 + #422B1A + #5B412F + #FFDCC4 + #C6CA95 + #2F330C + #464A20 + #E3E7AF + #FFB4AB + #93000A + #690005 + #FFDAD6 + #201A17 + #ECE0DA + #201A17 + #ECE0DA + #52443B + #D6C3B7 + #9F8D82 + #201A17 + #ECE0DA + #924C00 + #000000 + #FFB780 + #FFB780 + + + #4285F4 + #005AC1 + #FFFFFF + #D8E2FF + #001A41 + #535E78 + #FFFFFF + #D8E2FF + #0F1B32 + #76517B + #FFFFFF + #FED6FF + #2D0E34 + #BA1A1A + #FFFFFF + #FFDAD6 + #410002 + #FEFBFF + #1B1B1F + #FEFBFF + #1B1B1F + #E1E2EC + #44474F + #74777F + #000000 + #303033 + #F2F0F4 + #ADC6FF + #005AC1 + #005AC1 + #ADC6FF + #002E69 + #004494 + #D8E2FF + #BBC6E4 + #253048 + #3B475F + #D8E2FF + #E5B8E8 + #44244A + #5D3A62 + #FED6FF + #FFB4AB + #690005 + #93000A + #FFB4AB + #1B1B1F + #E3E2E6 + #1B1B1F + #E3E2E6 + #44474F + #C4C6D0 + #8E9099 + #000000 + #E3E2E6 + #303033 + #005AC1 + #ADC6FF + #ADC6FF + + #fbd900 + #6E5E00 + #FFFFFF + #FFE254 + #211B00 + #006A69 + #FFFFFF + #6FF7F5 + #002020 + #43664F + #FFFFFF + #C4ECCF + #002110 + #BA1A1A + #FFDAD6 + #FFFFFF + #410002 + #FFFBFF + #1D1B16 + #FFFBFF + #1D1B16 + #E9E2D0 + #4B4739 + #7C7768 + #F6F0E7 + #32302A + #E4C500 + #000000 + #6E5E00 + #6E5E00 + #E4C500 + #393000 + #534600 + #FFE254 + #4DDAD8 + #003736 + #00504F + #6FF7F5 + #A9D0B4 + #143723 + #2B4E38 + #C4ECCF + #FFB4AB + #93000A + #690005 + #FFDAD6 + #1D1B16 + #E7E2D9 + #1D1B16 + #E7E2D9 + #4B4739 + #CDC6B4 + #969080 + #1D1B16 + #E7E2D9 + #6E5E00 + #000000 + #E4C500 + #E4C500 + + #984061 + #984061 + #FFFFFF + #FFD9E2 + #3E001D + #74565F + #FFFFFF + #FFD9E2 + #2B151C + #7C5635 + #FFFFFF + #FFDCC2 + #2E1500 + #BA1A1A + #FFDAD6 + #FFFFFF + #410002 + #FFFBFF + #201A1B + #FFFBFF + #201A1B + #F2DDE2 + #514347 + #837377 + #FAEEEF + #352F30 + #FFB0C8 + #000000 + #984061 + #984061 + #FFB0C8 + #5E1133 + #7B2949 + #FFD9E2 + #E2BDC6 + #422931 + #5A3F47 + #FFD9E2 + #EFBD94 + #48290C + #623F20 + #FFDCC2 + #FFB4AB + #93000A + #690005 + #FFDAD6 + #201A1B + #EBE0E1 + #201A1B + #EBE0E1 + #514347 + #D5C2C6 + #9E8C90 + #201A1B + #EBE0E1 + #984061 + #000000 + #FFB0C8 + #FFB0C8 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9d838b7e..8a0c5863 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -105,7 +105,7 @@ For more info about Pixelfed, you can check here: https://pixelfed.org" Post uploaded successfully Post upload error Description… - post + Post Add a photo One of the images in the post Switch to grid view @@ -212,9 +212,9 @@ For more info about Pixelfed, you can check here: https://pixelfed.org" HASHTAGS CW / NSFW / Hidden Media\n (click to show) - + Media upload completed - + Media upload failed, try again or check network conditions Image that is being posted Retry @@ -234,8 +234,7 @@ For more info about Pixelfed, you can check here: https://pixelfed.org" Share Link Optional message for mods/admins Report @%1$s\'s post - - Reported {gmd_check_circle} + Post reported Could not send report Edit Profile picture @@ -274,4 +273,13 @@ For more info about Pixelfed, you can check here: https://pixelfed.org" New post %1$s requests to follow you %1$s created a post + Home + Search + Create + Updates + Public + Color accent + Choose a color accent + Choose this color accent + Chosen color accent \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 20fc5dc0..99d0a3f3 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,25 +1,13 @@ - - + + + + + + + + + + + + + + diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index fe53aa91..ce69464f 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -10,6 +10,12 @@ app:title="@string/theme_title" app:useSimpleSummaryProvider="true" app:icon="@drawable/palette_black_24dp"/> + +