From bea7f78225d51d4eeaac0e5d2e98bda591c1eff2 Mon Sep 17 00:00:00 2001 From: AkaneTan Date: Mon, 7 Oct 2024 03:24:57 +0800 Subject: [PATCH] Omni: Update to 1.2 Signed-off-by: AkaneTan --- .idea/misc.xml | 1 - app/build.gradle.kts | 4 +- .../java/uk/akane/omni/logic/Extensions.kt | 24 +- .../omni/logic/services/CompassTileService.kt | 150 ++++++++++ .../java/uk/akane/omni/ui/MainActivity.kt | 26 ++ .../akane/omni/ui/components/CompassView.kt | 12 +- .../uk/akane/omni/ui/components/RulerView.kt | 85 ++++++ .../akane/omni/ui/components/RulerViewInch.kt | 90 ++++++ .../omni/ui/components/SpiritLevelView.kt | 241 ++++++++++++++++ .../omni/ui/components/SwitchBottomSheet.kt | 113 ++++++++ .../akane/omni/ui/fragments/BaseFragment.kt | 10 +- .../ui/fragments/BasePreferenceFragment.kt | 13 +- .../omni/ui/fragments/BaseSettingFragment.kt | 8 +- .../omni/ui/fragments/CompassFragment.kt | 149 ++++++++-- .../omni/ui/fragments/FlashlightFragment.kt | 271 ++++++++++++++++++ .../akane/omni/ui/fragments/LevelFragment.kt | 160 +++++++++++ .../akane/omni/ui/fragments/RulerFragment.kt | 68 +++++ .../settings/MainSettingsFragment.kt | 21 +- .../akane/omni/ui/viewmodels/OmniViewModel.kt | 6 + app/src/main/res/color/mtrl_btn_bg.xml | 5 + app/src/main/res/color/mtrl_btn_icon.xml | 5 + app/src/main/res/drawable/ic_barometer.xml | 13 + .../res/drawable/ic_coordinate_format.xml | 12 + app/src/main/res/drawable/ic_directions.xml | 9 + app/src/main/res/drawable/ic_explorer.xml | 2 +- .../main/res/drawable/ic_flashlight_on.xml | 10 + .../main/res/drawable/ic_notifications.xml | 10 + app/src/main/res/drawable/ic_omni.xml | 17 ++ app/src/main/res/drawable/ic_pointer.xml | 9 + app/src/main/res/drawable/ic_polygon_left.xml | 9 + .../main/res/drawable/ic_polygon_right.xml | 9 + app/src/main/res/drawable/ic_ruler.xml | 10 + app/src/main/res/drawable/ic_straighten.xml | 13 + app/src/main/res/drawable/ic_true_north.xml | 12 + app/src/main/res/drawable/ic_vibration.xml | 13 + app/src/main/res/drawable/ruler_left.xml | 19 ++ app/src/main/res/drawable/ruler_right.xml | 19 ++ app/src/main/res/drawable/shape_pref_down.xml | 19 ++ app/src/main/res/drawable/shape_pref_mid.xml | 19 ++ .../main/res/drawable/shape_pref_single.xml | 19 ++ app/src/main/res/drawable/shape_pref_up.xml | 19 ++ app/src/main/res/font/hankengrotesk.ttf | Bin 129508 -> 0 bytes app/src/main/res/font/hankengrotesk.xml | 11 + app/src/main/res/font/hg.ttf | Bin 0 -> 66580 bytes app/src/main/res/font/hgm.ttf | Bin 0 -> 66580 bytes .../main/res/layout-land/fragment_compass.xml | 9 +- app/src/main/res/layout/fragment_compass.xml | 12 +- .../main/res/layout/fragment_flashlight.xml | 85 ++++++ app/src/main/res/layout/fragment_ruler.xml | 173 +++++++++++ .../main/res/layout/fragment_spirit_level.xml | 63 ++++ .../main/res/layout/fragment_top_settings.xml | 61 ++-- .../main/res/layout/preference_basic_down.xml | 67 +++++ .../main/res/layout/preference_basic_mid.xml | 66 +++++ .../res/layout/preference_basic_single.xml | 65 +++++ .../main/res/layout/preference_basic_top.xml | 66 +++++ app/src/main/res/layout/preference_cate.xml | 22 ++ .../res/layout/preference_switch_widget.xml | 9 + .../main/res/layout/switch_bottom_sheet.xml | 121 ++++++++ app/src/main/res/values-zh-rCN/strings.xml | 30 +- app/src/main/res/values/dimens.xml | 1 + app/src/main/res/values/strings.xml | 34 ++- app/src/main/res/values/themes.xml | 9 +- app/src/main/res/xml/locales_config.xml | 5 + app/src/main/res/xml/settings_top.xml | 99 ++++--- app/src/main/res/xml/shortcuts.xml | 63 ++++ 65 files changed, 2599 insertions(+), 196 deletions(-) create mode 100644 app/src/main/java/uk/akane/omni/logic/services/CompassTileService.kt create mode 100644 app/src/main/java/uk/akane/omni/ui/components/RulerView.kt create mode 100644 app/src/main/java/uk/akane/omni/ui/components/RulerViewInch.kt create mode 100644 app/src/main/java/uk/akane/omni/ui/components/SpiritLevelView.kt create mode 100644 app/src/main/java/uk/akane/omni/ui/components/SwitchBottomSheet.kt create mode 100644 app/src/main/java/uk/akane/omni/ui/fragments/FlashlightFragment.kt create mode 100644 app/src/main/java/uk/akane/omni/ui/fragments/LevelFragment.kt create mode 100644 app/src/main/java/uk/akane/omni/ui/fragments/RulerFragment.kt create mode 100644 app/src/main/res/color/mtrl_btn_bg.xml create mode 100644 app/src/main/res/color/mtrl_btn_icon.xml create mode 100644 app/src/main/res/drawable/ic_barometer.xml create mode 100644 app/src/main/res/drawable/ic_coordinate_format.xml create mode 100644 app/src/main/res/drawable/ic_directions.xml create mode 100644 app/src/main/res/drawable/ic_flashlight_on.xml create mode 100644 app/src/main/res/drawable/ic_notifications.xml create mode 100644 app/src/main/res/drawable/ic_omni.xml create mode 100644 app/src/main/res/drawable/ic_pointer.xml create mode 100644 app/src/main/res/drawable/ic_polygon_left.xml create mode 100644 app/src/main/res/drawable/ic_polygon_right.xml create mode 100644 app/src/main/res/drawable/ic_ruler.xml create mode 100644 app/src/main/res/drawable/ic_straighten.xml create mode 100644 app/src/main/res/drawable/ic_true_north.xml create mode 100644 app/src/main/res/drawable/ic_vibration.xml create mode 100644 app/src/main/res/drawable/ruler_left.xml create mode 100644 app/src/main/res/drawable/ruler_right.xml create mode 100644 app/src/main/res/drawable/shape_pref_down.xml create mode 100644 app/src/main/res/drawable/shape_pref_mid.xml create mode 100644 app/src/main/res/drawable/shape_pref_single.xml create mode 100644 app/src/main/res/drawable/shape_pref_up.xml delete mode 100644 app/src/main/res/font/hankengrotesk.ttf create mode 100644 app/src/main/res/font/hankengrotesk.xml create mode 100644 app/src/main/res/font/hg.ttf create mode 100644 app/src/main/res/font/hgm.ttf create mode 100644 app/src/main/res/layout/fragment_flashlight.xml create mode 100644 app/src/main/res/layout/fragment_ruler.xml create mode 100644 app/src/main/res/layout/fragment_spirit_level.xml create mode 100644 app/src/main/res/layout/preference_basic_down.xml create mode 100644 app/src/main/res/layout/preference_basic_mid.xml create mode 100644 app/src/main/res/layout/preference_basic_single.xml create mode 100644 app/src/main/res/layout/preference_basic_top.xml create mode 100644 app/src/main/res/layout/preference_cate.xml create mode 100644 app/src/main/res/layout/preference_switch_widget.xml create mode 100644 app/src/main/res/layout/switch_bottom_sheet.xml create mode 100644 app/src/main/res/xml/locales_config.xml create mode 100644 app/src/main/res/xml/shortcuts.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 195b12d..52a5b8f 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6edfe79..8e8ff11 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -21,8 +21,8 @@ android { applicationId = "uk.akane.omni" minSdk = 26 targetSdk = 34 - versionCode = 2 - versionName = "1.1" + versionCode = 3 + versionName = "1.2" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/uk/akane/omni/logic/Extensions.kt b/app/src/main/java/uk/akane/omni/logic/Extensions.kt index ba2035e..69fb2dd 100644 --- a/app/src/main/java/uk/akane/omni/logic/Extensions.kt +++ b/app/src/main/java/uk/akane/omni/logic/Extensions.kt @@ -7,8 +7,6 @@ import android.content.res.Configuration import android.graphics.Color import android.hardware.SensorManager import androidx.core.graphics.Insets -import android.os.Looper -import android.os.StrictMode import android.view.View import android.widget.TextView import androidx.activity.ComponentActivity @@ -20,7 +18,6 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.children import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.CollapsingToolbarLayout -import uk.akane.omni.BuildConfig @Suppress("NOTHING_TO_INLINE") inline fun Context.doIHavePermission(perm: String) = @@ -106,21 +103,6 @@ fun SensorManager.checkSensorAvailability(sensorType: Int): Boolean { return getDefaultSensor(sensorType) != null } -// the whole point of this function is to do literally nothing at all (but without impacting -// performance) in release builds and ignore StrictMode violations in debug builds -inline fun allowDiskAccessInStrictMode(doIt: () -> T): T { - return if (BuildConfig.DEBUG) { - if (Looper.getMainLooper() != Looper.myLooper()) throw IllegalStateException() - val policy = StrictMode.allowThreadDiskReads() - try { - StrictMode.allowThreadDiskWrites() - doIt() - } finally { - StrictMode.setThreadPolicy(policy) - } - } else doIt() -} - fun View.enableEdgeToEdgePaddingListener(ime: Boolean = false, top: Boolean = false, extra: ((Insets) -> Unit)? = null) { if (fitsSystemWindows) throw IllegalArgumentException("must have fitsSystemWindows disabled") @@ -186,4 +168,8 @@ fun View.enableEdgeToEdgePaddingListener(ime: Boolean = false, top: Boolean = fa @Suppress("NOTHING_TO_INLINE") inline fun Int.dpToPx(context: Context): Int = - (this.toFloat() * context.resources.displayMetrics.density).toInt() \ No newline at end of file + (this.toFloat() * context.resources.displayMetrics.density).toInt() + +@Suppress("NOTHING_TO_INLINE") +inline fun Float.dpToPx(context: Context): Float = + (this * context.resources.displayMetrics.density) \ No newline at end of file diff --git a/app/src/main/java/uk/akane/omni/logic/services/CompassTileService.kt b/app/src/main/java/uk/akane/omni/logic/services/CompassTileService.kt new file mode 100644 index 0000000..5211364 --- /dev/null +++ b/app/src/main/java/uk/akane/omni/logic/services/CompassTileService.kt @@ -0,0 +1,150 @@ +package uk.akane.omni.logic.services + +import android.annotation.SuppressLint +import android.app.NotificationChannel +import android.app.NotificationManager +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.PorterDuff +import android.graphics.drawable.Drawable +import android.graphics.drawable.Icon +import android.hardware.Sensor +import android.hardware.SensorEvent +import android.hardware.SensorEventListener +import android.hardware.SensorManager +import android.service.quicksettings.Tile +import android.service.quicksettings.TileService +import android.util.Log +import android.view.Surface +import androidx.appcompat.content.res.AppCompatResources +import androidx.core.app.NotificationCompat +import androidx.core.content.ContextCompat +import androidx.core.content.getSystemService +import uk.akane.omni.R +import kotlin.math.absoluteValue + +class CompassTileService : TileService(), SensorEventListener { + + private val sensorManager + get() = getSystemService() + private val rotationVectorSensor + get() = sensorManager?.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR) + private val notificationManager + get() = getSystemService() + private lateinit var rotationIcon: Drawable + private lateinit var iconBitmap: Bitmap + + + companion object { + const val CHANNEL_ID = "COMPASS_CHANNEL" + const val NOTIFICATION_ID = 1 + } + + override fun onCreate() { + super.onCreate() + notificationManager?.createNotificationChannel( + NotificationChannel( + CHANNEL_ID, + getString(R.string.compass_tile_notification_channel), + NotificationManager.IMPORTANCE_LOW + ) + ) + rotationIcon = AppCompatResources.getDrawable(this, R.drawable.ic_pointer)!! + iconBitmap = Bitmap.createBitmap( + rotationIcon.intrinsicWidth, rotationIcon.intrinsicHeight, + Bitmap.Config.ARGB_8888 + ) + } + + override fun onClick() { + super.onClick() + Log.d("TAG", "onClick") + qsTile.state = when (qsTile.state) { + Tile.STATE_ACTIVE -> Tile.STATE_INACTIVE + Tile.STATE_INACTIVE -> Tile.STATE_ACTIVE + else -> Tile.STATE_INACTIVE + } + if (qsTile.state == Tile.STATE_INACTIVE) { + qsTile.label = getString(R.string.compass) + } + qsTile.updateTile() + } + + override fun onStartListening() { + super.onStartListening() + Log.d("TAG", "START LISTENING") + if (qsTile.state == Tile.STATE_ACTIVE) { + startForeground( + NOTIFICATION_ID, + NotificationCompat.Builder(this, CHANNEL_ID).setSmallIcon(R.drawable.ic_explorer) + .setContentTitle(getString(R.string.compass_notification_title)) + .setContentText(getString(R.string.compass_notification_label)) + .build() + ) + sensorManager?.registerListener( + this, + rotationVectorSensor, + SensorManager.SENSOR_DELAY_FASTEST + ) + } + } + + override fun onStopListening() { + super.onStopListening() + if (qsTile.state == Tile.STATE_ACTIVE) { + sensorManager?.unregisterListener(this) + stopForeground(STOP_FOREGROUND_REMOVE) + } + Log.d("TAG", "STOP LISTENING") + } + + override fun onSensorChanged(event: SensorEvent) { + if (event.sensor.type == Sensor.TYPE_ROTATION_VECTOR && qsTile.state == Tile.STATE_ACTIVE) { + updateCompass(event) + } + } + + @SuppressLint("StringFormatMatches") + private fun updateCompass(event: SensorEvent) { + val rotationVector = event.values.take(3).toFloatArray() + val rotationMatrix = FloatArray(9) + SensorManager.getRotationMatrixFromVector(rotationMatrix, rotationVector) + + val displayRotation = ContextCompat.getDisplayOrDefault(baseContext).rotation + val remappedRotationMatrix = remapRotationMatrix(rotationMatrix, displayRotation) + + val orientationInRadians = FloatArray(3) + SensorManager.getOrientation(remappedRotationMatrix, orientationInRadians) + + val azimuthInDegrees = Math.toDegrees(orientationInRadians[0].toDouble()).toFloat() + val adjustedAzimuth = (azimuthInDegrees + 360) % 360 + + Canvas(iconBitmap).apply { + drawColor(Color.BLACK, PorterDuff.Mode.CLEAR) // clear all + rotate(-adjustedAzimuth, width / 2f, height / 2f) + rotationIcon.setBounds(0, 0, width, height) + rotationIcon.draw(this) + } + + qsTile.label = getString(R.string.degree_format_tile, adjustedAzimuth.toInt().absoluteValue) + qsTile.icon = Icon.createWithBitmap(iconBitmap) + + qsTile.updateTile() + } + + private fun remapRotationMatrix(rotationMatrix: FloatArray, displayRotation: Int): FloatArray { + val (newX, newY) = when (displayRotation) { + Surface.ROTATION_90 -> Pair(SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X) + Surface.ROTATION_180 -> Pair(SensorManager.AXIS_MINUS_X, SensorManager.AXIS_MINUS_Y) + Surface.ROTATION_270 -> Pair(SensorManager.AXIS_MINUS_Y, SensorManager.AXIS_X) + else -> Pair(SensorManager.AXIS_X, SensorManager.AXIS_Y) + } + + val remappedRotationMatrix = FloatArray(9) + SensorManager.remapCoordinateSystem(rotationMatrix, newX, newY, remappedRotationMatrix) + return remappedRotationMatrix + } + + override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) = Unit +} diff --git a/app/src/main/java/uk/akane/omni/ui/MainActivity.kt b/app/src/main/java/uk/akane/omni/ui/MainActivity.kt index f657a04..37f5818 100644 --- a/app/src/main/java/uk/akane/omni/ui/MainActivity.kt +++ b/app/src/main/java/uk/akane/omni/ui/MainActivity.kt @@ -1,12 +1,17 @@ package uk.akane.omni.ui import android.os.Bundle +import android.util.Log +import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.fragment.app.Fragment import androidx.fragment.app.commit import uk.akane.omni.R import uk.akane.omni.logic.enableEdgeToEdgeProperly +import uk.akane.omni.ui.fragments.FlashlightFragment +import uk.akane.omni.ui.fragments.LevelFragment +import uk.akane.omni.ui.fragments.RulerFragment class MainActivity : AppCompatActivity() { @@ -17,6 +22,27 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) enableEdgeToEdgeProperly() setContentView(R.layout.activity_main) + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + + Log.d("TAG", "YES:: ${intent.extras}") + if (intent.hasExtra("targetFragment")) { + intent.getIntExtra("targetFragment", 0).let { + when (it) { + 1 -> { + startFragment(LevelFragment()) + postComplete() + } + 2 -> { + startFragment(RulerFragment()) + postComplete() + } + 3 -> { + startFragment(FlashlightFragment()) + postComplete() + } + } + } + } } fun postComplete() = run { ready = true } diff --git a/app/src/main/java/uk/akane/omni/ui/components/CompassView.kt b/app/src/main/java/uk/akane/omni/ui/components/CompassView.kt index 6245e2e..d00a956 100644 --- a/app/src/main/java/uk/akane/omni/ui/components/CompassView.kt +++ b/app/src/main/java/uk/akane/omni/ui/components/CompassView.kt @@ -20,13 +20,13 @@ class CompassView @JvmOverloads constructor( init { inflate(context, R.layout.compass_layout, this) - degreeIndicatorTextView = findViewById(R.id.degree_indicator) + degreeIndicatorTextView = findViewById(R.id.degree_indicator)!! directionTextViews = listOf( - findViewById(R.id.north), findViewById(R.id.east), findViewById(R.id.south), findViewById(R.id.west), - findViewById(R.id.direction_1), findViewById(R.id.direction_2), findViewById(R.id.direction_3), - findViewById(R.id.direction_4), findViewById(R.id.direction_5), findViewById(R.id.direction_6), - findViewById(R.id.direction_7), findViewById(R.id.direction_8), findViewById(R.id.direction_9), - findViewById(R.id.direction_10), findViewById(R.id.direction_11), findViewById(R.id.direction_12), + findViewById(R.id.north)!!, findViewById(R.id.east)!!, findViewById(R.id.south)!!, findViewById(R.id.west)!!, + findViewById(R.id.direction_1)!!, findViewById(R.id.direction_2)!!, findViewById(R.id.direction_3)!!, + findViewById(R.id.direction_4)!!, findViewById(R.id.direction_5)!!, findViewById(R.id.direction_6)!!, + findViewById(R.id.direction_7)!!, findViewById(R.id.direction_8)!!, findViewById(R.id.direction_9)!!, + findViewById(R.id.direction_10)!!, findViewById(R.id.direction_11)!!, findViewById(R.id.direction_12)!!, degreeIndicatorTextView ) } diff --git a/app/src/main/java/uk/akane/omni/ui/components/RulerView.kt b/app/src/main/java/uk/akane/omni/ui/components/RulerView.kt new file mode 100644 index 0000000..818c4cb --- /dev/null +++ b/app/src/main/java/uk/akane/omni/ui/components/RulerView.kt @@ -0,0 +1,85 @@ +package uk.akane.omni.ui.components + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.util.AttributeSet +import android.util.TypedValue +import android.view.View +import uk.akane.omni.logic.dpToPx +import com.google.android.material.color.MaterialColors +import uk.akane.omni.R + +class RulerView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : View(context, attrs, defStyleAttr) { + + private val paintText = Paint().apply { + color = MaterialColors.getColor(this@RulerView, com.google.android.material.R.attr.colorOutline) + strokeWidth = 2f.dpToPx(context) + textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, resources.displayMetrics) + typeface = resources.getFont(R.font.hgm) + isAntiAlias = true + } + + private val paintMain = Paint().apply { + color = MaterialColors.getColor(this@RulerView, com.google.android.material.R.attr.colorOutline) + strokeWidth = 2f.dpToPx(context) + isAntiAlias = true + } + + private val paintSide = Paint().apply { + color = MaterialColors.getColor(this@RulerView, com.google.android.material.R.attr.colorOutline) + alpha = 127 + strokeWidth = 2f.dpToPx(context) + isAntiAlias = true + } + + // Calculate 1mm in pixels + private val mmToPx: Float = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 1f, resources.displayMetrics) + private val topPadding: Float = 24f.dpToPx(context) + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + + val width = width.toFloat() + val height = height.toFloat() + + val numDivisions = ((height - topPadding) / mmToPx).toInt() + val longLineLength = width * 0.53f + val midLineLength = width * 0.43f + val shortLineLength = width * 0.34f + + for (i in 0..numDivisions) { + val y = topPadding + i * mmToPx + when { + i % 10 == 0 -> { + // Draw longer lines and numbers for every 10mm (1cm) + canvas.drawLine(width - longLineLength, y, width, y, paintMain) + val text = (i / 10).toString() + val textWidth = paintText.measureText(text) + val textHeight = paintText.descent() - paintText.ascent() + val textX = (width - longLineLength) / 2 - textWidth / 2 + val textY = y + textHeight / 3 + paintText.color = MaterialColors.getColor(this@RulerView, + if ((i / 10) % 5 == 0) + com.google.android.material.R.attr.colorOnSurface + else + com.google.android.material.R.attr.colorOutline + ) + canvas.drawText(text, textX, textY, paintText) + } + i % 5 == 0 -> { + // Draw medium lines for every 5mm (0.5cm) + canvas.drawLine(width - midLineLength, y, width, y, paintSide) + } + else -> { + // Draw shorter lines for other millimeters + canvas.drawLine(width - shortLineLength, y, width, y, paintSide) + } + } + } + } +} diff --git a/app/src/main/java/uk/akane/omni/ui/components/RulerViewInch.kt b/app/src/main/java/uk/akane/omni/ui/components/RulerViewInch.kt new file mode 100644 index 0000000..a7faec5 --- /dev/null +++ b/app/src/main/java/uk/akane/omni/ui/components/RulerViewInch.kt @@ -0,0 +1,90 @@ +package uk.akane.omni.ui.components + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.util.AttributeSet +import android.util.TypedValue +import android.view.View +import uk.akane.omni.logic.dpToPx +import com.google.android.material.color.MaterialColors +import uk.akane.omni.R + +class RulerViewInch @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : View(context, attrs, defStyleAttr) { + + private val paintText = Paint().apply { + color = MaterialColors.getColor(this@RulerViewInch, com.google.android.material.R.attr.colorOutline) + strokeWidth = 2f.dpToPx(context) + textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, resources.displayMetrics) + typeface = resources.getFont(R.font.hgm) + isAntiAlias = true + } + + private val paintMain = Paint().apply { + color = MaterialColors.getColor(this@RulerViewInch, com.google.android.material.R.attr.colorOutline) + strokeWidth = 2f.dpToPx(context) + isAntiAlias = true + } + + private val paintSide = Paint().apply { + color = MaterialColors.getColor(this@RulerViewInch, com.google.android.material.R.attr.colorOutline) + alpha = 127 + strokeWidth = 2f.dpToPx(context) + isAntiAlias = true + } + + // Calculate 1 inch in pixels + private val inchToPx: Float = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_IN, 1f, resources.displayMetrics) + private val inchInterval: Float = inchToPx / 10f // 1 inch is divided into 10 intervals + private val inchTextInterval: Int = 10 // Show text for every 10 intervals (1 inch) + private val topPadding: Float = 24f.dpToPx(context) + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + + val width = width.toFloat() + val height = height.toFloat() + + val numInches = (height - topPadding) / inchToPx + val numIntervals = numInches * 10 + + val longLineLength = width * 0.53f + val midLineLength = width * 0.43f + val shortLineLength = width * 0.34f + + for (i in 0..numIntervals.toInt()) { + val y = topPadding + i * inchInterval + when { + i % inchTextInterval == 0 -> { + // Draw longer lines and numbers for every inch + canvas.drawLine(0f, y, longLineLength, y, paintMain) + val text = (i / inchTextInterval).toString() + val textWidth = paintText.measureText(text) + val textHeight = paintText.descent() - paintText.ascent() + val textX = (width - longLineLength) / 2 + longLineLength - textWidth / 2 + + val textY = y + textHeight / 3 + paintText.color = MaterialColors.getColor(this@RulerViewInch, + if ((i / inchTextInterval) % 12 == 0) + com.google.android.material.R.attr.colorOnSurface + else + com.google.android.material.R.attr.colorOutline + ) + canvas.drawText(text, textX, textY, paintText) + } + i % 5 == 0 -> { + // Draw medium lines for every 5 intervals (0.5 inch) + canvas.drawLine(0f, y, midLineLength, y, paintSide) + } + else -> { + // Draw shorter lines for other intervals + canvas.drawLine(0f, y, shortLineLength, y, paintSide) + } + } + } + } +} diff --git a/app/src/main/java/uk/akane/omni/ui/components/SpiritLevelView.kt b/app/src/main/java/uk/akane/omni/ui/components/SpiritLevelView.kt new file mode 100644 index 0000000..106936c --- /dev/null +++ b/app/src/main/java/uk/akane/omni/ui/components/SpiritLevelView.kt @@ -0,0 +1,241 @@ +package uk.akane.omni.ui.components + +import android.content.Context +import android.graphics.* +import android.util.AttributeSet +import android.util.TypedValue +import android.view.View +import androidx.core.content.res.ResourcesCompat +import uk.akane.omni.R +import uk.akane.omni.logic.dpToPx +import com.google.android.material.color.MaterialColors +import kotlin.math.absoluteValue +import kotlin.math.max +import kotlin.math.min +import kotlin.math.pow +import kotlin.math.sqrt + +class SpiritLevelView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : View(context, attrs, defStyleAttr) { + + private var pitch: Float = 0f + private var roll: Float = 0f + private var balance: Float = 0f + private var pitchAngle: Float = 0f + + private val containerPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { + style = Paint.Style.FILL + } + + private val levelPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { + style = Paint.Style.FILL + } + + private val textPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { + textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 42f, resources.displayMetrics) + textAlign = Paint.Align.CENTER + typeface = resources.getFont(R.font.hgm) + } + + private val outerLevelPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { + style = Paint.Style.FILL + xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN) + } + + private var colorPrimary: Int = 0 + private var colorOnPrimary: Int = 0 + private var colorTertiary: Int = 0 + private var colorOnTertiary: Int = 0 + private var colorSurface: Int = 0 + private var colorOnSurface: Int = 0 + private var colorPrimaryContainer: Int = 0 + + private val leftPolygon = ResourcesCompat.getDrawable(resources, R.drawable.ic_polygon_left, null)!! + private val rightPolygon = ResourcesCompat.getDrawable(resources, R.drawable.ic_polygon_right, null)!! + private val polygonHeight = 51.dpToPx(context) + private val polygonWidth = 50.dpToPx(context) + private val sideMargin = 16.dpToPx(context) + private val roundCorner = 16f.dpToPx(context) + + init { + colorPrimary = MaterialColors.getColor(this, com.google.android.material.R.attr.colorPrimary) + colorOnPrimary = MaterialColors.getColor(this, com.google.android.material.R.attr.colorOnPrimary) + colorTertiary = MaterialColors.getColor(this, com.google.android.material.R.attr.colorTertiary) + colorOnTertiary = MaterialColors.getColor(this, com.google.android.material.R.attr.colorOnTertiary) + colorSurface = MaterialColors.getColor(this, com.google.android.material.R.attr.colorSurface) + colorOnSurface = MaterialColors.getColor(this, com.google.android.material.R.attr.colorOnSurface) + colorPrimaryContainer = MaterialColors.getColor(this, com.google.android.material.R.attr.colorPrimaryContainer) + containerPaint.color = colorSurface + textPaint.color = colorOnSurface + } + + private var levelRadius: Float = 0f + private var translationRange: Float = 0f + private var directionalLength: Float = 0f + private var firstTransformDegree: Float = 0f + private var transformFactor: Float = 0f + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + levelRadius = w / 2 * 0.36f + translationRange = max(w, h).toFloat() + directionalLength = sqrt((w.toFloat().pow(2)) + (h.toFloat().pow(2))) / 2 + val topLeft = (height - polygonHeight) / 2 + leftPolygon.setBounds( + sideMargin, + topLeft, + sideMargin + polygonWidth, + topLeft + polygonHeight + ) + rightPolygon.setBounds( + width - sideMargin - polygonWidth, + (height - polygonHeight) / 2, + width - sideMargin, + (height - polygonHeight) / 2 + polygonHeight + ) + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + + // Calculates indicator center location. + val cx = width / 2f + val cy = height / 2f + + // Calculates horizontal indicator position. + val levelCx = cx + (roll / 90) * translationRange + val levelCy = cy - (pitch / 90) * translationRange + val offScreenProgress = sqrt( + (((cy - levelCy).absoluteValue).pow(2) + ((cx - levelCx).absoluteValue).pow(2)) + ) - levelRadius + + if (pitch.absoluteValue > 2f || roll.absoluteValue > 2f) { + levelPaint.color = colorPrimary + outerLevelPaint.color = colorOnPrimary + } else { + levelPaint.color = colorTertiary + outerLevelPaint.color = colorOnTertiary + } + + drawHorizontalIndicators(cx, cy, levelCx, levelCy, canvas) + drawVerticalLayer(canvas, balance, offScreenProgress) + + val saveCount = canvas.saveLayer(null, null) + + drawCenteredText(cx, cy, canvas, balance, offScreenProgress) + drawInvertedTextLayer(levelCx, levelCy, canvas) + drawRoundedRect(canvas, transformFactor, balance, outerLevelPaint) + + canvas.restoreToCount(saveCount) + } + + private fun drawHorizontalIndicators( + cx: Float, + cy: Float, + levelCx: Float, + levelCy: Float, + canvas: Canvas + ) { + // Draws container radius. + val bigCircleRadius = sqrt( + (((cy - levelCy).absoluteValue).pow(2) + ((cx - levelCx).absoluteValue).pow(2)) + ) + levelRadius + + // Draws indicators + canvas.drawCircle(cx, cy, bigCircleRadius, containerPaint) + canvas.drawCircle(levelCx, levelCy, levelRadius, levelPaint) + } + + private fun drawVerticalLayer( + canvas: Canvas, + angle: Float, + offScreenProgress: Float + ) { + if (offScreenProgress > directionalLength) { + if (firstTransformDegree == 0f) firstTransformDegree = pitchAngle + transformFactor = (pitchAngle - firstTransformDegree) / 5f + if (angle.absoluteValue > 2f && angle !in 178f .. 182f) { + leftPolygon.setTint(colorPrimaryContainer) + rightPolygon.setTint(colorPrimaryContainer) + } else { + leftPolygon.setTint(colorTertiary) + rightPolygon.setTint(colorTertiary) + } + if (transformFactor in 0f .. 1f) { + leftPolygon.alpha = (transformFactor * 255).toInt() + rightPolygon.alpha = (transformFactor * 255).toInt() + drawRoundedRect(canvas, transformFactor, angle, levelPaint) + containerPaint.alpha = ((1f - transformFactor) * 255).toInt() + } else if (transformFactor > 1f) { + leftPolygon.alpha = 255 + rightPolygon.alpha = 255 + drawRoundedRect(canvas, 1f, angle, levelPaint) + containerPaint.alpha = 0 + } + leftPolygon.draw(canvas) + rightPolygon.draw(canvas) + } else { + return + } + } + + private fun drawRoundedRect( + canvas: Canvas, + transformValue: Float, + angle: Float, + paint: Paint + ) { + canvas.save() + canvas.rotate(angle, width / 2f, height / 2f) + canvas.drawRoundRect( + 0f, + height - (height / 2 * min(transformValue, 1f)), + width.toFloat(), + height.toFloat() * 2, + roundCorner, + roundCorner, + paint + ) + canvas.restore() + } + + private fun drawCenteredText( + cx: Float, + cy: Float, + canvas: Canvas, + textAngle: Float, + offScreenProgress: Float + ) { + canvas.save() + canvas.rotate(textAngle, cx, cy) + val text = + if (offScreenProgress < directionalLength) + " ${pitchAngle.toInt().absoluteValue}°" + else if (offScreenProgress > directionalLength && pitch > 0) + " ${(- balance + 180f).toInt().absoluteValue}°" + else + " ${textAngle.toInt().absoluteValue}°" + canvas.drawText(text, cx, cy + (textPaint.textSize / 4), textPaint) + canvas.restore() + } + + private fun drawInvertedTextLayer( + levelCx: Float, + levelCy: Float, + canvas: Canvas + ) { + // Draws an overlay layer for the inverted text color. + canvas.drawCircle(levelCx, levelCy, levelRadius, outerLevelPaint) + } + + fun updatePitchAndRollAndBalance(pitch: Float, roll: Float, balance: Float) { + this.pitch = pitch + this.roll = roll + this.balance = if (pitch < 0) balance else 180f - balance + this.pitchAngle = sqrt(pitch.absoluteValue.pow(2) + roll.absoluteValue.pow(2)) + invalidate() + } +} diff --git a/app/src/main/java/uk/akane/omni/ui/components/SwitchBottomSheet.kt b/app/src/main/java/uk/akane/omni/ui/components/SwitchBottomSheet.kt new file mode 100644 index 0000000..e406d0e --- /dev/null +++ b/app/src/main/java/uk/akane/omni/ui/components/SwitchBottomSheet.kt @@ -0,0 +1,113 @@ +package uk.akane.omni.ui.components + +import android.animation.ValueAnimator +import android.content.Context +import android.content.res.ColorStateList +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.commit +import uk.akane.omni.R +import uk.akane.omni.ui.fragments.CompassFragment +import uk.akane.omni.ui.fragments.FlashlightFragment +import uk.akane.omni.ui.fragments.LevelFragment +import uk.akane.omni.ui.fragments.RulerFragment +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import com.google.android.material.button.MaterialButton +import com.google.android.material.color.MaterialColors +import com.google.android.material.color.utilities.ColorUtils + +class SwitchBottomSheet( + private val callFragmentType : CallFragmentType +) : BottomSheetDialogFragment() { + + enum class CallFragmentType { + COMPASS, + SPIRIT_LEVEL, + BAROMETER, + RULER, + FLASHLIGHT + } + + private lateinit var compassMaterialButton: MaterialButton + private lateinit var spiritLevelMaterialButton: MaterialButton + private lateinit var barometerMaterialButton: MaterialButton + private lateinit var rulerMaterialButton: MaterialButton + private lateinit var flashlightMaterialButton: MaterialButton + + private lateinit var targetMaterialButton: MaterialButton + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val rootView = inflater.inflate(R.layout.switch_bottom_sheet, container, false) + + compassMaterialButton = rootView.findViewById(R.id.compass_btn)!! + spiritLevelMaterialButton = rootView.findViewById(R.id.spirit_leveler_btn)!! + barometerMaterialButton = rootView.findViewById(R.id.barometer_btn)!! + rulerMaterialButton = rootView.findViewById(R.id.ruler_btn)!! + flashlightMaterialButton = rootView.findViewById(R.id.flashlight_btn)!! + + targetMaterialButton = when (callFragmentType) { + CallFragmentType.COMPASS -> compassMaterialButton + CallFragmentType.SPIRIT_LEVEL -> spiritLevelMaterialButton + CallFragmentType.BAROMETER -> barometerMaterialButton + CallFragmentType.RULER -> rulerMaterialButton + CallFragmentType.FLASHLIGHT -> flashlightMaterialButton + } + + targetMaterialButton.isChecked = true + + setOnClickListener() + + return rootView + } + + private fun setOnClickListener() { + compassMaterialButton.setOnClickListener { + if (targetMaterialButton != compassMaterialButton) { + val fm = requireActivity().supportFragmentManager + fm.commit { + hide(fm.fragments.last()) + replace(R.id.container, CompassFragment()) + } + dismiss() + } + } + spiritLevelMaterialButton.setOnClickListener { + if (targetMaterialButton != spiritLevelMaterialButton) { + val fm = requireActivity().supportFragmentManager + fm.commit { + hide(fm.fragments.last()) + replace(R.id.container, LevelFragment()) + } + dismiss() + } + } + rulerMaterialButton.setOnClickListener { + if (targetMaterialButton != rulerMaterialButton) { + val fm = requireActivity().supportFragmentManager + fm.commit { + hide(fm.fragments.last()) + replace(R.id.container, RulerFragment()) + } + dismiss() + } + } + flashlightMaterialButton.setOnClickListener { + if (targetMaterialButton != flashlightMaterialButton) { + val fm = requireActivity().supportFragmentManager + fm.commit { + hide(fm.fragments.last()) + replace(R.id.container, FlashlightFragment()) + } + dismiss() + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/uk/akane/omni/ui/fragments/BaseFragment.kt b/app/src/main/java/uk/akane/omni/ui/fragments/BaseFragment.kt index 921f701..1362520 100644 --- a/app/src/main/java/uk/akane/omni/ui/fragments/BaseFragment.kt +++ b/app/src/main/java/uk/akane/omni/ui/fragments/BaseFragment.kt @@ -11,17 +11,17 @@ abstract class BaseFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Enable material transitions. - enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, /* forward= */ true) - returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, /* forward= */ false) - exitTransition = MaterialSharedAxis(MaterialSharedAxis.X, /* forward= */ true) - reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, /* forward= */ false) + enterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, /* forward= */ true) + returnTransition = MaterialSharedAxis(MaterialSharedAxis.Z, /* forward= */ false) + exitTransition = MaterialSharedAxis(MaterialSharedAxis.Z, /* forward= */ true) + reenterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, /* forward= */ false) } // https://github.com/material-components/material-components-android/issues/1984#issuecomment-1089710991 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // Overlap colors. - view.setBackgroundColor(MaterialColors.getColor(view, android.R.attr.colorBackground)) + view.setBackgroundColor(MaterialColors.getColor(view, com.google.android.material.R.attr.colorSurfaceContainer)) } } \ No newline at end of file diff --git a/app/src/main/java/uk/akane/omni/ui/fragments/BasePreferenceFragment.kt b/app/src/main/java/uk/akane/omni/ui/fragments/BasePreferenceFragment.kt index a44dc64..c898c30 100644 --- a/app/src/main/java/uk/akane/omni/ui/fragments/BasePreferenceFragment.kt +++ b/app/src/main/java/uk/akane/omni/ui/fragments/BasePreferenceFragment.kt @@ -10,8 +10,6 @@ import androidx.preference.PreferenceFragmentCompat import androidx.recyclerview.widget.RecyclerView import com.google.android.material.color.MaterialColors import uk.akane.omni.R -import uk.akane.omni.logic.allowDiskAccessInStrictMode -import uk.akane.omni.logic.dpToPx import uk.akane.omni.logic.enableEdgeToEdgePaddingListener /** @@ -26,15 +24,8 @@ abstract class BasePreferenceFragment : PreferenceFragmentCompat(), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - view.setBackgroundColor(MaterialColors.getColor(view, android.R.attr.colorBackground)) - view.findViewById(androidx.preference.R.id.recycler_view).apply { - setPadding(paddingLeft, paddingTop + 12.dpToPx(context), paddingRight, paddingBottom) - enableEdgeToEdgePaddingListener() - } - } - - override fun setPreferencesFromResource(preferencesResId: Int, key: String?) { - allowDiskAccessInStrictMode { super.setPreferencesFromResource(preferencesResId, key) } + view.setBackgroundColor(MaterialColors.getColor(view, com.google.android.material.R.attr.colorSurfaceContainer)) + view.findViewById(androidx.preference.R.id.recycler_view)!!.enableEdgeToEdgePaddingListener() } override fun setDivider(divider: Drawable?) { diff --git a/app/src/main/java/uk/akane/omni/ui/fragments/BaseSettingFragment.kt b/app/src/main/java/uk/akane/omni/ui/fragments/BaseSettingFragment.kt index 5ee6921..115e55d 100644 --- a/app/src/main/java/uk/akane/omni/ui/fragments/BaseSettingFragment.kt +++ b/app/src/main/java/uk/akane/omni/ui/fragments/BaseSettingFragment.kt @@ -19,12 +19,10 @@ abstract class BaseSettingFragment(private val str: Int, savedInstanceState: Bundle?, ): View? { val rootView = inflater.inflate(R.layout.fragment_top_settings, container, false) - val topAppBar = rootView.findViewById(R.id.topAppBar) - val collapsingToolbar = - rootView.findViewById(R.id.collapsingtoolbar) + val topAppBar = rootView.findViewById(R.id.topAppBar)!! - rootView.findViewById(R.id.appbarlayout).enableEdgeToEdgePaddingListener() - collapsingToolbar.title = getString(str) + rootView.findViewById(R.id.appbarlayout)!!.enableEdgeToEdgePaddingListener() + topAppBar.title = getString(str) topAppBar.setNavigationOnClickListener { requireActivity().supportFragmentManager.popBackStack() diff --git a/app/src/main/java/uk/akane/omni/ui/fragments/CompassFragment.kt b/app/src/main/java/uk/akane/omni/ui/fragments/CompassFragment.kt index 9bc803c..cdcbdf1 100644 --- a/app/src/main/java/uk/akane/omni/ui/fragments/CompassFragment.kt +++ b/app/src/main/java/uk/akane/omni/ui/fragments/CompassFragment.kt @@ -1,6 +1,8 @@ package uk.akane.omni.ui.fragments import android.Manifest +import android.content.SharedPreferences +import android.hardware.GeomagneticField import android.hardware.Sensor import android.hardware.SensorEvent import android.hardware.SensorEventListener @@ -28,25 +30,29 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.updateLayoutParams import androidx.fragment.app.activityViewModels import androidx.lifecycle.coroutineScope +import androidx.preference.PreferenceManager import com.google.android.material.button.MaterialButton import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import uk.akane.omni.R import uk.akane.omni.logic.checkSensorAvailability +import uk.akane.omni.logic.doIHavePermission import uk.akane.omni.logic.fadInAnimation import uk.akane.omni.logic.fadOutAnimation import uk.akane.omni.logic.isLocationPermissionGranted import uk.akane.omni.logic.setTextAnimation import uk.akane.omni.ui.MainActivity import uk.akane.omni.ui.components.CompassView +import uk.akane.omni.ui.components.SwitchBottomSheet import uk.akane.omni.ui.fragments.settings.MainSettingsFragment import uk.akane.omni.ui.viewmodels.OmniViewModel import java.util.Locale import kotlin.math.abs -class CompassFragment : BaseFragment(), SensorEventListener, LocationListener { +class CompassFragment : BaseFragment(), SensorEventListener, LocationListener, + SharedPreferences.OnSharedPreferenceChangeListener { private val omniViewModel: OmniViewModel by activityViewModels() @@ -57,8 +63,6 @@ class CompassFragment : BaseFragment(), SensorEventListener, LocationListener { private var rotationVectorSensor: Sensor? = null - private var lastDegree = 0f - private lateinit var compassView: CompassView private lateinit var textIndicatorTextView: TextView private lateinit var sheetMaterialButton: MaterialButton @@ -75,8 +79,13 @@ class CompassFragment : BaseFragment(), SensorEventListener, LocationListener { private lateinit var requestPermissionLauncher: ActivityResultLauncher + private lateinit var prefs: SharedPreferences + private var isAnimating: Boolean = false private var doNotHaveSensor: Boolean = false + private var hapticFeedback: Boolean = true + private var trueNorth: Boolean = false + private var useDms: Boolean = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -90,8 +99,6 @@ class CompassFragment : BaseFragment(), SensorEventListener, LocationListener { if (!sensorManager!!.checkSensorAvailability(Sensor.TYPE_ROTATION_VECTOR)) { mainActivity!!.postComplete() doNotHaveSensor = true - } else { - sensorManager!!.registerListener(this, rotationVectorSensor, SensorManager.SENSOR_DELAY_FASTEST) } geocoder = Geocoder(requireContext(), Locale.getDefault()) @@ -104,14 +111,18 @@ class CompassFragment : BaseFragment(), SensorEventListener, LocationListener { registerForActivityResult( ActivityResultContracts.RequestPermission() ) { isGranted: Boolean -> - if (isGranted) { + if (isGranted && requireContext().isLocationPermissionGranted) { requestLocationUpdates() showLongitudeLatitude() } } - mutableListOf(1, 2, 3).sort() + prefs = PreferenceManager.getDefaultSharedPreferences(requireContext()) + prefs.registerOnSharedPreferenceChangeListener(this) + hapticFeedback = prefs.getBoolean("haptic_feedback", true) + trueNorth = prefs.getBoolean("true_north", false) + useDms = prefs.getBoolean("coordinate", false) } private fun requestLocationUpdates() { @@ -132,13 +143,44 @@ class CompassFragment : BaseFragment(), SensorEventListener, LocationListener { } private fun updateLocationStatus(location: Location) { - latitudeTextView.text = String.format(Locale.getDefault(), "%.4f", location.latitude) - longitudeTextView.text = String.format(Locale.getDefault(), "%.4f", location.longitude) + if (!useDms) { + latitudeTextView.text = String.format(Locale.getDefault(), "%.4f", location.latitude) + longitudeTextView.text = String.format(Locale.getDefault(), "%.4f", location.longitude) + } else { + val listLatitudeDMS = Location.convert(location.latitude, Location.FORMAT_SECONDS).split(':') + val longitudeDMS = Location.convert(location.longitude, Location.FORMAT_SECONDS).split(':') + val regex = """[.,٫]\d+""".toRegex() + latitudeTextView.text = getString( + R.string.dms_format, + listLatitudeDMS[0], + listLatitudeDMS[1], + listLatitudeDMS[2].replace(regex, "") + ) + longitudeTextView.text = getString( + R.string.dms_format, + longitudeDMS[0], + longitudeDMS[1], + longitudeDMS[2].replace(regex, "") + ) + } updateCity(location) } - override fun onDestroy() { + override fun onResume() { + super.onResume() + if (sensorManager!!.checkSensorAvailability(Sensor.TYPE_ROTATION_VECTOR)) { + sensorManager!!.registerListener(this, rotationVectorSensor, SensorManager.SENSOR_DELAY_FASTEST) + } + } + + + override fun onPause() { + super.onPause() sensorManager!!.unregisterListener(this) + } + + override fun onDestroy() { + prefs.unregisterOnSharedPreferenceChangeListener(this) super.onDestroy() } @@ -149,16 +191,16 @@ class CompassFragment : BaseFragment(), SensorEventListener, LocationListener { ): View? { val rootView = inflater.inflate(R.layout.fragment_compass, container, false) - compassView = rootView.findViewById(R.id.compass_view) - textIndicatorTextView = rootView.findViewById(R.id.text_indicator) - sheetMaterialButton = rootView.findViewById(R.id.sheet_btn) - settingsMaterialButton = rootView.findViewById(R.id.settings_btn) - latitudeTextView = rootView.findViewById(R.id.latitude) - longitudeTextView = rootView.findViewById(R.id.longitude) - latitudeDescTextView = rootView.findViewById(R.id.latitude_desc) - longitudeDescTextView = rootView.findViewById(R.id.longitude_desc) - cityTextView = rootView.findViewById(R.id.city) - notActiveMaterialButton = rootView.findViewById(R.id.not_available_btn) + compassView = rootView.findViewById(R.id.compass_view)!! + textIndicatorTextView = rootView.findViewById(R.id.text_indicator)!! + sheetMaterialButton = rootView.findViewById(R.id.sheet_btn)!! + settingsMaterialButton = rootView.findViewById(R.id.settings_btn)!! + latitudeTextView = rootView.findViewById(R.id.latitude)!! + longitudeTextView = rootView.findViewById(R.id.longitude)!! + latitudeDescTextView = rootView.findViewById(R.id.latitude_desc)!! + longitudeDescTextView = rootView.findViewById(R.id.longitude_desc)!! + cityTextView = rootView.findViewById(R.id.city)!! + notActiveMaterialButton = rootView.findViewById(R.id.not_available_btn)!! directionStringList = listOf( getString(R.string.north), @@ -187,6 +229,10 @@ class CompassFragment : BaseFragment(), SensorEventListener, LocationListener { mainActivity!!.startFragment(MainSettingsFragment()) } + sheetMaterialButton.setOnClickListener { + SwitchBottomSheet(SwitchBottomSheet.CallFragmentType.COMPASS).show(parentFragmentManager, "switch_bottom_sheet") + } + omniViewModel.lastKnownLocation.value?.let { updateLocationStatus(it) } @@ -203,6 +249,27 @@ class CompassFragment : BaseFragment(), SensorEventListener, LocationListener { .show() } + if (omniViewModel.lastDegree.value != null) { + updateCompassViewWithAzimuth(omniViewModel.lastDegree.value!!) + } + + if (!requireContext().doIHavePermission(Manifest.permission.POST_NOTIFICATIONS) && + !prefs.getBoolean("isPostNotificationPromptShown" , false) && + Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + MaterialAlertDialogBuilder(requireContext()) + .setTitle(resources.getString(R.string.compass_prompt_title)) + .setMessage(resources.getString(R.string.compass_prompt_desc)) + .setIcon(R.drawable.ic_notifications) + .setNegativeButton(resources.getString(R.string.decline)) { _, _ -> + prefs.edit().putBoolean("isPostNotificationPromptShown", true).apply() + } + .setPositiveButton(resources.getString(R.string.accept)) { _, _ -> + requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) + prefs.edit().putBoolean("isPostNotificationPromptShown", true).apply() + } + .show() + } + return rootView } @@ -248,9 +315,24 @@ class CompassFragment : BaseFragment(), SensorEventListener, LocationListener { val azimuthInDegrees = Math.toDegrees(azimuthInRadians.toDouble()).toFloat() val adjustedAzimuth = if (azimuthInDegrees < 0) 360f + azimuthInDegrees else azimuthInDegrees - if (lastDegree == 0f) lastDegree = adjustedAzimuth + if (omniViewModel.lastDegree.value == null) omniViewModel.setLastDegree(adjustedAzimuth) + + if (trueNorth && omniViewModel.lastKnownLocation.value != null) { + val magneticDeclination = getMagneticDeclination(omniViewModel.lastKnownLocation.value!!) + val trueAzimuth = adjustedAzimuth.plus(magneticDeclination) + updateCompassViewWithAzimuth(trueAzimuth) + } else { + updateCompassViewWithAzimuth(adjustedAzimuth) + } + } - updateCompassViewWithAzimuth(adjustedAzimuth) + private fun getMagneticDeclination(location: Location): Float { + val latitude = location.latitude.toFloat() + val longitude = location.longitude.toFloat() + val altitude = location.altitude.toFloat() + val time = location.time + val geomagneticField = GeomagneticField(latitude, longitude, altitude, time) + return geomagneticField.declination } private fun remapRotationMatrix(rotationMatrix: FloatArray, displayRotation: Int?): FloatArray { @@ -269,7 +351,9 @@ class CompassFragment : BaseFragment(), SensorEventListener, LocationListener { private fun updateCompassViewWithAzimuth(azimuthInDegrees: Float) { compassView.rotate(-azimuthInDegrees) updateTextIndicatorWithAzimuth(azimuthInDegrees) - checkAndVibrate(azimuthInDegrees) + if (hapticFeedback) { + checkAndVibrate(azimuthInDegrees) + } } private fun updateTextIndicatorWithAzimuth(degree: Float) { @@ -279,9 +363,10 @@ class CompassFragment : BaseFragment(), SensorEventListener, LocationListener { private fun checkAndVibrate(degree: Float) { val threshold = 2f - if (abs(degree - lastDegree) > threshold) { + if (omniViewModel.lastDegree.value != null && + abs(degree - omniViewModel.lastDegree.value!!) > threshold) { view?.performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK) - lastDegree = degree + omniViewModel.setLastDegree(degree) } } @@ -394,4 +479,18 @@ class CompassFragment : BaseFragment(), SensorEventListener, LocationListener { val EXIT_INTERPOLATOR = PathInterpolator(0.3f, 0f, 1f, 1f) } + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + when (key) { + "haptic_feedback" -> { + hapticFeedback = prefs.getBoolean("haptic_feedback", true) + } + "true_north" -> { + trueNorth = prefs.getBoolean("true_north", false) + } + "coordinate" -> { + useDms = prefs.getBoolean("coordinate", false) + } + } + } + } \ No newline at end of file diff --git a/app/src/main/java/uk/akane/omni/ui/fragments/FlashlightFragment.kt b/app/src/main/java/uk/akane/omni/ui/fragments/FlashlightFragment.kt new file mode 100644 index 0000000..a0944f2 --- /dev/null +++ b/app/src/main/java/uk/akane/omni/ui/fragments/FlashlightFragment.kt @@ -0,0 +1,271 @@ +package uk.akane.omni.ui.fragments + +import android.content.SharedPreferences +import android.content.res.ColorStateList +import android.hardware.camera2.CameraCharacteristics +import android.hardware.camera2.CameraManager +import android.os.Build +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.RequiresApi +import androidx.core.content.ContextCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updateLayoutParams +import androidx.preference.PreferenceManager +import uk.akane.omni.R +import uk.akane.omni.ui.MainActivity +import uk.akane.omni.ui.components.SwitchBottomSheet +import uk.akane.omni.ui.fragments.settings.MainSettingsFragment +import com.google.android.material.button.MaterialButton +import com.google.android.material.color.MaterialColors +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.slider.Slider + + +class FlashlightFragment : BaseFragment() { + + private lateinit var sheetMaterialButton: MaterialButton + private lateinit var settingsMaterialButton: MaterialButton + private lateinit var flashlightSlider: Slider + private lateinit var cameraManager: CameraManager + private var keyCameraId: String? = null + private var maximumFlashlightLevel: Int? = null + private var notSupported: Boolean = true + private var isUserTouching: Boolean = false + private var maximumBrightnessLevelThreshold: Int = 0 + private var pastValue: Float = 0f + + private var mainActivity: MainActivity? = null + + private lateinit var prefs: SharedPreferences + + private var torchListener: CameraManager.TorchCallback = object : CameraManager.TorchCallback() { + override fun onTorchModeChanged(cameraId: String, enabled: Boolean) { + if (!isUserTouching && !notSupported && + Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && + maximumFlashlightLevel != null && maximumFlashlightLevel!! > 1) { + flashlightSlider.value = if (enabled) cameraManager.getTorchStrengthLevel(cameraId) + .toFloat() else 0.0f + if (this@FlashlightFragment::flashlightSlider.isInitialized) { + switchTrackColor(flashlightSlider.value) + } + } else if ( + !isUserTouching && !notSupported && + Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + flashlightSlider.value = if (enabled) 1.0f else 0.0f + } + } + + override fun onTorchStrengthLevelChanged(cameraId: String, newStrengthLevel: Int) { + if (!isUserTouching && !notSupported && + Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && + maximumFlashlightLevel != null && maximumFlashlightLevel!! > 1) { + flashlightSlider.value = cameraManager.getTorchStrengthLevel(cameraId).toFloat() + if (this@FlashlightFragment::flashlightSlider.isInitialized) { + switchTrackColor(flashlightSlider.value) + } + } else if ( + !isUserTouching && !notSupported && + Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + flashlightSlider.value = if (newStrengthLevel == 1) 1.0f else 0.0f + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + mainActivity = requireActivity() as MainActivity + prefs = PreferenceManager.getDefaultSharedPreferences(requireContext()) + cameraManager = ContextCompat.getSystemService(requireContext(), CameraManager::class.java)!! + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + for (i in 0 until cameraManager.cameraIdList.size) { + val cameraCharacteristics = + cameraManager.getCameraCharacteristics(cameraManager.cameraIdList[i]) + + val isFlashlightAvailable = + cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE) + maximumFlashlightLevel = + cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_STRENGTH_MAXIMUM_LEVEL) + + if (maximumFlashlightLevel != null && maximumFlashlightLevel!! > 1) { + maximumBrightnessLevelThreshold = + (maximumFlashlightLevel!! * 0.9).toInt() + } + + if (isFlashlightAvailable == true && maximumFlashlightLevel != null && maximumFlashlightLevel!! > 0) { + keyCameraId = cameraManager.cameraIdList[i] + notSupported = false + break + } + } + } + + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val rootView = inflater.inflate(R.layout.fragment_flashlight, container, false) + + sheetMaterialButton = rootView.findViewById(R.id.sheet_btn)!! + settingsMaterialButton = rootView.findViewById(R.id.settings_btn)!! + + flashlightSlider = rootView.findViewById(R.id.flashlight_slider)!! + + settingsMaterialButton.setOnClickListener { + mainActivity!!.startFragment(MainSettingsFragment()) + } + + sheetMaterialButton.setOnClickListener { + SwitchBottomSheet(SwitchBottomSheet.CallFragmentType.FLASHLIGHT).show(parentFragmentManager, "switch_bottom_sheet") + } + + if (notSupported) { + flashlightSlider.isEnabled = false + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + flashlightSlider.stepSize = 1.0f + flashlightSlider.valueTo = maximumFlashlightLevel!!.toFloat() + flashlightSlider.addOnChangeListener { _, value, _ -> + if (maximumBrightnessLevelThreshold > 0 && + value >= maximumBrightnessLevelThreshold && + !prefs.getBoolean("flashlight_acknowledged", false) + ) { + flashlightSlider.isEnabled = false + MaterialAlertDialogBuilder(requireContext()) + .setTitle(resources.getString(R.string.flashlight_dialog_title)) + .setMessage(resources.getString(R.string.flashlight_dialog_text)) + .setIcon(R.drawable.ic_warning) + .setNegativeButton(resources.getString(R.string.decline)) { _, _ -> + flashlightSlider.isEnabled = true + if (pastValue < maximumBrightnessLevelThreshold) { + flashlightSlider.value = pastValue + } else { + flashlightSlider.value = 0f + } + } + .setPositiveButton(resources.getString(R.string.accept)) { _, _ -> + flashlightSlider.isEnabled = true + prefs.edit() + .putBoolean("flashlight_acknowledged", true) + .apply() + turnOnTorch(value) + switchTrackColor(value) + } + .setOnDismissListener { + flashlightSlider.isEnabled = true + if (pastValue < maximumBrightnessLevelThreshold && + !prefs.getBoolean("flashlight_acknowledged", false)) { + flashlightSlider.value = pastValue + } else if (!prefs.getBoolean("flashlight_acknowledged", false)) { + flashlightSlider.value = 0f + } + } + .show() + return@addOnChangeListener + } + + switchTrackColor(value) + turnOnTorch(value) + + pastValue = value + } + flashlightSlider.addOnSliderTouchListener(object : Slider.OnSliderTouchListener { + override fun onStartTrackingTouch(slider: Slider) { + isUserTouching = true + } + + override fun onStopTrackingTouch(slider: Slider) { + isUserTouching = false + } + + }) + cameraManager.registerTorchCallback(torchListener, null) + } + return rootView + } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + private fun turnOnTorch(value: Float) { + if (maximumFlashlightLevel == 1) { + cameraManager.setTorchMode( + keyCameraId!!, + if (value >= 0.5f) true else false + ) + } else if (value >= 0.5){ + cameraManager.turnOnTorchWithStrengthLevel(keyCameraId!!, value.toInt()) + } else { + cameraManager.setTorchMode(keyCameraId!!, false) + } + } + + private fun switchTrackColor(value: Float) { + if (value >= maximumBrightnessLevelThreshold && maximumBrightnessLevelThreshold > 0) { + setHighlightTrackColor() + } else if (maximumBrightnessLevelThreshold > 0) { + setDefaultTrackColor() + } + } + + private fun setHighlightTrackColor() { + flashlightSlider.thumbTintList = + ColorStateList.valueOf( + MaterialColors.getColor( + flashlightSlider, + com.google.android.material.R.attr.colorError + ) + ) + flashlightSlider.trackActiveTintList = + ColorStateList.valueOf( + MaterialColors.getColor( + flashlightSlider, + com.google.android.material.R.attr.colorError + ) + ) + } + + private fun setDefaultTrackColor() { + flashlightSlider.thumbTintList = + ColorStateList.valueOf( + MaterialColors.getColor( + flashlightSlider, + com.google.android.material.R.attr.colorPrimary + ) + ) + flashlightSlider.trackActiveTintList = + ColorStateList.valueOf( + MaterialColors.getColor( + flashlightSlider, + com.google.android.material.R.attr.colorPrimary + ) + ) + } + + override fun onDestroy() { + cameraManager.unregisterTorchCallback(torchListener) + super.onDestroy() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + ViewCompat.setOnApplyWindowInsetsListener(view) { _, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + + settingsMaterialButton.updateLayoutParams { + bottomMargin = insets.bottom + resources.getDimensionPixelSize(R.dimen.sprt_btn_marginBottom) + } + + flashlightSlider.updateLayoutParams { + topMargin = insets.top + } + + WindowInsetsCompat.CONSUMED + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/uk/akane/omni/ui/fragments/LevelFragment.kt b/app/src/main/java/uk/akane/omni/ui/fragments/LevelFragment.kt new file mode 100644 index 0000000..4da4577 --- /dev/null +++ b/app/src/main/java/uk/akane/omni/ui/fragments/LevelFragment.kt @@ -0,0 +1,160 @@ +package uk.akane.omni.ui.fragments + +import android.hardware.Sensor +import android.hardware.SensorEvent +import android.hardware.SensorEventListener +import android.hardware.SensorManager +import android.os.Bundle +import android.view.LayoutInflater +import android.view.Surface +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updateLayoutParams +import uk.akane.omni.R +import uk.akane.omni.logic.checkSensorAvailability +import uk.akane.omni.ui.MainActivity +import uk.akane.omni.ui.components.SpiritLevelView +import uk.akane.omni.ui.components.SwitchBottomSheet +import uk.akane.omni.ui.fragments.settings.MainSettingsFragment +import com.google.android.material.button.MaterialButton +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import kotlin.math.asin +import kotlin.math.sqrt + + +class LevelFragment : BaseFragment(), SensorEventListener { + + private var mainActivity: MainActivity? = null + + private var sensorManager: SensorManager? = null + + private var rotationVectorSensor: Sensor? = null + + private lateinit var sheetMaterialButton: MaterialButton + private lateinit var settingsMaterialButton: MaterialButton + + private lateinit var levelView: SpiritLevelView + + private var doNotHaveSensor: Boolean = false + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + mainActivity = requireActivity() as MainActivity + + sensorManager = ContextCompat.getSystemService(requireContext(), SensorManager::class.java) + + rotationVectorSensor = sensorManager!!.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR) + if (!sensorManager!!.checkSensorAvailability(Sensor.TYPE_ROTATION_VECTOR)) { + mainActivity!!.postComplete() + doNotHaveSensor = true + } else { + sensorManager!!.registerListener(this, rotationVectorSensor, SensorManager.SENSOR_DELAY_FASTEST) + } + + } + + override fun onDestroy() { + sensorManager!!.unregisterListener(this) + super.onDestroy() + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val rootView = inflater.inflate(R.layout.fragment_spirit_level, container, false) + + sheetMaterialButton = rootView.findViewById(R.id.sheet_btn)!! + settingsMaterialButton = rootView.findViewById(R.id.settings_btn)!! + + levelView = rootView.findViewById(R.id.level_view)!! + + settingsMaterialButton.setOnClickListener { + mainActivity!!.startFragment(MainSettingsFragment()) + } + + sheetMaterialButton.setOnClickListener { + SwitchBottomSheet(SwitchBottomSheet.CallFragmentType.SPIRIT_LEVEL).show(parentFragmentManager, "switch_bottom_sheet") + } + + if (doNotHaveSensor) { + MaterialAlertDialogBuilder(requireContext()) + .setTitle(resources.getString(R.string.warning_dialog_title)) + .setMessage(resources.getString(R.string.warning_dialog_text)) + .setIcon(R.drawable.ic_warning) + .setPositiveButton(resources.getString(R.string.dismiss), null) + .show() + } + + return rootView + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + ViewCompat.setOnApplyWindowInsetsListener(view) { _, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + + settingsMaterialButton.updateLayoutParams { + bottomMargin = insets.bottom + resources.getDimensionPixelSize(R.dimen.sprt_btn_marginBottom) + } + + WindowInsetsCompat.CONSUMED + } + } + + override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { + // Do nothing + } + + override fun onSensorChanged(event: SensorEvent) { + when (event.sensor.type) { + Sensor.TYPE_ROTATION_VECTOR -> updateCompass(event) + } + if (mainActivity?.isInflationStarted() == false) { + mainActivity!!.postComplete() + } + } + + private fun updateCompass(event: SensorEvent) { + val rotationVector = floatArrayOf(event.values[0], event.values[1], event.values[2]) + + val rotationMatrix = FloatArray(16) + SensorManager.getRotationMatrixFromVector(rotationMatrix, rotationVector) + + val displayRotation = ContextCompat.getDisplayOrDefault(requireContext()).rotation + val remappedRotationMatrix = remapRotationMatrix(rotationMatrix, displayRotation) + + val orientationInRadians = FloatArray(3) + SensorManager.getOrientation(remappedRotationMatrix, orientationInRadians) + + val pitchInRadians = Math.toDegrees(orientationInRadians[1].toDouble()) + val rollInRadians = Math.toDegrees(orientationInRadians[2].toDouble()) + var balanceFactor: Float = sqrt( + remappedRotationMatrix[8] * remappedRotationMatrix[8] + + remappedRotationMatrix[9] * remappedRotationMatrix[9] + ) + balanceFactor = (if (balanceFactor == 0f) 0f else remappedRotationMatrix[8] / balanceFactor) + + val balance = Math.toDegrees(asin(balanceFactor).toDouble()).toFloat() + + levelView.updatePitchAndRollAndBalance(pitchInRadians.toFloat(), rollInRadians.toFloat(), balance) + } + + private fun remapRotationMatrix(rotationMatrix: FloatArray, displayRotation: Int?): FloatArray { + val (newX, newY) = when (displayRotation) { + Surface.ROTATION_90 -> Pair(SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X) + Surface.ROTATION_180 -> Pair(SensorManager.AXIS_MINUS_X, SensorManager.AXIS_MINUS_Y) + Surface.ROTATION_270 -> Pair(SensorManager.AXIS_MINUS_Y, SensorManager.AXIS_X) + else -> Pair(SensorManager.AXIS_X, SensorManager.AXIS_Y) + } + + val remappedRotationMatrix = FloatArray(16) + SensorManager.remapCoordinateSystem(rotationMatrix, newX, newY, remappedRotationMatrix) + return remappedRotationMatrix + } + +} \ No newline at end of file diff --git a/app/src/main/java/uk/akane/omni/ui/fragments/RulerFragment.kt b/app/src/main/java/uk/akane/omni/ui/fragments/RulerFragment.kt new file mode 100644 index 0000000..0a7befd --- /dev/null +++ b/app/src/main/java/uk/akane/omni/ui/fragments/RulerFragment.kt @@ -0,0 +1,68 @@ +package uk.akane.omni.ui.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updateLayoutParams +import uk.akane.omni.R +import uk.akane.omni.ui.MainActivity +import uk.akane.omni.ui.components.SwitchBottomSheet +import uk.akane.omni.ui.fragments.settings.MainSettingsFragment +import com.google.android.material.button.MaterialButton + +class RulerFragment : BaseFragment() { + + private lateinit var sheetMaterialButton: MaterialButton + private lateinit var settingsMaterialButton: MaterialButton + private lateinit var scaleTopView: View + + private var mainActivity: MainActivity? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + mainActivity = requireActivity() as MainActivity + + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val rootView = inflater.inflate(R.layout.fragment_ruler, container, false) + + sheetMaterialButton = rootView.findViewById(R.id.sheet_btn)!! + settingsMaterialButton = rootView.findViewById(R.id.settings_btn)!! + scaleTopView = rootView.findViewById(R.id.card_layout_2)!! + + settingsMaterialButton.setOnClickListener { + mainActivity!!.startFragment(MainSettingsFragment()) + } + + sheetMaterialButton.setOnClickListener { + SwitchBottomSheet(SwitchBottomSheet.CallFragmentType.RULER).show(parentFragmentManager, "switch_bottom_sheet") + } + return rootView + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + ViewCompat.setOnApplyWindowInsetsListener(view) { _, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + + settingsMaterialButton.updateLayoutParams { + bottomMargin = insets.bottom + resources.getDimensionPixelSize(R.dimen.sprt_btn_marginBottom) + } + + scaleTopView.updateLayoutParams { + topMargin = insets.top + resources.getDimensionPixelSize(R.dimen.ruler_cv_up) + } + + WindowInsetsCompat.CONSUMED + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/uk/akane/omni/ui/fragments/settings/MainSettingsFragment.kt b/app/src/main/java/uk/akane/omni/ui/fragments/settings/MainSettingsFragment.kt index b7815cb..06485f3 100644 --- a/app/src/main/java/uk/akane/omni/ui/fragments/settings/MainSettingsFragment.kt +++ b/app/src/main/java/uk/akane/omni/ui/fragments/settings/MainSettingsFragment.kt @@ -1,29 +1,10 @@ -/* - * Copyright (C) 2024 Akane Foundation - * - * Gramophone is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Gramophone is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package uk.akane.omni.ui.fragments.settings import android.os.Bundle import androidx.preference.Preference -import uk.akane.omni.BuildConfig import uk.akane.omni.R import uk.akane.omni.ui.fragments.BasePreferenceFragment import uk.akane.omni.ui.fragments.BaseSettingFragment -import uk.akane.omni.ui.fragments.CompassFragment class MainSettingsFragment : BaseSettingFragment( R.string.settings, @@ -33,7 +14,7 @@ class MainSettingsTopFragment : BasePreferenceFragment() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.settings_top, rootKey) val versionPrefs = findPreference("version") - versionPrefs!!.summary = BuildConfig.VERSION_NAME + versionPrefs!!.summary = requireContext().packageManager.getPackageInfo(requireContext().packageName, 0).versionName } } \ No newline at end of file diff --git a/app/src/main/java/uk/akane/omni/ui/viewmodels/OmniViewModel.kt b/app/src/main/java/uk/akane/omni/ui/viewmodels/OmniViewModel.kt index 22e68e1..df252ce 100644 --- a/app/src/main/java/uk/akane/omni/ui/viewmodels/OmniViewModel.kt +++ b/app/src/main/java/uk/akane/omni/ui/viewmodels/OmniViewModel.kt @@ -7,9 +7,15 @@ import androidx.lifecycle.ViewModel class OmniViewModel : ViewModel() { private val _lastKnownLocation = MutableLiveData() + private val _lastDegree = MutableLiveData() val lastKnownLocation: LiveData get() = _lastKnownLocation + val lastDegree: LiveData get() = _lastDegree fun setLastKnownLocation(location: Location) { _lastKnownLocation.value = location } + + fun setLastDegree(degree: Float) { + _lastDegree.value = degree + } } diff --git a/app/src/main/res/color/mtrl_btn_bg.xml b/app/src/main/res/color/mtrl_btn_bg.xml new file mode 100644 index 0000000..6ce362e --- /dev/null +++ b/app/src/main/res/color/mtrl_btn_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/mtrl_btn_icon.xml b/app/src/main/res/color/mtrl_btn_icon.xml new file mode 100644 index 0000000..dcfff5c --- /dev/null +++ b/app/src/main/res/color/mtrl_btn_icon.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_barometer.xml b/app/src/main/res/drawable/ic_barometer.xml new file mode 100644 index 0000000..53411d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_barometer.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_coordinate_format.xml b/app/src/main/res/drawable/ic_coordinate_format.xml new file mode 100644 index 0000000..1af87f4 --- /dev/null +++ b/app/src/main/res/drawable/ic_coordinate_format.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_directions.xml b/app/src/main/res/drawable/ic_directions.xml new file mode 100644 index 0000000..26823fe --- /dev/null +++ b/app/src/main/res/drawable/ic_directions.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_explorer.xml b/app/src/main/res/drawable/ic_explorer.xml index e617c01..65d3cf9 100644 --- a/app/src/main/res/drawable/ic_explorer.xml +++ b/app/src/main/res/drawable/ic_explorer.xml @@ -5,6 +5,6 @@ android:viewportHeight="960" android:tint="?attr/colorControlNormal"> diff --git a/app/src/main/res/drawable/ic_flashlight_on.xml b/app/src/main/res/drawable/ic_flashlight_on.xml new file mode 100644 index 0000000..59882fb --- /dev/null +++ b/app/src/main/res/drawable/ic_flashlight_on.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_notifications.xml b/app/src/main/res/drawable/ic_notifications.xml new file mode 100644 index 0000000..7746192 --- /dev/null +++ b/app/src/main/res/drawable/ic_notifications.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_omni.xml b/app/src/main/res/drawable/ic_omni.xml new file mode 100644 index 0000000..b3cb070 --- /dev/null +++ b/app/src/main/res/drawable/ic_omni.xml @@ -0,0 +1,17 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_pointer.xml b/app/src/main/res/drawable/ic_pointer.xml new file mode 100644 index 0000000..a8a9e72 --- /dev/null +++ b/app/src/main/res/drawable/ic_pointer.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_polygon_left.xml b/app/src/main/res/drawable/ic_polygon_left.xml new file mode 100644 index 0000000..0ccd9ff --- /dev/null +++ b/app/src/main/res/drawable/ic_polygon_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_polygon_right.xml b/app/src/main/res/drawable/ic_polygon_right.xml new file mode 100644 index 0000000..f081c23 --- /dev/null +++ b/app/src/main/res/drawable/ic_polygon_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_ruler.xml b/app/src/main/res/drawable/ic_ruler.xml new file mode 100644 index 0000000..fa23986 --- /dev/null +++ b/app/src/main/res/drawable/ic_ruler.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_straighten.xml b/app/src/main/res/drawable/ic_straighten.xml new file mode 100644 index 0000000..31e3ea8 --- /dev/null +++ b/app/src/main/res/drawable/ic_straighten.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_true_north.xml b/app/src/main/res/drawable/ic_true_north.xml new file mode 100644 index 0000000..9609e2d --- /dev/null +++ b/app/src/main/res/drawable/ic_true_north.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_vibration.xml b/app/src/main/res/drawable/ic_vibration.xml new file mode 100644 index 0000000..0e0bb1c --- /dev/null +++ b/app/src/main/res/drawable/ic_vibration.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/drawable/ruler_left.xml b/app/src/main/res/drawable/ruler_left.xml new file mode 100644 index 0000000..ade8885 --- /dev/null +++ b/app/src/main/res/drawable/ruler_left.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ruler_right.xml b/app/src/main/res/drawable/ruler_right.xml new file mode 100644 index 0000000..2839245 --- /dev/null +++ b/app/src/main/res/drawable/ruler_right.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_pref_down.xml b/app/src/main/res/drawable/shape_pref_down.xml new file mode 100644 index 0000000..741fb99 --- /dev/null +++ b/app/src/main/res/drawable/shape_pref_down.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_pref_mid.xml b/app/src/main/res/drawable/shape_pref_mid.xml new file mode 100644 index 0000000..969343b --- /dev/null +++ b/app/src/main/res/drawable/shape_pref_mid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_pref_single.xml b/app/src/main/res/drawable/shape_pref_single.xml new file mode 100644 index 0000000..2caba0f --- /dev/null +++ b/app/src/main/res/drawable/shape_pref_single.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_pref_up.xml b/app/src/main/res/drawable/shape_pref_up.xml new file mode 100644 index 0000000..c31577a --- /dev/null +++ b/app/src/main/res/drawable/shape_pref_up.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/font/hankengrotesk.ttf b/app/src/main/res/font/hankengrotesk.ttf deleted file mode 100644 index 0b92c2236fa2c685042a6e9f96f3f0baba8192e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129508 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 z 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Ⓢw3Fycy`{hD@958fcXBz6G<^a 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 U_211zC(Wq362PNUqy|O(Ul-U{MgRZ+ diff --git a/app/src/main/res/font/hankengrotesk.xml b/app/src/main/res/font/hankengrotesk.xml new file mode 100644 index 0000000..5012359 --- /dev/null +++ b/app/src/main/res/font/hankengrotesk.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/font/hg.ttf b/app/src/main/res/font/hg.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8b01d1540dae5d5832e100a1b313938b4b87c4b6 GIT binary patch literal 66580 zcmdSC2YgkebgMdJQ0D(Xt1r$+00R;;PUa_DeasexL z!HU>Gv0PC^Y=DXdRBWgyIlu2(yPT5{8JPiNNFOiQ?H{4#`3MtI&#AUpqvdW)S68Pmc1f`rCA8K#yK^Y%u{cOFF_vzdi&g(Ikh*Re8+~QzDD@sc@0g?qc0uR zMTqpyLWF%aud#OCOxtxUK<@*3_np$Q;$iFcxE0dj5dOFdwNoq=o?@zSqdS*BD^Vfk zuUr2G-erzqX9v3lw44oqRl$r%sCB5}HNDGjXR=F0JX8~JPJYYB6 ztyW`kKTx~MiK4TF7My>ZgmCl~_R9=RRe4#p*e&dTDlLzeuVoLrkn1U2ey4WfV%Jg^ zF9RmtL2x8F$xr|n21h!P>IUS&O*N@SkYkCuN_eOh>U!a;HmJ=aOl?)$L;~pC)Ec!` z-KhSlwj*yIVw#vBhKnlE7u+&LXHa;E59G`875S=sP41PgDi1i6g#1~*&e5-)`qdxl zMnJ1l*#Y@66t9N`>DRvyLhv-W>Ea;#5AajskoW`epRzaj_mO?zm&lp$XUUh~zbyAc z&#kgmD3u2}l&Vk_NT;9b2fx4S51;aD;rv>V-|c{(R8N5?3|Mp*MWR9s6_dm)(E=O0 zPHYgH#iQamu~!@rpNSLVH))anGFqm}d|4`M<$SqGzAZnJU&)`PLwTz-q+6;6tEs9% zEmA9?w~gun^_1G9-c%o|FV&Cgti{t3YKga`TP9hWEITaESYERnuzY4YVfoGKXN|I^ zShK9f)&bU0)*9;^>!sEe*0t7+*6r5EtuI(#x1O;6=4NrTyQRDJbnE9f!fm44EVmZ7 z^=|jOJ>~Y2+uLp*+1zXawqn~n+hW@_wwr95Y!BF;we7XNXFFm$Y5U#X>K@=8cuXVrO{XX|6-H&-Fk3^4&9&0>q_t@s~sK;qf<>}`c>6zr&!?W3Q zh38t&jh@>*AMW(UjAOuUa4N$UVXf(y(W1zcrEd|!Rt1!tzM6MJ@2*8 z>r<~kz1_Woy*qiQc~^Q*@Sf@2U{AoC0fz!U5BMqIY@kPAa9~_u*TB5M zlEA@%V*{rJHUvHz_(4!*(6FEhK{J9HgRTf#6?A{lQ$c%z-VFLM=!>8qg3biH1qTF2 z2X_h13GNd-Jow_^*})5fmj&Muygm4_;QhfL1fL4=35f_v3h5EjGo&(PWyrlDPlUV} zvOna5kk3P-LsLR0gx(N(Tj)PS9}ayc^wrS!Lyv@>2t6Gp!+gUc!ji%=!uo~{4Vx6! z5Ozh_s<4~FHig|E_H@`QVgCyE39kxY9)4f=6XCnV--z&wh>A##$cX3}Q5kV}#48a$ zMEn_Piwum+i!6;C962^}YUJF=MUg8aZ;ZSn^1;aGBKJpr9C;%0bd-$pjf#j$jLMA~ z7Ikq{T~tfdvZ!049*o)*^>WnPQ6EJekNPRgaLN+oB(helB`% z^n1}qqEEz(kC`4bKW1^vH8D5E+!gas%yTh&W8RB767xgMnOIwFP;6{$=h*DnlGy6l zak0~58)KKnUKhJDc3bRYu`k8G9eX(Tc1@&p?AXYgewwuCLBogPOL~Ao47Ucv!u|Zw4|{~ z>yjQyI-YD#&PiUD{7mw`4VcJr#Gd4)vb58aoyhPp3!}2_buHIcK^KlZ#{f^bm`I9#F zih?Z#?-v{^__k0L_9!eV99%fAa7N*x!mA566mBbgq3}deKv8T_QPJR{aYYS9mla)8 z^l;JpMaPPMDEhOfXV1u<89n>;yrk!*o;!Pf(DQV!9=$H^wW`;{y`Jm!My~_C{^;%B zJGpna-i5s@dynWnz4wCND|_GB`}N+ZdY>&$E6y&ysJHo}x4QS`F_Fe4Y;b zh+guH4*SXk^e`HYpU6YoufdTbN?fDC=qP-IE~livuUW?{^dGv+(jvUXXdQ2L$}imz zcYuz!p%*UFVR!J!(qRwud)$XxJ*6l3gz0!M#P!l)Z$JXQaD$j5YQ$X8A5zqadQpcl zQ7Nu9xXwmTb_wu}xGM!^J^E7PIzrSUW}SII828g~-vaC)TxW=xi0O>)#EnEq9a0>F z7zSMx%PnjMWqI%0(GUoS=VKincPj#%rH4)mpQzIotHsCSZwazQTM{juEd`bq%N3Rtma8o{S?;wwYuOza zA6F5#BJR$(KkT9QD0`ee(Vk+@v=`aS?alTF?2p(Vx9_w+7ata%5T6o1F@A0Qx&)PA zOYlz!N(fDeN{CBHOQ=eioKTzm`kxAOKmpxkp!RIiCEFx-$T#J2`K>&oB2<@jw`J=vaNFJ#H?hh&erNH$)V%ngzS zwvlWaB%|4>kas~k(R#1AyA?Cywtua^v_9Fo-@!9Y3UOTSxXjVysCUeAOl;lVdIjP& zx8}Ddwg$FhwoZRXPYH31T6+FF*8Aw`qxT+Ne)O)R8xeNP(HoEUI2wDj&ykyt96j>s zkvbucV7_;x_mS!&6-Nq>gnjnA5Fc;1y^6BE1q>eN`8ojgllq0r%x3XGnMG*aVG2Q( z7)zWb#ke=FmIMO=O%&1K3M$J%%VEo>mM@&4z#VqI(_qW%z{5HJEW0&W{-LZY6SJoN zs$LbLh5A0?Gi4`rQFe{EA-hB=<~xwr09fpEmd@d6%R&_ z&>v%hM6|Wk2hI{p#5^@hTrO@G|3JCjDjpVB$~y6l_)r`bKZviycjA;djg^L0DW$ti zlCjb*-Kmf%Vx;UQM#~;DLyVPKVw}to7s+ffUgnAkGEYpBg`x&_I9c|T zMWR;r6_?4;Vx}w;i{vP=RE`%b-2*xJOS1-CdPF^;9#s#j z0<ScTP^tJPAhAzZ7jQCDG>f0?>m^p)Xa3f3hal-G#+^bf^{4txzDje@)26uPlUVp6r;b-up0ES$ij#(2kS=p(odvGCAvwg z=#Eii4`~zW7*!6D$zqU96!YaE(Ikh6*|Jj1kyT=@>@OPR08uadi559jER@5=C31wg zRE`u2QEY?hacyW}FY3v0w<@&@q)R-~Si>#%~6u2NMO z)m3#?WvX0xDnI3~EUHosQd87)HB*gL6V!NlR%9X9f&Y`vvQz|;Qx}P9wHxVmh61l4bYt9Fs`M* z|AMP8u7_1;5o5YV;0GsvXzNrh-}_qnA$&_m&hfj6KM8sN7o6o!q|+6$EELNuHo&6+ zySf~aqB?SCKsQkMpX1hwDs>@u95fxdj^hPdo)h8iomwVB)i~jEL02j4%EeKcu#Vf? zJlSM>dxO28Y>%RhE1@4PUi&gJWJZ2SMpGW7X*mP^#E8uQNoScVGRdJFs+0}aj@&@t zXN$h-JEr?@l?N@dmr|n3d0ispN<`gCbbO4~vkzQ9%{e|4$54+n_qiU1aL3z#^X1D# z>-Yw+)Nqcka5daVDg=DVfj?T?O7wk|`qfu%=lftwFD;yC)N@!D*JR;1D%tT1-(M_d zs1oSqf5BP)$@;HSO=2d>D^qTO?3zo(wXZxVI(6jGmQ=}c!b{E*p>hYV12hNuOaEJ) zC+znm+OhV|LqsbIyMU92M6#>H7{r%#JP7$dpYww4oX@qdJ7n9gIM^NRqbKa*pmrsg z?d2=%3fK zs0@({HwUfb zuE)qCgy)Gw4f?iR#(8;({)yi|l`qEO|PgGS0d^)=0NVKX-guaa>UcG*}~GSV)GmJNsB zePGEryYv}cQe_w44z3<#7kh^cDz}TR!>b3|#d2)H+r^ZT!w1^2Ybvl#K=XTv8KD)U zej8>0L6{|kU~U$MnF!|N9Z&>bkRsrM6#f^a@Vg*|?*%EmFG%5aK?=_cQh1z0;mbO; zm^yXUXu6PGHeMa-*5^FDoaN)nE3&4hzF8Jet!b*21yiTanJ3fPkC|3qH$#R^o7*r) z225|PnJR5S)JTCRBI?B%_J3jjd-lI({}}rpvwx8Nci4ZO{g>H)es0U0MzOP@aoSw* za8px8rnnD&me>M6Tin^yGOvkOcqG{l?24WskXT?Jue`6e?ek~LNGmtA)zDk>6r#8lHpr;H71tt@iYjqN$}}e2{-f+ru`i+e7$Oxy87}SWjDTu`ajHGk-&@L#*kRZ!ND|?z7Ze##u@& zU9tA$Vd<)NV?O?x?-Q?!H^hGNrg#gr{2lQx@h*1u-xKePgL0ePF7K81$@}F4@f{yQK2eKg<~BuQbpkz zfGg-Z3bkE-#-KlR1mOR2SWp*4DPWsS?74Qpu%&r}3rU4zQe zgLNy#5R|+f7UP3^D|XS8iYADkxwr`VOTn5_1gyx1pT)?Oui=S|X!Pg`t8TBNzYD;M z+bevfc(})E@;Dd%^wbBXWu@mmWCS1yxiAXR@ge%vswxn>L^_yaB7CFt{UFUg`8qjZ zt#H%DAz1?3B#4Dt%FosHJSv8${0h5GWQ*MW&M`Z2DSe=(Z@1yCf(gowxyt8D+qtvO4BvxNL z2*+xl9xgN6rJkavJ_aF_7D|LT@g40%xZuE>@)*j#RY*) zz0?B8x=OXczg9KFUxxXZQdhcAEMkgFnc@L2E)%)AL=l8;vKd z_@~)~JEv`6sGYXrS*Xj9>lJDR{HxU}`2SEhlT46zv09A#4M>CHXmTs`ErBvdrd>cP z^d+>q4*t!mMJ-SZ)g|guJP&mlX#s1dt2iC1k5+LdR_`$`=DI@qz*C2u9`ziscC-RQ zz9IMHO0|h7j9P0k^B_16o}33S=Isk=;!_El5bWer4w$35L9Kz&-H3cDohCu&OZAm< zPS3&-$LrCWQTZSzIwjeBI(owA#ZI)&4~VVePV~I%@SNC6aRplLxoBx7!zxFj9I8k< zt@Q+lXyK05x~uTu+Up6f$IuEWc~qW&e?)!@|1cAXxBc$PTTLeevEys-*Ej% zekn0)k%#3M@>fuOC_jgvE}wv(ARmT*m)weQYWH{G?hcG=mE0)rfqy&ZDoWla?}mS? z+{C)j>eDf-9Pc}CPdNg0?R7l+_6FKfqsK(uYS(M-JEz|?`pgaJGjBn!`MTb3qE2?u zcYcUGeS~~|f}DQ_O&o=0I_yvJd?WR!=hg?Uk2Pw=c08$wnxXf&)C!!h&mE4E8jn5F zDJZpiq4m9JFWU9LhtBDN|o^GOxoVAK(gG-|PH7Af}1 zC|Gn1cAnzI>#~!y!$LHjB*|o~taQa#B}JxUe9{FLpC;4L2c=_QXg_w_dhp2W4EBfK z#yB8LX3HF`GvvxV>~rK}pQAt)$|6atF&G`Oc8jsI)tCF`Eb$I@xXQ%8WI6V^Dxvi% zF#|gv2jl>ZfCgdzYly6tLopT_j=hf?u?n#RyJy*$x#nQ~VU!$=ot`{7R(yfyM=!!Y z*?6orOu+6K_WkfI>w9uC)+^q}ZqyWv1*ghsc)D}CoPnOC4ts*LWj#uFF6}(Z2JEcO z$9fD_1H=ieXFS8DzCbR-4pVRJupGxY>@vAnUXH!fj#T9ZT#%I^?&f>N5 zIv%O5k!$6R*k4~SZ<7DOZdEzm1uwF(KuE#I!ChDGs0LFyGQ0|7USdr;t%JT z7W;S@)nYvQ0rt!=wndw^5aZjIv8!Y}-@8u?MvbNxc?fph-@?ws+wvXxFZnLUsY9_Z zcmPicye|*R4=_r(M1F`p+Doa1W2euoxK z`=>u(NAVPP&i;}=%Adq4tkwK1f5HChX*}P2h5QZe^l#~&iF_*3gh=NYAo93U$A$3 z8hhj8)Oa;PU92XmNoq1ypK8<;Jbye5D?ovm>&0R`en0xYdoTywjJeR&nAO?PhxSp^ z)eP+B)nUhaHum4=sJUoe=c)NvEegQM2D1;0a!N7d^Fa?iSrm)DJdb)@JRzPGPhp4s zKJGc(Fh<(y?By}X^Tf6Kp-tYXmSdE18`|c7s+H(-J;bZ}NMg0v zh4I*R>U!$g`APM4YQ4IN+sF+VGu?_Y)9n~B-GQFtE{vq~krR3eZDxi!kh&lH_7AFu z)DG`3EXS+DWT!{b z1uZRcuh0dn&;--NIb#`_1(mjboRW7xr*K4)k(rg{)vq1btPE?_l$u8GDkrV#Kfu=C z)HF0$sU=XRYpATiy}vF%e@y^e|K_^-X|>*zNJdUcMs`M~_W&nDE%EF;+aOk&ZIG#m zjLhs(>mZ0^8=?gbaS6)F)zZz;OR})sQZaXit=dJj@=T4STvuPYuA_2Yjpcfwmm6x< z3%{(wt$Jod<6J$qp0NremQGc!7g9xrZ}rR;6n$gMocfxUX7_46`>fQ867TA!`kJPh zS`LQm7nh9W=GjIt)_X)drDSF50vA?TN1_;PBVD59u{ar7nI*PSu6fSZq^{8OR*~m6 z%9)o6onfV}kqRSkdY&pOd`Gp(%P2iBqqL%Q8%0KL8^r}`8>5Lm#woVvm}zyjjkQg6 zO|~&J8fzBRdSB!W)C8-{v0cPL`Yr1|BP(0iZe@XO9JBQrXWF7aYcjjEJ1xm!F;TnE z$u;hM5T034n%A8c<+PiUGQROEG30R#%itS-XN`0TEYrC7RkVrd@2qYvw50_aBWJDQ zd%yl|;%Wkwm2j9RnX?OvoE(>%a*dx~bw}~F3~9_Nvb2OobwF6*%CS<*s-IabTD*%o zh*zn_^LMJ9X)Pls&9v2+28I?=ukWS#S^<{om8?`Zyi%^0XczSAQKHw=5~HQnhetInq++r36Nx*EM@t#P)jHMN?}O?8@;*HqI`Y}2@c*lJl`Tdi4LU>!y?r6*se zCs(G6U6$)rYx2=^rb}2_>Rzi$RNJOWdcgHzTt=!?TVJ8+#U-9A&zO$_iE8EcZHHlsdg}t>e1L$z^5dYmIE4*2vCs zCZUOwo$oVyMq_R5-1?fi)9R+$>RFk#dQ(qmam%drkk~d?)AQUKdP%UcVcyJI+gum2 z9KFfZTH%bWd~AfFVQ6s8h|yjet+1}na$V!)x?z+XC88ThS*2Tpv&AacGhboE(y7Yz z@~p`8ZD`YCHR$@$THjLd2A9?sI|JyRZH+D&$<4PlX<2P*r>(5aLTfX%y3H=+c`OE6 z-BMeNYhI1kR?kyKzFUhk4;6aOD|Jm&7yK(k2frMjrH5w}o5X7OmA?sENDK zDX!;2qdwafYOU_2&OptEDsyd@y0*HkbF{j;Rx1l_idxXSL(Z zfd*&&rZk_DF?xz}zVWLubm$t!@?`rvTNszXGL4I0ZJUVx&Q^qJ+liBHtJ9LJYZJ@Q ztn#i2lxjD6P3IfiEWUVB9d#i^U+BzHc_H8UHMB`W?>Sig*?uh@g}E}R)UxhpnwG}% z(hlNPYVrJ?ro*%$?TWY~q}GpFrcavg1~;jW{d#V!vJ16=UAERyWMr3?c`mALZ0JtA zd>$BaYe4ft4dc~36Ac^VJf}CbH0n^@0-dg@?h;0MHDQi0R|9M7@B*<$IJZt`sHH)> zew+palm-EM8U$)-Xb`2rbd(0uX=yO1rNM-p21AgZ@iTo`Y7K7ko(@hr?87Yd8`eig zDYqgS8Kv65FGK5avoi8EJ!O<+c-G8qXs)fVt*g;Am|wv)BRju>bss$QQZ(apC!q(Z zX|8STPFtizn1y!04|#-1p=ZE5=e3RA^J*LG8m4hHuc;074RaavYpR`7=e+f;t*@_} zhru2Pde>euwZ3K!!~PmPtzn@S(RY4JZBuid&L+^fGsA)n`>No5S^8knd?zIXI}HAO|{J&Au~&3m6f3-k)aKRvNEzW zy{FYJsGC;Ha(mS@Ha0A5B-`_3u)cPBGxyus8F@T8qJ~m~GhFb6E^xLEgEv}WjhOkeyMg zOHkGw+w(e3Gt%q~ZQ6<4==c&(?!{bU=lITSXqa6yrC~v>3zoZgXin#oS?UAxoKjog zu+T}Q={qAkOY6Z5R?o8-|2v!?1+o`Pni&6z!C zHuipKS4Vp)1e-ccrSY@bXIZXLljUDn9i}q~=u8CKm7}L2!r%wc4tJ+xfJ7&H#*EHO zFsN{cwb_mE>8;Ep@jHG$;mwNU;t1A)-ovv6d-2@Cvsfp4xYNo`OR-Y6g?Eac)c1;( zibbLsyG1jx_b>tPz6})vLcR#0R1R3MBPaH&`SAByeu4kGiPa90A?-Yo`h0o+8mu_(g}ooZo}BU!>A{3Lb= zeXviIWIVe7%uGiW{FRP)`0E{%=d0PD>KG165exZZpNGR9OYA&2dIG`qtPIcqLpz4Q zU@ybMDbS9zir5>mC*oPG_J+XjB=$u|!~cP(vEoZ5LVKP)!13XB?mpbRx-GcB6Ydtc zb#T|g8Q~OnB^-qj`EH`min9wCA)Ci~^nh;UbO=vQpaf}-YXb3}9CRA!d6xxeJ^GuvGGy}M< za7j^4D6Rus1aLu7KJaZO1g07;@{9@nVnV3HdMI#_UsK%3V?0} z@0fJ2o6yS!M09#;&zsOr#C?=<9{B*=R)#hKx{aZmOy~v^LOY^|65W+d=L}tJhAsd! z4{lbZ6Pjk?CIT88Ih3W3|wTT3H3FhA`^1roDlKLVJ_WGy3Qt)U_xfPkufGN z3{U`s5RqOcWHq3ORv{vOr%;A|V!DYDCnJsnb0l(*2{~~D9p=!sIF1qV9zxz?etQA! zVdz;CdeVd_^kEKdi_>D&{Y6mtX%jkSKoJ!BEr)&q=u?Icnb5l?M4|gR^wl=F-Hdx0xW^fK2+(%8&EZaH zqbn`~)})8t%+T8K)i{0T3c#0`P@@Ueo6vL|4g9dZ8q7(>jsRVGww zLQa0YOq?@D9&(VuI_L^0iJ>?XLOZ16f=tNAglvE)f(SbU_X|Vco6y%Lbj*Z^?qjAq zXyV>6q1R35Wdm}SN7(a7O)Dd3$(T^2S(797!iKmuM!_z^c5;7-Qr4ibN70^YeJ$)t z$2|bt5Rxhqc?jD|ZF|@zquq5v)GF(tw}BQ8_csCJ)-iG-?rz|A&1_4;u7NCCD}eeN zb|ux{u*I%*M#Dv*&gh{F%rZi`h0S9tF`=+ohVH|rAvI0oq*J5~f2^UQu;I8H6jlkp zuL%{IP>u-^t~=8?ah=W31QT+`jWKayCPX-mOMr>2M(o`E>w!m^fuZCSAy11}+3ODs&MZXFcTteQV;r zK**;dhv2_!Liy{o7EY+s*u*Ht8NWAj%71O6?&77vkg$yU=6_-3w?l({41O zn@wn~2_bJGtC^0V!cO(n zssNR8C~Q&>B|4TM)Wn7KGD1W0LNY?S;=HvuoVsQ}K^;IoCeCI;gcB4u_>6%I{>6m8 zH=qzFKT1uD@wE{ee9VA4l;v+@1b=MA4L)c>?--B^zYcQg68H6xjNq4{k+|UJg$UjW z_h|3~@VAmCgEzt526t2N4e+mF+?6J@*n}u_0f){5G>f5WCN$B6D0D1`qFvMJ2semv zmBD?3i*T0{+&#E+Z~~y1U?+~CFb*XsfFZA7Yfx*@?>NNrClfl^0d)LaTrkBw!f_9q zq3;GCbZ6gsE5_) zs6`68j$;s)l>~*aHK3rSCbY9J)OQE)3QcIT0O4QDP67Q!by-BfrqGl34GVJPV2b+h7FNj1-?pF?1Tb$BOh!-flmWsiwHt) z0w1T;0v`g7%QA2~Al7~0en6~U9uw{%x{y53vV7rRz@i{6?l+Q8e}Ok^SNIa|xxWa1 zKlw6;FnF?`FyAre9tYkdk!}nxU_XRb&ZIBH@$4t?T3RE)qLJbGjJL8M$bKZp@?kiL z{a~HXZgBH<;C&IKyOe#xbfq;+8R1ALnBSzK^KYfh;5D@GaJ~&BWck0NP)LaNPx!>4 z6R(TD%=DXSRS$TI>&84cJFx02t(?;Zj9Rxv35u_B)KnRhO+-5^9g4EYxyXJa*j5VY~l&_-xc7Gb>*uNI#J~Veu-(eaZX?6 zxFZ<9lkvMb*4LDl_)v!_k7<-5p2-yCGv&=3`aDY_IrMoBeV#()laA}*GY34?O&HX8 z@;UB5C=_K%I!xx!0~~sQ;ds`@bmkn-+UUvJIKr3&T49#yw8AXyw6-kcSwHa_%vy?P z%4r%0%Bh^p{Nu@27QFqASe%v*^GC}F%=L`9li@oF7E?Kok6Bg#z7nV2NIaiPl+heI zkNJBu{1xX#dq=X7wf6*t;yG&K(})L)rI=4?!CwmhTF#MXb@NGn;7R9?bFBFs>vl>D z@Ak3J_$FSZ-%M-2qKQ+tvaYOZH>9$1-mQ!ecBFykHjcZE3=j+@4k zyu-1AShq2(+W^*Q1nV}CIR`S$NcP9G9wOKeWS&o|$>5wq76h3>Pw7$S}WsEWHWFxjH20LdLhSwx4D`Eu8B$ zoa-FMETBCyxt{jRDYNiGO*&i(oE>i(M&a#7eCq)3k6H0f8J)c%aE9Qy?lf@i9mdt-TkHXT z0rx5Lj*&Co!xwnVP~km&j5ql^yFtUp4&&zlRjP|psUTsia;O}F2FZ+Mt zR6?q0&7hwTDW%vg6X3tWJU6qygZ-)OU&{Pfa&63DcsBdH*x$hZz3dNTpGP)$SB|85 zf&IPg?}Lvg5b(|`w8-y}()Sd$<82#-U0@aUG(BAq8bCXr5sjhiuqRC8sCIvjGwl$6 zbL)6t3v~SKB*Hu7|6_lSPtRqIbL=kor^$rV@bKq2;MmI7(~i3xJIx&Yt1T0pDi2eg1R&+L7Fj_q4NF9X~naI6iU0?ID~gCLDjjxuoGB z%NAxjx^@hXCjLjJ(rEv1o(S7Mh5zckA&GHq8{hH1<9AM1*8;;w+S0h*IesFS z7V-xxg|<#mxZ^W}O1o<1%ppHGK5`9neCl|+W64~pIOg&880S4{-1Sehey!fLO%JlU zl#FW}C+wiU7=Ol9yL0+Z9XN4Ls3R+KhIRy*mf%v)UAeT+9VDZ+QU5dQi*bM9tK&g% zc-yg+>(0ZDN2z8x9>$4!{D%@jI53|$cJUQ>E?<s)As*dx|@rwg% zPaXfcrr=89_`#?fjx&IdXkiA;qJBMqVVO0PMt(}EnU9JiUa+Rl<4FLR7n z*?+}BV`}_4*1^4^!RPa}+Jv4CJsfJ=M`YuU{YJh3b03H65#m4^G_>eI8%VL>o9!^& zIsY8ryTC_4_k;8PKY<+YX|c3kLWlnYo`2u!x{e}T+qVCT#IE(rfpHzB=y=D$wb`g$ z20xen==-+)18U`)7iwP|cZ2hL7^~3r9>*5P!?g@c*Hj@SnDI z|Gj#qUd8xx9U--EQ4E?3T@9N(A05w;&?3?wwVHZQs@uKU;}{giXq?BVdJlcv@r)Lq zd0b#bkDZ%y{-|Hj+8vC8&AE>z2}1TbBRF1j!W~1-_~!{fgA;}M4|R<8SUUW3{K)kW z<3Ezj82>wtI!?NlN&BeOFOyCX<3UQraRlQDx<72zk{|Uk(T~*XAcUx1)c82inrJiW zw!NS;6{A<xy@U+m9Zo ze0bEf*LCEe#c12QJImhjCyxj)db&`Gj%PvhDe_0xeU8^ila6PN+Tb{)*&asrY@wuG z)(WhMb<6F``O4YgLb6i3$|ZnR5Pe+M)0eoOpQyo(d{w&Ogp9Ptyr-?IZ}SUrVr&o<&* zsyFcMo`d+UkVo)ai4)hp#i?6(20&he^PYU$GT)Ic**|r!80bLd%7Ki)4|A!9GM^z$G|AP2vQ#34kxg%6u?RQo~zN_=?gL zV5VZ1ArNP$)!|gPSvWZ@1m~t*iBk}-!pZE3D5Gm|KKm-U3TLpb#_7F@_)gI}VAji< z@vVXl_^N>~PC>&tPdEu}D|l|h$!2ai*X(}4J5b)Z&^#rd0?khOH1N+zoGyiP zd3S@)i}FSA!P&f^q^|-8kY!+(;sDM_4aZr7pTPf0eg&VN4(To(I7c=NXNKWnXPg^` zlag_6uEMG57KJnNael59uQs_UHxY+(#B8Dy&eC-kc6_UfPX32gi9DPn=8G>+`r|aQ zFq{S)06sVo7<__NFyIgs0uG@n6db}-7&wHhaBzsiK35n{z=ieEIb-nSu``#A?_ee1 z4EjWz-kydN$CB`^%Vc~}pc`zr3(g4ZiZ8Du;Owz9!09R-FwP#s_XX%X$8KcVINNhJ zzTDx43{8T4N8n1|uynO@AGYyO*jPUBWaXi3<;iU2-drQy*}mOj-=jf22DLMgYiA(W zP8;gZ5?J0+{H(C}W#B~?pUM^=%@*&=79R$S--vTp@4yLUemIG28(^~j&TRd3>fl2- zH_&PQ;cWeZZ2gL@--oT=%GU4AZGa6{|1P+Z-3PhYeK^~F49*iX?7l0$`t>{N#vkI0 zu;Y6le?lLB;b+H}!2DrVR38$#K6s!$M8Ur4yv|tEgbaLlAroy(0Bn66_PoZ!;@#Nd zyRpSv*y3Z^;^WxjgW2NK+2SMF;w4+WCtG|7TYL{#ykYB6Z0iBA^1EQcn_%l6Y~}tq zyYC^SMYgWlw}tIn!oHtJU7}O^G%JsSmG42^mtgB2u=SUbmsjK~kpETrDkOgmCospN zZ8YkDqSg`Lk3j1PAFU&Nssm|k$K9!Q#1{w1hVY~dzTjiU##^YzmH)-xSdXzDQSM*6 z{2p@WAMh9afpW5YR-2!XyN~TH^LG=zZ2fQiJjU9l*a~c3+RyEsHotXl#&4)wknyvg zwBC2lZ?Tnswzmu&xPNWr!97cp!!3woEw)av_QfyC3bh$O%W3*Cp2Gh2XE|hf+Vuy1 z_*pjc?+Sdo5I<{Q%VhmGz~cO+M}ZrQW=f+lzkOn~y>Zu^xTpcGU5?+^1i~_4#_#;}67I z)Y~&S|L-r=3FN1hI5X^mj2wFpo-*L{Vkl6V}D=yGt3)JdB$Dih%Rbf8BcRohAvH|0Tul^9V zjrXemaGXAekGl+Td?RN$zLm=zClKcY#Q7RMgO&r` zr#gN_f1^od#Bn#$Kp#r+4k6wb6c25^KnwbZ<2X|^IDTV^b*_5oAdLauUrE!XR5a1I;? zOezmh{Ryf+LG`O#&$%EzM@$N&;5Y?}pLM-_V1{_3?-Ak}j6QF|6(t9GzX$bKRC$ef}H+p*?JIli{mcIt>kYfiZKSk~yM(!Szb&kV`@d;u)OfewMTabAda{ZQ4 zn!Gr*ayaH&*I+Jo6Vm(x`~w^xA=U?obrP{&K|0@{7m<#gpnM;cCy~y-K=~HZ*^hMI zK|0@q`cqJ!LK;6HjU!0oeWbxTW+`_d_94Xn60x5}>}Od6fw)d}JOd72BF!JbWgobF z0WP0|%iG|{O};+RCuw9i#t8xvofJD+ucwfw zuaT$kpuZOl%j7zPcjh7UHOR*rtRHO$Uy|Y>%*%IR6@91UGnQRAzC>C-Agw>mwEQ)T zLON?4tB{AIh`kQ6Z$r%MxNQh<9MG-nE!hCAEO)#HF0XRBWFNn=2L6DS103%`UvDGV z-+}67P#vYT@D$G)*xz>SLfi{2?*Ko&-pl1|{ii_nhbd7o^70_~9t7VnP?`s!$)n)? zBXWNjxj%#w{SN8;h;)u1ouhIU(p>NOP}7RzxKXmi5v8kX=1<7*4rKTkGJFfoya_qp zXs4O)+sHwsa2m0GL#$u86m~#*vI|I!7FQt6GqAzarsV#hJ`U=mNaJfg#zD=JK#g_| z(w>2|zw4It4buC~j7|1&TCdZ8AiuxpTK`Gc`YGrWnnIqukj~vGt1pq(4y3gcdD)7Q z99iu9NaFw~-{JC6IQ^bZia(4Qk-HF0f$@RK@qzJK^48Xsa(wGQ<>A&8ySxqk6M6uQ zj(4FgM+!|if;!P+$LVuhP7UiAu4Y>d+EkoFPb&}Si*ttyr=upPO)l8?P3&DR zSf`9D#X=VuZ#1blEOg3v(8S)VVOd6l){xO1XYac5a>lyFh1aJhuiHDs-sXaJO1T8H z2i7E|taj-<+%@f(8g|kz!&&W4&95}+uf-g|i63O*SK};Vjeicl)#~KGj=msf@*iu` z-;Fs*vx$F1$EPaBQ^`x5_hN?6*28UTb3M$8?8Gt*wng7sf^Efzn!mtAGO|z@naXRu zQTA=!EgM=33O-AVIj(k9e=+o{YE^&srY*yUX}m4N*xDjBYm@UZMzV-%B#{E{emJ3~ z6WMrnR#<3=%{`3##MJDp+?2T@DF!SNl8qw*+N6Y z!oWB`+-8%_lW!b0?8eD;w7)7 zqZXGBDvKLG3wdJhoTnH)PZ3-$?eQzc-8w#pq=9}l`WrF#qw><|$wD>!2GBe4WG5Pa zskA|7igiX$3DXy&OpTGQ@<>TgSM`hcKl}7UGbdkkc}dBoqh_jIyYAik$gtd&Ns|^9 zAU(`~=qY3HP2k$P{yZio!5BX-XZoj7pzmtB{)~!DWwy?6e%;FBx0Rw zxnhYr$n7$mpXB62ZGlFAExudf#8X?K;aB5HXpMgkPGzSu)$r@^HBzU3s7@0eb$SX4 zjxFwK^(ySjuGft05UL7P#}aJrsa#E{2HIq9e5hP7?Z)b{i|5V1Y;og|Inl$C|1qa_ zU3K-1tt(W8&)9qBtys5i#flp$2G}P}8*}%(d7H<|)beuOMj~J%o-Q^LSS|OpuA#Pq z?W6T&ms;BSZ)$0=%FPW&I}n(d8t$iL!^Aa1+gI15L48w0UTz)Y;~!Lh(YduYBx_7r zcCYHzb=P=j^on)XFY3LD*g7`iRCy9W% ziEAz6F+NBm>1jVnhH$MVJZkM@pr)N68SFy6((yP`Yj~=O8kZG19#4fxZx{L{j^|i6 z1Hkhk7yMGJ@{!I4;HmS6IJa7=Ya%Jt!=T>gLcPp!FH@HS|BZ!ekCy7S=*38OJiRI{ z7Sg3#8}{p&8=*L|#WmoXNqJ6f8X??rSGgR$Ka=rM?`H8r36kleud-1tDM zFQR6#`xv(Y#r;ZJPs;k-X+8^Pcn+$XI9ATBZY>_xT#URh2bP-VgEaE`kfqS@q$>@- zg4zPTkDS3J=T7bI!dwjSU>ot4e0*YK{DQOJj+GaES1N-(ohN5wh=*d83wyT?;8>`J5d!1qoGkJ)}3>U%z>C)%mi{~Z$fvqZs(!DRd47K|_g ztFQbh;G<<@-4Bia&>b>)ORNpW9ZH!3K98vR;)%g)H5E1#v}1oh8& z+GQBgLmrHEFrqOfa?j;1Iwv=qnpVg+B@pu66|^HhC17mgV2JsW>J2gboPBXe&&ZSz zZ(q;o&gGq*X^}0G3~0wMBU`N2Q;Ke5i#aK&$UfA-36oJi6Oa_5yrVrc)7;#U-dIk# zQ`rtTYmwEO(aAT^ozm3PFHRrSUGF1yVeI5j<1&}g6L$-###loiMj7L$DeHy}Usuz= zuBfQ4KM$gO#%->jvw7UO&2un@8d<)0B*sr=i${-ITt>N~7Ihbw#B{ABFcPKOuHmU= z*6GmYg4}-SDKY=znH^8< zYzc`N)>!g`rOS-vouSjSrcLti8ZuONe`4J3);SH`%TrS;y5T*%9%Fltsr8ht|B^-C ztanjNx&L2gXTtEB!}%UtE@2oYc8rkD@UdITMRZr+2ChFHK9xjY}%e z=sh;GXu9{@@u8LdQ>ZkQ#Xs{)!K(_~rCdbOH(_KYkpn^opD#%pX@m%hm<{W6Qj^yrZ~BDotfUN|nN zH{MaKK6|rw_V}J*l>_4Pkp1M4i0nZ&2`af9S?Z?XGUbT$Z`C z!NUR;Q0i6ag)nTQ`Uwlj#qdE}7|3JLCi^YEYHa*~UcCk;jJe8Z<(2Ze*1>&7r*|9O zM?TtGwR{!iU=Az?t?bi??l+c0!&5&-c#M^okQD8yR|;*tNW)XvXg8}L+s!RJ-W3XI?gPpv%g zZE`nUIpaCQUFGN~zNQbY=u@$muQw+BeQ9oDrIWxw>4ix9<6CT zi4oMJYRFj(bR`|1XW0r$jCY$X*}=i|kMV4_<@5a$?!Ig6U7IHCA9KIo{fM$(`JMeq ztPGA{tnJAJ{ii z)TwFx^bO8$d+y8dtP+*5hNn@Img=>5!orECS)Ybqt=9*Qo=RAgX7hL|H#_o4=Kzp) za%DK?b)hmfKGZJn_Gz6hkG4+tmX8cnMbXs*&b|}C^CgbKxyAkh*AH#owmsfxo!aA< ziajhR<{52fM*2JoZB|FKk3dINo3;1ty!&9Ty>lpOT0*8&ytR7>S7_X2#rk?Z)Lm`G zlWC+W=E)kTSngUZ;I)+xqSsa;w@IZ-T-9csZ9AT1<5XPM$S76{bK5HFv{=w^l*NhP zhFFw(HDq>OBV%rDQrFf?w&5$EpvO*)km1ayT;q>-S%^<1&aQZjb3u5U+8#<)Rt@T3 zUFM?!_~It5OaqVEAW5Um?zZ9E#tDky}yA%y{OQ6gs4M zI=_y_+(x+8`V&8`-P)?J>{USy*H(VJK)%6`@Ex_jM!4205I?QqoQhZFs_g`1qrJ+sXP|Lwdn;Mjzm+L?(8~4&#fy0d(Sb zO=_DZ#n3=^Z5civD~#EpwARQY3myp4y54oRKE<6Y<9m0R)u(3Gj|C&T#YaVzC2zVZ zEF;L*zbLayS(ijx&akQP78b{+=45o6Hlg(mkJQTUT?zvNefxU&dc}pLc26nmnv^@7 zX96q>TLM`>^~*1^?%LvQ>gxWaQN~*Gp&6~NH0jvk^03K+){;qY=Zn+q!fB|XdjG_5nu_ZgZ zjk$)?Iyeva-Q)GGB0rUgNkXE{Mk^rsxv*dijFaQ@x&v>s9UCM)WF~eg)$(e=ToHMtH@0ZxfG0~(C#xL4^KMNTwZt_4OU=g+J3BD7SYbBV@rq7S zkAc~~F(XGtcxMghQ9Qj@LG7?^6*ML5R-Tel?vY%Y=D8kA(s%o%_Dv~n98%R>Hl*9o zoSdQEG#~vA)u&IOV_rX^xfG|?(e7Jl{-~n3xS~<{m35H={faX)`*!NoH#4)?Z(wAd zN9TSMas($L+chU=c#j?@J*_ax2QM8=j!uh22VBlllx1n~JpTn2Sd2oVBsQvf6@P(~Ely z$o7gDIWopKXFxpbup8^sqpZ1VNMmtwpVR<3>1@CCo@u4YZ8d2TeNld6)qCiDyNOI= z22a|IQ{j13nsJuU5H00=-4toQ7Mz+KE@R85<#ru7r7%9fOSHRt{#A2qGgl8yNUo|c z%^#WVrhMZIx|EFTmQot*DF=Ic6xNpXnK`gaSW0H})D@Mg$Sr65l3~MEO)u!5Gd3@( zXO6ws#9n~243 z0xZ$6iuRQ(n6@&tI^`ZOBZ|fp#>V82EGQh28-;pwhh<1vTHlzS(Y?w>D;XG{otRdf zV39r06^zf$zPPGuYWc`+)>!YVp)s9uVv~bpfJcBwL`G_O=hDu))tq42&gxdP+mKm0 z@o3?B9h~^UDmF$6rY)3kLrcvoue#*N^B%oBS||$*5#nI%XmI1D z)zuc1lv6E(%hUSA_KfLSK1Qm*_?(3F-U${g7X9jK3~sSrhB36Bat}0&fyVoIVn&Wo zFX9Pmtbt&MvF(yiXefp$f%B%%Na~Xs-8DGIJIc@Asi{fcU)r~zB-+cXug$%4a^KR{ zQP@@Q;z*Of;5qqjqBp)mK3H2#$jQsk4|lhPpg!_~Uw5S~D>>IxP<3q<=hF#BYpnG| zh?bw4A1?i8EtcxC*h)FFIKL`9tthG6sQk>%c?mJm*-05AOOoczEgYMfJtjA2bWX;| z!mRwF9vQug-tIj!?foGYZUOEWg^aPcY2Sap540jezePITA$K#hZ;>!XwvwnCzWh_?8;tF zEG%B9UEzY=ZDOy#!bxlJB|E*FZARk^3)6Y59!RBC1@9=@U(8{#q8RATT}mi6J9y_h zG_-0|s9#oj=V22@Ec$lTicvjhS>BGGm>Gcz`p?95rA)c209J zpZJ*Yv@5`P%$4pZ`7m4%_b@fheQatehVv5Nq!)tDJJWYl`;C;}wFZNlrv8yG)K}WU zgWg?~o-Wv{w-Xk-m(s%pyYgNqmUO43w}P>sQ=%@kOCCLsY$P%EN}Up?u*5dC#*eta zO>(>NS#~G!$p`jRg<7tsd997PJJRJ!YTFsB@ky0w;uxr@oc>>NUjo=xb*8IxWn12D zS=KIVm#+53k}O%4ZOO7_JGQggj>%5INl4m2LV!RiOW2ozW}rY>+ESna+UdRwg=q^d zFiZ&@=tAd}(hempyiQx7l+t#H{J#I(D_c$iZQsnim)Np>*8lwH{QG~;eS`K1S#=7< z9|hVc3Et}-qP`3fRouTRmsVi7=~?Ol80ePA#U9rZ3=6N|-c#Hxhf+ue!ZTDp#!Cs$ z_yancn3AKdaM9Hz)xOSlgUVo>$^1Z7x1zSj>=b&AeYrm)k4E?MEsl1XgGyh(iW-O$ z%X3`$DXtx1qGLEyJi59~RHf1hm4>44>?8MWdwI_no-R+!me1JptFM+J>3Gb143;{2 zV4Mht_0Xx6aoz!}CysNQJkDfg96Bx7&=Q_IeFHN~tCKvB;1X$VUEQa{nHfW8gRWWa zt}8^~<$D>^GOV5{`D~NJ^O)^`tkZ5&AGhhTQJ) zp7PtwHd^wG;TJmmoboZhPMZHX%C95R?`(|?`#I_Rd#&s@yHwuPBI$eA3=-|j`~y3e zkufJ}jPPm+rx7lM5X@^8Y7cT;EN@@YBx(O&A{oj@0X|P9ye)4_6hfA_fLnM%>}5c% zC!LWZI8uJiBFb6?tybl%oNXQ)o|tLZY{;(OJgbgJ1Kq}kd55=Ehorcf9`>6LcJ!q; zOqU;G;jXODnJL(Q_k)&^+8U#EW-CAYG8{x-w8lE&+Frun&V>*je|Zbf0FnhznN7{L zEP?>`z#?Fsb?h#+vlCNlbq&Ul+Ybhj-jQgmwy+`8l9;)e4xOj+?KR8%*xA`ujk;( zrBdSK5>Bp1ytz_7A;cHUZ)DdkoG*_uu{b9@_*BmMNd=c{g{6K=_0>?E*dMy%A~X|R zst`0wy_Z8p=d`*W=XJ5SV-dDG;qvnhtlY)tJCD8U9kr3BNxDp3X z0ZcQs=D67E*o?U)u_9VA3cH&OhpG%~grINM1pDp9{o_;n2b?*tzWfQMUS?Sfc#~fe z&qvBuC}yoTGp~FEE*IY`rNuXtxbU<0ZFeb*JV!2YT6{Y86!P;)b~mzFPA=KYsrUidVLe@eW+;z%GDBACBUl^S*G z1G+%7qs={t0SzL?&`Gexl2VeyuMs7Xv6Ny=M!24A^SZkK=w98c?$b;p zqZwz$Vd;%nwoYX>n|eA6qL?&9owj_BBQjHO?Y4A#<36Xw-dV5ew8mWh6Va&8WwTqf zrVfZRzj`e`zS4qLHtiDz4D}O4{`ZH zKBO7gN${yl9wcs(!Ah@%W2Xkz3WR^Fk_)v83AEP0aH}QH1p9b=I@>bb=<0FB64qF@ zFJ`qylToWHZS5X(wJA^OOrEx~e@hQ9w8r|fs81B?T{(}<7%&FyCYz?M!y5DW;+Bqf zgH~s4*L%YubvebJj?9e)oP~%xV$o>Kdaa?YRbxx~#H<%;zMyEtUS*K!-md7Bb}OY$ zBfKjsSxN+Ve(mbDuQNFtE$tfd_bgIx&PCaqv14!g!?iU-syg5hHo<{r2+F%HKP2#Fw+#XNSmJN3dNlyb3*QH{Zc45Rr`X@+845mt(J-v{#Kd zi`AuvU;;745XSg1bWTu)1k+ORnv!KxiMqPqrdIlAjNKmSL^Cs5?WX$R%mB-je;F^> z#MOgul{LH4S&Yv|;^*ls`8@p-KTpfcAy2t~?D*2FMhHf!l+F{40eMZ_nQNqN;-;P$2OY(Dh&n{dBx`BHW% zw?tsO3D2SpqC?fuYUO8d+Ax3K#Ch8{+`RGv+$&tZne8dx!roWbumfeveBk}~TCR{z z4fF6_l*;KONaa_`-lyZ+UxND~Xr0HGAH*~DbiU2_pl7)$8k-gqdYEQZ~gJ>^!@_b$>9t5tW4OUXfoFpyY*fXjJuFiLPV>R?ca$uhW0z`%^W}?8oc4GR zzRsKFb>78iU0x0;;h|ZVmy!j8*-?IS`|%`J5ZC=fTt{#z5*10o01dYLvSUaFCXeWDo!@(xq)`7uoJ=tx2LmM^qGr8S^kzs@%xa)lQ2iCMZ5y+Z{ za+fy@7K(dER-8F7oNYQ-wy&NKvtVc<7M~1&sF8Lx6&xr?Ne|+VTip0KVd{Mpje?;Nm!D6 zo^TXa+=TQP50!fP<4H)oO2~m4WtGB3dIh2l%RPlnku`&ErE*IsKQ^&qyw&ZvwIk#; zF>k=9HZo?3T6U+4)&qNc=ip2E~h*;81|!Bd!xg!;c+@f6bfh`-$};h9SeKdj*DQb}S+ zrG#gxtt2s|Qo=Kp5}vQ-_*^~);rUZl<%DNx6p44n7si%FZXclMJ3!NwXfM@bW;tqF zsjZ5d3XjRPb;4mz@q9$mqIe(5kHCohWKpz;TEEHRy&w1aNabV8JpT_Mw}^9Kshvc!lzlnN~59-t^uTs0>^K323 zCGQB0Bzaz{aJ0;>en9cCgrh2}n0iU}-r-rA1N(4NyOj4uy(9;zmn2IM7pT_|orfw} z`hc8Oj`EZ00+o76HqmHT05Zy!kxrc?6{s9s5*Rz&OS9+~0?VYr1FVlr1&Oy(Yl#!z zkEaWywGgMFa^exRuixh7(pjhSyXEr3_z8^`AM2rqJHbDeM=YuzZj|B{F1X^<6wyfY zXo~jKb?cJrQ}&#tGi}%Vw3b$Vljyqf#@UA-sZ(i!hIAj|8iCZLzg4YnZD`7?>ZI5P z`*eAh{bsz)*wECNiOMiM2N>K6n1#!tCd*-PV1DWUiBLF8Hq($ZHRbdf`d!HsYny#| z=HZ7M>osB1A{-ssPK`mI>*!3Tyihp^3=WE@k2W?p0~CSJrQ=XA7F%}h#FQu4pl#85;AUojZdzOuCY%(pmS6YO){Lv_umaqR z#V*BMX54b5n3gi+6Un5=!IvKzgdb5PnS=zNw3Hn2d}?H>cMq!x`8_eU*fkU?t_ZVO z!I4xeYuIjIFu*otp- zAWzq(1Pn5`nW}p#6j~XN<8!jxlQ5eT9(epQE_a{P+2?lk zIWY%LkMLpmRFqs##v@i9hq8|~jIxF@UJ-<6&yJ0*!PP>ba0gmGC_GV9Cv1ON;wy8U zuha>nKeDpzDy+xN*Yh>pD@G@T@;7*RdvO^WmJ%rpWM{f<{flLCxd|z zzt5{@yH>f&zpIV72X_y4uOGp5c%C08>JNZhOFW~nG|8fFp4KR3O2Vdd%3`~|*r@L| z7IyUy?I{kOHKbKPR}&Zw;wv~B2$T?IeYvHrec+6Iad&_J?jdKv!q%4`_m#q-l27`? znn{Yn>&kQd<+R!}*o?kB&VFD1s&I{URpHn*l$qrPZW=k43E~Dfjvq;YRoslwdZp_D zcn+3~Gfw%MiY`olF~h)FBZFCQB)27**_;lG*};)B2ZN(Q-)JN<>JN>DlEp&Wk#-E% zM>mfQY|&}P<9%yGk(q3~q|t2|7}*?MZR-yQ`W=q`K)Bz=CUUXFpegQ3^aG2)9fy)* zaldA{WrHoNQz-$>GQRZ1FE;8D9EoQR70={I43;WL9A#ZgDBM+a=DW)GvmB5Y9;u)Z zvx>NPsGmK62)2v-J!CbIuZ^;2PRu*{QaIDq*l5XwL+P%jrmmil&Dq-KwAr04Ev{N$ zVbTRo>k|hj-JXfOm^N_IcV8hEy3lBdz7hbUFN@(yIJ{lTRB<3~4>s1BeO+0or*xyB zg007@IZf|Rxl(uxm1tTN6Dj=*-+C%lEIwU#s|v=Yy8OqU`75N z25tNQ>M`6|W9dYioj4pIC~cT;6!Y=3H(folY+a|*+T$qr54%+@mKNWj$5-^@iPGlA ziw!=5{3Wt`?r*GDAps3f@_6#TPM`XjZ|Ovn(Wle-j3yCBfu9Ff#GESdcnwdASLUB; zFPB;PTZjYpgvwBXmEddt$)>PpW=N})gpI#IyTB01>~w{4@yFM^!$FrrYx4BjoxLuj z*5L{adyPIrx9Ce40|u+;wORaPt)(~M%Ct87t?q8KCE@P!H?^kSfnH0x!)bH{{BEPO z<691Mm&?&*aT3<7SVjr3Nfb-zH&wm}eum`7bGbUhp*o9WP0V|MGJnz6)KrBv-~ElM zdQaXU_=ZHS)Bgo(WgWi4giNjzCm~nbA3O{4bxB@NpM+lZ zM6vB!nPQoq<%F*j#ZLdt6wCCW*@02f;Wq_Mwa3#eR=g4`mi0qPO#clui~J;+WvQ^-6Rk7QSZCry3!24h)>q{4^t;k5)1Mw8s!g9>p<2MY0{uX>&}A!89OBsT zNwpC#r&@iWO{Q91w;5C`7FmZa<8HJ?h-|yH`nDev*_yQ8yw^AEC#uDK^px3u7u5=1 z`zxpxxG7>zQ0?^bRI9J1TfjDjeIv~tIu_yMJ?K_K(R-7v&cMmmlUz=EMP=+H{a<1)^Zt-U${_Fmsyse4dBFD)`|0BNukrd{$@M%_ z2=({iZ>9*aR~6q-UPacb%tuJ=Kh$<^(Gy~?vQ-9;!%;qsT4wR*8OrP5i;IW}ZPvAV zEaLN7#7-8m<${?}@4yOo)0^y7zpke+?stXF5nGK|5DR_275N@5^0Jtsm;Ib=RbET+ zRell|*~m#`KQV4u`qv%t7sYU2$e;6NOxCa=Vs}Sbcp?cQqOogCext9*es0bBYl6|B z-|1{}w00R>UY|?ZGhm84^e(-s))MFv(_o8&BFv7m_i;QxyFZ?*y!qtg>09$29EFgg&m5=*^ltI!2fQ;-%qn6upK*UX}=8$ zT}@aRNBv%o{}Mhwr8tMq-hN~PmFCaETOSn$^!h&T7)9wEo+31C-g4O;EL{FRLCSmJ z*&BXG+%)G|)l*UIYe@R>`< zJo^-EVF@}sFNp^aQXk>1n5(R2uTe9M1`i@5kCKfv+XHe$nUn)pRWMmgQ~cN{hDGD( z;L!L4OK%(K+tOq7g?z@@`KNk)DX+~Qw52j51BDGyarHnj>$6(@w!~8$7Ari^j{_Dy zM**5C!qYq{H-R%GDFd)xQv@N?F3plTb#Q4C=8=o_C zo_XfN?1`jy3350x~qgxABa{{xr;V{+&=I5GRA$$-iA`mr8?* zOT*`1>AK|ag2TbP0>i-zuJT-VW4IXpXfS)1^RDOmAIyL2i6@@uf3W|#=bmG&NL*tJ z&o6}8MG_wz1s@Es?L*}|zOVedcQ7|o6jA#tsdfa{t*~De%6AN*me(mZ;C9=4v9F2) z>e?c+Y+&Q}NoR(gC!a6a%+l#%9rNX9an3oGipV|uJZ_zb-+{FLihh5A&TiM~?e=yo)+03#jOFvNEUmZFZa~TKiSsG5art|zhSIKP{@-QOUZLF zi9)KzXauE9>g+Z>=9cK?Pm5jA1279Q4zpgqUtw`}N7X2as^8h4bq+f~vX#%^aM^4R z>TEVz8&*g&=^T|ADnDt(X{;DIvJ#Y>=Bmb=te+LjaGdu=gZzttm%P^Z zpwwsWgk;)aLD2zveF!kyh&%A?21+!+saa0B)hl_aLaE~%f>ORXHjzGcfUt?Ve*l&s z6KgWdnT15ggBxSQCTU`<7+iUptx!D5{;@`dC|x_Fw^56V^PwZ1PN(C*asJ1<>?u2a z_2Bb-{NkWL9kw2hJDd%+Pd*#m8(2Bf;5Un>gk?Em?Dl_?e=Z*L#m#35A8vKG<5oAB zulWAR+6M;#t6UBVV&)RWfOc0@+Bvia_I_$eREe6J#;O|S?SY@T8}nbV71M>Oa&KvbLF1;#8>D-0q0kj`;Un zaAA7wCqLZV|B+8jWj=7h9$2w>vpYt3LLLFh#84`|VnXs{tXgT0I@-;>p($U|+-40O z3GBJx1DUB$e5Akk!=GH6zVL!Q=wGwYp!g5rD0yOtQ}F&NxB>~QV0{oBhV4X0hsITq1z!@>^s0bWPrqZYRpD8IR3+rif>twKwx9`}OrgTEw)1XP6FSLUBB_Ho3G!ncd=Ff!Y#^(a5dh~G0S5dRbEY5 zFFQVSM1)UGQr#-)>-+&RG7pzxB62k7t1GYF+1I=C+ST+FqjiuTI#6rztkl{V@>=5) znudmg$tt>{Gy8{!_Rq%R>&`B$Th$fV-semp2hr(BS*@w}Wwu|ldhPW)dwaKEvnsbC zVGfyW#&jY+m+dfUJ$z?4x-|TAhJ`lPDLD*=PDx8mab`Ho%#7*Pj1{DC`d;~8iY(UXTbT}zq=KFLXvSlYr-G(f zsMBRg4tU~YzBNOcHT`CNB;$)^?z*Aryt~&xSoq6#)Bc7Ru4X^MS#2VTH=?eHJn3Y! z=H4Co{Epu4J@E_JKSWOHADD~0^Ic{4JKsgm?u88A8S@z8X{-4vtK6YpDL)p$XfSD7 zq+SYrN^9rw8rie2;hu9mDJRk{;we{z^(=$Coa6dozawD{mpsl=pWA9wHNv$&bcSPG zI~2AjyTT(LSE6Uy|3#h@u{bwzBgEspR|)HiBw_vkXyA=cj&5aVujeY>`;)!ShW+KtUkCgK;c z)ED5H&?w?Kx!BL+yzv#3Eng)F1?m`BNgH zxuJp0hN0FzU$EC~?hX30P5I7^gN1#w@%Ze%LjG*}d3J48uW=gX;K24=c4uL*&*X_l zSNQ#7;jqV$EzF^9zPc|mkur*J3cc7XimQedJ>URKP;<-rcxnUc&0+maotO6*4 zh$gHZo1PvGZ|yqu*p^o}vkTe4%P*I|#aiBcyZjo{`u*kqpmB!SeaK0XFJ>@Mo{BD;^5dcC|li!y^(r{k3*A+{|Dicbi?!pR`nt=^U|D_?yF zslq~44M|hfDS3T9kEp@j zI`&uHPw9Y$C;o*KP<5+jBfI$F93Hsdn9FTSCO74R^bCJ6knQTiEo)0RZWan3NBUm& z)GWUGwq^SRCBJ`|z5*iwU<>%d8=s`R>tO@$$3;oFj7UVlnDVLBzZf~X?UVPP#RT86 ze-lLV!qFY}cVx4-XS3*ATKEwAovkg86)IS@L79>~L-jem&$ck`yA{?gA;aJW#>hz9U`eFkyw29`r#$C=a z8~!xtjk=ETWQezmL{E@;{Se>3!wDvL@F4udS7t4Q@^h4>dB&v41`{J#u3r@jZ9m z?;muz2L1lLo81*VJ#lZ`byZZnW4&^ro>3r`BFN-eoB{9E?fF7C6x0 z?mZ1|9n>P`*j34t#eSsIlG?H~D<=b_0+4|NHK8ipr((9@UD=lAT{H07*B4!zvPaakOQ1!5Gk-HO9SBC^6!KjmxWAEzOkZLDwfJM|ku^KwJv%4nZ`~c5 zUokp1KF_*W3tx+G$n|ZAQ$eO>jO&rWEe|cWH@@ z(fyXvvR!Ab$G;3+tcUN)X&eVTH+fAR_xXcwTy?woU^6jyN}gt zOu=qrJG*veb2wu)Bn@NwzOLTQJ*!8I-AQN8XX(?8>AJhTy4D1!afi-zRPqkW+JysrMZ>UDUYWm99k#SnN0j(OO zR@*&jR-3978p>_#4K#dA_4N3Wv9FlE3ON0E-;WWuoXD$^#-r=M{p`_lp1f!5^#fx! zm~I%ocf9=6FnZ|GLsjWf8Ji#$RMZ%q9_5|x9lv)J{azd%#$iDI!_RSo8YK<9de5lm zAD(}H`1$8yS-*b%1H*?84?l1#Ithv*;y1s+Tk}j5eJ?m8O71}?my;DqV?8NybgNEY z%+7KIEP9L1WE~#PI73}}Q>V#3Z0q%&yqL8c+^{43BQpk<%g`5&uL%6o;Bp%hfst8W z5{XYxEN58pQ9!hYGAp*9bmGN%yM~LEc^$>!kJ2Cs|L{74+il2&$2VcDE=3#SY)1G2 z6x)$+<-qg#jBmGT66 zvbq%>;cnq(c+ExPya%}G=3xeUyhP#$aL)AZ&3;&RR`pVz2j(S%5KTs;{T^BPO5>x*3$MewMO@{9C z+3gywZ*+4{=JcJu(JiUWc2{|aMhobyihGr#c%LTSkON6sEgLJL5XmZrUIF=9_bSPw}{W?e<>wHBYa@(d+Tf z`NX+>$S#a@N3-GD`rPV`mzIQYZ9KWuCA2Jm9%F2vVFj}bHT_Sg4cqc zhm*V(%k&BO-RkO`=@AFiW=oGD+-_^N`qMjJ88Z#^2>H;k*x8wGX$pzQ9xH8yBFgYI zgaS9(Jwcg{`%?*hwLOJn3zOfGS`>q{V7+$ia7TVF7@a*ZHg;ex8krmDxW9aC{akwI z_=+>qn`fs5$EN+o(s}Emv30Od&e`A)rq{<0ZJyjaFtBg(^czF#K{Fy|-NCtLoy0eh z_bD>1j&+s;>@3`HcWiWw{fyxAqNN@!t2jEnpJ82$y%8HLF9>Ikjvl*FIQ!U*Xp7uz zA&0gtv=&B;-vRR-zLf|wmR}KC%d^e6UGwE;_USkavQT`rvHaumPmC0LMi$Mdg&ye~ z&nY3f^qRz5S4~{9?v2S=wteg^MCjLlA8jOzNsCW(RBx-Y5mNM zZe_PU()^%sYxyT)zbi49{#98suw%R7m2eZ!sCXqPr;Oh$B_+dDl6&PW zv+6shSbOobp1{QE8CQ?btYS!IZ=4zK%7j}74SOcf`JiWfPriRTS}U|UGh$(V#5+`5 zxnjx_Gpp5_&i8HU@Hw;tqyKR4%By!~$9qqSbmbEE+_p@#=vIK%6VTEgf|jP_c{B;| zI4<34|AL*u{zCmZ?6CoG_C3LofPW+ygiSIMGzX2Qpc#2B=1}>mU?~6tg(`-FrT{8T z^aV@h*l4|fJQ^MI2gkyp@le(r?XpHprm)QxHL_Lyu}BP6mOz3tzx<=(b$IhjO$JcDRg2UQQ?ojr#**VSI(g0@+N+5;j|a zgouSrhsRJ80vli4+{ zcBT?uh`Nehys}al9#gn=%c)3?qkP#`24gpc%obtooO!iF7g? z?M_dfIWjyegi52aU?@61eC=hI{iWXUY%lfRG+P>em)@%}H=^~&&0R6@!0x#TRJSzN z>5Wdi!Q0u^HZW=f_!W>YaMb8D9i0u4h~Mg@WOR9LNsJF`_PFuk4_P!Gt(0s|UdW|6 z>WwzNQPZidjn+n82B*o`*4|kYuYrG~GTmodI$AUxf*5R8H@B;qGbYXGV)rQ9u?xs{ znNHJ_xoKcAe%o!OHETXPR$4E(KJt;3D|cRXRi*U>$F&C5cHG+4Yz8{x+qmxh?L*J^a8&PXKCWpC%0aUr9~hOsE;QG)ZN7{P!e zYuDV&v7zf!#%jW%!C^AAsWmm-H34bxPXH6THo+YMCfYg#H`0`F*Cjkb|Ag}hyJ?y* z(6@R@2;Fc4A}(?b;`pd1nM^oj5s#piFIKOBq=38nq`*Vg!S z3vXX!U*YXJtrpO(npPcEbjyTbbm%2HhK!t0DQ7~M#Xvuy>N%RE3E>8?WUxbUv-@!NvK2 zB^SP5I&;G{ukV?FV)-@AS*JNm;P@{zHN&<~;iOM58omf*VQp7rZ_ zJ>FZ6o>UK*(ut>TE6&Umg|55St&{hNZ9_eDvgOpVLsE|aN4ZAd1Bw83r=UHwI)-57B9k4P(;VtIjVX3oRotWB6oz@(u$ zniT&gJWNliOdn4*b9JUz#?{tVob~q!P4?P$qgfk|1#M1*dXC>E;E`f>4_&=s&%O^# z?OEC-A)xpPw8qMLKQFab2;6!r-@n%tj{(b+K?tjW=WBpc;YqO$vez>`312u;LV_@0 z#65MlEIdMEkdHDx|Jhx;r1GTVCky|=%ZZlOY&dY_mRl+{zsC*qWN~0W#LCSpKq4A) zhwF#hUAE?~R%d&sRqOI~45lL9Z0?Avy~)|!+@WbxH`J`_!5c_?!OD2Q#hSrkD2D*% zOIqKG>sm;eCIp+LiiF(EY{#sUWL3ziq~=J@7q*^2(>o;)7R%dPr7{^-JTRCshs>c zake{Hz7;pXeVOWn*TBjCei;pv)~ps@<1|3K_bR(U`8?{EI5PIHipRcsrB3{In=t)rtRRvYmwanYc_$Gj6@VC)m9{;1814AbrjNm=SeBPzuO<^ z&P@qNhX;K=zgQUJXP?^tJKCS99RQ0GpNJ&VQ=3*7hn9L?a?wQ+Hs8HBu)5S6&;P7> zm)<}8TctNa(_$nU)!qr|4NN;L@+!PE$8ErNr}Ioi3SCV#Vyj{ z@A}GZq@$BWN9Gdv6D0Z}NOZ#E4BH9Yh36p_s^syq9Iu!xj{jXw(GzAWqPX%?IXy8nDE@B-IgZd9LI`7}t(GJ_qG}kk$cNk30}qRGc#Y zpUZXOMCm;|J^fzN8`Z;A(!1wfrFVsvdzR7i|I`VTq&H*`KY`v8rMGkfwYufvyWL=D zXMX3B04M(RuJXIQp!hR(3QtXfG8YA%SM)k1QHP8ON_{_M?P-eDcC{NUF|p2ApGo?J t&PK0jj+PhP7HwOnMQ5=ywl&8Dp)u^RM$Pj1h1A1Yz%vW~-_Eb%{{Tb$kc0pL literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/hgm.ttf b/app/src/main/res/font/hgm.ttf new file mode 100644 index 0000000000000000000000000000000000000000..81d89ef54e60c0e698a5f4b2eac31e24fb1a7ae1 GIT binary patch literal 66580 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 - + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_ruler.xml b/app/src/main/res/layout/fragment_ruler.xml new file mode 100644 index 0000000..37cc3ee --- /dev/null +++ b/app/src/main/res/layout/fragment_ruler.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_spirit_level.xml b/app/src/main/res/layout/fragment_spirit_level.xml new file mode 100644 index 0000000..4c320d8 --- /dev/null +++ b/app/src/main/res/layout/fragment_spirit_level.xml @@ -0,0 +1,63 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_top_settings.xml b/app/src/main/res/layout/fragment_top_settings.xml index bb8804e..fecf3c7 100644 --- a/app/src/main/res/layout/fragment_top_settings.xml +++ b/app/src/main/res/layout/fragment_top_settings.xml @@ -1,56 +1,29 @@ - - - + + android:layout_height="match_parent" + android:background="?colorSurfaceContainer"> + android:stateListAnimator="@null" + app:liftOnScroll="false" + app:liftOnScrollColor="?colorSurfaceContainer" + android:background="?colorSurfaceContainer"> - - - - - + android:layout_height="?attr/actionBarSize" + android:elevation="0dp" + app:layout_collapseMode="pin" + app:navigationIcon="@drawable/ic_arrow_back" + android:background="?colorSurfaceContainer" + app:navigationIconTint="?colorOnSurface" /> diff --git a/app/src/main/res/layout/preference_basic_down.xml b/app/src/main/res/layout/preference_basic_down.xml new file mode 100644 index 0000000..d00e8af --- /dev/null +++ b/app/src/main/res/layout/preference_basic_down.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/preference_basic_mid.xml b/app/src/main/res/layout/preference_basic_mid.xml new file mode 100644 index 0000000..97d8a53 --- /dev/null +++ b/app/src/main/res/layout/preference_basic_mid.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/preference_basic_single.xml b/app/src/main/res/layout/preference_basic_single.xml new file mode 100644 index 0000000..179e58f --- /dev/null +++ b/app/src/main/res/layout/preference_basic_single.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/preference_basic_top.xml b/app/src/main/res/layout/preference_basic_top.xml new file mode 100644 index 0000000..7f60625 --- /dev/null +++ b/app/src/main/res/layout/preference_basic_top.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/preference_cate.xml b/app/src/main/res/layout/preference_cate.xml new file mode 100644 index 0000000..d3e4951 --- /dev/null +++ b/app/src/main/res/layout/preference_cate.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/preference_switch_widget.xml b/app/src/main/res/layout/preference_switch_widget.xml new file mode 100644 index 0000000..94d654f --- /dev/null +++ b/app/src/main/res/layout/preference_switch_widget.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/switch_bottom_sheet.xml b/app/src/main/res/layout/switch_bottom_sheet.xml new file mode 100644 index 0000000..6aac6c4 --- /dev/null +++ b/app/src/main/res/layout/switch_bottom_sheet.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 5c6a6c2..f21ac44 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -13,7 +13,7 @@ 东经 未知地点 位置 - Omni 需要用到您的位置信息来展示经纬度。这可能需要与您的位置提供商进行额外通讯。如果您选择“不”,您仍然可以使用 Omni 指南针 的基础功能。 + 工具箱需要用到您的位置信息来展示经纬度。这可能需要与您的位置提供商进行额外通讯。如果您选择“不”,您仍然可以使用工具箱指南针 的基础功能。 不要 好的 设置 @@ -22,8 +22,34 @@ 版本 未知版本 警告 - 看起来您的设备没有可用的旋转向量传感器。 Omni 的指南针功能将被禁用。 但是,您仍然可以使用位置功能。 + 看起来您的设备没有可用的旋转向量传感器。工具箱的指南针功能将被禁用。 但是,您仍然可以使用位置功能。 关闭 "" %9$s%7$s%8$s%5$s%6$s%3$s%4$s%1$s%2$s + 不支持 + 指南针 + 指南针通知 + 指南针正在运行 + 长按来关闭这个通知 + 关于 + 坐标格式 + 度,分,秒 (DMS) + 指南针方向 + 次级方位 + 使用真北 + 通用 + 震动反馈 + 高亮度可能造成灼伤。 + 通知 + 工具箱需要通知权限来让快速设置里的指南针磁铁保持存活。如果你选择\"不要\",指南针磁铁可能无法正常工作。 + 指南针 + 指南针 + 水平仪 + 水平仪 + 尺子 + 尺子 + 手电筒 + 手电筒 + 警告 + 将手电筒亮度调至 90% 及更高可能会对手电筒的发光元件造成不可逆转的损毁。如果还是要继续,请按 “好的”。 \ 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 54538fe..1bf4c02 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,4 +1,5 @@ 16dp + 32dp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0c0b359..2e93463 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,13 +21,14 @@ 300 330 " %1$s°" + "%1$s°" N E Unknown location Location No Yes - Omni requires your location data in order to display latitude and longitude. That may requires communications with your location provider\'s server. If you select \"no\", you still can use the basic functionalities of omni compass. + Toolbox requires your location data in order to display latitude and longitude. That may requires communications with your location provider\'s server. If you select \"no\", you still can use the basic functionalities of compass. __.____° Settings App name @@ -36,8 +37,37 @@ Version Unknown version Warning - It looks like your device doesn\'t have an available rotation vector sensor. The compass feature of Omni will be disabled. However, you still can use the location feature. + It looks like your device doesn\'t have an available rotation vector sensor. The compass feature of toolbox will be disabled. However, you still can use the location feature. Dismiss ,\ %1$s%2$s%3$s%4$s%5$s%6$s%7$s%8$s%9$s + Not supported! + Compass + Compass Notification + Compass running + Long click to disable this notification + About + Coordinate format + Degree, minute, second (DMS) + Compass directions + Intercardinal directions + Use true north + Universal + Haptic feedback + cm + in + Higher brightness may cause burns + %1$s° %2$s\' %3$s\'\' + Notification + Toolbox requires notification permission in order to post notification for the compass QS tile to survive. If you select no, compass QS tile may not work as expected. + Compass + Compass + Spirit level + Spirit level + Ruler + Ruler + Flashlight + Flashlight + Warning + Increasing the flashlight brightness to 90% or higher may cause irreversible damage to the flashlight\'s light-emitting components. If you still want to proceed, press "Yes". \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 1a48fc1..446e10d 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -6,6 +6,7 @@ @font/hankengrotesk @font/hankengrotesk uk.akane.omni.logic.ui.ViewCompatInflater + @style/ThemeOverlay.App.BottomSheetDialog none @style/ThemeOverlay.App.MaterialAlertDialog @@ -86,7 +87,7 @@ + +