Commit dbea0a0b authored by wanglei's avatar wanglei

...

parent a79b8e88
......@@ -141,5 +141,9 @@ dependencies {
//冲突版本确定版本
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
import com.base.scanqr.bean.config.PopupConfigBean
import com.base.scanqr.fcm.FCMManager
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.PackageStatusReceiver
import com.base.scanqr.fcm.receiver.ScreenStatusReceiver
......@@ -143,6 +144,9 @@ class MyApplication : Application() {
// startAlarm(appContext, 24)
// startAlarm(appContext, 48)
// startAlarm(appContext, 72)
//开启上报队列
NotificationManager.startNotificationQueue()
}
......
package com.base.scanqr.bean
import android.content.Context
import android.content.Intent
import android.widget.RemoteViews
class NotificationSendBean(
val context: Context,
val actionId: String = "",
val where: String = "",
val canSend: () -> Boolean = { true },//是否可以发送
var sendSuccess: (() -> Unit)? = null,//发送成功回调
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 {
const val POPUP_WHERE_TIMBER = "Timer"
......@@ -23,6 +30,7 @@ class NotificationSendBean(
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
import android.content.Context
import com.base.scanqr.BuildConfig
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.config.PopupConfigBean.Companion.popupConfigBean
import com.base.scanqr.helper.EventUtils
......@@ -28,7 +30,28 @@ object NotificationManager {
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) {
if (bean.actionId.isEmpty()) {
val actionId = getNextActionId()
bean.actionId = actionId
}
try {
sendBeanBlockingQueue.put(bean)
} catch (e: Exception) {
......@@ -157,6 +180,6 @@ object NotificationManager {
* 只测某些类型
*/
private var testWhere = listOf(
POPUP_WHERE_TIMBER
POPUP_WHERE_LOCK
)
}
\ No newline at end of file
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.Companion.ACTION_ID_SCAN
import com.base.scanqr.ui.start.StartActivity
import kotlin.random.Random
/**
* 发送通知UI部分
*/
object NotificationUiUtil {
private val CHANNEL_ID = "San Qr Channel"
private val CHANNEL_NAME = "San Qr Channel NAME"
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
import android.content.Intent
import android.content.IntentFilter
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.config.PopupConfigBean.Companion.popupConfigBean
import com.base.scanqr.fcm.notification.NotificationManager
import com.base.scanqr.helper.EventUtils
import com.base.scanqr.utils.AppPreferences
import com.base.scanqr.utils.KotlinExt.currentDate
......@@ -15,8 +17,10 @@ import java.util.Objects
class ScreenStatusReceiver : BroadcastReceiver() {
private val TAG = "ScreenStatusReceiver"
override fun onReceive(context: Context, intent: Intent) {
LogEx.logDebug(TAG,"onReceive")
val action = intent.action
when (Objects.requireNonNull<String?>(action)) {
Intent.ACTION_SCREEN_ON -> isDeviceInteractive = true
......@@ -29,7 +33,9 @@ class ScreenStatusReceiver : BroadcastReceiver() {
isSecureLockActive = false
if (isDeviceInteractive && !isSecureLockActive) {
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() {
/**
* 推送成功后保存值
*/
fun saveScreenPushedData(where: String, actionId: String) {
if (where == POPUP_WHERE_LOCK) {
todayScreenPush += 1
screenLastPushTime = System.currentTimeMillis()
}
fun saveScreenPushedData() {
todayScreenPush += 1
screenLastPushTime = System.currentTimeMillis()
}
}
......
......@@ -13,7 +13,7 @@ import android.widget.RemoteViews
import androidx.core.app.NotificationCompat
import androidx.core.graphics.drawable.IconCompat
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.ui.main.MainActivity
import com.base.scanqr.ui.start.StartActivity
......@@ -25,7 +25,7 @@ object StayNotification {
private fun customRemoteViews(context: Context, contentView: RemoteViews, expendView: RemoteViews) {
val requestCode1 = Random.nextInt(1800)
val intent1 = Intent(context, StartActivity::class.java).apply {
putExtra("actionId", ACTION_ID_SCAN)
putExtra("actionId", ACTION_ID_STAY_SCAN)
}
val pendingIntent1 =
PendingIntent.getActivity(
......
......@@ -12,7 +12,7 @@ import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.ConstObject.mainStartTimes
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.ItemHomeTabBinding
import com.base.scanqr.qr.CameraUtils
......@@ -96,7 +96,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
val actionId = intent.extras?.getString("actionId")
LogEx.logDebug(TAG, "actionId=$actionId")
when (actionId) {
ACTION_ID_SCAN -> {
ACTION_ID_STAY_SCAN -> {
val defaultTab = binding.tabLayout.getTabAt(1)
defaultTab?.select()
defaultTab?.setSelected()
......
......@@ -8,7 +8,7 @@ import com.base.scanqr.ads.AdsShowCallBack
import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.ConstObject
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.service.StayJobService.Companion.startJob
import com.base.scanqr.ui.language.LanguageActivity
......@@ -110,7 +110,7 @@ class StartActivity : BaseActivity<ActivityStartBinding>(ActivityStartBinding::i
val actionId = intent.extras?.getString("actionId")
LogEx.logDebug(TAG, "actionId=$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 @@
<string name="yes">Yes</string>
<string name="no">No</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>
\ 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