0
0
mirror of https://github.com/mueller-ma/PrepaidBalance.git synced 2024-09-20 00:12:15 +02:00

Add retry action to error notifications

Fixes #68
This commit is contained in:
mueller-ma 2022-05-01 19:29:16 +02:00
parent ccf29821ec
commit 862516ab08
6 changed files with 87 additions and 31 deletions

View File

@ -21,7 +21,13 @@
</intent-filter>
</activity>
<activity android:name="com.github.muellerma.prepaidbalance.ui.PreferenceActivity" />
<activity
android:name="com.github.muellerma.prepaidbalance.ui.PreferenceActivity"
android:exported="false" />
<receiver
android:name=".work.RetryBroadcastReceiver"
android:exported="false" />
</application>
</manifest>

View File

@ -1,17 +1,19 @@
package com.github.muellerma.prepaidbalance.ui
import android.content.ClipData
import android.content.ClipboardManager
import android.os.Bundle
import android.text.InputType
import android.util.Log
import android.view.MenuItem
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.edit
import androidx.fragment.app.commit
import androidx.preference.EditTextPreference
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.work.Constraints
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.PeriodicWorkRequest
import androidx.work.WorkManager
import com.github.muellerma.prepaidbalance.R
import com.github.muellerma.prepaidbalance.databinding.ActivityPreferenceBinding
@ -22,15 +24,6 @@ import com.github.muellerma.prepaidbalance.work.CheckBalanceWorker
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.time.Duration
import android.R.attr.label
import android.content.ClipData
import android.content.ClipboardManager
import android.util.Log
import android.widget.Toast
import androidx.core.content.edit
import androidx.preference.ListPreference
class PreferenceActivity : AppCompatActivity() {
@ -80,23 +73,14 @@ class PreferenceActivity : AppCompatActivity() {
val workPref = getPreference("periodic_checks")
workPref.setOnPreferenceChangeListener { _, newValue ->
WorkManager.getInstance(preferenceManager.context).apply {
if (newValue as Boolean) {
val request = PeriodicWorkRequest.Builder(
CheckBalanceWorker::class.java,
Duration.ofHours(12)
)
.setConstraints(Constraints.NONE)
.build()
val context = preferenceManager.context
enqueueUniquePeriodicWork(
"work",
ExistingPeriodicWorkPolicy.REPLACE,
request
)
} else {
cancelAllWork()
}
if (newValue as Boolean) {
CheckBalanceWorker.enqueue(context)
} else {
WorkManager
.getInstance(preferenceManager.context)
.cancelAllWork()
}
true

View File

@ -1,7 +1,9 @@
package com.github.muellerma.prepaidbalance.work
import android.Manifest
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Handler
import android.os.Looper
@ -10,8 +12,7 @@ import android.util.Log
import androidx.annotation.StringRes
import androidx.core.app.ActivityCompat
import androidx.core.content.edit
import androidx.work.Worker
import androidx.work.WorkerParameters
import androidx.work.*
import com.github.muellerma.prepaidbalance.R
import com.github.muellerma.prepaidbalance.room.AppDatabase
import com.github.muellerma.prepaidbalance.room.BalanceEntry
@ -25,6 +26,7 @@ import com.github.muellerma.prepaidbalance.utils.NotificationUtils.Companion.get
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.time.Duration
class CheckBalanceWorker(
private val context: Context,
@ -44,8 +46,21 @@ class CheckBalanceWorker(
}
errorMessage?.let {
val retryIntent = Intent(context, RetryBroadcastReceiver::class.java)
val retryPendingIntent = PendingIntent.getBroadcast(
context,
0,
retryIntent,
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT
)
val notification = getBaseNotification(context, CHANNEL_ID_ERROR)
.setContentTitle(context.getString(errorMessage))
.addAction(
R.drawable.ic_baseline_refresh_24,
context.getString(R.string.retry),
retryPendingIntent
)
NotificationUtils.createChannels(context)
NotificationUtils
@ -60,6 +75,23 @@ class CheckBalanceWorker(
companion object {
private val TAG = CheckBalanceWorker::class.java.simpleName
fun enqueue(context: Context) {
WorkManager.getInstance(context).apply {
val request = PeriodicWorkRequest.Builder(
CheckBalanceWorker::class.java,
Duration.ofHours(12)
)
.setConstraints(Constraints.NONE)
.build()
enqueueUniquePeriodicWork(
"work",
ExistingPeriodicWorkPolicy.REPLACE,
request
)
}
}
fun checkBalance(context: Context, callback: (CheckResult, String?) -> Unit) {
CoroutineScope(Dispatchers.IO).launch {
Log.d(TAG, "Remove entries older than 6 months")

View File

@ -0,0 +1,23 @@
package com.github.muellerma.prepaidbalance.work
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
import com.github.muellerma.prepaidbalance.utils.NotificationUtils
class RetryBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.d(TAG, "onReceive()")
NotificationUtils
.manager(context)
.cancel(NotificationUtils.NOTIFICATION_ID_ERROR)
CheckBalanceWorker.enqueue(context)
}
companion object {
private val TAG = RetryBroadcastReceiver::class.java.simpleName
}
}

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z"/>
</vector>

View File

@ -33,4 +33,5 @@
<string name="debug_last_ussd_response_none">No request has been made yet</string>
<string name="debug_last_ussd_response_invalid">Last request failed with code %d</string>
<string name="copied_to_clipboard">Copied to clipboard</string>
<string name="retry">Retry</string>
</resources>