alert trigger

This commit is contained in:
moon 2026-07-22 10:40:56 +06:30
parent f1a2707190
commit 92a24851f1
6 changed files with 122 additions and 14 deletions

View File

@ -8,3 +8,7 @@
* fixed recent transaction only working for top 3 * fixed recent transaction only working for top 3
* routed to dashboard after printing receipt * routed to dashboard after printing receipt
* receipt printing animation re-scale * receipt printing animation re-scale
*
### version 3.4
* disable display always on
* auto-settlement

View File

@ -19,6 +19,7 @@
<uses-permission android:name="com.sunmi.perm.SECURITY" /> <uses-permission android:name="com.sunmi.perm.SECURITY" />
<uses-permission android:name="com.sunmi.perm.CONTACTLESS_CARD" /> <uses-permission android:name="com.sunmi.perm.CONTACTLESS_CARD" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />
@ -39,7 +40,7 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.MOBPOS"> android:theme="@style/Theme.MOBPOS">
<receiver android:name=".auto_settlement.AlarmReceiver" android:exported="false"/> <receiver android:name=".auto_settlement.AlarmReceiver" android:exported="false"/>
<service android:name=".auto_settlement.AutoSettleService" android:exported="false" android:foregroundServiceType="dataSync"/> <service android:name=".auto_settlement.AutoSettleService" android:exported="false" android:foregroundServiceType="dataSync" />
<activity <activity
android:name="com.mob.utsmyanmar.MainActivity" android:name="com.mob.utsmyanmar.MainActivity"
android:exported="true" android:exported="true"

View File

@ -1,26 +1,28 @@
package com.mob.utsmyanmar package com.mob.utsmyanmar
import android.Manifest
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.annotation.RequiresPermission
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.WindowInsetsControllerCompat
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.mob.utsmyanmar.auto_settlement.SettlementScheduler
import com.mob.utsmyanmar.ui.navigation.AppNavGraph import com.mob.utsmyanmar.ui.navigation.AppNavGraph
import com.mob.utsmyanmar.ui.theme.MOBPOSTheme import com.mob.utsmyanmar.ui.theme.MOBPOSTheme
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
@RequiresPermission(Manifest.permission.SCHEDULE_EXACT_ALARM)
@RequiresApi(Build.VERSION_CODES.N) @RequiresApi(Build.VERSION_CODES.N)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
if (intent.getBooleanExtra("AUTO_SETTLEMENT", false)) { SettlementScheduler.schedule(this)
print("auto Settlement will run here")
}
// installSplashScreen() // installSplashScreen()
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()

View File

@ -5,17 +5,22 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import sunmi.sunmiui.utils.LogUtil
@AndroidEntryPoint @AndroidEntryPoint
class AlarmReceiver : BroadcastReceiver() { class AlarmReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) { override fun onReceive(context: Context?, intent: Intent?) {
val serviceIntent = Intent(context, AutoSettleService::class.java) val serviceIntent = Intent(context, AutoSettleService::class.java)
LogUtil.d(AlarmReceiver::class.java.simpleName, "Alert service")
if (context != null) { if (context != null) {
ContextCompat.startForegroundService( ContextCompat.startForegroundService(
context, context,
serviceIntent serviceIntent
) )
} }
LogUtil.d(AlarmReceiver::class.java.simpleName, "Foreground service")
} }
} }

View File

