Vadik Sirekanyan преди 2 години
родител
ревизия
eeb429eaf6

+ 4 - 0
app/src/main/java/org/sirekanyan/outline/App.kt

@@ -3,6 +3,10 @@ package org.sirekanyan.outline
 import android.app.Application
 import android.content.Context
 
+@Suppress("KotlinConstantConditions")
+fun isPlayFlavor(): Boolean =
+    BuildConfig.FLAVOR == "play"
+
 class App : Application() {
 
     override fun attachBaseContext(base: Context?) {

+ 32 - 1
app/src/main/java/org/sirekanyan/outline/ui/DrawerContent.kt

@@ -1,9 +1,14 @@
 package org.sirekanyan.outline.ui
 
+import android.content.Intent
+import android.content.Intent.ACTION_VIEW
+import android.net.Uri
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.asPaddingValues
+import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.systemBars
 import androidx.compose.foundation.rememberScrollState
@@ -11,6 +16,7 @@ import androidx.compose.foundation.verticalScroll
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Add
 import androidx.compose.material.icons.filled.Done
+import androidx.compose.material3.Divider
 import androidx.compose.material3.Icon
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.ModalDrawerSheet
@@ -22,14 +28,19 @@ import androidx.compose.runtime.getValue
 import androidx.compose.runtime.produceState
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import org.sirekanyan.outline.AddServerDialog
+import org.sirekanyan.outline.BuildConfig
 import org.sirekanyan.outline.MainState
 import org.sirekanyan.outline.R
 import org.sirekanyan.outline.SelectedPage
 import org.sirekanyan.outline.db.ApiUrlDao
+import org.sirekanyan.outline.isPlayFlavor
 import org.sirekanyan.outline.text.formatTraffic
+import org.sirekanyan.outline.ui.icons.IconOpenInNew
+import org.sirekanyan.outline.ui.icons.IconPlayStore
 
 @Composable
 fun DrawerContent(dao: ApiUrlDao, state: MainState) {
@@ -41,7 +52,13 @@ fun DrawerContent(dao: ApiUrlDao, state: MainState) {
 
 @Composable
 private fun DrawerSheetContent(dao: ApiUrlDao, state: MainState, insets: PaddingValues) {
-    Column(Modifier.verticalScroll(rememberScrollState()).padding(insets).padding(bottom = 8.dp)) {
+    Column(
+        modifier = Modifier
+            .fillMaxHeight()
+            .verticalScroll(rememberScrollState())
+            .padding(insets)
+            .padding(bottom = 8.dp),
+    ) {
         Text(
             text = stringResource(R.string.app_name),
             modifier = Modifier.padding(horizontal = 28.dp, vertical = 16.dp),
@@ -82,5 +99,19 @@ private fun DrawerSheetContent(dao: ApiUrlDao, state: MainState, insets: Padding
                 state.dialog = AddServerDialog
             },
         )
+        if (isPlayFlavor() || BuildConfig.DEBUG) {
+            Spacer(Modifier.weight(1f))
+            Divider(Modifier.padding(vertical = 8.dp))
+            val context = LocalContext.current
+            val playUri = "https://play.google.com/store/apps/details?id=${context.packageName}"
+            NavigationDrawerItem(
+                icon = { Icon(IconPlayStore, null) },
+                label = { Text("Rate on Play Store", style = MaterialTheme.typography.labelLarge) },
+                badge = { Icon(IconOpenInNew, null) },
+                modifier = Modifier.padding(horizontal = 12.dp),
+                selected = false,
+                onClick = { context.startActivity(Intent(ACTION_VIEW, Uri.parse(playUri))) },
+            )
+        }
     }
 }

+ 37 - 0
app/src/main/java/org/sirekanyan/outline/ui/icons/IconOpenInNew.kt

@@ -0,0 +1,37 @@
+package org.sirekanyan.outline.ui.icons
+
+import androidx.compose.material.icons.materialIcon
+import androidx.compose.material.icons.materialPath
+import androidx.compose.ui.graphics.vector.ImageVector
+
+val IconOpenInNew: ImageVector =
+    materialIcon(name = "Filled.OpenInNew") {
+        materialPath {
+            moveTo(19.0f, 19.0f)
+            horizontalLineTo(5.0f)
+            verticalLineTo(5.0f)
+            horizontalLineToRelative(7.0f)
+            verticalLineTo(3.0f)
+            horizontalLineTo(5.0f)
+            curveToRelative(-1.11f, 0.0f, -2.0f, 0.9f, -2.0f, 2.0f)
+            verticalLineToRelative(14.0f)
+            curveToRelative(0.0f, 1.1f, 0.89f, 2.0f, 2.0f, 2.0f)
+            horizontalLineToRelative(14.0f)
+            curveToRelative(1.1f, 0.0f, 2.0f, -0.9f, 2.0f, -2.0f)
+            verticalLineToRelative(-7.0f)
+            horizontalLineToRelative(-2.0f)
+            verticalLineToRelative(7.0f)
+            close()
+            moveTo(14.0f, 3.0f)
+            verticalLineToRelative(2.0f)
+            horizontalLineToRelative(3.59f)
+            lineToRelative(-9.83f, 9.83f)
+            lineToRelative(1.41f, 1.41f)
+            lineTo(19.0f, 6.41f)
+            verticalLineTo(10.0f)
+            horizontalLineToRelative(2.0f)
+            verticalLineTo(3.0f)
+            horizontalLineToRelative(-7.0f)
+            close()
+        }
+    }

+ 32 - 0
app/src/main/java/org/sirekanyan/outline/ui/icons/IconPlayStore.kt

@@ -0,0 +1,32 @@
+package org.sirekanyan.outline.ui.icons
+
+import androidx.compose.material.icons.materialPath
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.unit.dp
+
+val IconPlayStore: ImageVector =
+    ImageVector.Builder("Filled.Play", 24.dp, 24.dp, 614.4f, 614.4f).apply {
+        materialPath {
+            moveTo(376.5f, 285.5f)
+            lineTo(155.8f, 64.2f)
+            lineTo(436.6f, 225.4f)
+            close()
+            moveTo(98.2f, 51.2f)
+            curveTo(85.2f, 58f, 76.5f, 70.4f, 76.5f, 86.5f)
+            verticalLineToRelative(441.3f)
+            curveToRelative(0f, 16.1f, 8.7f, 28.5f, 21.7f, 35.3f)
+            lineToRelative(256.6f, -256f)
+            close()
+            moveToRelative(425.2f, 225.6f)
+            lineToRelative(-58.9f, -34.1f)
+            lineToRelative(-65.7f, 64.5f)
+            lineToRelative(65.7f, 64.5f)
+            lineToRelative(60.1f, -34.1f)
+            curveToRelative(18f, -14.3f, 18f, -46.5f, -1.2f, -60.8f)
+            close()
+            moveTo(155.8f, 550.2f)
+            lineTo(436.6f, 389f)
+            lineTo(376.5f, 328.9f)
+            close()
+        }
+    }.build()