diff --git a/app/build.gradle b/app/build.gradle index 4131a62..48c76b5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -155,6 +155,7 @@ dependencies { // Pager implementation 'me.relex:circleindicator:2.1.6' + implementation "androidx.viewpager2:viewpager2:1.1.0-beta01" //PhotoView implementation 'com.github.chrisbanes:PhotoView:2.3.0' diff --git a/app/src/main/java/apps/amine/bou/readerforselfoss/ImageActivity.kt b/app/src/main/java/apps/amine/bou/readerforselfoss/ImageActivity.kt index 91f9624..a2078e0 100644 --- a/app/src/main/java/apps/amine/bou/readerforselfoss/ImageActivity.kt +++ b/app/src/main/java/apps/amine/bou/readerforselfoss/ImageActivity.kt @@ -3,8 +3,9 @@ package apps.amine.bou.readerforselfoss import android.os.Bundle import android.view.MenuItem import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentStatePagerAdapter +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.viewpager2.adapter.FragmentStateAdapter import apps.amine.bou.readerforselfoss.databinding.ActivityImageBinding import apps.amine.bou.readerforselfoss.fragments.ImageFragment @@ -28,8 +29,8 @@ class ImageActivity : AppCompatActivity() { allImages = intent.getStringArrayListExtra("allImages") as ArrayList position = intent.getIntExtra("position", 0) - binding.pager.adapter = ScreenSlidePagerAdapter(supportFragmentManager) - binding.pager.currentItem = position + binding.pager.adapter = ScreenSlidePagerAdapter(this) + binding.pager.setCurrentItem(position, false) } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -43,14 +44,10 @@ class ImageActivity : AppCompatActivity() { return super.onOptionsItemSelected(item) } - private inner class ScreenSlidePagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm, FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + private inner class ScreenSlidePagerAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) { - override fun getCount(): Int { - return allImages.size - } + override fun getItemCount(): Int = allImages.size - override fun getItem(position: Int): ImageFragment { - return ImageFragment.newInstance(allImages[position]) - } + override fun createFragment(position: Int): Fragment = ImageFragment.newInstance(allImages[position]) } } \ No newline at end of file diff --git a/app/src/main/java/apps/amine/bou/readerforselfoss/ReaderActivity.kt b/app/src/main/java/apps/amine/bou/readerforselfoss/ReaderActivity.kt index 24b08e9..662d4df 100644 --- a/app/src/main/java/apps/amine/bou/readerforselfoss/ReaderActivity.kt +++ b/app/src/main/java/apps/amine/bou/readerforselfoss/ReaderActivity.kt @@ -3,21 +3,16 @@ package apps.amine.bou.readerforselfoss import android.content.Context import android.content.SharedPreferences import android.graphics.Color -import android.graphics.PorterDuff -import android.graphics.PorterDuffColorFilter -import android.graphics.drawable.ColorDrawable -import android.os.Build import android.os.Bundle import androidx.preference.PreferenceManager -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentStatePagerAdapter -import androidx.core.content.ContextCompat -import androidx.viewpager.widget.ViewPager import androidx.appcompat.app.AppCompatActivity import android.view.Menu import android.view.MenuItem -import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity import androidx.room.Room +import androidx.viewpager2.adapter.FragmentStateAdapter +import androidx.viewpager2.widget.ViewPager2 import apps.amine.bou.readerforselfoss.api.selfoss.Item import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi import apps.amine.bou.readerforselfoss.databinding.ActivityReaderBinding @@ -26,14 +21,11 @@ import apps.amine.bou.readerforselfoss.persistence.database.AppDatabase import apps.amine.bou.readerforselfoss.persistence.migrations.MIGRATION_1_2 import apps.amine.bou.readerforselfoss.persistence.migrations.MIGRATION_2_3 import apps.amine.bou.readerforselfoss.persistence.migrations.MIGRATION_3_4 -import apps.amine.bou.readerforselfoss.themes.AppColors import apps.amine.bou.readerforselfoss.themes.Toppings -import apps.amine.bou.readerforselfoss.transformers.DepthPageTransformer import apps.amine.bou.readerforselfoss.utils.Config import apps.amine.bou.readerforselfoss.utils.SharedItems import apps.amine.bou.readerforselfoss.utils.toggleStar import com.ftinc.scoop.Scoop -import me.relex.circleindicator.CircleIndicator class ReaderActivity : AppCompatActivity() { @@ -50,14 +42,14 @@ class ReaderActivity : AppCompatActivity() { private lateinit var binding: ActivityReaderBinding private var activeAlignment: Int = 1 - val JUSTIFY = 1 - val ALIGN_LEFT = 2 + private val JUSTIFY = 1 + private val ALIGN_LEFT = 2 private fun showMenuItem(willAddToFavorite: Boolean) { if (willAddToFavorite) { - toolbarMenu.findItem(R.id.star).icon.colorFilter = PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP) + toolbarMenu.findItem(R.id.star).icon.setTint(Color.WHITE) } else { - toolbarMenu.findItem(R.id.star).icon.colorFilter = PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SRC_ATOP) + toolbarMenu.findItem(R.id.star).icon.setTint(Color.RED) } } @@ -116,33 +108,14 @@ class ReaderActivity : AppCompatActivity() { readItem(allItems[currentItem]) - binding.pager.adapter = - ScreenSlidePagerAdapter(supportFragmentManager, AppColors(this@ReaderActivity)) - binding.pager.currentItem = currentItem + binding.pager.adapter = ScreenSlidePagerAdapter(this) + binding.pager.setCurrentItem(currentItem, false) } override fun onResume() { super.onResume() - notifyAdapter() - - binding.pager.setPageTransformer(true, DepthPageTransformer()) binding.indicator.setViewPager(binding.pager) - - binding.pager.addOnPageChangeListener( - object : ViewPager.SimpleOnPageChangeListener() { - - override fun onPageSelected(position: Int) { - - if (allItems[position].starred) { - canRemoveFromFavorite() - } else { - canFavorite() - } - readItem(allItems[position]) - } - } - ) } private fun readItem(item: Item) { @@ -151,46 +124,22 @@ class ReaderActivity : AppCompatActivity() { } } - private fun notifyAdapter() { - (binding.pager.adapter as ScreenSlidePagerAdapter).notifyDataSetChanged() - } - - override fun onPause() { - super.onPause() - if (markOnScroll) { - binding.pager.clearOnPageChangeListeners() - } - } - override fun onSaveInstanceState(oldInstanceState: Bundle) { super.onSaveInstanceState(oldInstanceState) oldInstanceState.clear() } - private inner class ScreenSlidePagerAdapter(fm: FragmentManager, val appColors: AppColors) : - FragmentStatePagerAdapter(fm) { + private inner class ScreenSlidePagerAdapter(fa: FragmentActivity) : + FragmentStateAdapter(fa) { - override fun getCount(): Int { - return allItems.size - } - override fun getItem(position: Int): ArticleFragment { - return ArticleFragment.newInstance(position, allItems) - } + override fun getItemCount(): Int = allItems.size - override fun startUpdate(container: ViewGroup) { - super.startUpdate(container) + override fun createFragment(position: Int): Fragment = ArticleFragment.newInstance(position, allItems) - container.background = ColorDrawable( - ContextCompat.getColor( - this@ReaderActivity, - appColors.colorBackground - ) - ) - } } - fun alignmentMenu(showJustify: Boolean) { + private fun alignmentMenu(showJustify: Boolean) { toolbarMenu.findItem(R.id.align_left).isVisible = !showJustify toolbarMenu.findItem(R.id.align_justify).isVisible = showJustify } @@ -200,7 +149,7 @@ class ReaderActivity : AppCompatActivity() { inflater.inflate(R.menu.reader_menu, menu) toolbarMenu = menu - if (!allItems.isEmpty() && allItems[currentItem].starred) { + if (allItems.isNotEmpty() && allItems[currentItem].starred) { canRemoveFromFavorite() } else { canFavorite() @@ -211,6 +160,22 @@ class ReaderActivity : AppCompatActivity() { alignmentMenu(true) } + binding.pager.registerOnPageChangeCallback( + object : ViewPager2.OnPageChangeCallback() { + + override fun onPageSelected(position: Int) { + super.onPageSelected(position) + + if (allItems[position].starred) { + canRemoveFromFavorite() + } else { + canFavorite() + } + readItem(allItems[position]) + } + } + ) + return true } @@ -218,13 +183,11 @@ class ReaderActivity : AppCompatActivity() { fun afterSave() { allItems[binding.pager.currentItem] = allItems[binding.pager.currentItem].toggleStar() - notifyAdapter() canRemoveFromFavorite() } fun afterUnsave() { allItems[binding.pager.currentItem] = allItems[binding.pager.currentItem].toggleStar() - notifyAdapter() canFavorite() } diff --git a/app/src/main/java/apps/amine/bou/readerforselfoss/fragments/ArticleFragment.kt b/app/src/main/java/apps/amine/bou/readerforselfoss/fragments/ArticleFragment.kt index debb7d6..b66a095 100644 --- a/app/src/main/java/apps/amine/bou/readerforselfoss/fragments/ArticleFragment.kt +++ b/app/src/main/java/apps/amine/bou/readerforselfoss/fragments/ArticleFragment.kt @@ -17,7 +17,6 @@ import android.widget.Toast import androidx.browser.customtabs.CustomTabsIntent import com.google.android.material.floatingactionbutton.FloatingActionButton import androidx.fragment.app.Fragment -import androidx.core.content.ContextCompat import androidx.core.widget.NestedScrollView import androidx.appcompat.app.AlertDialog import androidx.core.content.res.ResourcesCompat @@ -93,6 +92,7 @@ class ArticleFragment : Fragment() { super.onCreate(savedInstanceState) pageNumber = requireArguments().getInt(ARG_POSITION) + // TODO: The full list of items is not required, only the item used should be passed allItems = requireArguments().getParcelableArrayList(ARG_ITEMS) as ArrayList db = Room.databaseBuilder( @@ -391,30 +391,12 @@ class ArticleFragment : Fragment() { binding.webcontent.settings.standardFontFamily = a.getString(0) binding.webcontent.visibility = View.VISIBLE - val (textColor, backgroundColor) = if (appColors.isDarkTheme) { - if (context != null) { - Pair(ContextCompat.getColor(requireContext(), R.color.dark_webview_text), ContextCompat.getColor(requireContext(), R.color.dark_webview)) - } else { - Pair(null, null) - } - } else { - if (context != null) { - Pair(ContextCompat.getColor(requireContext(), R.color.light_webview_text), ContextCompat.getColor(requireContext(), R.color.light_webview)) - } else { - Pair(null, null) - } - } - val stringTextColor: String = if (textColor != null) { - String.format("#%06X", 0xFFFFFF and textColor) + // TODO: Set the color strings programmatically + val (stringTextColor, stringBackgroundColor) = if (appColors.isDarkTheme) { + Pair("#FFFFFF", "#303030") } else { - "#000000" - } - - val stringBackgroundColor = if (backgroundColor != null) { - String.format("#%06X", 0xFFFFFF and backgroundColor) - } else { - "#FFFFFF" + Pair("#212121", "#FAFAFA") } binding.webcontent.settings.useWideViewPort = true diff --git a/app/src/main/java/apps/amine/bou/readerforselfoss/themes/AppColors.kt b/app/src/main/java/apps/amine/bou/readerforselfoss/themes/AppColors.kt index 95d0c13..538b767 100644 --- a/app/src/main/java/apps/amine/bou/readerforselfoss/themes/AppColors.kt +++ b/app/src/main/java/apps/amine/bou/readerforselfoss/themes/AppColors.kt @@ -49,7 +49,7 @@ class AppColors(a: Activity) { R.color.darkBackground } else { a.setTheme(R.style.NoBar) - android.R.color.background_light + R.color.grey_50 } textColor = if (isDarkTheme) { diff --git a/app/src/main/java/apps/amine/bou/readerforselfoss/transformers/DepthPageTransformer.kt b/app/src/main/java/apps/amine/bou/readerforselfoss/transformers/DepthPageTransformer.kt deleted file mode 100644 index e5da460..0000000 --- a/app/src/main/java/apps/amine/bou/readerforselfoss/transformers/DepthPageTransformer.kt +++ /dev/null @@ -1,43 +0,0 @@ -package apps.amine.bou.readerforselfoss.transformers - -import androidx.viewpager.widget.ViewPager -import android.view.View - -class DepthPageTransformer : ViewPager.PageTransformer { - - override fun transformPage(view: View, position: Float) { - val pageWidth = view.width - - when { - position < -1 -> // [-Infinity,-1) - // This page is way off-screen to the left. - view.alpha = 0F - position <= 0 -> { // [-1,0] - // Use the default slide transition when moving to the left page - view.alpha = 1F - view.translationX = 0F - view.scaleX = 1F - view.scaleY = 1F - } - position <= 1 -> { // (0,1] - // Fade the page out. - view.alpha = 1 - position - - // Counteract the default slide transition - view.translationX = pageWidth * -position - - // Scale the page down (between MIN_SCALE and 1) - val scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position)) - view.scaleX = scaleFactor - view.scaleY = scaleFactor - } - else -> // (1,+Infinity] - // This page is way off-screen to the right. - view.alpha = 0F - } - } - - companion object { - private val MIN_SCALE = 0.75f - } -} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_image.xml b/app/src/main/res/layout/activity_image.xml index d5e50c4..d2d43ef 100644 --- a/app/src/main/res/layout/activity_image.xml +++ b/app/src/main/res/layout/activity_image.xml @@ -21,7 +21,7 @@ - - - #FFff5722 #FFbf360c #FFe91e63 - #FFFFFFFF + #FFFFFF #FF000000 #FF0000 @color/colorAccentDark @@ -20,5 +20,5 @@ #FFFFFFFF #212121 - #FF303030 + #303030