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 // IAP Handling / Verification
implementation(libs.billing) implementation(libs.billing)
implementation(libs.viewPagerIndicator) { exclude(group = "com.google.android") }
implementation(libs.coil.compose) implementation(libs.coil.compose)

View file

@ -1,5 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/indicator_diamond_selected" /> <item android:state_selected="true">
<item android:drawable="@drawable/indicator_diamond_unselected" /> <layer-list>
</selector> <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,50 +1,58 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:background="@color/brand">
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<RelativeLayout
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true"> android:layout_width="match_parent"
<com.viewpagerindicator.IconPageIndicator tools:background="@color/brand">
android:id="@+id/view_pager_indicator"
android:layout_height="wrap_content" <androidx.viewpager2.widget.ViewPager2
android:layout_width="fill_parent" android:id="@+id/viewPager"
android:layout_alignParentBottom="true" android:layout_width="match_parent"
android:layout_marginBottom="16dp" /> android:layout_height="match_parent" />
<RelativeLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<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"
app:tabGravity="center"
app:tabBackground="@drawable/indicator_diamond"
android:background="@color/transparent"
app:tabIndicator="@null" />
<Button <Button
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/skip_button" android:text="@string/skip_button"
android:id="@+id/skipButton" android:id="@+id/skipButton"
android:layout_alignParentBottom="false" android:layout_alignParentBottom="false"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_marginEnd="6dp" android:layout_marginEnd="6dp"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_marginTop="@dimen/spacing_small" android:layout_marginTop="@dimen/spacing_small"
android:textColor="@android:color/white" android:textColor="@android:color/white"
android:background="@color/transparent" /> android:background="@color/transparent" />
<Button <Button
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/intro_finish_button" android:text="@string/intro_finish_button"
android:id="@+id/finishButton" android:id="@+id/finishButton"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_marginEnd="12dp" android:layout_marginEnd="12dp"
android:layout_marginBottom="6dp" android:layout_marginBottom="6dp"
android:background="@color/transparent" android:background="@color/transparent"
android:textColor="@android:color/white" android:textColor="@android:color/white"
android:textSize="16sp" android:textSize="16sp"
android:visibility="gone" android:visibility="gone"
tools:visibility="visible"/> tools:visibility="visible" />
</RelativeLayout> </RelativeLayout>
</FrameLayout> </FrameLayout>

View file

@ -1,44 +1,52 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <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:orientation="vertical">
<com.habitrpg.android.habitica.ui.views.FadingViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="match_parent"
android:layout_weight="1"/> android:orientation="vertical">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<RelativeLayout <RelativeLayout
android:id="@+id/bottomBar" android:id="@+id/bottomBar"
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/background_brand"
android:gravity="center_vertical"
android:elevation="8dp">
<com.viewpagerindicator.IconPageIndicator
android:id="@+id/view_pager_indicator"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="56dp"
android:layout_centerInParent="true" /> android:background="@color/background_brand"
android:gravity="center_vertical"
android:elevation="8dp">
<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"
app:tabBackground="@drawable/indicator_diamond"
android:background="@color/transparent"
app:tabIndicator="@null" />
<Button <Button
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/previousButton" android:id="@+id/previousButton"
android:drawableStart="@drawable/back_arrow_disabled" android:drawableStart="@drawable/back_arrow_disabled"
android:background="@color/transparent" android:background="@color/transparent"
android:drawablePadding="12dp" android:drawablePadding="12dp"
android:textColor="@color/white"/> android:textColor="@color/white" />
<Button <Button
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/next_button" android:text="@string/next_button"
android:id="@+id/nextButton" android:id="@+id/nextButton"
android:drawablePadding="12dp" android:drawablePadding="12dp"
android:textColor="@color/white" android:textColor="@color/white"
android:drawableEnd="@drawable/forward_arrow_enabled" android:drawableEnd="@drawable/forward_arrow_enabled"
android:background="@color/transparent" android:background="@color/transparent"
android:layout_alignParentEnd="true"/> android:layout_alignParentEnd="true" />
</RelativeLayout> </RelativeLayout>
</LinearLayout> </LinearLayout>

View file

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

View file

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

View file

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

View file

