Commit dbea0a0b authored by wanglei's avatar wanglei

...

parent a79b8e88
...@@ -141,5 +141,9 @@ dependencies { ...@@ -141,5 +141,9 @@ dependencies {
//冲突版本确定版本 //冲突版本确定版本
implementation("com.google.guava:guava:29.0-android") implementation("com.google.guava:guava:29.0-android")
//work 请使用最新版本
implementation("androidx.work:work-runtime-ktx:2.7.1")
} }
...@@ -15,6 +15,7 @@ import com.base.scanqr.bean.config.ConfigBean ...@@ -15,6 +15,7 @@ import com.base.scanqr.bean.config.ConfigBean
import com.base.scanqr.bean.config.PopupConfigBean import com.base.scanqr.bean.config.PopupConfigBean
import com.base.scanqr.fcm.FCMManager import com.base.scanqr.fcm.FCMManager
import com.base.scanqr.fcm.TimerManager.Companion.changeTimer import com.base.scanqr.fcm.TimerManager.Companion.changeTimer
import com.base.scanqr.fcm.notification.NotificationManager
import com.base.scanqr.fcm.receiver.BatteryStatusReceiver import com.base.scanqr.fcm.receiver.BatteryStatusReceiver
import com.base.scanqr.fcm.receiver.PackageStatusReceiver import com.base.scanqr.fcm.receiver.PackageStatusReceiver
import com.base.scanqr.fcm.receiver.ScreenStatusReceiver import com.base.scanqr.fcm.receiver.ScreenStatusReceiver
...@@ -143,6 +144,9 @@ class MyApplication : Application() { ...@@ -143,6 +144,9 @@ class MyApplication : Application() {
// startAlarm(appContext, 24) // startAlarm(appContext, 24)
// startAlarm(appContext, 48) // startAlarm(appContext, 48)
// startAlarm(appContext, 72) // startAlarm(appContext, 72)
//开启上报队列
NotificationManager.startNotificationQueue()
} }
......
package com.base.scanqr.bean package com.base.scanqr.bean
import android.content.Context import android.content.Context
import android.content.Intent
import android.widget.RemoteViews
class NotificationSendBean( class NotificationSendBean(
val context: Context, val context: Context,
val actionId: String = "",
val where: String = "", val where: String = "",
val canSend: () -> Boolean = { true },//是否可以发送 val canSend: () -> Boolean = { true },//是否可以发送
var sendSuccess: (() -> Unit)? = null,//发送成功回调 var sendSuccess: (() -> Unit)? = null,//发送成功回调
var valueMap: HashMap<String, Any> = hashMapOf()//发送通知可能携带的参数 var valueMap: HashMap<String, Any> = hashMapOf()//发送通知可能携带的参数
) { ) {
var actionId: String = ""
var bigRemoteViews: RemoteViews? = null
var smallRemoteViews: RemoteViews? = null
var intent: Intent? = null
var notificationId: Int = 1999
companion object { companion object {
const val POPUP_WHERE_TIMBER = "Timer" const val POPUP_WHERE_TIMBER = "Timer"
...@@ -23,6 +30,7 @@ class NotificationSendBean( ...@@ -23,6 +30,7 @@ class NotificationSendBean(
const val POPUP_WHERE_FILE_JOB = "FileJob" const val POPUP_WHERE_FILE_JOB = "FileJob"
const val ACTION_ID_SCAN = "action_id_scan" const val ACTION_ID_STAY_SCAN = "action_id_scan_1"
const val ACTION_ID_SCAN = "action_id_scan_2"
} }
} }
\ No newline at end of file
...@@ -3,6 +3,8 @@ package com.base.scanqr.fcm.notification ...@@ -3,6 +3,8 @@ package com.base.scanqr.fcm.notification
import android.content.Context import android.content.Context
import com.base.scanqr.BuildConfig import com.base.scanqr.BuildConfig
import com.base.scanqr.bean.NotificationSendBean import com.base.scanqr.bean.NotificationSendBean
import com.base.scanqr.bean.NotificationSendBean.Companion.ACTION_ID_SCAN
import com.base.scanqr.bean.NotificationSendBean.Companion.POPUP_WHERE_LOCK
import com.base.scanqr.bean.NotificationSendBean.Companion.POPUP_WHERE_TIMBER import com.base.scanqr.bean.NotificationSendBean.Companion.POPUP_WHERE_TIMBER
import com.base.scanqr.bean.config.PopupConfigBean.Companion.popupConfigBean import com.base.scanqr.bean.config.PopupConfigBean.Companion.popupConfigBean
import com.base.scanqr.helper.EventUtils import com.base.scanqr.helper.EventUtils
...@@ -28,7 +30,28 @@ object NotificationManager { ...@@ -28,7 +30,28 @@ object NotificationManager {
private var sendBeanBlockingQueue = ArrayBlockingQueue<NotificationSendBean>(10) private var sendBeanBlockingQueue = ArrayBlockingQueue<NotificationSendBean>(10)
private val looper_actionId = listOf(
ACTION_ID_SCAN,
)
private var actionIdList = arrayListOf<String>()
private fun getNextActionId(): String {
if (actionIdList.isEmpty()) {
actionIdList.addAll(looper_actionId)
}
val next = actionIdList[0]
actionIdList.removeAt(0)
if (BuildConfig.DEBUG) {
// return NOTIFICATION_ACTION_WEATHER
}
return next
}
fun submitSendBean(bean: NotificationSendBean) { fun submitSendBean(bean: NotificationSendBean) {
if (bean.actionId.isEmpty()) {
val actionId = getNextActionId()
bean.actionId = actionId
}
try { try {
sendBeanBlockingQueue.put(bean) sendBeanBlockingQueue.put(bean)
} catch (e: Exception) { } catch (e: Exception) {
...@@ -157,6 +180,6 @@ object NotificationManager { ...@@ -157,6 +180,6 @@ object NotificationManager {
* 只测某些类型 * 只测某些类型
*/ */
private var testWhere = listOf( private var testWhere = listOf(
POPUP_WHERE_TIMBER POPUP_WHERE_LOCK
) )
} }
\ No newline at end of file
package com.base.scanqr.fcm.notification package com.base.scanqr.fcm.notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.graphics.drawable.Icon
import android.os.Build
import android.widget.RemoteViews
import androidx.core.app.NotificationCompat
import androidx.core.graphics.drawable.IconCompat
import com.base.scanqr.MyApplication
import com.base.scanqr.R
import com.base.scanqr.bean.NotificationSendBean import com.base.scanqr.bean.NotificationSendBean
import com.base.scanqr.bean.NotificationSendBean.Companion.ACTION_ID_SCAN
import com.base.scanqr.ui.start.StartActivity
import kotlin.random.Random
/** /**
* 发送通知UI部分 * 发送通知UI部分
*/ */
object NotificationUiUtil { object NotificationUiUtil {
private val CHANNEL_ID = "San Qr Channel"
private val CHANNEL_NAME = "San Qr Channel NAME"
fun setNotification(sendBean: NotificationSendBean) { fun setNotification(sendBean: NotificationSendBean) {
when (sendBean.actionId) {
ACTION_ID_SCAN -> {
sendBean.bigRemoteViews = RemoteViews(MyApplication.appContext.packageName, R.layout.stay_notification_big_scan)
sendBean.smallRemoteViews = RemoteViews(MyApplication.appContext.packageName, R.layout.stay_notification_small_scan)
val intent = Intent(sendBean.context, StartActivity::class.java)
intent.putExtra("actionId", sendBean.actionId)
sendBean.intent = intent
}
}
sendCustomNotification(sendBean)
}
private fun sendCustomNotification(
sendBean: NotificationSendBean
) {
val notificationManager = sendBean.context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val context = sendBean.context
//创建channel
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH
)
channel.lockscreenVisibility = NotificationCompat.VISIBILITY_PUBLIC
channel.enableVibration(false)
channel.vibrationPattern = longArrayOf(0)
notificationManager.createNotificationChannel(channel)
}
// Create the notification
val builder: NotificationCompat.Builder = NotificationCompat.Builder(context, CHANNEL_ID)
//设置状态栏内的小图标
val smallIcon = IconCompat.createFromIcon(
context, Icon.createWithResource(
context, R.mipmap.logo
)
)
smallIcon?.let {
builder.setSmallIcon(smallIcon)
}
builder.setContentTitle(sendBean.context.resources.getString(R.string.app_name))
// .setContentText("notification")
val requestCode = Random.nextInt(1000)
val pendingIntent = PendingIntent.getActivity(context, requestCode, sendBean.intent, PendingIntent.FLAG_IMMUTABLE)
builder.setContentIntent(pendingIntent)
.setPriority(NotificationCompat.PRIORITY_MAX)
.setAutoCancel(true)
var small: RemoteViews? = sendBean.bigRemoteViews
//Android 12以下需要适配小RemoteViews
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
small = sendBean.smallRemoteViews
}
// 设置小视图
sendBean.smallRemoteViews?.let { builder.setCustomContentView(it) }
// 设置悬浮通知视图(Android 12 及以上)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
sendBean.smallRemoteViews.let { builder.setCustomHeadsUpContentView(it) }
}
// 设置大视图
sendBean.bigRemoteViews?.let { builder.setCustomBigContentView(it) }
notificationManager.notify(sendBean.notificationId, builder.build())
} }
} }
\ No newline at end of file
...@@ -5,8 +5,10 @@ import android.content.Context ...@@ -5,8 +5,10 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.IntentFilter import android.content.IntentFilter
import android.os.Build import android.os.Build
import com.base.scanqr.bean.NotificationSendBean
import com.base.scanqr.bean.NotificationSendBean.Companion.POPUP_WHERE_LOCK import com.base.scanqr.bean.NotificationSendBean.Companion.POPUP_WHERE_LOCK
import com.base.scanqr.bean.config.PopupConfigBean.Companion.popupConfigBean import com.base.scanqr.bean.config.PopupConfigBean.Companion.popupConfigBean
import com.base.scanqr.fcm.notification.NotificationManager
import com.base.scanqr.helper.EventUtils import com.base.scanqr.helper.EventUtils
import com.base.scanqr.utils.AppPreferences import com.base.scanqr.utils.AppPreferences
import com.base.scanqr.utils.KotlinExt.currentDate import com.base.scanqr.utils.KotlinExt.currentDate
...@@ -15,8 +17,10 @@ import java.util.Objects ...@@ -15,8 +17,10 @@ import java.util.Objects
class ScreenStatusReceiver : BroadcastReceiver() { class ScreenStatusReceiver : BroadcastReceiver() {
private val TAG = "ScreenStatusReceiver"
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
LogEx.logDebug(TAG,"onReceive")
val action = intent.action val action = intent.action
when (Objects.requireNonNull<String?>(action)) { when (Objects.requireNonNull<String?>(action)) {
Intent.ACTION_SCREEN_ON -> isDeviceInteractive = true Intent.ACTION_SCREEN_ON -> isDeviceInteractive = true
...@@ -29,7 +33,9 @@ class ScreenStatusReceiver : BroadcastReceiver() { ...@@ -29,7 +33,9 @@ class ScreenStatusReceiver : BroadcastReceiver() {
isSecureLockActive = false isSecureLockActive = false
if (isDeviceInteractive && !isSecureLockActive) { if (isDeviceInteractive && !isSecureLockActive) {
if (popupConfigBean.screenS) { if (popupConfigBean.screenS) {
// sendNotificationIfCan(context, POPUP_WHERE_LOCK, null) LogEx.logDebug(TAG,"onReceive submitSendBean")
val sendBean = NotificationSendBean(context, POPUP_WHERE_LOCK, canSend = { true }, sendSuccess = {})
NotificationManager.submitSendBean(sendBean)
} }
} }
} }
...@@ -118,11 +124,9 @@ class ScreenStatusReceiver : BroadcastReceiver() { ...@@ -118,11 +124,9 @@ class ScreenStatusReceiver : BroadcastReceiver() {
/** /**
* 推送成功后保存值 * 推送成功后保存值
*/ */
fun saveScreenPushedData(where: String, actionId: String) { fun saveScreenPushedData() {
if (where == POPUP_WHERE_LOCK) { todayScreenPush += 1
todayScreenPush += 1 screenLastPushTime = System.currentTimeMillis()
screenLastPushTime = System.currentTimeMillis()
}
} }
} }
......
...@@ -13,7 +13,7 @@ import android.widget.RemoteViews ...@@ -13,7 +13,7 @@ import android.widget.RemoteViews
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.graphics.drawable.IconCompat import androidx.core.graphics.drawable.IconCompat
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.bean.NotificationSendBean.Companion.ACTION_ID_SCAN import com.base.scanqr.bean.NotificationSendBean.Companion.ACTION_ID_STAY_SCAN
import com.base.scanqr.service.StayJobService.Companion.NOTIFICATION_STAY_ID import com.base.scanqr.service.StayJobService.Companion.NOTIFICATION_STAY_ID
import com.base.scanqr.ui.main.MainActivity import com.base.scanqr.ui.main.MainActivity
import com.base.scanqr.ui.start.StartActivity import com.base.scanqr.ui.start.StartActivity
...@@ -25,7 +25,7 @@ object StayNotification { ...@@ -25,7 +25,7 @@ object StayNotification {
private fun customRemoteViews(context: Context, contentView: RemoteViews, expendView: RemoteViews) { private fun customRemoteViews(context: Context, contentView: RemoteViews, expendView: RemoteViews) {
val requestCode1 = Random.nextInt(1800) val requestCode1 = Random.nextInt(1800)
val intent1 = Intent(context, StartActivity::class.java).apply { val intent1 = Intent(context, StartActivity::class.java).apply {
putExtra("actionId", ACTION_ID_SCAN) putExtra("actionId", ACTION_ID_STAY_SCAN)
} }
val pendingIntent1 = val pendingIntent1 =
PendingIntent.getActivity( PendingIntent.getActivity(
......
...@@ -12,7 +12,7 @@ import com.base.scanqr.ads.AdsMgr ...@@ -12,7 +12,7 @@ import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.base.BaseActivity import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.ConstObject.mainStartTimes import com.base.scanqr.bean.ConstObject.mainStartTimes
import com.base.scanqr.bean.HomeTabUIBean import com.base.scanqr.bean.HomeTabUIBean
import com.base.scanqr.bean.NotificationSendBean.Companion.ACTION_ID_SCAN import com.base.scanqr.bean.NotificationSendBean.Companion.ACTION_ID_STAY_SCAN
import com.base.scanqr.databinding.ActivityMainBinding import com.base.scanqr.databinding.ActivityMainBinding
import com.base.scanqr.databinding.ItemHomeTabBinding import com.base.scanqr.databinding.ItemHomeTabBinding
import com.base.scanqr.qr.CameraUtils import com.base.scanqr.qr.CameraUtils
...@@ -96,7 +96,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl ...@@ -96,7 +96,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
val actionId = intent.extras?.getString("actionId") val actionId = intent.extras?.getString("actionId")
LogEx.logDebug(TAG, "actionId=$actionId") LogEx.logDebug(TAG, "actionId=$actionId")
when (actionId) { when (actionId) {
ACTION_ID_SCAN -> { ACTION_ID_STAY_SCAN -> {
val defaultTab = binding.tabLayout.getTabAt(1) val defaultTab = binding.tabLayout.getTabAt(1)
defaultTab?.select() defaultTab?.select()
defaultTab?.setSelected() defaultTab?.setSelected()
......
...@@ -8,7 +8,7 @@ import com.base.scanqr.ads.AdsShowCallBack ...@@ -8,7 +8,7 @@ import com.base.scanqr.ads.AdsShowCallBack
import com.base.scanqr.base.BaseActivity import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.ConstObject import com.base.scanqr.bean.ConstObject
import com.base.scanqr.bean.ConstObject.isFirstLauncher import com.base.scanqr.bean.ConstObject.isFirstLauncher
import com.base.scanqr.bean.NotificationSendBean.Companion.ACTION_ID_SCAN import com.base.scanqr.bean.NotificationSendBean.Companion.ACTION_ID_STAY_SCAN
import com.base.scanqr.databinding.ActivityStartBinding import com.base.scanqr.databinding.ActivityStartBinding
import com.base.scanqr.service.StayJobService.Companion.startJob import com.base.scanqr.service.StayJobService.Companion.startJob
import com.base.scanqr.ui.language.LanguageActivity import com.base.scanqr.ui.language.LanguageActivity
...@@ -110,7 +110,7 @@ class StartActivity : BaseActivity<ActivityStartBinding>(ActivityStartBinding::i ...@@ -110,7 +110,7 @@ class StartActivity : BaseActivity<ActivityStartBinding>(ActivityStartBinding::i
val actionId = intent.extras?.getString("actionId") val actionId = intent.extras?.getString("actionId")
LogEx.logDebug(TAG, "actionId=$actionId") LogEx.logDebug(TAG, "actionId=$actionId")
when (actionId) { when (actionId) {
ACTION_ID_SCAN -> { ACTION_ID_STAY_SCAN -> {
} }
} }
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:angle="-90"
android:endColor="#6672F7"
android:startColor="#8559EA" />
<corners android:radius="80dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="8dp"
android:background="@mipmap/tu_product"
android:gravity="center"
android:orientation="horizontal"
tools:ignore="DisableBaselineAlignment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginVertical="16dp"
android:orientation="vertical"
tools:ignore="UselessParent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="@string/what_products"
android:textColor="@color/black"
android:textSize="13sp"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:background="@drawable/bg_8559ea_6672f7"
android:gravity="center"
android:includeFontPadding="false"
android:paddingHorizontal="14dp"
android:paddingVertical="4dp"
android:text="@string/find_now"
android:textColor="@color/white" />
</LinearLayout>
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:paddingVertical="16dp"
tools:ignore="DisableBaselineAlignment">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/search_for_product_information"
android:textColor="@color/black"
android:textSize="15sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:text="@string/new_product"
android:textColor="#666666"
android:textSize="12sp" />
</LinearLayout>
\ No newline at end of file
...@@ -71,5 +71,9 @@ ...@@ -71,5 +71,9 @@
<string name="yes">Yes</string> <string name="yes">Yes</string>
<string name="no">No</string> <string name="no">No</string>
<string name="search_for_products">Search for products</string> <string name="search_for_products">Search for products</string>
<string name="search_for_product_information">Search for product information</string>
<string name="new_product">New feature! Search for information about the product.</string>
<string name="what_products">What products are you\nlooking for today?</string>
<string name="find_now">Find Now</string>
</resources> </resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment