diff --git a/app/build.gradle b/app/build.gradle index ea96f72..a35cefa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { applicationId "com.olup.notable" minSdk 29 targetSdk 33 - versionCode 6 - versionName "0.0.6" + versionCode 7 + versionName "0.0.7" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { @@ -46,6 +46,8 @@ android { kotlinCompilerExtensionVersion compose_version } packagingOptions { + pickFirst '**/*.so' + resources { excludes += '/META-INF/{AL2.0,LGPL2.1}' } @@ -62,7 +64,13 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1' implementation 'androidx.activity:activity-compose:1.3.1' - implementation fileTree(dir: 'libs', include: ['*.aar']) + //implementation fileTree(dir: 'libs', include: ['*.aar']) + implementation('com.onyx.android.sdk:onyxsdk-device:1.2.21') { + exclude group: 'com.android.support', module: 'support-compat' + } + implementation('com.onyx.android.sdk:onyxsdk-pen:1.4.4') { + exclude group: 'com.android.support', module: 'support-compat' + } // used in RawInputManager. implementation group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.2.21' implementation group: 'io.reactivex.rxjava2', name: 'rxandroid', version: '2.1.1' @@ -91,12 +99,12 @@ dependencies { implementation "com.google.accompanist:accompanist-navigation-animation:0.29.1-alpha" implementation 'com.aventrix.jnanoid:jnanoid:2.0.0' - implementation 'androidx.datastore:datastore-preferences:1.0.0' implementation platform('com.google.firebase:firebase-bom:31.2.3') implementation 'com.google.firebase:firebase-analytics-ktx' implementation 'br.com.devsrsouza.compose.icons.android:feather:1.0.0' + implementation "com.beust:klaxon:5.5" } diff --git a/app/src/main/java/com/olup/notable/MainActivity.kt b/app/src/main/java/com/olup/notable/MainActivity.kt index 65fb5fd..ba53b99 100644 --- a/app/src/main/java/com/olup/notable/MainActivity.kt +++ b/app/src/main/java/com/olup/notable/MainActivity.kt @@ -9,14 +9,12 @@ import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.remember import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.lifecycle.lifecycleScope import com.olup.notable.ui.theme.InkaTheme -import com.onyx.android.sdk.api.device.EpdDeviceManager import com.onyx.android.sdk.api.device.epd.EpdController import kotlinx.coroutines.launch @@ -28,19 +26,22 @@ var SCREEN_HEIGHT = EpdController.getEpdWidth().toInt() @ExperimentalFoundationApi class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + if(SCREEN_WIDTH == 0){ SCREEN_WIDTH = applicationContext.resources.displayMetrics.widthPixels SCREEN_HEIGHT = applicationContext.resources.displayMetrics.heightPixels } - super.onCreate(savedInstanceState) - EpdDeviceManager.enterAnimationUpdate(true); val snackState = SnackState() + // Refactor - we prob don't need this + EditorSettingCacheManager.init(applicationContext) - DataStoreManager.init(applicationContext) - setContent { + //EpdDeviceManager.enterAnimationUpdate(true); + + setContent { InkaTheme { CompositionLocalProvider(SnackContext provides snackState ) { Box( diff --git a/app/src/main/java/com/olup/notable/AppRepository.kt b/app/src/main/java/com/olup/notable/classes/AppRepository.kt similarity index 100% rename from app/src/main/java/com/olup/notable/AppRepository.kt rename to app/src/main/java/com/olup/notable/classes/AppRepository.kt diff --git a/app/src/main/java/com/olup/notable/DrawCanvas.kt b/app/src/main/java/com/olup/notable/classes/DrawCanvas.kt similarity index 99% rename from app/src/main/java/com/olup/notable/DrawCanvas.kt rename to app/src/main/java/com/olup/notable/classes/DrawCanvas.kt index 6f027bf..57c1f67 100644 --- a/app/src/main/java/com/olup/notable/DrawCanvas.kt +++ b/app/src/main/java/com/olup/notable/classes/DrawCanvas.kt @@ -29,7 +29,7 @@ class DrawCanvas( val _context: Context, val coroutineScope: CoroutineScope, val state: EditorState, - val page: PageModel, + val page: PageView, val history: History ) : SurfaceView(_context) { @@ -331,6 +331,7 @@ class DrawCanvas( ) ).setExcludeRect(listOf(android.graphics.Rect(0, 0, this.width, exclusionHeight))).openRawDrawing() touchHelper.setRawDrawingEnabled(true) + updatePenAndStroke() refreshUi() } diff --git a/app/src/main/java/com/olup/notable/EditorControlTower.kt b/app/src/main/java/com/olup/notable/classes/EditorControlTower.kt similarity index 95% rename from app/src/main/java/com/olup/notable/EditorControlTower.kt rename to app/src/main/java/com/olup/notable/classes/EditorControlTower.kt index c3dc9cc..d194ba8 100644 --- a/app/src/main/java/com/olup/notable/EditorControlTower.kt +++ b/app/src/main/java/com/olup/notable/classes/EditorControlTower.kt @@ -2,12 +2,11 @@ package com.olup.notable import android.graphics.Rect import androidx.compose.ui.unit.toOffset -import com.olup.notable.PageModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch class EditorControlTower( - val scope: CoroutineScope, val page: PageModel, val history: History, val state: EditorState + val scope: CoroutineScope, val page: PageView, val history: History, val state: EditorState ) { fun onSingleFingerVerticalSwipe(startPosition: SimplePointF, delta: Int) { diff --git a/app/src/main/java/com/olup/notable/objects/PageModel.kt b/app/src/main/java/com/olup/notable/classes/PageView.kt similarity index 99% rename from app/src/main/java/com/olup/notable/objects/PageModel.kt rename to app/src/main/java/com/olup/notable/classes/PageView.kt index 2a4ed2b..b9d3f19 100644 --- a/app/src/main/java/com/olup/notable/objects/PageModel.kt +++ b/app/src/main/java/com/olup/notable/classes/PageView.kt @@ -10,7 +10,6 @@ import androidx.core.graphics.toRect import com.olup.notable.db.AppDatabase import com.olup.notable.db.Page import com.olup.notable.db.Stroke -import com.onyx.android.sdk.api.device.epd.EpdController import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.debounce @@ -23,7 +22,7 @@ import kotlin.io.path.Path import kotlin.math.max import kotlin.system.measureTimeMillis -class PageModel( +class PageView( val context: Context, val coroutineScope: CoroutineScope, val id: String, diff --git a/app/src/main/java/com/olup/notable/objects/SnackBar.kt b/app/src/main/java/com/olup/notable/classes/SnackBar.kt similarity index 100% rename from app/src/main/java/com/olup/notable/objects/SnackBar.kt rename to app/src/main/java/com/olup/notable/classes/SnackBar.kt diff --git a/app/src/main/java/com/olup/notable/components/EditorGestureReceiver.kt b/app/src/main/java/com/olup/notable/components/EditorGestureReceiver.kt index 956fc14..8d9ee7d 100644 --- a/app/src/main/java/com/olup/notable/components/EditorGestureReceiver.kt +++ b/app/src/main/java/com/olup/notable/components/EditorGestureReceiver.kt @@ -8,10 +8,9 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier -import androidx.compose.ui.geometry.Offset import androidx.compose.ui.input.pointer.PointerType import androidx.compose.ui.input.pointer.pointerInput -import androidx.compose.ui.input.pointer.pointerInteropFilter +import com.olup.notable.EditorControlTower import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/olup/notable/components/EditorSurface.kt b/app/src/main/java/com/olup/notable/components/EditorSurface.kt index cd17ce0..deb23fe 100644 --- a/app/src/main/java/com/olup/notable/components/EditorSurface.kt +++ b/app/src/main/java/com/olup/notable/components/EditorSurface.kt @@ -11,7 +11,7 @@ import androidx.compose.ui.viewinterop.AndroidView @Composable @ExperimentalComposeUiApi fun EditorSurface( - state: EditorState, page : PageModel, history: History + state: EditorState, page : PageView, history: History ) { val couroutineScope = rememberCoroutineScope() println("recompose surface") diff --git a/app/src/main/java/com/olup/notable/components/PageMenu.kt b/app/src/main/java/com/olup/notable/components/PageMenu.kt index 193b397..54b0808 100644 --- a/app/src/main/java/com/olup/notable/components/PageMenu.kt +++ b/app/src/main/java/com/olup/notable/components/PageMenu.kt @@ -13,6 +13,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Popup import androidx.compose.ui.window.PopupProperties +import com.olup.notable.AppRepository import com.olup.notable.db.Page diff --git a/app/src/main/java/com/olup/notable/components/QuickNav.kt b/app/src/main/java/com/olup/notable/components/QuickNav.kt index 02be4a1..979985f 100644 --- a/app/src/main/java/com/olup/notable/components/QuickNav.kt +++ b/app/src/main/java/com/olup/notable/components/QuickNav.kt @@ -10,27 +10,19 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items -import androidx.compose.material.Icon -import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.key import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.input.key.Key import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.Dialog import androidx.navigation.NavController -import com.olup.notable.db.KvProxy +import com.olup.notable.AppRepository import compose.icons.FeatherIcons -import compose.icons.feathericons.CloudLightning import compose.icons.feathericons.Home import compose.icons.feathericons.Plus -import compose.icons.feathericons.Zap @SuppressLint("SuspiciousIndentation") @Composable diff --git a/app/src/main/java/com/olup/notable/components/ScrollIndicator.kt b/app/src/main/java/com/olup/notable/components/ScrollIndicator.kt index 2ea6c13..934dc84 100644 --- a/app/src/main/java/com/olup/notable/components/ScrollIndicator.kt +++ b/app/src/main/java/com/olup/notable/components/ScrollIndicator.kt @@ -14,7 +14,7 @@ import kotlin.math.max @Composable fun ScrollIndicator(context: Context, state: EditorState) { - val page = state.pageModel + val page = state.pageView val virtualHeight = max(page.height, page.scroll + page.viewHeight) if(virtualHeight <= page.viewHeight) return diff --git a/app/src/main/java/com/olup/notable/components/SelectorBitmap.kt b/app/src/main/java/com/olup/notable/components/SelectorBitmap.kt index 35d93ca..8f2b6f1 100644 --- a/app/src/main/java/com/olup/notable/components/SelectorBitmap.kt +++ b/app/src/main/java/com/olup/notable/components/SelectorBitmap.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.round +import com.olup.notable.EditorControlTower import java.util.Date import java.util.UUID diff --git a/app/src/main/java/com/olup/notable/components/Toolbar.kt b/app/src/main/java/com/olup/notable/components/Toolbar.kt index 4d0b9c5..e93db7d 100644 --- a/app/src/main/java/com/olup/notable/components/Toolbar.kt +++ b/app/src/main/java/com/olup/notable/components/Toolbar.kt @@ -72,7 +72,7 @@ fun Toolbar( if (isPageSettingsModalOpen) { - PageSettingsModal(pageModel = state.pageModel) { + PageSettingsModal(pageView = state.pageView) { isPageSettingsModalOpen = false } } diff --git a/app/src/main/java/com/olup/notable/components/ToolbarMenu.kt b/app/src/main/java/com/olup/notable/components/ToolbarMenu.kt index ee128c6..8aafedb 100644 --- a/app/src/main/java/com/olup/notable/components/ToolbarMenu.kt +++ b/app/src/main/java/com/olup/notable/components/ToolbarMenu.kt @@ -3,8 +3,6 @@ package com.olup.notable import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.* -import androidx.compose.foundation.text.BasicTextField -import androidx.compose.foundation.text.KeyboardActions import androidx.compose.material.Text import androidx.compose.runtime.* import androidx.compose.ui.Alignment @@ -12,15 +10,12 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Popup import androidx.compose.ui.window.PopupProperties import androidx.navigation.NavController -import com.olup.notable.PageModel -import kotlinx.coroutines.coroutineScope +import com.olup.notable.AppRepository import kotlinx.coroutines.delay import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/olup/notable/datastore/DataStoreManager.kt b/app/src/main/java/com/olup/notable/datastore/EditorSettingCacheManager.kt similarity index 76% rename from app/src/main/java/com/olup/notable/datastore/DataStoreManager.kt rename to app/src/main/java/com/olup/notable/datastore/EditorSettingCacheManager.kt index c9852b3..fb564f8 100644 --- a/app/src/main/java/com/olup/notable/datastore/DataStoreManager.kt +++ b/app/src/main/java/com/olup/notable/datastore/EditorSettingCacheManager.kt @@ -1,20 +1,15 @@ package com.olup.notable import android.content.Context -import androidx.datastore.core.DataStore -import androidx.datastore.preferences.core.Preferences -import androidx.datastore.preferences.core.edit -import androidx.datastore.preferences.core.stringPreferencesKey -import androidx.datastore.preferences.preferencesDataStore +import com.olup.notable.AppRepository import com.olup.notable.db.Kv -import kotlinx.coroutines.flow.map import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json val persistVersion = 2 -object DataStoreManager { +object EditorSettingCacheManager { @kotlinx.serialization.Serializable data class EditorSettings( @@ -47,8 +42,4 @@ object DataStoreManager { editorSettings = newEditorSettings if(shouldPersist) persist(context, newEditorSettings) } - - fun persistEditorSetting(newEditorSettings: EditorSettings) { - editorSettings = newEditorSettings - } } 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 69993f0..12a13ca 100644 --- a/app/src/main/java/com/olup/notable/modals/AppSettings.kt +++ b/app/src/main/java/com/olup/notable/modals/AppSettings.kt @@ -11,6 +11,9 @@ import androidx.compose.ui.geometry.Rect import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import com.olup.notable.components.SelectMenu @@ -31,8 +34,14 @@ data class AppSettings ( @Composable fun AppSettingsModal(onClose: () -> Unit) { - val kv = KvProxy(LocalContext.current) + val context = LocalContext.current + val kv = KvProxy(context) + val isLatestVersion = remember { + isLatestVersion(context) + } val settings by kv.observeKv("APP_SETTINGS", AppSettings.serializer(), AppSettings(version = 1)).observeAsState() + val uriHandler = LocalUriHandler.current + if(settings == null) return Dialog( @@ -79,6 +88,15 @@ fun AppSettingsModal(onClose: () -> Unit) { } Spacer(Modifier.height(10.dp)) + + if(!isLatestVersion){ + Text(text = "It seems a new version of ypu app is available on github.", fontStyle = FontStyle.Italic) + Spacer(Modifier.height(10.dp)) + Text(text = "See release in browser", textDecoration = TextDecoration.Underline, modifier=Modifier.noRippleClickable { + uriHandler.openUri("https://github.com/olup/notable-public/releases") + }) + Spacer(Modifier.height(10.dp)) + } } } diff --git a/app/src/main/java/com/olup/notable/modals/PageSettings.kt b/app/src/main/java/com/olup/notable/modals/PageSettings.kt index 512244c..9cd5fe3 100644 --- a/app/src/main/java/com/olup/notable/modals/PageSettings.kt +++ b/app/src/main/java/com/olup/notable/modals/PageSettings.kt @@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.* import androidx.compose.material.Text import androidx.compose.runtime.* import androidx.compose.ui.Modifier -import androidx.compose.ui.geometry.Rect import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.unit.dp @@ -15,8 +14,8 @@ import com.olup.notable.components.SelectMenu import kotlinx.coroutines.launch @Composable -fun PageSettingsModal(pageModel: PageModel, onClose: () -> Unit) { - var pageTemplate by remember { mutableStateOf(pageModel.pageFromDb!!.nativeTemplate) } +fun PageSettingsModal(pageView: PageView, onClose: () -> Unit) { + var pageTemplate by remember { mutableStateOf(pageView.pageFromDb!!.nativeTemplate) } val scope = rememberCoroutineScope() Dialog( onDismissRequest = { onClose() } @@ -55,10 +54,10 @@ fun PageSettingsModal(pageModel: PageModel, onClose: () -> Unit) { "squared" to "Small squares grid" ), onChange = { - val updatedPage = pageModel.pageFromDb!!.copy(nativeTemplate = it) - pageModel.updatePageSettings(updatedPage) + val updatedPage = pageView.pageFromDb!!.copy(nativeTemplate = it) + pageView.updatePageSettings(updatedPage) scope.launch { DrawCanvas.refreshUi.emit(Unit) } - pageTemplate = pageModel.pageFromDb!!.nativeTemplate + pageTemplate = pageView.pageFromDb!!.nativeTemplate }, value = pageTemplate ) diff --git a/app/src/main/java/com/olup/notable/sync.kt b/app/src/main/java/com/olup/notable/sync.kt deleted file mode 100644 index 6b7072d..0000000 --- a/app/src/main/java/com/olup/notable/sync.kt +++ /dev/null @@ -1,73 +0,0 @@ -package com.olup.notable - -import android.content.Context -import android.graphics.pdf.PdfDocument -import android.os.Environment -import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.unit.IntOffset -import com.onyx.android.sdk.api.device.epd.EpdController -import java.io.File -import java.io.FileOutputStream -import java.nio.file.Files -import kotlin.io.path.Path -import kotlin.math.max - -// export page -fun exportPageToPdf(context: Context, bookId: String, pageId: String) { - val appRepository = AppRepository(context) - val page = appRepository.pageRepository.getWithStrokeById(pageId) - val book = appRepository.bookRepository.getById(bookId)?:return - - val pageWidth = EpdController.getEpdHeight() // TODO get page width - var maxPointY = 0f - - page.strokes.forEach { s -> - s.points.forEach { p -> - if (p.y > maxPointY) { - maxPointY = p.y - } - } - } - val pageHeight = max(maxPointY + 50, EpdController.getEpdWidth()) - - var pdfDocument = PdfDocument() - val pdfPage = - pdfDocument.startPage(PdfDocument.PageInfo.Builder(pageWidth.toInt(), pageHeight.toInt(), 1).create()) - var canvas = pdfPage.canvas - - drawDottedBg(canvas,0) - - page.strokes.forEach { - drawStroke( - canvas, it, IntOffset(0, 0) - ) - } - pdfDocument.finishPage(pdfPage) - - - val bookTitle = book.title - val pageNaturalIndex = book.pageIds.indexOf(pageId) +1 - val file = File(context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "inka/$bookTitle-$bookId/pages/$pageNaturalIndex.pdf") - Files.createDirectories(Path(file.absolutePath).parent) - - - try { - // after creating a file name we will - // write our PDF file to that location. - pdfDocument.writeTo(FileOutputStream(file)) - - } catch (e: Exception) { - // below line is used - // to handle error - e.printStackTrace() - } - // after storing our pdf to that - // location we are closing our PDF file. - pdfDocument.close() - - -} - -fun exportBook(context: Context, bookId: Int){ - -} \ No newline at end of file diff --git a/app/src/main/java/com/olup/notable/utils/EditorState.kt b/app/src/main/java/com/olup/notable/utils/EditorState.kt index 4d3b10e..005de27 100644 --- a/app/src/main/java/com/olup/notable/utils/EditorState.kt +++ b/app/src/main/java/com/olup/notable/utils/EditorState.kt @@ -13,9 +13,9 @@ enum class Mode { Draw, Erase, Select } -class EditorState(val bookId: String? = null, val pageId: String, val pageModel: PageModel) { +class EditorState(val bookId: String? = null, val pageId: String, val pageView: PageView) { - val persistedEditorSettings = DataStoreManager.getEditorSettings() + val persistedEditorSettings = EditorSettingCacheManager.getEditorSettings() var mode by mutableStateOf(persistedEditorSettings?.mode ?: Mode.Draw) // should save var pen by mutableStateOf(persistedEditorSettings?.pen ?: Pen.BALLPEN) // should save diff --git a/app/src/main/java/com/olup/notable/utils/draw.kt b/app/src/main/java/com/olup/notable/utils/draw.kt index b68ace0..4b400fe 100644 --- a/app/src/main/java/com/olup/notable/utils/draw.kt +++ b/app/src/main/java/com/olup/notable/utils/draw.kt @@ -4,6 +4,7 @@ import android.graphics.* import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.toOffset import com.olup.notable.db.Stroke +import com.onyx.android.sdk.data.note.ShapeCreateArgs import com.onyx.android.sdk.data.note.TouchPoint import com.onyx.android.sdk.pen.NeoBrushPen import com.onyx.android.sdk.pen.NeoCharcoalPen @@ -71,7 +72,7 @@ fun drawStroke(canvas: Canvas, stroke: Stroke, offset: IntOffset) { when (stroke.pen) { Pen.BALLPEN -> drawBallPenStroke(canvas, paint, stroke.size, points) Pen.PENCIL -> NeoCharcoalPen.drawNormalStroke( - null, canvas, paint, points, -16777216, stroke.size, pressure, 90, false + null, canvas, paint, points, -16777216, stroke.size, ShapeCreateArgs(), Matrix(),false ) Pen.BRUSH -> NeoBrushPen.drawStroke(canvas, paint, points, stroke.size, pressure, false) Pen.MARKER -> drawMarkerStroke(canvas, paint, stroke.size, points) diff --git a/app/src/main/java/com/olup/notable/utils/history.kt b/app/src/main/java/com/olup/notable/utils/history.kt index 61909b3..fc7c14f 100644 --- a/app/src/main/java/com/olup/notable/utils/history.kt +++ b/app/src/main/java/com/olup/notable/utils/history.kt @@ -2,7 +2,6 @@ package com.olup.notable import android.graphics.Rect import com.olup.notable.db.Stroke -import com.olup.notable.PageModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.launch @@ -26,11 +25,11 @@ sealed class HistoryBusActions { data class MoveHistory(val type: UndoRedoType) : HistoryBusActions() } -class History(coroutineScope: CoroutineScope, pageModel: PageModel) { +class History(coroutineScope: CoroutineScope, pageView: PageView) { private var undoList: OperationList = mutableListOf() private var redoList: OperationList = mutableListOf() - val pageModel = pageModel + val pageModel = pageView // TODO maybe not in a companion object ? companion object { @@ -51,7 +50,7 @@ class History(coroutineScope: CoroutineScope, pageModel: PageModel) { is HistoryBusActions.MoveHistory -> { val zoneAffected = undoRedo(type = it.type) if(zoneAffected != null) { - pageModel.drawArea(pageAreaToCanvasArea(zoneAffected, pageModel.scroll)) + pageView.drawArea(pageAreaToCanvasArea(zoneAffected, pageView.scroll)) } } is HistoryBusActions.RegisterHistoryOperationBlock -> { addOperationsToHistory(it.operationBlock)} diff --git a/app/src/main/java/com/olup/notable/utils/pen.kt b/app/src/main/java/com/olup/notable/utils/pen.kt index eafdb46..6be766e 100644 --- a/app/src/main/java/com/olup/notable/utils/pen.kt +++ b/app/src/main/java/com/olup/notable/utils/pen.kt @@ -16,7 +16,7 @@ fun penToStroke(pen: Pen): Int { Pen.PENCIL -> StrokeStyle.CHARCOAL Pen.BRUSH -> StrokeStyle.NEO_BRUSH Pen.MARKER -> StrokeStyle.MARKER - Pen.FOUNTAIN -> StrokeStyle.BRUSH + Pen.FOUNTAIN -> StrokeStyle.FOUNTAIN } } 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 9e1989f..402bc6a 100644 --- a/app/src/main/java/com/olup/notable/utils/utils.kt +++ b/app/src/main/java/com/olup/notable/utils/utils.kt @@ -18,7 +18,6 @@ import androidx.core.graphics.toRect import androidx.core.graphics.toRegion import com.olup.notable.db.* import com.onyx.android.sdk.data.note.TouchPoint -import com.onyx.android.sdk.utils.BroadcastHelper.App import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow @@ -113,7 +112,7 @@ fun pointsToPath(points: List): Path { // points is in page coordinates fun handleErase( - page: PageModel, + page: PageView, history: History, points: List, ) { @@ -156,7 +155,7 @@ enum class SelectPointPosition { // points is in page coodinates fun handleSelect( scope: CoroutineScope, - page: PageModel, + page: PageView, editorState: EditorState, points: List ) { @@ -249,7 +248,7 @@ fun handleSelect( // touchpoints is in wiew coordinates fun handleDraw( - page: PageModel, + page: PageView, historyBucket: MutableList, strokeSize: Float, pen: Pen, diff --git a/app/src/main/java/com/olup/notable/utils/versionChecker.kt b/app/src/main/java/com/olup/notable/utils/versionChecker.kt new file mode 100644 index 0000000..22fab80 --- /dev/null +++ b/app/src/main/java/com/olup/notable/utils/versionChecker.kt @@ -0,0 +1,63 @@ +package com.olup.notable + +import java.net.URL +import java.io.BufferedReader +import java.io.InputStreamReader +import android.content.Context +import android.content.pm.PackageManager + +fun getLatestReleaseVersion(repoOwner: String, repoName: String): String? { + val apiUrl = "https://api.github.com/repos/$repoOwner/$repoName/releases/latest" + val url = URL(apiUrl) + val connection = url.openConnection() + connection.setRequestProperty("User-Agent", "Mozilla/5.0") + val reader = BufferedReader(InputStreamReader(connection.getInputStream())) + val json = StringBuilder() + var line: String? + while (reader.readLine().also { line = it } != null) { + json.append(line) + } + reader.close() + + // Parse the JSON response and extract the tag name + val version = json.toString() + .split("\"tag_name\":")[1] + .split(",")[0] + .replace("\"", "") + .trim() + + // Check if the tag name starts with "v" and remove it if necessary + return if (version.startsWith("v")) { + version.substring(1) + } else { + version + } +} + + + +fun getCurrentVersionName(context: Context): String? { + try { + val packageInfo = context.packageManager.getPackageInfo(context.packageName, 0) + return packageInfo.versionName + } catch (e: PackageManager.NameNotFoundException) { + e.printStackTrace() + } + return null +} + +// cache +var isLatestVersion : Boolean? = null +fun isLatestVersion(context: Context) : Boolean{ + if(isLatestVersion!=null) return isLatestVersion!! + + try { + val version = getCurrentVersionName(context) + val latestVersion = getLatestReleaseVersion("olup", "notable-public") + isLatestVersion = version != latestVersion + return isLatestVersion!! + } catch (e: Exception) { + println("Failed to fetch latest release version: ${e.message}") + return true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/olup/notable/views/EditorView.kt b/app/src/main/java/com/olup/notable/views/EditorView.kt index dcd1013..fbb6df4 100644 --- a/app/src/main/java/com/olup/notable/views/EditorView.kt +++ b/app/src/main/java/com/olup/notable/views/EditorView.kt @@ -37,7 +37,7 @@ fun EditorView( val page = remember { - PageModel( + PageView( context = context, coroutineScope = scope, id = _pageId, @@ -47,7 +47,7 @@ fun EditorView( ) } - val editorState = remember { EditorState(bookId = _bookId, pageId = _pageId, pageModel = page) } + val editorState = remember { EditorState(bookId = _bookId, pageId = _pageId, pageView = page) } val history = remember { History(scope, page) @@ -73,9 +73,9 @@ fun EditorView( editorState.mode ) { println("saving") - DataStoreManager.setEditorSettings( + EditorSettingCacheManager.setEditorSettings( context, - DataStoreManager.EditorSettings( + EditorSettingCacheManager.EditorSettings( isToolbarOpen = editorState.isToolbarOpen, mode = editorState.mode, pen = editorState.pen, diff --git a/app/src/main/java/com/olup/notable/views/HomeView.kt b/app/src/main/java/com/olup/notable/views/HomeView.kt index f26b1c7..2d7a214 100644 --- a/app/src/main/java/com/olup/notable/views/HomeView.kt +++ b/app/src/main/java/com/olup/notable/views/HomeView.kt @@ -8,6 +8,8 @@ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Badge +import androidx.compose.material.BadgedBox import androidx.compose.material.Icon import androidx.compose.material.Text import androidx.compose.runtime.* @@ -15,7 +17,6 @@ import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.RectangleShape @@ -23,18 +24,19 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.navigation.NavController +import com.olup.notable.AppRepository import com.olup.notable.db.Folder import com.olup.notable.db.Notebook import com.olup.notable.db.Page import compose.icons.FeatherIcons import compose.icons.feathericons.Folder import compose.icons.feathericons.Settings -import kotlinx.coroutines.launch @ExperimentalFoundationApi @ExperimentalComposeUiApi @Composable fun Library(navController: NavController, folderId: String? = null) { + val context = LocalContext.current var isSettingsOpen by remember { mutableStateOf(false) @@ -46,6 +48,10 @@ fun Library(navController: NavController, folderId: String? = null) { .observeAsState() val folders by appRepository.folderRepository.getAllInFolder(folderId).observeAsState() + val isLatestVersion = remember { + isLatestVersion(context) + } + Column( Modifier.fillMaxSize() ) { @@ -53,14 +59,19 @@ fun Library(navController: NavController, folderId: String? = null) { ) { Row(Modifier.fillMaxWidth()) { Spacer(modifier = Modifier.weight(1f)) - Icon( - imageVector = FeatherIcons.Settings, - contentDescription = "", - Modifier - .padding(8.dp) - .noRippleClickable { - isSettingsOpen = true - }) + BadgedBox( + badge = { if(!isLatestVersion) Badge( backgroundColor = Color.Black ) } + ) { + Icon( + imageVector = FeatherIcons.Settings, + contentDescription = "", + Modifier + .padding(8.dp) + .noRippleClickable { + isSettingsOpen = true + }) + } + } Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) { Text(text = "Add quick page", @@ -71,8 +82,7 @@ fun Library(navController: NavController, folderId: String? = null) { notebookId = null, parentFolderId = folderId, nativeTemplate = appRepository.kvProxy.get( - "APP_SETTINGS", - AppSettings.serializer() + "APP_SETTINGS", AppSettings.serializer() )?.defaultNativeTemplate ?: "blank" ) appRepository.pageRepository.create(page) diff --git a/app/src/main/java/com/olup/notable/views/PagesView.kt b/app/src/main/java/com/olup/notable/views/PagesView.kt index 8718ae7..2c39613 100644 --- a/app/src/main/java/com/olup/notable/views/PagesView.kt +++ b/app/src/main/java/com/olup/notable/views/PagesView.kt @@ -6,7 +6,6 @@ import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid -import androidx.compose.foundation.lazy.grid.items import androidx.compose.material.Text import androidx.compose.runtime.* import androidx.compose.runtime.livedata.observeAsState @@ -16,6 +15,7 @@ import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.navigation.NavController +import com.olup.notable.AppRepository @ExperimentalFoundationApi @Composable diff --git a/build.gradle b/build.gradle index 5ee97fb..1049f7d 100644 --- a/build.gradle +++ b/build.gradle @@ -2,9 +2,7 @@ buildscript { repositories { // Make sure that you have the following two repositories google() // Google's Maven repository - mavenCentral() // Maven Central repository - } dependencies { // Add the dependency for the Google services Gradle plugin diff --git a/settings.gradle b/settings.gradle index 7e29d4b..a0c2f63 100644 --- a/settings.gradle +++ b/settings.gradle @@ -10,6 +10,11 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + maven { + url "http://repo.boox.com/repository/maven-public/" + allowInsecureProtocol = true + } + maven { url "https://jitpack.io" } } } rootProject.name = "Notable"