@ -1,23 +1,19 @@
package com.habitrpg.android.habitica.ui.activities package com.habitrpg.android.habitica.ui.activities
import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewGroup
import android.view.WindowInsetsController
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.edit import androidx.core.content.edit
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceManager 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.R
import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.InventoryRepository 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.AvatarSetupFragment
import com.habitrpg.android.habitica.ui.fragments.setup.TaskSetupFragment import com.habitrpg.android.habitica.ui.fragments.setup.TaskSetupFragment
import com.habitrpg.android.habitica.ui.fragments.setup.WelcomeFragment 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.ExceptionHandler
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import com.viewpagerindicator.IconPagerAdapter
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.debounce
@ -44,7 +38,7 @@ import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.milliseconds
@AndroidEntryPoint @AndroidEntryPoint
class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { class SetupActivity : BaseActivity() {
private lateinit var binding: ActivitySetupBinding private lateinit var binding: ActivitySetupBinding
@Inject @Inject
@ -66,7 +60,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
private val isLastPage: Boolean private val isLastPage: Boolean
get() = get() =
binding.viewPager.adapter == null || binding.viewPager.currentItem == ( binding.viewPager.adapter == null || binding.viewPager.currentItem == (
binding.viewPager.adapter?.count binding.viewPager.adapter?.itemCount
?: 0 ?: 0
) - 1 ) - 1
@ -103,7 +97,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
} }
} }
binding.viewPager.disableFading = true binding.viewPager.isUserInputEnabled = false
binding.previousButton.setOnClickListener { previousClicked() } binding.previousButton.setOnClickListener { previousClicked() }
binding.nextButton.setOnClickListener { nextClicked() } binding.nextButton.setOnClickListener { nextClicked() }
@ -115,12 +109,26 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
} }
private fun setupViewpager() { private fun setupViewpager() {
val fragmentManager = supportFragmentManager setViewPagerAdapter()
binding.viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
binding.viewPager.adapter = ViewPageAdapter(fragmentManager) override fun onPageSelected(position: Int) {
super.onPageSelected(position)
binding.viewPager.addOnPageChangeListener(this) when {
binding.viewPagerIndicator.setViewPager(binding.viewPager) 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() { private fun nextClicked() {
@ -147,7 +155,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
} else if (binding.viewPager.currentItem == 0) { } else if (binding.viewPager.currentItem == 0) {
confirmNames(welcomeFragment?.displayName ?: "", welcomeFragment?.username ?: "") 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) imm?.hideSoftInputFromWindow(currentFocus?.windowToken, 0)
} }
binding.viewPager.currentItem = binding.viewPager.currentItem + 1 binding.viewPager.currentItem = binding.viewPager.currentItem + 1
@ -187,34 +195,6 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
binding.nextButton.setCompoundDrawablesWithIntrinsicBounds(null, null, rightDrawable, null) 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 var hasCompleted = false
private fun onUserReceived(user: User?) { private fun onUserReceived(user: User?) {
@ -255,67 +235,41 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
} }
} }
private inner class ViewPageAdapter(fm: FragmentManager) : private fun setViewPagerAdapter() {
FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT), IconPagerAdapter { val fragmentManager = supportFragmentManager
override fun getItem(position: Int): Fragment { val viewPagerAdapter = object : FragmentStateAdapter(fragmentManager, lifecycle) {
return when (position) { override fun createFragment(position: Int): Fragment {
1 -> { return when (position) {
val fragment = AvatarSetupFragment() 1 -> {
fragment.activity = this@SetupActivity val fragment = AvatarSetupFragment()
fragment.setUser(user) fragment.activity = this@SetupActivity
fragment.width = binding.viewPager.width fragment.setUser(user)
avatarSetupFragment = fragment fragment.width = binding.viewPager.width
fragment avatarSetupFragment = fragment
} fragment
}
2 -> { 2 -> {
val fragment = TaskSetupFragment() val fragment = TaskSetupFragment()
fragment.setUser(user) fragment.setUser(user)
taskSetupFragment = fragment taskSetupFragment = fragment
fragment fragment
} }
else -> { else -> {
val fragment = WelcomeFragment() val fragment = WelcomeFragment()
welcomeFragment = fragment welcomeFragment = fragment
welcomeFragment?.onNameValid = { setNextButtonEnabled(it == true) } welcomeFragment?.onNameValid = { setNextButtonEnabled(it == true) }
fragment fragment
}
} }
} }
}
override fun instantiateItem( override fun getItemCount(): Int {
container: ViewGroup, return 3
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 {
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 view?.systemUiVisibility
window.setNavigationBarDarkIcons(false) window.setNavigationBarDarkIcons(false)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
window.isNavigationBarContrastEnforced = false window.isNavigationBarContrastEnforced = true
} }
} else { } else {
windowInsetsController.isAppearanceLightNavigationBars = requireActivity().isUsingNightModeResources() windowInsetsController.isAppearanceLightNavigationBars = requireActivity().isUsingNightModeResources()

View file

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

View file

@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.ui.views;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.RectF; import android.graphics.RectF;
import androidx.annotation.ColorInt; import androidx.annotation.ColorInt;
@ -470,44 +469,6 @@ public class HabiticaIconsHelper {
return imageOfCaret; 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) { public static Bitmap imageOfLocked(@ColorInt int lockColor) {
return imageOfLocked(lockColor, 15, 17); return imageOfLocked(lockColor, 15, 17);
} }
@ -670,15 +631,6 @@ public class HabiticaIconsHelper {
return imageOfHabitControlMinus; 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) { public static Bitmap imageOfGuildCrestMedium(float memberCount) {
Bitmap imageOfGuildCrestMedium = Bitmap.createBitmap(scaleSize(30), scaleSize(34), Bitmap.Config.ARGB_8888); Bitmap imageOfGuildCrestMedium = Bitmap.createBitmap(scaleSize(30), scaleSize(34), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(imageOfGuildCrestMedium); Canvas canvas = new Canvas(imageOfGuildCrestMedium);
@ -688,12 +640,4 @@ public class HabiticaIconsHelper {
return imageOfGuildCrestMedium; 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.useAndroidX=true
android.debug.obsoleteApi=true android.debug.obsoleteApi=true
org.gradle.configureondemand=true org.gradle.configureondemand=true
@ -11,4 +10,4 @@ android.nonTransitiveRClass=false
android.nonFinalResIds=false android.nonFinalResIds=false
android.enableR8.fullMode=false android.enableR8.fullMode=false
org.gradle.caching=true org.gradle.caching=true
org.gradle.parallel=true org.gradle.parallel=true

View file

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