From 5dec535173517d2467008f6e88af0d9b3b8c552d Mon Sep 17 00:00:00 2001 From: Rudolf Horvath Date: Tue, 9 Jan 2024 18:04:00 +0100 Subject: [PATCH 1/6] First trial to add a new Settings item, not tested --- .../java/com/olup/notable/components/Path.kt | 65 +++++++++++++++++++ .../com/olup/notable/modals/AppSettings.kt | 19 ++++++ .../main/java/com/olup/notable/utils/page.kt | 11 +++- .../main/java/com/olup/notable/utils/utils.kt | 2 +- 4 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/olup/notable/components/Path.kt diff --git a/app/src/main/java/com/olup/notable/components/Path.kt b/app/src/main/java/com/olup/notable/components/Path.kt new file mode 100644 index 00000000..d912d39a --- /dev/null +++ b/app/src/main/java/com/olup/notable/components/Path.kt @@ -0,0 +1,65 @@ +package com.olup.notable.components + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.* +import androidx.compose.material.Icon +import androidx.compose.material.Text +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.ArrowDropDown +import androidx.compose.material.icons.rounded.Edit +import androidx.compose.material.icons.sharp.Edit +import androidx.compose.material.icons.sharp.KeyboardArrowDown +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Popup +import com.olup.notable.noRippleClickable + +// It seems wrong to re-implement a Path selector dialog, +// but until now I only saw self drawed UI elements, not built-in android ones +// It should be simple, if I only render a text, +// and if it is clicked upon I open a Directory Selector Dialog +@Composable +fun PathMenu(value: String, onChange: (String) -> Unit) { + var isExpanded by remember { mutableStateOf(false) } + + Box() { + Row() { + Text(text = value, + fontWeight = FontWeight.Light, + modifier = Modifier.noRippleClickable { isExpanded = true }) + // Register Directory selector dialog on Click event + ) + + Icon( + Icons.Rounded.ArrowDropDown, contentDescription = "open select", + modifier = Modifier.height(20.dp) + ) + + if (isExpanded) Popup(onDismissRequest = { isExpanded = false }) { + Column( + modifier = Modifier + .width(IntrinsicSize.Max) + .border(0.5.dp, Color.Black, RectangleShape) + .background(Color.White) + ) { + Text(text = "dialogOpens", // as I am new to Android, first test if the changes until now work + fontWeight = FontWeight.Light, + color = Color.Black, + modifier = Modifier + .fillMaxWidth() + .background(Color.White) + .padding(20.dp, 10.dp) + .noRippleClickable { + //onChange(it.first) + isExpanded = false + }) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/olup/notable/modals/AppSettings.kt b/app/src/main/java/com/olup/notable/modals/AppSettings.kt index e975fb76..88c0adaf 100644 --- a/app/src/main/java/com/olup/notable/modals/AppSettings.kt +++ b/app/src/main/java/com/olup/notable/modals/AppSettings.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import com.olup.notable.components.SelectMenu +import com.olup.notable.components.PathMenu import com.olup.notable.db.KvProxy import kotlin.concurrent.thread @@ -25,6 +26,7 @@ import kotlin.concurrent.thread data class AppSettings( val version: Int, val defaultNativeTemplate: String = "blank", + val defaultSavePath: Srting = Environment.DIRECTORY_DOCUMENTS / "notable", val quickNavPages: List = listOf() ) @@ -62,6 +64,23 @@ fun AppSettingsModal(onClose: () -> Unit) { Box(Modifier.height(0.5.dp).fillMaxWidth().background(Color.Black)) Column(Modifier.padding(20.dp, 10.dp)) { + Row() { + Text(text = "Save path") + Spacer(Modifier.width(10.dp)) + PathMenu( + onChange = { + kv.setKv( + "APP_SETTINGS", + settings!!.copy(defaultSavePath = it), + AppSettings.serializer() + ) + }, + value = settings?.defaultSavePath ?: Environment.DIRECTORY_DOCUMENTS / "notable" + ) + } + + Spacer(Modifier.height(10.dp)) + Row() { Text(text = "Default Page Background Template") Spacer(Modifier.width(10.dp)) diff --git a/app/src/main/java/com/olup/notable/utils/page.kt b/app/src/main/java/com/olup/notable/utils/page.kt index 4949e066..2f1d3ed3 100644 --- a/app/src/main/java/com/olup/notable/utils/page.kt +++ b/app/src/main/java/com/olup/notable/utils/page.kt @@ -6,6 +6,7 @@ import android.os.Environment import androidx.compose.ui.unit.IntOffset import com.olup.notable.db.BookRepository import com.olup.notable.db.PageRepository +import com.olup.notable.db.appRepository import com.olup.notable.db.Stroke import io.shipbook.shipbooksdk.Log import java.io.FileOutputStream @@ -31,8 +32,16 @@ fun exportPage(context: Context, pageId: String) { private inline fun exportPdf(dir: String, name: String, write: PdfDocument.() -> Unit) { val document = PdfDocument() document.write() + + val context = LocalContext.current + val appRepository = AppRepository(context) + + val savePath = appRepository.kvProxy.get( + "APP_SETTINGS", AppSettings.serializer() + )?.defaultSavePath ?: Environment.DIRECTORY_DOCUMENTS / "notable" + val filePath = Environment.getExternalStorageDirectory().toPath() / - Environment.DIRECTORY_DOCUMENTS / "notable" / dir / "$name.pdf" + savePath / dir / "$name.pdf" Files.createDirectories(filePath.parent) FileOutputStream(filePath.absolutePathString()).use(document::writeTo) document.close() diff --git a/app/src/main/java/com/olup/notable/utils/utils.kt b/app/src/main/java/com/olup/notable/utils/utils.kt index ffb093c2..8855ac0d 100644 --- a/app/src/main/java/com/olup/notable/utils/utils.kt +++ b/app/src/main/java/com/olup/notable/utils/utils.kt @@ -249,7 +249,7 @@ fun handleSelect( } -// touchpoints is in wiew coordinates +// touchpoints is in view coordinates fun handleDraw( page: PageView, historyBucket: MutableList, From 05258b686f655dc9985f47839351c5130eaf0fb7 Mon Sep 17 00:00:00 2001 From: Rudolf Horvath Date: Sat, 13 Jan 2024 21:51:03 +0100 Subject: [PATCH 2/6] debugBuild progress --- .github/workflows/build-apk.yml | 35 +++++++++++++++++++ .../java/com/olup/notable/components/Path.kt | 4 +-- .../com/olup/notable/modals/AppSettings.kt | 7 ++-- .../main/java/com/olup/notable/utils/page.kt | 18 +++++----- 4 files changed, 51 insertions(+), 13 deletions(-) create mode 100755 .github/workflows/build-apk.yml diff --git a/.github/workflows/build-apk.yml b/.github/workflows/build-apk.yml new file mode 100755 index 00000000..6e5a5f24 --- /dev/null +++ b/.github/workflows/build-apk.yml @@ -0,0 +1,35 @@ +name: Build and Archive APK + +on: workflow_dispatch + +env: + MAVEN_OPTS: >- + -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: set up JDK 18 + uses: actions/setup-java@v3 + with: + java-version: "18" + distribution: "temurin" + + - uses: gradle/gradle-build-action@v2 + with: + gradle-version: 7.5 + + - name: Execute Gradle build + run: | + ./gradlew \ + -PIS_NEXT=true \ + assembleDebug + + - name: Archive APK + uses: actions/upload-artifact@v3 + with: + name: app-debug.apk + path: "${{ github.workspace }}/app/build/outputs/apk/debug/app-debug.apk" diff --git a/app/src/main/java/com/olup/notable/components/Path.kt b/app/src/main/java/com/olup/notable/components/Path.kt index d912d39a..4d77fb89 100644 --- a/app/src/main/java/com/olup/notable/components/Path.kt +++ b/app/src/main/java/com/olup/notable/components/Path.kt @@ -31,7 +31,7 @@ fun PathMenu(value: String, onChange: (String) -> Unit) { Row() { Text(text = value, fontWeight = FontWeight.Light, - modifier = Modifier.noRippleClickable { isExpanded = true }) + modifier = Modifier.noRippleClickable { isExpanded = true } // Register Directory selector dialog on Click event ) @@ -39,7 +39,7 @@ fun PathMenu(value: String, onChange: (String) -> Unit) { Icons.Rounded.ArrowDropDown, contentDescription = "open select", modifier = Modifier.height(20.dp) ) - + } if (isExpanded) Popup(onDismissRequest = { isExpanded = false }) { Column( modifier = Modifier diff --git a/app/src/main/java/com/olup/notable/modals/AppSettings.kt b/app/src/main/java/com/olup/notable/modals/AppSettings.kt index 88c0adaf..6c7f862c 100644 --- a/app/src/main/java/com/olup/notable/modals/AppSettings.kt +++ b/app/src/main/java/com/olup/notable/modals/AppSettings.kt @@ -2,6 +2,7 @@ package com.olup.notable import android.content.Intent import android.net.Uri +import android.os.Environment import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.* @@ -22,11 +23,12 @@ import com.olup.notable.components.PathMenu import com.olup.notable.db.KvProxy import kotlin.concurrent.thread + @kotlinx.serialization.Serializable data class AppSettings( val version: Int, val defaultNativeTemplate: String = "blank", - val defaultSavePath: Srting = Environment.DIRECTORY_DOCUMENTS / "notable", + val defaultSavePath: String = Environment.DIRECTORY_DOCUMENTS "/notable", val quickNavPages: List = listOf() ) @@ -75,7 +77,8 @@ fun AppSettingsModal(onClose: () -> Unit) { AppSettings.serializer() ) }, - value = settings?.defaultSavePath ?: Environment.DIRECTORY_DOCUMENTS / "notable" + value = settings?.defaultSavePath + ?: (Environment.DIRECTORY_DOCUMENTS + "/notable") ) } diff --git a/app/src/main/java/com/olup/notable/utils/page.kt b/app/src/main/java/com/olup/notable/utils/page.kt index 2f1d3ed3..efcfa7fa 100644 --- a/app/src/main/java/com/olup/notable/utils/page.kt +++ b/app/src/main/java/com/olup/notable/utils/page.kt @@ -3,10 +3,12 @@ package com.olup.notable import android.content.Context import android.graphics.pdf.PdfDocument import android.os.Environment +import androidx.compose.runtime.Composable import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.platform.LocalContext import com.olup.notable.db.BookRepository import com.olup.notable.db.PageRepository -import com.olup.notable.db.appRepository +import com.olup.notable.AppRepository import com.olup.notable.db.Stroke import io.shipbook.shipbooksdk.Log import java.io.FileOutputStream @@ -17,31 +19,29 @@ import kotlin.io.path.div fun exportBook(context: Context, bookId: String) { val book = BookRepository(context).getById(bookId) ?: return val pages = PageRepository(context) - exportPdf("notebooks", book.title) { + exportPdf(context, "notebooks", book.title) { book.pageIds.forEachIndexed { i, pageId -> writePage(i + 1, pages, pageId) } } } fun exportPage(context: Context, pageId: String) { val pages = PageRepository(context) - exportPdf("pages", "notable-page-${pageId.takeLast(6)}") { + exportPdf(context, "pages", "notable-page-${pageId.takeLast(6)}") { writePage(1, pages, pageId) } } -private inline fun exportPdf(dir: String, name: String, write: PdfDocument.() -> Unit) { +private inline fun exportPdf(context: Context, dir: String, name: String, write: PdfDocument.() -> Unit) { val document = PdfDocument() document.write() - val context = LocalContext.current val appRepository = AppRepository(context) val savePath = appRepository.kvProxy.get( - "APP_SETTINGS", AppSettings.serializer() - )?.defaultSavePath ?: Environment.DIRECTORY_DOCUMENTS / "notable" + "APP_SETTINGS", AppSettings.serializer() + )?.defaultSavePath ?: (Environment.DIRECTORY_DOCUMENTS + "/notable") - val filePath = Environment.getExternalStorageDirectory().toPath() / - savePath / dir / "$name.pdf" + val filePath = Environment.getExternalStorageDirectory().toPath() + "/$savePath/$dir/$name.pdf" Files.createDirectories(filePath.parent) FileOutputStream(filePath.absolutePathString()).use(document::writeTo) document.close() From d1c96d5c77edab2c8f208184683c39e7020748e0 Mon Sep 17 00:00:00 2001 From: Rudolf Horvath Date: Fri, 19 Jan 2024 23:17:24 +0100 Subject: [PATCH 3/6] buildable, appears and clickable --- .github/workflows/build-apk.yml | 7 +++++++ app/src/main/java/com/olup/notable/modals/AppSettings.kt | 2 +- app/src/main/java/com/olup/notable/utils/page.kt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) mode change 100755 => 100644 .github/workflows/build-apk.yml diff --git a/.github/workflows/build-apk.yml b/.github/workflows/build-apk.yml old mode 100755 new mode 100644 index 6e5a5f24..45230e01 --- a/.github/workflows/build-apk.yml +++ b/.github/workflows/build-apk.yml @@ -24,7 +24,14 @@ jobs: - name: Execute Gradle build run: | + # For debugging, an ephemeral key suffice + keytool -genkey -v -keystore debug.keystore -storepass pass -alias androiddebugkey -keypass pass -dname "CN=Android Debug,O=Android,C=US" + ./gradlew \ + -PDEBUG_STORE_FILE=debug.keystore \ + -PDEBUG_STORE_PASSWORD=pass \ + -PDEBUG_KEY_ALIAS=androiddebugkey \ + -PDEBUG_KEY_PASSWORD=pass \ -PIS_NEXT=true \ assembleDebug diff --git a/app/src/main/java/com/olup/notable/modals/AppSettings.kt b/app/src/main/java/com/olup/notable/modals/AppSettings.kt index 6c7f862c..aefa2c4f 100644 --- a/app/src/main/java/com/olup/notable/modals/AppSettings.kt +++ b/app/src/main/java/com/olup/notable/modals/AppSettings.kt @@ -28,7 +28,7 @@ import kotlin.concurrent.thread data class AppSettings( val version: Int, val defaultNativeTemplate: String = "blank", - val defaultSavePath: String = Environment.DIRECTORY_DOCUMENTS "/notable", + val defaultSavePath: String = Environment.DIRECTORY_DOCUMENTS + "/notable", val quickNavPages: List = listOf() ) diff --git a/app/src/main/java/com/olup/notable/utils/page.kt b/app/src/main/java/com/olup/notable/utils/page.kt index efcfa7fa..1d53198e 100644 --- a/app/src/main/java/com/olup/notable/utils/page.kt +++ b/app/src/main/java/com/olup/notable/utils/page.kt @@ -41,7 +41,7 @@ private inline fun exportPdf(context: Context, dir: String, name: String, write: "APP_SETTINGS", AppSettings.serializer() )?.defaultSavePath ?: (Environment.DIRECTORY_DOCUMENTS + "/notable") - val filePath = Environment.getExternalStorageDirectory().toPath() + "/$savePath/$dir/$name.pdf" + val filePath = Environment.getExternalStorageDirectory().toPath() / "$savePath/$dir/$name.pdf" Files.createDirectories(filePath.parent) FileOutputStream(filePath.absolutePathString()).use(document::writeTo) document.close() From 416db9ad971926ac9601ab71c910aeb15d0558bd Mon Sep 17 00:00:00 2001 From: Rudolf Horvath Date: Fri, 19 Jan 2024 23:28:22 +0100 Subject: [PATCH 4/6] password was too short --- .github/workflows/build-apk.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-apk.yml b/.github/workflows/build-apk.yml index 45230e01..6befa68e 100644 --- a/.github/workflows/build-apk.yml +++ b/.github/workflows/build-apk.yml @@ -25,13 +25,13 @@ jobs: - name: Execute Gradle build run: | # For debugging, an ephemeral key suffice - keytool -genkey -v -keystore debug.keystore -storepass pass -alias androiddebugkey -keypass pass -dname "CN=Android Debug,O=Android,C=US" + keytool -genkey -v -keystore debug.keystore -storepass password -alias androiddebugkey -keypass password -dname "CN=Android Debug,O=Android,C=US" ./gradlew \ -PDEBUG_STORE_FILE=debug.keystore \ - -PDEBUG_STORE_PASSWORD=pass \ + -PDEBUG_STORE_PASSWORD=password \ -PDEBUG_KEY_ALIAS=androiddebugkey \ - -PDEBUG_KEY_PASSWORD=pass \ + -PDEBUG_KEY_PASSWORD=password \ -PIS_NEXT=true \ assembleDebug From 60d32924e3123ac26979fc51a693024f870b4506 Mon Sep 17 00:00:00 2001 From: Rudolf Horvath Date: Fri, 19 Jan 2024 23:31:16 +0100 Subject: [PATCH 5/6] missing parameters --- .github/workflows/build-apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-apk.yml b/.github/workflows/build-apk.yml index 6befa68e..c6d5a6ba 100644 --- a/.github/workflows/build-apk.yml +++ b/.github/workflows/build-apk.yml @@ -25,7 +25,7 @@ jobs: - name: Execute Gradle build run: | # For debugging, an ephemeral key suffice - keytool -genkey -v -keystore debug.keystore -storepass password -alias androiddebugkey -keypass password -dname "CN=Android Debug,O=Android,C=US" + keytool -genkey -v -keystore debug.keystore -storepass password -alias androiddebugkey -keyalg RSA -keysize 2048 -validity 10000 -keypass password -dname "CN=Android Debug,O=Android,C=US" ./gradlew \ -PDEBUG_STORE_FILE=debug.keystore \ From 62de4c2b934d3f8364e894e03f8cc571b762a773 Mon Sep 17 00:00:00 2001 From: Rudolf Horvath Date: Fri, 19 Jan 2024 23:37:56 +0100 Subject: [PATCH 6/6] consistent path handling for debug key --- .github/workflows/build-apk.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-apk.yml b/.github/workflows/build-apk.yml index c6d5a6ba..b5d81766 100644 --- a/.github/workflows/build-apk.yml +++ b/.github/workflows/build-apk.yml @@ -25,10 +25,10 @@ jobs: - name: Execute Gradle build run: | # For debugging, an ephemeral key suffice - keytool -genkey -v -keystore debug.keystore -storepass password -alias androiddebugkey -keyalg RSA -keysize 2048 -validity 10000 -keypass password -dname "CN=Android Debug,O=Android,C=US" + keytool -genkey -v -keystore ${{ github.workspace }}/debug.keystore -storepass password -alias androiddebugkey -keyalg RSA -keysize 2048 -validity 10000 -keypass password -dname "CN=Android Debug,O=Android,C=US" ./gradlew \ - -PDEBUG_STORE_FILE=debug.keystore \ + -PDEBUG_STORE_FILE=${{ github.workspace }}/debug.keystore \ -PDEBUG_STORE_PASSWORD=password \ -PDEBUG_KEY_ALIAS=androiddebugkey \ -PDEBUG_KEY_PASSWORD=password \