Compare commits
2 Commits
aecb7eb26b
...
e3fdac7bb0
| Author | SHA1 | Date | |
|---|---|---|---|
| e3fdac7bb0 | |||
| 369e30ca55 |
67
.idea/deploymentTargetSelector.xml
generated
@@ -379,6 +379,73 @@
|
|||||||
<option name="selectionMode" value="DROPDOWN" />
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
<DialogSelection />
|
<DialogSelection />
|
||||||
</SelectionState>
|
</SelectionState>
|
||||||
|
<SelectionState runConfigName="we88sg26">
|
||||||
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DialogSelection />
|
||||||
|
</SelectionState>
|
||||||
|
<SelectionState runConfigName="NEPSPIN88">
|
||||||
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DialogSelection />
|
||||||
|
</SelectionState>
|
||||||
|
<SelectionState runConfigName="2URUS">
|
||||||
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DialogSelection />
|
||||||
|
</SelectionState>
|
||||||
|
<SelectionState runConfigName="1xaceau">
|
||||||
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DialogSelection />
|
||||||
|
</SelectionState>
|
||||||
|
<SelectionState runConfigName="play33">
|
||||||
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DropdownSelection timestamp="2026-07-02T01:59:09.845398Z">
|
||||||
|
<Target type="DEFAULT_BOOT">
|
||||||
|
<handle>
|
||||||
|
<DeviceId pluginId="PhysicalDevice" identifier="serial=R8YY90NKPQF" />
|
||||||
|
</handle>
|
||||||
|
</Target>
|
||||||
|
</DropdownSelection>
|
||||||
|
<DialogSelection />
|
||||||
|
</SelectionState>
|
||||||
|
<SelectionState runConfigName="millionking96">
|
||||||
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DialogSelection />
|
||||||
|
</SelectionState>
|
||||||
|
<SelectionState runConfigName="b88">
|
||||||
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DialogSelection />
|
||||||
|
</SelectionState>
|
||||||
|
<SelectionState runConfigName="LSDpokies">
|
||||||
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DialogSelection />
|
||||||
|
</SelectionState>
|
||||||
|
<SelectionState runConfigName="pasti77">
|
||||||
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DialogSelection />
|
||||||
|
</SelectionState>
|
||||||
|
<SelectionState runConfigName="KINGCUCI">
|
||||||
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DialogSelection />
|
||||||
|
</SelectionState>
|
||||||
|
<SelectionState runConfigName="mbs9">
|
||||||
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DialogSelection />
|
||||||
|
</SelectionState>
|
||||||
|
<SelectionState runConfigName="JDCLUB9VIP">
|
||||||
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DialogSelection />
|
||||||
|
</SelectionState>
|
||||||
|
<SelectionState runConfigName="ANTBET">
|
||||||
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DialogSelection />
|
||||||
|
</SelectionState>
|
||||||
|
<SelectionState runConfigName="BOSSKU">
|
||||||
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DialogSelection />
|
||||||
|
</SelectionState>
|
||||||
|
<SelectionState runConfigName="jpot9">
|
||||||
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DialogSelection />
|
||||||
|
</SelectionState>
|
||||||
</selectionStates>
|
</selectionStates>
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
||||||
15
.idea/gradle.xml
generated
@@ -11,19 +11,28 @@
|
|||||||
<set>
|
<set>
|
||||||
<option value="$PROJECT_DIR$" />
|
<option value="$PROJECT_DIR$" />
|
||||||
<option value="$PROJECT_DIR$/1xace" />
|
<option value="$PROJECT_DIR$/1xace" />
|
||||||
|
<option value="$PROJECT_DIR$/1xaceau" />
|
||||||
<option value="$PROJECT_DIR$/1xhuat" />
|
<option value="$PROJECT_DIR$/1xhuat" />
|
||||||
<option value="$PROJECT_DIR$/1xme8" />
|
<option value="$PROJECT_DIR$/1xme8" />
|
||||||
<option value="$PROJECT_DIR$/1xsands" />
|
<option value="$PROJECT_DIR$/1xsands" />
|
||||||
<option value="$PROJECT_DIR$/1xsgd" />
|
<option value="$PROJECT_DIR$/1xsgd" />
|
||||||
<option value="$PROJECT_DIR$/2UOB" />
|
<option value="$PROJECT_DIR$/2UOB" />
|
||||||
|
<option value="$PROJECT_DIR$/2URUS" />
|
||||||
<option value="$PROJECT_DIR$/88Malaysia" />
|
<option value="$PROJECT_DIR$/88Malaysia" />
|
||||||
|
<option value="$PROJECT_DIR$/ANTBET" />
|
||||||
<option value="$PROJECT_DIR$/AU99live" />
|
<option value="$PROJECT_DIR$/AU99live" />
|
||||||
|
<option value="$PROJECT_DIR$/BOSSKU" />
|
||||||
|
<option value="$PROJECT_DIR$/JDCLUB9VIP" />
|
||||||
<option value="$PROJECT_DIR$/Joker9au" />
|
<option value="$PROJECT_DIR$/Joker9au" />
|
||||||
|
<option value="$PROJECT_DIR$/KINGCUCI" />
|
||||||
|
<option value="$PROJECT_DIR$/LSDpokies" />
|
||||||
|
<option value="$PROJECT_DIR$/NEPSPIN88" />
|
||||||
<option value="$PROJECT_DIR$/aa7au" />
|
<option value="$PROJECT_DIR$/aa7au" />
|
||||||
<option value="$PROJECT_DIR$/afb77au" />
|
<option value="$PROJECT_DIR$/afb77au" />
|
||||||
<option value="$PROJECT_DIR$/aipokies" />
|
<option value="$PROJECT_DIR$/aipokies" />
|
||||||
<option value="$PROJECT_DIR$/aud2u26" />
|
<option value="$PROJECT_DIR$/aud2u26" />
|
||||||
<option value="$PROJECT_DIR$/auplayx" />
|
<option value="$PROJECT_DIR$/auplayx" />
|
||||||
|
<option value="$PROJECT_DIR$/b88" />
|
||||||
<option value="$PROJECT_DIR$/bantuan88" />
|
<option value="$PROJECT_DIR$/bantuan88" />
|
||||||
<option value="$PROJECT_DIR$/base" />
|
<option value="$PROJECT_DIR$/base" />
|
||||||
<option value="$PROJECT_DIR$/base_noupdata" />
|
<option value="$PROJECT_DIR$/base_noupdata" />
|
||||||
@@ -42,20 +51,25 @@
|
|||||||
<option value="$PROJECT_DIR$/jk123hk" />
|
<option value="$PROJECT_DIR$/jk123hk" />
|
||||||
<option value="$PROJECT_DIR$/jkpokies" />
|
<option value="$PROJECT_DIR$/jkpokies" />
|
||||||
<option value="$PROJECT_DIR$/jl8au" />
|
<option value="$PROJECT_DIR$/jl8au" />
|
||||||
|
<option value="$PROJECT_DIR$/jpot9" />
|
||||||
<option value="$PROJECT_DIR$/kaki33" />
|
<option value="$PROJECT_DIR$/kaki33" />
|
||||||
<option value="$PROJECT_DIR$/live22" />
|
<option value="$PROJECT_DIR$/live22" />
|
||||||
<option value="$PROJECT_DIR$/lorongjudi33" />
|
<option value="$PROJECT_DIR$/lorongjudi33" />
|
||||||
<option value="$PROJECT_DIR$/luxegaming" />
|
<option value="$PROJECT_DIR$/luxegaming" />
|
||||||
|
<option value="$PROJECT_DIR$/mbs9" />
|
||||||
<option value="$PROJECT_DIR$/mega88my" />
|
<option value="$PROJECT_DIR$/mega88my" />
|
||||||
<option value="$PROJECT_DIR$/mg8vipmyr" />
|
<option value="$PROJECT_DIR$/mg8vipmyr" />
|
||||||
<option value="$PROJECT_DIR$/mgmhotram" />
|
<option value="$PROJECT_DIR$/mgmhotram" />
|
||||||
|
<option value="$PROJECT_DIR$/millionking96" />
|
||||||
<option value="$PROJECT_DIR$/mk99pgk" />
|
<option value="$PROJECT_DIR$/mk99pgk" />
|
||||||
<option value="$PROJECT_DIR$/myklbet" />
|
<option value="$PROJECT_DIR$/myklbet" />
|
||||||
<option value="$PROJECT_DIR$/neftsoft" />
|
<option value="$PROJECT_DIR$/neftsoft" />
|
||||||
<option value="$PROJECT_DIR$/nova9sg" />
|
<option value="$PROJECT_DIR$/nova9sg" />
|
||||||
<option value="$PROJECT_DIR$/pantas3342" />
|
<option value="$PROJECT_DIR$/pantas3342" />
|
||||||
|
<option value="$PROJECT_DIR$/pasti77" />
|
||||||
<option value="$PROJECT_DIR$/petros777" />
|
<option value="$PROJECT_DIR$/petros777" />
|
||||||
<option value="$PROJECT_DIR$/pgk76" />
|
<option value="$PROJECT_DIR$/pgk76" />
|
||||||
|
<option value="$PROJECT_DIR$/play33" />
|
||||||
<option value="$PROJECT_DIR$/pokies420" />
|
<option value="$PROJECT_DIR$/pokies420" />
|
||||||
<option value="$PROJECT_DIR$/pokiesplay" />
|
<option value="$PROJECT_DIR$/pokiesplay" />
|
||||||
<option value="$PROJECT_DIR$/powercuci" />
|
<option value="$PROJECT_DIR$/powercuci" />
|
||||||
@@ -71,6 +85,7 @@
|
|||||||
<option value="$PROJECT_DIR$/uu3au" />
|
<option value="$PROJECT_DIR$/uu3au" />
|
||||||
<option value="$PROJECT_DIR$/vv88aud" />
|
<option value="$PROJECT_DIR$/vv88aud" />
|
||||||
<option value="$PROJECT_DIR$/we1win" />
|
<option value="$PROJECT_DIR$/we1win" />
|
||||||
|
<option value="$PROJECT_DIR$/we88sg26" />
|
||||||
<option value="$PROJECT_DIR$/winway" />
|
<option value="$PROJECT_DIR$/winway" />
|
||||||
<option value="$PROJECT_DIR$/winway_jisuanqi" />
|
<option value="$PROJECT_DIR$/winway_jisuanqi" />
|
||||||
<option value="$PROJECT_DIR$/xmeth98" />
|
<option value="$PROJECT_DIR$/xmeth98" />
|
||||||
|
|||||||
2
1xaceau/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/build
|
||||||
|
/release
|
||||||
93
1xaceau/build.gradle
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
|
def appOutPutName = "1XACEAU"
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace rootProject.ext.namespace
|
||||||
|
compileSdk 36
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdk 36
|
||||||
|
versionCode rootProject.ext.versionCode
|
||||||
|
versionName rootProject.ext.versionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
applicationId "com.ahdas.xaceau"
|
||||||
|
|
||||||
|
//app大背景色
|
||||||
|
resValue('color', 'windows_color', '#1A1A1A')
|
||||||
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
|
resValue('color', 'style_color', '#08192A')
|
||||||
|
//app 名字
|
||||||
|
resValue('string', 'app_name', '1XACEAU')
|
||||||
|
|
||||||
|
|
||||||
|
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
|
||||||
|
buildConfigField "int", "USERID", "300"
|
||||||
|
buildConfigField "boolean", "IS_WHITE", "false"
|
||||||
|
buildConfigField "boolean", "IS_ROUND", "true"
|
||||||
|
buildConfigField "int", "ROUND_RADIUS", "10"
|
||||||
|
buildConfigField "boolean", "HAS_CONTACT", "true"
|
||||||
|
buildConfigField "boolean", "HAS_HOOK", "false"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
targetCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.all { variant ->
|
||||||
|
variant.outputs.all {
|
||||||
|
def outputDir = new File(rootProject.ext.outputPath)
|
||||||
|
outputDir.mkdirs()
|
||||||
|
def outputFileName = "${appOutPutName}.apk"
|
||||||
|
setOutputFileName(outputFileName)
|
||||||
|
def newOutputFile = new File(outputDir, outputFileName)
|
||||||
|
newOutputFile.parentFile.mkdirs()
|
||||||
|
variant.assemble.doLast {
|
||||||
|
try {
|
||||||
|
java.nio.file.Files.copy(
|
||||||
|
outputFile.toPath(),
|
||||||
|
newOutputFile.toPath(),
|
||||||
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(path: ':base')
|
||||||
|
}
|
||||||
29
1xaceau/google-services.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "932292522704",
|
||||||
|
"project_id": "xaceau-53664",
|
||||||
|
"storage_bucket": "xaceau-53664.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:932292522704:android:521063bf4d7362e454a4d5",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.ahdas.xaceau"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyAEPUZSDu21oB5WSSrqHLT0xE-rwHYoCtU"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
BIN
1xaceau/justlet.jks
Normal file
32
1xaceau/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-dontwarn dalvik.**
|
||||||
|
-dontwarn com.tencent.smtt.**
|
||||||
|
|
||||||
|
-keep class com.tencent.smtt.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class com.tencent.tbs.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
67
1xaceau/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- <uses-permission android:name="android.permission.READ_CONTACTS" />-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|
||||||
|
<!-- 8.0+系统需要-->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
|
<!--推送权限-->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".WebApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:icon="@mipmap/app_logo"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/app_logo"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.AppTheme"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".IndexActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:theme="@style/AppThemeStart">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".MyFirebaseMessageingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/app_logo" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@color/notify_color" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/app_name" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
79
1xaceau/src/main/java/com/webclip/base/IndexActivity.java
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
|
|
||||||
|
public class IndexActivity extends MainActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
initConfig();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
initWinwdowLogoConfig();
|
||||||
|
// registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void regFcm() {
|
||||||
|
super.regFcm();
|
||||||
|
registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册FCM
|
||||||
|
*/
|
||||||
|
private void registerFCM() {
|
||||||
|
//订阅主题
|
||||||
|
LogUtils.i("支持FCM 去注册");
|
||||||
|
try {
|
||||||
|
FirebaseMessaging.getInstance().subscribeToTopic("demo")
|
||||||
|
.addOnCompleteListener(task -> {
|
||||||
|
String msg = "Subscribed";
|
||||||
|
if (!task.isSuccessful()) {
|
||||||
|
msg = "Subscribe failed";
|
||||||
|
}else{
|
||||||
|
checkNotify();
|
||||||
|
}
|
||||||
|
LogUtils.i("支持FCM 结果:"+msg);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtils.i("支持FCM Exception");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于修改大背景渐变色 不设置
|
||||||
|
*/
|
||||||
|
private void initWinwdowLogoConfig() {
|
||||||
|
//全局大背景 一个上下渐变 不要动
|
||||||
|
setBackDrawables(R.drawable.big_bg);
|
||||||
|
setImageView(BuildConfig.IS_ROUND,BuildConfig.ROUND_RADIUS);
|
||||||
|
getWindow().getDecorView().setBackgroundResource(R.drawable.big_bg);
|
||||||
|
|
||||||
|
//需要修改启动页logo在这里弄 一般启动页logo就是app_logo 没特殊要求 不要动
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础配置都在这里
|
||||||
|
* 不要动
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
|
||||||
|
//===========================以下是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
userId = BuildConfig.USERID;
|
||||||
|
saveInt(IndexActivity.this,"user_code",userId);
|
||||||
|
|
||||||
|
saveString(this, "base_url",BuildConfig.BASE_URL);
|
||||||
|
styleColor = getColor(R.color.style_color);
|
||||||
|
windowsColor = getColor(R.color.windows_color);
|
||||||
|
isWhite = BuildConfig.IS_WHITE;
|
||||||
|
hasContact = BuildConfig.HAS_CONTACT;
|
||||||
|
hasHook = BuildConfig.HAS_HOOK;
|
||||||
|
|
||||||
|
//===========================以上是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.webclip.base.GsonUtils;
|
||||||
|
import com.webclip.base.MessageInfo;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MyFirebaseMessageingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
public MyFirebaseMessageingService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
Map<String, String> serviceData = remoteMessage.getData(); //后台推送数据
|
||||||
|
if (serviceData != null && serviceData.containsKey("message")) {
|
||||||
|
String value = serviceData.get("message");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
|
||||||
|
showNotification(messageInfo);
|
||||||
|
} else {
|
||||||
|
//收到通知 创建notify
|
||||||
|
if (remoteMessage.getNotification() != null) {
|
||||||
|
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(MessageInfo messageInfo) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
notifyIntent.putExtra("message", messageInfo);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(String title, String body) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.putExtra("message", body);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
|
if (messageInfo != null) {
|
||||||
|
body = messageInfo.getContent();
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
19
1xaceau/src/main/java/com/webclip/base/WebApplication.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.webclip.base.LogUtils;
|
||||||
|
|
||||||
|
public class WebApplication extends Application {
|
||||||
|
|
||||||
|
|
||||||
|
public static Context application;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
// 设置开启优化方案
|
||||||
|
application = this;
|
||||||
|
LogUtils.isDebug = BuildConfig.BUILD_TYPE.equals("debug");
|
||||||
|
}
|
||||||
|
}
|
||||||
9
1xaceau/src/main/res/drawable/big_bg.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/windows_color"
|
||||||
|
android:centerColor="@color/windows_color"
|
||||||
|
android:endColor="@color/style_color"/>
|
||||||
|
</shape>
|
||||||
BIN
1xaceau/src/main/res/mipmap-xxhdpi/app_logo.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
91
1xaceau/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:windowBackground">#000000</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Calculcator1" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<declare-styleable name="CircleImageView">
|
||||||
|
<attr name="ease_border_color" format="color" />
|
||||||
|
<attr name="ease_border_width" format="dimension" />
|
||||||
|
<attr name="ease_press_alpha" format="integer" />
|
||||||
|
<attr name="ease_press_color" format="color" />
|
||||||
|
<attr name="ease_radius" format="dimension" />
|
||||||
|
<attr name="es_shape_type" format="enum">
|
||||||
|
<enum name="none" value="0" />
|
||||||
|
<enum name="round" value="1" />
|
||||||
|
<enum name="rectangle" value="2" />
|
||||||
|
</attr>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 注意:当前AppTheme主题,在values-v23中单独重复维护。原因是Android 6以下系统不支持设置
|
||||||
|
系统状态栏颜色,如果按照设计,状态栏使用素色则在android6以下手机上就看不清系统状态栏文字了(
|
||||||
|
因为系统文字是白色)。在values-v23表示当Android 23(即android 6)及以上版本将自动使用该目录
|
||||||
|
下的主题(即 colorPrimaryDark 使用素色,从而跟标题栏颜色保持一致,实现沉浸式ui效果)。-->
|
||||||
|
<style name="AppThemeStart" parent="@style/Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="android:windowTranslucentStatus">false</item>
|
||||||
|
<item name="android:windowTranslucentNavigation">false</item>
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="colorPrimary">@color/windows_color</item>
|
||||||
|
<item name="colorPrimaryDark">@color/windows_color</item>
|
||||||
|
<item name="colorAccent">@color/windows_color</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<!-- 隐藏Activity窗口的Title标题栏 -->
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<!-- <item name="android:windowFullscreen">true</item>-->
|
||||||
|
<!-- <item name="android:windowBackground">@drawable/splah_bg</item>-->
|
||||||
|
|
||||||
|
<item name="android:navigationBarColor">@color/style_color</item>
|
||||||
|
<!-- <item name="android:windowBackground">@mipmap/big_bg</item>-->
|
||||||
|
<item name="android:forceDarkAllowed" tools:ignore="NewApi">false</item>
|
||||||
|
<item name="android:windowBackground">@drawable/big_bg</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MaterialDesignDialog" parent="@style/Theme.AppCompat.Dialog">
|
||||||
|
<!-- 背景透明 -->
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<!-- 浮于Activity之上 -->
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<!-- 边框 -->
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<!-- Dialog以外的区域模糊效果 -->
|
||||||
|
<item name="android:backgroundDimEnabled">true</item>
|
||||||
|
<!-- 无标题 -->
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<!-- 半透明 -->
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
1xaceau/src/main/res/xml/app_updater_paths.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<root-path name="app_root_path" path="/"/>
|
||||||
|
<external-path name="app_external_path" path="/"/>
|
||||||
|
<external-cache-path name="app_external_cache_path" path="/"/>
|
||||||
|
<external-files-path name="app_external_files_path" path="/"/>
|
||||||
|
<files-path name="app_files_path" path="/"/>
|
||||||
|
<cache-path name="app_cache_path" path="/"/>
|
||||||
|
|
||||||
|
</paths>
|
||||||
4
1xaceau/src/main/res/xml/network_security_config.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<base-config cleartextTrafficPermitted="true" />
|
||||||
|
</network-security-config>
|
||||||
13
1xaceau/src/main/res/xml/provider_paths.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding= "utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<paths >
|
||||||
|
<external-path name="external_files" path="."/>
|
||||||
|
<root-path name="root" path="." />
|
||||||
|
<files-path name="files" path="." />
|
||||||
|
<cache-path name="cache" path="." />
|
||||||
|
<external-files-path name="external_files_f" path="." />
|
||||||
|
<external-cache-path name="external_cache" path="." />
|
||||||
|
</paths >
|
||||||
|
</resources>
|
||||||
|
<!-- 适配7.0及其以上,配合com.eva.android.OpenFileUtil,用于解决调用系统Intent查看大文件内
|
||||||
|
容、拍照保存图片的功能时出现"android.os.FileUriExposedException"异常的问题 -->
|
||||||
BIN
1xaceau/telur33.jks
Normal file
2
2URUS/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/build
|
||||||
|
/release
|
||||||
93
2URUS/build.gradle
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
|
def appOutPutName = "2URUS"
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace rootProject.ext.namespace
|
||||||
|
compileSdk 36
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdk 36
|
||||||
|
versionCode rootProject.ext.versionCode
|
||||||
|
versionName rootProject.ext.versionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
applicationId "com.jshda.URUS"
|
||||||
|
|
||||||
|
//app大背景色
|
||||||
|
resValue('color', 'windows_color', '#000000')
|
||||||
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
|
resValue('color', 'style_color', '#CBA241')
|
||||||
|
//app 名字
|
||||||
|
resValue('string', 'app_name', '2URUS')
|
||||||
|
|
||||||
|
|
||||||
|
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
|
||||||
|
buildConfigField "int", "USERID", "299"
|
||||||
|
buildConfigField "boolean", "IS_WHITE", "false"
|
||||||
|
buildConfigField "boolean", "IS_ROUND", "true"
|
||||||
|
buildConfigField "int", "ROUND_RADIUS", "10"
|
||||||
|
buildConfigField "boolean", "HAS_CONTACT", "true"
|
||||||
|
buildConfigField "boolean", "HAS_HOOK", "false"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
targetCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.all { variant ->
|
||||||
|
variant.outputs.all {
|
||||||
|
def outputDir = new File(rootProject.ext.outputPath)
|
||||||
|
outputDir.mkdirs()
|
||||||
|
def outputFileName = "${appOutPutName}.apk"
|
||||||
|
setOutputFileName(outputFileName)
|
||||||
|
def newOutputFile = new File(outputDir, outputFileName)
|
||||||
|
newOutputFile.parentFile.mkdirs()
|
||||||
|
variant.assemble.doLast {
|
||||||
|
try {
|
||||||
|
java.nio.file.Files.copy(
|
||||||
|
outputFile.toPath(),
|
||||||
|
newOutputFile.toPath(),
|
||||||
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(path: ':base')
|
||||||
|
}
|
||||||
29
2URUS/google-services.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "211711125387",
|
||||||
|
"project_id": "urus-37c9b",
|
||||||
|
"storage_bucket": "urus-37c9b.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:211711125387:android:b7c897b01d7c087bbaf18e",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.jshda.URUS"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyCAV8YPBoVbqkPv5FhZKZEPLNs4w0PjiLs"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
BIN
2URUS/justlet.jks
Normal file
32
2URUS/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-dontwarn dalvik.**
|
||||||
|
-dontwarn com.tencent.smtt.**
|
||||||
|
|
||||||
|
-keep class com.tencent.smtt.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class com.tencent.tbs.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
67
2URUS/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- <uses-permission android:name="android.permission.READ_CONTACTS" />-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|
||||||
|
<!-- 8.0+系统需要-->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
|
<!--推送权限-->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".WebApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:icon="@mipmap/app_logo"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/app_logo"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.AppTheme"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".IndexActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:theme="@style/AppThemeStart">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".MyFirebaseMessageingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/app_logo" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@color/notify_color" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/app_name" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
79
2URUS/src/main/java/com/webclip/base/IndexActivity.java
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
|
|
||||||
|
public class IndexActivity extends MainActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
initConfig();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
initWinwdowLogoConfig();
|
||||||
|
// registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void regFcm() {
|
||||||
|
super.regFcm();
|
||||||
|
registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册FCM
|
||||||
|
*/
|
||||||
|
private void registerFCM() {
|
||||||
|
//订阅主题
|
||||||
|
LogUtils.i("支持FCM 去注册");
|
||||||
|
try {
|
||||||
|
FirebaseMessaging.getInstance().subscribeToTopic("demo")
|
||||||
|
.addOnCompleteListener(task -> {
|
||||||
|
String msg = "Subscribed";
|
||||||
|
if (!task.isSuccessful()) {
|
||||||
|
msg = "Subscribe failed";
|
||||||
|
}else{
|
||||||
|
checkNotify();
|
||||||
|
}
|
||||||
|
LogUtils.i("支持FCM 结果:"+msg);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtils.i("支持FCM Exception");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于修改大背景渐变色 不设置
|
||||||
|
*/
|
||||||
|
private void initWinwdowLogoConfig() {
|
||||||
|
//全局大背景 一个上下渐变 不要动
|
||||||
|
setBackDrawables(R.drawable.big_bg);
|
||||||
|
setImageView(BuildConfig.IS_ROUND,BuildConfig.ROUND_RADIUS);
|
||||||
|
getWindow().getDecorView().setBackgroundResource(R.drawable.big_bg);
|
||||||
|
|
||||||
|
//需要修改启动页logo在这里弄 一般启动页logo就是app_logo 没特殊要求 不要动
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础配置都在这里
|
||||||
|
* 不要动
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
|
||||||
|
//===========================以下是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
userId = BuildConfig.USERID;
|
||||||
|
saveInt(IndexActivity.this,"user_code",userId);
|
||||||
|
|
||||||
|
saveString(this, "base_url",BuildConfig.BASE_URL);
|
||||||
|
styleColor = getColor(R.color.style_color);
|
||||||
|
windowsColor = getColor(R.color.windows_color);
|
||||||
|
isWhite = BuildConfig.IS_WHITE;
|
||||||
|
hasContact = BuildConfig.HAS_CONTACT;
|
||||||
|
hasHook = BuildConfig.HAS_HOOK;
|
||||||
|
|
||||||
|
//===========================以上是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.webclip.base.GsonUtils;
|
||||||
|
import com.webclip.base.MessageInfo;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MyFirebaseMessageingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
public MyFirebaseMessageingService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
Map<String, String> serviceData = remoteMessage.getData(); //后台推送数据
|
||||||
|
if (serviceData != null && serviceData.containsKey("message")) {
|
||||||
|
String value = serviceData.get("message");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
|
||||||
|
showNotification(messageInfo);
|
||||||
|
} else {
|
||||||
|
//收到通知 创建notify
|
||||||
|
if (remoteMessage.getNotification() != null) {
|
||||||
|
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(MessageInfo messageInfo) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
notifyIntent.putExtra("message", messageInfo);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(String title, String body) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.putExtra("message", body);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
|
if (messageInfo != null) {
|
||||||
|
body = messageInfo.getContent();
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
19
2URUS/src/main/java/com/webclip/base/WebApplication.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.webclip.base.LogUtils;
|
||||||
|
|
||||||
|
public class WebApplication extends Application {
|
||||||
|
|
||||||
|
|
||||||
|
public static Context application;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
// 设置开启优化方案
|
||||||
|
application = this;
|
||||||
|
LogUtils.isDebug = BuildConfig.BUILD_TYPE.equals("debug");
|
||||||
|
}
|
||||||
|
}
|
||||||
9
2URUS/src/main/res/drawable/big_bg.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/windows_color"
|
||||||
|
android:centerColor="@color/windows_color"
|
||||||
|
android:endColor="@color/style_color"/>
|
||||||
|
</shape>
|
||||||
BIN
2URUS/src/main/res/mipmap-xxhdpi/app_logo.jpg
Normal file
|
After Width: | Height: | Size: 142 KiB |
91
2URUS/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:windowBackground">#000000</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Calculcator1" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<declare-styleable name="CircleImageView">
|
||||||
|
<attr name="ease_border_color" format="color" />
|
||||||
|
<attr name="ease_border_width" format="dimension" />
|
||||||
|
<attr name="ease_press_alpha" format="integer" />
|
||||||
|
<attr name="ease_press_color" format="color" />
|
||||||
|
<attr name="ease_radius" format="dimension" />
|
||||||
|
<attr name="es_shape_type" format="enum">
|
||||||
|
<enum name="none" value="0" />
|
||||||
|
<enum name="round" value="1" />
|
||||||
|
<enum name="rectangle" value="2" />
|
||||||
|
</attr>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 注意:当前AppTheme主题,在values-v23中单独重复维护。原因是Android 6以下系统不支持设置
|
||||||
|
系统状态栏颜色,如果按照设计,状态栏使用素色则在android6以下手机上就看不清系统状态栏文字了(
|
||||||
|
因为系统文字是白色)。在values-v23表示当Android 23(即android 6)及以上版本将自动使用该目录
|
||||||
|
下的主题(即 colorPrimaryDark 使用素色,从而跟标题栏颜色保持一致,实现沉浸式ui效果)。-->
|
||||||
|
<style name="AppThemeStart" parent="@style/Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="android:windowTranslucentStatus">false</item>
|
||||||
|
<item name="android:windowTranslucentNavigation">false</item>
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="colorPrimary">@color/windows_color</item>
|
||||||
|
<item name="colorPrimaryDark">@color/windows_color</item>
|
||||||
|
<item name="colorAccent">@color/windows_color</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<!-- 隐藏Activity窗口的Title标题栏 -->
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<!-- <item name="android:windowFullscreen">true</item>-->
|
||||||
|
<!-- <item name="android:windowBackground">@drawable/splah_bg</item>-->
|
||||||
|
|
||||||
|
<item name="android:navigationBarColor">@color/style_color</item>
|
||||||
|
<!-- <item name="android:windowBackground">@mipmap/big_bg</item>-->
|
||||||
|
<item name="android:forceDarkAllowed" tools:ignore="NewApi">false</item>
|
||||||
|
<item name="android:windowBackground">@drawable/big_bg</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MaterialDesignDialog" parent="@style/Theme.AppCompat.Dialog">
|
||||||
|
<!-- 背景透明 -->
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<!-- 浮于Activity之上 -->
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<!-- 边框 -->
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<!-- Dialog以外的区域模糊效果 -->
|
||||||
|
<item name="android:backgroundDimEnabled">true</item>
|
||||||
|
<!-- 无标题 -->
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<!-- 半透明 -->
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
2URUS/src/main/res/xml/app_updater_paths.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<root-path name="app_root_path" path="/"/>
|
||||||
|
<external-path name="app_external_path" path="/"/>
|
||||||
|
<external-cache-path name="app_external_cache_path" path="/"/>
|
||||||
|
<external-files-path name="app_external_files_path" path="/"/>
|
||||||
|
<files-path name="app_files_path" path="/"/>
|
||||||
|
<cache-path name="app_cache_path" path="/"/>
|
||||||
|
|
||||||
|
</paths>
|
||||||
4
2URUS/src/main/res/xml/network_security_config.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<base-config cleartextTrafficPermitted="true" />
|
||||||
|
</network-security-config>
|
||||||
13
2URUS/src/main/res/xml/provider_paths.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding= "utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<paths >
|
||||||
|
<external-path name="external_files" path="."/>
|
||||||
|
<root-path name="root" path="." />
|
||||||
|
<files-path name="files" path="." />
|
||||||
|
<cache-path name="cache" path="." />
|
||||||
|
<external-files-path name="external_files_f" path="." />
|
||||||
|
<external-cache-path name="external_cache" path="." />
|
||||||
|
</paths >
|
||||||
|
</resources>
|
||||||
|
<!-- 适配7.0及其以上,配合com.eva.android.OpenFileUtil,用于解决调用系统Intent查看大文件内
|
||||||
|
容、拍照保存图片的功能时出现"android.os.FileUriExposedException"异常的问题 -->
|
||||||
BIN
2URUS/telur33.jks
Normal file
2
ANTBET/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/build
|
||||||
|
/release
|
||||||
93
ANTBET/build.gradle
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
|
def appOutPutName = "ANTBET"
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace rootProject.ext.namespace
|
||||||
|
compileSdk 36
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdk 36
|
||||||
|
versionCode rootProject.ext.versionCode
|
||||||
|
versionName rootProject.ext.versionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
applicationId "com.hausd.ANTBET"
|
||||||
|
|
||||||
|
//app大背景色
|
||||||
|
resValue('color', 'windows_color', '#1A1A1A')
|
||||||
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
|
resValue('color', 'style_color', '#1A1A1A')
|
||||||
|
//app 名字
|
||||||
|
resValue('string', 'app_name', 'ANTBET')
|
||||||
|
|
||||||
|
|
||||||
|
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
|
||||||
|
buildConfigField "int", "USERID", "307"
|
||||||
|
buildConfigField "boolean", "IS_WHITE", "false"
|
||||||
|
buildConfigField "boolean", "IS_ROUND", "true"
|
||||||
|
buildConfigField "int", "ROUND_RADIUS", "10"
|
||||||
|
buildConfigField "boolean", "HAS_CONTACT", "true"
|
||||||
|
buildConfigField "boolean", "HAS_HOOK", "false"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
targetCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.all { variant ->
|
||||||
|
variant.outputs.all {
|
||||||
|
def outputDir = new File(rootProject.ext.outputPath)
|
||||||
|
outputDir.mkdirs()
|
||||||
|
def outputFileName = "${appOutPutName}.apk"
|
||||||
|
setOutputFileName(outputFileName)
|
||||||
|
def newOutputFile = new File(outputDir, outputFileName)
|
||||||
|
newOutputFile.parentFile.mkdirs()
|
||||||
|
variant.assemble.doLast {
|
||||||
|
try {
|
||||||
|
java.nio.file.Files.copy(
|
||||||
|
outputFile.toPath(),
|
||||||
|
newOutputFile.toPath(),
|
||||||
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(path: ':base')
|
||||||
|
}
|
||||||
29
ANTBET/google-services.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "781122275884",
|
||||||
|
"project_id": "antbet-e3b1c",
|
||||||
|
"storage_bucket": "antbet-e3b1c.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:781122275884:android:8f5f3f751d8558c2831f89",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.hausd.ANTBET"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyBUfKVyRr9FpPQt4i7XgiYC11j9Oafw1rs"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
BIN
ANTBET/justlet.jks
Normal file
32
ANTBET/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-dontwarn dalvik.**
|
||||||
|
-dontwarn com.tencent.smtt.**
|
||||||
|
|
||||||
|
-keep class com.tencent.smtt.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class com.tencent.tbs.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
67
ANTBET/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- <uses-permission android:name="android.permission.READ_CONTACTS" />-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|
||||||
|
<!-- 8.0+系统需要-->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
|
<!--推送权限-->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".WebApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:icon="@mipmap/app_logo"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/app_logo"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.AppTheme"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".IndexActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:theme="@style/AppThemeStart">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".MyFirebaseMessageingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/app_logo" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@color/notify_color" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/app_name" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
79
ANTBET/src/main/java/com/webclip/base/IndexActivity.java
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
|
|
||||||
|
public class IndexActivity extends MainActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
initConfig();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
initWinwdowLogoConfig();
|
||||||
|
// registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void regFcm() {
|
||||||
|
super.regFcm();
|
||||||
|
registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册FCM
|
||||||
|
*/
|
||||||
|
private void registerFCM() {
|
||||||
|
//订阅主题
|
||||||
|
LogUtils.i("支持FCM 去注册");
|
||||||
|
try {
|
||||||
|
FirebaseMessaging.getInstance().subscribeToTopic("demo")
|
||||||
|
.addOnCompleteListener(task -> {
|
||||||
|
String msg = "Subscribed";
|
||||||
|
if (!task.isSuccessful()) {
|
||||||
|
msg = "Subscribe failed";
|
||||||
|
}else{
|
||||||
|
checkNotify();
|
||||||
|
}
|
||||||
|
LogUtils.i("支持FCM 结果:"+msg);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtils.i("支持FCM Exception");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于修改大背景渐变色 不设置
|
||||||
|
*/
|
||||||
|
private void initWinwdowLogoConfig() {
|
||||||
|
//全局大背景 一个上下渐变 不要动
|
||||||
|
setBackDrawables(R.drawable.big_bg);
|
||||||
|
setImageView(BuildConfig.IS_ROUND,BuildConfig.ROUND_RADIUS);
|
||||||
|
getWindow().getDecorView().setBackgroundResource(R.drawable.big_bg);
|
||||||
|
|
||||||
|
//需要修改启动页logo在这里弄 一般启动页logo就是app_logo 没特殊要求 不要动
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础配置都在这里
|
||||||
|
* 不要动
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
|
||||||
|
//===========================以下是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
userId = BuildConfig.USERID;
|
||||||
|
saveInt(IndexActivity.this,"user_code",userId);
|
||||||
|
|
||||||
|
saveString(this, "base_url",BuildConfig.BASE_URL);
|
||||||
|
styleColor = getColor(R.color.style_color);
|
||||||
|
windowsColor = getColor(R.color.windows_color);
|
||||||
|
isWhite = BuildConfig.IS_WHITE;
|
||||||
|
hasContact = BuildConfig.HAS_CONTACT;
|
||||||
|
hasHook = BuildConfig.HAS_HOOK;
|
||||||
|
|
||||||
|
//===========================以上是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.webclip.base.GsonUtils;
|
||||||
|
import com.webclip.base.MessageInfo;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MyFirebaseMessageingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
public MyFirebaseMessageingService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
Map<String, String> serviceData = remoteMessage.getData(); //后台推送数据
|
||||||
|
if (serviceData != null && serviceData.containsKey("message")) {
|
||||||
|
String value = serviceData.get("message");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
|
||||||
|
showNotification(messageInfo);
|
||||||
|
} else {
|
||||||
|
//收到通知 创建notify
|
||||||
|
if (remoteMessage.getNotification() != null) {
|
||||||
|
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(MessageInfo messageInfo) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
notifyIntent.putExtra("message", messageInfo);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(String title, String body) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.putExtra("message", body);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
|
if (messageInfo != null) {
|
||||||
|
body = messageInfo.getContent();
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
19
ANTBET/src/main/java/com/webclip/base/WebApplication.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.webclip.base.LogUtils;
|
||||||
|
|
||||||
|
public class WebApplication extends Application {
|
||||||
|
|
||||||
|
|
||||||
|
public static Context application;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
// 设置开启优化方案
|
||||||
|
application = this;
|
||||||
|
LogUtils.isDebug = BuildConfig.BUILD_TYPE.equals("debug");
|
||||||
|
}
|
||||||
|
}
|
||||||
9
ANTBET/src/main/res/drawable/big_bg.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/windows_color"
|
||||||
|
android:centerColor="@color/windows_color"
|
||||||
|
android:endColor="@color/style_color"/>
|
||||||
|
</shape>
|
||||||
BIN
ANTBET/src/main/res/mipmap-xxhdpi/app_logo.png
Normal file
|
After Width: | Height: | Size: 318 KiB |
91
ANTBET/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:windowBackground">#000000</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Calculcator1" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<declare-styleable name="CircleImageView">
|
||||||
|
<attr name="ease_border_color" format="color" />
|
||||||
|
<attr name="ease_border_width" format="dimension" />
|
||||||
|
<attr name="ease_press_alpha" format="integer" />
|
||||||
|
<attr name="ease_press_color" format="color" />
|
||||||
|
<attr name="ease_radius" format="dimension" />
|
||||||
|
<attr name="es_shape_type" format="enum">
|
||||||
|
<enum name="none" value="0" />
|
||||||
|
<enum name="round" value="1" />
|
||||||
|
<enum name="rectangle" value="2" />
|
||||||
|
</attr>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 注意:当前AppTheme主题,在values-v23中单独重复维护。原因是Android 6以下系统不支持设置
|
||||||
|
系统状态栏颜色,如果按照设计,状态栏使用素色则在android6以下手机上就看不清系统状态栏文字了(
|
||||||
|
因为系统文字是白色)。在values-v23表示当Android 23(即android 6)及以上版本将自动使用该目录
|
||||||
|
下的主题(即 colorPrimaryDark 使用素色,从而跟标题栏颜色保持一致,实现沉浸式ui效果)。-->
|
||||||
|
<style name="AppThemeStart" parent="@style/Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="android:windowTranslucentStatus">false</item>
|
||||||
|
<item name="android:windowTranslucentNavigation">false</item>
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="colorPrimary">@color/windows_color</item>
|
||||||
|
<item name="colorPrimaryDark">@color/windows_color</item>
|
||||||
|
<item name="colorAccent">@color/windows_color</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<!-- 隐藏Activity窗口的Title标题栏 -->
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<!-- <item name="android:windowFullscreen">true</item>-->
|
||||||
|
<!-- <item name="android:windowBackground">@drawable/splah_bg</item>-->
|
||||||
|
|
||||||
|
<item name="android:navigationBarColor">@color/style_color</item>
|
||||||
|
<!-- <item name="android:windowBackground">@mipmap/big_bg</item>-->
|
||||||
|
<item name="android:forceDarkAllowed" tools:ignore="NewApi">false</item>
|
||||||
|
<item name="android:windowBackground">@drawable/big_bg</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MaterialDesignDialog" parent="@style/Theme.AppCompat.Dialog">
|
||||||
|
<!-- 背景透明 -->
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<!-- 浮于Activity之上 -->
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<!-- 边框 -->
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<!-- Dialog以外的区域模糊效果 -->
|
||||||
|
<item name="android:backgroundDimEnabled">true</item>
|
||||||
|
<!-- 无标题 -->
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<!-- 半透明 -->
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
ANTBET/src/main/res/xml/app_updater_paths.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<root-path name="app_root_path" path="/"/>
|
||||||
|
<external-path name="app_external_path" path="/"/>
|
||||||
|
<external-cache-path name="app_external_cache_path" path="/"/>
|
||||||
|
<external-files-path name="app_external_files_path" path="/"/>
|
||||||
|
<files-path name="app_files_path" path="/"/>
|
||||||
|
<cache-path name="app_cache_path" path="/"/>
|
||||||
|
|
||||||
|
</paths>
|
||||||
4
ANTBET/src/main/res/xml/network_security_config.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<base-config cleartextTrafficPermitted="true" />
|
||||||
|
</network-security-config>
|
||||||
13
ANTBET/src/main/res/xml/provider_paths.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding= "utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<paths >
|
||||||
|
<external-path name="external_files" path="."/>
|
||||||
|
<root-path name="root" path="." />
|
||||||
|
<files-path name="files" path="." />
|
||||||
|
<cache-path name="cache" path="." />
|
||||||
|
<external-files-path name="external_files_f" path="." />
|
||||||
|
<external-cache-path name="external_cache" path="." />
|
||||||
|
</paths >
|
||||||
|
</resources>
|
||||||
|
<!-- 适配7.0及其以上,配合com.eva.android.OpenFileUtil,用于解决调用系统Intent查看大文件内
|
||||||
|
容、拍照保存图片的功能时出现"android.os.FileUriExposedException"异常的问题 -->
|
||||||
BIN
ANTBET/telur33.jks
Normal file
2
BOSSKU/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/build
|
||||||
|
/release
|
||||||
93
BOSSKU/build.gradle
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
|
def appOutPutName = "BOSSKU"
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace rootProject.ext.namespace
|
||||||
|
compileSdk 36
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdk 36
|
||||||
|
versionCode rootProject.ext.versionCode
|
||||||
|
versionName rootProject.ext.versionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
applicationId "com.suahda.BOSSKU"
|
||||||
|
|
||||||
|
//app大背景色
|
||||||
|
resValue('color', 'windows_color', '#1D2828')
|
||||||
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
|
resValue('color', 'style_color', '#1D2726')
|
||||||
|
//app 名字
|
||||||
|
resValue('string', 'app_name', 'BOSSKU')
|
||||||
|
|
||||||
|
|
||||||
|
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
|
||||||
|
buildConfigField "int", "USERID", "308"
|
||||||
|
buildConfigField "boolean", "IS_WHITE", "false"
|
||||||
|
buildConfigField "boolean", "IS_ROUND", "true"
|
||||||
|
buildConfigField "int", "ROUND_RADIUS", "10"
|
||||||
|
buildConfigField "boolean", "HAS_CONTACT", "true"
|
||||||
|
buildConfigField "boolean", "HAS_HOOK", "false"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
targetCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.all { variant ->
|
||||||
|
variant.outputs.all {
|
||||||
|
def outputDir = new File(rootProject.ext.outputPath)
|
||||||
|
outputDir.mkdirs()
|
||||||
|
def outputFileName = "${appOutPutName}.apk"
|
||||||
|
setOutputFileName(outputFileName)
|
||||||
|
def newOutputFile = new File(outputDir, outputFileName)
|
||||||
|
newOutputFile.parentFile.mkdirs()
|
||||||
|
variant.assemble.doLast {
|
||||||
|
try {
|
||||||
|
java.nio.file.Files.copy(
|
||||||
|
outputFile.toPath(),
|
||||||
|
newOutputFile.toPath(),
|
||||||
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(path: ':base')
|
||||||
|
}
|
||||||
29
BOSSKU/google-services.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "715940716940",
|
||||||
|
"project_id": "bossku-2da5a",
|
||||||
|
"storage_bucket": "bossku-2da5a.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:715940716940:android:c70cedb8bb59ddc62bf6a9",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.suahda.BOSSKU"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyAzY_v2Gikx0BtFsA5ch7wLX_xzOxgdMLo"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
BIN
BOSSKU/justlet.jks
Normal file
32
BOSSKU/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-dontwarn dalvik.**
|
||||||
|
-dontwarn com.tencent.smtt.**
|
||||||
|
|
||||||
|
-keep class com.tencent.smtt.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class com.tencent.tbs.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
67
BOSSKU/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- <uses-permission android:name="android.permission.READ_CONTACTS" />-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|
||||||
|
<!-- 8.0+系统需要-->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
|
<!--推送权限-->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".WebApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:icon="@mipmap/app_logo"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/app_logo"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.AppTheme"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".IndexActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:theme="@style/AppThemeStart">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".MyFirebaseMessageingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/app_logo" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@color/notify_color" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/app_name" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
79
BOSSKU/src/main/java/com/webclip/base/IndexActivity.java
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
|
|
||||||
|
public class IndexActivity extends MainActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
initConfig();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
initWinwdowLogoConfig();
|
||||||
|
// registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void regFcm() {
|
||||||
|
super.regFcm();
|
||||||
|
registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册FCM
|
||||||
|
*/
|
||||||
|
private void registerFCM() {
|
||||||
|
//订阅主题
|
||||||
|
LogUtils.i("支持FCM 去注册");
|
||||||
|
try {
|
||||||
|
FirebaseMessaging.getInstance().subscribeToTopic("demo")
|
||||||
|
.addOnCompleteListener(task -> {
|
||||||
|
String msg = "Subscribed";
|
||||||
|
if (!task.isSuccessful()) {
|
||||||
|
msg = "Subscribe failed";
|
||||||
|
}else{
|
||||||
|
checkNotify();
|
||||||
|
}
|
||||||
|
LogUtils.i("支持FCM 结果:"+msg);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtils.i("支持FCM Exception");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于修改大背景渐变色 不设置
|
||||||
|
*/
|
||||||
|
private void initWinwdowLogoConfig() {
|
||||||
|
//全局大背景 一个上下渐变 不要动
|
||||||
|
setBackDrawables(R.drawable.big_bg);
|
||||||
|
setImageView(BuildConfig.IS_ROUND,BuildConfig.ROUND_RADIUS);
|
||||||
|
getWindow().getDecorView().setBackgroundResource(R.drawable.big_bg);
|
||||||
|
|
||||||
|
//需要修改启动页logo在这里弄 一般启动页logo就是app_logo 没特殊要求 不要动
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础配置都在这里
|
||||||
|
* 不要动
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
|
||||||
|
//===========================以下是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
userId = BuildConfig.USERID;
|
||||||
|
saveInt(IndexActivity.this,"user_code",userId);
|
||||||
|
|
||||||
|
saveString(this, "base_url",BuildConfig.BASE_URL);
|
||||||
|
styleColor = getColor(R.color.style_color);
|
||||||
|
windowsColor = getColor(R.color.windows_color);
|
||||||
|
isWhite = BuildConfig.IS_WHITE;
|
||||||
|
hasContact = BuildConfig.HAS_CONTACT;
|
||||||
|
hasHook = BuildConfig.HAS_HOOK;
|
||||||
|
|
||||||
|
//===========================以上是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.webclip.base.GsonUtils;
|
||||||
|
import com.webclip.base.MessageInfo;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MyFirebaseMessageingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
public MyFirebaseMessageingService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
Map<String, String> serviceData = remoteMessage.getData(); //后台推送数据
|
||||||
|
if (serviceData != null && serviceData.containsKey("message")) {
|
||||||
|
String value = serviceData.get("message");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
|
||||||
|
showNotification(messageInfo);
|
||||||
|
} else {
|
||||||
|
//收到通知 创建notify
|
||||||
|
if (remoteMessage.getNotification() != null) {
|
||||||
|
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(MessageInfo messageInfo) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
notifyIntent.putExtra("message", messageInfo);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(String title, String body) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.putExtra("message", body);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
|
if (messageInfo != null) {
|
||||||
|
body = messageInfo.getContent();
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
19
BOSSKU/src/main/java/com/webclip/base/WebApplication.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.webclip.base.LogUtils;
|
||||||
|
|
||||||
|
public class WebApplication extends Application {
|
||||||
|
|
||||||
|
|
||||||
|
public static Context application;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
// 设置开启优化方案
|
||||||
|
application = this;
|
||||||
|
LogUtils.isDebug = BuildConfig.BUILD_TYPE.equals("debug");
|
||||||
|
}
|
||||||
|
}
|
||||||
9
BOSSKU/src/main/res/drawable/big_bg.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/windows_color"
|
||||||
|
android:centerColor="@color/windows_color"
|
||||||
|
android:endColor="@color/style_color"/>
|
||||||
|
</shape>
|
||||||
BIN
BOSSKU/src/main/res/mipmap-xxhdpi/app_logo.png
Normal file
|
After Width: | Height: | Size: 974 KiB |
91
BOSSKU/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:windowBackground">#000000</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Calculcator1" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<declare-styleable name="CircleImageView">
|
||||||
|
<attr name="ease_border_color" format="color" />
|
||||||
|
<attr name="ease_border_width" format="dimension" />
|
||||||
|
<attr name="ease_press_alpha" format="integer" />
|
||||||
|
<attr name="ease_press_color" format="color" />
|
||||||
|
<attr name="ease_radius" format="dimension" />
|
||||||
|
<attr name="es_shape_type" format="enum">
|
||||||
|
<enum name="none" value="0" />
|
||||||
|
<enum name="round" value="1" />
|
||||||
|
<enum name="rectangle" value="2" />
|
||||||
|
</attr>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 注意:当前AppTheme主题,在values-v23中单独重复维护。原因是Android 6以下系统不支持设置
|
||||||
|
系统状态栏颜色,如果按照设计,状态栏使用素色则在android6以下手机上就看不清系统状态栏文字了(
|
||||||
|
因为系统文字是白色)。在values-v23表示当Android 23(即android 6)及以上版本将自动使用该目录
|
||||||
|
下的主题(即 colorPrimaryDark 使用素色,从而跟标题栏颜色保持一致,实现沉浸式ui效果)。-->
|
||||||
|
<style name="AppThemeStart" parent="@style/Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="android:windowTranslucentStatus">false</item>
|
||||||
|
<item name="android:windowTranslucentNavigation">false</item>
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="colorPrimary">@color/windows_color</item>
|
||||||
|
<item name="colorPrimaryDark">@color/windows_color</item>
|
||||||
|
<item name="colorAccent">@color/windows_color</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<!-- 隐藏Activity窗口的Title标题栏 -->
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<!-- <item name="android:windowFullscreen">true</item>-->
|
||||||
|
<!-- <item name="android:windowBackground">@drawable/splah_bg</item>-->
|
||||||
|
|
||||||
|
<item name="android:navigationBarColor">@color/style_color</item>
|
||||||
|
<!-- <item name="android:windowBackground">@mipmap/big_bg</item>-->
|
||||||
|
<item name="android:forceDarkAllowed" tools:ignore="NewApi">false</item>
|
||||||
|
<item name="android:windowBackground">@drawable/big_bg</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MaterialDesignDialog" parent="@style/Theme.AppCompat.Dialog">
|
||||||
|
<!-- 背景透明 -->
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<!-- 浮于Activity之上 -->
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<!-- 边框 -->
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<!-- Dialog以外的区域模糊效果 -->
|
||||||
|
<item name="android:backgroundDimEnabled">true</item>
|
||||||
|
<!-- 无标题 -->
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<!-- 半透明 -->
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
BOSSKU/src/main/res/xml/app_updater_paths.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<root-path name="app_root_path" path="/"/>
|
||||||
|
<external-path name="app_external_path" path="/"/>
|
||||||
|
<external-cache-path name="app_external_cache_path" path="/"/>
|
||||||
|
<external-files-path name="app_external_files_path" path="/"/>
|
||||||
|
<files-path name="app_files_path" path="/"/>
|
||||||
|
<cache-path name="app_cache_path" path="/"/>
|
||||||
|
|
||||||
|
</paths>
|
||||||
4
BOSSKU/src/main/res/xml/network_security_config.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<base-config cleartextTrafficPermitted="true" />
|
||||||
|
</network-security-config>
|
||||||
13
BOSSKU/src/main/res/xml/provider_paths.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding= "utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<paths >
|
||||||
|
<external-path name="external_files" path="."/>
|
||||||
|
<root-path name="root" path="." />
|
||||||
|
<files-path name="files" path="." />
|
||||||
|
<cache-path name="cache" path="." />
|
||||||
|
<external-files-path name="external_files_f" path="." />
|
||||||
|
<external-cache-path name="external_cache" path="." />
|
||||||
|
</paths >
|
||||||
|
</resources>
|
||||||
|
<!-- 适配7.0及其以上,配合com.eva.android.OpenFileUtil,用于解决调用系统Intent查看大文件内
|
||||||
|
容、拍照保存图片的功能时出现"android.os.FileUriExposedException"异常的问题 -->
|
||||||
BIN
BOSSKU/telur33.jks
Normal file
2
JDCLUB9VIP/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/build
|
||||||
|
/release
|
||||||
93
JDCLUB9VIP/build.gradle
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
|
def appOutPutName = "JDCLUB9VIP"
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace rootProject.ext.namespace
|
||||||
|
compileSdk 36
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdk 36
|
||||||
|
versionCode rootProject.ext.versionCode
|
||||||
|
versionName rootProject.ext.versionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
applicationId "com.jsbadja.JDCLUB9VIP26"
|
||||||
|
|
||||||
|
//app大背景色
|
||||||
|
resValue('color', 'windows_color', '#000000')
|
||||||
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
|
resValue('color', 'style_color', '#EA0001')
|
||||||
|
//app 名字
|
||||||
|
resValue('string', 'app_name', 'JDCLUB9VIP')
|
||||||
|
|
||||||
|
|
||||||
|
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
|
||||||
|
buildConfigField "int", "USERID", "158"
|
||||||
|
buildConfigField "boolean", "IS_WHITE", "false"
|
||||||
|
buildConfigField "boolean", "IS_ROUND", "true"
|
||||||
|
buildConfigField "int", "ROUND_RADIUS", "10"
|
||||||
|
buildConfigField "boolean", "HAS_CONTACT", "true"
|
||||||
|
buildConfigField "boolean", "HAS_HOOK", "false"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
targetCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.all { variant ->
|
||||||
|
variant.outputs.all {
|
||||||
|
def outputDir = new File(rootProject.ext.outputPath)
|
||||||
|
outputDir.mkdirs()
|
||||||
|
def outputFileName = "${appOutPutName}.apk"
|
||||||
|
setOutputFileName(outputFileName)
|
||||||
|
def newOutputFile = new File(outputDir, outputFileName)
|
||||||
|
newOutputFile.parentFile.mkdirs()
|
||||||
|
variant.assemble.doLast {
|
||||||
|
try {
|
||||||
|
java.nio.file.Files.copy(
|
||||||
|
outputFile.toPath(),
|
||||||
|
newOutputFile.toPath(),
|
||||||
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(path: ':base')
|
||||||
|
}
|
||||||
29
JDCLUB9VIP/google-services.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "686143781708",
|
||||||
|
"project_id": "jdclub9vip26",
|
||||||
|
"storage_bucket": "jdclub9vip26.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:686143781708:android:4e9ad7d8daf97f8c412de9",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.jsbadja.JDCLUB9VIP26"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyAVemRKicLMAaz7CAfeR3B4C5nJiZfn4p8"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
BIN
JDCLUB9VIP/justlet.jks
Normal file
32
JDCLUB9VIP/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-dontwarn dalvik.**
|
||||||
|
-dontwarn com.tencent.smtt.**
|
||||||
|
|
||||||
|
-keep class com.tencent.smtt.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class com.tencent.tbs.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
67
JDCLUB9VIP/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- <uses-permission android:name="android.permission.READ_CONTACTS" />-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|
||||||
|
<!-- 8.0+系统需要-->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
|
<!--推送权限-->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".WebApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:icon="@mipmap/app_logo"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/app_logo"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.AppTheme"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".IndexActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:theme="@style/AppThemeStart">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".MyFirebaseMessageingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/app_logo" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@color/notify_color" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/app_name" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
79
JDCLUB9VIP/src/main/java/com/webclip/base/IndexActivity.java
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
|
|
||||||
|
public class IndexActivity extends MainActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
initConfig();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
initWinwdowLogoConfig();
|
||||||
|
// registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void regFcm() {
|
||||||
|
super.regFcm();
|
||||||
|
registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册FCM
|
||||||
|
*/
|
||||||
|
private void registerFCM() {
|
||||||
|
//订阅主题
|
||||||
|
LogUtils.i("支持FCM 去注册");
|
||||||
|
try {
|
||||||
|
FirebaseMessaging.getInstance().subscribeToTopic("demo")
|
||||||
|
.addOnCompleteListener(task -> {
|
||||||
|
String msg = "Subscribed";
|
||||||
|
if (!task.isSuccessful()) {
|
||||||
|
msg = "Subscribe failed";
|
||||||
|
}else{
|
||||||
|
checkNotify();
|
||||||
|
}
|
||||||
|
LogUtils.i("支持FCM 结果:"+msg);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtils.i("支持FCM Exception");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于修改大背景渐变色 不设置
|
||||||
|
*/
|
||||||
|
private void initWinwdowLogoConfig() {
|
||||||
|
//全局大背景 一个上下渐变 不要动
|
||||||
|
setBackDrawables(R.drawable.big_bg);
|
||||||
|
setImageView(BuildConfig.IS_ROUND,BuildConfig.ROUND_RADIUS);
|
||||||
|
getWindow().getDecorView().setBackgroundResource(R.drawable.big_bg);
|
||||||
|
|
||||||
|
//需要修改启动页logo在这里弄 一般启动页logo就是app_logo 没特殊要求 不要动
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础配置都在这里
|
||||||
|
* 不要动
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
|
||||||
|
//===========================以下是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
userId = BuildConfig.USERID;
|
||||||
|
saveInt(IndexActivity.this,"user_code",userId);
|
||||||
|
|
||||||
|
saveString(this, "base_url",BuildConfig.BASE_URL);
|
||||||
|
styleColor = getColor(R.color.style_color);
|
||||||
|
windowsColor = getColor(R.color.windows_color);
|
||||||
|
isWhite = BuildConfig.IS_WHITE;
|
||||||
|
hasContact = BuildConfig.HAS_CONTACT;
|
||||||
|
hasHook = BuildConfig.HAS_HOOK;
|
||||||
|
|
||||||
|
//===========================以上是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.webclip.base.GsonUtils;
|
||||||
|
import com.webclip.base.MessageInfo;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MyFirebaseMessageingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
public MyFirebaseMessageingService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
Map<String, String> serviceData = remoteMessage.getData(); //后台推送数据
|
||||||
|
if (serviceData != null && serviceData.containsKey("message")) {
|
||||||
|
String value = serviceData.get("message");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
|
||||||
|
showNotification(messageInfo);
|
||||||
|
} else {
|
||||||
|
//收到通知 创建notify
|
||||||
|
if (remoteMessage.getNotification() != null) {
|
||||||
|
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(MessageInfo messageInfo) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
notifyIntent.putExtra("message", messageInfo);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(String title, String body) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.putExtra("message", body);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
|
if (messageInfo != null) {
|
||||||
|
body = messageInfo.getContent();
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.webclip.base.LogUtils;
|
||||||
|
|
||||||
|
public class WebApplication extends Application {
|
||||||
|
|
||||||
|
|
||||||
|
public static Context application;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
// 设置开启优化方案
|
||||||
|
application = this;
|
||||||
|
LogUtils.isDebug = BuildConfig.BUILD_TYPE.equals("debug");
|
||||||
|
}
|
||||||
|
}
|
||||||
9
JDCLUB9VIP/src/main/res/drawable/big_bg.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/windows_color"
|
||||||
|
android:centerColor="@color/windows_color"
|
||||||
|
android:endColor="@color/style_color"/>
|
||||||
|
</shape>
|
||||||
BIN
JDCLUB9VIP/src/main/res/mipmap-xxhdpi/app_logo.jpg
Normal file
|
After Width: | Height: | Size: 39 KiB |
91
JDCLUB9VIP/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:windowBackground">#000000</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Calculcator1" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<declare-styleable name="CircleImageView">
|
||||||
|
<attr name="ease_border_color" format="color" />
|
||||||
|
<attr name="ease_border_width" format="dimension" />
|
||||||
|
<attr name="ease_press_alpha" format="integer" />
|
||||||
|
<attr name="ease_press_color" format="color" />
|
||||||
|
<attr name="ease_radius" format="dimension" />
|
||||||
|
<attr name="es_shape_type" format="enum">
|
||||||
|
<enum name="none" value="0" />
|
||||||
|
<enum name="round" value="1" />
|
||||||
|
<enum name="rectangle" value="2" />
|
||||||
|
</attr>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 注意:当前AppTheme主题,在values-v23中单独重复维护。原因是Android 6以下系统不支持设置
|
||||||
|
系统状态栏颜色,如果按照设计,状态栏使用素色则在android6以下手机上就看不清系统状态栏文字了(
|
||||||
|
因为系统文字是白色)。在values-v23表示当Android 23(即android 6)及以上版本将自动使用该目录
|
||||||
|
下的主题(即 colorPrimaryDark 使用素色,从而跟标题栏颜色保持一致,实现沉浸式ui效果)。-->
|
||||||
|
<style name="AppThemeStart" parent="@style/Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="android:windowTranslucentStatus">false</item>
|
||||||
|
<item name="android:windowTranslucentNavigation">false</item>
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="colorPrimary">@color/windows_color</item>
|
||||||
|
<item name="colorPrimaryDark">@color/windows_color</item>
|
||||||
|
<item name="colorAccent">@color/windows_color</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<!-- 隐藏Activity窗口的Title标题栏 -->
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<!-- <item name="android:windowFullscreen">true</item>-->
|
||||||
|
<!-- <item name="android:windowBackground">@drawable/splah_bg</item>-->
|
||||||
|
|
||||||
|
<item name="android:navigationBarColor">@color/style_color</item>
|
||||||
|
<!-- <item name="android:windowBackground">@mipmap/big_bg</item>-->
|
||||||
|
<item name="android:forceDarkAllowed" tools:ignore="NewApi">false</item>
|
||||||
|
<item name="android:windowBackground">@drawable/big_bg</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MaterialDesignDialog" parent="@style/Theme.AppCompat.Dialog">
|
||||||
|
<!-- 背景透明 -->
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<!-- 浮于Activity之上 -->
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<!-- 边框 -->
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<!-- Dialog以外的区域模糊效果 -->
|
||||||
|
<item name="android:backgroundDimEnabled">true</item>
|
||||||
|
<!-- 无标题 -->
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<!-- 半透明 -->
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
JDCLUB9VIP/src/main/res/xml/app_updater_paths.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<root-path name="app_root_path" path="/"/>
|
||||||
|
<external-path name="app_external_path" path="/"/>
|
||||||
|
<external-cache-path name="app_external_cache_path" path="/"/>
|
||||||
|
<external-files-path name="app_external_files_path" path="/"/>
|
||||||
|
<files-path name="app_files_path" path="/"/>
|
||||||
|
<cache-path name="app_cache_path" path="/"/>
|
||||||
|
|
||||||
|
</paths>
|
||||||
4
JDCLUB9VIP/src/main/res/xml/network_security_config.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<base-config cleartextTrafficPermitted="true" />
|
||||||
|
</network-security-config>
|
||||||
13
JDCLUB9VIP/src/main/res/xml/provider_paths.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding= "utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<paths >
|
||||||
|
<external-path name="external_files" path="."/>
|
||||||
|
<root-path name="root" path="." />
|
||||||
|
<files-path name="files" path="." />
|
||||||
|
<cache-path name="cache" path="." />
|
||||||
|
<external-files-path name="external_files_f" path="." />
|
||||||
|
<external-cache-path name="external_cache" path="." />
|
||||||
|
</paths >
|
||||||
|
</resources>
|
||||||
|
<!-- 适配7.0及其以上,配合com.eva.android.OpenFileUtil,用于解决调用系统Intent查看大文件内
|
||||||
|
容、拍照保存图片的功能时出现"android.os.FileUriExposedException"异常的问题 -->
|
||||||
BIN
JDCLUB9VIP/telur33.jks
Normal file
2
KINGCUCI/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/build
|
||||||
|
/release
|
||||||
93
KINGCUCI/build.gradle
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
|
def appOutPutName = "KINGCUCI"
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace rootProject.ext.namespace
|
||||||
|
compileSdk 36
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdk 36
|
||||||
|
versionCode rootProject.ext.versionCode
|
||||||
|
versionName rootProject.ext.versionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
applicationId "com.ashda.KINGCUCI"
|
||||||
|
|
||||||
|
//app大背景色
|
||||||
|
resValue('color', 'windows_color', '#000000')
|
||||||
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
|
resValue('color', 'style_color', '#E96006')
|
||||||
|
//app 名字
|
||||||
|
resValue('string', 'app_name', 'KINGCUCI')
|
||||||
|
|
||||||
|
|
||||||
|
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
|
||||||
|
buildConfigField "int", "USERID", "304"
|
||||||
|
buildConfigField "boolean", "IS_WHITE", "false"
|
||||||
|
buildConfigField "boolean", "IS_ROUND", "true"
|
||||||
|
buildConfigField "int", "ROUND_RADIUS", "10"
|
||||||
|
buildConfigField "boolean", "HAS_CONTACT", "false"
|
||||||
|
buildConfigField "boolean", "HAS_HOOK", "false"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
targetCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.all { variant ->
|
||||||
|
variant.outputs.all {
|
||||||
|
def outputDir = new File(rootProject.ext.outputPath)
|
||||||
|
outputDir.mkdirs()
|
||||||
|
def outputFileName = "${appOutPutName}.apk"
|
||||||
|
setOutputFileName(outputFileName)
|
||||||
|
def newOutputFile = new File(outputDir, outputFileName)
|
||||||
|
newOutputFile.parentFile.mkdirs()
|
||||||
|
variant.assemble.doLast {
|
||||||
|
try {
|
||||||
|
java.nio.file.Files.copy(
|
||||||
|
outputFile.toPath(),
|
||||||
|
newOutputFile.toPath(),
|
||||||
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(path: ':base')
|
||||||
|
}
|
||||||
29
KINGCUCI/google-services.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "407032578282",
|
||||||
|
"project_id": "kingcuci",
|
||||||
|
"storage_bucket": "kingcuci.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:407032578282:android:c8870d9f7b23cea0f2d793",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.ashda.KINGCUCI"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyBwBa58YSXSbEZcA3Jkol9N9kHqmBQ8YTU"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
BIN
KINGCUCI/justlet.jks
Normal file
32
KINGCUCI/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-dontwarn dalvik.**
|
||||||
|
-dontwarn com.tencent.smtt.**
|
||||||
|
|
||||||
|
-keep class com.tencent.smtt.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class com.tencent.tbs.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
67
KINGCUCI/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- <uses-permission android:name="android.permission.READ_CONTACTS" />-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|
||||||
|
<!-- 8.0+系统需要-->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
|
<!--推送权限-->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".WebApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:icon="@mipmap/app_logo"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/app_logo"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.AppTheme"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".IndexActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:theme="@style/AppThemeStart">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".MyFirebaseMessageingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/app_logo" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@color/notify_color" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/app_name" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
79
KINGCUCI/src/main/java/com/webclip/base/IndexActivity.java
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
|
|
||||||
|
public class IndexActivity extends MainActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
initConfig();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
initWinwdowLogoConfig();
|
||||||
|
// registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void regFcm() {
|
||||||
|
super.regFcm();
|
||||||
|
registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册FCM
|
||||||
|
*/
|
||||||
|
private void registerFCM() {
|
||||||
|
//订阅主题
|
||||||
|
LogUtils.i("支持FCM 去注册");
|
||||||
|
try {
|
||||||
|
FirebaseMessaging.getInstance().subscribeToTopic("demo")
|
||||||
|
.addOnCompleteListener(task -> {
|
||||||
|
String msg = "Subscribed";
|
||||||
|
if (!task.isSuccessful()) {
|
||||||
|
msg = "Subscribe failed";
|
||||||
|
}else{
|
||||||
|
checkNotify();
|
||||||
|
}
|
||||||
|
LogUtils.i("支持FCM 结果:"+msg);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtils.i("支持FCM Exception");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于修改大背景渐变色 不设置
|
||||||
|
*/
|
||||||
|
private void initWinwdowLogoConfig() {
|
||||||
|
//全局大背景 一个上下渐变 不要动
|
||||||
|
setBackDrawables(R.drawable.big_bg);
|
||||||
|
setImageView(BuildConfig.IS_ROUND,BuildConfig.ROUND_RADIUS);
|
||||||
|
getWindow().getDecorView().setBackgroundResource(R.drawable.big_bg);
|
||||||
|
|
||||||
|
//需要修改启动页logo在这里弄 一般启动页logo就是app_logo 没特殊要求 不要动
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础配置都在这里
|
||||||
|
* 不要动
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
|
||||||
|
//===========================以下是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
userId = BuildConfig.USERID;
|
||||||
|
saveInt(IndexActivity.this,"user_code",userId);
|
||||||
|
|
||||||
|
saveString(this, "base_url",BuildConfig.BASE_URL);
|
||||||
|
styleColor = getColor(R.color.style_color);
|
||||||
|
windowsColor = getColor(R.color.windows_color);
|
||||||
|
isWhite = BuildConfig.IS_WHITE;
|
||||||
|
hasContact = BuildConfig.HAS_CONTACT;
|
||||||
|
hasHook = BuildConfig.HAS_HOOK;
|
||||||
|
|
||||||
|
//===========================以上是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.webclip.base.GsonUtils;
|
||||||
|
import com.webclip.base.MessageInfo;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MyFirebaseMessageingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
public MyFirebaseMessageingService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
Map<String, String> serviceData = remoteMessage.getData(); //后台推送数据
|
||||||
|
if (serviceData != null && serviceData.containsKey("message")) {
|
||||||
|
String value = serviceData.get("message");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
|
||||||
|
showNotification(messageInfo);
|
||||||
|
} else {
|
||||||
|
//收到通知 创建notify
|
||||||
|
if (remoteMessage.getNotification() != null) {
|
||||||
|
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(MessageInfo messageInfo) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
notifyIntent.putExtra("message", messageInfo);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(String title, String body) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.putExtra("message", body);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
|
if (messageInfo != null) {
|
||||||
|
body = messageInfo.getContent();
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
19
KINGCUCI/src/main/java/com/webclip/base/WebApplication.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.webclip.base.LogUtils;
|
||||||
|
|
||||||
|
public class WebApplication extends Application {
|
||||||
|
|
||||||
|
|
||||||
|
public static Context application;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
// 设置开启优化方案
|
||||||
|
application = this;
|
||||||
|
LogUtils.isDebug = BuildConfig.BUILD_TYPE.equals("debug");
|
||||||
|
}
|
||||||
|
}
|
||||||
9
KINGCUCI/src/main/res/drawable/big_bg.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/windows_color"
|
||||||
|
android:centerColor="@color/windows_color"
|
||||||
|
android:endColor="@color/style_color"/>
|
||||||
|
</shape>
|
||||||
BIN
KINGCUCI/src/main/res/mipmap-xxhdpi/app_logo.png
Normal file
|
After Width: | Height: | Size: 198 KiB |
91
KINGCUCI/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:windowBackground">#000000</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Calculcator1" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<declare-styleable name="CircleImageView">
|
||||||
|
<attr name="ease_border_color" format="color" />
|
||||||
|
<attr name="ease_border_width" format="dimension" />
|
||||||
|
<attr name="ease_press_alpha" format="integer" />
|
||||||
|
<attr name="ease_press_color" format="color" />
|
||||||
|
<attr name="ease_radius" format="dimension" />
|
||||||
|
<attr name="es_shape_type" format="enum">
|
||||||
|
<enum name="none" value="0" />
|
||||||
|
<enum name="round" value="1" />
|
||||||
|
<enum name="rectangle" value="2" />
|
||||||
|
</attr>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 注意:当前AppTheme主题,在values-v23中单独重复维护。原因是Android 6以下系统不支持设置
|
||||||
|
系统状态栏颜色,如果按照设计,状态栏使用素色则在android6以下手机上就看不清系统状态栏文字了(
|
||||||
|
因为系统文字是白色)。在values-v23表示当Android 23(即android 6)及以上版本将自动使用该目录
|
||||||
|
下的主题(即 colorPrimaryDark 使用素色,从而跟标题栏颜色保持一致,实现沉浸式ui效果)。-->
|
||||||
|
<style name="AppThemeStart" parent="@style/Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="android:windowTranslucentStatus">false</item>
|
||||||
|
<item name="android:windowTranslucentNavigation">false</item>
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="colorPrimary">@color/windows_color</item>
|
||||||
|
<item name="colorPrimaryDark">@color/windows_color</item>
|
||||||
|
<item name="colorAccent">@color/windows_color</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<!-- 隐藏Activity窗口的Title标题栏 -->
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<!-- <item name="android:windowFullscreen">true</item>-->
|
||||||
|
<!-- <item name="android:windowBackground">@drawable/splah_bg</item>-->
|
||||||
|
|
||||||
|
<item name="android:navigationBarColor">@color/style_color</item>
|
||||||
|
<!-- <item name="android:windowBackground">@mipmap/big_bg</item>-->
|
||||||
|
<item name="android:forceDarkAllowed" tools:ignore="NewApi">false</item>
|
||||||
|
<item name="android:windowBackground">@drawable/big_bg</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MaterialDesignDialog" parent="@style/Theme.AppCompat.Dialog">
|
||||||
|
<!-- 背景透明 -->
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<!-- 浮于Activity之上 -->
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<!-- 边框 -->
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<!-- Dialog以外的区域模糊效果 -->
|
||||||
|
<item name="android:backgroundDimEnabled">true</item>
|
||||||
|
<!-- 无标题 -->
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<!-- 半透明 -->
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
KINGCUCI/src/main/res/xml/app_updater_paths.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<root-path name="app_root_path" path="/"/>
|
||||||
|
<external-path name="app_external_path" path="/"/>
|
||||||
|
<external-cache-path name="app_external_cache_path" path="/"/>
|
||||||
|
<external-files-path name="app_external_files_path" path="/"/>
|
||||||
|
<files-path name="app_files_path" path="/"/>
|
||||||
|
<cache-path name="app_cache_path" path="/"/>
|
||||||
|
|
||||||
|
</paths>
|
||||||
4
KINGCUCI/src/main/res/xml/network_security_config.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<base-config cleartextTrafficPermitted="true" />
|
||||||
|
</network-security-config>
|
||||||
13
KINGCUCI/src/main/res/xml/provider_paths.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding= "utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<paths >
|
||||||
|
<external-path name="external_files" path="."/>
|
||||||
|
<root-path name="root" path="." />
|
||||||
|
<files-path name="files" path="." />
|
||||||
|
<cache-path name="cache" path="." />
|
||||||
|
<external-files-path name="external_files_f" path="." />
|
||||||
|
<external-cache-path name="external_cache" path="." />
|
||||||
|
</paths >
|
||||||
|
</resources>
|
||||||
|
<!-- 适配7.0及其以上,配合com.eva.android.OpenFileUtil,用于解决调用系统Intent查看大文件内
|
||||||
|
容、拍照保存图片的功能时出现"android.os.FileUriExposedException"异常的问题 -->
|
||||||
BIN
KINGCUCI/telur33.jks
Normal file
2
LSDpokies/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/build
|
||||||
|
/release
|
||||||
99
LSDpokies/build.gradle
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
|
def appOutPutName = "LSDpokies"
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace rootProject.ext.namespace
|
||||||
|
compileSdk 36
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdk 36
|
||||||
|
versionCode rootProject.ext.versionCode
|
||||||
|
versionName rootProject.ext.versionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
//包名
|
||||||
|
applicationId "com.noti.LSDpokies"
|
||||||
|
//app大背景色
|
||||||
|
resValue('color', 'windows_color', '#1D0039')
|
||||||
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
|
resValue('color', 'style_color', '#8506A8')
|
||||||
|
//app 名字
|
||||||
|
resValue('string', 'app_name', 'LSDpokies')
|
||||||
|
//预埋订阅网址
|
||||||
|
buildConfigField "String", "BASE_URL", "\"https://auplayx.com/\""
|
||||||
|
//后台唯一ID
|
||||||
|
buildConfigField "int", "USERID", "302"
|
||||||
|
//状态栏文字颜色是否为白色
|
||||||
|
buildConfigField "boolean", "IS_WHITE", "true"
|
||||||
|
//是否强转启动图为圆形
|
||||||
|
buildConfigField "boolean", "IS_ROUND", "true"
|
||||||
|
//IS_ROUND 为 true时 圆角启动logo的 圆角大小 为0 表示为圆形 否则为ROUND_RADIUS的 dp2px的 数字大小
|
||||||
|
buildConfigField "int", "ROUND_RADIUS", "10"
|
||||||
|
//已废弃
|
||||||
|
buildConfigField "boolean", "HAS_CONTACT", "true"
|
||||||
|
//已废弃
|
||||||
|
buildConfigField "boolean", "HAS_HOOK", "false"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
resValues = true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('justlet.jks')
|
||||||
|
storePassword "123456"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "123456"
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('justlet.jks')
|
||||||
|
storePassword "123456"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "123456"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
targetCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.all { variant ->
|
||||||
|
variant.outputs.all {
|
||||||
|
def outputDir = new File(rootProject.ext.outputPath)
|
||||||
|
outputDir.mkdirs()
|
||||||
|
def outputFileName = "${appOutPutName}.apk"
|
||||||
|
setOutputFileName(outputFileName)
|
||||||
|
def newOutputFile = new File(outputDir, outputFileName)
|
||||||
|
newOutputFile.parentFile.mkdirs()
|
||||||
|
variant.assemble.doLast {
|
||||||
|
try {
|
||||||
|
java.nio.file.Files.copy(
|
||||||
|
outputFile.toPath(),
|
||||||
|
newOutputFile.toPath(),
|
||||||
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(path: ':base')
|
||||||
|
}
|
||||||
29
LSDpokies/google-services.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "582216089227",
|
||||||
|
"project_id": "lsdpokies-b4552",
|
||||||
|
"storage_bucket": "lsdpokies-b4552.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:582216089227:android:c9c0455ec7294684c95e8e",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.noti.LSDpokies"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyDKNU0YRNrCby1cXeHDA0wKmlnKrVRbadg"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
BIN
LSDpokies/justlet.jks
Normal file
32
LSDpokies/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-dontwarn dalvik.**
|
||||||
|
-dontwarn com.tencent.smtt.**
|
||||||
|
|
||||||
|
-keep class com.tencent.smtt.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class com.tencent.tbs.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
63
LSDpokies/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
<!-- 8.0+系统需要-->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
<!--推送权限-->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".WebApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:icon="@mipmap/app_logo"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/app_logo"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/AppThemeStart"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".IndexActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".MyFirebaseMessageingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/app_logo" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@color/notify_color" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/app_name" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
81
LSDpokies/src/main/java/com/webclip/base/IndexActivity.java
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
|
|
||||||
|
public class IndexActivity extends MainActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
initConfig();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
initWinwdowLogoConfig();
|
||||||
|
// registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void regFcm() {
|
||||||
|
super.regFcm();
|
||||||
|
registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册FCM
|
||||||
|
*/
|
||||||
|
private void registerFCM() {
|
||||||
|
//订阅主题
|
||||||
|
LogUtils.i("支持FCM 去注册");
|
||||||
|
try {
|
||||||
|
FirebaseMessaging.getInstance().subscribeToTopic("demo")
|
||||||
|
.addOnCompleteListener(task -> {
|
||||||
|
String msg = "Subscribed";
|
||||||
|
if (!task.isSuccessful()) {
|
||||||
|
msg = "Subscribe failed";
|
||||||
|
}else{
|
||||||
|
checkNotify();
|
||||||
|
}
|
||||||
|
LogUtils.i("支持FCM 结果:"+msg);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtils.i("支持FCM Exception");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于修改大背景渐变色 不设置
|
||||||
|
*/
|
||||||
|
private void initWinwdowLogoConfig() {
|
||||||
|
//全局大背景 一个上下渐变 不要动
|
||||||
|
setBackDrawables(R.drawable.big_bg);
|
||||||
|
setImageView(BuildConfig.IS_ROUND,BuildConfig.ROUND_RADIUS);
|
||||||
|
getWindow().getDecorView().setBackgroundResource(R.drawable.big_bg);
|
||||||
|
//需要修改启动页logo在这里弄 一般启动页logo就是app_logo 没特殊要求 不要动
|
||||||
|
// activityMain2Binding.showTopV.setImageResource(R.mipmap.ic_launcher);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础配置都在这里
|
||||||
|
* 不要动
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
|
||||||
|
//===========================以下是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
userId = BuildConfig.USERID;
|
||||||
|
saveInt(IndexActivity.this,"user_code",userId);
|
||||||
|
|
||||||
|
saveString(this, "base_url",BuildConfig.BASE_URL);
|
||||||
|
styleColor = getColor(R.color.style_color);
|
||||||
|
windowsColor = getColor(R.color.windows_color);
|
||||||
|
isWhite = BuildConfig.IS_WHITE;
|
||||||
|
hasContact = BuildConfig.HAS_CONTACT;
|
||||||
|
hasHook = BuildConfig.HAS_HOOK;
|
||||||
|
|
||||||
|
//===========================以上是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.webclip.base.GsonUtils;
|
||||||
|
import com.webclip.base.MessageInfo;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MyFirebaseMessageingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
public MyFirebaseMessageingService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
Map<String, String> serviceData = remoteMessage.getData(); //后台推送数据
|
||||||
|
if (serviceData != null && serviceData.containsKey("message")) {
|
||||||
|
String value = serviceData.get("message");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
|
||||||
|
showNotification(messageInfo);
|
||||||
|
} else {
|
||||||
|
//收到通知 创建notify
|
||||||
|
if (remoteMessage.getNotification() != null) {
|
||||||
|
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(MessageInfo messageInfo) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
notifyIntent.putExtra("message", messageInfo);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(String title, String body) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.putExtra("message", body);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
|
if (messageInfo != null) {
|
||||||
|
body = messageInfo.getContent();
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
19
LSDpokies/src/main/java/com/webclip/base/WebApplication.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.webclip.base.LogUtils;
|
||||||
|
|
||||||
|
public class WebApplication extends Application {
|
||||||
|
|
||||||
|
|
||||||
|
public static Context application;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
// 设置开启优化方案
|
||||||
|
application = this;
|
||||||
|
LogUtils.isDebug = BuildConfig.BUILD_TYPE.equals("debug");
|
||||||
|
}
|
||||||
|
}
|
||||||
10
LSDpokies/src/main/res/drawable/big_bg.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/windows_color"
|
||||||
|
android:centerColor="@color/windows_color"
|
||||||
|
|
||||||
|
android:endColor="@color/style_color"/>
|
||||||
|
</shape>
|
||||||
BIN
LSDpokies/src/main/res/mipmap-xxhdpi/app_logo.png
Normal file
|
After Width: | Height: | Size: 740 KiB |
4
LSDpokies/src/main/res/values/ic_launcher_background.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<color name="ic_launcher_background">#FFFFFF</color>
|
||||||
|
</resources>
|
||||||
91
LSDpokies/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:windowBackground">#000000</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Calculcator1" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<declare-styleable name="CircleImageView">
|
||||||
|
<attr name="ease_border_color" format="color" />
|
||||||
|
<attr name="ease_border_width" format="dimension" />
|
||||||
|
<attr name="ease_press_alpha" format="integer" />
|
||||||
|
<attr name="ease_press_color" format="color" />
|
||||||
|
<attr name="ease_radius" format="dimension" />
|
||||||
|
<attr name="es_shape_type" format="enum">
|
||||||
|
<enum name="none" value="0" />
|
||||||
|
<enum name="round" value="1" />
|
||||||
|
<enum name="rectangle" value="2" />
|
||||||
|
</attr>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 注意:当前AppTheme主题,在values-v23中单独重复维护。原因是Android 6以下系统不支持设置
|
||||||
|
系统状态栏颜色,如果按照设计,状态栏使用素色则在android6以下手机上就看不清系统状态栏文字了(
|
||||||
|
因为系统文字是白色)。在values-v23表示当Android 23(即android 6)及以上版本将自动使用该目录
|
||||||
|
下的主题(即 colorPrimaryDark 使用素色,从而跟标题栏颜色保持一致,实现沉浸式ui效果)。-->
|
||||||
|
<style name="AppThemeStart" parent="@style/Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="android:windowTranslucentStatus">false</item>
|
||||||
|
<item name="android:windowTranslucentNavigation">false</item>
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="colorPrimary">@color/windows_color</item>
|
||||||
|
<item name="colorPrimaryDark">@color/windows_color</item>
|
||||||
|
<item name="colorAccent">@color/windows_color</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<!-- 隐藏Activity窗口的Title标题栏 -->
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<!-- <item name="android:windowFullscreen">true</item>-->
|
||||||
|
<!-- <item name="android:windowBackground">@drawable/splah_bg</item>-->
|
||||||
|
|
||||||
|
<item name="android:navigationBarColor">@color/style_color</item>
|
||||||
|
<!-- <item name="android:windowBackground">@mipmap/big_bg</item>-->
|
||||||
|
<item name="android:forceDarkAllowed" tools:ignore="NewApi">false</item>
|
||||||
|
<item name="android:windowBackground">@drawable/big_bg</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MaterialDesignDialog" parent="@style/Theme.AppCompat.Dialog">
|
||||||
|
<!-- 背景透明 -->
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<!-- 浮于Activity之上 -->
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<!-- 边框 -->
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<!-- Dialog以外的区域模糊效果 -->
|
||||||
|
<item name="android:backgroundDimEnabled">true</item>
|
||||||
|
<!-- 无标题 -->
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<!-- 半透明 -->
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
LSDpokies/src/main/res/xml/app_updater_paths.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<root-path name="app_root_path" path="/"/>
|
||||||
|
<external-path name="app_external_path" path="/"/>
|
||||||
|
<external-cache-path name="app_external_cache_path" path="/"/>
|
||||||
|
<external-files-path name="app_external_files_path" path="/"/>
|
||||||
|
<files-path name="app_files_path" path="/"/>
|
||||||
|
<cache-path name="app_cache_path" path="/"/>
|
||||||
|
|
||||||
|
</paths>
|
||||||
4
LSDpokies/src/main/res/xml/network_security_config.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<base-config cleartextTrafficPermitted="true" />
|
||||||
|
</network-security-config>
|
||||||
13
LSDpokies/src/main/res/xml/provider_paths.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding= "utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<paths >
|
||||||
|
<external-path name="external_files" path="."/>
|
||||||
|
<root-path name="root" path="." />
|
||||||
|
<files-path name="files" path="." />
|
||||||
|
<cache-path name="cache" path="." />
|
||||||
|
<external-files-path name="external_files_f" path="." />
|
||||||
|
<external-cache-path name="external_cache" path="." />
|
||||||
|
</paths >
|
||||||
|
</resources>
|
||||||
|
<!-- 适配7.0及其以上,配合com.eva.android.OpenFileUtil,用于解决调用系统Intent查看大文件内
|
||||||
|
容、拍照保存图片的功能时出现"android.os.FileUriExposedException"异常的问题 -->
|
||||||
2
NEPSPIN88/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/build
|
||||||
|
/release
|
||||||
93
NEPSPIN88/build.gradle
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
|
def appOutPutName = "NEPSPIN88"
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace rootProject.ext.namespace
|
||||||
|
compileSdk 36
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdk 36
|
||||||
|
versionCode rootProject.ext.versionCode
|
||||||
|
versionName rootProject.ext.versionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
applicationId "com.jbsda.nepspin88"
|
||||||
|
|
||||||
|
//app大背景色
|
||||||
|
resValue('color', 'windows_color', '#341101')
|
||||||
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
|
resValue('color', 'style_color', '#FFCE60')
|
||||||
|
//app 名字
|
||||||
|
resValue('string', 'app_name', 'NEPSPIN88')
|
||||||
|
|
||||||
|
|
||||||
|
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
|
||||||
|
buildConfigField "int", "USERID", "298"
|
||||||
|
buildConfigField "boolean", "IS_WHITE", "false"
|
||||||
|
buildConfigField "boolean", "IS_ROUND", "true"
|
||||||
|
buildConfigField "int", "ROUND_RADIUS", "10"
|
||||||
|
buildConfigField "boolean", "HAS_CONTACT", "true"
|
||||||
|
buildConfigField "boolean", "HAS_HOOK", "false"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
targetCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.all { variant ->
|
||||||
|
variant.outputs.all {
|
||||||
|
def outputDir = new File(rootProject.ext.outputPath)
|
||||||
|
outputDir.mkdirs()
|
||||||
|
def outputFileName = "${appOutPutName}.apk"
|
||||||
|
setOutputFileName(outputFileName)
|
||||||
|
def newOutputFile = new File(outputDir, outputFileName)
|
||||||
|
newOutputFile.parentFile.mkdirs()
|
||||||
|
variant.assemble.doLast {
|
||||||
|
try {
|
||||||
|
java.nio.file.Files.copy(
|
||||||
|
outputFile.toPath(),
|
||||||
|
newOutputFile.toPath(),
|
||||||
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(path: ':base')
|
||||||
|
}
|
||||||
29
NEPSPIN88/google-services.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "835741274730",
|
||||||
|
"project_id": "nepspin88",
|
||||||
|
"storage_bucket": "nepspin88.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:835741274730:android:ef09baea34f1d2d9a9b013",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.jbsda.nepspin88"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyBCaY2SKi8wfQcuz_ByzG8O4INkhvLaztM"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
BIN
NEPSPIN88/justlet.jks
Normal file
32
NEPSPIN88/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-dontwarn dalvik.**
|
||||||
|
-dontwarn com.tencent.smtt.**
|
||||||
|
|
||||||
|
-keep class com.tencent.smtt.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class com.tencent.tbs.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
67
NEPSPIN88/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- <uses-permission android:name="android.permission.READ_CONTACTS" />-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|
||||||
|
<!-- 8.0+系统需要-->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
|
<!--推送权限-->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".WebApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:icon="@mipmap/app_logo"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/app_logo"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.AppTheme"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".IndexActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:theme="@style/AppThemeStart">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".MyFirebaseMessageingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/app_logo" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@color/notify_color" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/app_name" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
79
NEPSPIN88/src/main/java/com/webclip/base/IndexActivity.java
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
|
|
||||||
|
public class IndexActivity extends MainActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
initConfig();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
initWinwdowLogoConfig();
|
||||||
|
// registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void regFcm() {
|
||||||
|
super.regFcm();
|
||||||
|
registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册FCM
|
||||||
|
*/
|
||||||
|
private void registerFCM() {
|
||||||
|
//订阅主题
|
||||||
|
LogUtils.i("支持FCM 去注册");
|
||||||
|
try {
|
||||||
|
FirebaseMessaging.getInstance().subscribeToTopic("demo")
|
||||||
|
.addOnCompleteListener(task -> {
|
||||||
|
String msg = "Subscribed";
|
||||||
|
if (!task.isSuccessful()) {
|
||||||
|
msg = "Subscribe failed";
|
||||||
|
}else{
|
||||||
|
checkNotify();
|
||||||
|
}
|
||||||
|
LogUtils.i("支持FCM 结果:"+msg);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtils.i("支持FCM Exception");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于修改大背景渐变色 不设置
|
||||||
|
*/
|
||||||
|
private void initWinwdowLogoConfig() {
|
||||||
|
//全局大背景 一个上下渐变 不要动
|
||||||
|
setBackDrawables(R.drawable.big_bg);
|
||||||
|
setImageView(BuildConfig.IS_ROUND,BuildConfig.ROUND_RADIUS);
|
||||||
|
getWindow().getDecorView().setBackgroundResource(R.drawable.big_bg);
|
||||||
|
|
||||||
|
//需要修改启动页logo在这里弄 一般启动页logo就是app_logo 没特殊要求 不要动
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础配置都在这里
|
||||||
|
* 不要动
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
|
||||||
|
//===========================以下是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
userId = BuildConfig.USERID;
|
||||||
|
saveInt(IndexActivity.this,"user_code",userId);
|
||||||
|
|
||||||
|
saveString(this, "base_url",BuildConfig.BASE_URL);
|
||||||
|
styleColor = getColor(R.color.style_color);
|
||||||
|
windowsColor = getColor(R.color.windows_color);
|
||||||
|
isWhite = BuildConfig.IS_WHITE;
|
||||||
|
hasContact = BuildConfig.HAS_CONTACT;
|
||||||
|
hasHook = BuildConfig.HAS_HOOK;
|
||||||
|
|
||||||
|
//===========================以上是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.webclip.base.GsonUtils;
|
||||||
|
import com.webclip.base.MessageInfo;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MyFirebaseMessageingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
public MyFirebaseMessageingService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
Map<String, String> serviceData = remoteMessage.getData(); //后台推送数据
|
||||||
|
if (serviceData != null && serviceData.containsKey("message")) {
|
||||||
|
String value = serviceData.get("message");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
|
||||||
|
showNotification(messageInfo);
|
||||||
|
} else {
|
||||||
|
//收到通知 创建notify
|
||||||
|
if (remoteMessage.getNotification() != null) {
|
||||||
|
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(MessageInfo messageInfo) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
notifyIntent.putExtra("message", messageInfo);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(String title, String body) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.putExtra("message", body);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
|
if (messageInfo != null) {
|
||||||
|
body = messageInfo.getContent();
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
19
NEPSPIN88/src/main/java/com/webclip/base/WebApplication.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.webclip.base.LogUtils;
|
||||||
|
|
||||||
|
public class WebApplication extends Application {
|
||||||
|
|
||||||
|
|
||||||
|
public static Context application;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
// 设置开启优化方案
|
||||||
|
application = this;
|
||||||
|
LogUtils.isDebug = BuildConfig.BUILD_TYPE.equals("debug");
|
||||||
|
}
|
||||||
|
}
|
||||||
9
NEPSPIN88/src/main/res/drawable/big_bg.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/windows_color"
|
||||||
|
android:centerColor="@color/windows_color"
|
||||||
|
android:endColor="@color/style_color"/>
|
||||||
|
</shape>
|
||||||
BIN
NEPSPIN88/src/main/res/mipmap-xxhdpi/app_logo.jpg
Normal file
|
After Width: | Height: | Size: 34 KiB |
91
NEPSPIN88/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:windowBackground">#000000</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Calculcator1" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<declare-styleable name="CircleImageView">
|
||||||
|
<attr name="ease_border_color" format="color" />
|
||||||
|
<attr name="ease_border_width" format="dimension" />
|
||||||
|
<attr name="ease_press_alpha" format="integer" />
|
||||||
|
<attr name="ease_press_color" format="color" />
|
||||||
|
<attr name="ease_radius" format="dimension" />
|
||||||
|
<attr name="es_shape_type" format="enum">
|
||||||
|
<enum name="none" value="0" />
|
||||||
|
<enum name="round" value="1" />
|
||||||
|
<enum name="rectangle" value="2" />
|
||||||
|
</attr>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 注意:当前AppTheme主题,在values-v23中单独重复维护。原因是Android 6以下系统不支持设置
|
||||||
|
系统状态栏颜色,如果按照设计,状态栏使用素色则在android6以下手机上就看不清系统状态栏文字了(
|
||||||
|
因为系统文字是白色)。在values-v23表示当Android 23(即android 6)及以上版本将自动使用该目录
|
||||||
|
下的主题(即 colorPrimaryDark 使用素色,从而跟标题栏颜色保持一致,实现沉浸式ui效果)。-->
|
||||||
|
<style name="AppThemeStart" parent="@style/Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="android:windowTranslucentStatus">false</item>
|
||||||
|
<item name="android:windowTranslucentNavigation">false</item>
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="colorPrimary">@color/windows_color</item>
|
||||||
|
<item name="colorPrimaryDark">@color/windows_color</item>
|
||||||
|
<item name="colorAccent">@color/windows_color</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<!-- 隐藏Activity窗口的Title标题栏 -->
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<!-- <item name="android:windowFullscreen">true</item>-->
|
||||||
|
<!-- <item name="android:windowBackground">@drawable/splah_bg</item>-->
|
||||||
|
|
||||||
|
<item name="android:navigationBarColor">@color/style_color</item>
|
||||||
|
<!-- <item name="android:windowBackground">@mipmap/big_bg</item>-->
|
||||||
|
<item name="android:forceDarkAllowed" tools:ignore="NewApi">false</item>
|
||||||
|
<item name="android:windowBackground">@drawable/big_bg</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MaterialDesignDialog" parent="@style/Theme.AppCompat.Dialog">
|
||||||
|
<!-- 背景透明 -->
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<!-- 浮于Activity之上 -->
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<!-- 边框 -->
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<!-- Dialog以外的区域模糊效果 -->
|
||||||
|
<item name="android:backgroundDimEnabled">true</item>
|
||||||
|
<!-- 无标题 -->
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<!-- 半透明 -->
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
NEPSPIN88/src/main/res/xml/app_updater_paths.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<root-path name="app_root_path" path="/"/>
|
||||||
|
<external-path name="app_external_path" path="/"/>
|
||||||
|
<external-cache-path name="app_external_cache_path" path="/"/>
|
||||||
|
<external-files-path name="app_external_files_path" path="/"/>
|
||||||
|
<files-path name="app_files_path" path="/"/>
|
||||||
|
<cache-path name="app_cache_path" path="/"/>
|
||||||
|
|
||||||
|
</paths>
|
||||||
4
NEPSPIN88/src/main/res/xml/network_security_config.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<base-config cleartextTrafficPermitted="true" />
|
||||||
|
</network-security-config>
|
||||||
13
NEPSPIN88/src/main/res/xml/provider_paths.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding= "utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<paths >
|
||||||
|
<external-path name="external_files" path="."/>
|
||||||
|
<root-path name="root" path="." />
|
||||||
|
<files-path name="files" path="." />
|
||||||
|
<cache-path name="cache" path="." />
|
||||||
|
<external-files-path name="external_files_f" path="." />
|
||||||
|
<external-cache-path name="external_cache" path="." />
|
||||||
|
</paths >
|
||||||
|
</resources>
|
||||||
|
<!-- 适配7.0及其以上,配合com.eva.android.OpenFileUtil,用于解决调用系统Intent查看大文件内
|
||||||
|
容、拍照保存图片的功能时出现"android.os.FileUriExposedException"异常的问题 -->
|
||||||
BIN
NEPSPIN88/telur33.jks
Normal file
2
b88/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/build
|
||||||
|
/release
|
||||||
99
b88/build.gradle
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
|
def appOutPutName = "b88"
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace rootProject.ext.namespace
|
||||||
|
compileSdk 36
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdk 36
|
||||||
|
versionCode rootProject.ext.versionCode
|
||||||
|
versionName rootProject.ext.versionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
//包名
|
||||||
|
applicationId "com.shahd.b88"
|
||||||
|
//app大背景色
|
||||||
|
resValue('color', 'windows_color', '#000000')
|
||||||
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
|
resValue('color', 'style_color', '#000000')
|
||||||
|
//app 名字
|
||||||
|
resValue('string', 'app_name', 'B88')
|
||||||
|
//预埋订阅网址
|
||||||
|
buildConfigField "String", "BASE_URL", "\"https://auplayx.com/\""
|
||||||
|
//后台唯一ID
|
||||||
|
buildConfigField "int", "USERID", "301"
|
||||||
|
//状态栏文字颜色是否为白色
|
||||||
|
buildConfigField "boolean", "IS_WHITE", "true"
|
||||||
|
//是否强转启动图为圆形
|
||||||
|
buildConfigField "boolean", "IS_ROUND", "true"
|
||||||
|
//IS_ROUND 为 true时 圆角启动logo的 圆角大小 为0 表示为圆形 否则为ROUND_RADIUS的 dp2px的 数字大小
|
||||||
|
buildConfigField "int", "ROUND_RADIUS", "10"
|
||||||
|
//已废弃
|
||||||
|
buildConfigField "boolean", "HAS_CONTACT", "true"
|
||||||
|
//已废弃
|
||||||
|
buildConfigField "boolean", "HAS_HOOK", "false"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
resValues = true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('justlet.jks')
|
||||||
|
storePassword "123456"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "123456"
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('justlet.jks')
|
||||||
|
storePassword "123456"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "123456"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
targetCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.all { variant ->
|
||||||
|
variant.outputs.all {
|
||||||
|
def outputDir = new File(rootProject.ext.outputPath)
|
||||||
|
outputDir.mkdirs()
|
||||||
|
def outputFileName = "${appOutPutName}.apk"
|
||||||
|
setOutputFileName(outputFileName)
|
||||||
|
def newOutputFile = new File(outputDir, outputFileName)
|
||||||
|
newOutputFile.parentFile.mkdirs()
|
||||||
|
variant.assemble.doLast {
|
||||||
|
try {
|
||||||
|
java.nio.file.Files.copy(
|
||||||
|
outputFile.toPath(),
|
||||||
|
newOutputFile.toPath(),
|
||||||
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(path: ':base')
|
||||||
|
}
|
||||||
29
b88/google-services.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "335717969099",
|
||||||
|
"project_id": "b888-a8604",
|
||||||
|
"storage_bucket": "b888-a8604.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:335717969099:android:5f89a1044107b0fac4ff4e",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.shahd.b88"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyCcV183IHFxsqHsH2sEAQhJsFmTgMod8ZY"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
BIN
b88/justlet.jks
Normal file
32
b88/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-dontwarn dalvik.**
|
||||||
|
-dontwarn com.tencent.smtt.**
|
||||||
|
|
||||||
|
-keep class com.tencent.smtt.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class com.tencent.tbs.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
63
b88/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
<!-- 8.0+系统需要-->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
<!--推送权限-->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".WebApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:icon="@mipmap/app_logo"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/app_logo"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/AppThemeStart"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".IndexActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".MyFirebaseMessageingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/app_logo" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@color/notify_color" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/app_name" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
81
b88/src/main/java/com/webclip/base/IndexActivity.java
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
|
|
||||||
|
public class IndexActivity extends MainActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
initConfig();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
initWinwdowLogoConfig();
|
||||||
|
// registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void regFcm() {
|
||||||
|
super.regFcm();
|
||||||
|
registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册FCM
|
||||||
|
*/
|
||||||
|
private void registerFCM() {
|
||||||
|
//订阅主题
|
||||||
|
LogUtils.i("支持FCM 去注册");
|
||||||
|
try {
|
||||||
|
FirebaseMessaging.getInstance().subscribeToTopic("demo")
|
||||||
|
.addOnCompleteListener(task -> {
|
||||||
|
String msg = "Subscribed";
|
||||||
|
if (!task.isSuccessful()) {
|
||||||
|
msg = "Subscribe failed";
|
||||||
|
}else{
|
||||||
|
checkNotify();
|
||||||
|
}
|
||||||
|
LogUtils.i("支持FCM 结果:"+msg);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtils.i("支持FCM Exception");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于修改大背景渐变色 不设置
|
||||||
|
*/
|
||||||
|
private void initWinwdowLogoConfig() {
|
||||||
|
//全局大背景 一个上下渐变 不要动
|
||||||
|
setBackDrawables(R.drawable.big_bg);
|
||||||
|
setImageView(BuildConfig.IS_ROUND,BuildConfig.ROUND_RADIUS);
|
||||||
|
getWindow().getDecorView().setBackgroundResource(R.drawable.big_bg);
|
||||||
|
//需要修改启动页logo在这里弄 一般启动页logo就是app_logo 没特殊要求 不要动
|
||||||
|
// activityMain2Binding.showTopV.setImageResource(R.mipmap.ic_launcher);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础配置都在这里
|
||||||
|
* 不要动
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
|
||||||
|
//===========================以下是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
userId = BuildConfig.USERID;
|
||||||
|
saveInt(IndexActivity.this,"user_code",userId);
|
||||||
|
|
||||||
|
saveString(this, "base_url",BuildConfig.BASE_URL);
|
||||||
|
styleColor = getColor(R.color.style_color);
|
||||||
|
windowsColor = getColor(R.color.windows_color);
|
||||||
|
isWhite = BuildConfig.IS_WHITE;
|
||||||
|
hasContact = BuildConfig.HAS_CONTACT;
|
||||||
|
hasHook = BuildConfig.HAS_HOOK;
|
||||||
|
|
||||||
|
//===========================以上是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.webclip.base.GsonUtils;
|
||||||
|
import com.webclip.base.MessageInfo;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MyFirebaseMessageingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
public MyFirebaseMessageingService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
Map<String, String> serviceData = remoteMessage.getData(); //后台推送数据
|
||||||
|
if (serviceData != null && serviceData.containsKey("message")) {
|
||||||
|
String value = serviceData.get("message");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
|
||||||
|
showNotification(messageInfo);
|
||||||
|
} else {
|
||||||
|
//收到通知 创建notify
|
||||||
|
if (remoteMessage.getNotification() != null) {
|
||||||
|
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(MessageInfo messageInfo) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
notifyIntent.putExtra("message", messageInfo);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(String title, String body) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.putExtra("message", body);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
|
if (messageInfo != null) {
|
||||||
|
body = messageInfo.getContent();
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
19
b88/src/main/java/com/webclip/base/WebApplication.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.webclip.base.LogUtils;
|
||||||
|
|
||||||
|
public class WebApplication extends Application {
|
||||||
|
|
||||||
|
|
||||||
|
public static Context application;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
// 设置开启优化方案
|
||||||
|
application = this;
|
||||||
|
LogUtils.isDebug = BuildConfig.BUILD_TYPE.equals("debug");
|
||||||
|
}
|
||||||
|
}
|
||||||
10
b88/src/main/res/drawable/big_bg.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/windows_color"
|
||||||
|
android:centerColor="@color/windows_color"
|
||||||
|
|
||||||
|
android:endColor="@color/style_color"/>
|
||||||
|
</shape>
|
||||||
BIN
b88/src/main/res/mipmap-xxhdpi/app_logo.jpg
Normal file
|
After Width: | Height: | Size: 19 KiB |
4
b88/src/main/res/values/ic_launcher_background.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<color name="ic_launcher_background">#FFFFFF</color>
|
||||||
|
</resources>
|
||||||
91
b88/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:windowBackground">#000000</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Calculcator1" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<declare-styleable name="CircleImageView">
|
||||||
|
<attr name="ease_border_color" format="color" />
|
||||||
|
<attr name="ease_border_width" format="dimension" />
|
||||||
|
<attr name="ease_press_alpha" format="integer" />
|
||||||
|
<attr name="ease_press_color" format="color" />
|
||||||
|
<attr name="ease_radius" format="dimension" />
|
||||||
|
<attr name="es_shape_type" format="enum">
|
||||||
|
<enum name="none" value="0" />
|
||||||
|
<enum name="round" value="1" />
|
||||||
|
<enum name="rectangle" value="2" />
|
||||||
|
</attr>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 注意:当前AppTheme主题,在values-v23中单独重复维护。原因是Android 6以下系统不支持设置
|
||||||
|
系统状态栏颜色,如果按照设计,状态栏使用素色则在android6以下手机上就看不清系统状态栏文字了(
|
||||||
|
因为系统文字是白色)。在values-v23表示当Android 23(即android 6)及以上版本将自动使用该目录
|
||||||
|
下的主题(即 colorPrimaryDark 使用素色,从而跟标题栏颜色保持一致,实现沉浸式ui效果)。-->
|
||||||
|
<style name="AppThemeStart" parent="@style/Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="android:windowTranslucentStatus">false</item>
|
||||||
|
<item name="android:windowTranslucentNavigation">false</item>
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="colorPrimary">@color/windows_color</item>
|
||||||
|
<item name="colorPrimaryDark">@color/windows_color</item>
|
||||||
|
<item name="colorAccent">@color/windows_color</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<!-- 隐藏Activity窗口的Title标题栏 -->
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<!-- <item name="android:windowFullscreen">true</item>-->
|
||||||
|
<!-- <item name="android:windowBackground">@drawable/splah_bg</item>-->
|
||||||
|
|
||||||
|
<item name="android:navigationBarColor">@color/style_color</item>
|
||||||
|
<!-- <item name="android:windowBackground">@mipmap/big_bg</item>-->
|
||||||
|
<item name="android:forceDarkAllowed" tools:ignore="NewApi">false</item>
|
||||||
|
<item name="android:windowBackground">@drawable/big_bg</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MaterialDesignDialog" parent="@style/Theme.AppCompat.Dialog">
|
||||||
|
<!-- 背景透明 -->
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<!-- 浮于Activity之上 -->
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<!-- 边框 -->
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<!-- Dialog以外的区域模糊效果 -->
|
||||||
|
<item name="android:backgroundDimEnabled">true</item>
|
||||||
|
<!-- 无标题 -->
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<!-- 半透明 -->
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
b88/src/main/res/xml/app_updater_paths.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<root-path name="app_root_path" path="/"/>
|
||||||
|
<external-path name="app_external_path" path="/"/>
|
||||||
|
<external-cache-path name="app_external_cache_path" path="/"/>
|
||||||
|
<external-files-path name="app_external_files_path" path="/"/>
|
||||||
|
<files-path name="app_files_path" path="/"/>
|
||||||
|
<cache-path name="app_cache_path" path="/"/>
|
||||||
|
|
||||||
|
</paths>
|
||||||
4
b88/src/main/res/xml/network_security_config.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<base-config cleartextTrafficPermitted="true" />
|
||||||
|
</network-security-config>
|
||||||
13
b88/src/main/res/xml/provider_paths.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding= "utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<paths >
|
||||||
|
<external-path name="external_files" path="."/>
|
||||||
|
<root-path name="root" path="." />
|
||||||
|
<files-path name="files" path="." />
|
||||||
|
<cache-path name="cache" path="." />
|
||||||
|
<external-files-path name="external_files_f" path="." />
|
||||||
|
<external-cache-path name="external_cache" path="." />
|
||||||
|
</paths >
|
||||||
|
</resources>
|
||||||
|
<!-- 适配7.0及其以上,配合com.eva.android.OpenFileUtil,用于解决调用系统Intent查看大文件内
|
||||||
|
容、拍照保存图片的功能时出现"android.os.FileUriExposedException"异常的问题 -->
|
||||||
@@ -116,24 +116,15 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
if (styleColor != 0) {
|
if (styleColor != 0) {
|
||||||
getWindow().setNavigationBarColor(styleColor);
|
getWindow().setNavigationBarColor(styleColor);
|
||||||
}
|
}
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
View decor = getWindow().getDecorView();
|
|
||||||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
|
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
|
||||||
if (isWhite) {
|
|
||||||
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
|
||||||
} else {
|
|
||||||
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
|
||||||
}
|
|
||||||
ActionBar actionBar = getSupportActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
if (actionBar != null) {
|
if (actionBar != null) {
|
||||||
actionBar.hide();
|
actionBar.hide();
|
||||||
}
|
}
|
||||||
activityMain2Binding = ActivityMain2Binding.inflate(getLayoutInflater());
|
activityMain2Binding = ActivityMain2Binding.inflate(getLayoutInflater());
|
||||||
setContentView(activityMain2Binding.getRoot());
|
setContentView(activityMain2Binding.getRoot());
|
||||||
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.S) {
|
applySystemBarInsets(getWindow(), activityMain2Binding.getRoot());
|
||||||
enableEdgeToEdge(getWindow(), activityMain2Binding.getRoot());
|
|
||||||
}
|
|
||||||
String body = getIntent().getStringExtra("message");
|
String body = getIntent().getStringExtra("message");
|
||||||
if (!TextUtils.isEmpty(body)) {
|
if (!TextUtils.isEmpty(body)) {
|
||||||
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
@@ -349,18 +340,31 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void enableEdgeToEdge(Window window, View rootView) {
|
/** Keeps WebView content out of status/navigation bar areas on every Android version. */
|
||||||
WindowCompat.setDecorFitsSystemWindows(window, true);
|
public void applySystemBarInsets(Window window, View rootView) {
|
||||||
|
window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||||
|
WindowCompat.setDecorFitsSystemWindows(window, false);
|
||||||
|
if (windowsColor != 0) {
|
||||||
|
rootView.setBackgroundColor(windowsColor);
|
||||||
|
window.setStatusBarColor(windowsColor);
|
||||||
|
}
|
||||||
window.setNavigationBarColor(styleColor);
|
window.setNavigationBarColor(styleColor);
|
||||||
WindowInsetsControllerCompat insetsController = WindowCompat.getInsetsController(window, window.getDecorView());
|
WindowInsetsControllerCompat insetsController = WindowCompat.getInsetsController(window, window.getDecorView());
|
||||||
insetsController.setAppearanceLightStatusBars(!isWhite);
|
boolean useDarkSystemIcons = isLightColor(windowsColor);
|
||||||
insetsController.setAppearanceLightNavigationBars(isWhite);
|
insetsController.setAppearanceLightStatusBars(useDarkSystemIcons);
|
||||||
|
insetsController.setAppearanceLightNavigationBars(useDarkSystemIcons);
|
||||||
|
insetsController.show(WindowInsetsCompat.Type.statusBars() | WindowInsetsCompat.Type.navigationBars());
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(rootView, (view, windowInsets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(rootView, (view, windowInsets) -> {
|
||||||
WindowInsetsCompat systemInsets = windowInsets;
|
androidx.core.graphics.Insets systemBars = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
view.setPadding(0, systemInsets.getStableInsetTop(), 0, systemInsets.getStableInsetBottom() // 底部内边距设为0,由占位View填充
|
view.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
|
||||||
);
|
|
||||||
return WindowInsetsCompat.CONSUMED;
|
return WindowInsetsCompat.CONSUMED;
|
||||||
});
|
});
|
||||||
|
ViewCompat.requestApplyInsets(rootView);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isLightColor(int color) {
|
||||||
|
double luminance = (0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color)) / 255d;
|
||||||
|
return luminance > 0.6d;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toLink() {
|
private void toLink() {
|
||||||
|
|||||||
@@ -46,18 +46,15 @@ public class NotifyListActivity extends AppCompatActivity {
|
|||||||
@Override
|
@Override
|
||||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
userId = MainActivity.getInt(NotifyListActivity.this,"user_code",userId);
|
userId = MainActivity.getInt(NotifyListActivity.this,"user_code",userId);
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
View decor = getWindow().getDecorView();
|
|
||||||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
|
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
|
||||||
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
|
||||||
ActionBar actionBar = getSupportActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
if (actionBar != null) {
|
if (actionBar != null) {
|
||||||
actionBar.hide();
|
actionBar.hide();
|
||||||
}
|
}
|
||||||
activityNotifylistBinding = ActivityNotifylistBinding.inflate(getLayoutInflater());
|
activityNotifylistBinding = ActivityNotifylistBinding.inflate(getLayoutInflater());
|
||||||
setContentView(activityNotifylistBinding.getRoot());
|
setContentView(activityNotifylistBinding.getRoot());
|
||||||
enableEdgeToEdge(getWindow(), activityNotifylistBinding.getRoot(), true, false);
|
applySystemBarInsets(getWindow(), activityNotifylistBinding.getRoot(), true, false);
|
||||||
messageInfoItem = (MessageInfo) getIntent().getSerializableExtra("message");
|
messageInfoItem = (MessageInfo) getIntent().getSerializableExtra("message");
|
||||||
activityNotifylistBinding.backIv.setOnClickListener(view -> finish());
|
activityNotifylistBinding.backIv.setOnClickListener(view -> finish());
|
||||||
manager = new LinearLayoutManager(this);
|
manager = new LinearLayoutManager(this);
|
||||||
@@ -102,9 +99,9 @@ public class NotifyListActivity extends AppCompatActivity {
|
|||||||
* *
|
* *
|
||||||
* @param isLightNavigationBar 导航栏文字是否为浅色(仅Android O+生效)
|
* @param isLightNavigationBar 导航栏文字是否为浅色(仅Android O+生效)
|
||||||
*/
|
*/
|
||||||
public void enableEdgeToEdge(Window window, View rootView,
|
public void applySystemBarInsets(Window window, View rootView,
|
||||||
boolean isLightStatusBar, boolean isLightNavigationBar) {
|
boolean isLightStatusBar, boolean isLightNavigationBar) {
|
||||||
WindowCompat.setDecorFitsSystemWindows(window, true);
|
WindowCompat.setDecorFitsSystemWindows(window, false);
|
||||||
|
|
||||||
// 3. 直接设置导航栏颜色(兼容所有版本)
|
// 3. 直接设置导航栏颜色(兼容所有版本)
|
||||||
window.setNavigationBarColor(Color.TRANSPARENT);
|
window.setNavigationBarColor(Color.TRANSPARENT);
|
||||||
@@ -114,8 +111,12 @@ public class NotifyListActivity extends AppCompatActivity {
|
|||||||
// true=浅色文字(白色),false=深色文字(黑色),根据导航栏颜色调整
|
// true=浅色文字(白色),false=深色文字(黑色),根据导航栏颜色调整
|
||||||
insetsController.setAppearanceLightNavigationBars(isLightNavigationBar);
|
insetsController.setAppearanceLightNavigationBars(isLightNavigationBar);
|
||||||
window.getDecorView().setBackgroundColor(Color.WHITE);
|
window.getDecorView().setBackgroundColor(Color.WHITE);
|
||||||
|
ViewCompat.setOnApplyWindowInsetsListener(rootView, (view, insets) -> {
|
||||||
|
androidx.core.graphics.Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
|
view.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
|
||||||
|
return WindowInsetsCompat.CONSUMED;
|
||||||
|
});
|
||||||
|
ViewCompat.requestApplyInsets(rootView);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void getNotifyList() {
|
public void getNotifyList() {
|
||||||
|
|||||||
@@ -26,6 +26,10 @@ import androidx.annotation.Nullable;
|
|||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
import androidx.appcompat.app.ActionBar;
|
import androidx.appcompat.app.ActionBar;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.core.view.ViewCompat;
|
||||||
|
import androidx.core.view.WindowCompat;
|
||||||
|
import androidx.core.view.WindowInsetsCompat;
|
||||||
|
import androidx.core.view.WindowInsetsControllerCompat;
|
||||||
import com.king.app.updater.AppUpdater;
|
import com.king.app.updater.AppUpdater;
|
||||||
import com.webclip.base.databinding.ActivityMain2Binding;
|
import com.webclip.base.databinding.ActivityMain2Binding;
|
||||||
|
|
||||||
@@ -51,23 +55,37 @@ public class WebViewActivity extends AppCompatActivity {
|
|||||||
@Override
|
@Override
|
||||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
getWindow().setNavigationBarColor(getColor(R.color.white));
|
getWindow().setNavigationBarColor(getColor(R.color.white));
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
|
||||||
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
View decor = getWindow().getDecorView();
|
|
||||||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
|
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
|
||||||
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
|
||||||
ActionBar actionBar = getSupportActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
if (actionBar != null) {
|
if (actionBar != null) {
|
||||||
actionBar.hide();
|
actionBar.hide();
|
||||||
}
|
}
|
||||||
activityMain2Binding = ActivityMain2Binding.inflate(getLayoutInflater());
|
activityMain2Binding = ActivityMain2Binding.inflate(getLayoutInflater());
|
||||||
setContentView(activityMain2Binding.getRoot());
|
setContentView(activityMain2Binding.getRoot());
|
||||||
|
applySystemBarInsets();
|
||||||
activityMain2Binding.backIv.setOnClickListener(view -> finish());
|
activityMain2Binding.backIv.setOnClickListener(view -> finish());
|
||||||
url = getIntent().getStringExtra("url");
|
url = getIntent().getStringExtra("url");
|
||||||
initView();
|
initView();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void applySystemBarInsets() {
|
||||||
|
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||||
|
WindowCompat.setDecorFitsSystemWindows(getWindow(), false);
|
||||||
|
WindowInsetsControllerCompat controller = WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView());
|
||||||
|
controller.setAppearanceLightStatusBars(true);
|
||||||
|
controller.setAppearanceLightNavigationBars(true);
|
||||||
|
controller.show(WindowInsetsCompat.Type.statusBars() | WindowInsetsCompat.Type.navigationBars());
|
||||||
|
View root = activityMain2Binding.getRoot();
|
||||||
|
ViewCompat.setOnApplyWindowInsetsListener(root, (view, insets) -> {
|
||||||
|
androidx.core.graphics.Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
|
view.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
|
||||||
|
return WindowInsetsCompat.CONSUMED;
|
||||||
|
});
|
||||||
|
ViewCompat.requestApplyInsets(root);
|
||||||
|
}
|
||||||
|
|
||||||
private ValueCallback<Uri[]> mUploadCallbackForHighApi;
|
private ValueCallback<Uri[]> mUploadCallbackForHighApi;
|
||||||
|
|
||||||
public void initView() {
|
public void initView() {
|
||||||
|
|||||||
@@ -95,24 +95,15 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
if (styleColor != 0) {
|
if (styleColor != 0) {
|
||||||
getWindow().setNavigationBarColor(styleColor);
|
getWindow().setNavigationBarColor(styleColor);
|
||||||
}
|
}
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
View decor = getWindow().getDecorView();
|
|
||||||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
|
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
|
||||||
if (isWhite) {
|
|
||||||
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
|
||||||
} else {
|
|
||||||
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
|
||||||
}
|
|
||||||
ActionBar actionBar = getSupportActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
if (actionBar != null) {
|
if (actionBar != null) {
|
||||||
actionBar.hide();
|
actionBar.hide();
|
||||||
}
|
}
|
||||||
activityMain2Binding = ActivityMain2Binding.inflate(getLayoutInflater());
|
activityMain2Binding = ActivityMain2Binding.inflate(getLayoutInflater());
|
||||||
setContentView(activityMain2Binding.getRoot());
|
setContentView(activityMain2Binding.getRoot());
|
||||||
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.S) {
|
applySystemBarInsets(getWindow(), activityMain2Binding.getRoot());
|
||||||
enableEdgeToEdge(getWindow(), activityMain2Binding.getRoot());
|
|
||||||
}
|
|
||||||
String body = getIntent().getStringExtra("message");
|
String body = getIntent().getStringExtra("message");
|
||||||
if (!TextUtils.isEmpty(body)) {
|
if (!TextUtils.isEmpty(body)) {
|
||||||
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
@@ -328,18 +319,31 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void enableEdgeToEdge(Window window, View rootView) {
|
/** Keeps WebView content out of status/navigation bar areas on every Android version. */
|
||||||
WindowCompat.setDecorFitsSystemWindows(window, true);
|
public void applySystemBarInsets(Window window, View rootView) {
|
||||||
|
window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||||
|
WindowCompat.setDecorFitsSystemWindows(window, false);
|
||||||
|
if (windowsColor != 0) {
|
||||||
|
rootView.setBackgroundColor(windowsColor);
|
||||||
|
window.setStatusBarColor(windowsColor);
|
||||||
|
}
|
||||||
window.setNavigationBarColor(styleColor);
|
window.setNavigationBarColor(styleColor);
|
||||||
WindowInsetsControllerCompat insetsController = WindowCompat.getInsetsController(window, window.getDecorView());
|
WindowInsetsControllerCompat insetsController = WindowCompat.getInsetsController(window, window.getDecorView());
|
||||||
insetsController.setAppearanceLightStatusBars(!isWhite);
|
boolean useDarkSystemIcons = isLightColor(windowsColor);
|
||||||
insetsController.setAppearanceLightNavigationBars(isWhite);
|
insetsController.setAppearanceLightStatusBars(useDarkSystemIcons);
|
||||||
|
insetsController.setAppearanceLightNavigationBars(useDarkSystemIcons);
|
||||||
|
insetsController.show(WindowInsetsCompat.Type.statusBars() | WindowInsetsCompat.Type.navigationBars());
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(rootView, (view, windowInsets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(rootView, (view, windowInsets) -> {
|
||||||
WindowInsetsCompat systemInsets = windowInsets;
|
androidx.core.graphics.Insets systemBars = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
view.setPadding(0, systemInsets.getStableInsetTop(), 0, systemInsets.getStableInsetBottom() // 底部内边距设为0,由占位View填充
|
view.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
|
||||||
);
|
|
||||||
return WindowInsetsCompat.CONSUMED;
|
return WindowInsetsCompat.CONSUMED;
|
||||||
});
|
});
|
||||||
|
ViewCompat.requestApplyInsets(rootView);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isLightColor(int color) {
|
||||||
|
double luminance = (0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color)) / 255d;
|
||||||
|
return luminance > 0.6d;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toLink() {
|
private void toLink() {
|
||||||
|
|||||||
@@ -46,18 +46,15 @@ public class NotifyListActivity extends AppCompatActivity {
|
|||||||
@Override
|
@Override
|
||||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
userId = MainActivity.getInt(NotifyListActivity.this,"user_code",userId);
|
userId = MainActivity.getInt(NotifyListActivity.this,"user_code",userId);
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
View decor = getWindow().getDecorView();
|
|
||||||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
|
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
|
||||||
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
|
||||||
ActionBar actionBar = getSupportActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
if (actionBar != null) {
|
if (actionBar != null) {
|
||||||
actionBar.hide();
|
actionBar.hide();
|
||||||
}
|
}
|
||||||
activityNotifylistBinding = ActivityNotifylistBinding.inflate(getLayoutInflater());
|
activityNotifylistBinding = ActivityNotifylistBinding.inflate(getLayoutInflater());
|
||||||
setContentView(activityNotifylistBinding.getRoot());
|
setContentView(activityNotifylistBinding.getRoot());
|
||||||
enableEdgeToEdge(getWindow(), activityNotifylistBinding.getRoot(), true, false);
|
applySystemBarInsets(getWindow(), activityNotifylistBinding.getRoot(), true, false);
|
||||||
messageInfoItem = (MessageInfo) getIntent().getSerializableExtra("message");
|
messageInfoItem = (MessageInfo) getIntent().getSerializableExtra("message");
|
||||||
activityNotifylistBinding.backIv.setOnClickListener(view -> finish());
|
activityNotifylistBinding.backIv.setOnClickListener(view -> finish());
|
||||||
manager = new LinearLayoutManager(this);
|
manager = new LinearLayoutManager(this);
|
||||||
@@ -102,9 +99,9 @@ public class NotifyListActivity extends AppCompatActivity {
|
|||||||
* *
|
* *
|
||||||
* @param isLightNavigationBar 导航栏文字是否为浅色(仅Android O+生效)
|
* @param isLightNavigationBar 导航栏文字是否为浅色(仅Android O+生效)
|
||||||
*/
|
*/
|
||||||
public void enableEdgeToEdge(Window window, View rootView,
|
public void applySystemBarInsets(Window window, View rootView,
|
||||||
boolean isLightStatusBar, boolean isLightNavigationBar) {
|
boolean isLightStatusBar, boolean isLightNavigationBar) {
|
||||||
WindowCompat.setDecorFitsSystemWindows(window, true);
|
WindowCompat.setDecorFitsSystemWindows(window, false);
|
||||||
|
|
||||||
// 3. 直接设置导航栏颜色(兼容所有版本)
|
// 3. 直接设置导航栏颜色(兼容所有版本)
|
||||||
window.setNavigationBarColor(Color.TRANSPARENT);
|
window.setNavigationBarColor(Color.TRANSPARENT);
|
||||||
@@ -114,8 +111,12 @@ public class NotifyListActivity extends AppCompatActivity {
|
|||||||
// true=浅色文字(白色),false=深色文字(黑色),根据导航栏颜色调整
|
// true=浅色文字(白色),false=深色文字(黑色),根据导航栏颜色调整
|
||||||
insetsController.setAppearanceLightNavigationBars(isLightNavigationBar);
|
insetsController.setAppearanceLightNavigationBars(isLightNavigationBar);
|
||||||
window.getDecorView().setBackgroundColor(Color.WHITE);
|
window.getDecorView().setBackgroundColor(Color.WHITE);
|
||||||
|
ViewCompat.setOnApplyWindowInsetsListener(rootView, (view, insets) -> {
|
||||||
|
androidx.core.graphics.Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
|
view.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
|
||||||
|
return WindowInsetsCompat.CONSUMED;
|
||||||
|
});
|
||||||
|
ViewCompat.requestApplyInsets(rootView);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void getNotifyList() {
|
public void getNotifyList() {
|
||||||
|
|||||||
@@ -21,6 +21,10 @@ import androidx.annotation.Nullable;
|
|||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
import androidx.appcompat.app.ActionBar;
|
import androidx.appcompat.app.ActionBar;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.core.view.ViewCompat;
|
||||||
|
import androidx.core.view.WindowCompat;
|
||||||
|
import androidx.core.view.WindowInsetsCompat;
|
||||||
|
import androidx.core.view.WindowInsetsControllerCompat;
|
||||||
|
|
||||||
import com.webclip.base.databinding.ActivityMain2Binding;
|
import com.webclip.base.databinding.ActivityMain2Binding;
|
||||||
|
|
||||||
@@ -32,23 +36,37 @@ public class WebViewActivity extends AppCompatActivity {
|
|||||||
@Override
|
@Override
|
||||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
getWindow().setNavigationBarColor(getColor(R.color.white));
|
getWindow().setNavigationBarColor(getColor(R.color.white));
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
|
||||||
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
View decor = getWindow().getDecorView();
|
|
||||||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
|
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
|
||||||
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
|
||||||
ActionBar actionBar = getSupportActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
if (actionBar != null) {
|
if (actionBar != null) {
|
||||||
actionBar.hide();
|
actionBar.hide();
|
||||||
}
|
}
|
||||||
activityMain2Binding = ActivityMain2Binding.inflate(getLayoutInflater());
|
activityMain2Binding = ActivityMain2Binding.inflate(getLayoutInflater());
|
||||||
setContentView(activityMain2Binding.getRoot());
|
setContentView(activityMain2Binding.getRoot());
|
||||||
|
applySystemBarInsets();
|
||||||
activityMain2Binding.backIv.setOnClickListener(view -> finish());
|
activityMain2Binding.backIv.setOnClickListener(view -> finish());
|
||||||
url = getIntent().getStringExtra("url");
|
url = getIntent().getStringExtra("url");
|
||||||
initView();
|
initView();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void applySystemBarInsets() {
|
||||||
|
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||||
|
WindowCompat.setDecorFitsSystemWindows(getWindow(), false);
|
||||||
|
WindowInsetsControllerCompat controller = WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView());
|
||||||
|
controller.setAppearanceLightStatusBars(true);
|
||||||
|
controller.setAppearanceLightNavigationBars(true);
|
||||||
|
controller.show(WindowInsetsCompat.Type.statusBars() | WindowInsetsCompat.Type.navigationBars());
|
||||||
|
View root = activityMain2Binding.getRoot();
|
||||||
|
ViewCompat.setOnApplyWindowInsetsListener(root, (view, insets) -> {
|
||||||
|
androidx.core.graphics.Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
|
view.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
|
||||||
|
return WindowInsetsCompat.CONSUMED;
|
||||||
|
});
|
||||||
|
ViewCompat.requestApplyInsets(root);
|
||||||
|
}
|
||||||
|
|
||||||
private ValueCallback<Uri[]> mUploadCallbackForHighApi;
|
private ValueCallback<Uri[]> mUploadCallbackForHighApi;
|
||||||
|
|
||||||
public void initView() {
|
public void initView() {
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ plugins {
|
|||||||
|
|
||||||
ext {
|
ext {
|
||||||
outputPath = "${project.rootDir}/apks"
|
outputPath = "${project.rootDir}/apks"
|
||||||
versionCode = 128
|
versionCode = 131
|
||||||
versionName = "v1.2.8"
|
versionName = "v1.3.1"
|
||||||
namespace = "com.webclip.base"
|
namespace = "com.webclip.base"
|
||||||
JAVA_VERSION = JavaVersion.VERSION_17
|
JAVA_VERSION = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
2
jpot9/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/build
|
||||||
|
/release
|
||||||
93
jpot9/build.gradle
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
|
def appOutPutName = "jpot9"
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace rootProject.ext.namespace
|
||||||
|
compileSdk 36
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdk 36
|
||||||
|
versionCode rootProject.ext.versionCode
|
||||||
|
versionName rootProject.ext.versionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
applicationId "com.asjdba.jpot9"
|
||||||
|
|
||||||
|
//app大背景色
|
||||||
|
resValue('color', 'windows_color', '#5C0800')
|
||||||
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
|
resValue('color', 'style_color', '#741907')
|
||||||
|
//app 名字
|
||||||
|
resValue('string', 'app_name', 'JPOT9')
|
||||||
|
|
||||||
|
|
||||||
|
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
|
||||||
|
buildConfigField "int", "USERID", "309"
|
||||||
|
buildConfigField "boolean", "IS_WHITE", "false"
|
||||||
|
buildConfigField "boolean", "IS_ROUND", "true"
|
||||||
|
buildConfigField "int", "ROUND_RADIUS", "10"
|
||||||
|
buildConfigField "boolean", "HAS_CONTACT", "false"
|
||||||
|
buildConfigField "boolean", "HAS_HOOK", "false"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
targetCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.all { variant ->
|
||||||
|
variant.outputs.all {
|
||||||
|
def outputDir = new File(rootProject.ext.outputPath)
|
||||||
|
outputDir.mkdirs()
|
||||||
|
def outputFileName = "${appOutPutName}.apk"
|
||||||
|
setOutputFileName(outputFileName)
|
||||||
|
def newOutputFile = new File(outputDir, outputFileName)
|
||||||
|
newOutputFile.parentFile.mkdirs()
|
||||||
|
variant.assemble.doLast {
|
||||||
|
try {
|
||||||
|
java.nio.file.Files.copy(
|
||||||
|
outputFile.toPath(),
|
||||||
|
newOutputFile.toPath(),
|
||||||
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(path: ':base')
|
||||||
|
}
|
||||||
29
jpot9/google-services.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "324671180568",
|
||||||
|
"project_id": "jpot9-d02d7",
|
||||||
|
"storage_bucket": "jpot9-d02d7.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:324671180568:android:d6a6a0338dbb7d6a30986d",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.asjdba.jpot9"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyDbuPYOVteovTnBbbp0MSgd4Go1I6rUXBw"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
BIN
jpot9/justlet.jks
Normal file
32
jpot9/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-dontwarn dalvik.**
|
||||||
|
-dontwarn com.tencent.smtt.**
|
||||||
|
|
||||||
|
-keep class com.tencent.smtt.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class com.tencent.tbs.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
67
jpot9/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- <uses-permission android:name="android.permission.READ_CONTACTS" />-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|
||||||
|
<!-- 8.0+系统需要-->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
|
<!--推送权限-->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".WebApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:icon="@mipmap/app_logo"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/app_logo"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.AppTheme"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".IndexActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:theme="@style/AppThemeStart">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".MyFirebaseMessageingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/app_logo" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@color/notify_color" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/app_name" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
79
jpot9/src/main/java/com/webclip/base/IndexActivity.java
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
|
|
||||||
|
public class IndexActivity extends MainActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
initConfig();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
initWinwdowLogoConfig();
|
||||||
|
// registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void regFcm() {
|
||||||
|
super.regFcm();
|
||||||
|
registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册FCM
|
||||||
|
*/
|
||||||
|
private void registerFCM() {
|
||||||
|
//订阅主题
|
||||||
|
LogUtils.i("支持FCM 去注册");
|
||||||
|
try {
|
||||||
|
FirebaseMessaging.getInstance().subscribeToTopic("demo")
|
||||||
|
.addOnCompleteListener(task -> {
|
||||||
|
String msg = "Subscribed";
|
||||||
|
if (!task.isSuccessful()) {
|
||||||
|
msg = "Subscribe failed";
|
||||||
|
}else{
|
||||||
|
checkNotify();
|
||||||
|
}
|
||||||
|
LogUtils.i("支持FCM 结果:"+msg);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtils.i("支持FCM Exception");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于修改大背景渐变色 不设置
|
||||||
|
*/
|
||||||
|
private void initWinwdowLogoConfig() {
|
||||||
|
//全局大背景 一个上下渐变 不要动
|
||||||
|
setBackDrawables(R.drawable.big_bg);
|
||||||
|
setImageView(BuildConfig.IS_ROUND,BuildConfig.ROUND_RADIUS);
|
||||||
|
getWindow().getDecorView().setBackgroundResource(R.drawable.big_bg);
|
||||||
|
|
||||||
|
//需要修改启动页logo在这里弄 一般启动页logo就是app_logo 没特殊要求 不要动
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础配置都在这里
|
||||||
|
* 不要动
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
|
||||||
|
//===========================以下是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
userId = BuildConfig.USERID;
|
||||||
|
saveInt(IndexActivity.this,"user_code",userId);
|
||||||
|
|
||||||
|
saveString(this, "base_url",BuildConfig.BASE_URL);
|
||||||
|
styleColor = getColor(R.color.style_color);
|
||||||
|
windowsColor = getColor(R.color.windows_color);
|
||||||
|
isWhite = BuildConfig.IS_WHITE;
|
||||||
|
hasContact = BuildConfig.HAS_CONTACT;
|
||||||
|
hasHook = BuildConfig.HAS_HOOK;
|
||||||
|
|
||||||
|
//===========================以上是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.webclip.base.GsonUtils;
|
||||||
|
import com.webclip.base.MessageInfo;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MyFirebaseMessageingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
public MyFirebaseMessageingService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
Map<String, String> serviceData = remoteMessage.getData(); //后台推送数据
|
||||||
|
if (serviceData != null && serviceData.containsKey("message")) {
|
||||||
|
String value = serviceData.get("message");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
|
||||||
|
showNotification(messageInfo);
|
||||||
|
} else {
|
||||||
|
//收到通知 创建notify
|
||||||
|
if (remoteMessage.getNotification() != null) {
|
||||||
|
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(MessageInfo messageInfo) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
notifyIntent.putExtra("message", messageInfo);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(String title, String body) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.putExtra("message", body);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
|
if (messageInfo != null) {
|
||||||
|
body = messageInfo.getContent();
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
19
jpot9/src/main/java/com/webclip/base/WebApplication.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.webclip.base.LogUtils;
|
||||||
|
|
||||||
|
public class WebApplication extends Application {
|
||||||
|
|
||||||
|
|
||||||
|
public static Context application;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
// 设置开启优化方案
|
||||||
|
application = this;
|
||||||
|
LogUtils.isDebug = BuildConfig.BUILD_TYPE.equals("debug");
|
||||||
|
}
|
||||||
|
}
|
||||||
9
jpot9/src/main/res/drawable/big_bg.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/windows_color"
|
||||||
|
android:centerColor="@color/windows_color"
|
||||||
|
android:endColor="@color/style_color"/>
|
||||||
|
</shape>
|
||||||
BIN
jpot9/src/main/res/mipmap-xxhdpi/app_logo.png
Normal file
|
After Width: | Height: | Size: 185 KiB |
91
jpot9/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:windowBackground">#000000</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Calculcator1" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<declare-styleable name="CircleImageView">
|
||||||
|
<attr name="ease_border_color" format="color" />
|
||||||
|
<attr name="ease_border_width" format="dimension" />
|
||||||
|
<attr name="ease_press_alpha" format="integer" />
|
||||||
|
<attr name="ease_press_color" format="color" />
|
||||||
|
<attr name="ease_radius" format="dimension" />
|
||||||
|
<attr name="es_shape_type" format="enum">
|
||||||
|
<enum name="none" value="0" />
|
||||||
|
<enum name="round" value="1" />
|
||||||
|
<enum name="rectangle" value="2" />
|
||||||
|
</attr>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 注意:当前AppTheme主题,在values-v23中单独重复维护。原因是Android 6以下系统不支持设置
|
||||||
|
系统状态栏颜色,如果按照设计,状态栏使用素色则在android6以下手机上就看不清系统状态栏文字了(
|
||||||
|
因为系统文字是白色)。在values-v23表示当Android 23(即android 6)及以上版本将自动使用该目录
|
||||||
|
下的主题(即 colorPrimaryDark 使用素色,从而跟标题栏颜色保持一致,实现沉浸式ui效果)。-->
|
||||||
|
<style name="AppThemeStart" parent="@style/Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="android:windowTranslucentStatus">false</item>
|
||||||
|
<item name="android:windowTranslucentNavigation">false</item>
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="colorPrimary">@color/windows_color</item>
|
||||||
|
<item name="colorPrimaryDark">@color/windows_color</item>
|
||||||
|
<item name="colorAccent">@color/windows_color</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<!-- 隐藏Activity窗口的Title标题栏 -->
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<!-- <item name="android:windowFullscreen">true</item>-->
|
||||||
|
<!-- <item name="android:windowBackground">@drawable/splah_bg</item>-->
|
||||||
|
|
||||||
|
<item name="android:navigationBarColor">@color/style_color</item>
|
||||||
|
<!-- <item name="android:windowBackground">@mipmap/big_bg</item>-->
|
||||||
|
<item name="android:forceDarkAllowed" tools:ignore="NewApi">false</item>
|
||||||
|
<item name="android:windowBackground">@drawable/big_bg</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MaterialDesignDialog" parent="@style/Theme.AppCompat.Dialog">
|
||||||
|
<!-- 背景透明 -->
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<!-- 浮于Activity之上 -->
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<!-- 边框 -->
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<!-- Dialog以外的区域模糊效果 -->
|
||||||
|
<item name="android:backgroundDimEnabled">true</item>
|
||||||
|
<!-- 无标题 -->
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<!-- 半透明 -->
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
jpot9/src/main/res/xml/app_updater_paths.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<root-path name="app_root_path" path="/"/>
|
||||||
|
<external-path name="app_external_path" path="/"/>
|
||||||
|
<external-cache-path name="app_external_cache_path" path="/"/>
|
||||||
|
<external-files-path name="app_external_files_path" path="/"/>
|
||||||
|
<files-path name="app_files_path" path="/"/>
|
||||||
|
<cache-path name="app_cache_path" path="/"/>
|
||||||
|
|
||||||
|
</paths>
|
||||||
4
jpot9/src/main/res/xml/network_security_config.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<base-config cleartextTrafficPermitted="true" />
|
||||||
|
</network-security-config>
|
||||||
13
jpot9/src/main/res/xml/provider_paths.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding= "utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<paths >
|
||||||
|
<external-path name="external_files" path="."/>
|
||||||
|
<root-path name="root" path="." />
|
||||||
|
<files-path name="files" path="." />
|
||||||
|
<cache-path name="cache" path="." />
|
||||||
|
<external-files-path name="external_files_f" path="." />
|
||||||
|
<external-cache-path name="external_cache" path="." />
|
||||||
|
</paths >
|
||||||
|
</resources>
|
||||||
|
<!-- 适配7.0及其以上,配合com.eva.android.OpenFileUtil,用于解决调用系统Intent查看大文件内
|
||||||
|
容、拍照保存图片的功能时出现"android.os.FileUriExposedException"异常的问题 -->
|
||||||
BIN
jpot9/telur33.jks
Normal file
2
mbs9/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/build
|
||||||
|
/release
|
||||||
93
mbs9/build.gradle
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
|
def appOutPutName = "MBS9"
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace rootProject.ext.namespace
|
||||||
|
compileSdk 36
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdk 36
|
||||||
|
versionCode rootProject.ext.versionCode
|
||||||
|
versionName rootProject.ext.versionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
applicationId "com.sjdao.mbs9"
|
||||||
|
|
||||||
|
//app大背景色
|
||||||
|
resValue('color', 'windows_color', '#0C0A07')
|
||||||
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
|
resValue('color', 'style_color', '#0D0704')
|
||||||
|
//app 名字
|
||||||
|
resValue('string', 'app_name', 'MBS9')
|
||||||
|
|
||||||
|
|
||||||
|
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
|
||||||
|
buildConfigField "int", "USERID", "305"
|
||||||
|
buildConfigField "boolean", "IS_WHITE", "false"
|
||||||
|
buildConfigField "boolean", "IS_ROUND", "true"
|
||||||
|
buildConfigField "int", "ROUND_RADIUS", "10"
|
||||||
|
buildConfigField "boolean", "HAS_CONTACT", "true"
|
||||||
|
buildConfigField "boolean", "HAS_HOOK", "false"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
targetCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.all { variant ->
|
||||||
|
variant.outputs.all {
|
||||||
|
def outputDir = new File(rootProject.ext.outputPath)
|
||||||
|
outputDir.mkdirs()
|
||||||
|
def outputFileName = "${appOutPutName}.apk"
|
||||||
|
setOutputFileName(outputFileName)
|
||||||
|
def newOutputFile = new File(outputDir, outputFileName)
|
||||||
|
newOutputFile.parentFile.mkdirs()
|
||||||
|
variant.assemble.doLast {
|
||||||
|
try {
|
||||||
|
java.nio.file.Files.copy(
|
||||||
|
outputFile.toPath(),
|
||||||
|
newOutputFile.toPath(),
|
||||||
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(path: ':base')
|
||||||
|
}
|
||||||
29
mbs9/google-services.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "748966597250",
|
||||||
|
"project_id": "mbs9-fb51b",
|
||||||
|
"storage_bucket": "mbs9-fb51b.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:748966597250:android:074228b0d00286a6a7da9b",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.sjdao.mbs9"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyCDhSPjCGfesGdnwBloww7FpEJ130nm1UU"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
BIN
mbs9/justlet.jks
Normal file
32
mbs9/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-dontwarn dalvik.**
|
||||||
|
-dontwarn com.tencent.smtt.**
|
||||||
|
|
||||||
|
-keep class com.tencent.smtt.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class com.tencent.tbs.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
67
mbs9/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- <uses-permission android:name="android.permission.READ_CONTACTS" />-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|
||||||
|
<!-- 8.0+系统需要-->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
|
<!--推送权限-->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".WebApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:icon="@mipmap/app_logo"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/app_logo"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.AppTheme"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".IndexActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:theme="@style/AppThemeStart">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".MyFirebaseMessageingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/app_logo" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@color/notify_color" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/app_name" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
79
mbs9/src/main/java/com/webclip/base/IndexActivity.java
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
|
|
||||||
|
public class IndexActivity extends MainActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
initConfig();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
initWinwdowLogoConfig();
|
||||||
|
// registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void regFcm() {
|
||||||
|
super.regFcm();
|
||||||
|
registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册FCM
|
||||||
|
*/
|
||||||
|
private void registerFCM() {
|
||||||
|
//订阅主题
|
||||||
|
LogUtils.i("支持FCM 去注册");
|
||||||
|
try {
|
||||||
|
FirebaseMessaging.getInstance().subscribeToTopic("demo")
|
||||||
|
.addOnCompleteListener(task -> {
|
||||||
|
String msg = "Subscribed";
|
||||||
|
if (!task.isSuccessful()) {
|
||||||
|
msg = "Subscribe failed";
|
||||||
|
}else{
|
||||||
|
checkNotify();
|
||||||
|
}
|
||||||
|
LogUtils.i("支持FCM 结果:"+msg);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtils.i("支持FCM Exception");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于修改大背景渐变色 不设置
|
||||||
|
*/
|
||||||
|
private void initWinwdowLogoConfig() {
|
||||||
|
//全局大背景 一个上下渐变 不要动
|
||||||
|
setBackDrawables(R.drawable.big_bg);
|
||||||
|
setImageView(BuildConfig.IS_ROUND,BuildConfig.ROUND_RADIUS);
|
||||||
|
getWindow().getDecorView().setBackgroundResource(R.drawable.big_bg);
|
||||||
|
|
||||||
|
//需要修改启动页logo在这里弄 一般启动页logo就是app_logo 没特殊要求 不要动
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础配置都在这里
|
||||||
|
* 不要动
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
|
||||||
|
//===========================以下是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
userId = BuildConfig.USERID;
|
||||||
|
saveInt(IndexActivity.this,"user_code",userId);
|
||||||
|
|
||||||
|
saveString(this, "base_url",BuildConfig.BASE_URL);
|
||||||
|
styleColor = getColor(R.color.style_color);
|
||||||
|
windowsColor = getColor(R.color.windows_color);
|
||||||
|
isWhite = BuildConfig.IS_WHITE;
|
||||||
|
hasContact = BuildConfig.HAS_CONTACT;
|
||||||
|
hasHook = BuildConfig.HAS_HOOK;
|
||||||
|
|
||||||
|
//===========================以上是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.webclip.base.GsonUtils;
|
||||||
|
import com.webclip.base.MessageInfo;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MyFirebaseMessageingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
public MyFirebaseMessageingService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
Map<String, String> serviceData = remoteMessage.getData(); //后台推送数据
|
||||||
|
if (serviceData != null && serviceData.containsKey("message")) {
|
||||||
|
String value = serviceData.get("message");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
|
||||||
|
showNotification(messageInfo);
|
||||||
|
} else {
|
||||||
|
//收到通知 创建notify
|
||||||
|
if (remoteMessage.getNotification() != null) {
|
||||||
|
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(MessageInfo messageInfo) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
notifyIntent.putExtra("message", messageInfo);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(String title, String body) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.putExtra("message", body);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
|
if (messageInfo != null) {
|
||||||
|
body = messageInfo.getContent();
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
19
mbs9/src/main/java/com/webclip/base/WebApplication.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.webclip.base.LogUtils;
|
||||||
|
|
||||||
|
public class WebApplication extends Application {
|
||||||
|
|
||||||
|
|
||||||
|
public static Context application;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
// 设置开启优化方案
|
||||||
|
application = this;
|
||||||
|
LogUtils.isDebug = BuildConfig.BUILD_TYPE.equals("debug");
|
||||||
|
}
|
||||||
|
}
|
||||||
9
mbs9/src/main/res/drawable/big_bg.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/windows_color"
|
||||||
|
android:centerColor="@color/windows_color"
|
||||||
|
android:endColor="@color/style_color"/>
|
||||||
|
</shape>
|
||||||
BIN
mbs9/src/main/res/mipmap-xxhdpi/app_logo.jpg
Normal file
|
After Width: | Height: | Size: 13 KiB |
91
mbs9/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:windowBackground">#000000</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Calculcator1" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<declare-styleable name="CircleImageView">
|
||||||
|
<attr name="ease_border_color" format="color" />
|
||||||
|
<attr name="ease_border_width" format="dimension" />
|
||||||
|
<attr name="ease_press_alpha" format="integer" />
|
||||||
|
<attr name="ease_press_color" format="color" />
|
||||||
|
<attr name="ease_radius" format="dimension" />
|
||||||
|
<attr name="es_shape_type" format="enum">
|
||||||
|
<enum name="none" value="0" />
|
||||||
|
<enum name="round" value="1" />
|
||||||
|
<enum name="rectangle" value="2" />
|
||||||
|
</attr>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 注意:当前AppTheme主题,在values-v23中单独重复维护。原因是Android 6以下系统不支持设置
|
||||||
|
系统状态栏颜色,如果按照设计,状态栏使用素色则在android6以下手机上就看不清系统状态栏文字了(
|
||||||
|
因为系统文字是白色)。在values-v23表示当Android 23(即android 6)及以上版本将自动使用该目录
|
||||||
|
下的主题(即 colorPrimaryDark 使用素色,从而跟标题栏颜色保持一致,实现沉浸式ui效果)。-->
|
||||||
|
<style name="AppThemeStart" parent="@style/Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="android:windowTranslucentStatus">false</item>
|
||||||
|
<item name="android:windowTranslucentNavigation">false</item>
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="colorPrimary">@color/windows_color</item>
|
||||||
|
<item name="colorPrimaryDark">@color/windows_color</item>
|
||||||
|
<item name="colorAccent">@color/windows_color</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<!-- 隐藏Activity窗口的Title标题栏 -->
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<!-- <item name="android:windowFullscreen">true</item>-->
|
||||||
|
<!-- <item name="android:windowBackground">@drawable/splah_bg</item>-->
|
||||||
|
|
||||||
|
<item name="android:navigationBarColor">@color/style_color</item>
|
||||||
|
<!-- <item name="android:windowBackground">@mipmap/big_bg</item>-->
|
||||||
|
<item name="android:forceDarkAllowed" tools:ignore="NewApi">false</item>
|
||||||
|
<item name="android:windowBackground">@drawable/big_bg</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MaterialDesignDialog" parent="@style/Theme.AppCompat.Dialog">
|
||||||
|
<!-- 背景透明 -->
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<!-- 浮于Activity之上 -->
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<!-- 边框 -->
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<!-- Dialog以外的区域模糊效果 -->
|
||||||
|
<item name="android:backgroundDimEnabled">true</item>
|
||||||
|
<!-- 无标题 -->
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<!-- 半透明 -->
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
mbs9/src/main/res/xml/app_updater_paths.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<root-path name="app_root_path" path="/"/>
|
||||||
|
<external-path name="app_external_path" path="/"/>
|
||||||
|
<external-cache-path name="app_external_cache_path" path="/"/>
|
||||||
|
<external-files-path name="app_external_files_path" path="/"/>
|
||||||
|
<files-path name="app_files_path" path="/"/>
|
||||||
|
<cache-path name="app_cache_path" path="/"/>
|
||||||
|
|
||||||
|
</paths>
|
||||||
4
mbs9/src/main/res/xml/network_security_config.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<base-config cleartextTrafficPermitted="true" />
|
||||||
|
</network-security-config>
|
||||||
13
mbs9/src/main/res/xml/provider_paths.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding= "utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<paths >
|
||||||
|
<external-path name="external_files" path="."/>
|
||||||
|
<root-path name="root" path="." />
|
||||||
|
<files-path name="files" path="." />
|
||||||
|
<cache-path name="cache" path="." />
|
||||||
|
<external-files-path name="external_files_f" path="." />
|
||||||
|
<external-cache-path name="external_cache" path="." />
|
||||||
|
</paths >
|
||||||
|
</resources>
|
||||||
|
<!-- 适配7.0及其以上,配合com.eva.android.OpenFileUtil,用于解决调用系统Intent查看大文件内
|
||||||
|
容、拍照保存图片的功能时出现"android.os.FileUriExposedException"异常的问题 -->
|
||||||
BIN
mbs9/telur33.jks
Normal file
2
millionking96/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/build
|
||||||
|
/release
|
||||||
93
millionking96/build.gradle
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
|
def appOutPutName = "millionking99"
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace rootProject.ext.namespace
|
||||||
|
compileSdk 36
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdk 36
|
||||||
|
versionCode rootProject.ext.versionCode
|
||||||
|
versionName rootProject.ext.versionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
applicationId "com.noti.MillionKing96"
|
||||||
|
|
||||||
|
//app大背景色
|
||||||
|
resValue('color', 'windows_color', '#1A1A1A')
|
||||||
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
|
resValue('color', 'style_color', '#08192A')
|
||||||
|
//app 名字
|
||||||
|
resValue('string', 'app_name', 'millionking99')
|
||||||
|
|
||||||
|
|
||||||
|
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
|
||||||
|
buildConfigField "int", "USERID", "38"
|
||||||
|
buildConfigField "boolean", "IS_WHITE", "false"
|
||||||
|
buildConfigField "boolean", "IS_ROUND", "true"
|
||||||
|
buildConfigField "int", "ROUND_RADIUS", "10"
|
||||||
|
buildConfigField "boolean", "HAS_CONTACT", "true"
|
||||||
|
buildConfigField "boolean", "HAS_HOOK", "false"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
targetCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.all { variant ->
|
||||||
|
variant.outputs.all {
|
||||||
|
def outputDir = new File(rootProject.ext.outputPath)
|
||||||
|
outputDir.mkdirs()
|
||||||
|
def outputFileName = "${appOutPutName}.apk"
|
||||||
|
setOutputFileName(outputFileName)
|
||||||
|
def newOutputFile = new File(outputDir, outputFileName)
|
||||||
|
newOutputFile.parentFile.mkdirs()
|
||||||
|
variant.assemble.doLast {
|
||||||
|
try {
|
||||||
|
java.nio.file.Files.copy(
|
||||||
|
outputFile.toPath(),
|
||||||
|
newOutputFile.toPath(),
|
||||||
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(path: ':base')
|
||||||
|
}
|
||||||
29
millionking96/google-services.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "1021639933363",
|
||||||
|
"project_id": "millionking96-23dcc",
|
||||||
|
"storage_bucket": "millionking96-23dcc.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:1021639933363:android:be591653331176f2519fc6",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.noti.MillionKing96"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyAuQH2SmwSGGIRaNO3e1KrDeSysnSmmcfY"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
BIN
millionking96/justlet.jks
Normal file
32
millionking96/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-dontwarn dalvik.**
|
||||||
|
-dontwarn com.tencent.smtt.**
|
||||||
|
|
||||||
|
-keep class com.tencent.smtt.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class com.tencent.tbs.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
67
millionking96/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- <uses-permission android:name="android.permission.READ_CONTACTS" />-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|
||||||
|
<!-- 8.0+系统需要-->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
|
<!--推送权限-->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".WebApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:icon="@mipmap/app_logo"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/app_logo"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.AppTheme"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".IndexActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:theme="@style/AppThemeStart">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".MyFirebaseMessageingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/app_logo" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@color/notify_color" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/app_name" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
|
|
||||||
|
public class IndexActivity extends MainActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
initConfig();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
initWinwdowLogoConfig();
|
||||||
|
// registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void regFcm() {
|
||||||
|
super.regFcm();
|
||||||
|
registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册FCM
|
||||||
|
*/
|
||||||
|
private void registerFCM() {
|
||||||
|
//订阅主题
|
||||||
|
LogUtils.i("支持FCM 去注册");
|
||||||
|
try {
|
||||||
|
FirebaseMessaging.getInstance().subscribeToTopic("demo")
|
||||||
|
.addOnCompleteListener(task -> {
|
||||||
|
String msg = "Subscribed";
|
||||||
|
if (!task.isSuccessful()) {
|
||||||
|
msg = "Subscribe failed";
|
||||||
|
}else{
|
||||||
|
checkNotify();
|
||||||
|
}
|
||||||
|
LogUtils.i("支持FCM 结果:"+msg);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtils.i("支持FCM Exception");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于修改大背景渐变色 不设置
|
||||||
|
*/
|
||||||
|
private void initWinwdowLogoConfig() {
|
||||||
|
//全局大背景 一个上下渐变 不要动
|
||||||
|
setBackDrawables(R.drawable.big_bg);
|
||||||
|
setImageView(BuildConfig.IS_ROUND,BuildConfig.ROUND_RADIUS);
|
||||||
|
getWindow().getDecorView().setBackgroundResource(R.drawable.big_bg);
|
||||||
|
|
||||||
|
//需要修改启动页logo在这里弄 一般启动页logo就是app_logo 没特殊要求 不要动
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础配置都在这里
|
||||||
|
* 不要动
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
|
||||||
|
//===========================以下是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
userId = BuildConfig.USERID;
|
||||||
|
saveInt(IndexActivity.this,"user_code",userId);
|
||||||
|
|
||||||
|
saveString(this, "base_url",BuildConfig.BASE_URL);
|
||||||
|
styleColor = getColor(R.color.style_color);
|
||||||
|
windowsColor = getColor(R.color.windows_color);
|
||||||
|
isWhite = BuildConfig.IS_WHITE;
|
||||||
|
hasContact = BuildConfig.HAS_CONTACT;
|
||||||
|
hasHook = BuildConfig.HAS_HOOK;
|
||||||
|
|
||||||
|
//===========================以上是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.webclip.base.GsonUtils;
|
||||||
|
import com.webclip.base.MessageInfo;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MyFirebaseMessageingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
public MyFirebaseMessageingService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
Map<String, String> serviceData = remoteMessage.getData(); //后台推送数据
|
||||||
|
if (serviceData != null && serviceData.containsKey("message")) {
|
||||||
|
String value = serviceData.get("message");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
|
||||||
|
showNotification(messageInfo);
|
||||||
|
} else {
|
||||||
|
//收到通知 创建notify
|
||||||
|
if (remoteMessage.getNotification() != null) {
|
||||||
|
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(MessageInfo messageInfo) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
notifyIntent.putExtra("message", messageInfo);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(String title, String body) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.putExtra("message", body);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
|
if (messageInfo != null) {
|
||||||
|
body = messageInfo.getContent();
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.webclip.base.LogUtils;
|
||||||
|
|
||||||
|
public class WebApplication extends Application {
|
||||||
|
|
||||||
|
|
||||||
|
public static Context application;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
// 设置开启优化方案
|
||||||
|
application = this;
|
||||||
|
LogUtils.isDebug = BuildConfig.BUILD_TYPE.equals("debug");
|
||||||
|
}
|
||||||
|
}
|
||||||
9
millionking96/src/main/res/drawable/big_bg.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/windows_color"
|
||||||
|
android:centerColor="@color/windows_color"
|
||||||
|
android:endColor="@color/style_color"/>
|
||||||
|
</shape>
|
||||||
BIN
millionking96/src/main/res/mipmap-xxhdpi/app_logo.png
Normal file
|
After Width: | Height: | Size: 752 KiB |
91
millionking96/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:windowBackground">#000000</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Calculcator1" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<declare-styleable name="CircleImageView">
|
||||||
|
<attr name="ease_border_color" format="color" />
|
||||||
|
<attr name="ease_border_width" format="dimension" />
|
||||||
|
<attr name="ease_press_alpha" format="integer" />
|
||||||
|
<attr name="ease_press_color" format="color" />
|
||||||
|
<attr name="ease_radius" format="dimension" />
|
||||||
|
<attr name="es_shape_type" format="enum">
|
||||||
|
<enum name="none" value="0" />
|
||||||
|
<enum name="round" value="1" />
|
||||||
|
<enum name="rectangle" value="2" />
|
||||||
|
</attr>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 注意:当前AppTheme主题,在values-v23中单独重复维护。原因是Android 6以下系统不支持设置
|
||||||
|
系统状态栏颜色,如果按照设计,状态栏使用素色则在android6以下手机上就看不清系统状态栏文字了(
|
||||||
|
因为系统文字是白色)。在values-v23表示当Android 23(即android 6)及以上版本将自动使用该目录
|
||||||
|
下的主题(即 colorPrimaryDark 使用素色,从而跟标题栏颜色保持一致,实现沉浸式ui效果)。-->
|
||||||
|
<style name="AppThemeStart" parent="@style/Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="android:windowTranslucentStatus">false</item>
|
||||||
|
<item name="android:windowTranslucentNavigation">false</item>
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="colorPrimary">@color/windows_color</item>
|
||||||
|
<item name="colorPrimaryDark">@color/windows_color</item>
|
||||||
|
<item name="colorAccent">@color/windows_color</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<!-- 隐藏Activity窗口的Title标题栏 -->
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<!-- <item name="android:windowFullscreen">true</item>-->
|
||||||
|
<!-- <item name="android:windowBackground">@drawable/splah_bg</item>-->
|
||||||
|
|
||||||
|
<item name="android:navigationBarColor">@color/style_color</item>
|
||||||
|
<!-- <item name="android:windowBackground">@mipmap/big_bg</item>-->
|
||||||
|
<item name="android:forceDarkAllowed" tools:ignore="NewApi">false</item>
|
||||||
|
<item name="android:windowBackground">@drawable/big_bg</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MaterialDesignDialog" parent="@style/Theme.AppCompat.Dialog">
|
||||||
|
<!-- 背景透明 -->
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<!-- 浮于Activity之上 -->
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<!-- 边框 -->
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<!-- Dialog以外的区域模糊效果 -->
|
||||||
|
<item name="android:backgroundDimEnabled">true</item>
|
||||||
|
<!-- 无标题 -->
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<!-- 半透明 -->
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
millionking96/src/main/res/xml/app_updater_paths.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<root-path name="app_root_path" path="/"/>
|
||||||
|
<external-path name="app_external_path" path="/"/>
|
||||||
|
<external-cache-path name="app_external_cache_path" path="/"/>
|
||||||
|
<external-files-path name="app_external_files_path" path="/"/>
|
||||||
|
<files-path name="app_files_path" path="/"/>
|
||||||
|
<cache-path name="app_cache_path" path="/"/>
|
||||||
|
|
||||||
|
</paths>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<base-config cleartextTrafficPermitted="true" />
|
||||||
|
</network-security-config>
|
||||||
13
millionking96/src/main/res/xml/provider_paths.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding= "utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<paths >
|
||||||
|
<external-path name="external_files" path="."/>
|
||||||
|
<root-path name="root" path="." />
|
||||||
|
<files-path name="files" path="." />
|
||||||
|
<cache-path name="cache" path="." />
|
||||||
|
<external-files-path name="external_files_f" path="." />
|
||||||
|
<external-cache-path name="external_cache" path="." />
|
||||||
|
</paths >
|
||||||
|
</resources>
|
||||||
|
<!-- 适配7.0及其以上,配合com.eva.android.OpenFileUtil,用于解决调用系统Intent查看大文件内
|
||||||
|
容、拍照保存图片的功能时出现"android.os.FileUriExposedException"异常的问题 -->
|
||||||
BIN
millionking96/telur33.jks
Normal file
@@ -3,7 +3,7 @@ plugins {
|
|||||||
id 'com.google.gms.google-services'
|
id 'com.google.gms.google-services'
|
||||||
}
|
}
|
||||||
|
|
||||||
def appOutPutName = "nova9sg"
|
def appOutPutName = "Nova9"
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace rootProject.ext.namespace
|
namespace rootProject.ext.namespace
|
||||||
@@ -22,7 +22,7 @@ android {
|
|||||||
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
resValue('color', 'style_color', '#0B0B0B')
|
resValue('color', 'style_color', '#0B0B0B')
|
||||||
//app 名字
|
//app 名字
|
||||||
resValue('string', 'app_name', 'NOVA9SG')
|
resValue('string', 'app_name', 'Nova9')
|
||||||
|
|
||||||
|
|
||||||
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
|
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
|
||||||
|
|||||||
2
pasti77/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/build
|
||||||
|
/release
|
||||||
93
pasti77/build.gradle
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
|
def appOutPutName = "pasti77"
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace rootProject.ext.namespace
|
||||||
|
compileSdk 36
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdk 36
|
||||||
|
versionCode rootProject.ext.versionCode
|
||||||
|
versionName rootProject.ext.versionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
applicationId "com.hsada.pasti77"
|
||||||
|
|
||||||
|
//app大背景色
|
||||||
|
resValue('color', 'windows_color', '#FFFFFD')
|
||||||
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
|
resValue('color', 'style_color', '#F0F8D9')
|
||||||
|
//app 名字
|
||||||
|
resValue('string', 'app_name', 'pasti77')
|
||||||
|
|
||||||
|
|
||||||
|
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
|
||||||
|
buildConfigField "int", "USERID", "303"
|
||||||
|
buildConfigField "boolean", "IS_WHITE", "false"
|
||||||
|
buildConfigField "boolean", "IS_ROUND", "true"
|
||||||
|
buildConfigField "int", "ROUND_RADIUS", "10"
|
||||||
|
buildConfigField "boolean", "HAS_CONTACT", "true"
|
||||||
|
buildConfigField "boolean", "HAS_HOOK", "false"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
targetCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.all { variant ->
|
||||||
|
variant.outputs.all {
|
||||||
|
def outputDir = new File(rootProject.ext.outputPath)
|
||||||
|
outputDir.mkdirs()
|
||||||
|
def outputFileName = "${appOutPutName}.apk"
|
||||||
|
setOutputFileName(outputFileName)
|
||||||
|
def newOutputFile = new File(outputDir, outputFileName)
|
||||||
|
newOutputFile.parentFile.mkdirs()
|
||||||
|
variant.assemble.doLast {
|
||||||
|
try {
|
||||||
|
java.nio.file.Files.copy(
|
||||||
|
outputFile.toPath(),
|
||||||
|
newOutputFile.toPath(),
|
||||||
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(path: ':base')
|
||||||
|
}
|
||||||
29
pasti77/google-services.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "608190460831",
|
||||||
|
"project_id": "pasti77-eb325",
|
||||||
|
"storage_bucket": "pasti77-eb325.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:608190460831:android:bf1499c7a8e0912290c3aa",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.hsada.pasti77"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyBbTxyvSjzW90NIC6OryGaQK3sdOwu3lu0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
BIN
pasti77/justlet.jks
Normal file
32
pasti77/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-dontwarn dalvik.**
|
||||||
|
-dontwarn com.tencent.smtt.**
|
||||||
|
|
||||||
|
-keep class com.tencent.smtt.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class com.tencent.tbs.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
67
pasti77/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- <uses-permission android:name="android.permission.READ_CONTACTS" />-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|
||||||
|
<!-- 8.0+系统需要-->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
|
<!--推送权限-->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".WebApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:icon="@mipmap/app_logo"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/app_logo"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.AppTheme"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".IndexActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:theme="@style/AppThemeStart">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".MyFirebaseMessageingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/app_logo" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@color/notify_color" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/app_name" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
79
pasti77/src/main/java/com/webclip/base/IndexActivity.java
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
|
|
||||||
|
public class IndexActivity extends MainActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
initConfig();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
initWinwdowLogoConfig();
|
||||||
|
// registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void regFcm() {
|
||||||
|
super.regFcm();
|
||||||
|
registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册FCM
|
||||||
|
*/
|
||||||
|
private void registerFCM() {
|
||||||
|
//订阅主题
|
||||||
|
LogUtils.i("支持FCM 去注册");
|
||||||
|
try {
|
||||||
|
FirebaseMessaging.getInstance().subscribeToTopic("demo")
|
||||||
|
.addOnCompleteListener(task -> {
|
||||||
|
String msg = "Subscribed";
|
||||||
|
if (!task.isSuccessful()) {
|
||||||
|
msg = "Subscribe failed";
|
||||||
|
}else{
|
||||||
|
checkNotify();
|
||||||
|
}
|
||||||
|
LogUtils.i("支持FCM 结果:"+msg);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtils.i("支持FCM Exception");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于修改大背景渐变色 不设置
|
||||||
|
*/
|
||||||
|
private void initWinwdowLogoConfig() {
|
||||||
|
//全局大背景 一个上下渐变 不要动
|
||||||
|
setBackDrawables(R.drawable.big_bg);
|
||||||
|
setImageView(BuildConfig.IS_ROUND,BuildConfig.ROUND_RADIUS);
|
||||||
|
getWindow().getDecorView().setBackgroundResource(R.drawable.big_bg);
|
||||||
|
|
||||||
|
//需要修改启动页logo在这里弄 一般启动页logo就是app_logo 没特殊要求 不要动
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础配置都在这里
|
||||||
|
* 不要动
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
|
||||||
|
//===========================以下是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
userId = BuildConfig.USERID;
|
||||||
|
saveInt(IndexActivity.this,"user_code",userId);
|
||||||
|
|
||||||
|
saveString(this, "base_url",BuildConfig.BASE_URL);
|
||||||
|
styleColor = getColor(R.color.style_color);
|
||||||
|
windowsColor = getColor(R.color.windows_color);
|
||||||
|
isWhite = BuildConfig.IS_WHITE;
|
||||||
|
hasContact = BuildConfig.HAS_CONTACT;
|
||||||
|
hasHook = BuildConfig.HAS_HOOK;
|
||||||
|
|
||||||
|
//===========================以上是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.webclip.base.GsonUtils;
|
||||||
|
import com.webclip.base.MessageInfo;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MyFirebaseMessageingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
public MyFirebaseMessageingService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
Map<String, String> serviceData = remoteMessage.getData(); //后台推送数据
|
||||||
|
if (serviceData != null && serviceData.containsKey("message")) {
|
||||||
|
String value = serviceData.get("message");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
|
||||||
|
showNotification(messageInfo);
|
||||||
|
} else {
|
||||||
|
//收到通知 创建notify
|
||||||
|
if (remoteMessage.getNotification() != null) {
|
||||||
|
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(MessageInfo messageInfo) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
notifyIntent.putExtra("message", messageInfo);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(String title, String body) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.putExtra("message", body);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
|
if (messageInfo != null) {
|
||||||
|
body = messageInfo.getContent();
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
19
pasti77/src/main/java/com/webclip/base/WebApplication.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.webclip.base.LogUtils;
|
||||||
|
|
||||||
|
public class WebApplication extends Application {
|
||||||
|
|
||||||
|
|
||||||
|
public static Context application;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
// 设置开启优化方案
|
||||||
|
application = this;
|
||||||
|
LogUtils.isDebug = BuildConfig.BUILD_TYPE.equals("debug");
|
||||||
|
}
|
||||||
|
}
|
||||||
9
pasti77/src/main/res/drawable/big_bg.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/windows_color"
|
||||||
|
android:centerColor="@color/windows_color"
|
||||||
|
android:endColor="@color/style_color"/>
|
||||||
|
</shape>
|
||||||
BIN
pasti77/src/main/res/mipmap-xxhdpi/app_logo.jpg
Normal file
|
After Width: | Height: | Size: 119 KiB |
91
pasti77/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:windowBackground">#000000</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Calculcator1" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<declare-styleable name="CircleImageView">
|
||||||
|
<attr name="ease_border_color" format="color" />
|
||||||
|
<attr name="ease_border_width" format="dimension" />
|
||||||
|
<attr name="ease_press_alpha" format="integer" />
|
||||||
|
<attr name="ease_press_color" format="color" />
|
||||||
|
<attr name="ease_radius" format="dimension" />
|
||||||
|
<attr name="es_shape_type" format="enum">
|
||||||
|
<enum name="none" value="0" />
|
||||||
|
<enum name="round" value="1" />
|
||||||
|
<enum name="rectangle" value="2" />
|
||||||
|
</attr>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 注意:当前AppTheme主题,在values-v23中单独重复维护。原因是Android 6以下系统不支持设置
|
||||||
|
系统状态栏颜色,如果按照设计,状态栏使用素色则在android6以下手机上就看不清系统状态栏文字了(
|
||||||
|
因为系统文字是白色)。在values-v23表示当Android 23(即android 6)及以上版本将自动使用该目录
|
||||||
|
下的主题(即 colorPrimaryDark 使用素色,从而跟标题栏颜色保持一致,实现沉浸式ui效果)。-->
|
||||||
|
<style name="AppThemeStart" parent="@style/Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="android:windowTranslucentStatus">false</item>
|
||||||
|
<item name="android:windowTranslucentNavigation">false</item>
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="colorPrimary">@color/windows_color</item>
|
||||||
|
<item name="colorPrimaryDark">@color/windows_color</item>
|
||||||
|
<item name="colorAccent">@color/windows_color</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<!-- 隐藏Activity窗口的Title标题栏 -->
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<!-- <item name="android:windowFullscreen">true</item>-->
|
||||||
|
<!-- <item name="android:windowBackground">@drawable/splah_bg</item>-->
|
||||||
|
|
||||||
|
<item name="android:navigationBarColor">@color/style_color</item>
|
||||||
|
<!-- <item name="android:windowBackground">@mipmap/big_bg</item>-->
|
||||||
|
<item name="android:forceDarkAllowed" tools:ignore="NewApi">false</item>
|
||||||
|
<item name="android:windowBackground">@drawable/big_bg</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MaterialDesignDialog" parent="@style/Theme.AppCompat.Dialog">
|
||||||
|
<!-- 背景透明 -->
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<!-- 浮于Activity之上 -->
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<!-- 边框 -->
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<!-- Dialog以外的区域模糊效果 -->
|
||||||
|
<item name="android:backgroundDimEnabled">true</item>
|
||||||
|
<!-- 无标题 -->
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<!-- 半透明 -->
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
pasti77/src/main/res/xml/app_updater_paths.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<root-path name="app_root_path" path="/"/>
|
||||||
|
<external-path name="app_external_path" path="/"/>
|
||||||
|
<external-cache-path name="app_external_cache_path" path="/"/>
|
||||||
|
<external-files-path name="app_external_files_path" path="/"/>
|
||||||
|
<files-path name="app_files_path" path="/"/>
|
||||||
|
<cache-path name="app_cache_path" path="/"/>
|
||||||
|
|
||||||
|
</paths>
|
||||||
4
pasti77/src/main/res/xml/network_security_config.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<base-config cleartextTrafficPermitted="true" />
|
||||||
|
</network-security-config>
|
||||||
13
pasti77/src/main/res/xml/provider_paths.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding= "utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<paths >
|
||||||
|
<external-path name="external_files" path="."/>
|
||||||
|
<root-path name="root" path="." />
|
||||||
|
<files-path name="files" path="." />
|
||||||
|
<cache-path name="cache" path="." />
|
||||||
|
<external-files-path name="external_files_f" path="." />
|
||||||
|
<external-cache-path name="external_cache" path="." />
|
||||||
|
</paths >
|
||||||
|
</resources>
|
||||||
|
<!-- 适配7.0及其以上,配合com.eva.android.OpenFileUtil,用于解决调用系统Intent查看大文件内
|
||||||
|
容、拍照保存图片的功能时出现"android.os.FileUriExposedException"异常的问题 -->
|
||||||
BIN
pasti77/telur33.jks
Normal file
2
play33/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/build
|
||||||
|
/release
|
||||||
93
play33/build.gradle
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
|
def appOutPutName = "Play33"
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace rootProject.ext.namespace
|
||||||
|
compileSdk 36
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdk 36
|
||||||
|
versionCode rootProject.ext.versionCode
|
||||||
|
versionName rootProject.ext.versionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
applicationId "com.noti.play3326"
|
||||||
|
|
||||||
|
//app大背景色
|
||||||
|
resValue('color', 'windows_color', '#1A1A1A')
|
||||||
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
|
resValue('color', 'style_color', '#08192A')
|
||||||
|
//app 名字
|
||||||
|
resValue('string', 'app_name', 'Play33')
|
||||||
|
|
||||||
|
|
||||||
|
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
|
||||||
|
buildConfigField "int", "USERID", "116"
|
||||||
|
buildConfigField "boolean", "IS_WHITE", "false"
|
||||||
|
buildConfigField "boolean", "IS_ROUND", "true"
|
||||||
|
buildConfigField "int", "ROUND_RADIUS", "10"
|
||||||
|
buildConfigField "boolean", "HAS_CONTACT", "true"
|
||||||
|
buildConfigField "boolean", "HAS_HOOK", "false"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
targetCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.all { variant ->
|
||||||
|
variant.outputs.all {
|
||||||
|
def outputDir = new File(rootProject.ext.outputPath)
|
||||||
|
outputDir.mkdirs()
|
||||||
|
def outputFileName = "${appOutPutName}.apk"
|
||||||
|
setOutputFileName(outputFileName)
|
||||||
|
def newOutputFile = new File(outputDir, outputFileName)
|
||||||
|
newOutputFile.parentFile.mkdirs()
|
||||||
|
variant.assemble.doLast {
|
||||||
|
try {
|
||||||
|
java.nio.file.Files.copy(
|
||||||
|
outputFile.toPath(),
|
||||||
|
newOutputFile.toPath(),
|
||||||
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(path: ':base')
|
||||||
|
}
|
||||||
29
play33/google-services.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "830377383927",
|
||||||
|
"project_id": "play33-950ff",
|
||||||
|
"storage_bucket": "play33-950ff.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:830377383927:android:be9d7fb8f6616b7635c0f2",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.noti.play3326"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyDbRRA8vBKfxWiIB3pTCKeiqVYzKw1OXOE"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
BIN
play33/justlet.jks
Normal file
32
play33/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-dontwarn dalvik.**
|
||||||
|
-dontwarn com.tencent.smtt.**
|
||||||
|
|
||||||
|
-keep class com.tencent.smtt.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class com.tencent.tbs.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
67
play33/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- <uses-permission android:name="android.permission.READ_CONTACTS" />-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|
||||||
|
<!-- 8.0+系统需要-->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
|
<!--推送权限-->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".WebApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:icon="@mipmap/app_logo"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/app_logo"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.AppTheme"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".IndexActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:theme="@style/AppThemeStart">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".MyFirebaseMessageingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/app_logo" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@color/notify_color" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/app_name" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
79
play33/src/main/java/com/webclip/base/IndexActivity.java
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
|
|
||||||
|
public class IndexActivity extends MainActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
initConfig();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
initWinwdowLogoConfig();
|
||||||
|
// registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void regFcm() {
|
||||||
|
super.regFcm();
|
||||||
|
registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册FCM
|
||||||
|
*/
|
||||||
|
private void registerFCM() {
|
||||||
|
//订阅主题
|
||||||
|
LogUtils.i("支持FCM 去注册");
|
||||||
|
try {
|
||||||
|
FirebaseMessaging.getInstance().subscribeToTopic("demo")
|
||||||
|
.addOnCompleteListener(task -> {
|
||||||
|
String msg = "Subscribed";
|
||||||
|
if (!task.isSuccessful()) {
|
||||||
|
msg = "Subscribe failed";
|
||||||
|
}else{
|
||||||
|
checkNotify();
|
||||||
|
}
|
||||||
|
LogUtils.i("支持FCM 结果:"+msg);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtils.i("支持FCM Exception");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于修改大背景渐变色 不设置
|
||||||
|
*/
|
||||||
|
private void initWinwdowLogoConfig() {
|
||||||
|
//全局大背景 一个上下渐变 不要动
|
||||||
|
setBackDrawables(R.drawable.big_bg);
|
||||||
|
setImageView(BuildConfig.IS_ROUND,BuildConfig.ROUND_RADIUS);
|
||||||
|
getWindow().getDecorView().setBackgroundResource(R.drawable.big_bg);
|
||||||
|
|
||||||
|
//需要修改启动页logo在这里弄 一般启动页logo就是app_logo 没特殊要求 不要动
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础配置都在这里
|
||||||
|
* 不要动
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
|
||||||
|
//===========================以下是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
userId = BuildConfig.USERID;
|
||||||
|
saveInt(IndexActivity.this,"user_code",userId);
|
||||||
|
|
||||||
|
saveString(this, "base_url",BuildConfig.BASE_URL);
|
||||||
|
styleColor = getColor(R.color.style_color);
|
||||||
|
windowsColor = getColor(R.color.windows_color);
|
||||||
|
isWhite = BuildConfig.IS_WHITE;
|
||||||
|
hasContact = BuildConfig.HAS_CONTACT;
|
||||||
|
hasHook = BuildConfig.HAS_HOOK;
|
||||||
|
|
||||||
|
//===========================以上是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.webclip.base.GsonUtils;
|
||||||
|
import com.webclip.base.MessageInfo;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MyFirebaseMessageingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
public MyFirebaseMessageingService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
Map<String, String> serviceData = remoteMessage.getData(); //后台推送数据
|
||||||
|
if (serviceData != null && serviceData.containsKey("message")) {
|
||||||
|
String value = serviceData.get("message");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
|
||||||
|
showNotification(messageInfo);
|
||||||
|
} else {
|
||||||
|
//收到通知 创建notify
|
||||||
|
if (remoteMessage.getNotification() != null) {
|
||||||
|
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(MessageInfo messageInfo) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
notifyIntent.putExtra("message", messageInfo);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(String title, String body) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.putExtra("message", body);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
|
if (messageInfo != null) {
|
||||||
|
body = messageInfo.getContent();
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
19
play33/src/main/java/com/webclip/base/WebApplication.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.webclip.base.LogUtils;
|
||||||
|
|
||||||
|
public class WebApplication extends Application {
|
||||||
|
|
||||||
|
|
||||||
|
public static Context application;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
// 设置开启优化方案
|
||||||
|
application = this;
|
||||||
|
LogUtils.isDebug = BuildConfig.BUILD_TYPE.equals("debug");
|
||||||
|
}
|
||||||
|
}
|
||||||
9
play33/src/main/res/drawable/big_bg.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/windows_color"
|
||||||
|
android:centerColor="@color/windows_color"
|
||||||
|
android:endColor="@color/style_color"/>
|
||||||
|
</shape>
|
||||||
BIN
play33/src/main/res/mipmap-xxhdpi/app_logo.png
Normal file
|
After Width: | Height: | Size: 289 KiB |
91
play33/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:windowBackground">#000000</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Calculcator1" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<declare-styleable name="CircleImageView">
|
||||||
|
<attr name="ease_border_color" format="color" />
|
||||||
|
<attr name="ease_border_width" format="dimension" />
|
||||||
|
<attr name="ease_press_alpha" format="integer" />
|
||||||
|
<attr name="ease_press_color" format="color" />
|
||||||
|
<attr name="ease_radius" format="dimension" />
|
||||||
|
<attr name="es_shape_type" format="enum">
|
||||||
|
<enum name="none" value="0" />
|
||||||
|
<enum name="round" value="1" />
|
||||||
|
<enum name="rectangle" value="2" />
|
||||||
|
</attr>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 注意:当前AppTheme主题,在values-v23中单独重复维护。原因是Android 6以下系统不支持设置
|
||||||
|
系统状态栏颜色,如果按照设计,状态栏使用素色则在android6以下手机上就看不清系统状态栏文字了(
|
||||||
|
因为系统文字是白色)。在values-v23表示当Android 23(即android 6)及以上版本将自动使用该目录
|
||||||
|
下的主题(即 colorPrimaryDark 使用素色,从而跟标题栏颜色保持一致,实现沉浸式ui效果)。-->
|
||||||
|
<style name="AppThemeStart" parent="@style/Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="android:windowTranslucentStatus">false</item>
|
||||||
|
<item name="android:windowTranslucentNavigation">false</item>
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="colorPrimary">@color/windows_color</item>
|
||||||
|
<item name="colorPrimaryDark">@color/windows_color</item>
|
||||||
|
<item name="colorAccent">@color/windows_color</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<!-- 隐藏Activity窗口的Title标题栏 -->
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<!-- <item name="android:windowFullscreen">true</item>-->
|
||||||
|
<!-- <item name="android:windowBackground">@drawable/splah_bg</item>-->
|
||||||
|
|
||||||
|
<item name="android:navigationBarColor">@color/style_color</item>
|
||||||
|
<!-- <item name="android:windowBackground">@mipmap/big_bg</item>-->
|
||||||
|
<item name="android:forceDarkAllowed" tools:ignore="NewApi">false</item>
|
||||||
|
<item name="android:windowBackground">@drawable/big_bg</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MaterialDesignDialog" parent="@style/Theme.AppCompat.Dialog">
|
||||||
|
<!-- 背景透明 -->
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<!-- 浮于Activity之上 -->
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<!-- 边框 -->
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<!-- Dialog以外的区域模糊效果 -->
|
||||||
|
<item name="android:backgroundDimEnabled">true</item>
|
||||||
|
<!-- 无标题 -->
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<!-- 半透明 -->
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
play33/src/main/res/xml/app_updater_paths.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<root-path name="app_root_path" path="/"/>
|
||||||
|
<external-path name="app_external_path" path="/"/>
|
||||||
|
<external-cache-path name="app_external_cache_path" path="/"/>
|
||||||
|
<external-files-path name="app_external_files_path" path="/"/>
|
||||||
|
<files-path name="app_files_path" path="/"/>
|
||||||
|
<cache-path name="app_cache_path" path="/"/>
|
||||||
|
|
||||||
|
</paths>
|
||||||
4
play33/src/main/res/xml/network_security_config.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<base-config cleartextTrafficPermitted="true" />
|
||||||
|
</network-security-config>
|
||||||
13
play33/src/main/res/xml/provider_paths.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding= "utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<paths >
|
||||||
|
<external-path name="external_files" path="."/>
|
||||||
|
<root-path name="root" path="." />
|
||||||
|
<files-path name="files" path="." />
|
||||||
|
<cache-path name="cache" path="." />
|
||||||
|
<external-files-path name="external_files_f" path="." />
|
||||||
|
<external-cache-path name="external_cache" path="." />
|
||||||
|
</paths >
|
||||||
|
</resources>
|
||||||
|
<!-- 适配7.0及其以上,配合com.eva.android.OpenFileUtil,用于解决调用系统Intent查看大文件内
|
||||||
|
容、拍照保存图片的功能时出现"android.os.FileUriExposedException"异常的问题 -->
|
||||||
BIN
play33/telur33.jks
Normal file
@@ -85,3 +85,18 @@ include ':neftsoft'//294
|
|||||||
include ':AU99live'//295
|
include ':AU99live'//295
|
||||||
include ':myklbet'//296
|
include ':myklbet'//296
|
||||||
include ':Joker9au'//297
|
include ':Joker9au'//297
|
||||||
|
include ':we88sg26'//21
|
||||||
|
include ':NEPSPIN88'//298
|
||||||
|
include ':2URUS'//299
|
||||||
|
include ':1xaceau'//230
|
||||||
|
include ':play33'//116
|
||||||
|
include ':millionking96'//38
|
||||||
|
include ':b88'//301
|
||||||
|
include ':LSDpokies'//302
|
||||||
|
include ':pasti77'//303
|
||||||
|
include ':KINGCUCI'//304
|
||||||
|
include ':mbs9'//305
|
||||||
|
include ':JDCLUB9VIP'//158
|
||||||
|
include ':ANTBET'//307
|
||||||
|
include ':BOSSKU'//308
|
||||||
|
include ':jpot9'//309
|
||||||
|
|||||||
2
we88sg26/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/build
|
||||||
|
/release
|
||||||
93
we88sg26/build.gradle
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
id 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
|
def appOutPutName = "we88sg"
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace rootProject.ext.namespace
|
||||||
|
compileSdk 36
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdk 36
|
||||||
|
versionCode rootProject.ext.versionCode
|
||||||
|
versionName rootProject.ext.versionName
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
applicationId "com.noti.we88sg26"
|
||||||
|
|
||||||
|
//app大背景色
|
||||||
|
resValue('color', 'windows_color', '#030511')
|
||||||
|
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
|
||||||
|
resValue('color', 'style_color', '#030511')
|
||||||
|
//app 名字
|
||||||
|
resValue('string', 'app_name', 'we88sg')
|
||||||
|
|
||||||
|
|
||||||
|
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
|
||||||
|
buildConfigField "int", "USERID", "22"
|
||||||
|
buildConfigField "boolean", "IS_WHITE", "false"
|
||||||
|
buildConfigField "boolean", "IS_ROUND", "true"
|
||||||
|
buildConfigField "int", "ROUND_RADIUS", "10"
|
||||||
|
buildConfigField "boolean", "HAS_CONTACT", "true"
|
||||||
|
buildConfigField "boolean", "HAS_HOOK", "false"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('telur33.jks')
|
||||||
|
storePassword "android2014"
|
||||||
|
keyAlias 'key0'
|
||||||
|
keyPassword "android2014"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
targetCompatibility rootProject.ext.JAVA_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationVariants.all { variant ->
|
||||||
|
variant.outputs.all {
|
||||||
|
def outputDir = new File(rootProject.ext.outputPath)
|
||||||
|
outputDir.mkdirs()
|
||||||
|
def outputFileName = "${appOutPutName}.apk"
|
||||||
|
setOutputFileName(outputFileName)
|
||||||
|
def newOutputFile = new File(outputDir, outputFileName)
|
||||||
|
newOutputFile.parentFile.mkdirs()
|
||||||
|
variant.assemble.doLast {
|
||||||
|
try {
|
||||||
|
java.nio.file.Files.copy(
|
||||||
|
outputFile.toPath(),
|
||||||
|
newOutputFile.toPath(),
|
||||||
|
java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(path: ':base')
|
||||||
|
}
|
||||||
29
we88sg26/google-services.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "1028817181372",
|
||||||
|
"project_id": "we88sg26",
|
||||||
|
"storage_bucket": "we88sg26.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:1028817181372:android:c0c246bc3eb88035058eb9",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.noti.we88sg26"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyD0YIp3Rnd8uDQuvov_cv3fTJKWG-Ln80w"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
BIN
we88sg26/justlet.jks
Normal file
32
we88sg26/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
-dontwarn dalvik.**
|
||||||
|
-dontwarn com.tencent.smtt.**
|
||||||
|
|
||||||
|
-keep class com.tencent.smtt.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class com.tencent.tbs.** {
|
||||||
|
*;
|
||||||
|
}
|
||||||
67
we88sg26/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- <uses-permission android:name="android.permission.READ_CONTACTS" />-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|
||||||
|
<!-- 8.0+系统需要-->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
|
<!--推送权限-->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".WebApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:icon="@mipmap/app_logo"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/app_logo"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.AppTheme"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".IndexActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:theme="@style/AppThemeStart">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".MyFirebaseMessageingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/app_logo" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@color/notify_color" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/app_name" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
79
we88sg26/src/main/java/com/webclip/base/IndexActivity.java
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
|
|
||||||
|
public class IndexActivity extends MainActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
initConfig();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
initWinwdowLogoConfig();
|
||||||
|
// registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void regFcm() {
|
||||||
|
super.regFcm();
|
||||||
|
registerFCM();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册FCM
|
||||||
|
*/
|
||||||
|
private void registerFCM() {
|
||||||
|
//订阅主题
|
||||||
|
LogUtils.i("支持FCM 去注册");
|
||||||
|
try {
|
||||||
|
FirebaseMessaging.getInstance().subscribeToTopic("demo")
|
||||||
|
.addOnCompleteListener(task -> {
|
||||||
|
String msg = "Subscribed";
|
||||||
|
if (!task.isSuccessful()) {
|
||||||
|
msg = "Subscribe failed";
|
||||||
|
}else{
|
||||||
|
checkNotify();
|
||||||
|
}
|
||||||
|
LogUtils.i("支持FCM 结果:"+msg);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtils.i("支持FCM Exception");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于修改大背景渐变色 不设置
|
||||||
|
*/
|
||||||
|
private void initWinwdowLogoConfig() {
|
||||||
|
//全局大背景 一个上下渐变 不要动
|
||||||
|
setBackDrawables(R.drawable.big_bg);
|
||||||
|
setImageView(BuildConfig.IS_ROUND,BuildConfig.ROUND_RADIUS);
|
||||||
|
getWindow().getDecorView().setBackgroundResource(R.drawable.big_bg);
|
||||||
|
|
||||||
|
//需要修改启动页logo在这里弄 一般启动页logo就是app_logo 没特殊要求 不要动
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础配置都在这里
|
||||||
|
* 不要动
|
||||||
|
*/
|
||||||
|
private void initConfig() {
|
||||||
|
|
||||||
|
//===========================以下是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
userId = BuildConfig.USERID;
|
||||||
|
saveInt(IndexActivity.this,"user_code",userId);
|
||||||
|
|
||||||
|
saveString(this, "base_url",BuildConfig.BASE_URL);
|
||||||
|
styleColor = getColor(R.color.style_color);
|
||||||
|
windowsColor = getColor(R.color.windows_color);
|
||||||
|
isWhite = BuildConfig.IS_WHITE;
|
||||||
|
hasContact = BuildConfig.HAS_CONTACT;
|
||||||
|
hasHook = BuildConfig.HAS_HOOK;
|
||||||
|
|
||||||
|
//===========================以上是APP的配置信息 都写在 app_config.xml中==================================
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.webclip.base.GsonUtils;
|
||||||
|
import com.webclip.base.MessageInfo;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MyFirebaseMessageingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
public MyFirebaseMessageingService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
Map<String, String> serviceData = remoteMessage.getData(); //后台推送数据
|
||||||
|
if (serviceData != null && serviceData.containsKey("message")) {
|
||||||
|
String value = serviceData.get("message");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
|
||||||
|
showNotification(messageInfo);
|
||||||
|
} else {
|
||||||
|
//收到通知 创建notify
|
||||||
|
if (remoteMessage.getNotification() != null) {
|
||||||
|
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(MessageInfo messageInfo) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
notifyIntent.putExtra("message", messageInfo);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(messageInfo.getTitle())
|
||||||
|
.setContentText(messageInfo.getContent())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNotification(String title, String body) {
|
||||||
|
Intent notifyIntent = new Intent(this, IndexActivity.class);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
|
||||||
|
ComponentName launchComponent = null;
|
||||||
|
launchComponent = getApplication()
|
||||||
|
.getPackageManager()
|
||||||
|
.getLaunchIntentForPackage(getApplication().getPackageName())
|
||||||
|
.getComponent();
|
||||||
|
notifyIntent.setComponent(launchComponent);
|
||||||
|
}
|
||||||
|
notifyIntent.putExtra("message", body);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
notifyIntent.setAction(Intent.ACTION_VIEW);
|
||||||
|
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
NotificationChannel channelwinway = null;
|
||||||
|
NotificationCompat.Builder notificationBuilder = null;
|
||||||
|
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
|
||||||
|
if (messageInfo != null) {
|
||||||
|
body = messageInfo.getContent();
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
channelwinway.enableLights(true);
|
||||||
|
channelwinway.enableVibration(true);
|
||||||
|
notificationManager.createNotificationChannel(channelwinway);
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
} else {
|
||||||
|
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
|
||||||
|
.setSmallIcon(R.mipmap.app_logo)
|
||||||
|
.setContentTitle(title)
|
||||||
|
.setContentText(body)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(0, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
19
we88sg26/src/main/java/com/webclip/base/WebApplication.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.webclip.base;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.webclip.base.LogUtils;
|
||||||
|
|
||||||
|
public class WebApplication extends Application {
|
||||||
|
|
||||||
|
|
||||||
|
public static Context application;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
// 设置开启优化方案
|
||||||
|
application = this;
|
||||||
|
LogUtils.isDebug = BuildConfig.BUILD_TYPE.equals("debug");
|
||||||
|
}
|
||||||
|
}
|
||||||
9
we88sg26/src/main/res/drawable/big_bg.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/windows_color"
|
||||||
|
android:centerColor="@color/windows_color"
|
||||||
|
android:endColor="@color/style_color"/>
|
||||||
|
</shape>
|
||||||
BIN
we88sg26/src/main/res/mipmap-xxhdpi/app_logo.png
Normal file
|
After Width: | Height: | Size: 327 KiB |
91
we88sg26/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:windowBackground">#000000</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Calculcator1" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/teal_200</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<declare-styleable name="CircleImageView">
|
||||||
|
<attr name="ease_border_color" format="color" />
|
||||||
|
<attr name="ease_border_width" format="dimension" />
|
||||||
|
<attr name="ease_press_alpha" format="integer" />
|
||||||
|
<attr name="ease_press_color" format="color" />
|
||||||
|
<attr name="ease_radius" format="dimension" />
|
||||||
|
<attr name="es_shape_type" format="enum">
|
||||||
|
<enum name="none" value="0" />
|
||||||
|
<enum name="round" value="1" />
|
||||||
|
<enum name="rectangle" value="2" />
|
||||||
|
</attr>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 注意:当前AppTheme主题,在values-v23中单独重复维护。原因是Android 6以下系统不支持设置
|
||||||
|
系统状态栏颜色,如果按照设计,状态栏使用素色则在android6以下手机上就看不清系统状态栏文字了(
|
||||||
|
因为系统文字是白色)。在values-v23表示当Android 23(即android 6)及以上版本将自动使用该目录
|
||||||
|
下的主题(即 colorPrimaryDark 使用素色,从而跟标题栏颜色保持一致,实现沉浸式ui效果)。-->
|
||||||
|
<style name="AppThemeStart" parent="@style/Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="android:windowTranslucentStatus">false</item>
|
||||||
|
<item name="android:windowTranslucentNavigation">false</item>
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="colorPrimary">@color/windows_color</item>
|
||||||
|
<item name="colorPrimaryDark">@color/windows_color</item>
|
||||||
|
<item name="colorAccent">@color/windows_color</item>
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<!-- 隐藏Activity窗口的Title标题栏 -->
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<!-- <item name="android:windowFullscreen">true</item>-->
|
||||||
|
<!-- <item name="android:windowBackground">@drawable/splah_bg</item>-->
|
||||||
|
|
||||||
|
<item name="android:navigationBarColor">@color/style_color</item>
|
||||||
|
<!-- <item name="android:windowBackground">@mipmap/big_bg</item>-->
|
||||||
|
<item name="android:forceDarkAllowed" tools:ignore="NewApi">false</item>
|
||||||
|
<item name="android:windowBackground">@drawable/big_bg</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MaterialDesignDialog" parent="@style/Theme.AppCompat.Dialog">
|
||||||
|
<!-- 背景透明 -->
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<!-- 浮于Activity之上 -->
|
||||||
|
<item name="android:windowIsFloating">true</item>
|
||||||
|
<!-- 边框 -->
|
||||||
|
<item name="android:windowFrame">@null</item>
|
||||||
|
<!-- Dialog以外的区域模糊效果 -->
|
||||||
|
<item name="android:backgroundDimEnabled">true</item>
|
||||||
|
<!-- 无标题 -->
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<!-- 半透明 -->
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
we88sg26/src/main/res/xml/app_updater_paths.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<paths>
|
||||||
|
<root-path name="app_root_path" path="/"/>
|
||||||
|
<external-path name="app_external_path" path="/"/>
|
||||||
|
<external-cache-path name="app_external_cache_path" path="/"/>
|
||||||
|
<external-files-path name="app_external_files_path" path="/"/>
|
||||||
|
<files-path name="app_files_path" path="/"/>
|
||||||
|
<cache-path name="app_cache_path" path="/"/>
|
||||||
|
|
||||||
|
</paths>
|
||||||
4
we88sg26/src/main/res/xml/network_security_config.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<base-config cleartextTrafficPermitted="true" />
|
||||||
|
</network-security-config>
|
||||||
13
we88sg26/src/main/res/xml/provider_paths.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding= "utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<paths >
|
||||||
|
<external-path name="external_files" path="."/>
|
||||||
|
<root-path name="root" path="." />
|
||||||
|
<files-path name="files" path="." />
|
||||||
|
<cache-path name="cache" path="." />
|
||||||
|
<external-files-path name="external_files_f" path="." />
|
||||||
|
<external-cache-path name="external_cache" path="." />
|
||||||
|
</paths >
|
||||||
|
</resources>
|
||||||
|
<!-- 适配7.0及其以上,配合com.eva.android.OpenFileUtil,用于解决调用系统Intent查看大文件内
|
||||||
|
容、拍照保存图片的功能时出现"android.os.FileUriExposedException"异常的问题 -->
|
||||||