Commit dca3023c authored by songjianyu's avatar songjianyu

[新增] 电池的常驻通知功能

parent fb356b23
......@@ -47,6 +47,7 @@
android:name=".ui.main.MainActivity"
android:exported="true"
android:screenOrientation="portrait"
android:launchMode="singleTask"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.guide.GuideActivity"
......
......@@ -148,6 +148,7 @@ abstract class BaseActivity<VB : ViewBinding>(
val intent = Intent(this, MainActivity::class.java)
intent.putExtra("where", "finishToMainTop")
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK )
startActivity(intent)
}
......@@ -401,10 +402,12 @@ abstract class BaseActivity<VB : ViewBinding>(
if (AdConfigBean.adsConfigBean.functionBackShowAd) {
AdsMgr.showInsert(this, showCallBack = object : AdsShowCallBack() {
override fun next() {
finish()
finishToMainTop()
}
})
} else {
finish()
finishToMainTop()
}
}
......
package com.base.appzxhy.business.service
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.graphics.BitmapFactory
import android.graphics.Color
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.appzxhy.R
import com.base.appzxhy.bean.FeatureBean.Companion.BATTERY_INFO
import com.base.appzxhy.ui.batteryinfo.BatteryReceiver
import com.base.appzxhy.ui.main.MainActivity
import com.base.appzxhy.ui.splash.SplashActivity
import kotlin.math.roundToInt
import kotlin.random.Random
object BatteryNotification {
private fun customRemoteViews(
context: Context,
contentView: RemoteViews,
expendView: RemoteViews,
) {
val requestCode = Random.nextInt(1800)
val intent = Intent(context, SplashActivity::class.java).apply {
putExtra("actionId", BATTERY_INFO)
}
val pendingIntent =
PendingIntent.getActivity(
context,
requestCode,
intent,
PendingIntent.FLAG_IMMUTABLE
)
contentView.setOnClickPendingIntent(R.id.tv_open, pendingIntent)
expendView.setOnClickPendingIntent(R.id.tv_open, pendingIntent)
//set view
val percent = BatteryReceiver.level / BatteryReceiver.scale.toFloat()
val power ="${(percent * 100).roundToInt()}%"
val remainingCapacity = BatteryReceiver.mAh * percent
val wTime = (remainingCapacity / 3.0f).toInt()
if (BatteryReceiver.isCharging) {
//充电
contentView.setTextColor(R.id.tv_status,Color.parseColor("#00E961"))
contentView.setTextViewText(R.id.tv_status, "Charging")
contentView.setTextColor(R.id.tv_power, Color.parseColor("#00E961"))
contentView.setTextViewText(R.id.tv_power, power)
expendView.setImageViewResource(
R.id.iv_battery,
R.drawable.remote_view_battery_charging
)
expendView.setTextColor(R.id.tv_status, Color.parseColor("#00E961"))
expendView.setTextViewText(R.id.tv_status, "Charging")
expendView.setTextColor(R.id.tv_power, Color.parseColor("#00E961"))
expendView.setTextViewText(R.id.tv_power, power)
return
}
if (percent > 0.5) {
contentView.setTextColor(R.id.tv_status, Color.parseColor("#00E961"))
contentView.setTextViewText(R.id.tv_status, "${wTime / 60}h ${wTime % 60}m")
contentView.setTextColor(R.id.tv_power, Color.parseColor("#00E961"))
contentView.setTextViewText(R.id.tv_power, power)
expendView.setImageViewResource(R.id.iv_battery, R.drawable.remote_view_battery_full)
expendView.setTextColor(R.id.tv_status, Color.parseColor("#00E961"))
expendView.setTextViewText(R.id.tv_status, "${wTime / 60}h ${wTime % 60}m")
expendView.setTextColor(R.id.tv_power, Color.parseColor("#00E961"))
expendView.setTextViewText(R.id.tv_power, power)
} else {
contentView.setTextColor(R.id.tv_status, Color.parseColor("#FF2C2C"))
contentView.setTextViewText(R.id.tv_status, "Low")
contentView.setTextColor(R.id.tv_power, Color.parseColor("#FF2C2C"))
contentView.setTextViewText(R.id.tv_power, power)
expendView.setImageViewResource(R.id.iv_battery, R.drawable.remote_view_battery_low)
expendView.setTextColor(R.id.tv_status, Color.parseColor("#FF2C2C"))
expendView.setTextViewText(R.id.tv_status, "Low")
expendView.setTextColor(R.id.tv_power, Color.parseColor("#FF2C2C"))
expendView.setTextViewText(R.id.tv_power, power)
}
}
fun createBatteryNotification(context: Context): Notification {
val channelName = "Permanent Foreground Service Channel"
val channelId = "permanent_channel"
val contentView = RemoteViews(context.packageName, R.layout.layout_battery_stay_small)
val expendView = RemoteViews(context.packageName, R.layout.layout_battery_stay_large)
customRemoteViews(context, contentView, expendView)
val builder = NotificationCompat.Builder(context, channelId)
val smallIcon = IconCompat.createFromIcon(
context, Icon.createWithResource(
context, R.mipmap.ic_launcher
)
)
smallIcon?.let {
builder.setSmallIcon(smallIcon) //设置状态栏内的小图标
}
val nfIntent = Intent(context, MainActivity::class.java)
val pendingIntent =
PendingIntent.getActivity(context, 0, nfIntent, PendingIntent.FLAG_IMMUTABLE)
builder.setLargeIcon(BitmapFactory.decodeResource(context.resources, R.mipmap.ic_launcher))
builder.setContentTitle(context.resources.getString(R.string.app_name))
builder.setContentIntent(pendingIntent) //设置PendingIntent
builder.setVisibility(NotificationCompat.VISIBILITY_PRIVATE) //设置通知公开可见
builder.setAutoCancel(false)
builder.setOngoing(true)
builder.setPriority(NotificationCompat.PRIORITY_MAX) //优先级为:重要通知
builder.setWhen(System.currentTimeMillis())
builder.setCustomContentView(contentView)
builder.setCustomBigContentView(expendView)
builder.setCustomHeadsUpContentView(expendView)
builder.setNumber(0)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel =
NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_LOW)
channel.lockscreenVisibility = 1
channel.setShowBadge(false)
val notificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
builder.setChannelId(channelId)
}
return builder.build()
}
}
\ No newline at end of file
......@@ -63,14 +63,22 @@ class StayJobService : JobService() {
private fun startForeground() {
try {
val notification = createPermanentNotification(applicationContext)
val batteryNotification =
BatteryNotification.createBatteryNotification(applicationContext)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
startForeground(
NOTIFICATION_STAY_ID,
notification,
ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
)
startForeground(
NOTIFICATION_STAY_ID + 1,
batteryNotification,
ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
)
} else {
startForeground(NOTIFICATION_STAY_ID, notification)
startForeground(NOTIFICATION_STAY_ID + 1, batteryNotification)
}
isRunning = true
EventUtils.event("startForeground")
......@@ -85,7 +93,14 @@ class StayJobService : JobService() {
val notificationManager =
getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(NOTIFICATION_STAY_ID, createPermanentNotification(applicationContext))
notificationManager.notify(
NOTIFICATION_STAY_ID,
createPermanentNotification(applicationContext)
)
notificationManager.notify(
NOTIFICATION_STAY_ID + 1,
BatteryNotification.createBatteryNotification(applicationContext)
)
}
override fun onDestroy() {
......@@ -114,7 +129,8 @@ class StayJobService : JobService() {
return false
}
val millisInFuture = if (BuildConfig.DEBUG) 5000L else PopupConfigBean.popupConfigBean.notifyForegroundInterval
val millisInFuture =
if (BuildConfig.DEBUG) 5000L else PopupConfigBean.popupConfigBean.notifyForegroundInterval
private inner class Timer() : CountDownTimer(millisInFuture, 1000) {
override fun onTick(millisUntilFinished: Long) {
......
......@@ -34,6 +34,7 @@ class BatteryInfoActivity :
}
override fun initView() {
super.initView()
setStatusBarColor(getColor(R.color.colorPrimary))
showAdAnimation(LottieEnum.BATTERY_INFO_LOTTIE) {
adAdapter.submitList(listOf(""))
......
......@@ -13,6 +13,7 @@ import com.base.appzxhy.ui.largefile.LargeFileCleanActivity
import com.base.appzxhy.ui.photocompression.PhotoCompressionActivity
import com.base.appzxhy.ui.screenshot.ScreenshotCleanActivity
import com.base.appzxhy.ui.similar.SimilarPhotosActivity
import com.base.appzxhy.ui.videoclean.VideoCleanActivity
class FunctionBackDialog(
val activity: Activity
......@@ -63,6 +64,10 @@ class FunctionBackDialog(
binding.tvTitle.text = activity.getString(R.string.exit_screenshot_cleaner)
binding.tvContent.text = activity.getString(R.string.exit_screenshot_cleaner_content)
}
is VideoCleanActivity->{
binding.tvTitle.text = activity.getString(R.string.Exit_Video_Clean)
binding.tvContent.text = activity.getString(R.string.Exit_Video_Clean_Content)
}
else -> {
back.invoke()
......
......@@ -254,9 +254,9 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ
binding.ivType.isSelected = false
binding.ivSize.isSelected = false
binding.ivTime.isSelected = false
binding.tvType.setTextColor(getColor(R.color.color_181b1f))
binding.tvSize.setTextColor(getColor(R.color.color_181b1f))
binding.tvTime.setTextColor(getColor(R.color.color_181b1f))
binding.tvType.setTextColor(getColor(R.color.fontsBlack))
binding.tvSize.setTextColor(getColor(R.color.fontsBlack))
binding.tvTime.setTextColor(getColor(R.color.fontsBlack))
binding.ivTypeArrow.setImageResource(R.drawable.icon_jiantou_down_small)
binding.ivSizeArrow.setImageResource(R.drawable.icon_jiantou_down_small)
binding.ivTimeArrow.setImageResource(R.drawable.icon_jiantou_down_small)
......
......@@ -242,7 +242,7 @@ class SimilarPhotosActivity : BaseActivity<ActivitySimilarPhotosBinding>(Activit
override fun initListener() {
super.initListener()
binding.llTitle.tvTitle.setOnClickListener { onBackPressedDispatcher.onBackPressed() }
binding.llTitle.ivBack.setOnClickListener { onBackPressedDispatcher.onBackPressed() }
binding.ivSelect.setOnClickListener {
it.isSelected = !it.isSelected
setSelectAll(it.isSelected)
......
......@@ -128,10 +128,6 @@ class VideoCleanActivity :
}
}
override fun handleBackCallBack() {
super.handleBackCallBack()
}
@SuppressLint("NotifyDataSetChanged")
private fun initData() {
lifecycleScope.launch(Dispatchers.IO) {
......@@ -176,15 +172,4 @@ class VideoCleanActivity :
dialog.showDialog("delete")
}
}
internal class MediaImageSpanLookup(
private val spanCount: Int,
private val expandableAdapter: ExpandableAdapter<*>,
) :
GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
val viewType = expandableAdapter.getItemViewType(position)
return if (expandableAdapter.isGroup(viewType)) spanCount else 1
}
}
}
\ No newline at end of file
......@@ -48,7 +48,7 @@
android:layout_height="wrap_content"
android:layout_marginHorizontal="2dp"
android:text="@string/all_types"
android:textColor="@color/color_181b1f"
android:textColor="@color/fontsBlack"
android:textSize="14sp"
android:textStyle="bold" />
......@@ -84,7 +84,7 @@
android:layout_height="wrap_content"
android:layout_marginHorizontal="2dp"
android:text="@string/mb_10"
android:textColor="@color/color_181b1f"
android:textColor="@color/fontsBlack"
android:textSize="14sp"
android:textStyle="bold" />
......@@ -119,7 +119,7 @@
android:layout_height="wrap_content"
android:layout_marginHorizontal="2dp"
android:text="@string/all_time"
android:textColor="@color/color_181b1f"
android:textColor="@color/fontsBlack"
android:textSize="14sp"
android:textStyle="bold" />
......
......@@ -12,36 +12,9 @@
android:background="@color/colorPrimary"
app:layout_constraintTop_toTopOf="parent">
<include layout="@layout/layout_title"
<include
android:id="@+id/ll_title"
/>
<!-- <FrameLayout-->
<!-- android:id="@+id/ll_title"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:gravity="center_vertical"-->
<!-- android:orientation="horizontal"-->
<!-- app:layout_constraintTop_toTopOf="parent">-->
<!-- <androidx.appcompat.widget.AppCompatImageView-->
<!-- android:id="@+id/ivBack"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:padding="16dp"-->
<!-- android:src="@drawable/icon_back" />-->
<!-- <androidx.appcompat.widget.AppCompatTextView-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_gravity="start|center_vertical"-->
<!-- android:layout_marginStart="53dp"-->
<!-- android:text="@string/Video_Clean"-->
<!-- android:textColor="@color/white"-->
<!-- android:textSize="20sp"-->
<!-- android:textStyle="bold" />-->
<!-- </FrameLayout>-->
layout="@layout/layout_title" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_size"
......@@ -112,9 +85,9 @@
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/white"
android:paddingHorizontal="12dp"
android:paddingTop="8dp"
android:paddingBottom="12dp"
android:paddingHorizontal="12dp"
app:layout_constraintBottom_toTopOf="@id/ll_bottom"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="28dp">
<ImageView
android:id="@+id/iv_battery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="25dp"
tools:src="@drawable/icon_battery" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/tv_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#00E961"
android:textSize="@dimen/sp_20"
android:textStyle="bold"
android:text="Changer" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Battery"
android:textColor="@color/color_666666"
android:textSize="@dimen/sp_12" />
</LinearLayout>
<ImageView
android:id="@+id/view"
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_marginHorizontal="30dp"
android:background="#CCCCCC"
app:layout_constraintEnd_toStartOf="@id/tv_power"
app:layout_constraintStart_toEndOf="@id/tv_status" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/tv_power"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#00E961"
android:textSize="@dimen/sp_20"
android:textStyle="bold"
android:text="12%" />
<TextView
android:id="@+id/tv_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Power"
android:textColor="@color/color_666666"
android:textSize="@dimen/sp_12" />
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/tv_open"
android:layout_width="match_parent"
android:layout_height="41dp"
android:background="@drawable/bg_primary_r64"
android:gravity="center"
android:text="@string/View"
android:textColor="@color/white"
android:textSize="@dimen/sp_12"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/tv_2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_power" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/tv_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#00E961"
android:textSize="@dimen/sp_20"
android:textStyle="bold"
android:text="Changer" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Battery"
android:textColor="@color/color_666666"
android:textSize="@dimen/sp_12" />
</LinearLayout>
<ImageView
android:id="@+id/view"
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_marginHorizontal="20dp"
android:background="#CCCCCC"
app:layout_constraintEnd_toStartOf="@id/tv_power"
app:layout_constraintStart_toEndOf="@id/tv_status" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/tv_power"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#00E961"
android:textSize="@dimen/sp_20"
android:textStyle="bold"
android:text="12%" />
<TextView
android:id="@+id/tv_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Power"
android:textColor="@color/color_666666"
android:textSize="@dimen/sp_12" />
</LinearLayout>
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="0dp"
/>
<TextView
android:id="@+id/tv_open"
android:layout_width="60dp"
android:layout_height="29dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="20dp"
android:background="@drawable/bg_primary_r64"
android:gravity="center"
android:text="@string/View"
android:textColor="@color/white"
android:textSize="@dimen/sp_12"
android:textStyle="bold"
android:layout_marginEnd="20dp"
app:layout_constraintBottom_toBottomOf="@id/tv_2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_power" />
</LinearLayout>
\ No newline at end of file
......@@ -149,4 +149,6 @@ Please rest assured that we will handle your information in strict accordance wi
<string name="Battery">Battery</string>
<string name="Large_File">Large File</string>
<string name="Screenshot">Screenshot</string>
<string name="Exit_Video_Clean">Exit_Video_Clean</string>
<string name="Exit_Video_Clean_Content">>Exit Video Clean? Undeleted video might be using space</string>
</resources>
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