From fbce823cb241b8ffd4fdd7d3af4fd540fd9ae27c Mon Sep 17 00:00:00 2001 From: Niko Diamadis Date: Mon, 17 Apr 2023 21:17:16 +0200 Subject: [PATCH] feat: Add optional coordinate frames [#22] --- .../cyb3rko/pincredible/SettingsActivity.kt | 1 + .../fragments/PinCreatorFragment.kt | 8 ++ .../fragments/PinViewerFragment.kt | 11 +++ .../com/cyb3rko/pincredible/utils/Safe.kt | 6 ++ .../views/CoordinateViewManager.kt | 84 ++++++++++++++++++ .../res/drawable/colored_ic_coordinate.xml | 5 ++ app/src/main/res/drawable/ic_coordinate.png | Bin 0 -> 811 bytes .../main/res/layout/fragment_pin_creator.xml | 47 +++++++++- .../main/res/layout/fragment_pin_viewer.xml | 48 +++++++++- app/src/main/res/layout/table_coordinate.xml | 29 ++++++ .../res/layout/table_coordinates_hori.xml | 76 ++++++++++++++++ .../res/layout/table_coordinates_vert.xml | 75 ++++++++++++++++ app/src/main/res/layout/table_view.xml | 3 - app/src/main/res/values-night/colors.xml | 1 + app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/dimens.xml | 2 + app/src/main/res/values/preference_values.xml | 18 ++++ app/src/main/res/values/strings.xml | 4 +- app/src/main/res/xml/preferences.xml | 10 +++ backpack-apps | 2 +- 20 files changed, 420 insertions(+), 11 deletions(-) create mode 100644 app/src/main/kotlin/com/cyb3rko/pincredible/views/CoordinateViewManager.kt create mode 100644 app/src/main/res/drawable/colored_ic_coordinate.xml create mode 100644 app/src/main/res/drawable/ic_coordinate.png create mode 100644 app/src/main/res/layout/table_coordinate.xml create mode 100644 app/src/main/res/layout/table_coordinates_hori.xml create mode 100644 app/src/main/res/layout/table_coordinates_vert.xml create mode 100644 app/src/main/res/values/preference_values.xml diff --git a/app/src/main/kotlin/com/cyb3rko/pincredible/SettingsActivity.kt b/app/src/main/kotlin/com/cyb3rko/pincredible/SettingsActivity.kt index bd4ca74..52b065a 100644 --- a/app/src/main/kotlin/com/cyb3rko/pincredible/SettingsActivity.kt +++ b/app/src/main/kotlin/com/cyb3rko/pincredible/SettingsActivity.kt @@ -38,5 +38,6 @@ internal class SettingsActivity : BackpackSettingsActivity(), BackpackSettings { companion object { const val KEY_BUTTON_RANDOMIZER = "button_randomizer" + const val KEY_COORDINATE_FRAME = "coordinate_frame" } } diff --git a/app/src/main/kotlin/com/cyb3rko/pincredible/fragments/PinCreatorFragment.kt b/app/src/main/kotlin/com/cyb3rko/pincredible/fragments/PinCreatorFragment.kt index 7ebdfa1..c7d3aaa 100644 --- a/app/src/main/kotlin/com/cyb3rko/pincredible/fragments/PinCreatorFragment.kt +++ b/app/src/main/kotlin/com/cyb3rko/pincredible/fragments/PinCreatorFragment.kt @@ -40,6 +40,7 @@ import com.cyb3rko.pincredible.modals.InputDialog import com.cyb3rko.pincredible.utils.BackupHandler import com.cyb3rko.pincredible.utils.ObjectSerializer import com.cyb3rko.pincredible.utils.Safe +import com.cyb3rko.pincredible.views.CoordinateViewManager import java.io.File import java.security.SecureRandom @@ -71,6 +72,13 @@ class PinCreatorFragment : Fragment() { setTableClickListeners() setButtonClickListeners() setFabClickListener() + + CoordinateViewManager.initializeViews( + myContext, + binding.coordinatesRow1, + binding.coordinatesCol1, + binding.coordinatesCol2 + ) } private fun setTableClickListeners() { diff --git a/app/src/main/kotlin/com/cyb3rko/pincredible/fragments/PinViewerFragment.kt b/app/src/main/kotlin/com/cyb3rko/pincredible/fragments/PinViewerFragment.kt index f166f4f..34d9384 100644 --- a/app/src/main/kotlin/com/cyb3rko/pincredible/fragments/PinViewerFragment.kt +++ b/app/src/main/kotlin/com/cyb3rko/pincredible/fragments/PinViewerFragment.kt @@ -40,15 +40,19 @@ import com.cyb3rko.backpack.crypto.CryptoManager import com.cyb3rko.backpack.crypto.CryptoManager.EnDecryptionException import com.cyb3rko.backpack.modals.ErrorDialog import com.cyb3rko.backpack.utils.Vibration +import com.cyb3rko.backpack.utils.show import com.cyb3rko.backpack.utils.withoutLast import com.cyb3rko.pincredible.R +import com.cyb3rko.pincredible.SettingsActivity import com.cyb3rko.pincredible.data.PinTable import com.cyb3rko.pincredible.databinding.FragmentPinViewerBinding import com.cyb3rko.pincredible.modals.AcceptDialog import com.cyb3rko.pincredible.utils.BackupHandler import com.cyb3rko.pincredible.utils.BackupHandler.SingleBackupStructure import com.cyb3rko.pincredible.utils.ObjectSerializer +import com.cyb3rko.pincredible.utils.Safe import com.cyb3rko.pincredible.utils.TableScreenshotHandler +import com.cyb3rko.pincredible.views.CoordinateViewManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -115,6 +119,13 @@ class PinViewerFragment : Fragment() { binding.hashView.text = getString(R.string.viewer_hash, hash.take(10)) binding.pinNameView.text = args.pin + CoordinateViewManager.initializeViews( + myContext, + binding.coordinatesRow1, + binding.coordinatesCol1, + binding.coordinatesCol2 + ) + lifecycleScope.launch { loadDataIntoTable() } diff --git a/app/src/main/kotlin/com/cyb3rko/pincredible/utils/Safe.kt b/app/src/main/kotlin/com/cyb3rko/pincredible/utils/Safe.kt index cb0f7bc..fa1be12 100644 --- a/app/src/main/kotlin/com/cyb3rko/pincredible/utils/Safe.kt +++ b/app/src/main/kotlin/com/cyb3rko/pincredible/utils/Safe.kt @@ -25,4 +25,10 @@ internal object Safe { key: String, default: Boolean ) = PreferenceManager.getDefaultSharedPreferences(context).getBoolean(key, default) + + internal fun getString( + context: Context, + key: String, + default: String + ) = PreferenceManager.getDefaultSharedPreferences(context).getString(key, default) } diff --git a/app/src/main/kotlin/com/cyb3rko/pincredible/views/CoordinateViewManager.kt b/app/src/main/kotlin/com/cyb3rko/pincredible/views/CoordinateViewManager.kt new file mode 100644 index 0000000..d67e246 --- /dev/null +++ b/app/src/main/kotlin/com/cyb3rko/pincredible/views/CoordinateViewManager.kt @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2023 Cyb3rKo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyb3rko.pincredible.views + +import android.content.Context +import android.widget.LinearLayout +import androidx.core.view.children +import com.cyb3rko.backpack.utils.show +import com.cyb3rko.pincredible.SettingsActivity +import com.cyb3rko.pincredible.databinding.TableCoordinatesHoriBinding +import com.cyb3rko.pincredible.databinding.TableCoordinatesVertBinding +import com.cyb3rko.pincredible.utils.Safe +import com.google.android.material.textview.MaterialTextView + +internal object CoordinateViewManager { + private enum class Orientation { + HORIZONTAL, VERTICAL; + } + private enum class Frame(val pattern: String) { + INDEX("12345671234567"), + CHESS("ABCDEFG7654321"), + CHESS_REVERSE_INDEX("ABCDEFG1234567") + } + + fun initializeViews( + context: Context, + row: TableCoordinatesHoriBinding, + col1: TableCoordinatesVertBinding, + col2: TableCoordinatesVertBinding + ) { + if (Safe.getString(context, SettingsActivity.KEY_COORDINATE_FRAME, "-1") != "-1") { + fillView(context, row) + fillView(context, col1) + fillView(context, col2) + row.root.show() + col1.root.show() + col2.root.show() + } + } + + private fun fillView(context: Context, view: TableCoordinatesHoriBinding) { + lowerFillView(context, view.root, Orientation.HORIZONTAL) + } + + private fun fillView(context: Context, view: TableCoordinatesVertBinding) { + lowerFillView(context, view.root, Orientation.VERTICAL) + } + + private fun lowerFillView( + context: Context, + view: LinearLayout, + orientation: Orientation + ) { + val setting = Safe.getString(context, SettingsActivity.KEY_COORDINATE_FRAME, "-1")!! + val frame = when (setting.toInt()) { + 0 -> Frame.INDEX + 1 -> Frame.CHESS + 2 -> Frame.CHESS_REVERSE_INDEX + else -> Frame.INDEX // shouldn't happen + }.pattern + + view.children.forEachIndexed { index, textView -> + (textView as MaterialTextView).text = if (orientation == Orientation.HORIZONTAL) { + "${frame[index]}" + } else { + "${frame[index + 7]}" + } + } + } +} diff --git a/app/src/main/res/drawable/colored_ic_coordinate.xml b/app/src/main/res/drawable/colored_ic_coordinate.xml new file mode 100644 index 0000000..8f66cba --- /dev/null +++ b/app/src/main/res/drawable/colored_ic_coordinate.xml @@ -0,0 +1,5 @@ + + diff --git a/app/src/main/res/drawable/ic_coordinate.png b/app/src/main/res/drawable/ic_coordinate.png new file mode 100644 index 0000000000000000000000000000000000000000..d9c900324eda838b6684c91bcad5e8898abac2e7 GIT binary patch literal 811 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&RRs8ixB}?`0iq{7I)E0dmjw9* zGlZPDn|9}nv;8lAac{PFv4-kN{=3{>TwO8MQjufx{4YJl*7NRflDrhJTh741WbNtV z7*cWT?X25ns|-Y3l@k;>AI7au(BGE+_rJW{=GPlUZ%?1l=W%?VfA@mJFI#gxwk1fk zC4$k;WVy*pEdhiRA^e$y-XgZ?Umd~*~NTH+ahZtyndZwlNL5_ zoPH+Y&T=u|$iQ{18#h;epO|g6P$Tt@Q1D83koY{_1)|J&?Kp(`;RSm zdY{{`!yDy!m&R(>b(`+G=)w17@j|}rkI_1Uy>4O$l1xMrHUCTq-N&-Z$6|uhyT2T7 zRD-rVP5CK!qM?N~;(+6VNv+?M7jQ>%vTykm%05Nx-Imusnp%3+M>1-2+1q5??OItf z!$p1BBsYF>m3eaOIvXoYzOekP6j*vl_VN4kCpg$&DTURsT!{{}<}k5)?O=S|=?K$7 z)~E&FlmnP|7A!bZd$n=Toabw1usU(CID2jSfwILhdQ1t=-4ocSylY)?UR*pZLT_Cq z+dOw??=^P(pX!QKZ4!jqFEAb7?66_|fjO+tekk+QNwVp?=m^9ec-@lH7rg1gS+mltLNSR^jALJ}c+F#@KWl#QnXk{^ z{{HO4jD0uv{g-}`@uF4ym*S=3oFvYB$0k2GQgHdimuJ^bm>dsVr++r*<@K~}$DaLZ qPuuov+f3hJW9h>NJYaO@? - + android:layout_height="wrap_content" + android:layout_marginEnd="21dp" + android:layout_marginStart="21dp" + android:visibility="gone" + tools:visibility="visible" /> + + + + + + + + + + - + android:layout_height="wrap_content" + android:layout_marginEnd="21dp" + android:layout_marginStart="21dp" + android:visibility="gone" + tools:visibility="visible" /> + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/table_coordinates_hori.xml b/app/src/main/res/layout/table_coordinates_hori.xml new file mode 100644 index 0000000..d44330a --- /dev/null +++ b/app/src/main/res/layout/table_coordinates_hori.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/table_coordinates_vert.xml b/app/src/main/res/layout/table_coordinates_vert.xml new file mode 100644 index 0000000..9968f22 --- /dev/null +++ b/app/src/main/res/layout/table_coordinates_vert.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/table_view.xml b/app/src/main/res/layout/table_view.xml index 52096ae..919a263 100644 --- a/app/src/main/res/layout/table_view.xml +++ b/app/src/main/res/layout/table_view.xml @@ -21,9 +21,6 @@ android:id="@+id/table" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginEnd="24dp" - android:layout_marginStart="24dp" - android:layout_marginTop="16dp" android:stretchColumns="*"> @color/white + @color/white \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 2543c0a..ebc0cfc 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -10,5 +10,6 @@ #ffa500 #ff0e00 #F0FF00 + @color/gray \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 1ac3a45..08cbeae 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -5,6 +5,8 @@ 45dp @dimen/table_cell_height 20sp + 10sp + 20dp 2dp 2dp 24dp diff --git a/app/src/main/res/values/preference_values.xml b/app/src/main/res/values/preference_values.xml new file mode 100644 index 0000000..24e069a --- /dev/null +++ b/app/src/main/res/values/preference_values.xml @@ -0,0 +1,18 @@ + + + + + None + Row / Column index + Chess-like + Chess-like (reverse index) + + + + -1 + 0 + 1 + 2 + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dd99feb..66816bb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,7 +21,7 @@ Copy to clipboard - Touch Id icon created by Vectors Tank - Flaticon\n\nPalm Scanner created by juicy_fish - Flaticon\n\nRandom icon created by Uniconlabs + Touch Id icon created by Vectors Tank - Flaticon\n\nPalm Scanner created by juicy_fish - Flaticon\n\nRandom icon created by Uniconlabs - Flaticon\n\nGrid icons created by prettycons - Flaticon Icon Credits Yes No @@ -66,6 +66,8 @@ Material You (adaptive colors) Use adaptive system colors over brand colors Not supported by your Android version + Coordinate Frame + Show a frame around tables Restart required The change will be visible on next app start.\n\nDo you want to restart now? Later diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index b5468f3..8e66a53 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -35,6 +35,16 @@ app:summary="@string/preference_item_material_you_summary" app:icon="@drawable/colored_ic_art" /> + + diff --git a/backpack-apps b/backpack-apps index 998ab50..edddb85 160000 --- a/backpack-apps +++ b/backpack-apps @@ -1 +1 @@ -Subproject commit 998ab50bdd0edf8556170fd635a413e6a7e9e5be +Subproject commit edddb85e262e42cd9b9e7ebf7679a314b4b72ba6