@ -5,32 +5,35 @@ import android.app.NotificationChannel
import android.app.NotificationManager import android.app.NotificationManager
import android.app.Service import android.app.Service
import android.content.Intent import android.content.Intent
import android.media.AudioAttributes
import android.media.RingtoneManager
import android.os.Build import android.os.Build
import android.os.IBinder import android.os.IBinder
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat
import com.mob.utsmyanmar.MainActivity import com.mob.utsmyanmar.MainActivity
import com.mob.utsmyanmar.R import com.mob.utsmyanmar.R
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import sunmi.sunmiui.utils.LogUtil
@AndroidEntryPoint @AndroidEntryPoint
class AutoSettleService : Service(){ class AutoSettleService : Service() {
companion object { companion object {
const val CHANNEL_ID = "auto_settlement_channel" const val CHANNEL_ID = "auto_settlement_channel"
const val NOTIFICATION_ID = 1002 const val NOTIFICATION_ID = 1001
} }
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
LogUtil.d(AutoSettleService::class.java.simpleName, "auto settle service called")
startForegroundNotification() startForegroundNotification()
} }
@RequiresApi(Build.VERSION_CODES.N) @RequiresApi(Build.VERSION_CODES.N)
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
if(!SystemParamsOperation.getInstance().settlementStatus){ if (!SystemParamsOperation.getInstance().settlementStatus) {
stopSelf() stopSelf()
return START_NOT_STICKY return START_NOT_STICKY
} }
@ -41,17 +44,25 @@ class AutoSettleService : Service(){
return START_NOT_STICKY return START_NOT_STICKY
} }
override fun onBind(intent: Intent?): IBinder? = null override fun onBind(intent: Intent?): IBinder? = null
@SuppressLint("ForegroundServiceType") @SuppressLint("ForegroundServiceType")
private fun startForegroundNotification(){ private fun startForegroundNotification() {
val manager = ContextCompat.getSystemService(this, NotificationManager::class.java) LogUtil.d(AutoSettleService::class.java.simpleName, "foreground noti called")
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel( val channel = NotificationChannel(
CHANNEL_ID, CHANNEL_ID,
"AUTO SETTLEMENT", "AUTO SETTLEMENT",
NotificationManager.IMPORTANCE_LOW NotificationManager.IMPORTANCE_HIGH
) )
channel.description = "Auto Settlement notification"
channel.enableVibration(true)
channel.setSound(
RingtoneManager.getDefaultUri(
RingtoneManager.TYPE_NOTIFICATION
), AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_NOTIFICATION).build()
)
val manager = getSystemService(NotificationManager::class.java)
manager?.createNotificationChannel(channel) manager?.createNotificationChannel(channel)
} }
@ -59,6 +70,7 @@ class AutoSettleService : Service(){
.setSmallIcon(R.drawable.logo_mob) .setSmallIcon(R.drawable.logo_mob)
.setContentTitle("Auto Settlement") .setContentTitle("Auto Settlement")
.setContentText("Processing...") .setContentText("Processing...")
.setPriority(NotificationCompat.PRIORITY_HIGH)
.build() .build()
startForeground(NOTIFICATION_ID, notification) startForeground(NOTIFICATION_ID, notification)

View File

@ -0,0 +1,84 @@
package com.mob.utsmyanmar.auto_settlement
import android.Manifest
import android.annotation.SuppressLint
import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import androidx.annotation.RequiresPermission
import java.util.Calendar
object SettlementScheduler {
@RequiresPermission(Manifest.permission.SCHEDULE_EXACT_ALARM)
fun schedule(context: Context) {
val calendar = Calendar.getInstance().apply {
// Auto settlement time
set(Calendar.HOUR_OF_DAY, 1)
set(Calendar.MINUTE, 10)
set(Calendar.SECOND, 0)
if (before(Calendar.getInstance())) {
add(Calendar.DAY_OF_MONTH, 1)
}
}
val alarmManager =
context.getSystemService(Context.ALARM_SERVICE)
as AlarmManager
val intent = Intent(
context,
AlarmReceiver::class.java
)
val pendingIntent = PendingIntent.getBroadcast(
context,
100,
intent,
PendingIntent.FLAG_UPDATE_CURRENT or
PendingIntent.FLAG_IMMUTABLE
)
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
calendar.timeInMillis,
pendingIntent
)
}
@SuppressLint("ServiceCast")
fun cancel(context: Context) {
val alarmManager =
context.getSystemService(Context.ALARM_SERVICE)
as AlarmManager
val intent = Intent(
context,
AlarmReceiver::class.java
)
val pendingIntent = PendingIntent.getBroadcast(
context,
100,
intent,
PendingIntent.FLAG_UPDATE_CURRENT or
PendingIntent.FLAG_IMMUTABLE
)
alarmManager.cancel(pendingIntent)
}
}