Stories progress

This commit is contained in:
Matthieu 2023-12-13 11:18:05 +01:00
parent f0face3fb0
commit 6c85115b67
13 changed files with 134 additions and 387 deletions

View File

@ -12,6 +12,7 @@
<uses-feature
android:name="android.hardware.camera.any"
android:required="false" />
<!--TODO remove this? Don't think we use it -->
<uses-feature android:name="android.hardware.location.gps" />
<uses-feature
android:name="android.hardware.camera"
@ -43,19 +44,19 @@
<activity
android:name=".profile.EditProfileActivity"
android:exported="false"
android:theme="@style/BaseAppTheme.NoActionBar" />
android:theme="@style/BaseAppTheme" />
<activity
android:name=".posts.MediaViewerActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="false"
android:theme="@style/BaseAppTheme.NoActionBar" />
android:theme="@style/BaseAppTheme" />
<activity android:name=".postCreation.camera.CameraActivity"
android:theme="@style/BaseAppTheme.NoActionBar"/>
android:theme="@style/BaseAppTheme"/>
<activity
android:name=".posts.ReportActivity"
android:screenOrientation="sensorPortrait"
android:theme="@style/BaseAppTheme.NoActionBar"
android:theme="@style/BaseAppTheme"
tools:ignore="LockedOrientationActivity" />
<activity
@ -64,7 +65,7 @@
android:name=".postCreation.PostCreationActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize"
android:theme="@style/BaseAppTheme.NoActionBar">
android:theme="@style/BaseAppTheme">
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<action android:name="android.intent.action.SEND" />
@ -77,32 +78,32 @@
</activity>
<activity
android:name=".profile.FollowsActivity"
android:theme="@style/BaseAppTheme.NoActionBar"
android:theme="@style/BaseAppTheme"
android:screenOrientation="sensorPortrait"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".posts.feeds.uncachedFeeds.hashtags.HashTagActivity"
android:theme="@style/BaseAppTheme.NoActionBar"
android:theme="@style/BaseAppTheme"
android:screenOrientation="sensorPortrait"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".posts.PostActivity"
android:screenOrientation="sensorPortrait"
tools:ignore="LockedOrientationActivity"
android:theme="@style/BaseAppTheme.NoActionBar" />
android:theme="@style/BaseAppTheme" />
<activity
android:name=".profile.ProfileActivity"
android:screenOrientation="sensorPortrait"
tools:ignore="LockedOrientationActivity"
android:theme="@style/BaseAppTheme.NoActionBar"/>
android:theme="@style/BaseAppTheme"/>
<activity android:name=".profile.CollectionActivity"
android:theme="@style/BaseAppTheme.NoActionBar"/>
android:theme="@style/BaseAppTheme"/>
<activity
android:name=".settings.SettingsActivity"
android:label="@string/title_activity_settings2"
android:parentActivityName=".MainActivity"
android:theme="@style/BaseAppTheme.NoActionBar" />
android:theme="@style/BaseAppTheme" />
<activity
android:name=".MainActivity"
android:exported="true"
@ -126,7 +127,7 @@
android:name=".LoginActivity"
android:exported="true"
android:screenOrientation="sensorPortrait"
android:theme="@style/BaseAppTheme.NoActionBar"
android:theme="@style/BaseAppTheme"
android:windowSoftInputMode="adjustResize"
tools:ignore="LockedOrientationActivity">
<intent-filter>
@ -143,7 +144,7 @@
<activity
android:name=".searchDiscover.SearchActivity"
android:exported="true"
android:theme="@style/BaseAppTheme.NoActionBar"
android:theme="@style/BaseAppTheme"
android:launchMode="singleTop"
android:screenOrientation="sensorPortrait"
tools:ignore="LockedOrientationActivity">
@ -156,7 +157,7 @@
android:resource="@xml/searchable" />
</activity>
<activity android:name=".searchDiscover.TrendingActivity"
android:theme="@style/BaseAppTheme.NoActionBar" />
android:theme="@style/BaseAppTheme" />
<provider
android:name="androidx.core.content.FileProvider"

View File

