Skip to content

Commit

Permalink
Merge pull request #314 from joeloewi7178/development
Browse files Browse the repository at this point in the history
Development
  • Loading branch information
joeloewi7178 committed Jan 1, 2024
2 parents 5abca1f + 93ecfae commit 7b3aa9d
Show file tree
Hide file tree
Showing 57 changed files with 1,506 additions and 1,091 deletions.
24 changes: 12 additions & 12 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,11 @@ jobs:
distribution: 'zulu' # See 'Supported distributions' for available options
java-version: '17'

- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Install GMD image for baseline profile generation
run: yes | "$ANDROID_HOME"/cmdline-tools/latest/bin/sdkmanager "system-images;android-34;aosp_atd;x86_64"

- name: Accept Android licenses
run: yes | "$ANDROID_HOME"/cmdline-tools/latest/bin/sdkmanager --licenses || true

- name: Grant execute permission for gradlew
run: chmod +x gradlew
Expand All @@ -47,16 +50,13 @@ jobs:
fileDir: './'
encodedString: ${{ secrets.SIGNING_KEY }}

- name: Build release variant including baseline profile generation
run: ./gradlew :app:assembleRelease
-Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
-Pandroid.testoptions.manageddevices.emulator.gpu="swiftshader_indirect"
-Pandroid.experimental.testOptions.managedDevices.emulator.showKernelLogging=true
-Pandroid.experimental.androidTest.numManagedDeviceShards=1
-Pandroid.experimental.testOptions.managedDevices.maxConcurrentDevices=1

- name: Build Release AAB
run: ./gradlew bundleRelease
- name: Generate baseline profile
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 34
target: aosp_atd
arch: x86_64
script: ./gradlew :app:bundleRelease

- name: Upload Android Release to Play Store
uses: r0adkll/upload-google-play@v1
Expand Down
21 changes: 12 additions & 9 deletions .github/workflows/on_pull_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,11 @@ jobs:
distribution: 'zulu' # See 'Supported distributions' for available options
java-version: '17'

- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Install GMD image for baseline profile generation
run: yes | "$ANDROID_HOME"/cmdline-tools/latest/bin/sdkmanager "system-images;android-34;aosp_atd;x86_64"

- name: Accept Android licenses
run: yes | "$ANDROID_HOME"/cmdline-tools/latest/bin/sdkmanager --licenses || true

- name: Grant execute permission for gradlew
run: chmod +x gradlew
Expand All @@ -47,10 +50,10 @@ jobs:
fileDir: './'
encodedString: ${{ secrets.SIGNING_KEY }}

- name: Build release variant including baseline profile generation
run: ./gradlew :app:assembleRelease
-Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
-Pandroid.testoptions.manageddevices.emulator.gpu="swiftshader_indirect"
-Pandroid.experimental.testOptions.managedDevices.emulator.showKernelLogging=true
-Pandroid.experimental.androidTest.numManagedDeviceShards=1
-Pandroid.experimental.testOptions.managedDevices.maxConcurrentDevices=1
- name: Generate baseline profile
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 34
target: aosp_atd
arch: x86_64
script: ./gradlew :app:bundleRelease
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ obj/
.idea/navEditor.xml
.idea/inspectionProfiles
.idea/deploymentTargetDropDown.xml
.idea/appInsightsSettings.xml

