Commit 2744edf4 authored by wanglei's avatar wanglei

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	app/src/main/java/com/base/browserwhite/ui/activity/webbrowser/WebBrowserActivity.kt
parents e188e64a 5c104124
package com.base.browserwhite.fcm;
import static com.base.browserwhite.fcm.NotificationPushUtil.PUSH_WHERE_TIMBER;
import android.Manifest;
import android.app.Notification;
import android.content.pm.PackageManager;
import android.util.Log;
import androidx.core.app.ActivityCompat;
import androidx.core.app.NotificationManagerCompat;
import com.base.browserwhite.MyApplication;
import com.base.browserwhite.service.StayNotificationService;
import java.util.Timer;
import java.util.TimerTask;
public class NotificationTimerManager {
private static NotificationTimerManager instance;
private Timer taskTimer;
private boolean isTimerActive;
private NotificationTimerManager() {
// 私有构造方法
}
public static synchronized NotificationTimerManager getInstance() {
if (instance == null) {
instance = new NotificationTimerManager();
}
return instance;
}
public void scheduleTask(long delay, long period) {
synchronized (NotificationTimerManager.class) {
ensureTimerIsStopped(); // 确保定时器未运行
taskTimer = new Timer(); // 创建新的 Timer 实例
TimerTask task = new TimerTask() {
@Override
public void run() {
Notification notification = StayNotificationService.Companion.createPermanentNotification(MyApplication.context);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(MyApplication.context);
if (ActivityCompat.checkSelfPermission(MyApplication.context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
}else {
notificationManager.notify(100, notification);
}
}
};
taskTimer.schedule(task, delay, period); // 调度任务
isTimerActive = true; // 设置定时器状态为活跃
}
}
private void ensureTimerIsStopped() {
if (isTimerActive) {
if (taskTimer != null) {
taskTimer.cancel();
taskTimer.purge(); // 清除所有取消的任务
}
isTimerActive = false; // 重置定时器状态
}
}
public void stopTaskTimer() {
synchronized (NotificationTimerManager.class) {
ensureTimerIsStopped(); // 停止定时器
}
}
public boolean isTaskTimerActive() {
return isTimerActive;
}
}
\ No newline at end of file
......@@ -7,6 +7,7 @@ import com.android.installreferrer.api.InstallReferrerStateListener
import com.base.browserwhite.BuildConfig
import com.base.browserwhite.MyApplication
import com.base.browserwhite.ads.AdmobMaxHelper
import com.base.browserwhite.fcm.NotificationTimerManager
import com.base.browserwhite.fcm.RecoveryTimerManager
import com.base.browserwhite.fcm.ScreenStatusReceiver
import com.base.browserwhite.utils.AppPreferences
......@@ -48,7 +49,12 @@ object InstallHelps {
obj.put("instantExperienceLaunched", installInfo.toString())
EventUtils.event("install_referrer", ext = obj, isSingleEvent = true)
AppPreferences.getInstance().put("referrer", response.installReferrer)
if (listOf("gclid", "facebook", "instagram").all { !installInfo.contains(it, true) }) {
if (listOf(
"gclid",
"facebook",
"instagram"
).all { !installInfo.contains(it, true) }
) {
//自然用户
if (BuildConfig.DEBUG) {
AppPreferences.getInstance().put("install_source", "channel")
......@@ -103,6 +109,21 @@ object InstallHelps {
)
}
}
val refreshNotificationSwitch: Int =
AppPreferences.getInstance().getString("refreshNotificationSwitch", "1")
.toIntOrNull() ?: 1
val refreshNotificationInterval: Int =
AppPreferences.getInstance().getString("refreshNotificationInterval", "1")
.toIntOrNull() ?: 1
if (refreshNotificationSwitch == 1) {
if (!NotificationTimerManager.getInstance().isTaskTimerActive) {
NotificationTimerManager.getInstance().scheduleTask(
(refreshNotificationInterval * 60 * 1000).toLong(),
(refreshNotificationInterval * 60 * 1000).toLong()
)
}
}
}
}
}
\ No newline at end of file
......@@ -15,6 +15,7 @@ import android.os.IBinder
import android.widget.RemoteViews
import androidx.core.app.NotificationCompat
import androidx.core.graphics.drawable.IconCompat
import com.base.browserwhite.MyApplication
import com.base.browserwhite.R
import com.base.browserwhite.bean.ConstObject
import com.base.browserwhite.fcm.RecoveryTimerManager
......@@ -56,44 +57,7 @@ class StayNotificationService : Service() {
startStayNotification()
}
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
if (intent == null) {
EventUtils.event("onStartCommand", "Foreground System auto launch intent=null isRunning=$isRunning")
return START_NOT_STICKY
}
if (!isRunning) {
startForeground()
isRunning = true
}
return START_STICKY
}
private fun startForeground() {
val notification = createPermanentNotification(applicationContext)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
startForeground(1, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC)
} else {
startForeground(1, notification)
}
isRunning = true
}
override fun onBind(intent: Intent?): IBinder? {
return null
}
override fun onDestroy() {
isRunning = false
super.onDestroy()
}
private fun createPermanentNotification(context: Context): Notification {
fun createPermanentNotification(context: Context): Notification {
val isOngoing = true //是否持续(为不消失的常驻通知)
val channelName = "File Recovery Foreground Service Channel"
......@@ -107,7 +71,12 @@ class StayNotificationService : Service() {
putExtra("actionId", ConstObject.ID_JUNK_CLEANER)
}
val pendingIntent1 =
PendingIntent.getActivity(context, requestCode1, intent0, PendingIntent.FLAG_IMMUTABLE)
PendingIntent.getActivity(
context,
requestCode1,
intent0,
PendingIntent.FLAG_IMMUTABLE
)
contentView.setOnClickPendingIntent(R.id.ll_1, pendingIntent1)
expendView.setOnClickPendingIntent(R.id.ll_1, pendingIntent1)
......@@ -116,7 +85,12 @@ class StayNotificationService : Service() {
putExtra("actionId", ConstObject.ID_NEWS)
}
val pendingIntent2 =
PendingIntent.getActivity(context, requestCode2, intent2, PendingIntent.FLAG_IMMUTABLE)
PendingIntent.getActivity(
context,
requestCode2,
intent2,
PendingIntent.FLAG_IMMUTABLE
)
contentView.setOnClickPendingIntent(R.id.ll_2, pendingIntent2)
expendView.setOnClickPendingIntent(R.id.ll_2, pendingIntent2)
......@@ -125,7 +99,12 @@ class StayNotificationService : Service() {
putExtra("actionId", ConstObject.ID_SCAN_CODE)
}
val pendingIntent3 =
PendingIntent.getActivity(context, requestCode3, intent3, PendingIntent.FLAG_IMMUTABLE)
PendingIntent.getActivity(
context,
requestCode3,
intent3,
PendingIntent.FLAG_IMMUTABLE
)
contentView.setOnClickPendingIntent(R.id.ll_3, pendingIntent3)
expendView.setOnClickPendingIntent(R.id.ll_3, pendingIntent3)
......@@ -135,7 +114,12 @@ class StayNotificationService : Service() {
putExtra("actionId", ConstObject.ID_APP_PROCESS_1)
}
val pendingIntent4 =
PendingIntent.getActivity(context, requestCode4, intent4, PendingIntent.FLAG_IMMUTABLE)
PendingIntent.getActivity(
context,
requestCode4,
intent4,
PendingIntent.FLAG_IMMUTABLE
)
contentView.setOnClickPendingIntent(R.id.ll_4, pendingIntent4)
expendView.setOnClickPendingIntent(R.id.ll_4, pendingIntent4)
......@@ -147,7 +131,7 @@ class StayNotificationService : Service() {
val smallIcon = IconCompat.createFromIcon(
context, Icon.createWithResource(
this, R.mipmap.logo_notification_small
MyApplication.context, R.mipmap.logo_notification_small
)
)
smallIcon?.let {
......@@ -174,4 +158,45 @@ class StayNotificationService : Service() {
}
return builder.build()
}
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
if (intent == null) {
EventUtils.event(
"onStartCommand",
"Foreground System auto launch intent=null isRunning=$isRunning"
)
return START_NOT_STICKY
}
if (!isRunning) {
startForeground()
isRunning = true
}
return START_STICKY
}
private fun startForeground() {
val notification = createPermanentNotification(applicationContext)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
startForeground(100, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC)
} else {
startForeground(100, notification)
}
isRunning = true
}
override fun onBind(intent: Intent?): IBinder? {
return null
}
override fun onDestroy() {
isRunning = false
super.onDestroy()
}
}
\ No newline at end of file
......@@ -58,8 +58,14 @@ class SearchActivity : BaseActivity<ActivitySearchBinding>() {
override val binding: ActivitySearchBinding by lazy {
ActivitySearchBinding.inflate(layoutInflater)
}
fun closeIm() {
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
if (imm != null && currentFocus != null) {
imm.hideSoftInputFromWindow(currentFocus!!.windowToken, 0)
}
}
private fun searchJump(content: String) {
closeIm()
var link = ""
LinkSearchUtils.handleInput(content, loadUrl = {
link = it
......
......@@ -410,7 +410,6 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
}
}
}
fun closeIm() {
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
if (imm != null && currentFocus != null) {
......
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