From 91a830c33c754a48cf0e773ef973e271774f80a7 Mon Sep 17 00:00:00 2001 From: paulcoding810 Date: Wed, 11 Mar 2026 22:47:45 +0700 Subject: [PATCH 1/4] Add flavors --- .github/workflows/dev.yml | 7 ++--- .github/workflows/publish-playstore.yml | 29 +++++++++----------- .github/workflows/release.yml | 35 +++++++------------------ app/build.gradle.kts | 32 ++++++++++++++++++++++ 4 files changed, 56 insertions(+), 47 deletions(-) diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index 417577f..861d94c 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -41,13 +41,10 @@ jobs: gradle- - name: Build app - run: ./gradlew assembleDebug - - - name: Rename apk - run: mv app/build/outputs/apk/debug/app-universal-debug.apk hviewer-debug.apk + run: ./gradlew assembleFossDebug - name: Upload APK artifact uses: actions/upload-artifact@v7 with: name: app - path: hviewer-debug.apk + path: app/build/outputs/apk/foss/debug/*.apk diff --git a/.github/workflows/publish-playstore.yml b/.github/workflows/publish-playstore.yml index a61f904..4a0aab2 100644 --- a/.github/workflows/publish-playstore.yml +++ b/.github/workflows/publish-playstore.yml @@ -21,6 +21,13 @@ jobs: - name: Checkout repo uses: actions/checkout@v4 + - name: Generate key.properties + run: | + echo "$KEY_PROPERTIES" > key.properties + chmod 600 key.properties + env: + KEY_PROPERTIES: ${{ secrets.KEY_PROPERTIES }} + - name: Setup JDK uses: actions/setup-java@v4 with: @@ -33,30 +40,20 @@ jobs: PLAY_STORE_JSON_KEY: ${{ secrets.PLAY_STORE_JSON_KEY }} - name: Build Release AAB - run: ./gradlew bundleRelease - - - name: Sign APK - id: sign_app - uses: ilharp/sign-android-release@nightly - with: - releaseDir: app/build/outputs/bundle/release - signingKey: ${{ secrets.SIGNING_KEY }} - keyAlias: ${{ secrets.ALIAS }} - keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }} - keyPassword: ${{ secrets.KEY_PASSWORD }} - buildToolsVersion: ${{ env.ANDROID_BUILD_TOOLS_VERSION }} + run: ./gradlew bundleGplayRelease - name: Upload APK artifact uses: actions/upload-artifact@v7 with: - name: app-release.aab - path: app/build/outputs/bundle/release/*signed.aab + name: gplay-release.aab + path: app/build/outputs/bundle/gplayRelease/*.aab - name: Upload to Play Store uses: r0adkll/upload-google-play@v1 with: serviceAccountJson: play-store-key.json packageName: com.paulcoding.hviewer - releaseFiles: app/build/outputs/bundle/release/*signed.aab - track: ${{ github.event.inputs.track }} \ No newline at end of file + releaseFiles: app/build/outputs/bundle/gplayRelease/*.aab + track: ${{ github.event.inputs.track }} + status: draft \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 46d99b0..c81ef1e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,6 +19,13 @@ jobs: - name: Checkout code uses: actions/checkout@v6 + - name: Generate key.properties + run: | + echo "$KEY_PROPERTIES" > key.properties + chmod 600 key.properties + env: + KEY_PROPERTIES: ${{ secrets.KEY_PROPERTIES }} + - name: Set up JDK uses: actions/setup-java@v5 with: @@ -30,26 +37,7 @@ jobs: - name: Build app run: | - ./gradlew assembleRelease - - - name: Sign APK - id: sign_app - uses: ilharp/sign-android-release@nightly - with: - releaseDir: app/build/outputs/apk/release - signingKey: ${{ secrets.SIGNING_KEY }} - keyAlias: ${{ secrets.ALIAS }} - keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }} - keyPassword: ${{ secrets.KEY_PASSWORD }} - buildToolsVersion: ${{ env.ANDROID_BUILD_TOOLS_VERSION }} - - - name: Rename apks - run: | - mv app/build/outputs/apk/release/app-arm64-v8a-release-unsigned-signed.apk hviewer-${{ github.ref_name }}-arm64-v8a-release.apk - mv app/build/outputs/apk/release/app-armeabi-v7a-release-unsigned-signed.apk hviewer-${{ github.ref_name }}-armeabi-v7a-release.apk - mv app/build/outputs/apk/release/app-universal-release-unsigned-signed.apk hviewer-${{ github.ref_name }}-universal-release.apk - mv app/build/outputs/apk/release/app-x86-release-unsigned-signed.apk hviewer-${{ github.ref_name }}-x86-release.apk - mv app/build/outputs/apk/release/app-x86_64-release-unsigned-signed.apk hviewer-${{ github.ref_name }}-x86_64-release.apk + ./gradlew assembleFossRelease - name: Create changelog id: changelog @@ -64,12 +52,7 @@ jobs: with: draft: true body: ${{ steps.changelog.outputs.changes }} - files: | - hviewer-${{ github.ref_name }}-arm64-v8a-release.apk - hviewer-${{ github.ref_name }}-armeabi-v7a-release.apk - hviewer-${{ github.ref_name }}-universal-release.apk - hviewer-${{ github.ref_name }}-x86-release.apk - hviewer-${{ github.ref_name }}-x86_64-release.apk + files: app/build/outputs/apk/*/release/*universal*.apk fail_on_unmatched_files: true make_latest: true diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a73b056..5bb90c4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -75,6 +75,24 @@ android { } } + flavorDimensions.add("version") + + productFlavors { + create("foss") { + dimension = "version" + signingConfig = signingConfigs["release"] + // The info block is encrypted and can only be read by google + dependenciesInfo { + includeInApk = false + includeInBundle = false + } + } + create("gplay") { + dimension = "version" + signingConfig = signingConfigs["release"] + } + } + buildTypes { debug { applicationIdSuffix = ".dev" @@ -97,6 +115,20 @@ android { isCoreLibraryDesugaringEnabled = true } + kotlinOptions { + jvmTarget = "17" + freeCompilerArgs = freeCompilerArgs + listOf( + "-opt-in=kotlin.ExperimentalStdlibApi", + "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", + "-opt-in=kotlinx.coroutines.FlowPreview", + "-opt-in=kotlin.time.ExperimentalTime", + "-opt-in=kotlin.RequiresOptIn", + "-opt-in=kotlin.ExperimentalUnsignedTypes", + "-opt-in=androidx.compose.material3.ExperimentalMaterial3Api", + "-Xannotation-default-target=param-property" + ) + } + buildFeatures { compose = true buildConfig = true From f1418930777b5eb9fe32ce04e7e54cbcd4e84fb1 Mon Sep 17 00:00:00 2001 From: paulcoding810 Date: Wed, 11 Mar 2026 22:57:20 +0700 Subject: [PATCH 2/4] Add flavors --- .github/workflows/dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index 861d94c..1df072e 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -47,4 +47,4 @@ jobs: uses: actions/upload-artifact@v7 with: name: app - path: app/build/outputs/apk/foss/debug/*.apk + path: app/build/outputs/apk/foss/debug/*universal*.apk From c42a19ac31ec0827f2882cdc4ab90b6243cd4456 Mon Sep 17 00:00:00 2001 From: paulcoding810 Date: Thu, 12 Mar 2026 10:59:28 +0700 Subject: [PATCH 3/4] Handle app update in various flavors --- .github/workflows/dev.yml | 2 +- app/build.gradle.kts | 2 - app/src/foss/AndroidManifest.xml | 4 ++ .../com/paulcoding/hviewer/di/FlavorModule.kt | 20 +++++++ .../repository/UpdateAppRepositoryImpl.kt | 17 ++++++ .../hviewer/worker/ScheduleWorkerImpl.kt | 33 +++++++++++ .../hviewer/worker/UpdateApkWork.kt | 0 .../com/paulcoding/hviewer/di/FlavorModule.kt | 15 +++++ .../repository/UpdateAppRepositoryImpl.kt | 12 ++++ .../hviewer/worker/ScheduleWorkerImpl.kt | 9 +++ app/src/main/AndroidManifest.xml | 9 ++- .../java/com/paulcoding/hviewer/MainApp.kt | 9 +-- .../com/paulcoding/hviewer/di/AppModule.kt | 4 -- .../com/paulcoding/hviewer/helper/Time.kt | 15 +++++ .../hviewer/repository/UpdateAppRepository.kt | 17 ++---- .../hviewer/ui/page/settings/SettingsPage.kt | 12 ++-- .../com/paulcoding/hviewer/worker/Schedule.kt | 56 ++++++------------- 17 files changed, 163 insertions(+), 73 deletions(-) create mode 100644 app/src/foss/AndroidManifest.xml create mode 100644 app/src/foss/java/com/paulcoding/hviewer/di/FlavorModule.kt create mode 100644 app/src/foss/java/com/paulcoding/hviewer/repository/UpdateAppRepositoryImpl.kt create mode 100644 app/src/foss/java/com/paulcoding/hviewer/worker/ScheduleWorkerImpl.kt rename app/src/{main => foss}/java/com/paulcoding/hviewer/worker/UpdateApkWork.kt (100%) create mode 100644 app/src/gplay/java/com/paulcoding/hviewer/di/FlavorModule.kt create mode 100644 app/src/gplay/java/com/paulcoding/hviewer/repository/UpdateAppRepositoryImpl.kt create mode 100644 app/src/gplay/java/com/paulcoding/hviewer/worker/ScheduleWorkerImpl.kt create mode 100644 app/src/main/java/com/paulcoding/hviewer/helper/Time.kt diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index 1df072e..165c0a7 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -41,7 +41,7 @@ jobs: gradle- - name: Build app - run: ./gradlew assembleFossDebug + run: ./gradlew assembleDebug - name: Upload APK artifact uses: actions/upload-artifact@v7 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5bb90c4..e5672de 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -80,7 +80,6 @@ android { productFlavors { create("foss") { dimension = "version" - signingConfig = signingConfigs["release"] // The info block is encrypted and can only be read by google dependenciesInfo { includeInApk = false @@ -89,7 +88,6 @@ android { } create("gplay") { dimension = "version" - signingConfig = signingConfigs["release"] } } diff --git a/app/src/foss/AndroidManifest.xml b/app/src/foss/AndroidManifest.xml new file mode 100644 index 0000000..ac7a67a --- /dev/null +++ b/app/src/foss/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/foss/java/com/paulcoding/hviewer/di/FlavorModule.kt b/app/src/foss/java/com/paulcoding/hviewer/di/FlavorModule.kt new file mode 100644 index 0000000..02025a0 --- /dev/null +++ b/app/src/foss/java/com/paulcoding/hviewer/di/FlavorModule.kt @@ -0,0 +1,20 @@ +package com.paulcoding.hviewer.di + +import com.paulcoding.hviewer.repository.UpdateAppRepository +import com.paulcoding.hviewer.repository.UpdateAppRepositoryImpl +import com.paulcoding.hviewer.worker.ScheduleWorker +import com.paulcoding.hviewer.worker.ScheduleWorkerImpl +import com.paulcoding.hviewer.worker.UpdateApkWorker +import org.koin.androidx.workmanager.dsl.workerOf +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.module + +val flavorModule = module { + single { + ScheduleWorkerImpl() + } + + single { UpdateAppRepositoryImpl(get(), get()) } + + workerOf(::UpdateApkWorker) +} \ No newline at end of file diff --git a/app/src/foss/java/com/paulcoding/hviewer/repository/UpdateAppRepositoryImpl.kt b/app/src/foss/java/com/paulcoding/hviewer/repository/UpdateAppRepositoryImpl.kt new file mode 100644 index 0000000..0484739 --- /dev/null +++ b/app/src/foss/java/com/paulcoding/hviewer/repository/UpdateAppRepositoryImpl.kt @@ -0,0 +1,17 @@ +package com.paulcoding.hviewer.repository + +import com.paulcoding.hviewer.helper.Downloader +import com.paulcoding.hviewer.network.GithubRemoteDatasource +import java.io.File + +class UpdateAppRepositoryImpl( + private val githubRemoteDatasource: GithubRemoteDatasource, private val downloader: Downloader +) : UpdateAppRepository { + override suspend fun getLatestAppRelease() = runCatching { + githubRemoteDatasource.getLatestAppRelease() + } + + override suspend fun downloadApk(downloadUrl: String, destination: File) = runCatching { + downloader.download(downloadUrl, destination) + } +} \ No newline at end of file diff --git a/app/src/foss/java/com/paulcoding/hviewer/worker/ScheduleWorkerImpl.kt b/app/src/foss/java/com/paulcoding/hviewer/worker/ScheduleWorkerImpl.kt new file mode 100644 index 0000000..a620945 --- /dev/null +++ b/app/src/foss/java/com/paulcoding/hviewer/worker/ScheduleWorkerImpl.kt @@ -0,0 +1,33 @@ +package com.paulcoding.hviewer.worker + +import android.content.Context +import androidx.work.Constraints +import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.NetworkType +import androidx.work.PeriodicWorkRequestBuilder +import androidx.work.WorkManager +import com.paulcoding.hviewer.helper.calculateDelayUntilMidnight +import java.util.concurrent.TimeUnit + +class ScheduleWorkerImpl() : ScheduleWorker { + override fun schedule(context: Context) { + scheduleScriptsUpdate(context) + scheduleApkUpdate(context) + } + + private fun scheduleApkUpdate(context: Context) { + val constraints = Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .build() + val updateScriptsWorkRequest = + PeriodicWorkRequestBuilder(1, TimeUnit.DAYS) + .setConstraints(constraints) + .setInitialDelay(calculateDelayUntilMidnight(), TimeUnit.MILLISECONDS) + .build() + WorkManager.getInstance(context).enqueueUniquePeriodicWork( + "updateApk", + ExistingPeriodicWorkPolicy.KEEP, + updateScriptsWorkRequest + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/paulcoding/hviewer/worker/UpdateApkWork.kt b/app/src/foss/java/com/paulcoding/hviewer/worker/UpdateApkWork.kt similarity index 100% rename from app/src/main/java/com/paulcoding/hviewer/worker/UpdateApkWork.kt rename to app/src/foss/java/com/paulcoding/hviewer/worker/UpdateApkWork.kt diff --git a/app/src/gplay/java/com/paulcoding/hviewer/di/FlavorModule.kt b/app/src/gplay/java/com/paulcoding/hviewer/di/FlavorModule.kt new file mode 100644 index 0000000..0693e2a --- /dev/null +++ b/app/src/gplay/java/com/paulcoding/hviewer/di/FlavorModule.kt @@ -0,0 +1,15 @@ +package com.paulcoding.hviewer.di + +import UpdateAppRepositoryImpl +import com.paulcoding.hviewer.repository.UpdateAppRepository +import com.paulcoding.hviewer.worker.ScheduleWorker +import com.paulcoding.hviewer.worker.ScheduleWorkerImpl +import org.koin.dsl.module + +val flavorModule = module { + single { + ScheduleWorkerImpl() + } + + single { UpdateAppRepositoryImpl() } +} \ No newline at end of file diff --git a/app/src/gplay/java/com/paulcoding/hviewer/repository/UpdateAppRepositoryImpl.kt b/app/src/gplay/java/com/paulcoding/hviewer/repository/UpdateAppRepositoryImpl.kt new file mode 100644 index 0000000..7aad14e --- /dev/null +++ b/app/src/gplay/java/com/paulcoding/hviewer/repository/UpdateAppRepositoryImpl.kt @@ -0,0 +1,12 @@ +import com.paulcoding.hviewer.model.HRelease +import com.paulcoding.hviewer.repository.UpdateAppRepository +import java.io.File + + +class UpdateAppRepositoryImpl( +) : UpdateAppRepository { + override suspend fun getLatestAppRelease() = Result.failure(Exception("Not implemented")) + + override suspend fun downloadApk(downloadUrl: String, destination: File) = + Result.failure(Exception("Not implemented")) +} \ No newline at end of file diff --git a/app/src/gplay/java/com/paulcoding/hviewer/worker/ScheduleWorkerImpl.kt b/app/src/gplay/java/com/paulcoding/hviewer/worker/ScheduleWorkerImpl.kt new file mode 100644 index 0000000..bf34973 --- /dev/null +++ b/app/src/gplay/java/com/paulcoding/hviewer/worker/ScheduleWorkerImpl.kt @@ -0,0 +1,9 @@ +package com.paulcoding.hviewer.worker + +import android.content.Context + +class ScheduleWorkerImpl() : ScheduleWorker { + override fun schedule(context: Context) { + scheduleScriptsUpdate(context) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c003ec2..2ea8b5f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,6 @@ - - + android:theme="@style/Theme.HViewer"> -` - ` + + ` \ No newline at end of file diff --git a/app/src/main/java/com/paulcoding/hviewer/MainApp.kt b/app/src/main/java/com/paulcoding/hviewer/MainApp.kt index 61cedd1..3dcd81e 100644 --- a/app/src/main/java/com/paulcoding/hviewer/MainApp.kt +++ b/app/src/main/java/com/paulcoding/hviewer/MainApp.kt @@ -5,15 +5,16 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.content.Context import com.paulcoding.hviewer.di.appModule +import com.paulcoding.hviewer.di.flavorModule import com.paulcoding.hviewer.di.repositoryModule import com.paulcoding.hviewer.di.viewModelModule import com.paulcoding.hviewer.helper.CrashHandler import com.paulcoding.hviewer.helper.setupPaths import com.paulcoding.hviewer.network.networkModule -import com.paulcoding.hviewer.worker.scheduleApkUpdate -import com.paulcoding.hviewer.worker.scheduleScriptsUpdate +import com.paulcoding.hviewer.worker.ScheduleWorker import com.paulcoding.js.JS import com.tencent.mmkv.MMKV +import org.koin.android.ext.android.get import org.koin.android.ext.koin.androidContext import org.koin.android.ext.koin.androidLogger import org.koin.androidx.workmanager.koin.workManagerFactory @@ -42,12 +43,12 @@ class MainApp : Application() { modules(viewModelModule) modules(repositoryModule) modules(appModule) + modules(flavorModule) } } private fun setupWorkers() { - scheduleScriptsUpdate(this) - scheduleApkUpdate(this) + get().schedule(this) } private fun setupNotificationChannels() { diff --git a/app/src/main/java/com/paulcoding/hviewer/di/AppModule.kt b/app/src/main/java/com/paulcoding/hviewer/di/AppModule.kt index e17e3f7..771159b 100644 --- a/app/src/main/java/com/paulcoding/hviewer/di/AppModule.kt +++ b/app/src/main/java/com/paulcoding/hviewer/di/AppModule.kt @@ -11,7 +11,6 @@ import com.paulcoding.hviewer.repository.FavoriteRepository import com.paulcoding.hviewer.repository.HistoryRepository import com.paulcoding.hviewer.repository.SiteConfigsRepository import com.paulcoding.hviewer.repository.TabsRepository -import com.paulcoding.hviewer.repository.UpdateAppRepository import com.paulcoding.hviewer.ui.page.editor.EditorViewModel import com.paulcoding.hviewer.ui.page.editor.ListScriptViewModel import com.paulcoding.hviewer.ui.page.favorite.FavoriteViewModel @@ -24,7 +23,6 @@ import com.paulcoding.hviewer.ui.page.sites.post.PostViewModel import com.paulcoding.hviewer.ui.page.sites.site.PostsViewModel import com.paulcoding.hviewer.ui.page.sites.site.SiteViewModel import com.paulcoding.hviewer.ui.page.tabs.TabsViewModel -import com.paulcoding.hviewer.worker.UpdateApkWorker import com.paulcoding.hviewer.worker.UpdateScriptsWorker import com.tencent.mmkv.MMKV import kotlinx.coroutines.CoroutineScope @@ -68,7 +66,6 @@ val viewModelModule = module { val repositoryModule = module { singleOf(::SiteConfigsRepository) - singleOf(::UpdateAppRepository) singleOf(::FavoriteRepository) singleOf(::HistoryRepository) singleOf(::TabsRepository) @@ -114,6 +111,5 @@ val appModule = module { CoroutineScope(SupervisorJob() + Dispatchers.IO) } - workerOf(::UpdateApkWorker) workerOf(::UpdateScriptsWorker) } diff --git a/app/src/main/java/com/paulcoding/hviewer/helper/Time.kt b/app/src/main/java/com/paulcoding/hviewer/helper/Time.kt new file mode 100644 index 0000000..338351a --- /dev/null +++ b/app/src/main/java/com/paulcoding/hviewer/helper/Time.kt @@ -0,0 +1,15 @@ +package com.paulcoding.hviewer.helper + +import java.util.Calendar + +fun calculateDelayUntilMidnight(): Long { + val now = Calendar.getInstance() + val midnight = Calendar.getInstance().apply { + set(Calendar.HOUR_OF_DAY, 0) + set(Calendar.MINUTE, 0) + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + add(Calendar.DAY_OF_MONTH, 1) + } + return midnight.timeInMillis - now.timeInMillis +} \ No newline at end of file diff --git a/app/src/main/java/com/paulcoding/hviewer/repository/UpdateAppRepository.kt b/app/src/main/java/com/paulcoding/hviewer/repository/UpdateAppRepository.kt index 2806f8b..603a95c 100644 --- a/app/src/main/java/com/paulcoding/hviewer/repository/UpdateAppRepository.kt +++ b/app/src/main/java/com/paulcoding/hviewer/repository/UpdateAppRepository.kt @@ -1,18 +1,9 @@ package com.paulcoding.hviewer.repository -import com.paulcoding.hviewer.helper.Downloader -import com.paulcoding.hviewer.network.GithubRemoteDatasource +import com.paulcoding.hviewer.model.HRelease import java.io.File -class UpdateAppRepository( - private val githubRemoteDatasource: GithubRemoteDatasource, - private val downloader: Downloader -) { - suspend fun getLatestAppRelease() = runCatching { - githubRemoteDatasource.getLatestAppRelease() - } - - suspend fun downloadApk(downloadUrl: String, destination: File) = runCatching { - downloader.download(downloadUrl, destination) - } +interface UpdateAppRepository { + suspend fun getLatestAppRelease(): Result + suspend fun downloadApk(downloadUrl: String, destination: File): Result } \ No newline at end of file diff --git a/app/src/main/java/com/paulcoding/hviewer/ui/page/settings/SettingsPage.kt b/app/src/main/java/com/paulcoding/hviewer/ui/page/settings/SettingsPage.kt index ba6b2d1..c924e99 100644 --- a/app/src/main/java/com/paulcoding/hviewer/ui/page/settings/SettingsPage.kt +++ b/app/src/main/java/com/paulcoding/hviewer/ui/page/settings/SettingsPage.kt @@ -43,6 +43,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.paulcoding.hviewer.BuildConfig import com.paulcoding.hviewer.R import com.paulcoding.hviewer.extensions.setSecureScreen import com.paulcoding.hviewer.model.ListScriptType @@ -58,6 +59,7 @@ import org.koin.androidx.compose.koinViewModel fun SettingsPage( viewModel: SettingsViewModel = koinViewModel(), navToListScript: (ListScriptType) -> Unit, + showCheckUpdateIcon: Boolean = BuildConfig.FLAVOR == "foss", goBack: () -> Boolean, ) { val context = LocalContext.current @@ -166,11 +168,13 @@ fun SettingsPage( modifier = Modifier.align(Alignment.CenterHorizontally), verticalAlignment = Alignment.CenterVertically ) { - H7Tap() { + H7Tap(onDevModeChange = { viewModel.dispatch(SettingsViewModel.Action.SetDevMode(true)) - } - HIcon(Icons.Outlined.Update) { - viewModel.dispatch(SettingsViewModel.Action.CheckForAppUpdate(showToast = true)) + }) + if (showCheckUpdateIcon) { + HIcon(Icons.Outlined.Update) { + viewModel.dispatch(SettingsViewModel.Action.CheckForAppUpdate(showToast = true)) + } } } } diff --git a/app/src/main/java/com/paulcoding/hviewer/worker/Schedule.kt b/app/src/main/java/com/paulcoding/hviewer/worker/Schedule.kt index 4ab9be5..836dfde 100644 --- a/app/src/main/java/com/paulcoding/hviewer/worker/Schedule.kt +++ b/app/src/main/java/com/paulcoding/hviewer/worker/Schedule.kt @@ -6,49 +6,25 @@ import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.NetworkType import androidx.work.PeriodicWorkRequestBuilder import androidx.work.WorkManager -import java.util.Calendar +import com.paulcoding.hviewer.helper.calculateDelayUntilMidnight import java.util.concurrent.TimeUnit -fun scheduleScriptsUpdate(context: Context) { - val constraints = Constraints.Builder() - .setRequiredNetworkType(NetworkType.CONNECTED) - .build() - val updateScriptsWorkRequest = - PeriodicWorkRequestBuilder(1, TimeUnit.DAYS) - .setConstraints(constraints) - .setInitialDelay(calculateDelayUntilMidnight(), TimeUnit.MILLISECONDS) - .build() - WorkManager.getInstance(context).enqueueUniquePeriodicWork( - "updateScripts", - ExistingPeriodicWorkPolicy.KEEP, - updateScriptsWorkRequest - ) -} +interface ScheduleWorker { + fun schedule(context: Context) -fun scheduleApkUpdate(context: Context) { - val constraints = Constraints.Builder() - .setRequiredNetworkType(NetworkType.CONNECTED) - .build() - val updateScriptsWorkRequest = - PeriodicWorkRequestBuilder(1, TimeUnit.DAYS) - .setConstraints(constraints) - .setInitialDelay(calculateDelayUntilMidnight(), TimeUnit.MILLISECONDS) + fun scheduleScriptsUpdate(context: Context) { + val constraints = Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) .build() - WorkManager.getInstance(context).enqueueUniquePeriodicWork( - "updateApk", - ExistingPeriodicWorkPolicy.KEEP, - updateScriptsWorkRequest - ) -} - -fun calculateDelayUntilMidnight(): Long { - val now = Calendar.getInstance() - val midnight = Calendar.getInstance().apply { - set(Calendar.HOUR_OF_DAY, 0) - set(Calendar.MINUTE, 0) - set(Calendar.SECOND, 0) - set(Calendar.MILLISECOND, 0) - add(Calendar.DAY_OF_MONTH, 1) + val updateScriptsWorkRequest = + PeriodicWorkRequestBuilder(1, TimeUnit.DAYS) + .setConstraints(constraints) + .setInitialDelay(calculateDelayUntilMidnight(), TimeUnit.MILLISECONDS) + .build() + WorkManager.getInstance(context).enqueueUniquePeriodicWork( + "updateScripts", + ExistingPeriodicWorkPolicy.KEEP, + updateScriptsWorkRequest + ) } - return midnight.timeInMillis - now.timeInMillis } \ No newline at end of file From 64586ee22a68c05d3e9e218f4db307238033cd1e Mon Sep 17 00:00:00 2001 From: paulcoding810 Date: Sat, 14 Mar 2026 10:55:45 +0700 Subject: [PATCH 4/4] Update manifest --- app/src/main/AndroidManifest.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2ea8b5f..232b1f5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -61,7 +61,7 @@ + android:theme="@style/Theme.HViewer" /> - ` \ No newline at end of file