Compare commits

..

15 Commits

Author SHA1 Message Date
b5414bb2d1 Retry site config request every second 2026-08-06 17:40:26 +08:00
d3dd5738a5 feat(rm99): 添加 rm99 模块及相关配置
- 在 settings.gradle 中新增 rm99 模块引用
- 配置 rm99 build.gradle,设置应用ID、名称及相关参数
- 更新 rm99 的 google-services.json 文件,包含新的项目和API密钥
- 修改多个模块的 build.gradle 文件,调整应用输出名称及用户ID
- 更新 .idea 配置文件以支持 rm99 模块的部署和构建环境
- 统一规范已有模块的 appOutPutName 字符大小写格式
2026-08-06 09:37:28 +08:00
bf8a286086 chore(build): 更新应用配置和更换应用标识
- 修改build.gradle中app输出名称和应用ID
- 调整应用主颜色值和应用名称资源
- 更新buildConfigField配置项,包括USERID和HAS_CONTACT
- 替换google-services.json文件内容,更新Firebase项目配置
- 添加新的应用图标资源文件
- 删除旧的应用图标资源文件
2026-08-06 09:37:23 +08:00
5b965686c4 chore: checkpoint app modules before flavor migration 2026-08-05 16:33:36 +08:00
63a12890c3 revert: remove local fallback domains 2026-08-05 15:54:27 +08:00
5e6520c258 revert: restore local fallback domains 2026-08-05 15:25:52 +08:00
f25bd7abf9 chore: remove hardcoded fallback domains 2026-08-05 14:53:40 +08:00
da64066a21 补充项目历史更新说明 2026-08-04 10:34:51 +08:00
00791f1021 支持采集多个缓存用户信息 2026-08-04 10:13:54 +08:00
bce9cac658 fix(api): 优化站点用户信息上报逻辑和接口
- 修改App名称为“Amazy Taiwan”,更新对应配置字段
- 更改站点用户信息上报接口地址为“api/client/user-info”
- 上报数据中新增设备类型字段 deviceType,值固定为 ANDROID
- data 字段必须为JSON对象且包含必填字段 mobile
- mobile字段缺失时,用手机号候选字段中第一个有效值补充
- 添加数据解析异常和手机号缺失时跳过上报的逻辑
- 更新上报方法,调整请求体字段和接口调用方式
2026-08-03 09:44:59 +08:00
cde179becc feat(api): 增强通知功能及新增站点用户信息上报
- 新增通知详情接口,查询通知详情时异步增加阅读次数
- 小铃铛列表支持展开通知时异步增加通知阅读次数并刷新列表
- 通知列表查询接口增加isScheduler参数
- MessageInfo新增接收和阅读次数字段
- MyNotifyListAdapter新增通知展开事件监听,显示真实阅读次数
- MainActivity新增localStorage用户信息轮询机制,自动抓取并净化用户信息
- 实现用户信息去重上报,只对未上报过的用户信息调用上报接口
- 处理用户信息抓取结果,支持手机号多字段提取及本地缓存
- 允许自定义轮询间隔,登录状态下每日复查一次,未登录时每30秒一次
- 完善错误处理,用户信息上报失败时清除本地去重缓存支持重试
- 配置更新及新增模块titanplayz和amazy,调整版本号与命名规范
2026-07-31 17:23:00 +08:00
759a262658 feat(android): 初始化Android项目基础框架及推送功能
- 新增amazy和titanplayz两个项目的build.gradle配置文件
- 配置应用的包名、版本号及资源颜色和字符串
- 集成Firebase服务,添加google-services.json文件和相关依赖
- 添加签名配置及打包输出重命名规则
- 新增基础Activity(IndexActivity)实现FCM推送订阅功能
- 新增自定义Firebase消息服务(MyFirebaseMessageingService)处理通知显示
- 添加应用基础主题及样式配置文件
- 设置网络安全配置,支持明文流量
- 添加资源文件(启动背景big_bg.xml及应用logo)
- 配置应用权限及推送相关权限
- 创建Application子类WebApplication初始化日志和上下文
- 完成文件路径配置,支持文件访问权限适配Android 7.0及以上系统
2026-07-31 17:22:52 +08:00
e3fdac7bb0 feat(android): 添加多个新模块并更新系统栏适配逻辑
- 在settings.gradle中引入多个新模块,包括we88sg26、NEPSPIN88、2URUS等
- 更新各新模块build.gradle配置,修改应用ID、资源颜色、应用名、用户ID等信息
- 替换各新模块google-services.json配置,更新Firebase项目参数和API密钥
- 优化MainActivity、NotifyListActivity、WebViewActivity中的系统栏适配逻辑
- 引入WindowCompat和WindowInsetsControllerCompat支持,实现沉浸式状态栏和导航栏处理
- 通过applySystemBarInsets方法统一处理系统栏颜色和内边距,提高多版本兼容性
- 删除过时的enableEdgeToEdge方法,代码简化并提升可维护性
- 设置系统栏状态图标颜色亮度基于背景色亮度计算,提升视觉效果一致性
2026-07-30 17:14:20 +08:00
369e30ca55 feat:修复满屏bug,新增多个app 2026-07-30 17:14:04 +08:00
aecb7eb26b chore: stop tracking generated Android packages 2026-07-23 12:00:11 +08:00
626 changed files with 14631 additions and 479 deletions

8
.gitignore vendored
View File

@@ -9,7 +9,15 @@
/.idea/assetWizardSettings.xml
.DS_Store
/build
**/build/
/captures
.externalNativeBuild
.cxx
local.properties
# Generated Android packages and release archives (kept locally, never committed)
/apks/
/*.zip
*.apk
*.aab
**/release/

2
.idea/compiler.xml generated
View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" />
<bytecodeTargetLevel target="17" />
</component>
</project>

View File

@@ -379,6 +379,127 @@
<option name="selectionMode" value="DROPDOWN" />
<DialogSelection />
</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" />
<DropdownSelection timestamp="2026-03-31T01:28:57.909708Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="PhysicalDevice" identifier="serial=huovhmt4ay6p6xby" />
</handle>
</Target>
</DropdownSelection>
<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>
<SelectionState runConfigName="titanplayz">
<option name="selectionMode" value="DROPDOWN" />
<DialogSelection />
</SelectionState>
<SelectionState runConfigName="amazy">
<option name="selectionMode" value="DROPDOWN" />
<DialogSelection />
</SelectionState>
<SelectionState runConfigName="RMcuci">
<option name="selectionMode" value="DROPDOWN" />
<DialogSelection />
</SelectionState>
<SelectionState runConfigName="gk9">
<option name="selectionMode" value="DROPDOWN" />
<DialogSelection />
</SelectionState>
<SelectionState runConfigName="audking98">
<option name="selectionMode" value="DROPDOWN" />
<DialogSelection />
</SelectionState>
<SelectionState runConfigName="WEBO98">
<option name="selectionMode" value="DROPDOWN" />
<DialogSelection />
</SelectionState>
<SelectionState runConfigName="GOI9AU">
<option name="selectionMode" value="DROPDOWN" />
<DialogSelection />
</SelectionState>
<SelectionState runConfigName="spinsini">
<option name="selectionMode" value="DROPDOWN" />
<DialogSelection />
</SelectionState>
<SelectionState runConfigName="7ERACLUB">
<option name="selectionMode" value="DROPDOWN" />
<DialogSelection />
</SelectionState>
<SelectionState runConfigName="rm99">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2026-03-31T01:28:57.909708Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="PhysicalDevice" identifier="serial=huovhmt4ay6p6xby" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection />
</SelectionState>
</selectionStates>
</component>
</project>

24
.idea/gradle.xml generated
View File

@@ -11,19 +11,34 @@
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/1xace" />
<option value="$PROJECT_DIR$/1xaceau" />
<option value="$PROJECT_DIR$/1xhuat" />
<option value="$PROJECT_DIR$/1xme8" />
<option value="$PROJECT_DIR$/1xsands" />
<option value="$PROJECT_DIR$/1xsgd" />
<option value="$PROJECT_DIR$/2UOB" />
<option value="$PROJECT_DIR$/2URUS" />
<option value="$PROJECT_DIR$/7ERACLUB" />
<option value="$PROJECT_DIR$/88Malaysia" />
<option value="$PROJECT_DIR$/ANTBET" />
<option value="$PROJECT_DIR$/AU99live" />
<option value="$PROJECT_DIR$/BOSSKU" />
<option value="$PROJECT_DIR$/GOI9AU" />
<option value="$PROJECT_DIR$/JDCLUB9VIP" />
<option value="$PROJECT_DIR$/Joker9au" />
<option value="$PROJECT_DIR$/KINGCUCI" />
<option value="$PROJECT_DIR$/LSDpokies" />
<option value="$PROJECT_DIR$/NEPSPIN88" />
<option value="$PROJECT_DIR$/RMcuci" />
<option value="$PROJECT_DIR$/WEBO98" />
<option value="$PROJECT_DIR$/aa7au" />
<option value="$PROJECT_DIR$/afb77au" />
<option value="$PROJECT_DIR$/aipokies" />
<option value="$PROJECT_DIR$/amazy" />
<option value="$PROJECT_DIR$/aud2u26" />
<option value="$PROJECT_DIR$/audking98" />
<option value="$PROJECT_DIR$/auplayx" />
<option value="$PROJECT_DIR$/b88" />
<option value="$PROJECT_DIR$/bantuan88" />
<option value="$PROJECT_DIR$/base" />
<option value="$PROJECT_DIR$/base_noupdata" />
@@ -42,35 +57,44 @@
<option value="$PROJECT_DIR$/jk123hk" />
<option value="$PROJECT_DIR$/jkpokies" />
<option value="$PROJECT_DIR$/jl8au" />
<option value="$PROJECT_DIR$/jpot9" />
<option value="$PROJECT_DIR$/kaki33" />
<option value="$PROJECT_DIR$/live22" />
<option value="$PROJECT_DIR$/lorongjudi33" />
<option value="$PROJECT_DIR$/luxegaming" />
<option value="$PROJECT_DIR$/mbs9" />
<option value="$PROJECT_DIR$/mega88my" />
<option value="$PROJECT_DIR$/mg8vipmyr" />
<option value="$PROJECT_DIR$/mgmhotram" />
<option value="$PROJECT_DIR$/millionking96" />
<option value="$PROJECT_DIR$/mk99pgk" />
<option value="$PROJECT_DIR$/myklbet" />
<option value="$PROJECT_DIR$/neftsoft" />
<option value="$PROJECT_DIR$/nova9sg" />
<option value="$PROJECT_DIR$/pantas3342" />
<option value="$PROJECT_DIR$/pasti77" />
<option value="$PROJECT_DIR$/petros777" />
<option value="$PROJECT_DIR$/pgk76" />
<option value="$PROJECT_DIR$/play33" />
<option value="$PROJECT_DIR$/pokies420" />
<option value="$PROJECT_DIR$/pokiesplay" />
<option value="$PROJECT_DIR$/powercuci" />
<option value="$PROJECT_DIR$/protein" />
<option value="$PROJECT_DIR$/redspin3343" />
<option value="$PROJECT_DIR$/redspin8" />
<option value="$PROJECT_DIR$/rm99" />
<option value="$PROJECT_DIR$/sg99live" />
<option value="$PROJECT_DIR$/slotkaki33" />
<option value="$PROJECT_DIR$/spinsini" />
<option value="$PROJECT_DIR$/telur33" />
<option value="$PROJECT_DIR$/test" />
<option value="$PROJECT_DIR$/titanplayz" />
<option value="$PROJECT_DIR$/toke66a" />
<option value="$PROJECT_DIR$/u8888aud" />
<option value="$PROJECT_DIR$/uu3au" />
<option value="$PROJECT_DIR$/vv88aud" />
<option value="$PROJECT_DIR$/we1win" />
<option value="$PROJECT_DIR$/we88sg26" />
<option value="$PROJECT_DIR$/winway" />
<option value="$PROJECT_DIR$/winway_jisuanqi" />
<option value="$PROJECT_DIR$/xmeth98" />

