From c3dda5f5a7db4512bff6174c749f4226e574c0c5 Mon Sep 17 00:00:00 2001 From: ronniedroid Date: Sun, 28 Apr 2024 11:32:35 +0300 Subject: [PATCH] moved MyRecyclerViewListAdapter to MyRecyclerViewAdapter for consistency --- .../fossify/clock/activities/MainActivity.kt | 8 -- .../fossify/clock/adapters/TimerAdapter.kt | 67 +++++----- .../clock/adapters/ViewPagerAdapter.kt | 4 - .../fossify/clock/fragments/TimerFragment.kt | 67 +++------- .../org/fossify/clock/helpers/TimerHelper.kt | 4 +- app/src/main/res/layout/fragment_timer.xml | 39 +++--- app/src/main/res/layout/item_timer.xml | 122 +++++++++--------- 7 files changed, 128 insertions(+), 183 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/clock/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/clock/activities/MainActivity.kt index 1bf8da14..dd656215 100644 --- a/app/src/main/kotlin/org/fossify/clock/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/clock/activities/MainActivity.kt @@ -154,10 +154,6 @@ class MainActivity : SimpleActivity() { if (intent.extras?.containsKey(OPEN_TAB) == true) { val tabToOpen = intent.getIntExtra(OPEN_TAB, TAB_CLOCK) binding.viewPager.setCurrentItem(tabToOpen, false) - if (tabToOpen == TAB_TIMER) { - val timerId = intent.getIntExtra(TIMER_ID, INVALID_TIMER_ID) - (binding.viewPager.adapter as ViewPagerAdapter).updateTimerPosition(timerId) - } if (tabToOpen == TAB_STOPWATCH) { if (intent.getBooleanExtra(TOGGLE_STOPWATCH, false)) { (binding.viewPager.adapter as ViewPagerAdapter).startStopWatch() @@ -205,10 +201,6 @@ class MainActivity : SimpleActivity() { val tabToOpen = intent.getIntExtra(OPEN_TAB, config.lastUsedViewPagerPage) intent.removeExtra(OPEN_TAB) - if (tabToOpen == TAB_TIMER) { - val timerId = intent.getIntExtra(TIMER_ID, INVALID_TIMER_ID) - viewPagerAdapter.updateTimerPosition(timerId) - } if (tabToOpen == TAB_STOPWATCH) { config.toggleStopwatch = intent.getBooleanExtra(TOGGLE_STOPWATCH, false) diff --git a/app/src/main/kotlin/org/fossify/clock/adapters/TimerAdapter.kt b/app/src/main/kotlin/org/fossify/clock/adapters/TimerAdapter.kt index 3c76a798..bbfeb518 100644 --- a/app/src/main/kotlin/org/fossify/clock/adapters/TimerAdapter.kt +++ b/app/src/main/kotlin/org/fossify/clock/adapters/TimerAdapter.kt @@ -3,7 +3,6 @@ package org.fossify.clock.adapters import android.view.Menu import android.view.View import android.view.ViewGroup -import androidx.recyclerview.widget.DiffUtil import me.grantland.widget.AutofitHelper import org.fossify.clock.R import org.fossify.clock.activities.SimpleActivity @@ -14,30 +13,18 @@ import org.fossify.clock.extensions.secondsToMillis import org.fossify.clock.models.Timer import org.fossify.clock.models.TimerEvent import org.fossify.clock.models.TimerState -import org.fossify.commons.adapters.MyRecyclerViewListAdapter +import org.fossify.commons.adapters.MyRecyclerViewAdapter import org.fossify.commons.dialogs.PermissionRequiredDialog import org.fossify.commons.extensions.* import org.fossify.commons.views.MyRecyclerView import org.greenrobot.eventbus.EventBus class TimerAdapter( - private val simpleActivity: SimpleActivity, + activity: SimpleActivity, + var timers: ArrayList, recyclerView: MyRecyclerView, - onRefresh: () -> Unit, - onItemClick: (Timer) -> Unit, -) : MyRecyclerViewListAdapter(simpleActivity, recyclerView, diffUtil, onItemClick, onRefresh) { - - companion object { - private val diffUtil = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: Timer, newItem: Timer): Boolean { - return oldItem.id == newItem.id - } - - override fun areContentsTheSame(oldItem: Timer, newItem: Timer): Boolean { - return oldItem == newItem - } - } - } + itemClick: (Any) -> Unit, +) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) { init { setupDragListener(true) @@ -57,22 +44,13 @@ class TimerAdapter( } } - override fun getSelectableItemCount() = itemCount + override fun getSelectableItemCount() = timers.size override fun getIsItemSelectable(position: Int) = true - override fun getItemSelectionKey(position: Int) = getItem(position).id + override fun getItemSelectionKey(position: Int) = timers.getOrNull(position)?.id - override fun getItemKeyPosition(key: Int): Int { - var position = -1 - for (i in 0 until itemCount) { - if (key == getItem(i).id) { - position = i - break - } - } - return position - } + override fun getItemKeyPosition(key: Int) = timers.indexOfFirst { it.id == key } override fun onActionModeCreated() {} @@ -83,25 +61,38 @@ class TimerAdapter( } override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bindView(getItem(position), true, true) { itemView, _ -> - setupView(itemView, getItem(position)) + val timer = timers[position] + holder.bindView(timer, true, true) { itemView, _ -> + setupView(itemView, timer) } bindViewHolder(holder) } + override fun getItemCount() = timers.size + + fun updateItems(newItems: ArrayList) { + timers = newItems + notifyDataSetChanged() + finishActMode() + } + private fun deleteItems() { + val timersToRemove = ArrayList() val positions = getSelectedItemPositions() - val timersToRemove = positions.map { position -> - getItem(position) + getSelectedItems().forEach { + timersToRemove.add(it) } + timers.removeAll(timersToRemove) removeSelectedItems(positions) timersToRemove.forEach(::deleteTimer) } + private fun getSelectedItems() = timers.filter { selectedKeys.contains(it.id) } as ArrayList + private fun setupView(view: View, timer: Timer) { ItemTimerBinding.bind(view).apply { val isSelected = selectedKeys.contains(timer.id) - timerFrame.isSelected = isSelected + timerHolder.isSelected = isSelected timerLabel.setTextColor(textColor) timerLabel.setHintTextColor(textColor.adjustAlpha(0.7f)) @@ -148,17 +139,17 @@ class TimerAdapter( } else { org.fossify.commons.R.drawable.ic_play_vector } - timerPlayPause.setImageDrawable(simpleActivity.resources.getColoredDrawableWithColor(drawableId, textColor)) + timerPlayPause.setImageDrawable(activity.resources.getColoredDrawableWithColor(drawableId, textColor)) } } private fun resetTimer(timer: Timer) { EventBus.getDefault().post(TimerEvent.Reset(timer.id!!)) - simpleActivity.hideTimerNotification(timer.id!!) + activity.hideTimerNotification(timer.id!!) } private fun deleteTimer(timer: Timer) { EventBus.getDefault().post(TimerEvent.Delete(timer.id!!)) - simpleActivity.hideTimerNotification(timer.id!!) + activity.hideTimerNotification(timer.id!!) } } diff --git a/app/src/main/kotlin/org/fossify/clock/adapters/ViewPagerAdapter.kt b/app/src/main/kotlin/org/fossify/clock/adapters/ViewPagerAdapter.kt index 5aaad6c6..02f2f692 100644 --- a/app/src/main/kotlin/org/fossify/clock/adapters/ViewPagerAdapter.kt +++ b/app/src/main/kotlin/org/fossify/clock/adapters/ViewPagerAdapter.kt @@ -61,10 +61,6 @@ class ViewPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) { (fragments[TAB_TIMER] as? TimerFragment)?.updateAlarmSound(alarmSound) } - fun updateTimerPosition(timerId: Int) { - (fragments[TAB_TIMER] as? TimerFragment)?.updatePosition(timerId) - } - fun startStopWatch() { (fragments[TAB_STOPWATCH] as? StopwatchFragment)?.startStopWatch() } diff --git a/app/src/main/kotlin/org/fossify/clock/fragments/TimerFragment.kt b/app/src/main/kotlin/org/fossify/clock/fragments/TimerFragment.kt index 4f905b22..177bcd40 100644 --- a/app/src/main/kotlin/org/fossify/clock/fragments/TimerFragment.kt +++ b/app/src/main/kotlin/org/fossify/clock/fragments/TimerFragment.kt @@ -15,7 +15,6 @@ import org.fossify.clock.dialogs.EditTimerDialog import org.fossify.clock.extensions.config import org.fossify.clock.extensions.createNewTimer import org.fossify.clock.extensions.timerHelper -import org.fossify.clock.helpers.DisabledItemChangeAnimator import org.fossify.clock.helpers.SORT_BY_TIMER_DURATION import org.fossify.clock.models.Timer import org.fossify.clock.models.TimerEvent @@ -30,10 +29,8 @@ import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode class TimerFragment : Fragment() { - private val INVALID_POSITION = -1 + private var timers = ArrayList() private lateinit var binding: FragmentTimerBinding - private lateinit var timerAdapter: TimerAdapter - private var timerPositionToScrollTo = INVALID_POSITION private var currentEditAlarmDialog: EditTimerDialog? = null override fun onCreate(savedInstanceState: Bundle?) { @@ -48,7 +45,7 @@ class TimerFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { binding = FragmentTimerBinding.inflate(inflater, container, false).apply { - timersList.itemAnimator = DisabledItemChangeAnimator() + requireContext().updateTextColors(timerFragment) timerAdd.setOnClickListener { activity?.run { hideKeyboard() @@ -57,7 +54,6 @@ class TimerFragment : Fragment() { } } - initOrUpdateAdapter() refreshTimers() // the initial timer is created asynchronously at first launch, make sure we show it once created @@ -70,21 +66,8 @@ class TimerFragment : Fragment() { return binding.root } - private fun initOrUpdateAdapter() { - if (this::timerAdapter.isInitialized) { - timerAdapter.updatePrimaryColor() - timerAdapter.updateBackgroundColor(requireContext().getProperBackgroundColor()) - timerAdapter.updateTextColor(requireContext().getProperTextColor()) - } else { - timerAdapter = TimerAdapter(requireActivity() as SimpleActivity, binding.timersList, ::refreshTimers, ::openEditTimer) - binding.timersList.adapter = timerAdapter - } - } - override fun onResume() { super.onResume() - requireContext().updateTextColors(binding.root) - initOrUpdateAdapter() refreshTimers() } @@ -94,22 +77,27 @@ class TimerFragment : Fragment() { } } - private fun refreshTimers(scrollToLatest: Boolean = false) { - activity?.timerHelper?.getTimers { timers -> - var sortedTimers: List = timers + private fun refreshTimers() { + activity?.timerHelper?.getTimers { timersFromDB -> + timers = timersFromDB when (requireContext().config.timerSort) { - SORT_BY_TIMER_DURATION -> sortedTimers = timers.sortedBy { it.seconds } - SORT_BY_DATE_CREATED -> sortedTimers = timers.sortedBy { it.id } + SORT_BY_TIMER_DURATION -> timers.sortBy { it.seconds } + SORT_BY_DATE_CREATED -> timers.sortBy { it.id } } activity?.runOnUiThread { - timerAdapter.submitList(sortedTimers) { - view?.post { - if (timerPositionToScrollTo != INVALID_POSITION && timerAdapter.itemCount > timerPositionToScrollTo) { - binding.timersList.scrollToPosition(timerPositionToScrollTo) - timerPositionToScrollTo = INVALID_POSITION - } else if (scrollToLatest) { - binding.timersList.scrollToPosition(sortedTimers.lastIndex) - } + val currAdapter = binding.timersList.adapter + if (currAdapter == null) { + TimerAdapter(activity as SimpleActivity, timers, binding.timersList) { + openEditTimer(it as Timer) + }.apply { + binding.timersList.adapter = this + } + } else { + (currAdapter as TimerAdapter).apply { + updatePrimaryColor() + updateBackgroundColor(requireContext().getProperBackgroundColor()) + updateTextColor(requireContext().getProperTextColor()) + updateItems(this@TimerFragment.timers) } } } @@ -125,21 +113,6 @@ class TimerFragment : Fragment() { currentEditAlarmDialog?.updateAlarmSound(alarmSound) } - fun updatePosition(timerId: Int) { - activity?.timerHelper?.getTimers { timers -> - val position = timers.indexOfFirst { it.id == timerId } - if (position != INVALID_POSITION) { - activity?.runOnUiThread { - if (timerAdapter.itemCount > position) { - binding.timersList.scrollToPosition(position) - } else { - timerPositionToScrollTo = position - } - } - } - } - } - private fun openEditTimer(timer: Timer) { currentEditAlarmDialog = EditTimerDialog(activity as SimpleActivity, timer) { currentEditAlarmDialog = null diff --git a/app/src/main/kotlin/org/fossify/clock/helpers/TimerHelper.kt b/app/src/main/kotlin/org/fossify/clock/helpers/TimerHelper.kt index de7c4353..5882a739 100644 --- a/app/src/main/kotlin/org/fossify/clock/helpers/TimerHelper.kt +++ b/app/src/main/kotlin/org/fossify/clock/helpers/TimerHelper.kt @@ -8,9 +8,9 @@ import org.fossify.commons.helpers.ensureBackgroundThread class TimerHelper(val context: Context) { private val timerDao = context.timerDb - fun getTimers(callback: (timers: List) -> Unit) { + fun getTimers(callback: (timers: ArrayList) -> Unit) { ensureBackgroundThread { - callback.invoke(timerDao.getTimers()) + callback.invoke(timerDao.getTimers() as ArrayList) } } diff --git a/app/src/main/res/layout/fragment_timer.xml b/app/src/main/res/layout/fragment_timer.xml index 664a8a9a..03efda1b 100644 --- a/app/src/main/res/layout/fragment_timer.xml +++ b/app/src/main/res/layout/fragment_timer.xml @@ -1,24 +1,28 @@ - - + android:layout_height="match_parent"> + + + + + android:src="@drawable/ic_plus_vector" /> - + diff --git a/app/src/main/res/layout/item_timer.xml b/app/src/main/res/layout/item_timer.xml index e2b3c5d5..ccc35afb 100644 --- a/app/src/main/res/layout/item_timer.xml +++ b/app/src/main/res/layout/item_timer.xml @@ -1,77 +1,71 @@ - + android:foreground="@drawable/selector" + android:paddingHorizontal="@dimen/activity_margin" + android:paddingVertical="@dimen/medium_margin"> - + android:includeFontPadding="false" + android:maxLines="1" + android:textSize="@dimen/alarm_text_size" + app:layout_constraintEnd_toStartOf="@id/timer_reset" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:text="00:00" /> - + - + - + - - - - +