@ -2,11 +2,11 @@ package org.pixeldroid.app.posts
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import org.pixeldroid.app.databinding.ActivityAlbumBinding
import org.pixeldroid.app.utils.BaseActivity
import org.pixeldroid.app.utils.api.objects.Attachment
class AlbumActivity : BaseActivity() {
class AlbumActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityAlbumBinding.inflate(layoutInflater)

View File

@ -6,9 +6,11 @@ import android.widget.ProgressBar
import androidx.constraintlayout.motion.widget.MotionLayout
import androidx.core.view.isVisible
import androidx.lifecycle.LifecycleCoroutineScope
import androidx.paging.CombinedLoadStates
import androidx.paging.LoadState
import androidx.paging.LoadStateAdapter
import androidx.paging.PagingDataAdapter
import androidx.recyclerview.widget.ConcatAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
@ -21,6 +23,7 @@ import org.pixeldroid.app.R
import org.pixeldroid.app.databinding.ErrorLayoutBinding
import org.pixeldroid.app.databinding.LoadStateFooterViewItemBinding
import org.pixeldroid.app.posts.feeds.uncachedFeeds.FeedViewModel
import org.pixeldroid.app.stories.StoriesAdapter
import org.pixeldroid.app.utils.api.objects.FeedContent
import org.pixeldroid.app.utils.api.objects.Status
import retrofit2.HttpException
@ -49,14 +52,28 @@ private fun showError(
internal fun <T: Any> initAdapter(
progressBar: ProgressBar, swipeRefreshLayout: SwipeRefreshLayout,
recyclerView: RecyclerView, motionLayout: MotionLayout, errorLayout: ErrorLayoutBinding,
adapter: PagingDataAdapter<T, RecyclerView.ViewHolder>) {
adapter: PagingDataAdapter<T, RecyclerView.ViewHolder>,
header: StoriesAdapter? = null
) {
recyclerView.adapter = adapter.withLoadStateFooter(
footer = ReposLoadStateAdapter { adapter.retry() }
val footer = ReposLoadStateAdapter { adapter.retry() }
adapter.addLoadStateListener { loadStates: CombinedLoadStates ->
footer.loadState = loadStates.append
}
recyclerView.adapter = ConcatAdapter(
*listOfNotNull(
header, // need to filter it if null
adapter,
footer
).toTypedArray()
)
swipeRefreshLayout.setOnRefreshListener {
adapter.refresh()
header?.refreshStories()
}
adapter.addLoadStateListener { loadState ->
@ -149,6 +166,8 @@ class ReposLoadStateAdapter(
}
}
/**
* [RecyclerView.ViewHolder] that is shown at the end of the feed to indicate loading or errors
* in the loading of appending values.

View File

@ -18,6 +18,7 @@ import kotlinx.coroutines.flow.distinctUntilChangedBy
import kotlinx.coroutines.flow.filter
import org.pixeldroid.app.databinding.FragmentFeedBinding
import org.pixeldroid.app.posts.feeds.initAdapter
import org.pixeldroid.app.stories.StoriesAdapter
import org.pixeldroid.app.utils.BaseFragment
import org.pixeldroid.app.utils.api.objects.FeedContentDatabase
import org.pixeldroid.app.utils.db.AppDatabase
@ -31,6 +32,7 @@ open class CachedFeedFragment<T: FeedContentDatabase> : BaseFragment() {
internal lateinit var viewModel: FeedViewModel<T>
internal lateinit var adapter: PagingDataAdapter<T, RecyclerView.ViewHolder>
internal var headerAdapter: StoriesAdapter? = null
private lateinit var binding: FragmentFeedBinding
@ -49,6 +51,7 @@ open class CachedFeedFragment<T: FeedContentDatabase> : BaseFragment() {
}
}
//TODO rename function to something that makes sense
internal fun initSearch() {
// Scroll to top when the list is refreshed from network.
lifecycleScope.launchWhenStarted {
@ -73,7 +76,9 @@ open class CachedFeedFragment<T: FeedContentDatabase> : BaseFragment() {
binding = FragmentFeedBinding.inflate(layoutInflater)
initAdapter(binding.progressBar, binding.swipeRefreshLayout,
binding.list, binding.motionLayout, binding.errorLayout, adapter)
binding.list, binding.motionLayout, binding.errorLayout, adapter,
headerAdapter
)
return binding.root
}

View File

@ -11,12 +11,11 @@ import androidx.paging.PagingDataAdapter
import androidx.paging.RemoteMediator
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import org.pixeldroid.app.R
import org.pixeldroid.app.posts.StatusViewHolder
import org.pixeldroid.app.posts.feeds.cachedFeeds.CachedFeedFragment
import org.pixeldroid.app.posts.feeds.cachedFeeds.FeedViewModel
import org.pixeldroid.app.posts.feeds.cachedFeeds.ViewModelFactory
import org.pixeldroid.app.stories.StoryCarouselViewHolder
import org.pixeldroid.app.stories.StoriesAdapter
import org.pixeldroid.app.utils.api.objects.FeedContentDatabase
import org.pixeldroid.app.utils.api.objects.Status
import org.pixeldroid.app.utils.db.dao.feedContent.FeedContentDao
@ -39,14 +38,18 @@ class PostFeedFragment<T: FeedContentDatabase>: CachedFeedFragment<T>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
adapter = PostsAdapter(requireContext().displayDimensionsInPx())
home = requireArguments().getBoolean("home")
adapter = PostsAdapter(requireContext().displayDimensionsInPx())
@Suppress("UNCHECKED_CAST")
if (home){
mediator = HomeFeedRemoteMediator(apiHolder, db) as RemoteMediator<Int, T>
dao = db.homePostDao() as FeedContentDao<T>
headerAdapter = StoriesAdapter(lifecycleScope, apiHolder)
headerAdapter?.showStories = false
headerAdapter?.refreshStories()
}
else {
mediator = PublicFeedRemoteMediator(apiHolder, db) as RemoteMediator<Int, T>
@ -79,35 +82,20 @@ class PostFeedFragment<T: FeedContentDatabase>: CachedFeedFragment<T>() {
) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return if(viewType == R.layout.post_fragment){
StatusViewHolder.create(parent)
} else {
StoryCarouselViewHolder.create(parent)
}
}
override fun getItemViewType(position: Int): Int {
return if(home && position == 0) R.layout.story_carousel
else R.layout.post_fragment
return StatusViewHolder.create(parent)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if(home && position == 0){
holder.itemView.visibility = View.GONE
holder.itemView.layoutParams = RecyclerView.LayoutParams(0, 0)
(holder as StoryCarouselViewHolder).bind(apiHolder, lifecycleScope, holder.itemView)
} else {
holder.itemView.visibility = View.VISIBLE
holder.itemView.layoutParams =
RecyclerView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
val uiModel = getItem(if(home) position - 1 else position) as Status?
val uiModel = getItem(position) as Status?
uiModel?.let {
(holder as StatusViewHolder).bind(it, apiHolder, db, lifecycleScope, displayDimensionsInPx)
}
}
}
}
}

View File

@ -61,8 +61,10 @@ open class UncachedFeedFragment<T: FeedContent> : BaseFragment() {
binding = FragmentFeedBinding.inflate(layoutInflater)
initAdapter(binding.progressBar, binding.swipeRefreshLayout, binding.list,
binding.motionLayout, binding.errorLayout, adapter)
initAdapter(
binding.progressBar, binding.swipeRefreshLayout, binding.list,
binding.motionLayout, binding.errorLayout, adapter
)
return binding.root
}

View File

@ -38,21 +38,19 @@ class SettingsActivity : ThemedActivity(), SharedPreferences.OnSharedPreferenceC
.commit()
supportActionBar?.setDisplayHomeAsUpEnabled(true)
onBackPressedDispatcher.addCallback(this) {
onBackPressedDispatcher.addCallback(this /* lifecycle owner */) {
// Handle the back button event
// If a setting (for example language or theme) was changed, the main activity should be
// started without history so that the change is applied to the whole back stack
if (restartMainOnExit) {
val intent = Intent(this@SettingsActivity, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
super.startActivity(intent)
super@SettingsActivity.startActivity(intent)
} else {
super.onBackPressedDispatcher.onBackPressed()
finish()
}
}
restartMainOnExit = intent.getBooleanExtra("restartMain", false)
}

View File

@ -126,7 +126,12 @@ class StoriesViewModel(
viewModelScope.launch {
try {
val api = apiHolder.api ?: apiHolder.setToCurrentUser()
currentStoryId()?.let { api.storySeen(it) }
val story = currentAccount?.nodes?.getOrNull(uiState.value.currentImage)
if (story?.seen == true){
//TODO update seen when marked successfully as seen?
story.id?.let { api.storySeen(it) }
}
} catch (exception: Exception){
_uiState.update { currentUiState ->
currentUiState.copy(errorMessage = R.string.story_could_not_see)

View File

@ -3,9 +3,9 @@ package org.pixeldroid.app.stories
import android.annotation.SuppressLint
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.LifecycleCoroutineScope
import androidx.paging.LoadState
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import kotlinx.coroutines.launch
@ -15,51 +15,90 @@ import org.pixeldroid.app.databinding.StoryCarouselBinding
import org.pixeldroid.app.databinding.StoryCarouselItemBinding
import org.pixeldroid.app.postCreation.camera.CameraActivity
import org.pixeldroid.app.postCreation.camera.CameraFragment
import org.pixeldroid.app.postCreation.carousel.dpToPx
import org.pixeldroid.app.utils.api.objects.CarouselUserContainer
import org.pixeldroid.app.utils.api.objects.StoryCarousel
import org.pixeldroid.app.utils.di.PixelfedAPIHolder
class StoryCarouselViewHolder(val binding: StoryCarouselBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(
pixelfedAPI: PixelfedAPIHolder,
lifecycleScope: LifecycleCoroutineScope,
itemView: View
) {
val adapter = StoriesListAdapter()
binding.storyCarousel.adapter = adapter
/**
* Adapter to the show the a [RecyclerView] item for a [LoadState]
*/
class StoriesAdapter(val lifecycleScope: LifecycleCoroutineScope, val apiHolder: PixelfedAPIHolder) : RecyclerView.Adapter<StoryCarouselViewHolder>() {
var carousel: StoryCarousel? = null
loadStories(adapter, lifecycleScope, pixelfedAPI, itemView)
/**
* Whether to show stories or not.
*
* Changing this property will immediately notify the Adapter to change the item it's
* presenting.
*/
var showStories: Boolean = false
set(newValue) {
val oldValue = field
if (oldValue && !newValue) {
notifyItemRemoved(0)
} else if (newValue && !oldValue) {
notifyItemInserted(0)
} else if (oldValue && newValue) {
notifyItemChanged(0)
}
field = newValue
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StoryCarouselViewHolder {
return StoryCarouselViewHolder.create(parent, ::noStories)
}
private fun loadStories(
adapter: StoriesListAdapter,
lifecycleScope: LifecycleCoroutineScope,
apiHolder: PixelfedAPIHolder,
itemView: View
) {
override fun onBindViewHolder(holder: StoryCarouselViewHolder, position: Int) {
holder.bind(carousel)
}
override fun getItemViewType(position: Int): Int = 0
override fun getItemCount(): Int = if (showStories) 1 else 0
private fun noStories(){
showStories = false
}
private fun gotStories(newCarousel: StoryCarousel) {
carousel = newCarousel
showStories = true
}
fun refreshStories(){
lifecycleScope.launch {
try{
val api = apiHolder.api ?: apiHolder.setToCurrentUser()
val carousel = api.carousel()
if (carousel.nodes?.isEmpty() != true) {
itemView.visibility = View.VISIBLE
itemView.layoutParams.height = 200.dpToPx(binding.root.context)
itemView.layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT
adapter.initCarousel(carousel)
// Pass carousel to adapter
gotStories(carousel)
} else {
noStories()
}
} catch (exception: Exception){
//TODO
noStories()
}
}
}
}
class StoryCarouselViewHolder(val binding: StoryCarouselBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(carousel: StoryCarousel?) {
val adapter = StoriesListAdapter()
binding.storyCarousel.adapter = adapter
carousel?.let { adapter.initCarousel(it) }
}
companion object {
fun create(parent: ViewGroup): StoryCarouselViewHolder {
fun create(parent: ViewGroup, noStories: () -> Unit): StoryCarouselViewHolder {
val itemBinding = StoryCarouselBinding.inflate(
LayoutInflater.from(parent.context), parent, false
)

View File

@ -235,7 +235,7 @@ interface PixelfedAPI {
@Query("post_id") post_id: String,
)
@GET("/api/v1.1/stories/carousel")
@GET("/api/pixelfed/v1/stories/self-carousel")
suspend fun carousel(): StoryCarousel
@POST("/api/v1.1/stories/seen")

View File

@ -10,6 +10,7 @@ import dagger.Component
import org.pixeldroid.app.postCreation.PostCreationViewModel
import org.pixeldroid.app.profile.EditProfileViewModel
import org.pixeldroid.app.stories.StoriesViewModel
import org.pixeldroid.app.stories.StoryCarouselViewHolder
import org.pixeldroid.app.utils.notificationsWorker.NotificationsWorker
import javax.inject.Singleton

View File

@ -1,134 +0,0 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="BaseAppTheme" parent="Theme.Material3.Dark">
<item name="android:windowLightStatusBar">?attr/isLightTheme</item>
<item name="android:navigationBarColor">?attr/colorSurface</item>
<item name="android:statusBarColor">?attr/colorSecondaryContainer</item>
<item name="android:windowLightNavigationBar" tools:targetApi="o_mr1">?attr/isLightTheme</item>
<item name="android:windowDrawsSystemBarBackgrounds" tools:targetApi="o_mr1">true</item>
<item name="toolbarStyle">@style/Toolbar</item>
<item name="materialDrawerStyle">@style/Widget.MaterialDrawerStyle</item>
<item name="materialDrawerHeaderStyle">@style/Widget.MaterialDrawerHeaderStyle</item>
</style>
<style name="AppTheme2" parent="BaseAppTheme">
<item name="colorPrimary">@color/md_theme_dark_primary2</item>
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary2</item>
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer2</item>
<item name="colorOnPrimaryContainer">@color/md_theme_dark_onPrimaryContainer2</item>
<item name="colorSecondary">@color/md_theme_dark_secondary2</item>
<item name="colorOnSecondary">@color/md_theme_dark_onSecondary2</item>
<item name="colorSecondaryContainer">@color/md_theme_dark_secondaryContainer2</item>
<item name="colorOnSecondaryContainer">@color/md_theme_dark_onSecondaryContainer2</item>
<item name="colorTertiary">@color/md_theme_dark_tertiary2</item>
<item name="colorOnTertiary">@color/md_theme_dark_onTertiary2</item>
<item name="colorTertiaryContainer">@color/md_theme_dark_tertiaryContainer2</item>
<item name="colorOnTertiaryContainer">@color/md_theme_dark_onTertiaryContainer2</item>
<item name="colorError">@color/md_theme_dark_error2</item>
<item name="colorOnError">@color/md_theme_dark_onError2</item>
<item name="colorErrorContainer">@color/md_theme_dark_errorContainer2</item>
<item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer2</item>
<item name="android:colorBackground">@color/md_theme_dark_background2</item>
<item name="colorOnBackground">@color/md_theme_dark_onBackground2</item>
<item name="colorSurface">@color/md_theme_dark_surface2</item>
<item name="colorOnSurface">@color/md_theme_dark_onSurface2</item>
<item name="colorSurfaceVariant">@color/md_theme_dark_surfaceVariant2</item>
<item name="colorOnSurfaceVariant">@color/md_theme_dark_onSurfaceVariant2</item>
<item name="colorOutline">@color/md_theme_dark_outline2</item>
<item name="colorSurfaceInverse">@color/md_theme_dark_inverseSurface2</item>
<item name="colorOnSurfaceInverse">@color/md_theme_dark_inverseOnSurface2</item>
<item name="elevationOverlayColor">@color/md_theme_dark_surfaceTint2</item>
<item name="colorPrimaryInverse">@color/md_theme_dark_inversePrimary2</item>
</style>
<style name="AppTheme3" parent="BaseAppTheme">
<item name="colorPrimary">@color/md_theme_dark_primary3</item>
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary3</item>
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer3</item>
<item name="colorOnPrimaryContainer">@color/md_theme_dark_onPrimaryContainer3</item>
<item name="colorSecondary">@color/md_theme_dark_secondary3</item>
<item name="colorOnSecondary">@color/md_theme_dark_onSecondary3</item>
<item name="colorSecondaryContainer">@color/md_theme_dark_secondaryContainer3</item>
<item name="colorOnSecondaryContainer">@color/md_theme_dark_onSecondaryContainer3</item>
<item name="colorTertiary">@color/md_theme_dark_tertiary3</item>
<item name="colorOnTertiary">@color/md_theme_dark_onTertiary3</item>
<item name="colorTertiaryContainer">@color/md_theme_dark_tertiaryContainer3</item>
<item name="colorOnTertiaryContainer">@color/md_theme_dark_onTertiaryContainer3</item>
<item name="colorError">@color/md_theme_dark_error3</item>
<item name="colorOnError">@color/md_theme_dark_onError3</item>
<item name="colorErrorContainer">@color/md_theme_dark_errorContainer3</item>
<item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer3</item>
<item name="android:colorBackground">@color/md_theme_dark_background3</item>
<item name="colorOnBackground">@color/md_theme_dark_onBackground3</item>
<item name="colorSurface">@color/md_theme_dark_surface3</item>
<item name="colorOnSurface">@color/md_theme_dark_onSurface3</item>
<item name="colorSurfaceVariant">@color/md_theme_dark_surfaceVariant3</item>
<item name="colorOnSurfaceVariant">@color/md_theme_dark_onSurfaceVariant3</item>
<item name="colorOutline">@color/md_theme_dark_outline3</item>
<item name="colorSurfaceInverse">@color/md_theme_dark_inverseSurface3</item>
<item name="colorOnSurfaceInverse">@color/md_theme_dark_inverseOnSurface3</item>
<item name="elevationOverlayColor">@color/md_theme_dark_surfaceTint3</item>
<item name="colorPrimaryInverse">@color/md_theme_dark_inversePrimary3</item>
</style>
<style name="AppTheme4" parent="BaseAppTheme">
<item name="colorPrimary">@color/md_theme_dark_primary4</item>
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary4</item>
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer4</item>
<item name="colorOnPrimaryContainer">@color/md_theme_dark_onPrimaryContainer4</item>
<item name="colorSecondary">@color/md_theme_dark_secondary4</item>
<item name="colorOnSecondary">@color/md_theme_dark_onSecondary4</item>
<item name="colorSecondaryContainer">@color/md_theme_dark_secondaryContainer4</item>
<item name="colorOnSecondaryContainer">@color/md_theme_dark_onSecondaryContainer4</item>
<item name="colorTertiary">@color/md_theme_dark_tertiary4</item>
<item name="colorOnTertiary">@color/md_theme_dark_onTertiary4</item>
<item name="colorTertiaryContainer">@color/md_theme_dark_tertiaryContainer4</item>
<item name="colorOnTertiaryContainer">@color/md_theme_dark_onTertiaryContainer4</item>
<item name="colorError">@color/md_theme_dark_error4</item>
<item name="colorOnError">@color/md_theme_dark_onError4</item>
<item name="colorErrorContainer">@color/md_theme_dark_errorContainer4</item>
<item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer4</item>
<item name="android:colorBackground">@color/md_theme_dark_background4</item>
<item name="colorOnBackground">@color/md_theme_dark_onBackground4</item>
<item name="colorSurface">@color/md_theme_dark_surface4</item>
<item name="colorOnSurface">@color/md_theme_dark_onSurface4</item>
<item name="colorSurfaceVariant">@color/md_theme_dark_surfaceVariant4</item>
<item name="colorOnSurfaceVariant">@color/md_theme_dark_onSurfaceVariant4</item>
<item name="colorOutline">@color/md_theme_dark_outline4</item>
<item name="colorSurfaceInverse">@color/md_theme_dark_inverseSurface4</item>
<item name="colorOnSurfaceInverse">@color/md_theme_dark_inverseOnSurface4</item>
<item name="elevationOverlayColor">@color/md_theme_dark_surfaceTint4</item>
<item name="colorPrimaryInverse">@color/md_theme_dark_inversePrimary4</item>
</style>
<style name="AppTheme5" parent="BaseAppTheme">
<item name="colorPrimary">@color/md_theme_dark_primary</item>
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
<item name="colorOnPrimaryContainer">@color/md_theme_dark_onPrimaryContainer</item>
<item name="colorSecondary">@color/md_theme_dark_secondary</item>
<item name="colorOnSecondary">@color/md_theme_dark_onSecondary</item>
<item name="colorSecondaryContainer">@color/md_theme_dark_secondaryContainer</item>
<item name="colorOnSecondaryContainer">@color/md_theme_dark_onSecondaryContainer</item>
<item name="colorTertiary">@color/md_theme_dark_tertiary</item>
<item name="colorOnTertiary">@color/md_theme_dark_onTertiary</item>
<item name="colorTertiaryContainer">@color/md_theme_dark_tertiaryContainer</item>
<item name="colorOnTertiaryContainer">@color/md_theme_dark_onTertiaryContainer</item>
<item name="colorError">@color/md_theme_dark_error</item>
<item name="colorErrorContainer">@color/md_theme_dark_errorContainer</item>
<item name="colorOnError">@color/md_theme_dark_onError</item>
<item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer</item>
<item name="android:colorBackground">@color/md_theme_dark_background</item>
<item name="colorOnBackground">@color/md_theme_dark_onBackground</item>
<item name="colorSurface">@color/md_theme_dark_surface</item>
<item name="colorOnSurface">@color/md_theme_dark_onSurface</item>
<item name="colorSurfaceVariant">@color/md_theme_dark_surfaceVariant</item>
<item name="colorOnSurfaceVariant">@color/md_theme_dark_onSurfaceVariant</item>
<item name="colorOutline">@color/md_theme_dark_outline</item>
<item name="colorOnSurfaceInverse">@color/md_theme_dark_inverseOnSurface</item>
<item name="colorSurfaceInverse">@color/md_theme_dark_inverseSurface</item>
<item name="elevationOverlayColor">@color/md_theme_dark_surfaceTint</item>
<item name="colorPrimaryInverse">@color/md_theme_dark_inversePrimary</item>
</style>
</resources>

View File

@ -10,11 +10,9 @@
<!-- TODO get rid of duplicated mascot/mascot_small somehow -->
<item name="windowSplashScreenAnimatedIcon">@drawable/mascot_small</item>
<!-- Set the theme of the Activity that directly follows your splash screen. -->
<!-- Required -->
<item name="postSplashScreenTheme">@style/BaseAppTheme.NoActionBar</item>
<item name="postSplashScreenTheme">@style/BaseAppTheme</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
@ -49,179 +47,4 @@
<item name="android:background">@android:color/transparent</item>
<item name="background">@android:color/transparent</item>
</style>
<style name="BaseAppTheme" parent="Theme.Material3.Light">
<item name="android:navigationBarColor">?attr/colorSurface</item>
<item name="android:statusBarColor">
@android:color/transparent
</item>
<item name="android:windowLightNavigationBar" tools:targetApi="o_mr1">?attr/isLightTheme</item>
<item name="android:windowDrawsSystemBarBackgrounds" tools:targetApi="o_mr1">true</item>
<item name="android:windowLightStatusBar">?attr/isLightTheme</item>
<item name="toolbarStyle">@style/Toolbar</item>
<item name="android:toolbarStyle">@style/Toolbar</item>
<item name="materialDrawerStyle">@style/Widget.MaterialDrawerStyle</item>
<item name="materialDrawerHeaderStyle">@style/Widget.MaterialDrawerHeaderStyle</item>
</style>
<style name="Toolbar" parent="Widget.Material3.Toolbar">
<item name="android:background">?attr/colorSecondaryContainer</item>
<item name="background">?attr/colorSecondaryContainer</item>
<item name="titleTextColor">?attr/colorOnSecondaryContainer</item>
<item name="subtitleTextColor">?attr/colorOnSecondaryContainer</item>
<item name="navigationIconTint">?attr/colorOnSecondaryContainer</item>
</style>
<style name="AppTheme2" parent="BaseAppTheme">
<item name="colorPrimary">@color/md_theme_light_primary2</item>
<item name="colorOnPrimary">@color/md_theme_light_onPrimary2</item>
<item name="colorPrimaryContainer">@color/md_theme_light_primaryContainer2</item>
<item name="colorOnPrimaryContainer">@color/md_theme_light_onPrimaryContainer2</item>
<item name="colorSecondary">@color/md_theme_light_secondary2</item>
<item name="colorOnSecondary">@color/md_theme_light_onSecondary2</item>
<item name="colorSecondaryContainer">@color/md_theme_light_secondaryContainer2</item>
<item name="colorOnSecondaryContainer">@color/md_theme_light_onSecondaryContainer2</item>
<item name="colorTertiary">@color/md_theme_light_tertiary2</item>
<item name="colorOnTertiary">@color/md_theme_light_onTertiary2</item>
<item name="colorTertiaryContainer">@color/md_theme_light_tertiaryContainer2</item>
<item name="colorOnTertiaryContainer">@color/md_theme_light_onTertiaryContainer2</item>
<item name="colorError">@color/md_theme_light_error2</item>
<item name="colorOnError">@color/md_theme_light_onError2</item>
<item name="colorErrorContainer">@color/md_theme_light_errorContainer2</item>
<item name="colorOnErrorContainer">@color/md_theme_light_onErrorContainer2</item>
<item name="android:colorBackground">@color/md_theme_light_background2</item>
<item name="colorOnBackground">@color/md_theme_light_onBackground2</item>
<item name="colorSurface">@color/md_theme_light_surface2</item>
<item name="colorOnSurface">@color/md_theme_light_onSurface2</item>
<item name="colorSurfaceVariant">@color/md_theme_light_surfaceVariant2</item>
<item name="colorOnSurfaceVariant">@color/md_theme_light_onSurfaceVariant2</item>
<item name="colorOutline">@color/md_theme_light_outline2</item>
<item name="colorSurfaceInverse">@color/md_theme_light_inverseSurface2</item>
<item name="colorOnSurfaceInverse">@color/md_theme_light_inverseOnSurface2</item>
<item name="elevationOverlayColor">@color/md_theme_light_surfaceTint2</item>
<item name="colorPrimaryInverse">@color/md_theme_light_inversePrimary2</item>
</style>
<style name="AppTheme3" parent="BaseAppTheme">
<item name="colorPrimary">@color/md_theme_light_primary3</item>
<item name="colorOnPrimary">@color/md_theme_light_onPrimary3</item>
<item name="colorPrimaryContainer">@color/md_theme_light_primaryContainer3</item>
<item name="colorOnPrimaryContainer">@color/md_theme_light_onPrimaryContainer3</item>
<item name="colorSecondary">@color/md_theme_light_secondary3</item>
<item name="colorOnSecondary">@color/md_theme_light_onSecondary3</item>
<item name="colorSecondaryContainer">@color/md_theme_light_secondaryContainer3</item>
<item name="colorOnSecondaryContainer">@color/md_theme_light_onSecondaryContainer3</item>
<item name="colorTertiary">@color/md_theme_light_tertiary3</item>
<item name="colorOnTertiary">@color/md_theme_light_onTertiary3</item>
<item name="colorTertiaryContainer">@color/md_theme_light_tertiaryContainer3</item>
<item name="colorOnTertiaryContainer">@color/md_theme_light_onTertiaryContainer3</item>
<item name="colorError">@color/md_theme_light_error3</item>
<item name="colorOnError">@color/md_theme_light_onError3</item>
<item name="colorErrorContainer">@color/md_theme_light_errorContainer3</item>
<item name="colorOnErrorContainer">@color/md_theme_light_onErrorContainer3</item>
<item name="android:colorBackground">@color/md_theme_light_background3</item>
<item name="colorOnBackground">@color/md_theme_light_onBackground3</item>
<item name="colorSurface">@color/md_theme_light_surface3</item>
<item name="colorOnSurface">@color/md_theme_light_onSurface3</item>
<item name="colorSurfaceVariant">@color/md_theme_light_surfaceVariant3</item>
<item name="colorOnSurfaceVariant">@color/md_theme_light_onSurfaceVariant3</item>
<item name="colorOutline">@color/md_theme_light_outline3</item>
<item name="colorSurfaceInverse">@color/md_theme_light_inverseSurface3</item>
<item name="colorOnSurfaceInverse">@color/md_theme_light_inverseOnSurface3</item>
<item name="elevationOverlayColor">@color/md_theme_light_surfaceTint3</item>
<item name="colorPrimaryInverse">@color/md_theme_light_inversePrimary3</item>
</style>
<style name="AppTheme4" parent="BaseAppTheme">
<item name="colorPrimary">@color/md_theme_light_primary4</item>
<item name="colorOnPrimary">@color/md_theme_light_onPrimary4</item>
<item name="colorPrimaryContainer">@color/md_theme_light_primaryContainer4</item>
<item name="colorOnPrimaryContainer">@color/md_theme_light_onPrimaryContainer4</item>
<item name="colorSecondary">@color/md_theme_light_secondary4</item>
<item name="colorOnSecondary">@color/md_theme_light_onSecondary4</item>
<item name="colorSecondaryContainer">@color/md_theme_light_secondaryContainer4</item>
<item name="colorOnSecondaryContainer">@color/md_theme_light_onSecondaryContainer4</item>
<item name="colorTertiary">@color/md_theme_light_tertiary4</item>
<item name="colorOnTertiary">@color/md_theme_light_onTertiary4</item>
<item name="colorTertiaryContainer">@color/md_theme_light_tertiaryContainer4</item>
<item name="colorOnTertiaryContainer">@color/md_theme_light_onTertiaryContainer4</item>
<item name="colorError">@color/md_theme_light_error4</item>
<item name="colorOnError">@color/md_theme_light_onError4</item>
<item name="colorErrorContainer">@color/md_theme_light_errorContainer4</item>
<item name="colorOnErrorContainer">@color/md_theme_light_onErrorContainer4</item>
<item name="android:colorBackground">@color/md_theme_light_background4</item>
<item name="colorOnBackground">@color/md_theme_light_onBackground4</item>
<item name="colorSurface">@color/md_theme_light_surface4</item>
<item name="colorOnSurface">@color/md_theme_light_onSurface4</item>
<item name="colorSurfaceVariant">@color/md_theme_light_surfaceVariant4</item>
<item name="colorOnSurfaceVariant">@color/md_theme_light_onSurfaceVariant4</item>
<item name="colorOutline">@color/md_theme_light_outline4</item>
<item name="colorSurfaceInverse">@color/md_theme_light_inverseSurface4</item>
<item name="colorOnSurfaceInverse">@color/md_theme_light_inverseOnSurface4</item>
<item name="elevationOverlayColor">@color/md_theme_light_surfaceTint4</item>
<item name="colorPrimaryInverse">@color/md_theme_light_inversePrimary4</item>
</style>
<style name="AppTheme5" parent="BaseAppTheme">
<item name="colorPrimary">@color/md_theme_light_primary</item>
<item name="colorOnPrimary">@color/md_theme_light_onPrimary</item>
<item name="colorPrimaryContainer">@color/md_theme_light_primaryContainer</item>
<item name="colorOnPrimaryContainer">@color/md_theme_light_onPrimaryContainer</item>
<item name="colorSecondary">@color/md_theme_light_secondary</item>
<item name="colorOnSecondary">@color/md_theme_light_onSecondary</item>
<item name="colorSecondaryContainer">@color/md_theme_light_secondaryContainer</item>
<item name="colorOnSecondaryContainer">@color/md_theme_light_onSecondaryContainer</item>
<item name="colorTertiary">@color/md_theme_light_tertiary</item>
<item name="colorOnTertiary">@color/md_theme_light_onTertiary</item>
<item name="colorTertiaryContainer">@color/md_theme_light_tertiaryContainer</item>
<item name="colorOnTertiaryContainer">@color/md_theme_light_onTertiaryContainer</item>
<item name="colorError">@color/md_theme_light_error</item>
<item name="colorErrorContainer">@color/md_theme_light_errorContainer</item>
<item name="colorOnError">@color/md_theme_light_onError</item>
<item name="colorOnErrorContainer">@color/md_theme_light_onErrorContainer</item>
<item name="android:colorBackground">@color/md_theme_light_background</item>
<item name="colorOnBackground">@color/md_theme_light_onBackground</item>
<item name="colorSurface">@color/md_theme_light_surface</item>
<item name="colorOnSurface">@color/md_theme_light_onSurface</item>
<item name="colorSurfaceVariant">@color/md_theme_light_surfaceVariant</item>
<item name="colorOnSurfaceVariant">@color/md_theme_light_onSurfaceVariant</item>
<item name="colorOutline">@color/md_theme_light_outline</item>
<item name="colorOnSurfaceInverse">@color/md_theme_light_inverseOnSurface</item>
<item name="colorSurfaceInverse">@color/md_theme_light_inverseSurface</item>
<item name="elevationOverlayColor">@color/md_theme_light_surfaceTint</item>
<item name="colorPrimaryInverse">@color/md_theme_light_inversePrimary</item>
</style>
<style name="BaseAppTheme.NoActionBar" parent="BaseAppTheme">
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme2.NoActionBar" parent="AppTheme2">
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme3.NoActionBar" parent="AppTheme3">
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme4.NoActionBar" parent="AppTheme4">
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme5.NoActionBar" parent="AppTheme5">
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
</resources>