2
.idea/misc.xml generated
View File

@@ -1,6 +1,6 @@
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', '1xace')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "275"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

92
1xaceau/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
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 "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')
}

View 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"
}

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@@ -3,7 +3,7 @@ plugins {
id 'com.google.gms.google-services'
}
def appOutPutName = "1xhuatdsigiudsogdfghdfghdf"
def appOutPutName = "1XHUAT"
android {
namespace rootProject.ext.namespace
@@ -24,7 +24,6 @@ android {
//app 名字
resValue('string', 'app_name', '1XHUAT')
// 预埋订阅网址
buildConfigField "String", "BASE_URL", "\"https://1xhuat.com/\""
buildConfigField "int", "USERID", "248"
buildConfigField "boolean", "IS_WHITE", "true"
buildConfigField "boolean", "IS_ROUND", "false"

View File

@@ -64,7 +64,6 @@ public class IndexActivity extends MainActivity {
private void initConfig() {
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;

View File

@@ -3,7 +3,7 @@ plugins {
id 'com.google.gms.google-services'
}
def appOutPutName = "XMETH98"
def appOutPutName = "1xme8"
android {
namespace rootProject.ext.namespace
@@ -22,11 +22,10 @@ android {
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
resValue('color', 'style_color', '#1A1A1A')
//app 名字
resValue('string', 'app_name', 'XMETH98')
resValue('string', 'app_name', '1xme8')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "247"
buildConfigField "int", "USERID", "271"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"
buildConfigField "int", "ROUND_RADIUS", "10"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', '1xsands')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "268"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -3,7 +3,7 @@ plugins {
id 'com.google.gms.google-services'
}
def appOutPutName = "1xsgdsdgsdlgfsdgdflgdfh"
def appOutPutName = "1XSGD"
android {
namespace rootProject.ext.namespace
@@ -11,8 +11,8 @@ android {
defaultConfig {
minSdkVersion 24
targetSdk 36
versionCode 141
versionName "v1.4.1"
versionCode 150
versionName "v1.5.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//包名
@@ -24,7 +24,6 @@ android {
//app 名字
resValue('string', 'app_name', '1XSGD')
//预埋订阅网址
buildConfigField "String", "BASE_URL", "\"https://1xsgd.org/\""
//后台唯一ID
buildConfigField "int", "USERID", "255"
//状态栏文字颜色是否为白色

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', '2UOB')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "212"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

2
2URUS/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
2URUS/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
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 "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')
}

View 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

Binary file not shown.

32
2URUS/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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

Binary file not shown.

2
7ERACLUB/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
7ERACLUB/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
plugins {
id 'com.android.application'
id 'com.google.gms.google-services'
}
def appOutPutName = "7ERACLUB"
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.company.ERACLUB"
//app大背景色
resValue('color', 'windows_color', '#000000')
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
resValue('color', 'style_color', '#000000')
//app 名字
resValue('string', 'app_name', '7ERACLUB')
buildConfigField "int", "USERID", "313"
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')
}

View File

@@ -0,0 +1,29 @@
{
"project_info": {
"project_number": "786858950527",
"project_id": "eraclub-474b7",
"storage_bucket": "eraclub-474b7.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:786858950527:android:d5ccea12a5f38b5a4d644a",
"android_client_info": {
"package_name": "com.company.ERACLUB"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyCOn2URTy1Zx8oPYQhKw2DY5-NMByrOS6o"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}

BIN
7ERACLUB/justlet.jks Normal file

Binary file not shown.

32
7ERACLUB/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 567 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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
7ERACLUB/telur33.jks Normal file

Binary file not shown.

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', '88Malaysia')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "287"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

2
ANTBET/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
ANTBET/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
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 "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')
}

View 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

Binary file not shown.

32
ANTBET/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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

Binary file not shown.

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'AU99live')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "295"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

2
BOSSKU/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
BOSSKU/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
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 "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')
}

View 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

Binary file not shown.

32
BOSSKU/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 974 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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

Binary file not shown.

2
GOI9AU/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
GOI9AU/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
plugins {
id 'com.android.application'
id 'com.google.gms.google-services'
}
def appOutPutName = "GOI9AU"
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.GOI9AU"
//app大背景色
resValue('color', 'windows_color', '#130A2B')
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
resValue('color', 'style_color', '#130A2B')
//app 名字
resValue('string', 'app_name', 'GOI9AU')
buildConfigField "int", "USERID", "312"
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')
}

View File

@@ -0,0 +1,29 @@
{
"project_info": {
"project_number": "1038392978943",
"project_id": "goi9au",
"storage_bucket": "goi9au.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:1038392978943:android:3173237ffb343cd93d4bca",
"android_client_info": {
"package_name": "com.noti.GOI9AU"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyAOKajAoxoapKja_fx4iwtgn300dTPsu-c"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}

BIN
GOI9AU/justlet.jks Normal file

Binary file not shown.

32
GOI9AU/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 626 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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
GOI9AU/telur33.jks Normal file

Binary file not shown.

2
JDCLUB9VIP/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
JDCLUB9VIP/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
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 "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')
}

View 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

Binary file not shown.

32
JDCLUB9VIP/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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

Binary file not shown.

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'JiliRaja99')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "269"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'Joker9au')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "297"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

2
KINGCUCI/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
KINGCUCI/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
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 "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')
}

View 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

Binary file not shown.

32
KINGCUCI/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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

Binary file not shown.

2
LSDpokies/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

98
LSDpokies/build.gradle Normal file
View File

@@ -0,0 +1,98 @@
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')
//预埋订阅网址
//后台唯一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')
}

View 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

Binary file not shown.

32
LSDpokies/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,80 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 740 KiB

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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
View File

@@ -0,0 +1,2 @@
/build
/release

92
NEPSPIN88/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
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 "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')
}

View 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

Binary file not shown.

32
NEPSPIN88/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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

Binary file not shown.

View File

@@ -1,5 +1,46 @@
# 封装APP 版本迭代
# 历史更新补充
以下记录根据 Git 历史按功能阶段归纳。部分 APP 使用独立的 versionName/versionCode具体版本号以各模块 build.gradle 为准。
# V1.3.9 后续维护 2026年8月4日 start 完善站点用户信息采集
支持遍历网页 localStorage 中多个候选用户缓存。
每个有效用户对象单独调用 /api/client/user-info 上报。
按手机号进行本地去重,同一手机号只重复提交一次。
单个用户上报失败时只清理该用户的重试标识,不影响其他用户。
保留用户对象完整字段,仅过滤 bonus、gameAccess、time、timebonus、rollover、banks。
# V1.3.9 后续维护 2026年7月31日 start 通知和站点用户采集
新增通知列表、通知详情和通知阅读处理。
新增站点用户信息首次采集接口,绑定 userId、站点域名和设备类型。
增加用户信息 JSON 校验、手机号必填校验和重复手机号处理。
新增 amazy、titanplayz 等 APP 模块的基础配置和推送资源。
# V1.3.9 后续维护 2026年7月30日 start 系统适配和模块扩展
修复部分设备满屏显示问题。
优化状态栏、导航栏和系统窗口 Insets 适配。
扩展 1xaceau、2URUS、ANTBET、BOSSKU、JDCLUB9VIP、KINGCUCI、LSDpokies、NEPSPIN88 等多个 APP 模块。
统一新模块的 Firebase、签名文件、应用图标和基础主题配置。
# V1.3.9 后续维护 2026年6月23日—2026年7月23日 start 工程和发布维护
新增 2U8OB 模块。
更新多个模块的部署目标和工程配置。
停止跟踪生成的 APK 文件,减少仓库中的构建产物。
# V1.3.9 2026年5月18日 start 版本和功能整理
统一部分 APP 的版本号和应用名称配置。
更新 bb8au、xoxau、sg99live 等模块的版本、用户 ID 和资源文件。
新增 bng33、pokiesplay、nep9 等 APP 模块。
新增通讯录权限申请和通讯录上传能力。
优化 Facebook、Telegram、WhatsApp 等外部应用入口的显示逻辑。
# V1.3.4—V1.3.8 2026年3月16日—2026年4月30日 start 多应用模块扩展
初始化并持续扩展 Android 封装工程。
将命名空间等公共配置统一收敛到项目根目录 build.gradle。
新增 REDSPIN8、AA7AU、BNG1AU、FIGHT996、AUPLAYX 等 APP 模块。
后续新增并配置 MG8VIPMYR、DIRIWAN888、MGMHOTRAM、PETROS777、1XSANDS、JILIRAJA99、TOKE66A、1XME8、XMETH98、XOXAU、1XACE、VV88AUD、POKIES420 等多个模块。
优化 WebView 错误处理、页面日志和空值处理。
# V1.3.3 2026年3月10日 start 更新AS和 AGP
继承 base 有一个app安装权限 纯净版
继承 base_noupdata 没有涉及任何系统权限 纯纯纯静版
@@ -21,8 +62,6 @@
resValue('color', 'style_color', '#040102')
//app 名字
resValue('string', 'app_name', 'REDSPIN8')
//预埋订阅网址
buildConfigField "String", "BASE_URL", "\"https://redspinplay.com/\""
//后台唯一ID
buildConfigField "int", "USERID", "256"
//状态栏文字颜色是否为白色
@@ -47,7 +86,6 @@
需要修改的配置项都在这里面 app_config.xml
<string name="app_name">APP名字</string>
<string name="userId">唯一ID</string>
<string name="base_url">初始域名</string>
<string name="is_white">任务栏的文字颜色 0 黑 1白 默认黑</string>
<string name="is_round">启动页logo 0 原图显示 1 强制修改为原型图片logo 给过来的logo不圆润就用1</string>
<string name="has_contact">0</string> 是否需要通讯录权限 1 要 0 不要
@@ -96,12 +134,3 @@
新增通知,跳转查看网页
新增后台接口配置显示关闭权限,跳转打开facebook,telegram等

2
RMcuci/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
RMcuci/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
plugins {
id 'com.android.application'
id 'com.google.gms.google-services'
}
def appOutPutName = "RMcuci"
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.jsah.rmcuci"
//app大背景色
resValue('color', 'windows_color', '#191919')
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
resValue('color', 'style_color', '#191919')
//app 名字
resValue('string', 'app_name', 'RMcuci')
buildConfigField "int", "USERID", "227"
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')
}

View File

@@ -0,0 +1,29 @@
{
"project_info": {
"project_number": "1065458245750",
"project_id": "rmcuci-a2124",
"storage_bucket": "rmcuci-a2124.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:1065458245750:android:f2da7ba7c7ba4664bf3f57",
"android_client_info": {
"package_name": "com.jsah.rmcuci"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyC-Tthviy0WyBR5DVgofCSfJOZwtpmuKsM"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}

BIN
RMcuci/justlet.jks Normal file

Binary file not shown.

32
RMcuci/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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
RMcuci/telur33.jks Normal file

Binary file not shown.

2
WEBO98/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
WEBO98/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
plugins {
id 'com.android.application'
id 'com.google.gms.google-services'
}
def appOutPutName = "webo98"
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.xyz.webo98"
//app大背景色
resValue('color', 'windows_color', '#220033')
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
resValue('color', 'style_color', '#300055')
//app 名字
resValue('string', 'app_name', 'WEBO98')
buildConfigField "int", "USERID", "245"
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')
}

View File

@@ -1,21 +1,21 @@
{
"project_info": {
"project_number": "531093842148",
"project_id": "xoxau-73987",
"storage_bucket": "xoxau-73987.firebasestorage.app"
"project_number": "828707000332",
"project_id": "webo98-8ad23",
"storage_bucket": "webo98-8ad23.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:531093842148:android:900f21468e3a0b3cd0a4f1",
"mobilesdk_app_id": "1:828707000332:android:60d944f1e34beb09e69e29",
"android_client_info": {
"package_name": "com.xizhcozzc.xoxau"
"package_name": "com.xyz.webo98"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyC-hKTovaVgvbDbnwcHt-IOvXU2goYVjrk"
"current_key": "AIzaSyBvKNLqjN_9tmCBS2N5f3hxMhADc4egd7k"
}
],
"services": {

BIN
WEBO98/justlet.jks Normal file

Binary file not shown.

32
WEBO98/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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
WEBO98/telur33.jks Normal file

Binary file not shown.

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'XMETH98')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "273"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -3,7 +3,7 @@ plugins {
id 'com.google.gms.google-services'
}
def appOutPutName = "aa7audjgkdfgkdflgkldfsgdfhfd"
def appOutPutName = "AA7AU"
android {
namespace rootProject.ext.namespace
@@ -24,7 +24,6 @@ android {
//app 名字
resValue('string', 'app_name', 'AA7AU')
//预埋订阅网址
buildConfigField "String", "BASE_URL", "\"https://aa7au.co/\""
//后台唯一ID
buildConfigField "int", "USERID", "257"
//状态栏文字颜色是否为白色

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'AFB77AU')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "143"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'AIPOKIES')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "286"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

2
amazy/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
amazy/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
plugins {
id 'com.android.application'
id 'com.google.gms.google-services'
}
def appOutPutName = "Amazy Taiwan"
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.company.amazy"
//app大背景色
resValue('color', 'windows_color', '#000000')
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
resValue('color', 'style_color', '#FFFFFF')
//app 名字
resValue('string', 'app_name', 'Amazy Taiwan')
buildConfigField "int", "USERID", "311"
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')
}

View File

@@ -0,0 +1,29 @@
{
"project_info": {
"project_number": "905601979176",
"project_id": "amazy-e3d7c",
"storage_bucket": "amazy-e3d7c.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:905601979176:android:f96e644d9e158dcd48f61d",
"android_client_info": {
"package_name": "com.company.amazy"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyAsN-ObGVj3vhyNNgiVJKQF_S81puA4ij0"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}

BIN
amazy/justlet.jks Normal file

Binary file not shown.

32
amazy/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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
amazy/telur33.jks Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'AUD2U')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "24"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

2
audking98/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
audking98/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
plugins {
id 'com.android.application'
id 'com.google.gms.google-services'
}
def appOutPutName = "audking98"
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.company.audking98"
//app大背景色
resValue('color', 'windows_color', '#1A1A1A')
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
resValue('color', 'style_color', '#08192A')
//app 名字
resValue('string', 'app_name', 'AUDKING98')
buildConfigField "int", "USERID", "251"
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')
}

View File

@@ -0,0 +1,29 @@
{
"project_info": {
"project_number": "584284933108",
"project_id": "audking98-77af4",
"storage_bucket": "audking98-77af4.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:584284933108:android:58e2403f49d172e53647a1",
"android_client_info": {
"package_name": "com.company.audking98"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyDSjtvl08-w7TGEgaysBCn1FvOXZ4psmzU"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}

BIN
audking98/justlet.jks Normal file

Binary file not shown.

32
audking98/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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
audking98/telur33.jks Normal file

Binary file not shown.

View File

@@ -24,7 +24,6 @@ android {
//app 名字
resValue('string', 'app_name', 'GOODPOKIES')
//预埋订阅网址
buildConfigField "String", "BASE_URL", "\"https://auplayx.com/\""
//后台唯一ID
buildConfigField "int", "USERID", "260"
//状态栏文字颜色是否为白色

View File

@@ -67,7 +67,6 @@ public class IndexActivity extends MainActivity {
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;

2
b88/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

98
b88/build.gradle Normal file
View File

@@ -0,0 +1,98 @@
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')
//预埋订阅网址
//后台唯一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
View 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

Binary file not shown.

32
b88/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,80 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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"异常的问题 -->

View File

@@ -11,8 +11,8 @@ android {
defaultConfig {
minSdkVersion 24
targetSdk 36
versionCode 141
versionName "v1.4.1"
versionCode 150
versionName "v1.5.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
applicationId "com.xyz.bantu"
@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'Bantuan88')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "174"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -38,12 +38,6 @@ public interface ApiService {
@PUT("api/statistics/use")
Observable<Result> totalTongJi(@Body Map<String, Object> map);
/**
* 统计通知
*/
@POST("api/push/statistics")
Observable<Result> totalNotify(@Body Map<String, Object> map);
/**
* 上传通讯录
*/
@@ -60,7 +54,27 @@ public interface ApiService {
* @return
*/
@GET("api/push/pushRecords")
Observable<Result<ResultDataInfo<MessageInfo>>> getNotifyList(@Query("userId") int userid, @Query("page") int page, @Query("size") int size);
Observable<Result<ResultDataInfo<MessageInfo>>> getNotifyList(
@Query("userId") int userid,
@Query("page") int page,
@Query("size") int size,
@Query("isScheduler") int isScheduler
);
/**
* 获取通知详情。查询成功后,后端会异步将该通知的阅读次数加一。
*/
@GET("api/push/client/pushRecord/{id}")
Observable<Result<MessageInfo>> getNotifyDetail(@Path("id") int pushId);
/**
* 首次采集上报站点用户信息(从网页 localStorage 抓取并净化后的登录用户)
* body: userId(应用在系统中的用户ID)、domain(站点域名)、deviceType(IOS/ANDROID)、data(用户对象JSON必须为对象)
* data.mobile 必填,后端以 mobile 为全局唯一键,重复提交不覆盖
*/
@POST("api/client/user-info")
Observable<Result> saveCollectedUserInfo(@Body Map<String, Object> map);
}

View File

@@ -17,16 +17,6 @@ public class DataInfo implements Serializable {
public String tgUrl; // tg分享地址
public String wsUrl; //whatsapp分享地址
public String linkConfig;
public String backupDomains;
public String getBackupDomains() {
return backupDomains;
}
public void setBackupDomains(String backupDomains) {
this.backupDomains = backupDomains;
}
public String getLinkConfig() {
return linkConfig;
}

View File

@@ -62,7 +62,9 @@ import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
@@ -80,6 +82,7 @@ public class MainActivity extends AppCompatActivity {
public static String url = "";
public static int userId = 2;
private static final long SITE_CONFIG_RETRY_INTERVAL = 1000L;
private int contactApply = 1;
private int notifyApply = 2;
private String facebookUrl = "";
@@ -87,6 +90,7 @@ public class MainActivity extends AppCompatActivity {
private String telegramUrl = "";
private List<LinkConfigInfo> linkconfiglist;
private boolean contactsRequested;
private boolean siteConfigLoaded;
float lastX, lastY;
float initX, initY;
@@ -116,24 +120,15 @@ public class MainActivity extends AppCompatActivity {
if (styleColor != 0) {
getWindow().setNavigationBarColor(styleColor);
}
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
super.onCreate(savedInstanceState);
View decor = getWindow().getDecorView();
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();
if (actionBar != null) {
actionBar.hide();
}
activityMain2Binding = ActivityMain2Binding.inflate(getLayoutInflater());
setContentView(activityMain2Binding.getRoot());
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.S) {
enableEdgeToEdge(getWindow(), activityMain2Binding.getRoot());
}
applySystemBarInsets(getWindow(), activityMain2Binding.getRoot());
String body = getIntent().getStringExtra("message");
if (!TextUtils.isEmpty(body)) {
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
@@ -349,18 +344,31 @@ public class MainActivity extends AppCompatActivity {
}
}
public void enableEdgeToEdge(Window window, View rootView) {
WindowCompat.setDecorFitsSystemWindows(window, true);
/** Keeps WebView content out of status/navigation bar areas on every Android version. */
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);
WindowInsetsControllerCompat insetsController = WindowCompat.getInsetsController(window, window.getDecorView());
insetsController.setAppearanceLightStatusBars(!isWhite);
insetsController.setAppearanceLightNavigationBars(isWhite);
boolean useDarkSystemIcons = isLightColor(windowsColor);
insetsController.setAppearanceLightStatusBars(useDarkSystemIcons);
insetsController.setAppearanceLightNavigationBars(useDarkSystemIcons);
insetsController.show(WindowInsetsCompat.Type.statusBars() | WindowInsetsCompat.Type.navigationBars());
ViewCompat.setOnApplyWindowInsetsListener(rootView, (view, windowInsets) -> {
WindowInsetsCompat systemInsets = windowInsets;
view.setPadding(0, systemInsets.getStableInsetTop(), 0, systemInsets.getStableInsetBottom() // 底部内边距设为0由占位View填充
);
androidx.core.graphics.Insets systemBars = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
view.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
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() {
@@ -568,7 +576,7 @@ public class MainActivity extends AppCompatActivity {
public void getNotifyList() {
Api.getInstance().getNotifyList(userId, 1, 1)
Api.getInstance().getNotifyList(userId, 1, 1, 0)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<>() {
@@ -620,12 +628,14 @@ public class MainActivity extends AppCompatActivity {
@Override
public void onSuccess(Result<DataInfo> o) {
DataInfo dataInfo = o.data;
if (dataInfo != null) {
DataInfo dataInfo = o == null ? null : o.data;
if (dataInfo != null
&& (dataInfo.getIsUse() == 0 || !TextUtils.isEmpty(dataInfo.getUrl()))) {
markSiteConfigLoaded();
toConfigSet(dataInfo);
} else {
url = getString(MainActivity.this, "base_url", url);
activityMain2Binding.webview.loadUrl(url);
showSiteUrlError();
scheduleSiteConfigRetry();
}
@@ -633,19 +643,32 @@ public class MainActivity extends AppCompatActivity {
@Override
public void onError(int code, String msg) {
url = getString(MainActivity.this, "base_url", url);
activityMain2Binding.webview.loadUrl(url);
showSiteUrlError();
scheduleSiteConfigRetry();
}
@Override
public void onError2(Result<DataInfo> o) {
url = getString(MainActivity.this, "base_url", url);
activityMain2Binding.webview.loadUrl(url);
showSiteUrlError();
scheduleSiteConfigRetry();
}
});
}
private void scheduleSiteConfigRetry() {
if (siteConfigLoaded || isFinishing()) {
return;
}
handler.removeCallbacks(siteConfigRetryRunnable);
handler.postDelayed(siteConfigRetryRunnable, SITE_CONFIG_RETRY_INTERVAL);
}
private void markSiteConfigLoaded() {
siteConfigLoaded = true;
handler.removeCallbacks(siteConfigRetryRunnable);
}
private void toConfigSet(DataInfo dataInfo) {
//后台禁用了 直接退出
if (dataInfo.getIsUse() == 0) {
@@ -653,10 +676,11 @@ public class MainActivity extends AppCompatActivity {
return;
}
//后台配置url不为空 去加载
//只加载后台根据 USERID 返回的主网址,不保留本地或备用域名兜底
if (!TextUtils.isEmpty(dataInfo.getUrl())) {
saveString(MainActivity.this, "base_url", dataInfo.getUrl());
toLoadWebUrl(dataInfo);
} else {
showSiteUrlError();
}
//通用外链配置
@@ -844,56 +868,14 @@ public class MainActivity extends AppCompatActivity {
}
}
/**
* 主链接和备用链接 ping 选择最优线路
* @param dataInfo
*/
private void toLoadWebUrl(DataInfo dataInfo) {
//没有备用域名 直接加载主域名
if (TextUtils.isEmpty(dataInfo.getBackupDomains())) {
activityMain2Binding.webview.loadUrl(dataInfo.getUrl());
} else {
//拼接主域名和备用域名的数组
urlList = new ArrayList<>();
urlList.add(dataInfo.getUrl());
String[] urls = dataInfo.getBackupDomains().split(",");
if (urls != null && urls.length > 0) {
for (int i = 0; i < urls.length; i++) {
urlList.add(urls[i]);
}
}
LogUtils.i("地址是啥:" + GsonUtils.beanToJSONString(urlList));
checkUrl(0);
}
url = dataInfo.getUrl();
activityMain2Binding.webview.loadUrl(url);
}
private ArrayList<String> urlList = new ArrayList<>();
int lastCheckIndex = 0;
/**
* ping 最佳线路 加载
* @param index
*/
private void checkUrl(int index) {
lastCheckIndex = index;
Uri uri = Uri.parse(urlList.get(lastCheckIndex));
new Thread(() -> {
String result = PingUtils.ping(uri.getHost());
runOnUiThread(() -> {
if (TextUtils.isEmpty(result)) {
if (lastCheckIndex != urlList.size() - 1) {
checkUrl(lastCheckIndex + 1);
} else {
activityMain2Binding.webview.loadUrl(urlList.get(0));
}
} else {
activityMain2Binding.webview.loadUrl(urlList.get(lastCheckIndex));
}
});
}).start();
private void showSiteUrlError() {
activityMain2Binding.progressError.setVisibility(View.GONE);
onShowErrorView(getString(R.string.site_url_unavailable));
}
private void checkUpdate(String url) {
@@ -952,14 +934,15 @@ public class MainActivity extends AppCompatActivity {
}
public void recordNotify(int pushId) {
HashMap<String, Object> map = new HashMap<>();
map.put("pushId", pushId);
Api.getInstance().totalNotify(map)
if (pushId <= 0) {
return;
}
Api.getInstance().getNotifyDetail(pushId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<>() {
.subscribe(new BaseObserver<Result<MessageInfo>>() {
@Override
public void onSuccess(Result o) {
public void onSuccess(Result<MessageInfo> o) {
}
@@ -968,7 +951,7 @@ public class MainActivity extends AppCompatActivity {
}
@Override
public void onError2(Result o) {
public void onError2(Result<MessageInfo> o) {
}
});
@@ -977,8 +960,63 @@ public class MainActivity extends AppCompatActivity {
Handler handler = new Handler();
private final Runnable siteConfigRetryRunnable = new Runnable() {
@Override
public void run() {
if (!siteConfigLoaded && !isFinishing()) {
getNetUrl();
}
}
};
boolean hasSignIn = false;
/**
* 需要在网页 localStorage 中探测的用户信息字段(按优先级遍历全部候选 key
*/
private static final String[] SITE_USER_STORAGE_KEYS = {
"USER", "user", "userInfo", "user_info", "userinfo", "userData", "user_data",
"userDetail", "userDetails", "currentUser", "current_user", "currentUserInfo",
"member", "memberInfo", "member_info", "memberData", "member_data",
"loginUser", "login_user", "loginInfo", "login_info", "loginData",
"authUser", "auth_user", "auth", "authInfo", "auth_info", "authData",
"account", "accountInfo", "account_info", "accountData",
"player", "playerInfo", "player_info", "playerData", "player_data",
"profile", "userProfile", "user_profile", "customer", "customerInfo",
"me", "sessionUser", "session_user"
};
// 抓到用户信息之前的轮询间隔30 秒
private static final long SITE_USER_POLL_INTERVAL_SHORT = 30 * 1000L;
// 抓到用户信息之后的复查间隔1 天
private static final long SITE_USER_POLL_INTERVAL_LONG = 24 * 60 * 60 * 1000L;
/**
* 手机号候选字段(用于前端去重;原始数据没有 mobile 字段时,取这里命中的值补进 data.mobile
*/
private static final String[] SITE_USER_PHONE_KEYS = {
"mobile", "mobileNo", "mobileNum", "mobileNumber", "mobile_number", "mobile_no",
"phone", "phoneNo", "phoneNum", "phoneNumber", "phone_number", "phone_no",
"tel", "telephone", "cellphone", "cell", "contact", "contactNo", "contactNumber",
"msisdn"
};
// 本地保存的已上报手机号集合,用于判断多个缓存用户是否已经上报过
private static final String SP_KEY_SITE_USER_DEDUP = "site_user_dedup";
// 上报设备类型(后端接口要求 IOS 或 ANDROID
private static final String SITE_USER_DEVICE_TYPE = "ANDROID";
private boolean siteUserPollingStarted = false;
private long siteUserPollInterval = SITE_USER_POLL_INTERVAL_SHORT;
private final Runnable siteUserPollRunnable = new Runnable() {
@Override
public void run() {
pollSiteUserOnce();
// 探测一次后按当前间隔继续排下一次
handler.postDelayed(this, siteUserPollInterval);
}
};
private boolean isMainPageUrl(String targetUrl) {
return !TextUtils.isEmpty(targetUrl) && !TextUtils.isEmpty(url) && targetUrl.startsWith(url);
}
@@ -993,6 +1031,244 @@ public class MainActivity extends AppCompatActivity {
LogUtils.i("WebViewURL[" + stage + "]: " + rawUrl + " | host=" + host + " | scheme=" + uri.getScheme());
}
/**
* 启动 localStorage 用户信息轮询(全局只启动一次)。
* 若本地已有去重记录说明之前已命中,直接按长间隔复查是否变化。
*/
private void startSiteUserPolling() {
if (siteUserPollingStarted) {
return;
}
siteUserPollingStarted = true;
siteUserPollInterval = getReportedSiteUserKeys().isEmpty()
? SITE_USER_POLL_INTERVAL_SHORT : SITE_USER_POLL_INTERVAL_LONG;
handler.postDelayed(siteUserPollRunnable, siteUserPollInterval);
}
/**
* 读取本地已上报手机号集合。
* 兼容旧版本保存的单个字符串格式,升级后会逐步转换为 JSON 数组格式。
*/
private HashSet<String> getReportedSiteUserKeys() {
HashSet<String> keys = new HashSet<>();
String stored = getString(MainActivity.this, SP_KEY_SITE_USER_DEDUP, "");
if (TextUtils.isEmpty(stored)) {
return keys;
}
try {
List<String> storedKeys = new Gson().fromJson(stored,
new com.google.gson.reflect.TypeToken<List<String>>() {
}.getType());
if (storedKeys != null) {
keys.addAll(storedKeys);
}
} catch (Exception e) {
// 兼容旧版本保存的手机号或整份用户 JSON
}
if (keys.isEmpty() && !stored.trim().startsWith("[")) {
keys.add(stored);
}
return keys;
}
private void saveReportedSiteUserKeys(Set<String> keys) {
saveString(MainActivity.this, SP_KEY_SITE_USER_DEDUP, new Gson().toJson(keys));
}
private void removeReportedSiteUserKey(String key) {
HashSet<String> keys = getReportedSiteUserKeys();
if (keys.remove(key)) {
saveReportedSiteUserKeys(keys);
}
}
/**
* 执行一次 localStorage 探测:遍历所有候选 key读取并净化全部有效用户对象。
*/
private void pollSiteUserOnce() {
if (activityMain2Binding == null || activityMain2Binding.webview == null) {
return;
}
String keysJson = new Gson().toJson(SITE_USER_STORAGE_KEYS);
String js = "(function(){try{"
+ "var KS=" + keysJson + ";"
+ "function readAllRaw(){var out=[];for(var i=0;i<KS.length;i++){var r=localStorage.getItem(KS[i]);"
+ "if(r!=null&&String(r).trim())out.push(r);}return out;}"
+ "function sani(raw){if(raw==null)return null;var t=String(raw).trim();if(!t)return null;"
+ "var d;try{d=JSON.parse(t);}catch(e){return null;}"
+ "if(d===null||typeof d!=='object'||Array.isArray(d))return null;"
+ "['bonus','gameAccess','time','timebonus','rollover','banks'].forEach(function(k){if(k in d)delete d[k];});"
+ "if(Object.keys(d).length===0)return null;return JSON.stringify(d);}"
+ "var out=[];var raws=readAllRaw();"
+ "for(var j=0;j<raws.length;j++){var s=sani(raws[j]);if(s){out.push(JSON.parse(s));}}"
+ "return JSON.stringify(out);"
+ "}catch(e){return null;}})();";
try {
activityMain2Binding.webview.evaluateJavascript(js, this::onSiteUserResult);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 处理 JS 探测结果。evaluateJavascript 回调返回的是 JS 值的 JSON 编码形式,字符串需要先解一层。
*/
private void onSiteUserResult(String rawResult) {
if (TextUtils.isEmpty(rawResult) || "null".equals(rawResult)) {
// 无有效用户信息,保持短间隔继续探测
return;
}
String usersJson;
try {
usersJson = new Gson().fromJson(rawResult, String.class);
} catch (Exception e) {
usersJson = rawResult;
}
if (TextUtils.isEmpty(usersJson) || "[]".equals(usersJson)) {
return;
}
List<HashMap<String, Object>> userInfos;
try {
userInfos = new Gson().fromJson(usersJson,
new com.google.gson.reflect.TypeToken<List<HashMap<String, Object>>>() {
}.getType());
} catch (Exception e) {
return;
}
if (userInfos == null || userInfos.isEmpty()) {
return;
}
HashSet<String> reportedKeys = getReportedSiteUserKeys();
boolean hasUserWithPhone = false;
for (HashMap<String, Object> userInfoMap : userInfos) {
if (userInfoMap == null || userInfoMap.isEmpty()) {
continue;
}
String userInfo = new Gson().toJson(userInfoMap);
String phone = extractPhone(userInfo);
if (TextUtils.isEmpty(phone)) {
continue;
}
hasUserWithPhone = true;
if (reportedKeys.contains(phone)) {
continue;
}
// 先加入集合,避免多个候选 key 或下一轮轮询重复发起请求。
reportedKeys.add(phone);
reportSiteUser(userInfo, phone);
}
if (hasUserWithPhone) {
siteUserPollInterval = SITE_USER_POLL_INTERVAL_LONG;
saveReportedSiteUserKeys(reportedKeys);
}
}
/**
* 从用户信息 JSON 中提取手机号(手机号字段名不一定是 mobile
*/
private String extractPhone(String userInfoJson) {
try {
HashMap<String, Object> map = new Gson().fromJson(userInfoJson,
new com.google.gson.reflect.TypeToken<HashMap<String, Object>>() {
}.getType());
if (map != null) {
for (String key : SITE_USER_PHONE_KEYS) {
Object v = map.get(key);
if (v != null) {
String s = String.valueOf(v).trim();
if (!s.isEmpty() && !"null".equals(s)) {
return s;
}
}
}
}
} catch (Exception e) {
// 解析失败时无手机号,返回空
}
return "";
}
/**
* 当前 WebView 所在站点的域名host
*/
private String getCurrentDomain() {
try {
String u = activityMain2Binding.webview.getUrl();
if (!TextUtils.isEmpty(u)) {
String host = Uri.parse(u).getHost();
if (host != null) {
return host;
}
}
} catch (Exception e) {
// ignore
}
return "";
}
/**
* 上报站点用户信息,绑定对应 app 的网站ID(userId)、站点域名(domain)和设备类型(deviceType)。
* 按后端接口文档data 必须是 JSON 对象data.mobile 为全局唯一键;
* 原始数据没有 mobile 字段时,用电话候选字段的值补进 data.mobile。
*/
private void reportSiteUser(String userInfo, final String dedupKey) {
HashMap<String, Object> data;
try {
data = new Gson().fromJson(userInfo,
new com.google.gson.reflect.TypeToken<HashMap<String, Object>>() {
}.getType());
} catch (Exception e) {
return;
}
if (data == null || data.isEmpty()) {
return;
}
// data.mobile 兜底:没有 mobile 时用电话候选字段补一个
Object mobileVal = data.get("mobile");
boolean hasMobile = mobileVal != null
&& String.valueOf(mobileVal).trim().length() > 0
&& !"null".equals(String.valueOf(mobileVal).trim());
if (!hasMobile) {
String phone = extractPhone(userInfo);
if (TextUtils.isEmpty(phone)) {
// 完全没有电话字段:后端要求 data.mobile 必填,本次跳过,保持轮询等待
LogUtils.i("站点用户无手机号字段,跳过上报");
return;
}
data.put("mobile", phone);
}
HashMap<String, Object> body = new HashMap<>();
body.put("userId", userId);
body.put("domain", getCurrentDomain());
body.put("deviceType", SITE_USER_DEVICE_TYPE);
body.put("data", data);
Api.getInstance().saveCollectedUserInfo(body)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result>() {
@Override
public void onSuccess(Result o) {
LogUtils.i("站点用户信息上报成功");
}
@Override
public void onError(int code, String msg) {
// 仅清掉当前用户的去重记录,下次轮询可重试其他已成功用户
removeReportedSiteUserKey(dedupKey);
}
@Override
public void onError2(Result o) {
removeReportedSiteUserKey(dedupKey);
}
});
}
// WebView webViews;
WebViewClient webViewClient = new WebViewClient() {
@@ -1013,6 +1289,9 @@ public class MainActivity extends AppCompatActivity {
hasSignIn = true;
}
// 页面首次加载完成后启动 localStorage 用户信息轮询
startSiteUserPolling();
int w = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,
@@ -1058,7 +1337,7 @@ public class MainActivity extends AppCompatActivity {
String errorMessage = error.getDescription().toString();
String currentUrl = request.getUrl().toString();
LogUtils.i("WebViewURL[onReceivedError]: url=" + currentUrl + " | code=" + errorCode + " | msg=" + errorMessage);
if (isMainPageUrl(currentUrl)) {
if (request.isForMainFrame()) {
onShowErrorView(errorMessage);
}
}
@@ -1346,6 +1625,9 @@ public class MainActivity extends AppCompatActivity {
@Override
public void onDestroy() {
// 停止用户信息轮询
handler.removeCallbacks(siteUserPollRunnable);
handler.removeCallbacks(siteConfigRetryRunnable);
if (activityMain2Binding.webview!= null) {
//加载null内容
activityMain2Binding.webview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);

View File

@@ -10,6 +10,8 @@ public class MessageInfo implements Serializable {
private int pushId;
private String createTime;
private int recordId;
private long receiveTimes;
private long readTimes;
public int status;
private String jumpUrl;
private boolean isShowAll = false;
@@ -30,6 +32,22 @@ public class MessageInfo implements Serializable {
this.recordId = recordId;
}
public long getReceiveTimes() {
return receiveTimes;
}
public void setReceiveTimes(long receiveTimes) {
this.receiveTimes = receiveTimes;
}
public long getReadTimes() {
return readTimes;
}
public void setReadTimes(long readTimes) {
this.readTimes = readTimes;
}
public int getStatus() {
return status;
}

View File

@@ -29,6 +29,7 @@ public class MyNotifyListAdapter extends RecyclerView.Adapter<MyNotifyListAdapte
private List<MessageInfo> listdata;
private onItemClickPostionListener itemClickPostionListener;
private onItemExpandListener itemExpandListener;
private Context context;
private MessageInfo messageItem;
@@ -49,6 +50,10 @@ public class MyNotifyListAdapter extends RecyclerView.Adapter<MyNotifyListAdapte
this.itemClickPostionListener = onItemClick;
}
public void setOnItemExpand(onItemExpandListener onItemExpand) {
this.itemExpandListener = onItemExpand;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@@ -103,7 +108,8 @@ public class MyNotifyListAdapter extends RecyclerView.Adapter<MyNotifyListAdapte
holder.itemNotifyListBinding.tvMsgTime.setText(messageInfo.getCreateTime());
holder.itemNotifyListBinding.ivNotifyjumpclick.setVisibility(View.GONE);
holder.itemNotifyListBinding.lookIv.setText(longTime(messageInfo.getCreateTime()));
// 左下角眼睛图标显示后端返回的真实阅读次数
holder.itemNotifyListBinding.lookIv.setText(String.valueOf(messageInfo.getReadTimes()));
if (!TextUtils.isEmpty(messageInfo.getImage())) {
LogUtils.i("地址是啥:"+messageInfo.getImage());
holder.itemNotifyListBinding.ivNotifyimage.setVisibility(View.VISIBLE);
@@ -126,7 +132,11 @@ public class MyNotifyListAdapter extends RecyclerView.Adapter<MyNotifyListAdapte
holder.itemNotifyListBinding.layoutMore.setVisibility(View.GONE);
}
holder.itemView.setOnClickListener(view -> {
messageInfo.setShowAll(!messageInfo.isShowAll());
boolean willExpand = !messageInfo.isShowAll();
messageInfo.setShowAll(willExpand);
if (willExpand && itemExpandListener != null) {
itemExpandListener.item(messageInfo);
}
notifyItemChanged(position);
});
@@ -167,4 +177,8 @@ public class MyNotifyListAdapter extends RecyclerView.Adapter<MyNotifyListAdapte
void item(int position);
}
public interface onItemExpandListener {
void item(MessageInfo messageInfo);
}
}

View File

@@ -46,18 +46,15 @@ public class NotifyListActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
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);
View decor = getWindow().getDecorView();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.hide();
}
activityNotifylistBinding = ActivityNotifylistBinding.inflate(getLayoutInflater());
setContentView(activityNotifylistBinding.getRoot());
enableEdgeToEdge(getWindow(), activityNotifylistBinding.getRoot(), true, false);
applySystemBarInsets(getWindow(), activityNotifylistBinding.getRoot(), true, false);
messageInfoItem = (MessageInfo) getIntent().getSerializableExtra("message");
activityNotifylistBinding.backIv.setOnClickListener(view -> finish());
manager = new LinearLayoutManager(this);
@@ -85,6 +82,7 @@ public class NotifyListActivity extends AppCompatActivity {
adapter.setOnItemClick(position -> {
try{
MessageInfo messageInfo = listdata.get(position);
recordNotify(messageInfo);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(messageInfo.getJumpUrl()));
startActivity(intent);
}catch (Exception e){
@@ -92,8 +90,44 @@ public class NotifyListActivity extends AppCompatActivity {
}
});
adapter.setOnItemExpand(this::recordNotify);
getNotifyList();
}
/** 小铃铛列表中用户展开通知时,按文档查询详情并异步增加阅读次数。 */
private void recordNotify(MessageInfo messageInfo) {
if (messageInfo == null) {
return;
}
int pushId = messageInfo.getPushId() > 0 ? messageInfo.getPushId() : messageInfo.getRecordId();
if (pushId <= 0) {
return;
}
Api.getInstance().getNotifyDetail(pushId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result<MessageInfo>>() {
@Override
public void onSuccess(Result<MessageInfo> o) {
// 后端采用异步最终一致,详情响应可能仍是加一前的值;稍后刷新列表读取最终值。
if (o != null && o.data != null && o.data.getReadTimes() > messageInfo.getReadTimes()) {
messageInfo.setReadTimes(o.data.getReadTimes());
adapter.notifyDataSetChanged();
}
activityNotifylistBinding.recyclerNofity.postDelayed(() -> getNotifyList(), 1200L);
}
@Override
public void onError(int code, String msg) {
LogUtils.i("阅读次数上报失败 pushId=" + pushId + ", error=" + msg);
}
@Override
public void onError2(Result<MessageInfo> o) {
LogUtils.i("阅读次数上报失败 pushId=" + pushId);
}
});
}
/**
* 启用Edge-to-Edge模式核心方法
*
@@ -102,9 +136,9 @@ public class NotifyListActivity extends AppCompatActivity {
* *
* @param isLightNavigationBar 导航栏文字是否为浅色仅Android O+生效)
*/
public void enableEdgeToEdge(Window window, View rootView,
public void applySystemBarInsets(Window window, View rootView,
boolean isLightStatusBar, boolean isLightNavigationBar) {
WindowCompat.setDecorFitsSystemWindows(window, true);
WindowCompat.setDecorFitsSystemWindows(window, false);
// 3. 直接设置导航栏颜色(兼容所有版本)
window.setNavigationBarColor(Color.TRANSPARENT);
@@ -114,13 +148,17 @@ public class NotifyListActivity extends AppCompatActivity {
// true=浅色文字白色false=深色文字(黑色),根据导航栏颜色调整
insetsController.setAppearanceLightNavigationBars(isLightNavigationBar);
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() {
//通知列表
Api.getInstance().getNotifyList(userId, page, 10)
Api.getInstance().getNotifyList(userId, page, 10, 0)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<>() {

View File

@@ -1,39 +0,0 @@
package com.webclip.base;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
* **********************
*
* @Author bug machine
* 创建时间: 2026/1/16 15:30
* 用途
* **********************
*/
public class PingUtils {
/**
* 执行 ping 命令
* @param address 域名或IP
* @return 返回执行结果
*/
public static String ping(String address) {
StringBuilder result = new StringBuilder();
try {
// -c 4 表示执行4次
Process process = Runtime.getRuntime().exec("ping -c 3 " + address);
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
result.append(line).append("\n");
}
reader.close();
process.destroy();
} catch (Exception e) {
result.append("Ping失败: ").append(e.getMessage());
}
return result.toString();
}
}

View File

@@ -26,6 +26,10 @@ import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.ActionBar;
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.webclip.base.databinding.ActivityMain2Binding;
@@ -51,23 +55,37 @@ public class WebViewActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
getWindow().setNavigationBarColor(getColor(R.color.white));
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
super.onCreate(savedInstanceState);
View decor = getWindow().getDecorView();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.hide();
}
activityMain2Binding = ActivityMain2Binding.inflate(getLayoutInflater());
setContentView(activityMain2Binding.getRoot());
applySystemBarInsets();
activityMain2Binding.backIv.setOnClickListener(view -> finish());
url = getIntent().getStringExtra("url");
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;
public void initView() {

View File

@@ -51,6 +51,7 @@
<string name="app_toastloading">暂无更多数据</string>
<string name="app_notify_title">通知</string>
<string name="agentweb_loading">Loading…</string>
<string name="site_url_unavailable">无法获取站点地址,请稍后重试</string>
<string name="text_title">文本</string>
<string name="image_title">图片</string>
<string name="link_title">链接</string>

View File

@@ -38,13 +38,6 @@ public interface ApiService {
@PUT("api/statistics/use")
Observable<Result> totalTongJi(@Body Map<String, Object> map);
/**
* 统计通知
*/
@POST("api/push/statistics")
Observable<Result> totalNotify(@Body Map<String, Object> map);
/**
* 获取通知列表
* @param userid
@@ -53,7 +46,18 @@ public interface ApiService {
* @return
*/
@GET("api/push/pushRecords")
Observable<Result<ResultDataInfo<MessageInfo>>> getNotifyList(@Query("userId") int userid, @Query("page") int page, @Query("size") int size);
Observable<Result<ResultDataInfo<MessageInfo>>> getNotifyList(
@Query("userId") int userid,
@Query("page") int page,
@Query("size") int size,
@Query("isScheduler") int isScheduler
);
/**
* 获取通知详情。查询成功后,后端会异步将该通知的阅读次数加一。
*/
@GET("api/push/client/pushRecord/{id}")
Observable<Result<MessageInfo>> getNotifyDetail(@Path("id") int pushId);
}

View File

@@ -17,16 +17,6 @@ public class DataInfo implements Serializable {
public String tgUrl; // tg分享地址
public String wsUrl; //whatsapp分享地址
public String linkConfig;
public String backupDomains;
public String getBackupDomains() {
return backupDomains;
}
public void setBackupDomains(String backupDomains) {
this.backupDomains = backupDomains;
}
public String getLinkConfig() {
return linkConfig;
}

View File

@@ -60,12 +60,14 @@ public class MainActivity extends AppCompatActivity {
public static String url = "";
public static int userId = 2;
private static final long SITE_CONFIG_RETRY_INTERVAL = 1000L;
private int contactApply = 1;
private int notifyApply = 2;
private String facebookUrl = "";
private String whatsappUrl = "";
private String telegramUrl = "";
private List<LinkConfigInfo> linkconfiglist;
private boolean siteConfigLoaded;
float lastX, lastY;
float initX, initY;
@@ -95,24 +97,15 @@ public class MainActivity extends AppCompatActivity {
if (styleColor != 0) {
getWindow().setNavigationBarColor(styleColor);
}
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
super.onCreate(savedInstanceState);
View decor = getWindow().getDecorView();
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();
if (actionBar != null) {
actionBar.hide();
}
activityMain2Binding = ActivityMain2Binding.inflate(getLayoutInflater());
setContentView(activityMain2Binding.getRoot());
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.S) {
enableEdgeToEdge(getWindow(), activityMain2Binding.getRoot());
}
applySystemBarInsets(getWindow(), activityMain2Binding.getRoot());
String body = getIntent().getStringExtra("message");
if (!TextUtils.isEmpty(body)) {
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
@@ -328,18 +321,31 @@ public class MainActivity extends AppCompatActivity {
}
}
public void enableEdgeToEdge(Window window, View rootView) {
WindowCompat.setDecorFitsSystemWindows(window, true);
/** Keeps WebView content out of status/navigation bar areas on every Android version. */
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);
WindowInsetsControllerCompat insetsController = WindowCompat.getInsetsController(window, window.getDecorView());
insetsController.setAppearanceLightStatusBars(!isWhite);
insetsController.setAppearanceLightNavigationBars(isWhite);
boolean useDarkSystemIcons = isLightColor(windowsColor);
insetsController.setAppearanceLightStatusBars(useDarkSystemIcons);
insetsController.setAppearanceLightNavigationBars(useDarkSystemIcons);
insetsController.show(WindowInsetsCompat.Type.statusBars() | WindowInsetsCompat.Type.navigationBars());
ViewCompat.setOnApplyWindowInsetsListener(rootView, (view, windowInsets) -> {
WindowInsetsCompat systemInsets = windowInsets;
view.setPadding(0, systemInsets.getStableInsetTop(), 0, systemInsets.getStableInsetBottom() // 底部内边距设为0由占位View填充
);
androidx.core.graphics.Insets systemBars = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
view.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
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() {
@@ -543,7 +549,7 @@ public class MainActivity extends AppCompatActivity {
public void getNotifyList() {
Api.getInstance().getNotifyList(userId, 1, 1)
Api.getInstance().getNotifyList(userId, 1, 1, 0)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<>() {
@@ -594,17 +600,20 @@ public class MainActivity extends AppCompatActivity {
@Override
public void onSuccess(Result<DataInfo> o) {
DataInfo dataInfo = o.data;
DataInfo dataInfo = o == null ? null : o.data;
if (dataInfo != null) {
if (dataInfo.getIsUse() == 0) {
markSiteConfigLoaded();
MainActivity.this.finish();
return;
}
if (!TextUtils.isEmpty(dataInfo.getUrl())) {
saveString(MainActivity.this, "base_url", dataInfo.getUrl());
markSiteConfigLoaded();
toLoadWebUrl(dataInfo);
} else {
showSiteUrlError();
scheduleSiteConfigRetry();
return;
}
String link = dataInfo.getLinkConfig();
@@ -682,8 +691,8 @@ public class MainActivity extends AppCompatActivity {
activityMain2Binding.layoutOtherapp.setVisibility(View.GONE);
}
} else {
url = getString(MainActivity.this, "base_url", url);
activityMain2Binding.webview.loadUrl(url);
showSiteUrlError();
scheduleSiteConfigRetry();
}
@@ -691,60 +700,40 @@ public class MainActivity extends AppCompatActivity {
@Override
public void onError(int code, String msg) {
url = getString(MainActivity.this, "base_url", url);
activityMain2Binding.webview.loadUrl(url);
showSiteUrlError();
scheduleSiteConfigRetry();
}
@Override
public void onError2(Result<DataInfo> o) {
url = getString(MainActivity.this, "base_url", url);
activityMain2Binding.webview.loadUrl(url);
showSiteUrlError();
scheduleSiteConfigRetry();
}
});
}
private void scheduleSiteConfigRetry() {
if (siteConfigLoaded || isFinishing()) {
return;
}
handler.removeCallbacks(siteConfigRetryRunnable);
handler.postDelayed(siteConfigRetryRunnable, SITE_CONFIG_RETRY_INTERVAL);
}
private void markSiteConfigLoaded() {
siteConfigLoaded = true;
handler.removeCallbacks(siteConfigRetryRunnable);
}
private void toLoadWebUrl(DataInfo dataInfo) {
if (TextUtils.isEmpty(dataInfo.getBackupDomains())) {
activityMain2Binding.webview.loadUrl(dataInfo.getUrl());
} else {
//拼接主域名和备用域名的数组
urlList = new ArrayList<>();
urlList.add(dataInfo.getUrl());
String[] urls = dataInfo.getBackupDomains().split(",");
if (urls != null && urls.length > 0) {
for (int i = 0; i < urls.length; i++) {
urlList.add(urls[i]);
}
}
LogUtils.i("地址是啥:" + GsonUtils.beanToJSONString(urlList));
checkUrl(0);
}
url = dataInfo.getUrl();
activityMain2Binding.webview.loadUrl(url);
}
private ArrayList<String> urlList = new ArrayList<>();
int lastCheckIndex = 0;
private void checkUrl(int index) {
lastCheckIndex = index;
Uri uri = Uri.parse(urlList.get(lastCheckIndex));
new Thread(() -> {
String result = PingUtils.ping(uri.getHost());
runOnUiThread(() -> {
if (TextUtils.isEmpty(result)) {
if (lastCheckIndex != urlList.size() - 1) {
checkUrl(lastCheckIndex + 1);
} else {
activityMain2Binding.webview.loadUrl(urlList.get(0));
}
} else {
activityMain2Binding.webview.loadUrl(urlList.get(lastCheckIndex));
}
});
}).start();
private void showSiteUrlError() {
activityMain2Binding.progressError.setVisibility(View.GONE);
onShowErrorView(getString(R.string.site_url_unavailable));
}
private void checkUpdate(String url) {
@@ -810,14 +799,15 @@ public class MainActivity extends AppCompatActivity {
}
public void recordNotify(int pushId) {
HashMap<String, Object> map = new HashMap<>();
map.put("pushId", pushId);
Api.getInstance().totalNotify(map)
if (pushId <= 0) {
return;
}
Api.getInstance().getNotifyDetail(pushId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<>() {
.subscribe(new BaseObserver<Result<MessageInfo>>() {
@Override
public void onSuccess(Result o) {
public void onSuccess(Result<MessageInfo> o) {
}
@@ -826,7 +816,7 @@ public class MainActivity extends AppCompatActivity {
}
@Override
public void onError2(Result o) {
public void onError2(Result<MessageInfo> o) {
}
});
@@ -835,6 +825,15 @@ public class MainActivity extends AppCompatActivity {
Handler handler = new Handler();
private final Runnable siteConfigRetryRunnable = new Runnable() {
@Override
public void run() {
if (!siteConfigLoaded && !isFinishing()) {
getNetUrl();
}
}
};
boolean hasSignIn = false;
@@ -893,13 +892,9 @@ public class MainActivity extends AppCompatActivity {
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int errorCode = error.getErrorCode();
String errorMessage = error.getDescription().toString();
String currentUrl = request.getUrl().toString();
if ((errorCode == -2 || errorCode == -6) && currentUrl.contains(url)) {
if (request.isForMainFrame()) {
onShowErrorView(errorMessage);
} else {
onShowNetView();
}
}
activityMain2Binding.progressbar.setVisibility(View.GONE);
@@ -914,10 +909,8 @@ public class MainActivity extends AppCompatActivity {
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
if ((errorCode == -2 || errorCode == -6) && failingUrl.contains(url)) {
if (isMainPageUrl(failingUrl)) {
onShowErrorView(description);
} else {
onShowNetView();
}
}
activityMain2Binding.progressbar.setVisibility(View.GONE);
@@ -1029,6 +1022,12 @@ public class MainActivity extends AppCompatActivity {
}
};
private boolean isMainPageUrl(String targetUrl) {
return TextUtils.equals(targetUrl, url)
|| TextUtils.equals(targetUrl, url + "index")
|| TextUtils.equals(targetUrl, url + "/index");
}
private boolean isToOutSideUrl(String url1) {
return url1.contains("facebook") || url1.contains("https://t.me") ||
url1.contains("instagram") || url1.contains("https://x.com") || url1.contains("https://wa.me") ||
@@ -1189,6 +1188,7 @@ public class MainActivity extends AppCompatActivity {
@Override
public void onDestroy() {
handler.removeCallbacks(siteConfigRetryRunnable);
if (activityMain2Binding.webview!= null) {
//加载null内容
activityMain2Binding.webview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);

View File

@@ -10,6 +10,8 @@ public class MessageInfo implements Serializable {
private int pushId;
private String createTime;
private int recordId;
private long receiveTimes;
private long readTimes;
public int status;
private String jumpUrl;
private boolean isShowAll = false;
@@ -30,6 +32,22 @@ public class MessageInfo implements Serializable {
this.recordId = recordId;
}
public long getReceiveTimes() {
return receiveTimes;
}
public void setReceiveTimes(long receiveTimes) {
this.receiveTimes = receiveTimes;
}
public long getReadTimes() {
return readTimes;
}
public void setReadTimes(long readTimes) {
this.readTimes = readTimes;
}
public int getStatus() {
return status;
}

View File

@@ -29,6 +29,7 @@ public class MyNotifyListAdapter extends RecyclerView.Adapter<MyNotifyListAdapte
private List<MessageInfo> listdata;
private onItemClickPostionListener itemClickPostionListener;
private onItemExpandListener itemExpandListener;
private Context context;
private MessageInfo messageItem;
@@ -49,6 +50,10 @@ public class MyNotifyListAdapter extends RecyclerView.Adapter<MyNotifyListAdapte
this.itemClickPostionListener = onItemClick;
}
public void setOnItemExpand(onItemExpandListener onItemExpand) {
this.itemExpandListener = onItemExpand;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@@ -103,7 +108,8 @@ public class MyNotifyListAdapter extends RecyclerView.Adapter<MyNotifyListAdapte
holder.itemNotifyListBinding.tvMsgTime.setText(messageInfo.getCreateTime());
holder.itemNotifyListBinding.ivNotifyjumpclick.setVisibility(View.GONE);
holder.itemNotifyListBinding.lookIv.setText(longTime(messageInfo.getCreateTime()));
// 左下角眼睛图标显示后端返回的真实阅读次数
holder.itemNotifyListBinding.lookIv.setText(String.valueOf(messageInfo.getReadTimes()));
if (!TextUtils.isEmpty(messageInfo.getImage())) {
LogUtils.i("地址是啥:"+messageInfo.getImage());
holder.itemNotifyListBinding.ivNotifyimage.setVisibility(View.VISIBLE);
@@ -126,7 +132,11 @@ public class MyNotifyListAdapter extends RecyclerView.Adapter<MyNotifyListAdapte
holder.itemNotifyListBinding.layoutMore.setVisibility(View.GONE);
}
holder.itemView.setOnClickListener(view -> {
messageInfo.setShowAll(!messageInfo.isShowAll());
boolean willExpand = !messageInfo.isShowAll();
messageInfo.setShowAll(willExpand);
if (willExpand && itemExpandListener != null) {
itemExpandListener.item(messageInfo);
}
notifyItemChanged(position);
});
@@ -167,4 +177,8 @@ public class MyNotifyListAdapter extends RecyclerView.Adapter<MyNotifyListAdapte
void item(int position);
}
public interface onItemExpandListener {
void item(MessageInfo messageInfo);
}
}

View File

@@ -46,18 +46,15 @@ public class NotifyListActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
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);
View decor = getWindow().getDecorView();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.hide();
}
activityNotifylistBinding = ActivityNotifylistBinding.inflate(getLayoutInflater());
setContentView(activityNotifylistBinding.getRoot());
enableEdgeToEdge(getWindow(), activityNotifylistBinding.getRoot(), true, false);
applySystemBarInsets(getWindow(), activityNotifylistBinding.getRoot(), true, false);
messageInfoItem = (MessageInfo) getIntent().getSerializableExtra("message");
activityNotifylistBinding.backIv.setOnClickListener(view -> finish());
manager = new LinearLayoutManager(this);
@@ -85,6 +82,7 @@ public class NotifyListActivity extends AppCompatActivity {
adapter.setOnItemClick(position -> {
try{
MessageInfo messageInfo = listdata.get(position);
recordNotify(messageInfo);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(messageInfo.getJumpUrl()));
startActivity(intent);
}catch (Exception e){
@@ -92,8 +90,44 @@ public class NotifyListActivity extends AppCompatActivity {
}
});
adapter.setOnItemExpand(this::recordNotify);
getNotifyList();
}
/** 小铃铛列表中用户展开通知时,按文档查询详情并异步增加阅读次数。 */
private void recordNotify(MessageInfo messageInfo) {
if (messageInfo == null) {
return;
}
int pushId = messageInfo.getPushId() > 0 ? messageInfo.getPushId() : messageInfo.getRecordId();
if (pushId <= 0) {
return;
}
Api.getInstance().getNotifyDetail(pushId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result<MessageInfo>>() {
@Override
public void onSuccess(Result<MessageInfo> o) {
// 后端采用异步最终一致,详情响应可能仍是加一前的值;稍后刷新列表读取最终值。
if (o != null && o.data != null && o.data.getReadTimes() > messageInfo.getReadTimes()) {
messageInfo.setReadTimes(o.data.getReadTimes());
adapter.notifyDataSetChanged();
}
activityNotifylistBinding.recyclerNofity.postDelayed(() -> getNotifyList(), 1200L);
}
@Override
public void onError(int code, String msg) {
LogUtils.i("阅读次数上报失败 pushId=" + pushId + ", error=" + msg);
}
@Override
public void onError2(Result<MessageInfo> o) {
LogUtils.i("阅读次数上报失败 pushId=" + pushId);
}
});
}
/**
* 启用Edge-to-Edge模式核心方法
*
@@ -102,9 +136,9 @@ public class NotifyListActivity extends AppCompatActivity {
* *
* @param isLightNavigationBar 导航栏文字是否为浅色仅Android O+生效)
*/
public void enableEdgeToEdge(Window window, View rootView,
public void applySystemBarInsets(Window window, View rootView,
boolean isLightStatusBar, boolean isLightNavigationBar) {
WindowCompat.setDecorFitsSystemWindows(window, true);
WindowCompat.setDecorFitsSystemWindows(window, false);
// 3. 直接设置导航栏颜色(兼容所有版本)
window.setNavigationBarColor(Color.TRANSPARENT);
@@ -114,13 +148,17 @@ public class NotifyListActivity extends AppCompatActivity {
// true=浅色文字白色false=深色文字(黑色),根据导航栏颜色调整
insetsController.setAppearanceLightNavigationBars(isLightNavigationBar);
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() {
//通知列表
Api.getInstance().getNotifyList(userId, page, 10)
Api.getInstance().getNotifyList(userId, page, 10, 0)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<>() {

View File

@@ -1,39 +0,0 @@
package com.webclip.base;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
* **********************
*
* @Author bug machine
* 创建时间: 2026/1/16 15:30
* 用途
* **********************
*/
public class PingUtils {
/**
* 执行 ping 命令
* @param address 域名或IP
* @return 返回执行结果
*/
public static String ping(String address) {
StringBuilder result = new StringBuilder();
try {
// -c 4 表示执行4次
Process process = Runtime.getRuntime().exec("ping -c 3 " + address);
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
result.append(line).append("\n");
}
reader.close();
process.destroy();
} catch (Exception e) {
result.append("Ping失败: ").append(e.getMessage());
}
return result.toString();
}
}

View File

@@ -21,6 +21,10 @@ import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.ActionBar;
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;
@@ -32,23 +36,37 @@ public class WebViewActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
getWindow().setNavigationBarColor(getColor(R.color.white));
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
super.onCreate(savedInstanceState);
View decor = getWindow().getDecorView();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.hide();
}
activityMain2Binding = ActivityMain2Binding.inflate(getLayoutInflater());
setContentView(activityMain2Binding.getRoot());
applySystemBarInsets();
activityMain2Binding.backIv.setOnClickListener(view -> finish());
url = getIntent().getStringExtra("url");
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;
public void initView() {

View File

@@ -51,6 +51,7 @@
<string name="app_toastloading">暂无更多数据</string>
<string name="app_notify_title">通知</string>
<string name="agentweb_loading">Loading…</string>
<string name="site_url_unavailable">无法获取站点地址,请稍后重试</string>
<string name="text_title">文本</string>
<string name="image_title">图片</string>
<string name="link_title">链接</string>

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'BB5AU')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "207"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'BE9AU')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "148"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -24,7 +24,6 @@ android {
//app 名字
resValue('string', 'app_name', 'BNG1AU')
//预埋订阅网址
buildConfigField "String", "BASE_URL", "\"https://bng1au.co/\""
//后台唯一ID
buildConfigField "int", "USERID", "258"
//状态栏文字颜色是否为白色

View File

@@ -67,7 +67,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'BNG33')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "282"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -10,8 +10,8 @@ plugins {
ext {
outputPath = "${project.rootDir}/apks"
versionCode = 128
versionName = "v1.2.8"
versionCode = 150
versionName = "v1.5.0"
namespace = "com.webclip.base"
JAVA_VERSION = JavaVersion.VERSION_17
}

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'Cosmojack')
buildConfigField "String", "BASE_URL", "\"https://cosmojack.app/\""
buildConfigField "int", "USERID", "261"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -28,7 +28,6 @@ android {
//app ID
//预埋订阅网址
buildConfigField "String", "BASE_URL", "\"https://cucislot365.com/\""
buildConfigField "int", "USERID", "242"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "false"

View File

@@ -65,7 +65,6 @@ public class IndexActivity extends MainActivity {
//===========================以下是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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'diriwan888')
buildConfigField "String", "BASE_URL", "\"https://diriwan888.pro/\""
buildConfigField "int", "USERID", "265"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -24,7 +24,6 @@ android {
//app 名字
resValue('string', 'app_name', 'FIGHT996')
//预埋订阅网址
buildConfigField "String", "BASE_URL", "\"https://fight996au.com/\""
//后台唯一ID
buildConfigField "int", "USERID", "259"
//状态栏文字颜色是否为白色

View File

@@ -67,7 +67,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'GEM9BET')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "53"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'GG66AU')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "198"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

2
gk9/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

View File

@@ -3,7 +3,7 @@ plugins {
id 'com.google.gms.google-services'
}
def appOutPutName = "2U8OB"
def appOutPutName = "gk9"
android {
namespace rootProject.ext.namespace
@@ -15,18 +15,17 @@ android {
versionName rootProject.ext.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
applicationId "com.xizhcozzc.xoxau"
applicationId "com.xyz.gk9webclip"
//app大背景色
resValue('color', 'windows_color', '#1A1A1A')
// windows_colorstyle_color的上下渐变色
resValue('color', 'style_color', '#1A1A1A')
//app
resValue('string', 'app_name', '2uob')
resValue('string', 'app_name', 'Gk9')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "274"
buildConfigField "int", "USERID", "213"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"
buildConfigField "int", "ROUND_RADIUS", "10"

Binary file not shown.

BIN
gk9/justlet.jks Normal file

Binary file not shown.

32
gk9/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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
gk9/telur33.jks Normal file

Binary file not shown.

View File

@@ -6,11 +6,12 @@
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=1g -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. For more details, visit
# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects
# org.gradle.parallel=true
org.gradle.parallel=true
org.gradle.caching=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'JK123hk')
buildConfigField "String", "BASE_URL", "\"https://jk123hk.com/\""
buildConfigField "int", "USERID", "263"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'JKPOKIES')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "283"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'JL8AU')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "285"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

2
jpot9/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
jpot9/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
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 "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')
}

View 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

Binary file not shown.

32
jpot9/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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

Binary file not shown.

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'kaki33')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "157"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'LIVE22')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "262"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
//app 名字
resValue('string', 'app_name', 'LORONGJUDI33')
buildConfigField "String", "BASE_URL", "\"https://lorongjudi33.com/\""
buildConfigField "int", "USERID", "252"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "false"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'LUXEGAMING')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "288"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

2
mbs9/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
mbs9/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
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 "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
View 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

Binary file not shown.

32
mbs9/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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

Binary file not shown.

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'Mega88MY')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "272"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'mg8vipmyr')
buildConfigField "String", "BASE_URL", "\"https://mg8vipmyr.pro/\""
buildConfigField "int", "USERID", "266"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'MGMHOTRAM')
buildConfigField "String", "BASE_URL", "\"https://mgmhotram.org/\""
buildConfigField "int", "USERID", "264"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

2
millionking96/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

View File

@@ -0,0 +1,92 @@
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 "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')
}

View 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

Binary file not shown.

32
millionking96/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 752 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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

Binary file not shown.

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'MK99PGK')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "118"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'MYKLBET')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "296"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'NEFTSOFT')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "294"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'LIVE22')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "262"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -3,7 +3,7 @@ plugins {
id 'com.google.gms.google-services'
}
def appOutPutName = "nova9sg"
def appOutPutName = "Nova9"
android {
namespace rootProject.ext.namespace
@@ -22,10 +22,9 @@ android {
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
resValue('color', 'style_color', '#0B0B0B')
//app 名字
resValue('string', 'app_name', 'NOVA9SG')
resValue('string', 'app_name', 'Nova9')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "220"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -11,8 +11,8 @@ android {
defaultConfig {
minSdkVersion 24
targetSdk 36
versionCode 142
versionName "v1.4.2"
versionCode 150
versionName "v1.5.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
applicationId "com.and.pantas3342"
@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'Pantas33')
buildConfigField "String", "BASE_URL", "\"https://www.pantas33e.com/\""
buildConfigField "int", "USERID", "142"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

2
pasti77/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
pasti77/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
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 "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')
}

View 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

Binary file not shown.

32
pasti77/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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

Binary file not shown.

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'PETROS777')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "267"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'PGK76')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "109"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

2
play33/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
play33/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
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 "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')
}

View 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

Binary file not shown.

32
play33/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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

Binary file not shown.

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', '420pokies')
buildConfigField "String", "BASE_URL", "\"https://420pokies.com/\""
buildConfigField "int", "USERID", "277"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'POKIESPLAY')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "280"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -24,7 +24,6 @@ android {
//app 名字
resValue('string', 'app_name', 'POWERCUCI')
//预埋订阅网址
buildConfigField "String", "BASE_URL", "\"https://pwrcuci.com/\""
//后台唯一ID
buildConfigField "int", "USERID", "253"
//状态栏文字颜色是否为白色

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -24,7 +24,6 @@ android {
//app 名字
resValue('string', 'app_name', 'PROTEIN')
//预埋订阅网址
buildConfigField "String", "BASE_URL", "\"https://pmcykch.com/\""
//后台唯一ID
buildConfigField "int", "USERID", "254"
//状态栏文字颜色是否为白色

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'REDSPIN3343')
buildConfigField "String", "BASE_URL", "\"https://redspinplay.com/\""
buildConfigField "int", "USERID", "263"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -24,7 +24,6 @@ android {
//app 名字
resValue('string', 'app_name', 'REDSPIN8')
//预埋订阅网址
buildConfigField "String", "BASE_URL", "\"https://redspinplay.com/\""
//后台唯一ID
buildConfigField "int", "USERID", "256"
//状态栏文字颜色是否为白色

View File

@@ -67,7 +67,6 @@ public class IndexActivity extends MainActivity {
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;

2
rm99/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
rm99/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
plugins {
id 'com.android.application'
id 'com.google.gms.google-services'
}
def appOutPutName = "rm99"
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.web.rm99"
//app大背景色
resValue('color', 'windows_color', '#1A1A1A')
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
resValue('color', 'style_color', '#08192A')
//app 名字
resValue('string', 'app_name', 'RM99')
buildConfigField "int", "USERID", "134"
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
rm99/google-services.json Normal file
View File

@@ -0,0 +1,29 @@
{
"project_info": {
"project_number": "39062545317",
"project_id": "rm99-621bc",
"storage_bucket": "rm99-621bc.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:39062545317:android:d17f8bfd70cd4e1f88be4c",
"android_client_info": {
"package_name": "com.web.rm99"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyAKv4LnepV4X6wJo-XAVGbr5qBcXO01Dtw"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}

BIN
rm99/justlet.jks Normal file

Binary file not shown.

32
rm99/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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
rm99/telur33.jks Normal file

Binary file not shown.

View File

@@ -85,3 +85,27 @@ include ':neftsoft'//294
include ':AU99live'//295
include ':myklbet'//296
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
include ':titanplayz'//310
include ':amazy'//311
include ':RMcuci'//227
include ':audking98'//251
include ':WEBO98'//245
include ':GOI9AU'//312
include ':spinsini'//76
include ':7ERACLUB'//313
include ':rm99'//134

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'SG99LIVE')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "279"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -11,8 +11,8 @@ android {
defaultConfig {
minSdkVersion 24
targetSdk 36
versionCode 151
versionName "v1.5.1"
versionCode 150
versionName "v1.5.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
applicationId "com.asdaaaa.kaki33"
@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'Slotkaki33')
buildConfigField "String", "BASE_URL", "\"https://slotkaki33.net/\""
buildConfigField "int", "USERID", "223"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

2
spinsini/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
spinsini/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
plugins {
id 'com.android.application'
id 'com.google.gms.google-services'
}
def appOutPutName = "spinsini"
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.company.spinsini"
//app大背景色
resValue('color', 'windows_color', '#FED802')
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
resValue('color', 'style_color', '#FED802')
//app 名字
resValue('string', 'app_name', 'spinsini')
buildConfigField "int", "USERID", "76"
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')
}

View File

@@ -0,0 +1,29 @@
{
"project_info": {
"project_number": "887822206410",
"project_id": "spinsini",
"storage_bucket": "spinsini.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:887822206410:android:5766f02014422e0117fb33",
"android_client_info": {
"package_name": "com.company.spinsini"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyBoEtTC3NZttQP8w9oQy-Ouhve6TZOLc4U"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}

BIN
spinsini/justlet.jks Normal file

Binary file not shown.

32
spinsini/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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
spinsini/telur33.jks Normal file

Binary file not shown.

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'Telur33')
buildConfigField "String", "BASE_URL", "\"https://telur33b.com/\""
buildConfigField "int", "USERID", "100"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'TEST')
buildConfigField "String", "BASE_URL", "\"https://cosmojack.app/\""
buildConfigField "int", "USERID", "284"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

2
titanplayz/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
titanplayz/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
plugins {
id 'com.android.application'
id 'com.google.gms.google-services'
}
def appOutPutName = "FlyDragon"
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.sbadab.FlyDragon"
//app大背景色
resValue('color', 'windows_color', '#000000')
//底部导航栏颜色 大背景颜色为 windows_color——style_color的上下渐变色
resValue('color', 'style_color', '#000000')
//app 名字
resValue('string', 'app_name', 'FlyDragon')
buildConfigField "int", "USERID", "310"
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')
}

View File

@@ -0,0 +1,29 @@
{
"project_info": {
"project_number": "546127961982",
"project_id": "titanplayz-a2589",
"storage_bucket": "titanplayz-a2589.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:546127961982:android:7a3eaeeee14fb134519d2f",
"android_client_info": {
"package_name": "com.sbadab.FlyDragon"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyDTG90A20wZnkpFqez0Ohr7J-OnRMc9y-U"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}

BIN
titanplayz/justlet.jks Normal file

Binary file not shown.

32
titanplayz/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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
titanplayz/telur33.jks Normal file

Binary file not shown.

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'toke66a')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "270"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'U88AUD')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "70"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'UU33AU')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "194"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'vv88')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "276"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'WE1WIN')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "120"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

2
we88sg26/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

92
we88sg26/build.gradle Normal file
View File

@@ -0,0 +1,92 @@
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 "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')
}

View 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

Binary file not shown.

32
we88sg26/proguard-rules.pro vendored Normal file
View 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.** {
*;
}

View 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>

View File

@@ -0,0 +1,78 @@
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);
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中==================================
}
}

View File

@@ -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());
}
}

View 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");
}
}

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

View 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>

View 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>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View 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
we88sg26/telur33.jks Normal file

Binary file not shown.

View File

@@ -11,8 +11,8 @@ android {
defaultConfig {
minSdkVersion 24
targetSdk 36
versionCode 45
versionName "3.2.5"
versionCode 150
versionName "v1.5.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//包名
@@ -24,7 +24,6 @@ android {
//app 名字
resValue('string', 'app_name', 'WINWAY')
//预埋订阅网址
buildConfigField "String", "BASE_URL", "\"https://winway33.site/\""
//后台唯一ID
buildConfigField "int", "USERID", "4"
//状态栏文字颜色是否为白色

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -11,8 +11,8 @@ android {
defaultConfig {
minSdkVersion 24
targetSdk 36
versionCode 45
versionName "3.2.5"
versionCode 150
versionName "v1.5.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//包名
@@ -24,7 +24,6 @@ android {
//app 名字
resValue('string', 'app_name', '计算器')
//预埋订阅网址
buildConfigField "String", "BASE_URL", "\"https://winway33.site/\""
//后台唯一ID
buildConfigField "int", "USERID", "4"
//状态栏文字颜色是否为白色

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'XOFUN88')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "274"
buildConfigField "boolean", "IS_WHITE", "false"
buildConfigField "boolean", "IS_ROUND", "true"

View File

@@ -66,7 +66,6 @@ public class IndexActivity extends MainActivity {
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;