Aperture: Location permissions dialog

Change-Id: Ie7e09648d196159ae4f454d61c9c01833b7ade21
diff --git a/app/src/main/java/org/lineageos/aperture/CameraActivity.kt b/app/src/main/java/org/lineageos/aperture/CameraActivity.kt
index 6f5e04b..2547035 100644
--- a/app/src/main/java/org/lineageos/aperture/CameraActivity.kt
+++ b/app/src/main/java/org/lineageos/aperture/CameraActivity.kt
@@ -71,6 +71,7 @@
 import com.google.android.material.button.MaterialButton
 import org.lineageos.aperture.ui.CapturePreviewLayout
 import org.lineageos.aperture.ui.CountDownView
+import org.lineageos.aperture.ui.LocationPermissionsDialog
 import org.lineageos.aperture.ui.GridView
 import org.lineageos.aperture.ui.HorizontalSlider
 import org.lineageos.aperture.ui.LensSelectorLayout
@@ -305,7 +306,7 @@
         }
     }
 
-    private val requestMultiplePermissions = registerForActivityResult(
+    private val mainPermissionsRequestLauncher = registerForActivityResult(
         ActivityResultContracts.RequestMultiplePermissions()
     ) {
         if (it.isNotEmpty()) {
@@ -315,7 +316,28 @@
                 ).show()
                 finish()
             }
-            sharedPreferences.saveLocation = permissionsUtils.locationPermissionsGranted()
+
+            // This is a good time to ask the user for location permissions
+            if (sharedPreferences.saveLocation == null) {
+                locationPermissionsDialog.show()
+            }
+        }
+    }
+    private val locationPermissionsRequestLauncher = registerForActivityResult(
+        ActivityResultContracts.RequestMultiplePermissions()
+    ) {
+        sharedPreferences.saveLocation = permissionsUtils.locationPermissionsGranted()
+    }
+
+    private val locationPermissionsDialog by lazy {
+        LocationPermissionsDialog(this).also {
+            it.onResultCallback = { result ->
+                if (result) {
+                    locationPermissionsRequestLauncher.launch(PermissionsUtils.locationPermissions)
+                } else {
+                    sharedPreferences.saveLocation = false
+                }
+            }
         }
     }
 
@@ -635,14 +657,21 @@
 
         // Bind viewfinder and preview blur view
         previewBlurView.previewView = viewFinder