# Legacy Eclipse project files
.classpath
Expand Down
6 changes: 2 additions & 4 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ android {

defaultConfig {
applicationId = "com.joeloewi.croissant"
versionCode = 43
versionCode = 44
versionName = "1.2.1"
targetSdk = 34

Expand Down Expand Up @@ -63,9 +63,7 @@ android {
}

baselineProfile {
// Don't build on every iteration of a full assemble.
// Instead enable generation directly for the release build variant.
automaticGenerationDuringBuild = false
automaticGenerationDuringBuild = true
}

dependencies {
Expand Down
1 change: 0 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />

<queries>
Expand Down
11 changes: 10 additions & 1 deletion app/src/main/kotlin/com/joeloewi/croissant/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ class MainActivity : AppCompatActivity() {
LocalHourFormat provides hourFormat
) {
RequireAppUpdate(
appUpdateResultState = appUpdateResultState,
appUpdateResultState = { appUpdateResultState },
) {
CroissantApp(
isDeviceRooted = isDeviceRooted
Expand Down Expand Up @@ -388,6 +388,15 @@ fun CroissantNavHost(
onLoginHoYoLAB = {
navController.value.navigate(AttendancesDestination.LoginHoYoLabScreen.route)
},
onNavigateToAttendanceDetailScreen = {
navController.value.navigate(
AttendancesDestination.AttendanceDetailScreen().generateRoute(it)
) {
popUpTo(AttendancesDestination.CreateAttendanceScreen.route) {
inclusive = true
}
}
},
onNavigateUp = {
navController.value.navigateUp()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import com.joeloewi.croissant.worker.AttendCheckInEventWorker
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -55,12 +56,15 @@ class AlarmReceiver : BroadcastReceiver() {
@Inject
lateinit var alarmManager: AlarmManager

@Inject
lateinit var workManager: WorkManager

override fun onReceive(p0: Context, p1: Intent) {
when (p1.action) {
Intent.ACTION_BOOT_COMPLETED, Intent.ACTION_MY_PACKAGE_REPLACED, AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED -> {
_processLifecycleScope.launch(_coroutineContext) {
getAllOneShotAttendanceUseCase().map { attendance ->
async(Dispatchers.IO) {
async(SupervisorJob() + Dispatchers.IO + CoroutineExceptionHandler { _, _ -> }) {
attendance.runCatching {
val alarmIntent =
Intent(application, AlarmReceiver::class.java).apply {
Expand Down Expand Up @@ -130,7 +134,7 @@ class AlarmReceiver : BroadcastReceiver() {
)
.build()

WorkManager.getInstance(application).beginUniqueWork(
workManager.beginUniqueWork(
attendance.oneTimeAttendCheckInEventWorkerName.toString(),
ExistingWorkPolicy.APPEND_OR_REPLACE,
oneTimeWork
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import com.joeloewi.croissant.domain.usecase.ResinStatusWidgetUseCase
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -41,16 +42,18 @@ class MigrationHelper : BroadcastReceiver() {
@Inject
lateinit var getAllOneShotAttendanceUseCase: AttendanceUseCase.GetAllOneShot

@Inject
lateinit var workManager: WorkManager

override fun onReceive(p0: Context, p1: Intent) {
when (p1.action) {
Intent.ACTION_MY_PACKAGE_REPLACED -> {
_processLifecycleScope.launch(_coroutineContext) {
//because work manager's job can be deferred, cancel check in event worker
//instead of work manager, use alarm manager
getAllOneShotAttendanceUseCase().map { attendance ->
async(Dispatchers.IO) {
WorkManager.getInstance(application)
.cancelUniqueWork(attendance.attendCheckInEventWorkerName.toString())
async(SupervisorJob() + Dispatchers.IO + CoroutineExceptionHandler { _, _ -> }) {
workManager.cancelUniqueWork(attendance.attendCheckInEventWorkerName.toString())
}
}.awaitAll()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
package com.joeloewi.croissant.receiver

import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.PowerManager
import android.provider.Settings
import android.view.View
import android.widget.RemoteViews
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.work.Constraints
Expand All @@ -20,15 +14,15 @@ import androidx.work.WorkManager
import androidx.work.workDataOf
import com.google.firebase.Firebase
import com.google.firebase.crashlytics.crashlytics
import com.joeloewi.croissant.R
import com.joeloewi.croissant.domain.usecase.ResinStatusWidgetUseCase
import com.joeloewi.croissant.util.createErrorDueToPowerSaveModeRemoteViews
import com.joeloewi.croissant.util.isIgnoringBatteryOptimizationsCompat
import com.joeloewi.croissant.util.pendingIntentFlagUpdateCurrent
import com.joeloewi.croissant.worker.RefreshResinStatusWorker
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.launch
Expand All @@ -53,6 +47,9 @@ class ResinStatusWidgetProvider : AppWidgetProvider() {
@Inject
lateinit var deleteByAppWidgetIdResinStatusWidgetUseCase: ResinStatusWidgetUseCase.DeleteByAppWidgetId

@Inject
lateinit var workManager: WorkManager

override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
Expand All @@ -63,55 +60,15 @@ class ResinStatusWidgetProvider : AppWidgetProvider() {

_processLifecycleOwner.lifecycleScope.launch(_coroutineContext) {
appWidgetIds.map { appWidgetId ->
async(Dispatchers.IO) {
async(SupervisorJob() + Dispatchers.IO + CoroutineExceptionHandler { _, _ -> }) {
if (powerManager.isPowerSaveMode && !powerManager.isIgnoringBatteryOptimizationsCompat(
context
)
) {
RemoteViews(
context.packageName,
R.layout.widget_resin_status_battery_optimization_enabled
).apply {
setOnClickPendingIntent(
R.id.button_retry,
PendingIntent.getBroadcast(
context,
appWidgetId,
Intent(
context,
ResinStatusWidgetProvider::class.java
).apply {
action = AppWidgetManager.ACTION_APPWIDGET_UPDATE

putExtra(
AppWidgetManager.EXTRA_APPWIDGET_IDS,
intArrayOf(appWidgetId)
)
},
pendingIntentFlagUpdateCurrent
)
)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
setOnClickPendingIntent(
R.id.button_change_setting,
PendingIntent.getActivity(
context,
appWidgetId,
Intent(
Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
),
pendingIntentFlagUpdateCurrent
)
)
} else {
setViewVisibility(R.id.button_change_setting, View.INVISIBLE)
}
}.also { remoteViews ->
appWidgetManager.updateAppWidget(
appWidgetId,
remoteViews
)
}
appWidgetManager.updateAppWidget(
appWidgetId,
createErrorDueToPowerSaveModeRemoteViews(context, appWidgetId)
)
} else {
getOneByAppWidgetIdResinStatusWidgetUseCase.runCatching {
invoke(appWidgetId)
Expand All @@ -128,7 +85,7 @@ class ResinStatusWidgetProvider : AppWidgetProvider() {
)
.build()

WorkManager.getInstance(context).enqueueUniqueWork(
workManager.enqueueUniqueWork(
it.resinStatusWidget.id.toString(),
ExistingWorkPolicy.APPEND_OR_REPLACE,
oneTimeWorkRequest
Expand All @@ -147,16 +104,14 @@ class ResinStatusWidgetProvider : AppWidgetProvider() {
override fun onDeleted(context: Context, appWidgetIds: IntArray) {
super.onDeleted(context, appWidgetIds)

_processLifecycleOwner.lifecycleScope.launch(Dispatchers.IO + CoroutineExceptionHandler { _, _ -> }) {
_processLifecycleOwner.lifecycleScope.launch(_coroutineContext) {
appWidgetIds.run {
map { appWidgetId ->
async(Dispatchers.IO) {
async(SupervisorJob() + Dispatchers.IO + CoroutineExceptionHandler { _, _ -> }) {
getOneByAppWidgetIdResinStatusWidgetUseCase.runCatching {
invoke(appWidgetId)
}.onSuccess {
WorkManager.getInstance(context)
.cancelUniqueWork(it.resinStatusWidget.refreshGenshinResinStatusWorkerName.toString())

workManager.cancelUniqueWork(it.resinStatusWidget.refreshGenshinResinStatusWorkerName.toString())
}
}
}.awaitAll()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,43 @@ package com.joeloewi.croissant.receiver
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.lifecycleScope
import com.google.firebase.Firebase
import com.google.firebase.crashlytics.crashlytics
import com.joeloewi.croissant.util.NotificationGenerator
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.util.UUID
import javax.inject.Inject

@AndroidEntryPoint
class TimeZoneChangedReceiver @Inject constructor(
) : BroadcastReceiver() {
private val _coroutineContext = Dispatchers.IO + CoroutineExceptionHandler { _, throwable ->
Firebase.crashlytics.apply {
log(this@TimeZoneChangedReceiver.javaClass.simpleName)
recordException(throwable)
}
}
private val _processLifecycleScope by lazy { ProcessLifecycleOwner.get().lifecycleScope }

@Inject
lateinit var notificationGenerator: NotificationGenerator

override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
Intent.ACTION_TIMEZONE_CHANGED -> {
with(notificationGenerator) {
safeNotify(
UUID.randomUUID().toString(),
0,
createTimezoneChangedNotification()
)
_processLifecycleScope.launch(_coroutineContext) {
with(notificationGenerator) {
safeNotify(
UUID.randomUUID().toString(),
0,
createTimezoneChangedNotification()
)
}
}
}

Expand Down
Empty file.
Empty file.
Loading

0 comments on commit 7b3aa9d

Please sign in to comment.