remove viewpagerindicator library

This commit is contained in:
Phillip Thelen 2025-02-11 17:26:12 +01:00
parent 699a31fd52
commit ee9bbf731e
14 changed files with 203 additions and 2061 deletions

View file

@ -157,7 +157,6 @@ dependencies {
// IAP Handling / Verification
implementation(libs.billing)
implementation(libs.viewPagerIndicator) { exclude(group = "com.google.android") }
implementation(libs.coil.compose)

View file

@ -1,5 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/indicator_diamond_selected" />
<item android:drawable="@drawable/indicator_diamond_unselected" />
<item android:state_selected="true">
<layer-list>
<item android:drawable="@drawable/indicator_diamond_selected" android:height="24dp" />
</layer-list>
</item>
<item>
<layer-list>
<item android:drawable="@drawable/indicator_diamond_unselected" android:height="24dp" />
</layer-list>
</item>
</selector>

View file

@ -1,23 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:tools="http://schemas.android.com/tools"
tools:background="@color/brand">
<androidx.viewpager.widget.ViewPager
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<RelativeLayout
android:orientation="vertical" android:layout_width="match_parent"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<com.viewpagerindicator.IconPageIndicator
<com.google.android.material.tabs.TabLayout
android:id="@+id/view_pager_indicator"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_alignParentBottom="true"
android:layout_marginBottom="16dp" />
app:tabGravity="center"
app:tabBackground="@drawable/indicator_diamond"
android:background="@color/transparent"
app:tabIndicator="@null" />
<Button
android:layout_width="wrap_content"

View file

@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.habitrpg.android.habitica.ui.views.FadingViewPager
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="0dp"
@ -17,11 +19,16 @@
android:background="@color/background_brand"
android:gravity="center_vertical"
android:elevation="8dp">
<com.viewpagerindicator.IconPageIndicator
<com.google.android.material.tabs.TabLayout
android:id="@+id/view_pager_indicator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />
android:layout_centerInParent="true"
app:tabBackground="@drawable/indicator_diamond"
android:background="@color/transparent"
app:tabIndicator="@null" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -30,6 +37,7 @@
android:background="@color/transparent"
android:drawablePadding="12dp"
android:textColor="@color/white" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -1,7 +1,7 @@
<resources>
<!-- Application theme. -->
<style name="AppTheme" parent="Theme.Material3.DayNight">
<style name="AppTheme" parent="Theme.Material3.DynamicColors.DayNight">
<item name="android:listSeparatorTextViewStyle">@style/MyOwnListSeperatorTextViewStyle
</item>

View file

@ -94,9 +94,7 @@ abstract class BaseActivity : AppCompatActivity() {
private val defaultNavigationBarStyle by lazy {
SystemBarStyle.auto(ContextCompat.getColor(this, R.color.white_50_alpha),
ContextCompat.getColor(this, R.color.black_50_alpha),
{ _ -> true}
)
ContextCompat.getColor(this, R.color.black_50_alpha))
}
internal var navigationBarStyle: SystemBarStyle? = null

View file

@ -4,30 +4,26 @@ import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.activity.SystemBarStyle
import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter
import androidx.lifecycle.lifecycleScope
import androidx.viewpager.widget.ViewPager
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayoutMediator
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.ContentRepository
import com.habitrpg.android.habitica.databinding.ActivityIntroBinding
import com.habitrpg.android.habitica.extensions.setNavigationBarDarkIcons
import com.habitrpg.android.habitica.ui.fragments.setup.IntroFragment
import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.viewpagerindicator.IconPagerAdapter
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import javax.inject.Inject
@AndroidEntryPoint
class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChangeListener {
class IntroActivity : BaseActivity() {
private lateinit var binding: ActivityIntroBinding
@Inject
@ -46,10 +42,9 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan
super.onCreate(savedInstanceState)
setupIntro()
binding.viewPagerIndicator.setViewPager(binding.viewPager)
binding.skipButton.setOnClickListener(this)
binding.finishButton.setOnClickListener(this)
binding.skipButton.setOnClickListener { finishIntro() }
binding.finishButton.setOnClickListener { finishIntro() }
lifecycleScope.launch(ExceptionHandler.coroutine()) {
contentRepository.retrieveContent()
@ -69,13 +64,17 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan
}
private fun setupIntro() {
binding.viewPager.adapter = PagerAdapter(supportFragmentManager)
binding.viewPager.addOnPageChangeListener(this)
setViewPagerAdapter()
binding.viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
if (position == 2) {
binding.finishButton.visibility = View.VISIBLE
} else {
binding.finishButton.visibility = View.GONE
}
override fun onClick(v: View) {
finishIntro()
}
})
}
private fun finishIntro() {
@ -87,50 +86,21 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan
finish()
}
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) { // no-on
}
override fun onPageSelected(position: Int) {
if (position == 2) {
binding.finishButton.visibility = View.VISIBLE
} else {
binding.finishButton.visibility = View.GONE
}
}
override fun onPageScrollStateChanged(state: Int) { // no-on
}
private inner class PagerAdapter(fm: FragmentManager) :
FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT), IconPagerAdapter {
override fun getItem(position: Int): Fragment {
private fun setViewPagerAdapter() {
val fragmentManager = supportFragmentManager
val viewPagerAdapter = object : FragmentStateAdapter(fragmentManager, lifecycle) {
override fun createFragment(position: Int): Fragment {
val fragment = IntroFragment()
configureFragment(fragment, position)
return fragment
}
override fun getIconResId(index: Int): Int {
return R.drawable.indicator_diamond
}
override fun getCount(): Int {
override fun getItemCount(): Int {
return 3
}
override fun instantiateItem(
container: ViewGroup,
position: Int
): Any {
val item = super.instantiateItem(container, position)
if (item is IntroFragment) {
configureFragment(item, position)
}
return item
}
binding.viewPager.adapter = viewPagerAdapter
TabLayoutMediator(binding.viewPagerIndicator, binding.viewPager) { tab, position -> }.attach()
}
private fun configureFragment(

View file

@ -1,23 +1,19 @@
package com.habitrpg.android.habitica.ui.activities
import android.content.Context
import android.content.Intent
import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.view.WindowInsetsController
import android.view.inputmethod.InputMethodManager
import androidx.appcompat.content.res.AppCompatResources
import androidx.core.content.ContextCompat
import androidx.core.content.edit
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceManager
import androidx.viewpager.widget.ViewPager
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayoutMediator
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.InventoryRepository
@ -30,10 +26,8 @@ import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.fragments.setup.AvatarSetupFragment
import com.habitrpg.android.habitica.ui.fragments.setup.TaskSetupFragment
import com.habitrpg.android.habitica.ui.fragments.setup.WelcomeFragment
import com.habitrpg.common.habitica.extensions.isUsingNightModeResources
import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.common.habitica.helpers.launchCatching
import com.viewpagerindicator.IconPagerAdapter
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.debounce
@ -44,7 +38,7 @@ import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
@AndroidEntryPoint
class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
class SetupActivity : BaseActivity() {
private lateinit var binding: ActivitySetupBinding
@Inject
@ -66,7 +60,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
private val isLastPage: Boolean
get() =
binding.viewPager.adapter == null || binding.viewPager.currentItem == (
binding.viewPager.adapter?.count
binding.viewPager.adapter?.itemCount
?: 0
) - 1
@ -103,7 +97,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
}
}
binding.viewPager.disableFading = true
binding.viewPager.isUserInputEnabled = false
binding.previousButton.setOnClickListener { previousClicked() }
binding.nextButton.setOnClickListener { nextClicked() }
@ -115,12 +109,26 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
}
private fun setupViewpager() {
val fragmentManager = supportFragmentManager
binding.viewPager.adapter = ViewPageAdapter(fragmentManager)
binding.viewPager.addOnPageChangeListener(this)
binding.viewPagerIndicator.setViewPager(binding.viewPager)
setViewPagerAdapter()
binding.viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
when {
position == 0 -> {
setPreviousButtonEnabled(false)
binding.nextButton.text = getString(R.string.next_button)
}
isLastPage -> {
setPreviousButtonEnabled(true)
binding.nextButton.text = getString(R.string.finish)
}
else -> {
setPreviousButtonEnabled(true)
binding.nextButton.text = getString(R.string.next_button)
}
}
}
})
}
private fun nextClicked() {
@ -147,7 +155,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
} else if (binding.viewPager.currentItem == 0) {
confirmNames(welcomeFragment?.displayName ?: "", welcomeFragment?.username ?: "")
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
val imm = getSystemService(INPUT_METHOD_SERVICE) as? InputMethodManager
imm?.hideSoftInputFromWindow(currentFocus?.windowToken, 0)
}
binding.viewPager.currentItem = binding.viewPager.currentItem + 1
@ -187,34 +195,6 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
binding.nextButton.setCompoundDrawablesWithIntrinsicBounds(null, null, rightDrawable, null)
}
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) =
Unit
override fun onPageSelected(position: Int) {
when {
position == 0 -> {
this.setPreviousButtonEnabled(false)
binding.nextButton.text = this.getString(R.string.next_button)
}
isLastPage -> {
this.setPreviousButtonEnabled(true)
binding.nextButton.text = this.getString(R.string.finish)
}
else -> {
this.setPreviousButtonEnabled(true)
binding.nextButton.text = this.getString(R.string.next_button)
}
}
}
override fun onPageScrollStateChanged(state: Int) = Unit
private var hasCompleted = false
private fun onUserReceived(user: User?) {
@ -255,9 +235,10 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
}
}
private inner class ViewPageAdapter(fm: FragmentManager) :
FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT), IconPagerAdapter {
override fun getItem(position: Int): Fragment {
private fun setViewPagerAdapter() {
val fragmentManager = supportFragmentManager
val viewPagerAdapter = object : FragmentStateAdapter(fragmentManager, lifecycle) {
override fun createFragment(position: Int): Fragment {
return when (position) {
1 -> {
val fragment = AvatarSetupFragment()
@ -284,38 +265,11 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
}
}
override fun instantiateItem(
container: ViewGroup,
position: Int
): Any {
val item = super.instantiateItem(container, position)
when (item) {
is AvatarSetupFragment -> {
avatarSetupFragment = item
item.activity = this@SetupActivity
item.setUser(user)
item.width = binding.viewPager.width
}
is TaskSetupFragment -> {
taskSetupFragment = item
item.setUser(user)
}
is WelcomeFragment -> {
welcomeFragment = item
item.onNameValid = { setNextButtonEnabled(it == true) }
}
}
return item
}
override fun getCount(): Int {
override fun getItemCount(): Int {
return 3
}
override fun getIconResId(index: Int): Int {
return R.drawable.indicator_diamond
}
}
binding.viewPager.adapter = viewPagerAdapter
TabLayoutMediator(binding.viewPagerIndicator, binding.viewPager) { tab, position -> }.attach()
}
}

View file

@ -100,7 +100,7 @@ abstract class BaseMainFragment<VB : ViewBinding> : BaseFragment<VB>() {
view?.systemUiVisibility
window.setNavigationBarDarkIcons(false)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
window.isNavigationBarContrastEnforced = false
window.isNavigationBarContrastEnforced = true
}
} else {
windowInsetsController.isAppearanceLightNavigationBars = requireActivity().isUsingNightModeResources()

View file

@ -25,6 +25,7 @@ import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import javax.inject.Inject
import androidx.core.graphics.drawable.toDrawable
@AndroidEntryPoint
class WelcomeFragment : BaseFragment<FragmentWelcomeBinding>() {
@ -47,17 +48,14 @@ class WelcomeFragment : BaseFragment<FragmentWelcomeBinding>() {
private val checkmarkIcon: Drawable by lazy {
context?.let {
BitmapDrawable(
resources,
HabiticaIconsHelper.imageOfCheckmark(
ContextCompat.getColor(it, R.color.green_50),
1f
)
)
).toDrawable(resources)
} ?: VectorDrawable()
}
private val alertIcon: Drawable by lazy {
BitmapDrawable(resources, HabiticaIconsHelper.imageOfAlertIcon())
HabiticaIconsHelper.imageOfAlertIcon().toDrawable(resources)
}
val username: String
get() = binding?.usernameEditText?.text?.toString() ?: ""

View file

@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.ui.views;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.RectF;
import androidx.annotation.ColorInt;
@ -470,44 +469,6 @@ public class HabiticaIconsHelper {
return imageOfCaret;
}
private static Bitmap imageOfRageStrikeInactive = null;
public static Bitmap imageOfRageStrikeInactive() {
if (imageOfRageStrikeInactive != null)
return imageOfRageStrikeInactive;
imageOfRageStrikeInactive = Bitmap.createBitmap(scaleSize(63), scaleSize(82), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(imageOfRageStrikeInactive);
canvas.scale(displayDensity, displayDensity);
HabiticaIcons.drawRageStrikeInactive(canvas);
return imageOfRageStrikeInactive;
}
public static Bitmap imageOfRageStrikeActive(Context context, Bitmap rageStrikeNPC) {
Bitmap imageOfRageStrikeActive = Bitmap.createBitmap(scaleSize(63), scaleSize(82), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(imageOfRageStrikeActive);
canvas.scale(displayDensity, displayDensity);
HabiticaIcons.drawRageStrikeActive(canvas, context, rageStrikeNPC);
return imageOfRageStrikeActive;
}
private static Bitmap imageOfRage = null;
public static Bitmap imageOfRage() {
if (imageOfRage != null)
return imageOfRage;
int size = scaleSize(18);
imageOfRage = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(imageOfRage);
canvas.scale(displayDensity, displayDensity);
HabiticaIcons.drawRage(canvas);
return imageOfRage;
}
public static Bitmap imageOfLocked(@ColorInt int lockColor) {
return imageOfLocked(lockColor, 15, 17);
}
@ -670,15 +631,6 @@ public class HabiticaIconsHelper {
return imageOfHabitControlMinus;
}
public static Bitmap imageOfGuildCrest(boolean isOwner, boolean isPublic, float memberCount, String memberCountLabel) {
Bitmap imageOfGuildCrest = Bitmap.createBitmap(scaleSize(40), scaleSize(38), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(imageOfGuildCrest);
canvas.scale(displayDensity, displayDensity);
HabiticaIcons.drawGuildCrest(canvas, isOwner, isPublic, memberCount, memberCountLabel);
return imageOfGuildCrest;
}
public static Bitmap imageOfGuildCrestMedium(float memberCount) {
Bitmap imageOfGuildCrestMedium = Bitmap.createBitmap(scaleSize(30), scaleSize(34), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(imageOfGuildCrestMedium);
@ -688,12 +640,4 @@ public class HabiticaIconsHelper {
return imageOfGuildCrestMedium;
}
public static Bitmap imageOfGuildCrestSmall(float memberCount) {
Bitmap imageOfGuildCrestSmall = Bitmap.createBitmap(scaleSize(16), scaleSize(16), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(imageOfGuildCrestSmall);
canvas.scale(displayDensity, displayDensity);
HabiticaIcons.drawGuildCrestSmall(canvas, memberCount);
return imageOfGuildCrestSmall;
}
}

View file

@ -1,4 +1,3 @@
android.enableJetifier=true
android.useAndroidX=true
android.debug.obsoleteApi=true
org.gradle.configureondemand=true

View file

@ -22,14 +22,14 @@ coordinatorlayout = "1.2.0"
coreSplashscreen = "1.1.0-rc01"
core_ktx = "1.15.0"
coroutines = "1.9.0"
crashlytics = "3.0.2"
crashlytics = "3.0.3"
credentials = "1.3.0"
daggerhilt = "2.55"
desuggar = "2.1.4"
detekt = "1.19.0"
deviceNames = "2.1.1"
firebase-perf = "1.4.2"
firebase_bom = "33.8.0"
firebase_bom = "33.9.0"
flexbox = "3.0.0"
fragmentKtx = "1.8.5"
fragmentTesting = "1.8.5"