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

View File

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

View File

@ -6,9 +6,11 @@ import android.widget.ProgressBar
import androidx.constraintlayout.motion.widget.MotionLayout import androidx.constraintlayout.motion.widget.MotionLayout
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.lifecycle.LifecycleCoroutineScope import androidx.lifecycle.LifecycleCoroutineScope
import androidx.paging.CombinedLoadStates
import androidx.paging.LoadState import androidx.paging.LoadState
import androidx.paging.LoadStateAdapter import androidx.paging.LoadStateAdapter
import androidx.paging.PagingDataAdapter import androidx.paging.PagingDataAdapter
import androidx.recyclerview.widget.ConcatAdapter
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout 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.ErrorLayoutBinding
import org.pixeldroid.app.databinding.LoadStateFooterViewItemBinding import org.pixeldroid.app.databinding.LoadStateFooterViewItemBinding
import org.pixeldroid.app.posts.feeds.uncachedFeeds.FeedViewModel 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.FeedContent
import org.pixeldroid.app.utils.api.objects.Status import org.pixeldroid.app.utils.api.objects.Status
import retrofit2.HttpException import retrofit2.HttpException
@ -49,14 +52,28 @@ private fun showError(
internal fun <T: Any> initAdapter( internal fun <T: Any> initAdapter(
progressBar: ProgressBar, swipeRefreshLayout: SwipeRefreshLayout, progressBar: ProgressBar, swipeRefreshLayout: SwipeRefreshLayout,
recyclerView: RecyclerView, motionLayout: MotionLayout, errorLayout: ErrorLayoutBinding, 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 { swipeRefreshLayout.setOnRefreshListener {
adapter.refresh() adapter.refresh()
header?.refreshStories()
} }
adapter.addLoadStateListener { loadState -> 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 * [RecyclerView.ViewHolder] that is shown at the end of the feed to indicate loading or errors
* in the loading of appending values. * in the loading of appending values.

View File

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

View File

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

View File

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

View File

@ -126,7 +126,12 @@ class StoriesViewModel(
viewModelScope.launch { viewModelScope.launch {
try { try {
val api = apiHolder.api ?: apiHolder.setToCurrentUser() 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){ } catch (exception: Exception){
_uiState.update { currentUiState -> _uiState.update { currentUiState ->
currentUiState.copy(errorMessage = R.string.story_could_not_see) 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.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.lifecycle.LifecycleCoroutineScope import androidx.lifecycle.LifecycleCoroutineScope
import androidx.paging.LoadState
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -15,51 +15,90 @@ import org.pixeldroid.app.databinding.StoryCarouselBinding
import org.pixeldroid.app.databinding.StoryCarouselItemBinding import org.pixeldroid.app.databinding.StoryCarouselItemBinding
import org.pixeldroid.app.postCreation.camera.CameraActivity import org.pixeldroid.app.postCreation.camera.CameraActivity
import org.pixeldroid.app.postCreation.camera.CameraFragment 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.CarouselUserContainer
import org.pixeldroid.app.utils.api.objects.StoryCarousel import org.pixeldroid.app.utils.api.objects.StoryCarousel
import org.pixeldroid.app.utils.di.PixelfedAPIHolder import org.pixeldroid.app.utils.di.PixelfedAPIHolder
class StoryCarouselViewHolder(val binding: StoryCarouselBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind( /**
pixelfedAPI: PixelfedAPIHolder, * Adapter to the show the a [RecyclerView] item for a [LoadState]
lifecycleScope: LifecycleCoroutineScope, */
itemView: View class StoriesAdapter(val lifecycleScope: LifecycleCoroutineScope, val apiHolder: PixelfedAPIHolder) : RecyclerView.Adapter<StoryCarouselViewHolder>() {
) { var carousel: StoryCarousel? = null
val adapter = StoriesListAdapter()
binding.storyCarousel.adapter = adapter /**
* 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
loadStories(adapter, lifecycleScope, pixelfedAPI, itemView)
} }
private fun loadStories( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StoryCarouselViewHolder {
adapter: StoriesListAdapter, return StoryCarouselViewHolder.create(parent, ::noStories)
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 { lifecycleScope.launch {
try{ try{
val api = apiHolder.api ?: apiHolder.setToCurrentUser() val api = apiHolder.api ?: apiHolder.setToCurrentUser()
val carousel = api.carousel() val carousel = api.carousel()
if (carousel.nodes?.isEmpty() != true) { if (carousel.nodes?.isEmpty() != true) {
itemView.visibility = View.VISIBLE // Pass carousel to adapter
itemView.layoutParams.height = 200.dpToPx(binding.root.context) gotStories(carousel)
itemView.layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT } else {
noStories()
adapter.initCarousel(carousel)
} }
} catch (exception: Exception){ } 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 { companion object {
fun create(parent: ViewGroup): StoryCarouselViewHolder { fun create(parent: ViewGroup, noStories: () -> Unit): StoryCarouselViewHolder {
val itemBinding = StoryCarouselBinding.inflate( val itemBinding = StoryCarouselBinding.inflate(
LayoutInflater.from(parent.context), parent, false LayoutInflater.from(parent.context), parent, false
) )

View File

@ -235,7 +235,7 @@ interface PixelfedAPI {
@Query("post_id") post_id: String, @Query("post_id") post_id: String,
) )
@GET("/api/v1.1/stories/carousel") @GET("/api/pixelfed/v1/stories/self-carousel")
suspend fun carousel(): StoryCarousel suspend fun carousel(): StoryCarousel
@POST("/api/v1.1/stories/seen") @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.postCreation.PostCreationViewModel
import org.pixeldroid.app.profile.EditProfileViewModel import org.pixeldroid.app.profile.EditProfileViewModel
import org.pixeldroid.app.stories.StoriesViewModel import org.pixeldroid.app.stories.StoriesViewModel
import org.pixeldroid.app.stories.StoryCarouselViewHolder
import org.pixeldroid.app.utils.notificationsWorker.NotificationsWorker import org.pixeldroid.app.utils.notificationsWorker.NotificationsWorker
import javax.inject.Singleton 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 --> <!-- TODO get rid of duplicated mascot/mascot_small somehow -->
<item name="windowSplashScreenAnimatedIcon">@drawable/mascot_small</item> <item name="windowSplashScreenAnimatedIcon">@drawable/mascot_small</item>
<!-- Set the theme of the Activity that directly follows your splash screen. --> <!-- Set the theme of the Activity that directly follows your splash screen. -->
<!-- Required --> <!-- Required -->
<item name="postSplashScreenTheme">@style/BaseAppTheme.NoActionBar</item> <item name="postSplashScreenTheme">@style/BaseAppTheme</item>
<item name="windowActionBar">false</item> <item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
</style> </style>
@ -49,179 +47,4 @@
<item name="android:background">@android:color/transparent</item> <item name="android:background">@android:color/transparent</item>
<item name="background">@android:color/transparent</item> <item name="background">@android:color/transparent</item>
</style> </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> </resources>