fixup! [LeakCanary]: OnboardingFragment: Use viewbinding as official way
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
@@ -19,18 +19,11 @@
|
|||||||
|
|
||||||
package com.aurora.store.view.ui.onboarding
|
package com.aurora.store.view.ui.onboarding
|
||||||
|
|
||||||
import android.animation.Animator
|
import android.content.Context
|
||||||
import android.animation.AnimatorListenerAdapter
|
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.Canvas
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewAnimationUtils
|
|
||||||
import androidx.recyclerview.widget.StaggeredGridLayoutManager
|
import androidx.recyclerview.widget.StaggeredGridLayoutManager
|
||||||
import com.aurora.extensions.hide
|
|
||||||
import com.aurora.extensions.isSAndAbove
|
import com.aurora.extensions.isSAndAbove
|
||||||
import com.aurora.extensions.isVisible
|
|
||||||
import com.aurora.extensions.show
|
|
||||||
import com.aurora.store.R
|
import com.aurora.store.R
|
||||||
import com.aurora.store.data.model.Accent
|
import com.aurora.store.data.model.Accent
|
||||||
import com.aurora.store.databinding.FragmentOnboardingAccentBinding
|
import com.aurora.store.databinding.FragmentOnboardingAccentBinding
|
||||||
@@ -38,12 +31,10 @@ import com.aurora.store.util.Preferences
|
|||||||
import com.aurora.store.util.Preferences.PREFERENCE_THEME_ACCENT
|
import com.aurora.store.util.Preferences.PREFERENCE_THEME_ACCENT
|
||||||
import com.aurora.store.util.Preferences.PREFERENCE_THEME_TYPE
|
import com.aurora.store.util.Preferences.PREFERENCE_THEME_TYPE
|
||||||
import com.aurora.store.util.save
|
import com.aurora.store.util.save
|
||||||
import com.aurora.store.view.custom.CubicBezierInterpolator
|
|
||||||
import com.aurora.store.view.epoxy.views.AccentViewModel_
|
import com.aurora.store.view.epoxy.views.AccentViewModel_
|
||||||
import com.aurora.store.view.ui.commons.BaseFragment
|
import com.aurora.store.view.ui.commons.BaseFragment
|
||||||
import com.google.gson.reflect.TypeToken
|
import com.google.gson.reflect.TypeToken
|
||||||
import java.nio.charset.StandardCharsets
|
import java.nio.charset.StandardCharsets
|
||||||
import kotlin.math.sqrt
|
|
||||||
|
|
||||||
|
|
||||||
class AccentFragment : BaseFragment(R.layout.fragment_onboarding_accent) {
|
class AccentFragment : BaseFragment(R.layout.fragment_onboarding_accent) {
|
||||||
@@ -58,8 +49,8 @@ class AccentFragment : BaseFragment(R.layout.fragment_onboarding_accent) {
|
|||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
_binding = FragmentOnboardingAccentBinding.bind(view)
|
_binding = FragmentOnboardingAccentBinding.bind(view)
|
||||||
|
|
||||||
themeId = Preferences.getInteger(requireContext(), PREFERENCE_THEME_TYPE)
|
themeId = Preferences.getInteger(view.context, PREFERENCE_THEME_TYPE)
|
||||||
accentId = Preferences.getInteger(requireContext(), PREFERENCE_THEME_ACCENT)
|
accentId = Preferences.getInteger(view.context, PREFERENCE_THEME_ACCENT)
|
||||||
|
|
||||||
// RecyclerView
|
// RecyclerView
|
||||||
with(binding.epoxyRecycler) {
|
with(binding.epoxyRecycler) {
|
||||||
@@ -70,7 +61,7 @@ class AccentFragment : BaseFragment(R.layout.fragment_onboarding_accent) {
|
|||||||
binding.epoxyRecycler.withModels {
|
binding.epoxyRecycler.withModels {
|
||||||
setFilterDuplicates(true)
|
setFilterDuplicates(true)
|
||||||
|
|
||||||
loadAccentsFromAssets().forEach {
|
loadAccentsFromAssets(view.context).forEach {
|
||||||
if (it.id == 0) {
|
if (it.id == 0) {
|
||||||
if (!isSAndAbove()) return@forEach
|
if (!isSAndAbove()) return@forEach
|
||||||
}
|
}
|
||||||
@@ -84,7 +75,6 @@ class AccentFragment : BaseFragment(R.layout.fragment_onboarding_accent) {
|
|||||||
accentId = it.id
|
accentId = it.id
|
||||||
updateAccent(accentId)
|
updateAccent(accentId)
|
||||||
requestModelBuild()
|
requestModelBuild()
|
||||||
animate(v)
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -96,56 +86,8 @@ class AccentFragment : BaseFragment(R.layout.fragment_onboarding_accent) {
|
|||||||
save(PREFERENCE_THEME_ACCENT, accentId)
|
save(PREFERENCE_THEME_ACCENT, accentId)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun animate(view: View) {
|
private fun loadAccentsFromAssets(context: Context): List<Accent> {
|
||||||
if (binding.themeSwitchImage.isVisible()) {
|
val inputStream = context.assets.open("accent.json")
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
val pos = IntArray(2)
|
|
||||||
view.getLocationInWindow(pos)
|
|
||||||
val w: Int = binding.root.measuredWidth
|
|
||||||
val h: Int = binding.root.measuredHeight
|
|
||||||
|
|
||||||
val bitmap = Bitmap.createBitmap(
|
|
||||||
binding.root.measuredWidth,
|
|
||||||
binding.root.measuredHeight,
|
|
||||||
Bitmap.Config.ARGB_8888
|
|
||||||
)
|
|
||||||
|
|
||||||
val canvas = Canvas(bitmap)
|
|
||||||
binding.root.draw(canvas)
|
|
||||||
binding.themeSwitchImage.setImageBitmap(bitmap)
|
|
||||||
binding.themeSwitchImage.show()
|
|
||||||
|
|
||||||
val finalRadius = sqrt(
|
|
||||||
((w - pos[0]) * (w - pos[0]) + (h - pos[1]) * (h - pos[1])).toDouble()
|
|
||||||
).coerceAtLeast(
|
|
||||||
sqrt((pos[0] * pos[0] + (h - pos[1]) * (h - pos[1])).toDouble())
|
|
||||||
).toFloat()
|
|
||||||
|
|
||||||
val anim: Animator = ViewAnimationUtils.createCircularReveal(
|
|
||||||
binding.root,
|
|
||||||
pos[0],
|
|
||||||
pos[1],
|
|
||||||
0f,
|
|
||||||
finalRadius
|
|
||||||
)
|
|
||||||
|
|
||||||
anim.duration = 450
|
|
||||||
anim.interpolator = CubicBezierInterpolator.EASE_IN_OUT_QUAD
|
|
||||||
anim.addListener(object : AnimatorListenerAdapter() {
|
|
||||||
override fun onAnimationEnd(animation: Animator) {
|
|
||||||
binding.themeSwitchImage.setImageDrawable(null)
|
|
||||||
binding.themeSwitchImage.hide()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
anim.start()
|
|
||||||
} catch (ignore: Throwable) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun loadAccentsFromAssets(): List<Accent> {
|
|
||||||
val inputStream = requireContext().assets.open("accent.json")
|
|
||||||
val bytes = ByteArray(inputStream.available())
|
val bytes = ByteArray(inputStream.available())
|
||||||
inputStream.read(bytes)
|
inputStream.read(bytes)
|
||||||
inputStream.close()
|
inputStream.close()
|
||||||
|
|||||||
@@ -19,16 +19,9 @@
|
|||||||
|
|
||||||
package com.aurora.store.view.ui.onboarding
|
package com.aurora.store.view.ui.onboarding
|
||||||
|
|
||||||
import android.animation.Animator
|
import android.content.Context
|
||||||
import android.animation.AnimatorListenerAdapter
|
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.Canvas
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewAnimationUtils
|
|
||||||
import com.aurora.extensions.hide
|
|
||||||
import com.aurora.extensions.isVisible
|
|
||||||
import com.aurora.extensions.show
|
|
||||||
import com.aurora.store.R
|
import com.aurora.store.R
|
||||||
import com.aurora.store.data.model.Theme
|
import com.aurora.store.data.model.Theme
|
||||||
import com.aurora.store.databinding.FragmentOnboardingThemeBinding
|
import com.aurora.store.databinding.FragmentOnboardingThemeBinding
|
||||||
@@ -36,12 +29,10 @@ import com.aurora.store.util.Preferences
|
|||||||
import com.aurora.store.util.Preferences.PREFERENCE_THEME_ACCENT
|
import com.aurora.store.util.Preferences.PREFERENCE_THEME_ACCENT
|
||||||
import com.aurora.store.util.Preferences.PREFERENCE_THEME_TYPE
|
import com.aurora.store.util.Preferences.PREFERENCE_THEME_TYPE
|
||||||
import com.aurora.store.util.save
|
import com.aurora.store.util.save
|
||||||
import com.aurora.store.view.custom.CubicBezierInterpolator
|
|
||||||
import com.aurora.store.view.epoxy.views.ThemeViewModel_
|
import com.aurora.store.view.epoxy.views.ThemeViewModel_
|
||||||
import com.aurora.store.view.ui.commons.BaseFragment
|
import com.aurora.store.view.ui.commons.BaseFragment
|
||||||
import com.google.gson.reflect.TypeToken
|
import com.google.gson.reflect.TypeToken
|
||||||
import java.nio.charset.StandardCharsets
|
import java.nio.charset.StandardCharsets
|
||||||
import kotlin.math.sqrt
|
|
||||||
|
|
||||||
|
|
||||||
class ThemeFragment : BaseFragment(R.layout.fragment_onboarding_theme) {
|
class ThemeFragment : BaseFragment(R.layout.fragment_onboarding_theme) {
|
||||||
@@ -56,24 +47,23 @@ class ThemeFragment : BaseFragment(R.layout.fragment_onboarding_theme) {
|
|||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
_binding = FragmentOnboardingThemeBinding.bind(view)
|
_binding = FragmentOnboardingThemeBinding.bind(view)
|
||||||
|
|
||||||
themeId = Preferences.getInteger(requireContext(), PREFERENCE_THEME_TYPE)
|
themeId = Preferences.getInteger(view.context, PREFERENCE_THEME_TYPE)
|
||||||
accentId = Preferences.getInteger(requireContext(), PREFERENCE_THEME_ACCENT)
|
accentId = Preferences.getInteger(view.context, PREFERENCE_THEME_ACCENT)
|
||||||
|
|
||||||
// RecyclerView
|
// RecyclerView
|
||||||
binding.epoxyRecycler.withModels {
|
binding.epoxyRecycler.withModels {
|
||||||
setFilterDuplicates(true)
|
setFilterDuplicates(true)
|
||||||
loadThemesFromAssets().forEach {
|
loadThemesFromAssets(view.context).forEach {
|
||||||
add(
|
add(
|
||||||
ThemeViewModel_()
|
ThemeViewModel_()
|
||||||
.id(it.id)
|
.id(it.id)
|
||||||
.theme(it)
|
.theme(it)
|
||||||
.markChecked(themeId == it.id)
|
.markChecked(themeId == it.id)
|
||||||
.checked { v, checked ->
|
.checked { _, checked ->
|
||||||
if (checked) {
|
if (checked) {
|
||||||
themeId = it.id
|
themeId = it.id
|
||||||
update(themeId)
|
update(themeId)
|
||||||
requestModelBuild()
|
requestModelBuild()
|
||||||
animate(v)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -91,56 +81,8 @@ class ThemeFragment : BaseFragment(R.layout.fragment_onboarding_theme) {
|
|||||||
save(PREFERENCE_THEME_TYPE, themeId)
|
save(PREFERENCE_THEME_TYPE, themeId)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun animate(view: View) {
|
private fun loadThemesFromAssets(context: Context): List<Theme> {
|
||||||
if (binding.themeSwitchImage.isVisible()) {
|
val inputStream = context.assets.open("themes.json")
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
val pos = IntArray(2)
|
|
||||||
view.getLocationInWindow(pos)
|
|
||||||
val w: Int = binding.root.measuredWidth
|
|
||||||
val h: Int = binding.root.measuredHeight
|
|
||||||
|
|
||||||
val bitmap = Bitmap.createBitmap(
|
|
||||||
binding.root.measuredWidth,
|
|
||||||
binding.root.measuredHeight,
|
|
||||||
Bitmap.Config.ARGB_8888
|
|
||||||
)
|
|
||||||
|
|
||||||
val canvas = Canvas(bitmap)
|
|
||||||
binding.root.draw(canvas)
|
|
||||||
binding.themeSwitchImage.setImageBitmap(bitmap)
|
|
||||||
binding.themeSwitchImage.show()
|
|
||||||
|
|
||||||
val finalRadius = sqrt(
|
|
||||||
((w - pos[0]) * (w - pos[0]) + (h - pos[1]) * (h - pos[1])).toDouble()
|
|
||||||
).coerceAtLeast(
|
|
||||||
sqrt((pos[0] * pos[0] + (h - pos[1]) * (h - pos[1])).toDouble())
|
|
||||||
).toFloat()
|
|
||||||
|
|
||||||
val anim: Animator = ViewAnimationUtils.createCircularReveal(
|
|
||||||
binding.root,
|
|
||||||
pos[0],
|
|
||||||
pos[1],
|
|
||||||
0f,
|
|
||||||
finalRadius
|
|
||||||
)
|
|
||||||
|
|
||||||
anim.duration = 450
|
|
||||||
anim.interpolator = CubicBezierInterpolator.EASE_IN_OUT_QUAD
|
|
||||||
anim.addListener(object : AnimatorListenerAdapter() {
|
|
||||||
override fun onAnimationEnd(animation: Animator) {
|
|
||||||
binding.themeSwitchImage.setImageDrawable(null)
|
|
||||||
binding.themeSwitchImage.hide()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
anim.start()
|
|
||||||
} catch (ignore: Throwable) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun loadThemesFromAssets(): List<Theme> {
|
|
||||||
val inputStream = requireContext().assets.open("themes.json")
|
|
||||||
val bytes = ByteArray(inputStream.available())
|
val bytes = ByteArray(inputStream.available())
|
||||||
inputStream.read(bytes)
|
inputStream.read(bytes)
|
||||||
inputStream.close()
|
inputStream.close()
|
||||||
|
|||||||
@@ -73,11 +73,4 @@
|
|||||||
app:itemSpacing="@dimen/margin_small"
|
app:itemSpacing="@dimen/margin_small"
|
||||||
tools:listitem="@layout/view_theme" />
|
tools:listitem="@layout/view_theme" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
</FrameLayout>
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
|
||||||
android:id="@+id/theme_switch_image"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:translationZ="15dp"
|
|
||||||
android:visibility="gone" />
|
|
||||||
</FrameLayout>
|
|
||||||
|
|||||||
@@ -74,11 +74,4 @@
|
|||||||
app:itemSpacing="@dimen/margin_small"
|
app:itemSpacing="@dimen/margin_small"
|
||||||
tools:listitem="@layout/view_theme" />
|
tools:listitem="@layout/view_theme" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
</FrameLayout>
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
|
||||||
android:id="@+id/theme_switch_image"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:translationZ="15dp"
|
|
||||||
android:visibility="gone" />
|
|
||||||
</FrameLayout>
|
|
||||||
|
|||||||
@@ -62,11 +62,4 @@
|
|||||||
app:itemSpacing="@dimen/margin_small"
|
app:itemSpacing="@dimen/margin_small"
|
||||||
tools:listitem="@layout/view_theme" />
|
tools:listitem="@layout/view_theme" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
</FrameLayout>
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
|
||||||
android:id="@+id/theme_switch_image"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:translationZ="15dp"
|
|
||||||
android:visibility="gone" />
|
|
||||||
</FrameLayout>
|
|
||||||
|
|||||||
@@ -64,11 +64,4 @@
|
|||||||
app:itemSpacing="@dimen/margin_small"
|
app:itemSpacing="@dimen/margin_small"
|
||||||
tools:listitem="@layout/view_theme" />
|
tools:listitem="@layout/view_theme" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
</FrameLayout>
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
|
||||||
android:id="@+id/theme_switch_image"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:translationZ="15dp"
|
|
||||||
android:visibility="gone" />
|
|
||||||
</FrameLayout>
|
|
||||||
|
|||||||
Reference in New Issue
Block a user