mirror of
https://github.com/fankes/ColorOSNotifyIcon.git
synced 2025-09-06 02:35:41 +08:00
增加模块自动检查更新功能
This commit is contained in:
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@@ -3,7 +3,9 @@
|
|||||||
<component name="DesignSurface">
|
<component name="DesignSurface">
|
||||||
<option name="filePathToZoomLevelMap">
|
<option name="filePathToZoomLevelMap">
|
||||||
<map>
|
<map>
|
||||||
|
<entry key="app/src/main/res/drawable-night/bg_orange_round.xml" value="0.232" />
|
||||||
<entry key="app/src/main/res/drawable-v24/ic_launcher_foreground.xml" value="0.254" />
|
<entry key="app/src/main/res/drawable-v24/ic_launcher_foreground.xml" value="0.254" />
|
||||||
|
<entry key="app/src/main/res/drawable/bg_orange_round.xml" value="0.232" />
|
||||||
<entry key="app/src/main/res/layout/activity_config.xml" value="0.4375" />
|
<entry key="app/src/main/res/layout/activity_config.xml" value="0.4375" />
|
||||||
<entry key="app/src/main/res/layout/activity_main.xml" value="0.335" />
|
<entry key="app/src/main/res/layout/activity_main.xml" value="0.335" />
|
||||||
<entry key="app/src/main/res/layout/adapter_config.xml" value="0.4375" />
|
<entry key="app/src/main/res/layout/adapter_config.xml" value="0.4375" />
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
package="com.fankes.coloros.notify">
|
package="com.fankes.coloros.notify">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".application.CNNApplication"
|
android:name=".application.CNNApplication"
|
||||||
|
@@ -44,6 +44,7 @@ import com.fankes.coloros.notify.hook.HookConst.REMOVE_DNDALERT_NOTIFY
|
|||||||
import com.fankes.coloros.notify.param.IconPackParams
|
import com.fankes.coloros.notify.param.IconPackParams
|
||||||
import com.fankes.coloros.notify.ui.activity.base.BaseActivity
|
import com.fankes.coloros.notify.ui.activity.base.BaseActivity
|
||||||
import com.fankes.coloros.notify.utils.factory.*
|
import com.fankes.coloros.notify.utils.factory.*
|
||||||
|
import com.fankes.coloros.notify.utils.tool.GithubReleaseTool
|
||||||
import com.fankes.coloros.notify.utils.tool.SystemUITool
|
import com.fankes.coloros.notify.utils.tool.SystemUITool
|
||||||
import com.highcapable.yukihookapi.hook.factory.isXposedModuleActive
|
import com.highcapable.yukihookapi.hook.factory.isXposedModuleActive
|
||||||
import com.highcapable.yukihookapi.hook.factory.modulePrefs
|
import com.highcapable.yukihookapi.hook.factory.modulePrefs
|
||||||
@@ -57,6 +58,14 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
|
/** 检查更新 */
|
||||||
|
GithubReleaseTool.checkingForUpdate(context = this, moduleVersion) { version, function ->
|
||||||
|
binding.mainTextReleaseVersion.apply {
|
||||||
|
text = "点击更新 $version"
|
||||||
|
isVisible = true
|
||||||
|
setOnClickListener { function() }
|
||||||
|
}
|
||||||
|
}
|
||||||
/** 设置文本 */
|
/** 设置文本 */
|
||||||
binding.mainTextVersion.text = "模块版本:$moduleVersion"
|
binding.mainTextVersion.text = "模块版本:$moduleVersion"
|
||||||
binding.mainTextColorOsVersion.text = "系统版本:$colorOSVersion"
|
binding.mainTextColorOsVersion.text = "系统版本:$colorOSVersion"
|
||||||
@@ -181,9 +190,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
|||||||
/** 重启按钮点击事件 */
|
/** 重启按钮点击事件 */
|
||||||
binding.titleRestartIcon.setOnClickListener { SystemUITool.restartSystemUI(context = this) }
|
binding.titleRestartIcon.setOnClickListener { SystemUITool.restartSystemUI(context = this) }
|
||||||
/** 项目地址按钮点击事件 */
|
/** 项目地址按钮点击事件 */
|
||||||
binding.titleGithubIcon.setOnClickListener {
|
binding.titleGithubIcon.setOnClickListener { openBrowser(url = "https://github.com/fankes/ColorOSNotifyIcon") }
|
||||||
openBrowser(url = "https://github.com/fankes/ColorOSNotifyIcon")
|
|
||||||
}
|
|
||||||
/** 恰饭! */
|
/** 恰饭! */
|
||||||
binding.linkWithFollowMe.setOnClickListener {
|
binding.linkWithFollowMe.setOnClickListener {
|
||||||
openBrowser(url = "https://www.coolapk.com/u/876977", packageName = "com.coolapk.market")
|
openBrowser(url = "https://www.coolapk.com/u/876977", packageName = "com.coolapk.market")
|
||||||
|
@@ -35,11 +35,14 @@ import android.content.res.Configuration
|
|||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
|
import android.net.ConnectivityManager
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import android.provider.Settings
|
||||||
import android.util.Base64
|
import android.util.Base64
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.core.app.NotificationManagerCompat
|
import androidx.core.app.NotificationManagerCompat
|
||||||
|
import androidx.core.content.getSystemService
|
||||||
import com.fankes.coloros.notify.application.CNNApplication.Companion.appContext
|
import com.fankes.coloros.notify.application.CNNApplication.Companion.appContext
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import com.highcapable.yukihookapi.hook.factory.classOf
|
import com.highcapable.yukihookapi.hook.factory.classOf
|
||||||
@@ -149,6 +152,13 @@ val Context.versionCode get() = packageInfo.versionCode
|
|||||||
*/
|
*/
|
||||||
val isNotNoificationEnabled get() = !NotificationManagerCompat.from(appContext).areNotificationsEnabled()
|
val isNotNoificationEnabled get() = !NotificationManagerCompat.from(appContext).areNotificationsEnabled()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 网络连接是否正常
|
||||||
|
* @return [Boolean] 网络是否连接
|
||||||
|
*/
|
||||||
|
val isNetWorkSuccess
|
||||||
|
get() = safeOfFalse { appContext.getSystemService<ConnectivityManager>()?.activeNetworkInfo != null }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dp 转换为 pxInt
|
* dp 转换为 pxInt
|
||||||
* @param context 使用的实例
|
* @param context 使用的实例
|
||||||
@@ -278,6 +288,20 @@ fun Context.openBrowser(url: String, packageName: String = "") = runCatching {
|
|||||||
else snake(msg = "启动系统浏览器失败")
|
else snake(msg = "启动系统浏览器失败")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跳转 APP 自身设置界面
|
||||||
|
* @param packageName 包名
|
||||||
|
*/
|
||||||
|
fun Context.openSelfSetting(packageName: String = appContext.packageName) = runCatching {
|
||||||
|
if (packageName.isInstall)
|
||||||
|
startActivity(Intent().apply {
|
||||||
|
flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
|
action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
|
||||||
|
data = Uri.fromParts("package", packageName, null)
|
||||||
|
})
|
||||||
|
else toast(msg = "你没有安装此应用")
|
||||||
|
}.onFailure { toast(msg = "启动 $packageName 应用信息失败") }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 复制到剪贴板
|
* 复制到剪贴板
|
||||||
* @param content 要复制的文本
|
* @param content 要复制的文本
|
||||||
|
@@ -0,0 +1,128 @@
|
|||||||
|
/*
|
||||||
|
* ColorOSNotifyIcon - Optimize notification icons for ColorOS and adapt to native notification icon specifications.
|
||||||
|
* Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
|
||||||
|
* https://github.com/fankes/ColorOSNotifyIcon
|
||||||
|
*
|
||||||
|
* This software is non-free but opensource software: you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Affero General Public License
|
||||||
|
* as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
* <p>
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* and eula along with this software. If not, see
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2022/3/20.
|
||||||
|
*/
|
||||||
|
package com.fankes.coloros.notify.utils.tool
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.Context
|
||||||
|
import com.fankes.coloros.notify.utils.factory.*
|
||||||
|
import okhttp3.*
|
||||||
|
import org.json.JSONObject
|
||||||
|
import java.io.IOException
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 Github Release 最新版本工具类
|
||||||
|
*/
|
||||||
|
object GithubReleaseTool {
|
||||||
|
|
||||||
|
/** 仓库作者 */
|
||||||
|
private const val repoAuthor = "fankes"
|
||||||
|
|
||||||
|
/** 仓库名称 */
|
||||||
|
private const val repoName = "ColorOSNotifyIcon"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取最新版本信息
|
||||||
|
* @param context 实例
|
||||||
|
* @param version 当前版本
|
||||||
|
* @param it 成功后回调 - ([String] 最新版本,[Function] 更新对话框方法体)
|
||||||
|
*/
|
||||||
|
fun checkingForUpdate(context: Context, version: String, it: (String, () -> Unit) -> Unit) = checkingInternetConnect(context) {
|
||||||
|
OkHttpClient().newBuilder().build().newCall(
|
||||||
|
Request.Builder()
|
||||||
|
.url("https://api.github.com/repos/$repoAuthor/$repoName/releases/latest")
|
||||||
|
.get()
|
||||||
|
.build()
|
||||||
|
).enqueue(object : Callback {
|
||||||
|
override fun onFailure(call: Call, e: IOException) {}
|
||||||
|
|
||||||
|
override fun onResponse(call: Call, response: Response) = runInSafe {
|
||||||
|
JSONObject(response.body?.string() ?: "").apply {
|
||||||
|
GithubReleaseBean(
|
||||||
|
name = getString("name"),
|
||||||
|
htmlUrl = getString("html_url"),
|
||||||
|
content = getString("body"),
|
||||||
|
date = getString("published_at").replace(oldValue = "T", newValue = " ").replace(oldValue = "Z", newValue = "")
|
||||||
|
).apply {
|
||||||
|
fun showUpdate() = context.showDialog {
|
||||||
|
title = "最新版本 $name"
|
||||||
|
msg = "发布于 $date\n\n" +
|
||||||
|
"更新日志\n\n" + content
|
||||||
|
confirmButton(text = "更新") { context.openBrowser(htmlUrl) }
|
||||||
|
cancelButton()
|
||||||
|
}
|
||||||
|
if (name != version) (context as? Activity?)?.runOnUiThread {
|
||||||
|
showUpdate()
|
||||||
|
it(name) { showUpdate() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查网络连接情况
|
||||||
|
* @param context 实例
|
||||||
|
* @param it 已连接回调
|
||||||
|
*/
|
||||||
|
private fun checkingInternetConnect(context: Context, it: () -> Unit) = runInSafe {
|
||||||
|
if (isNetWorkSuccess)
|
||||||
|
OkHttpClient().newBuilder().build().newCall(
|
||||||
|
Request.Builder()
|
||||||
|
.url("https://www.baidu.com")
|
||||||
|
.get()
|
||||||
|
.build()
|
||||||
|
).enqueue(object : Callback {
|
||||||
|
override fun onFailure(call: Call, e: IOException) {
|
||||||
|
(context as? Activity?)?.runOnUiThread {
|
||||||
|
context.showDialog {
|
||||||
|
title = "网络连接失败"
|
||||||
|
msg = "模块的联网权限可能已被禁用,请开启联网权限以定期检查更新。"
|
||||||
|
confirmButton(text = "去开启") { context.openSelfSetting() }
|
||||||
|
cancelButton()
|
||||||
|
noCancelable()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResponse(call: Call, response: Response) = runInSafe {
|
||||||
|
(context as? Activity?)?.runOnUiThread { runInSafe { it() } }
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Github Release bean
|
||||||
|
* @param name 版本名称
|
||||||
|
* @param htmlUrl 网页地址
|
||||||
|
* @param content 更新日志
|
||||||
|
* @param date 发布时间
|
||||||
|
*/
|
||||||
|
private data class GithubReleaseBean(
|
||||||
|
var name: String,
|
||||||
|
var htmlUrl: String,
|
||||||
|
var content: String,
|
||||||
|
var date: String
|
||||||
|
) : Serializable
|
||||||
|
}
|
6
app/src/main/res/drawable/bg_orange_round.xml
Executable file
6
app/src/main/res/drawable/bg_orange_round.xml
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<solid android:color="#FF7043" />
|
||||||
|
<corners android:radius="15dp" />
|
||||||
|
</shape>
|
@@ -91,15 +91,37 @@
|
|||||||
android:textColor="@color/white"
|
android:textColor="@color/white"
|
||||||
android:textSize="18sp" />
|
android:textSize="18sp" />
|
||||||
|
|
||||||
<TextView
|
<LinearLayout
|
||||||
android:id="@+id/main_text_version"
|
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="5dp"
|
android:layout_marginBottom="5dp"
|
||||||
android:alpha="0.8"
|
android:gravity="center|start"
|
||||||
android:text="模块版本:%1"
|
android:orientation="horizontal">
|
||||||
android:textColor="@color/white"
|
|
||||||
android:textSize="13sp" />
|
<TextView
|
||||||
|
android:id="@+id/main_text_version"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:alpha="0.8"
|
||||||
|
android:text="模块版本:%1"
|
||||||
|
android:textColor="@color/white"
|
||||||
|
android:textSize="13sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/main_text_release_version"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
android:background="@drawable/bg_orange_round"
|
||||||
|
android:paddingLeft="5dp"
|
||||||
|
android:paddingTop="2dp"
|
||||||
|
android:paddingRight="5dp"
|
||||||
|
android:paddingBottom="2dp"
|
||||||
|
android:text="点击更新 %1"
|
||||||
|
android:textColor="@color/white"
|
||||||
|
android:textSize="11sp"
|
||||||
|
android:visibility="gone" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/main_text_color_os_version"
|
android:id="@+id/main_text_color_os_version"
|
||||||
|
Reference in New Issue
Block a user