From e0e7a4cbe050d168711024f210b286358ba15e74 Mon Sep 17 00:00:00 2001 From: denizk0461 Date: Mon, 15 May 2023 14:16:48 +0200 Subject: [PATCH] Implemented drag-and-drop reordering ability in quote recycler view; refactored project structure --- app/src/main/AndroidManifest.xml | 3 +- .../java/com/denizd/textbasic/DriveAgent.kt | 14 ---- .../java/com/denizd/textbasic/TextWidget.kt | 69 ------------------- .../textbasic/{ => activity}/MainActivity.kt | 3 +- .../textbasic/{ => adapter}/QuoteAdapter.kt | 38 +++++++--- .../adapter/RecyclerRowMoveCallback.kt | 55 +++++++++++++++ .../denizd/textbasic/{ => db}/QuoteStorage.kt | 18 ++++- .../textbasic/fragment/QuoteFragment.kt | 7 +- .../textbasic/fragment/SettingsFragment.kt | 7 +- .../com/denizd/textbasic/{ => model}/Quote.kt | 2 +- .../{ => util}/ColorTransparentUtils.kt | 4 +- .../textbasic/{ => view}/VerticalTextView.kt | 2 +- .../com/denizd/textbasic/widget/CanvasText.kt | 2 +- app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/layout/fragment_settings.xml | 10 +-- 15 files changed, 121 insertions(+), 115 deletions(-) delete mode 100644 app/src/main/java/com/denizd/textbasic/DriveAgent.kt delete mode 100644 app/src/main/java/com/denizd/textbasic/TextWidget.kt rename app/src/main/java/com/denizd/textbasic/{ => activity}/MainActivity.kt (97%) rename app/src/main/java/com/denizd/textbasic/{ => adapter}/QuoteAdapter.kt (68%) create mode 100644 app/src/main/java/com/denizd/textbasic/adapter/RecyclerRowMoveCallback.kt rename app/src/main/java/com/denizd/textbasic/{ => db}/QuoteStorage.kt (88%) rename app/src/main/java/com/denizd/textbasic/{ => model}/Quote.kt (77%) rename app/src/main/java/com/denizd/textbasic/{ => util}/ColorTransparentUtils.kt (94%) rename app/src/main/java/com/denizd/textbasic/{ => view}/VerticalTextView.kt (97%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cb56bde..a472de0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,10 +8,9 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" - android:backupAgent=".DriveAgent" android:restoreAnyVersion="true"> diff --git a/app/src/main/java/com/denizd/textbasic/DriveAgent.kt b/app/src/main/java/com/denizd/textbasic/DriveAgent.kt deleted file mode 100644 index f5ffdeb..0000000 --- a/app/src/main/java/com/denizd/textbasic/DriveAgent.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.denizd.textbasic - -import android.app.backup.* - -class DriveAgent : BackupAgentHelper() { - - override fun onCreate() { - super.onCreate() - - SharedPreferencesBackupHelper(this, QuoteStorage.PREF_NAME).also { - addHelper(QuoteStorage.PREF_BACKUP_KEY, it) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/denizd/textbasic/TextWidget.kt b/app/src/main/java/com/denizd/textbasic/TextWidget.kt deleted file mode 100644 index c211bf5..0000000 --- a/app/src/main/java/com/denizd/textbasic/TextWidget.kt +++ /dev/null @@ -1,69 +0,0 @@ -package com.denizd.textbasic - -import android.app.PendingIntent -import android.appwidget.AppWidgetManager -import android.appwidget.AppWidgetProvider -import android.content.Context -import android.content.Intent -import android.util.TypedValue -import android.view.Gravity -import android.widget.RemoteViews - -class TextWidget : AppWidgetProvider() { - - override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { - - val remoteViews = configureViews(context, appWidgetIds) - // Perform this loop procedure for each App Widget that belongs to this provider - appWidgetIds.forEach { appWidgetId -> - // Tell the AppWidgetManager to perform an update on the current app widget - appWidgetManager.updateAppWidget(appWidgetId, remoteViews) - } - } - - private fun configureViews(context: Context, appWidgetIds: IntArray): RemoteViews = - RemoteViews(context.packageName, R.layout.widget_text).apply { - - val storage = QuoteStorage(context) - - val quote = if (storage.isOrderRandom()) { - storage.getRandomQuote() - } else { - storage.getNextQuote() - } - - setTextViewText(R.id.widget_text, quote.ifBlank { context.getString(R.string.info_add_text) }) - setTextViewTextSize(R.id.widget_text, TypedValue.COMPLEX_UNIT_SP, storage.getTextSize().toFloat()) - - val colours = storage.getColours(context = context) - - setTextColor(R.id.widget_text, colours.first) - setInt(R.id.background, "setBackgroundColor", colours.second) - - val gravity = when (storage.getWidgetGravity()) { - 0 -> Gravity.START or Gravity.TOP - 1 -> Gravity.CENTER_HORIZONTAL or Gravity.TOP - 2 -> Gravity.END or Gravity.TOP - 3 -> Gravity.START or Gravity.CENTER_VERTICAL - 4 -> Gravity.CENTER - 5 -> Gravity.END or Gravity.CENTER_VERTICAL - 6 -> Gravity.START or Gravity.BOTTOM - 7 -> Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM - 8 -> Gravity.END or Gravity.BOTTOM - else -> Gravity.CENTER - } - - setInt(R.id.root_layout, "setGravity", gravity) - - setOnClickPendingIntent( - R.id.root_layout, - Intent(context, TextWidget::class.java).let { intent -> - intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds) - PendingIntent.getBroadcast( - context, 0, intent, PendingIntent.FLAG_IMMUTABLE - ) - } - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/denizd/textbasic/MainActivity.kt b/app/src/main/java/com/denizd/textbasic/activity/MainActivity.kt similarity index 97% rename from app/src/main/java/com/denizd/textbasic/MainActivity.kt rename to app/src/main/java/com/denizd/textbasic/activity/MainActivity.kt index 5be5223..cdbac1e 100644 --- a/app/src/main/java/com/denizd/textbasic/MainActivity.kt +++ b/app/src/main/java/com/denizd/textbasic/activity/MainActivity.kt @@ -1,4 +1,4 @@ -package com.denizd.textbasic +package com.denizd.textbasic.activity import android.app.backup.BackupManager import android.appwidget.AppWidgetManager @@ -7,6 +7,7 @@ import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Lifecycle +import com.denizd.textbasic.R import com.denizd.textbasic.databinding.ActivityMainBinding import com.denizd.textbasic.fragment.GuideFragment import com.denizd.textbasic.fragment.QuoteFragment diff --git a/app/src/main/java/com/denizd/textbasic/QuoteAdapter.kt b/app/src/main/java/com/denizd/textbasic/adapter/QuoteAdapter.kt similarity index 68% rename from app/src/main/java/com/denizd/textbasic/QuoteAdapter.kt rename to app/src/main/java/com/denizd/textbasic/adapter/QuoteAdapter.kt index 571582e..9aff9ed 100644 --- a/app/src/main/java/com/denizd/textbasic/QuoteAdapter.kt +++ b/app/src/main/java/com/denizd/textbasic/adapter/QuoteAdapter.kt @@ -1,4 +1,4 @@ -package com.denizd.textbasic +package com.denizd.textbasic.adapter import android.text.Editable import android.text.TextWatcher @@ -8,8 +8,13 @@ import android.view.ViewGroup import android.widget.ImageButton import android.widget.TextView import androidx.recyclerview.widget.RecyclerView +import com.denizd.textbasic.R +import java.util.Collections -class QuoteAdapter(quotes: List) : RecyclerView.Adapter() { +class QuoteAdapter( + quotes: List, +) : RecyclerView.Adapter(), + RecyclerRowMoveCallback.RecyclerViewTouchHelperContract { private var mutableQuotes: MutableList = quotes.toMutableList() @@ -19,9 +24,9 @@ class QuoteAdapter(quotes: List) : RecyclerView.Adapter) : RecyclerView.Adapter) { - this.mutableQuotes = quotes.toMutableList() - notifyDataSetChanged() - } - fun addNewQuote() { mutableQuotes.add("") notifyItemInserted(mutableQuotes.size + 1) @@ -62,4 +62,22 @@ class QuoteAdapter(quotes: List) : RecyclerView.Adapter { return mutableQuotes.filter { s -> s.isNotBlank() }.toTypedArray() } + + override fun onRowMoved(from: Int, to: Int) { + if (from < to) for (i in from until to) { + Collections.swap(mutableQuotes, i, i + 1) + } else for (i in to downTo from - 1) { + Collections.swap(mutableQuotes, i, i - 1) + } + + notifyItemMoved(from, to) + } + + override fun onRowSelected(viewHolder: QuoteViewHolder) { + // TODO + } + + override fun onRowClear(viewHolder: QuoteViewHolder) { + // TODO + } } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/textbasic/adapter/RecyclerRowMoveCallback.kt b/app/src/main/java/com/denizd/textbasic/adapter/RecyclerRowMoveCallback.kt new file mode 100644 index 0000000..380f100 --- /dev/null +++ b/app/src/main/java/com/denizd/textbasic/adapter/RecyclerRowMoveCallback.kt @@ -0,0 +1,55 @@ +package com.denizd.textbasic.adapter + +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView + + +class RecyclerRowMoveCallback( + private val touchHelperContract: RecyclerViewTouchHelperContract, +) : ItemTouchHelper.Callback() { + + override fun isLongPressDragEnabled(): Boolean { + return true + } + + override fun isItemViewSwipeEnabled(): Boolean { + return false + } + + override fun getMovementFlags( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + ): Int = makeMovementFlags(ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0) + + override fun onMove( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder + ): Boolean { + touchHelperContract.onRowMoved(viewHolder.adapterPosition, target.adapterPosition) + return false + } + + override fun onSelectedChanged( + viewHolder: RecyclerView.ViewHolder?, + actionState: Int, + ) { + if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { + touchHelperContract.onRowSelected(viewHolder as QuoteAdapter.QuoteViewHolder) + } + super.onSelectedChanged(viewHolder, actionState) + } + + override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { + super.clearView(recyclerView, viewHolder) + touchHelperContract.onRowClear(viewHolder as QuoteAdapter.QuoteViewHolder) + } + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {} + + interface RecyclerViewTouchHelperContract { + fun onRowMoved(from: Int, to: Int) + fun onRowSelected(viewHolder: QuoteAdapter.QuoteViewHolder) + fun onRowClear(viewHolder: QuoteAdapter.QuoteViewHolder) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/denizd/textbasic/QuoteStorage.kt b/app/src/main/java/com/denizd/textbasic/db/QuoteStorage.kt similarity index 88% rename from app/src/main/java/com/denizd/textbasic/QuoteStorage.kt rename to app/src/main/java/com/denizd/textbasic/db/QuoteStorage.kt index f44efea..59d9291 100644 --- a/app/src/main/java/com/denizd/textbasic/QuoteStorage.kt +++ b/app/src/main/java/com/denizd/textbasic/db/QuoteStorage.kt @@ -1,8 +1,10 @@ -package com.denizd.textbasic +package com.denizd.textbasic.db import android.content.Context import android.graphics.Color import android.graphics.Typeface +import com.denizd.textbasic.util.ColorTransparentUtils +import com.denizd.textbasic.R class QuoteStorage(context: Context) { @@ -82,8 +84,18 @@ class QuoteStorage(context: Context) { } return Pair( - Color.parseColor(ColorTransparentUtils.transparentColor(context.getColor(colours.first), textTransparency * 5)),//Color.parseColor(ColorTransparentUtils.transparentColor(colours.first, 10)), - Color.parseColor(ColorTransparentUtils.transparentColor(context.getColor(colours.second), bgTransparency * 5)) + Color.parseColor( + ColorTransparentUtils.transparentColor( + context.getColor(colours.first), + textTransparency * 5 + ) + ),//Color.parseColor(ColorTransparentUtils.transparentColor(colours.first, 10)), + Color.parseColor( + ColorTransparentUtils.transparentColor( + context.getColor(colours.second), + bgTransparency * 5 + ) + ) ) } diff --git a/app/src/main/java/com/denizd/textbasic/fragment/QuoteFragment.kt b/app/src/main/java/com/denizd/textbasic/fragment/QuoteFragment.kt index 3e5e1fb..f6359fe 100644 --- a/app/src/main/java/com/denizd/textbasic/fragment/QuoteFragment.kt +++ b/app/src/main/java/com/denizd/textbasic/fragment/QuoteFragment.kt @@ -3,11 +3,13 @@ package com.denizd.textbasic.fragment import android.animation.LayoutTransition import android.os.Bundle import android.view.View +import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager -import com.denizd.textbasic.QuoteAdapter -import com.denizd.textbasic.QuoteStorage +import com.denizd.textbasic.adapter.QuoteAdapter +import com.denizd.textbasic.db.QuoteStorage import com.denizd.textbasic.util.viewBinding import com.denizd.textbasic.R +import com.denizd.textbasic.adapter.RecyclerRowMoveCallback import com.denizd.textbasic.databinding.FragmentQuoteBinding import com.google.android.material.transition.MaterialSharedAxis @@ -38,6 +40,7 @@ class QuoteFragment : BaseFragment(R.layout.fragment_quote) { binding.quoteScroller.let { s -> s.layoutManager = LinearLayoutManager(context) + ItemTouchHelper(RecyclerRowMoveCallback(quoteAdapter)).attachToRecyclerView(s) s.adapter = quoteAdapter } diff --git a/app/src/main/java/com/denizd/textbasic/fragment/SettingsFragment.kt b/app/src/main/java/com/denizd/textbasic/fragment/SettingsFragment.kt index 97fece4..912ba7f 100644 --- a/app/src/main/java/com/denizd/textbasic/fragment/SettingsFragment.kt +++ b/app/src/main/java/com/denizd/textbasic/fragment/SettingsFragment.kt @@ -7,8 +7,8 @@ import android.view.View import android.view.ViewGroup import android.widget.* import androidx.annotation.ColorInt -import com.denizd.textbasic.ColorTransparentUtils -import com.denizd.textbasic.QuoteStorage +import com.denizd.textbasic.util.ColorTransparentUtils +import com.denizd.textbasic.db.QuoteStorage import com.denizd.textbasic.R import com.denizd.textbasic.databinding.FragmentSettingsBinding import com.denizd.textbasic.util.viewBinding @@ -248,7 +248,8 @@ class SettingsFragment : BaseFragment(R.layout.fragment_settings) { } binding.textPreviewBackgroundDark.setBackgroundColor( - Color.parseColor(ColorTransparentUtils.transparentColor( + Color.parseColor( + ColorTransparentUtils.transparentColor( context.getColor(R.color.md_theme_dark_background), if (storage.isInvertedEnabled()) { abs((storage.getBackgroundTransparency() * 5)) diff --git a/app/src/main/java/com/denizd/textbasic/Quote.kt b/app/src/main/java/com/denizd/textbasic/model/Quote.kt similarity index 77% rename from app/src/main/java/com/denizd/textbasic/Quote.kt rename to app/src/main/java/com/denizd/textbasic/model/Quote.kt index 492d03e..94ac186 100644 --- a/app/src/main/java/com/denizd/textbasic/Quote.kt +++ b/app/src/main/java/com/denizd/textbasic/model/Quote.kt @@ -1,4 +1,4 @@ -package com.denizd.textbasic +package com.denizd.textbasic.model /** * Stores a single quote. For potential use with a Room database. diff --git a/app/src/main/java/com/denizd/textbasic/ColorTransparentUtils.kt b/app/src/main/java/com/denizd/textbasic/util/ColorTransparentUtils.kt similarity index 94% rename from app/src/main/java/com/denizd/textbasic/ColorTransparentUtils.kt rename to app/src/main/java/com/denizd/textbasic/util/ColorTransparentUtils.kt index 1557aa2..cc75d72 100644 --- a/app/src/main/java/com/denizd/textbasic/ColorTransparentUtils.kt +++ b/app/src/main/java/com/denizd/textbasic/util/ColorTransparentUtils.kt @@ -1,4 +1,4 @@ -package com.denizd.textbasic +package com.denizd.textbasic.util import java.util.* import kotlin.math.roundToInt @@ -14,7 +14,7 @@ object ColorTransparentUtils { /** * This method convert number into hex number or we can say transparent code * - * @param trans number of transparency you want + * @param trans number of transparency you want 🏳️‍⚧️ * @return hex decimal number or transparency code */ fun convert(trans: Int): String { diff --git a/app/src/main/java/com/denizd/textbasic/VerticalTextView.kt b/app/src/main/java/com/denizd/textbasic/view/VerticalTextView.kt similarity index 97% rename from app/src/main/java/com/denizd/textbasic/VerticalTextView.kt rename to app/src/main/java/com/denizd/textbasic/view/VerticalTextView.kt index 79d9add..3b5f260 100644 --- a/app/src/main/java/com/denizd/textbasic/VerticalTextView.kt +++ b/app/src/main/java/com/denizd/textbasic/view/VerticalTextView.kt @@ -1,4 +1,4 @@ -package com.denizd.textbasic +package com.denizd.textbasic.view import android.content.Context import android.graphics.Canvas diff --git a/app/src/main/java/com/denizd/textbasic/widget/CanvasText.kt b/app/src/main/java/com/denizd/textbasic/widget/CanvasText.kt index fd2e801..3fde5b0 100644 --- a/app/src/main/java/com/denizd/textbasic/widget/CanvasText.kt +++ b/app/src/main/java/com/denizd/textbasic/widget/CanvasText.kt @@ -4,7 +4,7 @@ import android.content.Context import android.graphics.* import android.text.StaticLayout import android.text.TextPaint -import com.denizd.textbasic.QuoteStorage +import com.denizd.textbasic.db.QuoteStorage import com.denizd.textbasic.R class CanvasText { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index e4ee742..1c87821 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -7,7 +7,7 @@ android:layout_height="match_parent" android:layout_marginHorizontal="8dp" android:layout_marginVertical="8dp" - tools:context=".MainActivity" + tools:context=".activity.MainActivity" android:orientation="vertical" android:backgroundTint="?attr/colorTintBackground"> diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 2affb28..15308dc 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -25,7 +25,7 @@ android:gravity="center" android:animateLayoutChanges="true"> - - - - -