+
+        // Request camera permissions
+        if (!permissionsUtils.mainPermissionsGranted()) {
+            mainPermissionsRequestLauncher.launch(PermissionsUtils.mainPermissions)
+        } else if (sharedPreferences.saveLocation == null) {
+            locationPermissionsDialog.show()
+        }
     }
 
     override fun onResume() {
         super.onResume()
 
-        // Request camera permissions
-        if (!permissionsUtils.mainPermissionsGranted() || sharedPreferences.saveLocation == null) {
-            requestMultiplePermissions.launch(PermissionsUtils.allPermissions)
+        // Re-request camera permissions in case the user revoked them on app runtime
+        if (!permissionsUtils.mainPermissionsGranted()) {
+            mainPermissionsRequestLauncher.launch(PermissionsUtils.mainPermissions)
         }
 
         // Set bright screen
diff --git a/app/src/main/java/org/lineageos/aperture/ui/LocationPermissionsDialog.kt b/app/src/main/java/org/lineageos/aperture/ui/LocationPermissionsDialog.kt
new file mode 100644
index 0000000..1a7090a
--- /dev/null
+++ b/app/src/main/java/org/lineageos/aperture/ui/LocationPermissionsDialog.kt
@@ -0,0 +1,47 @@
+/*
+ * SPDX-FileCopyrightText: 2023 The LineageOS Project
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package org.lineageos.aperture.ui
+
+import android.app.Activity
+import android.app.Dialog
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
+import android.os.Bundle
+import android.view.Window
+import android.widget.Button
+import org.lineageos.aperture.R
+
+class LocationPermissionsDialog(activity: Activity) : Dialog(activity) {
+    private val turnOnButton by lazy {
+        findViewById<Button>(R.id.locationPermissionsDialogTurnOnButton)
+    }
+    private val laterButton by lazy {
+        findViewById<Button>(R.id.locationPermissionsDialogLaterButton)
+    }
+
+    var onResultCallback: (Boolean) -> Unit = {}
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        requestWindowFeature(Window.FEATURE_NO_TITLE)
+        setContentView(R.layout.location_permissions_dialog)
+        window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
+
+        setOnCancelListener {
+            onResultCallback(false)
+        }
+
+        turnOnButton.setOnClickListener {
+            dismiss()
+            onResultCallback(true)
+        }
+        laterButton.setOnClickListener {
+            dismiss()
+            onResultCallback(false)
+        }
+    }
+}
diff --git a/app/src/main/res/drawable/location_permissions_dialog_background.xml b/app/src/main/res/drawable/location_permissions_dialog_background.xml
new file mode 100644
index 0000000..68c7323
--- /dev/null
+++ b/app/src/main/res/drawable/location_permissions_dialog_background.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     SPDX-FileCopyrightText: 2023 The LineageOS Project
+     SPDX-License-Identifier: Apache-2.0
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="16dp" />
+</shape>
diff --git a/app/src/main/res/drawable/location_permissions_dialog_footer.xml b/app/src/main/res/drawable/location_permissions_dialog_footer.xml
new file mode 100644
index 0000000..da02023
--- /dev/null
+++ b/app/src/main/res/drawable/location_permissions_dialog_footer.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     SPDX-FileCopyrightText: 2023 The LineageOS Project
+     SPDX-License-Identifier: Apache-2.0
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="320dp"
+    android:height="96dp"
+    android:viewportWidth="320"
+    android:viewportHeight="96">
+    <group>
+        <clip-path android:pathData="M0,0h320v96h-320z" />
+        <path
+            android:fillColor="#00000000"
+            android:pathData="M211.18,-0.63C203.62,5.92 200.92,-0.95 195.07,3.02C193.94,4.16 192.79,5.46 191.79,6.73C189.88,9.39 186.63,9.96 183.82,11.11C179.79,12.97 175.76,15.04 171.26,15.02C166.26,18.03 160.17,21.63 154.18,19.81C152.37,19.82 149.92,21.75 148.59,19.81C148.57,19.55 148.84,18.75 148.92,18.5C152.06,13.93 146,13.31 142.97,15.05C141.13,15.78 139.26,14.56 137.42,14.67C133.03,14.92 131.48,19.48 128.61,21.89C127.43,22.23 126.49,21.23 125.55,20.71C119.79,17.53 116.32,25.51 111.28,24.95C107.05,23.48 102.66,26.07 98.45,24.89C88.61,25.95 81.17,40.65 70.47,32.95L70.08,31.17L70.2,30.03C70.18,28.52 69.76,27.06 68.89,25.84L68.38,25.21C64.94,20.77 62.31,22.31 57.8,21.22C55.8,20.49 54.33,18.69 52.68,17.51C48.86,15.43 44.15,14.85 40.82,11.94C37.34,7.06 30.35,8.7 30.72,3.38C30.7,1.85 29.78,0.4 28.62,-0.56M156.14,15.77C158.32,16.35 163.5,12.38 161.87,10.07C159.12,9.47 155.95,13.18 156.14,15.77ZM138.52,22.74L137.98,22.14C138.2,20.54 139.63,19.13 141.3,19.44C142.08,19.94 141.94,20.43 141.69,21.22C140.96,22.22 139.72,22.7 138.52,22.74V22.74Z"
+            android:strokeWidth="1.221"
+            android:strokeColor="#495454" />
+        <path
+            android:fillColor="#00000000"
+            android:pathData="M233.68,-1.09L233.05,-0.58C227.09,6.26 218.6,10.23 212.72,16.99C209.94,20.42 205.83,22.88 201.58,23.94C199.14,23.69 196.49,24.12 194.48,25.52L192.58,27.06C191.6,28.28 190.19,29.43 188.79,30.14C181.55,33.42 174.14,37.53 166.27,39C157.7,37.44 149.66,42.05 141.22,42.58C138.64,44.2 135.27,44.47 132.73,46.33C130.73,47.43 128.55,49.05 126.14,48.54C120.16,46.82 119.29,53.01 113.54,47.24L112.28,48.27C105.15,54.97 106.77,48.46 102.83,48.25C89.96,50.83 95.25,43.49 87.96,42.86C87.39,42.8 86.24,42.68 85.67,42.62C81.54,40.75 77.3,41.89 73.08,41.32C68.53,40.1 63.27,43.45 59.34,39.9C56.83,38.77 56.9,35.52 54.72,34.21C53.56,34.3 52.52,35.15 52.19,36.27C50.04,40.99 45.35,38.67 41.53,38.63C36.81,40.46 36.85,34.63 40.86,33.94L42.76,32.4C42.59,30.84 41.1,29.65 39.56,29.75C38.55,29.19 37.18,28.91 36.24,28.25C33.09,25.71 28.9,25.89 25.82,28.33C24.77,29.42 22.98,29.18 21.64,29.63C19,29.91 16.64,31.83 13.9,31.73C13.17,31.39 12.54,30.61 12.36,29.83C12.36,29.36 12.19,28.47 11.96,28.05C10.41,24.9 7.66,22.4 5.29,19.84C4.04,18.85 2.61,17.79 1.58,16.57C1.22,16.33 0.72,15.71 0.55,15.3H0.56C0.26,15 -0.3,14.34 -0.46,13.96"
+            android:strokeWidth="0.61"
+            android:strokeColor="#495454" />
+        <path
+            android:fillColor="#00000000"
+            android:pathData="M307.32,-0.8C303.13,2.4 297.37,2.45 292.31,2.66C285.33,3.4 277.48,6.5 270.83,3.33C267.73,0.14 264.13,1.11 260.13,0.49C253.11,-0.67 249.78,-3.42 244.77,3.53C241.56,6.85 237.9,9.74 234.04,12.25C231.56,13.88 228.83,15.44 227.09,17.9C226.99,18.36 226.64,19.19 226.34,19.56C224.05,22.96 220.59,25.6 216.86,27.26C209.36,30.19 204.08,36.44 197.52,40.88C196.05,42.06 194.18,42.84 192.58,43.84C186.99,49.22 178.86,51.96 171.22,51.76C164.73,54.05 158.08,55.12 151.37,56.36C145.35,58.42 139.07,56.83 132.93,56.65C129.01,57.25 125.48,60.31 121.39,59.74C119.25,59.54 117.31,60.62 115.43,61.18C111.74,61.56 108.25,60.59 104.78,62.26C102.02,62.91 100.14,59.8 97.54,60.24C94.65,61.32 92.46,61.16 90.53,58.6C84.48,56.06 83.86,61.92 73.2,56.95L71.42,57.35L70.79,57.86C68.77,61.05 64.41,62.02 62.03,58.69C57.71,54.41 53.89,59.94 48.29,57.27C45.39,55.36 41.91,55.48 38.73,54.54C36.6,53.68 35.86,51.15 33.99,50C31.57,48.33 27.98,48.54 26.34,45.74C23.85,43.92 20.4,45.82 18.01,44.11C14.93,42.98 12.75,46.83 9.56,45.74C5.21,44.3 4.82,41.37 -0.63,43.53H-0.63"
+            android:strokeWidth="0.61"
+            android:strokeColor="#495454" />
+        <path
+            android:fillColor="#00000000"
+            android:pathData="M320.49,32.19L319.23,33.22C318.5,34.3 317.39,35.33 316.42,36.2C316.1,36.91 315.27,37.49 314.69,37.95C314.28,38.6 313.72,39.48 313.31,40.12L312.56,41.78L311.81,43.44L311.69,44.59L311.57,45.73L311.46,46.88L311.08,47.7C308.98,48.54 306.84,46.58 306.48,44.63L306.6,43.48L306.72,42.34L306.84,41.19L306.95,40.05L306.56,38.27C305.76,36.96 304.26,36.15 302.73,36.14L302.1,36.65L301.98,37.79L301.86,38.94L301.74,40.08L301.63,41.23C300.38,44.75 295.18,46.96 294.01,42.18L294.12,41.03C294.45,39.66 295.09,38.06 296.26,37.2L296.37,36.06L295.98,34.28L295.47,33.65C293.68,32.43 292.05,30.71 291.36,28.6C290.8,27.12 289.51,25.77 288.28,24.81L285.6,22.79C284.31,21.81 283.05,20.62 281.88,19.52C279.06,15.68 276.14,15.98 271.93,15.02C267.63,12.63 263.7,13.74 259.22,14.86C249.32,16.06 249.3,12.24 240.19,19.83C229.4,25.16 221.69,35.1 211.38,41.15C208.83,42.71 206.49,44.65 204.43,46.8C202.66,48.44 200.77,50.1 198.74,51.42C193.52,54 188.17,56.61 182.91,59.04C178.28,59.07 177.35,60.9 173.79,63.3C171.48,64.67 168.65,64.94 166.05,65.39C162.26,66.31 158.73,68.69 154.76,68.28C151.31,67.69 147.74,69.51 144.34,68.36C141.82,66.39 139.71,63.55 136.05,64.61C132.81,65.5 129.54,63.3 126.4,64.35C124.79,64.72 123.04,65.05 121.49,64.76C118.13,63.8 115.22,66.16 112.03,66.03C107.44,64.14 103.75,69.01 99.33,67.17C94.06,67.45 91.78,70.94 85.54,69.57C81.98,70 78.56,71.07 75.06,70.12C71.51,69.52 68.25,71.55 64.79,71.12C50.93,64.76 54.84,71.9 42.45,65.57C32.45,67.51 34.09,62.94 27.36,63.78C25.45,64.24 23.32,64.87 21.36,64.46C13.55,61.79 5.37,67.85 -2.57,65.66"
+            android:strokeWidth="0.61"
+            android:strokeColor="#495454" />
+        <path
+            android:fillColor="#00000000"
+            android:pathData="M320.45,91.5C320.2,91.19 319.41,90.22 319.15,89.91L318.01,89.79L317.5,89.16L316.35,89.04C315.35,87.81 314.27,86.48 313.27,85.25L312.13,85.13L311.1,83.87L309.95,83.75L308.41,81.86C306.98,81.71 305.27,81.53 303.83,81.38L303.32,80.75L302.18,80.63L301.66,80C299.97,79.82 298.06,79.81 296.57,78.89C294.4,78.81 292.46,77.27 290.76,76.27C289.52,74.76 287.31,74.4 285.48,74.28L284.84,74.79L282.55,74.55L282.67,73.41L282.79,72.26C282.52,71.38 282.67,70.25 282.51,69.34C282.42,67.45 282.58,65.44 283.11,63.62C283.45,62.57 283.64,61.28 283.46,60.18C283.14,59.16 282.3,58.23 281.41,57.66C280.7,57.07 279.5,56.82 278.61,56.79C275.04,56.93 274.79,52.8 273.47,50.47C271.32,46.63 267.69,43.85 265.89,39.85L265.5,38.07C264.61,35.95 264.53,33.49 263.29,31.48L262.26,30.22C259.24,27.54 255.64,30.78 252.35,30.93C243.54,28.45 234.74,32.83 227.36,37.6C221.83,41.96 216.16,46.21 210.43,50.31C202.52,56.05 198.42,66.68 188.46,69.74C185.37,70.18 181.96,69.2 179.32,71.4C175.91,74.29 171.65,75.81 167.84,77.93C165.38,79.74 163.08,83.13 159.7,82.1C157.5,81.95 155.3,82.51 153.22,83.16C148.66,83.52 149.72,78.02 146.31,77.24C142.69,78.07 139.5,80.03 135.65,79.61C133.3,79.84 130.93,81.53 128.66,80.04C125.84,77.31 121.84,81.56 118.99,78.47C116.07,76.32 112.26,77.8 108.94,77.19C103.91,75.79 98.3,75.86 93.17,76.37C87.12,77.72 81.75,82.55 75.29,81.47C72.56,80.56 69.83,81.19 67.16,81.78C61.69,82.37 56.35,81.4 50.89,82.42C47.33,82.35 43.95,84.12 40.35,83.64C34.09,83.13 27.78,86.59 21.68,85.18C15.46,81.17 7.71,81.72 0.67,81.27L-0.59,80.7"
+            android:strokeWidth="0.61"
+            android:strokeColor="#495454" />
+        <path
+            android:fillColor="#00000000"
+            android:pathData="M247.58,88.29C246.62,86.44 244.42,86.02 243.35,84.38L243.47,83.24L243.59,82.09L244.22,81.58L244.34,80.44L244.46,79.29L244.58,78.15L244.69,77L244.81,75.86L244.93,74.71L246.82,73.17L246.94,72.03L247.57,71.51L247.69,70.37L248.32,69.85C248.51,69.44 248.89,68.61 249.07,68.2L249.19,67.05L249.31,65.91C248.94,65.6 248.63,64.86 248.6,64.39C248.23,64.08 247.92,63.34 247.89,62.87C247.1,61.81 246.48,60.41 245.95,59.2C244.69,57.66 244.72,55.41 243.63,53.75C241.66,48.53 235.19,51.78 231.27,50.16C229.22,49.09 226.77,49.35 224.75,50.21C219.48,50.98 213.68,50.14 210.46,55.53C208.87,57.69 208.79,60.72 206.83,62.67C199.48,69.36 190.23,74.2 182.43,80.4C174.68,84.11 167.24,88.48 159.77,92.52C153.33,92.68 146.68,92.04 140.33,93.11C136.18,93.35 132.7,90.95 128.74,90.47C125.5,90.72 122.25,91.83 119.04,91.01C117.39,90.37 115.5,90.11 113.74,90.07C109.1,90.05 103.71,92.67 100,88.65C97.85,86.8 95.03,88.06 92.62,87.31C86.71,85.18 79.9,87.38 74.07,88.75C67.51,88.81 61.96,92.42 55.55,93.31M250.54,76.45C250.76,76.63 251.65,76.18 252.06,75.74C252.47,75.3 253.07,74.72 253.07,74.39C253.07,74.15 252.24,73.45 251.81,73.11C251.66,72.99 251.46,72.96 251.29,73.04L250.26,73.53L249.63,74.04C249.63,74.04 249.51,74.95 249.51,75.18C249.51,75.42 250.31,76.26 250.54,76.45L250.54,76.45Z"
+            android:strokeWidth="1.221"
+            android:strokeColor="#495454"
+            android:strokeLineCap="round" />
+        <path
+            android:fillColor="#ffffff"
+            android:pathData="M160,51.75C160.48,51.75 160.9,51.58 161.24,51.24C161.58,50.9 161.75,50.48 161.75,50C161.75,49.52 161.58,49.1 161.24,48.76C160.9,48.42 160.48,48.25 160,48.25C159.52,48.25 159.1,48.42 158.76,48.76C158.42,49.1 158.25,49.52 158.25,50C158.25,50.48 158.42,50.9 158.76,51.24C159.1,51.58 159.52,51.75 160,51.75ZM160,60.03C162.22,58.01 163.85,56.18 164.91,54.54C165.97,52.9 166.5,51.45 166.5,50.2C166.5,48.23 165.87,46.63 164.61,45.38C163.35,44.13 161.82,43.5 160,43.5C158.18,43.5 156.65,44.13 155.39,45.38C154.13,46.63 153.5,48.23 153.5,50.2C153.5,51.45 154.04,52.9 155.13,54.54C156.21,56.18 157.83,58.01 160,60.03ZM160,62C157.32,59.72 155.31,57.6 153.99,55.64C152.66,53.68 152,51.87 152,50.2C152,47.7 152.8,45.71 154.41,44.22C156.02,42.74 157.88,42 160,42C162.12,42 163.98,42.74 165.59,44.22C167.2,45.71 168,47.7 168,50.2C168,51.87 167.34,53.68 166.01,55.64C164.69,57.6 162.68,59.72 160,62Z" />
+    </group>
+</vector>
diff --git a/app/src/main/res/layout/location_permissions_dialog.xml b/app/src/main/res/layout/location_permissions_dialog.xml
new file mode 100644
index 0000000..8eacba5
--- /dev/null
+++ b/app/src/main/res/layout/location_permissions_dialog.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     SPDX-FileCopyrightText: 2023 The LineageOS Project
+     SPDX-License-Identifier: Apache-2.0
+-->
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="320dp"
+    android:layout_height="wrap_content"
+    android:background="@drawable/location_permissions_dialog_background"
+    android:backgroundTint="@color/gray_70"
+    android:theme="@style/Theme.Aperture.Camera.LocationPermissionsDialog">
+
+    <ImageView
+        android:id="@+id/locationPermissionsDialogImage"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:srcCompat="@drawable/location_permissions_dialog_footer" />
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="24dp"
+        android:layout_marginTop="24dp"
+        android:layout_marginEnd="24dp"
+        android:layout_marginBottom="24dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/locationPermissionsDialogImage">
+
+        <TextView
+            android:id="@+id/locationPermissionsDialogTitle"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:text="@string/location_permission_dialog_title"
+            android:textAlignment="center"
+            android:textSize="24sp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:id="@+id/locationPermissionsDialogDescription"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
+            android:text="@string/location_permission_dialog_description"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/locationPermissionsDialogTitle" />
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginTop="24dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/locationPermissionsDialogDescription">
+
+            <Button
+                android:id="@+id/locationPermissionsDialogLaterButton"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:backgroundTint="@color/gray_70"
+                android:text="@string/location_permission_dialog_later"
+                android:textColor="@color/blue"
+                app:layout_constraintEnd_toStartOf="@+id/locationPermissionsDialogTurnOnButton"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <Button
+                android:id="@+id/locationPermissionsDialogTurnOnButton"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:backgroundTint="@color/gray_70"
+                android:text="@string/location_permission_dialog_turn_on"
+                android:textColor="@color/blue"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+        </androidx.constraintlayout.widget.ConstraintLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 3343ca2..0fd69a8 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -111,4 +111,10 @@
     <string name="shortcut_selfie">Take a selfie</string>
     <string name="shortcut_video">Take a video</string>
     <string name="shortcut_qr">Scan a barcode</string>
+
+    <!-- Location permissions dialog -->
+    <string name="location_permission_dialog_title">Add photo and video locations</string>
+    <string name="location_permission_dialog_description">Map your memories by including location metadata with each capture.</string>
+    <string name="location_permission_dialog_later">Later</string>
+    <string name="location_permission_dialog_turn_on">Turn on</string>
 </resources>
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index f56bee4..e6fc912 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -99,4 +99,10 @@
         <item name="android:textSize">36sp</item>
         <item name="android:drawablePadding">10dp</item>
     </style>
+
+    <!-- Location permissions dialog style -->
+    <style name="Theme.Aperture.Camera.LocationPermissionsDialog">
+        <item name="android:textStyle">normal</item>
+        <item name="android:typeface">normal</item>
+    </style>
 </resources>