Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions .github/workflows/dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,8 @@ jobs:
- name: Build app
run: ./gradlew assembleDebug

- name: Rename apk
run: mv app/build/outputs/apk/debug/app-universal-debug.apk hviewer-debug.apk

- name: Upload APK artifact
uses: actions/upload-artifact@v7
with:
name: app
path: hviewer-debug.apk
path: app/build/outputs/apk/foss/debug/*universal*.apk
29 changes: 13 additions & 16 deletions .github/workflows/publish-playstore.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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 }}
releaseFiles: app/build/outputs/bundle/gplayRelease/*.aab
track: ${{ github.event.inputs.track }}
status: draft
35 changes: 9 additions & 26 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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
Expand All @@ -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

30 changes: 30 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,22 @@ android {
}
}

flavorDimensions.add("version")

productFlavors {
create("foss") {
dimension = "version"
// The info block is encrypted and can only be read by google
dependenciesInfo {
includeInApk = false
includeInBundle = false
}
}
create("gplay") {
dimension = "version"
}
}

buildTypes {
debug {
applicationIdSuffix = ".dev"
Expand All @@ -97,6 +113,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
Expand Down
4 changes: 4 additions & 0 deletions app/src/foss/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
</manifest>
20 changes: 20 additions & 0 deletions app/src/foss/java/com/paulcoding/hviewer/di/FlavorModule.kt
Original file line number Diff line number Diff line change
@@ -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<ScheduleWorker> {
ScheduleWorkerImpl()
}

single<UpdateAppRepository> { UpdateAppRepositoryImpl(get(), get()) }

workerOf(::UpdateApkWorker)
}
Original file line number Diff line number Diff line change
@@ -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)
}
}
Original file line number Diff line number Diff line change
@@ -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<UpdateApkWorker>(1, TimeUnit.DAYS)
.setConstraints(constraints)
.setInitialDelay(calculateDelayUntilMidnight(), TimeUnit.MILLISECONDS)
.build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
"updateApk",
ExistingPeriodicWorkPolicy.KEEP,
updateScriptsWorkRequest
)
}
}
15 changes: 15 additions & 0 deletions app/src/gplay/java/com/paulcoding/hviewer/di/FlavorModule.kt
Original file line number Diff line number Diff line change
@@ -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<ScheduleWorker> {
ScheduleWorkerImpl()
}

single<UpdateAppRepository> { UpdateAppRepositoryImpl() }
}
Original file line number Diff line number Diff line change
@@ -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<HRelease>(Exception("Not implemented"))

override suspend fun downloadApk(downloadUrl: String, destination: File) =
Result.failure<File>(Exception("Not implemented"))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.paulcoding.hviewer.worker

import android.content.Context

class ScheduleWorkerImpl() : ScheduleWorker {
override fun schedule(context: Context) {
scheduleScriptsUpdate(context)
}
}
8 changes: 3 additions & 5 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="32"
Expand Down Expand Up @@ -62,8 +61,7 @@
<activity
android:name=".WebActivity"
android:exported="true"
android:theme="@style/Theme.HViewer">
</activity>
android:theme="@style/Theme.HViewer" />

<service
android:name=".helper.DownloadImageService"
Expand All @@ -81,7 +79,7 @@
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
` <provider
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
Expand All @@ -90,6 +88,6 @@
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>`
</provider>
</application>
</manifest>
9 changes: 5 additions & 4 deletions app/src/main/java/com/paulcoding/hviewer/MainApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -42,12 +43,12 @@ class MainApp : Application() {
modules(viewModelModule)
modules(repositoryModule)
modules(appModule)
modules(flavorModule)
}
}

private fun setupWorkers() {
scheduleScriptsUpdate(this)
scheduleApkUpdate(this)
get<ScheduleWorker>().schedule(this)
}

private fun setupNotificationChannels() {
Expand Down
4 changes: 0 additions & 4 deletions app/src/main/java/com/paulcoding/hviewer/di/AppModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -68,7 +66,6 @@ val viewModelModule = module {

val repositoryModule = module {
singleOf(::SiteConfigsRepository)
singleOf(::UpdateAppRepository)
singleOf(::FavoriteRepository)
singleOf(::HistoryRepository)
singleOf(::TabsRepository)
Expand Down Expand Up @@ -114,6 +111,5 @@ val appModule = module {
CoroutineScope(SupervisorJob() + Dispatchers.IO)
}

workerOf(::UpdateApkWorker)
workerOf(::UpdateScriptsWorker)
}
Loading
Loading