From 523ee1e2a9bd6dcb8ab9b27169720061d19a8818 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 1 Aug 2022 11:18:34 +0300 Subject: [PATCH] Update storage usage indicator --- .../base/ui/widgets/SegmentedBarView.kt | 58 +++++++++++++++---- .../kotatsu/library/ui/LibraryFragment.kt | 7 +++ .../kotatsu/settings/SettingsActivity.kt | 6 ++ .../kotatsu/settings/tools/ToolsFragment.kt | 4 +- .../main/res/layout/layout_memory_usage.xml | 38 +++++++++--- 5 files changed, 92 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/SegmentedBarView.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/SegmentedBarView.kt index 0a4a89d98..aed43d75b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/SegmentedBarView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/SegmentedBarView.kt @@ -10,9 +10,11 @@ import android.view.ViewOutlineProvider import androidx.annotation.ColorInt import androidx.annotation.FloatRange import androidx.core.graphics.ColorUtils -import org.koitharu.kotatsu.parsers.util.replaceWith -import org.koitharu.kotatsu.utils.ext.resolveDp +import com.google.android.material.R as materialR import kotlin.random.Random +import org.koitharu.kotatsu.parsers.util.replaceWith +import org.koitharu.kotatsu.utils.ext.getThemeColor +import org.koitharu.kotatsu.utils.ext.resolveDp class SegmentedBarView @JvmOverloads constructor( context: Context, @@ -22,17 +24,20 @@ class SegmentedBarView @JvmOverloads constructor( private val paint = Paint(Paint.ANTI_ALIAS_FLAG) private val segmentsData = ArrayList() - private val minSegmentSize = context.resources.resolveDp(3f) + private val segmentsSizes = ArrayList() + private val outlineColor = context.getThemeColor(materialR.attr.colorOutline) + private var cornerSize = 0f var segments: List get() = segmentsData set(value) { segmentsData.replaceWith(value) + updateSizes() invalidate() } init { - paint.style = Paint.Style.FILL + paint.strokeWidth = context.resources.resolveDp(1f) outlineProvider = OutlineProvider() clipToOutline = true @@ -46,15 +51,44 @@ class SegmentedBarView @JvmOverloads constructor( } } + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + cornerSize = h / 2f + updateSizes() + } + override fun onDraw(canvas: Canvas) { - var x = 0f - val w = width.toFloat() - for (segment in segmentsData) { - paint.color = segment.color - val segmentWidth = (w * segment.percent).coerceAtLeast(minSegmentSize) - canvas.drawRect(x, 0f, x + segmentWidth, height.toFloat(), paint) - x += segmentWidth + if (segmentsSizes.isEmpty()) { + return } + val w = width.toFloat() + var x = w - segmentsSizes.last() + for (i in (0 until segmentsData.size).reversed()) { + val segment = segmentsData[i] + paint.color = segment.color + paint.style = Paint.Style.FILL + val segmentWidth = segmentsSizes[i] + canvas.drawRoundRect(0f, 0f, x + cornerSize, height.toFloat(), cornerSize, cornerSize, paint) + paint.color = outlineColor + paint.style = Paint.Style.STROKE + canvas.drawRoundRect(0f, 0f, x + cornerSize, height.toFloat(), cornerSize, cornerSize, paint) + x -= segmentWidth + } + paint.color = outlineColor + paint.style = Paint.Style.STROKE + canvas.drawRoundRect(0f, 0f, w, height.toFloat(), cornerSize, cornerSize, paint) + } + + private fun updateSizes() { + segmentsSizes.clear() + segmentsSizes.ensureCapacity(segmentsData.size + 1) + var w = width.toFloat() + for (segment in segmentsData) { + val segmentWidth = (w * segment.percent).coerceAtLeast(cornerSize) + segmentsSizes.add(segmentWidth) + w -= segmentWidth + } + segmentsSizes.add(w) } class Segment( @@ -86,4 +120,4 @@ class SegmentedBarView @JvmOverloads constructor( outline.setRoundRect(0, 0, view.width, view.height, view.height / 2f) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt b/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt index a898076fb..2068db53b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt @@ -4,9 +4,11 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.content.ContextCompat.startActivity import androidx.core.graphics.Insets import androidx.core.view.updatePadding import androidx.fragment.app.viewModels +import androidx.recyclerview.widget.RecyclerView import coil.ImageLoader import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint @@ -15,6 +17,7 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.domain.reverseAsync import org.koitharu.kotatsu.base.ui.BaseFragment import org.koitharu.kotatsu.base.ui.list.SectionedSelectionController +import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner import org.koitharu.kotatsu.base.ui.util.ReversibleAction import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.databinding.FragmentLibraryBinding @@ -34,6 +37,7 @@ import org.koitharu.kotatsu.utils.ext.getDisplayMessage @AndroidEntryPoint class LibraryFragment : BaseFragment(), + RecyclerViewOwner, LibraryListEventListener { @Inject @@ -46,6 +50,9 @@ class LibraryFragment : private var adapter: LibraryAdapter? = null private var selectionController: SectionedSelectionController? = null + override val recyclerView: RecyclerView + get() = binding.recyclerView + override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): FragmentLibraryBinding { return FragmentLibraryBinding.inflate(inflater, container, false) } diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt index 93e2eb6a8..e1894cf4f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt @@ -126,6 +126,7 @@ class SettingsActivity : ACTION_READER -> ReaderSettingsFragment() ACTION_SUGGESTIONS -> SuggestionsSettingsFragment() ACTION_SHIKIMORI -> ShikimoriSettingsFragment() + ACTION_HISTORY -> HistorySettingsFragment() ACTION_TRACKER -> TrackerSettingsFragment() ACTION_SOURCE -> SourceSettingsFragment.newInstance( intent.getSerializableExtra(EXTRA_SOURCE) as? MangaSource ?: MangaSource.LOCAL, @@ -153,6 +154,7 @@ class SettingsActivity : private const val ACTION_READER = "${BuildConfig.APPLICATION_ID}.action.MANAGE_READER_SETTINGS" private const val ACTION_SUGGESTIONS = "${BuildConfig.APPLICATION_ID}.action.MANAGE_SUGGESTIONS" private const val ACTION_TRACKER = "${BuildConfig.APPLICATION_ID}.action.MANAGE_TRACKER" + private const val ACTION_HISTORY = "${BuildConfig.APPLICATION_ID}.action.MANAGE_HISTORY" private const val ACTION_SOURCE = "${BuildConfig.APPLICATION_ID}.action.MANAGE_SOURCE_SETTINGS" private const val ACTION_SHIKIMORI = "${BuildConfig.APPLICATION_ID}.action.MANAGE_SHIKIMORI_SETTINGS" private const val ACTION_MANAGE_SOURCES = "${BuildConfig.APPLICATION_ID}.action.MANAGE_SOURCES_LIST" @@ -178,6 +180,10 @@ class SettingsActivity : Intent(context, SettingsActivity::class.java) .setAction(ACTION_TRACKER) + fun newHistorySettingsIntent(context: Context) = + Intent(context, SettingsActivity::class.java) + .setAction(ACTION_HISTORY) + fun newManageSourcesIntent(context: Context) = Intent(context, SettingsActivity::class.java) .setAction(ACTION_MANAGE_SOURCES) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/tools/ToolsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/tools/ToolsFragment.kt index a1b38b0ef..215468571 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/tools/ToolsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/tools/ToolsFragment.kt @@ -60,6 +60,7 @@ class ToolsFragment : override fun onClick(v: View) { when (v.id) { R.id.button_settings -> startActivity(SettingsActivity.newIntent(v.context)) + R.id.button_manage -> startActivity(SettingsActivity.newHistorySettingsIntent(v.context)) R.id.button_downloads -> startActivity(DownloadsActivity.newIntent(v.context)) R.id.button_download -> { val url = viewModel.appUpdate.value?.apkUrl ?: return @@ -98,6 +99,7 @@ class ToolsFragment : val otherSegment = SegmentedBarView.Segment(usage.otherCache.percent, segmentColor(3)) with(binding.layoutStorage) { + buttonManage.setOnClickListener(this@ToolsFragment) bar.segments = listOf(storageSegment, pagesSegment, otherSegment) val pattern = getString(R.string.memory_usage_pattern) labelStorage.text = pattern.format( @@ -131,7 +133,7 @@ class ToolsFragment : @ColorInt private fun segmentColor(i: Int): Int { val hue = (93.6f * i) % 360 - val color = ColorUtils.HSLToColor(floatArrayOf(hue, 0.5f, 0.5f)) + val color = ColorUtils.HSLToColor(floatArrayOf(hue, 0.4f, 0.6f)) val backgroundColor = requireContext().getThemeColor(materialR.attr.colorSecondaryContainer) return MaterialColors.harmonize(color, backgroundColor) } diff --git a/app/src/main/res/layout/layout_memory_usage.xml b/app/src/main/res/layout/layout_memory_usage.xml index 9abe8d7f1..e7de6e682 100644 --- a/app/src/main/res/layout/layout_memory_usage.xml +++ b/app/src/main/res/layout/layout_memory_usage.xml @@ -6,19 +6,36 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:padding="@dimen/screen_padding"> + android:paddingStart="@dimen/screen_padding" + android:paddingTop="@dimen/margin_small" + android:paddingBottom="@dimen/screen_padding" + tools:ignore="RtlSymmetry"> - + android:layout_height="wrap_content"> + + + +