diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d9316e8..d4dbe4e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,7 +14,7 @@ android { minSdk = 27 targetSdk = 36 versionCode = 1 - versionName = "1.1.0" + versionName = "1.2.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4567d2b..b0e18b6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ + showThemeSelectionDialog())); items.add(new OptionItem(getString(R.string.item_haptic_feedback), null, R.drawable.ic_vibration, v -> showHapticFeedbackSelectionDialog())); + items.add(new OptionItem(getString(R.string.item_north_reference), null, + R.drawable.ic_compass, v -> showNorthReferenceSelectionDialog())); // Category: App items.add(new OptionItem(getString(R.string.category_app))); @@ -200,4 +202,57 @@ private void sendFeedbackEmail() { openUrl("https://github.com/iso53/Nothing-Compass/issues"); } } + + private final androidx.activity.result.ActivityResultLauncher requestPermissionLauncher = registerForActivityResult( + new androidx.activity.result.contract.ActivityResultContracts.RequestPermission(), + isGranted -> { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + if (isGranted) { + prefs.edit().putBoolean(PreferenceConstants.TRUE_NORTH, true).apply(); + } else { + android.widget.Toast.makeText(this, R.string.access_location_permission_denied, + android.widget.Toast.LENGTH_SHORT).show(); + } + }); + + private void showNorthReferenceSelectionDialog() { + String[] options = {getString(R.string.north_reference_true), + getString(R.string.north_reference_magnetic)}; + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + boolean isTrueNorth = prefs.getBoolean(PreferenceConstants.TRUE_NORTH, false); + + int checkedItem = isTrueNorth ? 0 : 1; + + new MaterialAlertDialogBuilder(this) + .setTitle(R.string.item_north_reference) + .setSingleChoiceItems(options, checkedItem, (dialog, which) -> { + if (which == 0) { + // True North selected + if (androidx.core.content.ContextCompat.checkSelfPermission(this, + android.Manifest.permission.ACCESS_FINE_LOCATION) == android.content.pm.PackageManager.PERMISSION_GRANTED) { + prefs.edit().putBoolean(PreferenceConstants.TRUE_NORTH, true).apply(); + } else { + requestPermissionLauncher.launch(android.Manifest.permission.ACCESS_FINE_LOCATION); + } + dialog.dismiss(); + } else { + // Magnetic North selected + prefs.edit().putBoolean(PreferenceConstants.TRUE_NORTH, false).apply(); + dialog.dismiss(); + } + }) + .setNeutralButton(R.string.north_reference_explanation_title, + (dialog, which) -> showNorthReferenceExplanationDialog()) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } + + private void showNorthReferenceExplanationDialog() { + new MaterialAlertDialogBuilder(this) + .setTitle(R.string.north_reference_explanation_title) + .setMessage(R.string.north_reference_explanation_message) + .setPositiveButton(android.R.string.ok, null) + .show(); + } } diff --git a/app/src/main/res/drawable/ic_compass.xml b/app/src/main/res/drawable/ic_compass.xml new file mode 100644 index 0000000..9cd59b9 --- /dev/null +++ b/app/src/main/res/drawable/ic_compass.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8ec7220..3c9bfe5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -65,5 +65,12 @@ Haptic feedback On Off + Compass Reference + True North + Magnetic North + What is this? + True North points to the geographic North Pole.\n\nMagnetic North points to the Magnetic North Pole, which shifts over time.\n\nThe difference is the magnetic declination, which depends on your location. + Using True North requires location access to calculate the magnetic declination. + Enable Location Options \ No newline at end of file