Skip to content

Commit 22a019b

Browse files
committed
fix: duplicated toast on deploy messaging (again)
- Remove the progress dialog in the app, and use RimeDaemon to manage the notification.
1 parent 6737965 commit 22a019b

File tree

2 files changed

+47
-61
lines changed

2 files changed

+47
-61
lines changed

app/src/main/java/com/osfans/trime/daemon/RimeDaemon.kt

+47-38
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import android.app.PendingIntent
88
import android.content.Intent
99
import androidx.core.app.NotificationCompat
1010
import androidx.core.app.NotificationManagerCompat
11-
import androidx.core.content.ContextCompat
1211
import com.osfans.trime.R
1312
import com.osfans.trime.TrimeApplication
1413
import com.osfans.trime.core.Rime
@@ -22,10 +21,8 @@ import com.osfans.trime.util.appContext
2221
import com.osfans.trime.util.createNotificationChannel
2322
import com.osfans.trime.util.readText
2423
import com.osfans.trime.util.subprocess
25-
import com.osfans.trime.util.toast
2624
import kotlinx.coroutines.CoroutineScope
2725
import kotlinx.coroutines.Dispatchers
28-
import kotlinx.coroutines.Job
2926
import kotlinx.coroutines.launch
3027
import kotlinx.coroutines.runBlocking
3128
import kotlinx.coroutines.withContext
@@ -56,8 +53,6 @@ object RimeDaemon {
5653

5754
private val lock = ReentrantLock()
5855

59-
private var messageJob: Job? = null
60-
6156
private fun establish(name: String) =
6257
object : RimeSession {
6358
private inline fun <T> ensureEstablished(block: () -> T) =
@@ -99,12 +94,6 @@ object RimeDaemon {
9994
if (realRime.lifecycle.currentStateFlow.value == RimeLifecycle.State.STOPPED) {
10095
realRime.startup(false)
10196
}
102-
messageJob =
103-
TrimeApplication.getInstance().coroutineScope.launch {
104-
realRime.messageFlow.collect {
105-
handleRimeMessage(it)
106-
}
107-
}
10897
val session = establish(name)
10998
sessions[name] = session
11099
return@withLock session
@@ -118,8 +107,6 @@ object RimeDaemon {
118107
sessions -= name
119108
if (sessions.isEmpty()) {
120109
realRime.finalize()
121-
messageJob?.cancel()
122-
messageJob = null
123110
}
124111
}
125112

@@ -138,6 +125,23 @@ object RimeDaemon {
138125
appContext.getString(R.string.rime_daemon),
139126
NotificationManagerCompat.IMPORTANCE_HIGH,
140127
)
128+
TrimeApplication.getInstance().coroutineScope.launch {
129+
realRime.messageFlow.collect {
130+
handleRimeMessage(it)
131+
}
132+
}
133+
}
134+
135+
private inline fun sendNotification(
136+
id: Int,
137+
buildAction: NotificationCompat.Builder.() -> Unit,
138+
) {
139+
val builder =
140+
NotificationCompat
141+
.Builder(appContext, CHANNEL_ID)
142+
.setContentTitle(appContext.getString(R.string.rime_daemon))
143+
builder.buildAction()
144+
builder.build().let { notificationManager.notify(id, it) }
141145
}
142146

143147
/**
@@ -146,24 +150,22 @@ object RimeDaemon {
146150
fun restartRime(fullCheck: Boolean = false) =
147151
lock.withLock {
148152
val id = restartId++
149-
NotificationCompat
150-
.Builder(appContext, CHANNEL_ID)
151-
.setSmallIcon(R.drawable.ic_baseline_sync_24)
152-
.setContentTitle(appContext.getString(R.string.rime_daemon))
153-
.setContentText(appContext.getString(R.string.restarting_rime))
154-
.setOngoing(true)
155-
.setProgress(100, 0, true)
156-
.setPriority(NotificationCompat.PRIORITY_HIGH)
157-
.build()
158-
.let { notificationManager.notify(id, it) }
153+
if (!fullCheck) {
154+
sendNotification(id) {
155+
setSmallIcon(R.drawable.ic_baseline_sync_24)
156+
setContentTitle(appContext.getString(R.string.rime_daemon))
157+
setContentText(appContext.getString(R.string.restarting_rime))
158+
setOngoing(true)
159+
setProgress(100, 0, true)
160+
setPriority(NotificationCompat.PRIORITY_HIGH)
161+
}
162+
}
159163
realRime.finalize()
160164
realRime.startup(fullCheck)
161165
TrimeApplication.getInstance().coroutineScope.launch {
162166
// cancel notification on ready
163167
realRime.lifecycle.whenReady {
164168
notificationManager.cancel(id)
165-
messageJob?.cancel()
166-
messageJob = null
167169
}
168170
}
169171
}
@@ -172,11 +174,20 @@ object RimeDaemon {
172174
if (it is RimeMessage.DeployMessage) {
173175
when (it.data) {
174176
RimeMessage.DeployMessage.State.Start -> {
177+
sendNotification(MESSAGE_ID) {
178+
setSmallIcon(R.drawable.ic_baseline_sync_24)
179+
setContentText(appContext.getString(R.string.deploy_progress))
180+
setPriority(NotificationCompat.PRIORITY_DEFAULT)
181+
setTimeoutAfter(2000L)
182+
}
175183
withContext(Dispatchers.IO) { subprocess("logcat", "--clear") }
176184
}
177185
RimeMessage.DeployMessage.State.Success -> {
178-
ContextCompat.getMainExecutor(appContext).execute {
179-
appContext.toast(R.string.deploy_finish)
186+
sendNotification(MESSAGE_ID) {
187+
setSmallIcon(R.drawable.ic_baseline_sync_24)
188+
setContentText(appContext.getString(R.string.deploy_finish))
189+
setPriority(NotificationCompat.PRIORITY_DEFAULT)
190+
setTimeoutAfter(2000L)
180191
}
181192
}
182193
RimeMessage.DeployMessage.State.Failure -> {
@@ -189,24 +200,22 @@ object RimeDaemon {
189200
putExtra(LogActivity.FROM_DEPLOY, true)
190201
putExtra(LogActivity.DEPLOY_FAILURE_TRACE, log)
191202
}
192-
NotificationCompat
193-
.Builder(appContext, CHANNEL_ID)
194-
.setSmallIcon(R.drawable.ic_baseline_warning_24)
195-
.setContentTitle(appContext.getString(R.string.rime_daemon))
196-
.setContentText(appContext.getString(R.string.view_deploy_failure_log))
197-
.setContentIntent(
203+
sendNotification(MESSAGE_ID) {
204+
setSmallIcon(R.drawable.ic_baseline_warning_24)
205+
setContentText(appContext.getString(R.string.view_deploy_failure_log))
206+
setContentIntent(
198207
PendingIntent.getActivity(
199208
appContext,
200209
0,
201210
intent,
202211
PendingIntent.FLAG_ONE_SHOT or
203212
PendingIntent.FLAG_IMMUTABLE,
204213
),
205-
).setOngoing(false)
206-
.setAutoCancel(true)
207-
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
208-
.build()
209-
.let { notificationManager.notify(MESSAGE_ID, it) }
214+
)
215+
setOngoing(false)
216+
setAutoCancel(true)
217+
setPriority(NotificationCompat.PRIORITY_HIGH)
218+
}
210219
}
211220
}
212221
}

app/src/main/java/com/osfans/trime/ui/main/PrefMainActivity.kt

-23
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,16 @@ import androidx.core.view.WindowCompat
1919
import androidx.core.view.WindowInsetsCompat
2020
import androidx.core.view.forEach
2121
import androidx.core.view.updateLayoutParams
22-
import androidx.lifecycle.Lifecycle
2322
import androidx.lifecycle.lifecycleScope
24-
import androidx.lifecycle.repeatOnLifecycle
2523
import androidx.navigation.NavController
2624
import androidx.navigation.fragment.NavHostFragment
2725
import com.hjq.permissions.Permission
2826
import com.hjq.permissions.XXPermissions
2927
import com.osfans.trime.R
30-
import com.osfans.trime.core.RimeLifecycle
3128
import com.osfans.trime.daemon.RimeDaemon
3229
import com.osfans.trime.data.prefs.AppPrefs
3330
import com.osfans.trime.data.sound.SoundEffectManager
3431
import com.osfans.trime.databinding.ActivityPrefBinding
35-
import com.osfans.trime.ui.components.ProgressBarDialogIndeterminate
3632
import com.osfans.trime.ui.setup.SetupActivity
3733
import com.osfans.trime.util.isStorageAvailable
3834
import com.osfans.trime.worker.BackgroundSyncWork
@@ -45,7 +41,6 @@ class PrefMainActivity : AppCompatActivity() {
4541
private val uiMode by AppPrefs.defaultInstance().other.uiMode
4642

4743
private lateinit var navController: NavController
48-
private var loadingDialog: AlertDialog? = null
4944

5045
override fun onCreate(savedInstanceState: Bundle?) {
5146
val uiMode =
@@ -55,7 +50,6 @@ class PrefMainActivity : AppCompatActivity() {
5550
AppPrefs.Other.UiMode.DARK -> AppCompatDelegate.MODE_NIGHT_YES
5651
}
5752
AppCompatDelegate.setDefaultNightMode(uiMode)
58-
5953
super.onCreate(savedInstanceState)
6054
enableEdgeToEdge()
6155
val binding = ActivityPrefBinding.inflate(layoutInflater)
@@ -108,23 +102,6 @@ class PrefMainActivity : AppCompatActivity() {
108102
}
109103

110104
checkNotificationPermission()
111-
112-
lifecycleScope.launch {
113-
repeatOnLifecycle(Lifecycle.State.STARTED) {
114-
viewModel.rime.run { stateFlow }.collect { state ->
115-
when (state) {
116-
RimeLifecycle.State.STARTING -> {
117-
loadingDialog = ProgressBarDialogIndeterminate(R.string.deploy_progress).show()
118-
}
119-
RimeLifecycle.State.READY -> {
120-
loadingDialog?.dismiss()
121-
loadingDialog = null
122-
}
123-
else -> {}
124-
}
125-
}
126-
}
127-
}
128105
}
129106

130107
override fun onCreateOptionsMenu(menu: Menu?): Boolean {

0 commit comments

Comments
 (0)