张波

提交代码

Showing 72 changed files with 4473 additions and 0 deletions

Too many changes to show.

To preserve performance only 72 of 72+ files are displayed.

*.iml
.gradle
/local.properties
/.idea
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
... ...
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EclipseCodeFormatterProjectSettings">
<option name="projectSpecificProfile">
<ProjectSpecificProfile>
<option name="formatter" value="ECLIPSE" />
<option name="importOrder" value="java;javax;org;android;androidx;com;" />
<option name="pathToConfigFileJava" value="$PROJECT_DIR$/config/CodeQuality/WonderTek_CodeFormatter_Convention_v1.0.xml" />
<option name="selectedJavaProfile" value="WonderTek_CodeFormatter_Convention_v1.0" />
</ProjectSpecificProfile>
</option>
</component>
</project>
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
... ...
/build
\ No newline at end of file
... ...
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
}
android {
compileSdkVersion var.compileSdkVersion
buildToolsVersion var.buildToolsVersion
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion var.minSdkVersion
targetSdkVersion var.targetSdkVersion
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
ndk {
// noinspection ChromeOsAbiSupport
abiFilters "armeabi-v7a", "arm64-v8a", "x86"
}
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
lintOptions {
abortOnError false
}
compileOptions {
// Java兼容性设置为Java 8
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
// implementation 'androidx.appcompat:appcompat:1.6.1'
implementation "com.google.android.material:material:1.4.0"
// implementation project(path: ':wdstartup')
implementation 'com.wd:startup:1.0.0'
}
\ No newline at end of file
... ...
# 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
\ No newline at end of file
... ...
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.myapplication">
<!-- 请求网络 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature
android:name="android.software.leanback"
android:required="false" />
<application
android:name=".MyApplication"
android:allowBackup="true"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication"
tools:targetApi="31">
<activity
android:name="com.example.myapplication.MainActivity"
android:exported="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
\ No newline at end of file
... ...
package com.example.myapplication;
import android.app.Activity;
import android.os.Bundle;
import androidx.annotation.Nullable;
/**
* @ProjectName: PeopleDailyVideo
* @Package: com.people.displayui.main
* @ClassName: WelcomeActivity
* @Description: 启动APP过渡页面
* @Author: wd
* @CreateDate: 2022/10/28 17:36
* @UpdateUser: wd
* @UpdateDate: 2022/10/28 17:36
* @UpdateRemark: 更新说明:
* @Version: 1.0
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 直接进入首页
}
}
... ...
package com.example.myapplication;
import android.app.Application;
import android.util.Log;
import com.example.myapplication.starttask.StartTaskConfig;
import com.example.myapplication.starttask.StartTaskTool;
/**
* @author devel
* @time 2024/8/28 星期三 16:23
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Log.e("zzzz","MyApplication onCreate");
// test
StartTaskConfig taskConfig = new StartTaskConfig(this);
taskConfig.start();
StartTaskTool.startTaskInMain(this);
StartTaskTool.startPrivate(this);
StartTaskTool.startTaskInSplash(this);
}
}
... ...
/*
* Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
*/
package com.example.myapplication.starttask;
import android.content.Context;
import android.util.Log;
import com.example.myapplication.starttask.task.MyTaskCreator;
import com.wd.base.starttask.AlphaManager;
import com.wd.base.starttask.Project;
/**
* 描述:启动初始化任务
* 默认放在子线程执行,如果子线程执行有问题,构造函数中使用super(name,isInUiThread)
*
* @author : lvjinhui
* @since: 2022/7/2
*/
public class StartTaskConfig {
private Context mContext;
public StartTaskConfig(Context mContext) {
this.mContext = mContext;
}
/**
* 开始全部的初始化,在application
*/
public void start() {
if (mContext == null) {
return;
}
Project.Builder builder = new Project.Builder().withTaskCreator(new MyTaskCreator(mContext));
// 日志
builder.add(MyTaskCreator.TASK_LOG);
// AppContext.init、CompComponent 组件服务注册,MyFileUtil.init,直播消息弹幕和打赏
builder.add(MyTaskCreator.TASK_LOCAL);
AlphaManager.getInstance(mContext).addProject(builder.create());
AlphaManager.getInstance(mContext).start();
Log.e("zzzz","start");
}
/**
* 适当的放一部分延时初始化
*/
public void startTaskDelay() {
if (mContext == null) {
return;
}
Project.Builder builder = new Project.Builder().withTaskCreator(new MyTaskCreator(mContext));
// 延时初始化,短视频SDK,辅助通道
builder.add(MyTaskCreator.TASK_DELAY);
builder.setProjectName("delayGroup");
AlphaManager.getInstance(mContext).addProject(builder.create());
AlphaManager.getInstance(mContext).start();
Log.e("zzzz","startTaskDelay");
}
/**
* 需要用户同意隐私政策才能初始化的SDK,放在PrivatePolicyTask
*/
public void startPrivate() {
if (mContext == null) {
return;
}
Project.Builder builder = new Project.Builder().withTaskCreator(new MyTaskCreator(mContext));
// umeng 正式init
builder.add(MyTaskCreator.TASK_PRIVATE);
builder.setProjectName("privateGroup");
AlphaManager.getInstance(mContext).addProject(builder.create());
AlphaManager.getInstance(mContext).start();
Log.e("zzzz","startPrivate");
}
/**
* 优先级最高(未同意隐私政策,等同意隐私政策完成后初始化;
* 已同意隐私政策,直接初始化)
* 进入主页在初始的,但是在隐私弹窗之前,不可以放涉及隐私的SDK
*/
public void startTaskInMain() {
if (mContext == null) {
return;
}
Project.Builder builder = new Project.Builder().withTaskCreator(new MyTaskCreator(mContext));
// 子线程 内容组件、comp组件、语音识别
builder.add(MyTaskCreator.TASK_WD);
builder.setProjectName("inMainGroup");
AlphaManager.getInstance(mContext).addProject(builder.create());
AlphaManager.getInstance(mContext).start();
Log.e("zzzz","startTaskInMain");
}
}
... ...
/*
* Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
*/
package com.example.myapplication.starttask;
import android.content.Context;
/**
* 描述:
*
* @author : lvjinhui
* @since: 2022/7/7
*/
public class StartTaskTool {
public static void startTaskInMain(Context context) {
StartTaskConfig taskConfig = new StartTaskConfig(context);
taskConfig.startTaskInMain();
}
public static void startPrivate(Context context) {
StartTaskConfig taskConfig = new StartTaskConfig(context);
taskConfig.startPrivate();
}
public static void startTaskInSplash(Context context) {
StartTaskConfig taskConfig = new StartTaskConfig(context);
taskConfig.startTaskDelay();
}
}
... ...
/*
* Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
*/
package com.example.myapplication.starttask.task;
import android.content.Context;
import com.wd.base.starttask.Task;
//import com.orhanobut.logger.Logger;
//import com.people.kittools.constant.CommonConstant;
//import com.people.kittools.sp.SpUtils;
//import com.people.umeng.UmSdkHelper;
/**
* 描述:在主页初始化,不着急使用,进入主页用户必然已经同意隐私政策
*
* @author : lvjinhui
* @since: 2022/7/2
*/
public class DelayTask extends Task {
public DelayTask(Context mContext) {
super("DelayTask");
setExecutePriority(9);
// if (SpUtils.isFirstAgreementFlag()){
// return;
// }
try {
//友盟分享
// UmSdkHelper.initUmThirdSDk(mContext, CommonConstant.FILE_PROVIDER);
// Logger.e("DelayTask 执行");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
}
}
... ...
/*
* Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
*/
package com.example.myapplication.starttask.task;
import java.lang.ref.WeakReference;
import android.content.Context;
import com.wd.base.starttask.Task;
//import com.people.kittools.file.MyFileUtils;
//import com.people.uiframework.CompComponent;
/**
* 描述:本地代码初始化context,都在子线程执行
* 无关用户信息,收集用户信息的SDK初始化不要放进这里
* @author : lvjinhui
* @since: 2022/7/2
*/
public class LocalThreadTask extends Task {
private WeakReference<Context> weakReference;
public LocalThreadTask(Context context) {
super("LocalThreadTask");
weakReference = new WeakReference<>(context);
setExecutePriority(1);
}
@Override
public void run() {
Context mContext = weakReference.get();
// 注册创建对象
// new CompComponent().registerServices();
// // 赋值context
// MyFileUtils.init(mContext);
}
}
... ...
/*
* Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
*/
package com.example.myapplication.starttask.task;
import com.wd.base.starttask.Task;
//import com.people.logutil.LoggerInit;
/**
* 描述:com.orhanobut.logger 初始化,子线程初始化
*
* @author : lvjinhui
* @since: 2022/7/2
*/
public class LoggerTask extends Task {
public LoggerTask() {
super("LoggerTask");
}
@Override
public void run() {
// log 初始化
// LoggerInit.getInstance().init(true);// BuildConfig.DEBUG
}
}
... ...
/*
* Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
*/
package com.example.myapplication.starttask.task;
import android.content.Context;
import android.util.Log;
import com.wd.base.starttask.ITaskCreator;
import com.wd.base.starttask.Task;
/**
* 描述:create task
*
* @author : lvjinhui
* @since: 2022/7/2
*/
public class MyTaskCreator implements ITaskCreator {
/**
* 定义的task 名字, 比如 LoggerTask 在 task 构造函数传入
*/
public static final String TASK_LOG = "LoggerTask";
public static final String TASK_LOCAL = "LocalThreadTask";
public static final String TASK_DELAY = "DelayTask";
public static final String TASK_PRIVATE = "PrivatePolicyTask";
public static final String TASK_WD = "WCompTask";
private final Context mContext;
public MyTaskCreator(Context context) {
this.mContext = context;
}
@Override
public Task createTask(String taskName) {
Log.d("==ALPHA==", taskName);
switch (taskName) {
case TASK_LOG:
return new LoggerTask();
case TASK_LOCAL:
return new LocalThreadTask(mContext);
case TASK_DELAY:
return new DelayTask(mContext);
case TASK_PRIVATE:
return new PrivatePolicyTask(mContext);
case TASK_WD:
return new WCompTask();
default:
break;
}
return null;
}
}
... ...
/*
* Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
*/
package com.example.myapplication.starttask.task;
import android.content.Context;
import com.wd.base.starttask.Task;
//import com.orhanobut.logger.Logger;
//import com.people.kittools.sp.SpUtils;
//import com.people.umeng.UmSdkHelper;
/**
* 描述:需要用户同意隐私政策的SDK初始化
*
* @author : lvjinhui
* @since: 2022/7/2
*/
public class PrivatePolicyTask extends Task {
private Context instance;
public PrivatePolicyTask(Context context) {
super("PrivatePolicyTask");
this.instance = context;
// if (SpUtils.isFirstAgreementFlag()) {
// return;
// }
/**
* 友盟SDK正式初始化
*/
// UmSdkHelper.initUmSdk(instance);
// Logger.e("隐私SDK初始化");
}
@Override
public void run() {
}
}
... ...
/*
* Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
*/
package com.example.myapplication.starttask.task;
//import com.wondertek.wheat.ability.scheduler.WComponent;
//import com.wondertek.wheat.ability.scheduler.listener.IComponentRegister;
//import com.wondertek.wheat.ability.scheduler.listener.InitListener;
import com.wd.base.starttask.Task;
/**
* 描述:组件注册,反射多了影响性能
*
* @author : lvjinhui
* @since: 2022/7/2
*/
public class WCompTask extends Task {
public WCompTask() {
super("WCompTask");
}
@Override
public void run() {
// 代码组件
initWComponent();
}
private void initWComponent() {
// WComponent.init(new InitListener() {
// @Override
// public void beforeInit() {
//
// }
//
// @Override
// public void registerComponent(IComponentRegister iComponentRegister) {
// // 内容获取组件
// iComponentRegister.registerComponent("ContentComponent",
// "com.people.component.content.ContentComponent");
// // comp组件
// iComponentRegister.registerComponent("CompComponent", "com.people.component.comp.CompComponent");
// // 语音识别
// iComponentRegister.registerComponent("SpeechComponent", "com.people.speech.SpeechComponent");
// }
//
// @Override
// public void initFinish() {
//
// }
// });
}
}
... ...
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>
... ...
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
\ No newline at end of file
... ...
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl_parent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white" />
\ No newline at end of file
... ...
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
\ No newline at end of file
... ...
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
\ No newline at end of file
... ...
No preview for this file type
No preview for this file type
No preview for this file type
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>
\ No newline at end of file
... ...
<resources>
<string name="app_name">My Application</string>
</resources>
\ No newline at end of file
... ...
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- 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">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>
\ No newline at end of file
... ...
<?xml version="1.0" encoding="utf-8"?><!--
Sample backup rules file; uncomment and customize as necessary.
See https://developer.android.com/guide/topics/data/autobackup
for details.
Note: This file is ignored for devices older that API 31
See https://developer.android.com/about/versions/12/backup-restore
-->
<full-backup-content>
<!--
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
-->
</full-backup-content>
\ No newline at end of file
... ...
apply plugin: 'maven'
buildscript {
ext.kotlin_version = "1.4.32"
repositories {
mavenLocal()
mavenCentral()
// 以下四行代码为阿里gradle源,需要的人自己放開使用
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/releases' }
//阿里云 maven
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/repository/releases' }
google()
maven { url "https://jitpack.io" }
//华为
maven { url 'https://developer.huawei.com/repo/' }
//阿里云QuickTracking
maven { url 'https://repo1.maven.org/maven2/' }
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven {
url 'https://maven.aliyun.com/nexus/content/repositories/google/'
name 'aliyun-google'
}
// TingYun
maven { url "https://nexus2.tingyun.com/nexus/content/repositories/snapshots/" }
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.2"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.billy.android:autoregister:1.4.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
mavenLocal()
mavenCentral()
// 以下四行代码为阿里gradle源,需要的人自己放開使用
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/releases' }
//阿里云 maven
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/repository/releases' }
google()
maven { url "https://jitpack.io" }
//华为
maven { url 'https://developer.huawei.com/repo/' }
//阿里云QuickTracking
maven { url 'https://repo1.maven.org/maven2/' }
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven {
url 'https://maven.aliyun.com/nexus/content/repositories/google/'
name 'aliyun-google'
}
flatDir { dirs 'src/main/libs' }
// 快马私库
maven {
credentials {
username '6708d1cf6f4c940bd257c88d'
password 'Wm51gc4rARyr'
}
url 'https://packages.aliyun.com/6708d221eef79c23d7b02189/maven/repo-higom'
}
}
project.configurations.configureEach {
resolutionStrategy.eachDependency { details ->
if (details.requested.group == 'com.android.android.support' && !details.requested.name.contains('multidex')) {
details.useVersion "28.0.0"
}
}
}
// 强制依赖
configurations.configureEach {
exclude group: 'com.alipay.android.phone.thirdparty', module: 'securityguard-build'
resolutionStrategy {
force 'androidx.activity:activity:1.2.1'
force 'androidx.annotation:annotation:1.1.0'
force 'androidx.appcompat:appcompat:1.2.0'
force 'androidx.arch.core:core-common:2.1.0'
force 'androidx.arch.core:core-runtime:2.1.0'
force 'androidx.core:core-ktx:1.6.0'
force 'androidx.core:core:1.5.0'
force 'androidx.collection:collection:1.1.0'
force 'androidx.constraintlayout:constraintlayout:2.0.4'
force 'androidx.constraintlayout:constraintlayout-solver:2.0.4'
force 'androidx.coordinatorlayout:coordinatorlayout:1.1.0'
force 'androidx.fragment:fragment:1.3.1'
force 'androidx.lifecycle:lifecycle-common:2.3.0'
force 'androidx.multidex:multidex:2.0.1'
force 'androidx.recyclerview:recyclerview:1.2.0'
force 'androidx.vectordrawable:vectordrawable:1.1.0'
force 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
force 'com.squareup.okhttp3:okhttp:4.9.1'
force 'com.squareup.okio:okio:2.7.0'
force 'org.jetbrains.kotlin:kotlin-stdlib:1.4.32'
force 'org.jetbrains.kotlin:kotilin-stdlib-jdk8:1.4.32'
force 'org.jetbrains:annotations:15.0'
force 'net.sf.proguard:proguard-base:6.1.0'
}
}
}
ext {
var = [
// SDK And Tools
applicationId : "com.wondertek.dss",
minSdkVersion : 25,
targetSdkVersion : 30,
compileSdkVersion: 30,
buildToolsVersion: "30.0.3",
// 版本号,正式版本 1.0.0 1000080 后两位,80即标识为发布版本
// 测试版本 1.0.0_TF1 1000001 后两位,01即为测试版本号,01-79
// 升级版本 1.0.0_RC1 1000081 后两位,81即为升级版本号,81-99
versionName : "1.0.0", // release正式
debugVnName : "", // debug开发模式 用于区分debug模式下上报的日志
versionCode : 100,
//此版本号是SDK版本,不能随便改
aar_version : "1.0.0",
]
}
... ...
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="12">
<profile kind="CodeFormatterProfile" name="WonderTek_CodeFormatter_Convention_v1.0"
version="12">
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment"
value="common_lines" />
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries"
value="true" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation"
value="common_lines" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement"
value="common_lines" />
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true" />
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration"
value="common_lines" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off" />
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="1" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="49" />
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1" />
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement"
value="common_lines" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant"
value="16" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true" />
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch"
value="true" />
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration"
value="20" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line"
value="false" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations"
value="1" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references"
value="16" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column"
value="false" />
<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block"
value="true" />
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration"
value="end_of_line" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="120" />
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments"
value="true" />
<setting
id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration"
value="end_of_line" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch"
value="16" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body"
value="0" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line"
value="false" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16" />
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause"
value="common_lines" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call"
value="16" />
<setting
id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header"
value="true" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line" />
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration"
value="end_of_line" />
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body"
value="end_of_line" />
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true" />
<setting
id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration"
value="20" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="16" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation"
value="16" />
<setting
id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration"
value="20" />
<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error" />
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment"
value="true" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment"
value="true" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer"
value="20" />
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column"
value="true" />
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1" />
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation"
value="common_lines" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="20" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header"
value="true" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration"
value="16" />
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration"
value="0" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression"
value="16" />
<setting
id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line"
value="false" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration"
value="end_of_line" />
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case"
value="end_of_line" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false" />
<setting
id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression"
value="16" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while"
value="insert" />
<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="16" />
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator"
value="true" />
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases"
value="true" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines"
value="2147483647" />
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries"
value="true" />
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration"
value="end_of_line" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="16" />
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations"
value="false" />
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause"
value="common_lines" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation"
value="80" />
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column"
value="false" />
<setting id="org.eclipse.jdt.core.compiler.source" value="1.8" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="1" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer"
value="1" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration"
value="16" />
<setting
id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration"
value="16" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator"
value="false" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement"
value="do not insert" />
<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.8" />
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch"
value="end_of_line" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration"
value="common_lines" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16" />
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="16" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation"
value="16" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line"
value="true" />
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch"
value="true" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header"
value="true" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression"
value="16" />
<setting
id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration"
value="16" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body"
value="true" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer"
value="end_of_line" />
<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch"
value="do not insert" />
<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.8" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration"
value="common_lines" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested"
value="true" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant"
value="end_of_line" />
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration"
value="end_of_line" />
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="1" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header"
value="16" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters"
value="do not insert" />
<setting
id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header"
value="true" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration"
value="insert" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="false" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional"
value="insert" />
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description"
value="false" />
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space" />
<setting
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1" />
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation"
value="do not insert" />
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch"
value="insert" />
</profile>
</profiles>
\ No newline at end of file
... ...
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# 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
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=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
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
android.enableResourceOptimizations=false
#建议您关闭 R8 后再进行混淆
android.enableR8=false
android.enableR8.libraries=false
# 如果使用最新稳定版本 Android Studio 3.5 或以上,那么您需要在 gradle.properties 里面新增
android.buildOnlyTargetAbi=false
#网络请求接口版本 202204151851
requestVersion=107
#设置组件是否作为app还是lib,true是lib ,false 是app
#分享
isShareModule=true
#播放器
isPlayerModule=true
#是否直播模块运行 false可以单独运行
isLiveModule=true
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
#android.nonTransitiveRClass=true
... ...
No preview for this file type
#Fri Oct 23 14:37:25 CST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-6.8-all.zip
... ...
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"
... ...
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
... ...
rootProject.name = "wdkitcore"
include ':app'
include ':wdkitcore'
\ No newline at end of file
... ...
/build
\ No newline at end of file
... ...
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'maven'
}
android {
compileSdkVersion var.compileSdkVersion
defaultConfig {
minSdkVersion var.minSdkVersion
targetSdkVersion var.targetSdkVersion
versionCode var.versionCode
versionName var.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
buildConfigField "String", "API_VERSION", "\"${requestVersion}\""
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
// 自定义AAR包名
android.libraryVariants.all { variant ->
variant.outputs.all {
if (outputFileName != null && outputFileName.endsWith(".aar")) {
def fileName = "${project.name}-${buildType.name}-v${var.aar_version}.aar"
outputFileName = fileName
}
}
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.wd:log:1.0.0'
}
uploadArchives {
repositories {
mavenDeployer {
repository(url: "https://packages.aliyun.com/6708d221eef79c23d7b02189/maven/repo-higom/") {
authentication(userName: '6708d1cf6f4c940bd257c88d', password: 'Wm51gc4rARyr')
}
pom.project {
artifactId 'wdkit'
version '1.0.0'
groupId 'com.wd'
packaging 'aar'
}
}
}
}
\ No newline at end of file
... ...
# 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
\ No newline at end of file
... ...
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.wd.foundation.wdkitcore">
</manifest>
\ No newline at end of file
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.scheduler;
import com.wd.base.log.Logger;
/**
* <组件基类>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/5/23]
* @since V1.0.0.0
*/
public abstract class BaseComponent {
/**
* 注册服务:子类实现
*/
public abstract void registerServices();
protected void registerService(Class<? extends IService> serviceApiClazz,
Class<? extends IService> serviceImplClass) {
if (serviceImplClass != null && serviceApiClazz != null) {
WComponent.registerService(serviceApiClazz, serviceImplClass);
} else {
Logger.t("XC:BaseComponent").w("register service failed, api or impl class is null");
}
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.scheduler;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import android.text.TextUtils;
import com.wd.base.log.Logger;
import com.wd.foundation.wdkit.tools.CastUtils;
import com.wd.foundation.wdkit.tools.ReflectionUtils;
/**
* <组件持有者>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/5/23]
* @since V1.0.0.0
*/
public class ComponentHolder {
private static final String TAG = "ComponentHolder";
/**
* 组件持有者
*/
private Map<String, BaseComponent> mComponentService = new HashMap<>();
/**
* 组件注册器
*
* @param componentName 组件名称
* @param componentClazzFull 组件类全路径名
*/
protected void registerComponent(String componentName, String componentClazzFull) {
if (TextUtils.isEmpty(componentName)) {
Logger.t(TAG).w("registerComponent failed, componentName is empty");
return;
}
if (TextUtils.isEmpty(componentClazzFull)) {
Logger.t(TAG).w("registerComponent failed, componentClazzFull is empty");
}
BaseComponent component = createInstance(componentClazzFull);
if (component == null) {
Logger.t(TAG).w("registerComponent failed, component is null, please check the componentClazzFull");
}
mComponentService.put(componentName, component);
}
private BaseComponent createInstance(String componentClazzFull) {
Class clazz = ReflectionUtils.getClass(componentClazzFull);
if (clazz == null) {
Logger.t(TAG).w("createInstance failed, clazz is not exist");
return null;
}
if (!ReflectionUtils.isSubClassOf(clazz, BaseComponent.class)) {
Logger.t(TAG).w("createInstance failed, clazz is not sub of BaseComponent");
return null;
}
BaseComponent component = CastUtils.cast(ReflectionUtils.newInstance(clazz), BaseComponent.class);
if (component == null) {
Logger.t(TAG).w("createInstance failed, get instance is null");
}
return component;
}
/**
* 获得全部组件
*
* @return 全部组件
*/
protected Collection<BaseComponent> getComponents() {
return mComponentService.values();
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.scheduler;
import java.util.Collection;
import com.wd.base.log.Logger;
import com.wd.foundation.wdkit.scheduler.listener.IComponentRegister;
import com.wd.foundation.wdkit.scheduler.listener.InitListener;
import com.wd.foundation.wdkit.thread.ThreadPoolUtils;
import com.wd.foundation.wdkit.tools.CastUtils;
/**
* <组件管理器>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/4/7]
* @since V1.0.0.0
*/
public class ComponentManager {
private static final String TAG = "ComponentManager";
/**
* 组件持有者
*/
private ComponentHolder mComponentHolder = new ComponentHolder();
/**
* 服务持有者
*/
private ServiceHolder mServiceHolder = new ServiceHolder();
/**
* 同步初始化
*
* @param listener 初始化监听
*/
protected void init(InitListener listener) {
innerInit(listener);
}
/**
* 异步初始化
*
* @param listener 初始化监听
*/
protected void asynInit(final InitListener listener) {
ThreadPoolUtils.emergencySubmit(new Runnable() {
@Override
public void run() {
innerInit(listener);
}
});
}
private void innerInit(InitListener listener) {
listener.beforeInit();
listener.registerComponent(new IComponentRegister() {
@Override
public void registerComponent(String componentName, String componentClazzFull) {
mComponentHolder.registerComponent(componentName, componentClazzFull);
}
});
registerService();
listener.initFinish();
}
private void registerService() {
Collection collection = mComponentHolder.getComponents();
if (collection == null || collection.size() == 0) {
Logger.t(TAG).w("component collection is empty");
return;
}
for (Object object : collection) {
BaseComponent component = CastUtils.cast(object, BaseComponent.class);
if (component == null) {
continue;
}
component.registerServices();
}
}
/**
* 获得组件服务
*
* @param serviceClazz 服务类
* @param <S> 服务类型
* @return 组件服务器
*/
public <S extends IService> S getService(Class<S> serviceClazz) {
return (S) mServiceHolder.getService(serviceClazz);
}
/**
* 注册服务组件
*
* @param serviceApi 服务接口
* @param serviceImpl 服务实现
*/
public void registerService(Class<? extends IService> serviceApi, Class<? extends IService> serviceImpl) {
mServiceHolder.registerService(serviceApi, serviceImpl);
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.scheduler;
/**
* <服务接口类>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/4/7]
* @since V1.0.0.0
*/
public interface IService {
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.scheduler;
import java.util.HashMap;
import java.util.Map;
import com.wd.base.log.Logger;
import com.wd.foundation.wdkit.tools.CastUtils;
import com.wd.foundation.wdkit.tools.ReflectionUtils;
/**
* <服务的持有者>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/5/23]
* @since V1.0.0.0
*/
public class ServiceHolder {
private static final String TAG = "ServiceHolder";
/**
* 服务容器
*/
private Map<String, IService> mServiceMap = new HashMap<>();
public void registerService(Class<? extends IService> apiService, Class<? extends IService> serviceImpl) {
if (apiService == null) {
Logger.t(TAG).i("registerService failed, registerService is null");
return;
}
if (serviceImpl == null) {
Logger.t(TAG).i("registerService failed, serviceImpl is null");
return;
}
IService service = CastUtils.cast(ReflectionUtils.newInstance(serviceImpl), IService.class);
if (service == null) {
Logger.t(TAG).i("createServiceInstance failed, please check serviceImpl");
return;
}
mServiceMap.put(getKey(apiService), service);
}
/**
* 获得组件服务
*
* @param serviceClazzApi 服务类
* @return 组件服务器
*/
public IService getService(Class<? extends IService> serviceClazzApi) {
if (serviceClazzApi == null) {
Logger.t(TAG).i("getService failed, please check serviceClazzApi");
return null;
}
IService service = mServiceMap.get(getKey(serviceClazzApi));
if (service == null) {
Logger.t(TAG).i("getService failed, service has not init");
}
return service;
}
private String getKey(Class<? extends IService> serviceClazzApi) {
return serviceClazzApi.getName();
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.scheduler;
import com.wd.foundation.wdkit.scheduler.listener.InitListener;
/**
* <组件化:对外接口组件>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/5/23]
* @since V1.0.0.0
*/
public class WComponent {
/**
* 组件管理器
*/
private static ComponentManager mComponentManager = new ComponentManager();
/**
* 初始化接口:同步
*
* @param listener 初始化监听器
*/
public static void init(InitListener listener) {
mComponentManager.init(listener);
}
/**
* 初始化接口:异步
*
* @param listener 初始化监听器
*/
public static void asynInit(InitListener listener) {
mComponentManager.asynInit(listener);
}
/**
* 获得组件服务
*
* @param serviceClazz 服务类
* @param <S> 服务类型
* @return 组件服务器
*/
public static <S extends IService> S getService(Class<S> serviceClazz) {
return mComponentManager.getService(serviceClazz);
}
/**
* 注册服务组件
*
* @param serviceApi 服务接口
* @param serviceImpl 服务实现
*/
public static void registerService(Class<? extends IService> serviceApi, Class<? extends IService> serviceImpl) {
mComponentManager.registerService(serviceApi, serviceImpl);
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.scheduler.listener;
/**
* <组件注册器>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/4/7]
* @since V1.0.0.0
*/
public interface IComponentRegister {
/**
* 注册组件
*
* @param componentName 组件名称
* @param componentClazzFull 组件类全量名
*/
void registerComponent(String componentName, String componentClazzFull);
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.scheduler.listener;
/**
* <初始化接口>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/4/7]
* @since V1.0.0.0
*/
public interface InitListener {
/**
* 初始化之前
*/
void beforeInit();
/**
* 注册组件
*
* @param register 组件注册器
*/
void registerComponent(IComponentRegister register);
/**
* 初始化结束
*/
void initFinish();
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.thread;
import java.util.ArrayList;
import java.util.List;
/**
* <自动释放的 Runnable 对象持有器>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/5/23]
* @since V1.0.0.0
*/
public final class AutoReleaseNestedHolder {
private List<Object> nestedObject = new ArrayList();
private AutoReleaseNestedHolder() {
}
public static AutoReleaseNestedHolder create() {
return new AutoReleaseNestedHolder();
}
void deposit(Object obj) {
this.nestedObject.add(obj);
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.thread;
import java.lang.ref.WeakReference;
import com.wd.base.log.Logger;
/**
* <自动释放 Runnable>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/5/23]
* @since V1.0.0.0
*/
public abstract class AutoReleaseRunnable implements Runnable {
private static final String TAG = "AutoReleaseRunnable";
private final WeakReference<AutoReleaseRunnable> ref;
public AutoReleaseRunnable(AutoReleaseNestedHolder holder) {
if (holder == null) {
this.ref = null;
Logger.t(TAG).i("deposit holder is null");
} else {
holder.deposit(this);
this.ref = new WeakReference(this);
}
}
static Runnable transfer(Runnable runnable) {
WeakReference<AutoReleaseRunnable> ref =
runnable instanceof AutoReleaseRunnable ? ((AutoReleaseRunnable) runnable).getRef() : null;
return (Runnable) (ref == null ? runnable : new AutoReleaseRunnableWrapper(runnable));
}
private WeakReference<AutoReleaseRunnable> getRef() {
return this.ref;
}
private static final class AutoReleaseRunnableWrapper implements Runnable {
private final WeakReference<AutoReleaseRunnable> autoReleaseRunnableRef;
private AutoReleaseRunnableWrapper(Runnable runnable) {
this.autoReleaseRunnableRef =
runnable instanceof AutoReleaseRunnable ? ((AutoReleaseRunnable) runnable).getRef() : null;
}
public void run() {
if (this.autoReleaseRunnableRef != null) {
AutoReleaseRunnable runnable = (AutoReleaseRunnable) this.autoReleaseRunnableRef.get();
if (runnable != null) {
runnable.run();
} else {
Logger.t(TAG).i("runnable is released");
}
}
}
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.thread;
/**
* <取消接口>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/05/23]
* @since V1.0.0.0
*/
public interface Cancelable {
/**
* 取消
*/
void cancel();
/**
* 是否已经取消
*
* @return true: 取消,false:未取消
*/
boolean isCanceled();
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.thread;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
import com.wd.base.log.Logger;
/**
* <带有生命周期的 Runnable>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/4/7]
* @since V1.0.0.0
*/
public abstract class LifecycleRunnable implements Runnable {
private static final String TAG = "LifecycleRunnable";
private static final AtomicLong RUNNABLE_ID_COUNTER = new AtomicLong(0L);
private static final ConcurrentHashMap<Long, LifecycleRunnable> RUNNABLE_CACHE = new ConcurrentHashMap();
private final long runnableId;
private final boolean isValid;
public LifecycleRunnable(Lifecycle lifecycle) {
if (lifecycle != null) {
this.isValid = true;
this.runnableId = RUNNABLE_ID_COUNTER.getAndIncrement();
lifecycle.addObserver(new InnerLifecycleObserver(this.runnableId));
RUNNABLE_CACHE.put(this.runnableId, this);
Logger.t(TAG).i("register runnable:" + this.runnableId);
} else {
this.isValid = false;
this.runnableId = -1L;
Logger.t(TAG).i("lifecycle is null");
}
}
/**
* Runnable 转换成生命周期的 Runnable
*
* @param runnable 运行接口
* @return Runnable
*/
static Runnable transfer(Runnable runnable) {
return (Runnable) (runnable instanceof LifecycleRunnable && ((LifecycleRunnable) runnable).isValid
? new LifecycleRunnableWrapper(((LifecycleRunnable) runnable).runnableId) : runnable);
}
/**
* 生命周期观察者
*/
private static class InnerLifecycleObserver implements LifecycleObserver {
private final long runnableId;
InnerLifecycleObserver(long id) {
this.runnableId = id;
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
Logger.t(TAG).i("remove runnable id:" + this.runnableId);
LifecycleRunnable.RUNNABLE_CACHE.remove(this.runnableId);
}
}
private static class LifecycleRunnableWrapper implements Runnable {
private final long runnableId;
LifecycleRunnableWrapper(long id) {
this.runnableId = id;
}
public void run() {
Runnable runnable = (Runnable) LifecycleRunnable.RUNNABLE_CACHE.get(this.runnableId);
if (runnable != null) {
runnable.run();
} else {
Logger.t(TAG).i("runnable is released");
}
}
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.thread;
import android.os.Handler;
import androidx.annotation.Nullable;
import com.wd.base.log.Logger;
/**
* <发送取消接口>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/5/23]
* @since V1.0.0.0
*/
final class PostCancelable implements Cancelable {
private static final String TAG = "PostCancelable";
private final Runnable runnable;
private final Handler handler;
private volatile boolean canceled = false;
private PostCancelable(@Nullable Handler h, @Nullable Runnable r) {
this.handler = h;
this.runnable = r;
}
static PostCancelable from(@Nullable Handler h, @Nullable Runnable r) {
return new PostCancelable(h, r);
}
public void cancel() {
if (this.runnable != null && this.handler != null) {
this.handler.removeCallbacks(this.runnable);
this.canceled = true;
} else {
Logger.t(TAG).e("runnable or handler not set, cannot cancel");
}
}
public boolean isCanceled() {
return this.canceled;
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.thread;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import android.os.Handler;
import android.os.Looper;
import android.os.Process;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.wd.base.log.Logger;
import com.wd.foundation.wdkit.tools.StringUtils;
/**
* <线程池工具类>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/4/7]
* @since V1.0.0.0
*/
public final class ThreadPoolUtils {
private static final String TAG = "ThreadPoolUtil";
/**
* CPU 个数
*/
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
/**
* 主线程 Handler
*/
private static final Handler MAIN_HANDLER = new Handler(Looper.getMainLooper());
/**
* 一般优先级的线程池容量:和 CPU 一样多
*/
private static final int NORMAL_POOL_SIZE = CPU_COUNT;
/**
* 高优先级线程池大小
*/
private static final int EMERGENCY_POOL_SIZE = 2;
/**
* 低优先级线程池大小
*/
private static final int BACKGROUND_POOL_SIZE = 2;
/**
* 高优先级线程池
*/
private static final ThreadPoolExecutor EMERGENCY_THREAD_POOL =
new ThreadPoolExecutor(EMERGENCY_POOL_SIZE, 2147483647, 60L, TimeUnit.SECONDS, new SynchronousQueue(),
new PriorityGroupedThreadFactory(Thread.MAX_PRIORITY, (String) null));;
/**
* 普通优先级线程池
*/
private static final ThreadPoolExecutor NORMAL_THREAD_POOL =
new ThreadPoolExecutor(NORMAL_POOL_SIZE, NORMAL_POOL_SIZE, 0L, TimeUnit.SECONDS, new LinkedBlockingQueue(),
new PriorityGroupedThreadFactory(Thread.NORM_PRIORITY, (String) null));;
/**
* 低优先级线程池
*/
private static final ThreadPoolExecutor BACKGROUND_THREAD_POOL = new ThreadPoolExecutor(BACKGROUND_POOL_SIZE, 2, 0L,
TimeUnit.SECONDS, new LinkedBlockingQueue(), new PriorityGroupedThreadFactory(1, (String) null));
/**
* 等待线程池
*/
private static final ScheduledThreadPoolExecutor SCHEDULED_THREAD_POOL =
new ScheduledThreadPoolExecutor(NORMAL_POOL_SIZE);;
/**
* 对象锁
*/
private static final Object GROUP_LOCK = new Object();
/**
* 普通的线程组池大小:1. (CPU个数 -1) 和 4 取最小值得到值 A 2. 值 A 和 2 取最大值,保证不低于两组
*/
private static final int NORMAL_GROUP_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
/**
* 线程组池的容器
*/
private static final Map<String, ThreadPoolExecutor> GROUP_THREAD_POOLS = new HashMap<>();
private ThreadPoolUtils() {
}
/**
* 子线程执行:普通优先级
*
* @param runnable 运行接口
* @return 取消接口
*/
public static Cancelable submit(Runnable runnable) {
return submitInner(runnable, Thread.NORM_PRIORITY, (String) null);
}
/**
* 子线程执行:普通优先级
*
* @param groupName 指定的线程池
* @param runnable 执行
* @return 取消
*/
public static Cancelable submitWithGroup(String groupName, Runnable runnable) {
return submitInner(runnable, Thread.NORM_PRIORITY, groupName);
}
/**
* 关闭线程组
*
* @param groupName 组名字
*/
public static void shutdownGroup(String groupName) {
ThreadPoolExecutor groupPool;
synchronized (GROUP_LOCK) {
groupPool = (ThreadPoolExecutor) GROUP_THREAD_POOLS.remove(groupName);
}
if (groupPool != null) {
groupPool.shutdown();
Logger.t(TAG).i("group thread pool shutdown:" + groupName);
}
}
/**
* 子线程池执行:高优先级
*
* @param runnable 运行接口
* @return 取消接口
*/
public static Cancelable emergencySubmit(Runnable runnable) {
return submitInner(runnable, Thread.MAX_PRIORITY, (String) null);
}
/**
* 子线程池执行:高优先级
*
* @param runnable 运行接口
* @return 取消接口
*/
public static Cancelable backgroundSubmit(Runnable runnable) {
return submitInner(runnable, Thread.MIN_PRIORITY, (String) null);
}
private static Cancelable submitInner(Runnable runnable, int priority, String groupName) {
if (null == runnable) {
Logger.t(TAG)
.e("submit: Task is null, priority:" + PriorityGroupedThreadFactory.getPriorityName(priority)
+ ", group:" + groupName);
return SubmitCancelable.from((Future) null);
} else {
ThreadPoolExecutor actualPool = getThreadPoolInner(groupName, priority);
BlockingQueue<Runnable> queue = actualPool.getQueue();
int queueSizeBeforeSend = queue.size();
long currTime = System.currentTimeMillis();
PriorityRunnable actualRunnable = new PriorityRunnable(runnable, priority, queueSizeBeforeSend, currTime);
try {
Future<?> future = actualPool.submit(actualRunnable);
return SubmitCancelable.from(future);
} catch (RejectedExecutionException var10) {
Logger.t(TAG)
.e("submit: Task is rejected, priority:" + PriorityGroupedThreadFactory.getPriorityName(priority)
+ ", group:" + groupName);
return SubmitCancelable.from((Future) null);
}
}
}
/**
* 延迟提交
*
* @param runnable 执行接口
* @param delayTime 延迟时间
* @param unit 时间单位
* @return 取消接口
*/
public static Cancelable schedule(Runnable runnable, long delayTime, TimeUnit unit) {
Runnable intermediate = LifecycleRunnable.transfer(runnable);
Runnable actualRunnable = AutoReleaseRunnable.transfer(intermediate);
Future<?> future = SCHEDULED_THREAD_POOL.schedule(actualRunnable, delayTime, unit);
return SubmitCancelable.from(future);
}
/**
* 周期性执行线程
*
* @param runnable 执行接口
* @param initialDelay 延迟时间
* @param period 周期时间
* @param unit 单位
* @return 取消接口
*/
public static Cancelable scheduleAtFixedRate(Runnable runnable, long initialDelay, long period, TimeUnit unit) {
Runnable intermediate = LifecycleRunnable.transfer(runnable);
Runnable actualRunnable = AutoReleaseRunnable.transfer(intermediate);
Future<?> future = SCHEDULED_THREAD_POOL.scheduleAtFixedRate(actualRunnable, initialDelay, period, unit);
return SubmitCancelable.from(future);
}
private static ThreadPoolExecutor getThreadPoolInner(String groupName, int priority) {
if (!StringUtils.isEmpty(groupName)) {
return getGroupedThreadPool(groupName, -1, -1);
} else if (priority == Thread.MAX_PRIORITY) {
return EMERGENCY_THREAD_POOL;
} else {
return priority == Thread.MIN_PRIORITY ? BACKGROUND_THREAD_POOL : NORMAL_THREAD_POOL;
}
}
/**
* 获得组线程池
*
* @param groupName 组名字
* @param threadCount 线程数量
* @param priority 线程的优先级
* @return 线程池
*/
public static ThreadPoolExecutor getGroupedThreadPool(@NonNull String groupName, int threadCount, int priority) {
int actualThreadCount = threadCount <= 0 ? NORMAL_GROUP_POOL_SIZE : threadCount;
int actualPriority = priority == -1 ? Thread.NORM_PRIORITY : priority;
synchronized (GROUP_LOCK) {
// 如果在缓存中拿不到线程池,则新建一个线程池,并且添加到缓存中
ThreadPoolExecutor groupPool = (ThreadPoolExecutor) GROUP_THREAD_POOLS.get(groupName);
if (groupPool == null) {
groupPool = new ThreadPoolExecutor(actualThreadCount, actualThreadCount, 30L, TimeUnit.SECONDS,
new LinkedBlockingQueue(), new PriorityGroupedThreadFactory(actualPriority, groupName));
groupPool.allowCoreThreadTimeOut(true);
GROUP_THREAD_POOLS.put(groupName, groupPool);
}
return groupPool;
}
}
/**
* 主线程执行
*
* @param runnable 执行接口
* @return 取消接口
*/
public static Cancelable postToMain(Runnable runnable) {
Runnable intermediate = LifecycleRunnable.transfer(runnable);
Runnable actualRunnable = AutoReleaseRunnable.transfer(intermediate);
MAIN_HANDLER.post(actualRunnable);
return PostCancelable.from(MAIN_HANDLER, actualRunnable);
}
/**
* 主线程延时执行
*
* @param runnable 执行接口
* @param delayMillis 延时时间:毫秒
* @return 取消接口
*/
public static Cancelable postToMainDelay(Runnable runnable, long delayMillis) {
Runnable intermediate = LifecycleRunnable.transfer(runnable);
Runnable actualRunnable = AutoReleaseRunnable.transfer(intermediate);
MAIN_HANDLER.postDelayed(actualRunnable, delayMillis);
return PostCancelable.from(MAIN_HANDLER, actualRunnable);
}
/**
* 线程工厂类
*/
private static class PriorityGroupedThreadFactory implements ThreadFactory {
/**
* 线程数量
*/
private final AtomicInteger threadNumber = new AtomicInteger(1);
/**
* 命名前缀
*/
private final String namePrefix;
/**
* 线程优先级
*/
private final int threadPriority;
PriorityGroupedThreadFactory(int priority, String groupName) {
this.threadPriority = priority;
String group = groupName == null ? "def" : StringUtils.str2LowerCase(groupName);
this.namePrefix = "x-" + getPriorityName(priority) + "-" + group + "-";
}
static String getPriorityName(int priority) {
if (priority == 10) {
return "emrg";
} else {
return priority == 1 ? "back" : "norm";
}
}
public Thread newThread(@NonNull Runnable r) {
Thread t = new Thread(r, this.namePrefix + this.threadNumber.getAndIncrement());
if (t.isDaemon()) {
t.setDaemon(false);
}
if (this.threadPriority == 1) {
t.setPriority(1);
} else {
t.setPriority(5);
}
return t;
}
}
/**
* 线程取消接口
*/
private static final class SubmitCancelable implements Cancelable {
private Future<?> futureTask;
private SubmitCancelable(@Nullable Future<?> future) {
this.futureTask = future;
}
static SubmitCancelable from(@Nullable Future<?> future) {
return new SubmitCancelable(future);
}
public void cancel() {
if (this.futureTask == null) {
Logger.t(TAG).e("future not set, cannot cancel");
} else {
this.futureTask.cancel(true);
}
}
public boolean isCanceled() {
if (this.futureTask == null) {
Logger.t(TAG).e("future not set, same as canceled");
return false;
} else {
return this.futureTask.isCancelled();
}
}
}
/**
* 带有优先级响应接口
*/
private static class PriorityRunnable implements Runnable {
private final int threadPriorityInner;
private final Runnable runnableInner;
private int queueSizeBeforeSend;
private long queueTime;
private static long WARNING_WAIT_THRESHOLD = 1000L;
PriorityRunnable(Runnable runnable, int priority, int queueSizeBeforeSend, long queueTime) {
Runnable intermediate = LifecycleRunnable.transfer(runnable);
this.runnableInner = AutoReleaseRunnable.transfer(intermediate);
this.threadPriorityInner = priority == 1 ? 10 : 0;
this.queueSizeBeforeSend = queueSizeBeforeSend;
this.queueTime = queueTime;
}
public void run() {
if (this.runnableInner == null) {
Logger.t(TAG).w("inner runnable is null");
} else {
long currTime = System.currentTimeMillis();
long waitTime = currTime - this.queueTime;
if (waitTime > WARNING_WAIT_THRESHOLD) {
Thread currThread = Thread.currentThread();
Logger.t(TAG)
.w("wait too long in queue, wait time:" + waitTime + ", waitNum:" + this.queueSizeBeforeSend
+ ", tName:" + currThread.getName() + ", tPry:" + currThread.getPriority());
}
Process.setThreadPriority(this.threadPriorityInner);
this.runnableInner.run();
}
}
}
}
... ...
package com.wd.foundation.wdkitcore.thread;
/**
* 文件描述
*
* @author huweixiong
* @version [V1.0.0.1, 2020/11/12]
* @since V1.0.0.1
*/
public final class WorkerThread {
private static final String TAG = "WorkerThread";
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.tools;
import java.util.HashMap;
import android.content.Context;
import androidx.collection.SparseArrayCompat;
/**
* <BR>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/4/7]
* @since V1.0.0.0
*/
public final class AppContext {
private static final String TAG = "AppContext";
private static Context mContext;
public static boolean mPause = false;
public AppContext() {
}
public static SparseArrayCompat<HashMap<String, Boolean>> sparseArrayCompat = new SparseArrayCompat<>();
public static HashMap<String, Boolean> mSet = new HashMap<>();
public static void init(Context context) {
mContext = context;
}
public static void setCurrentMap(int index) {
mSet = sparseArrayCompat.get(index);
}
public static void clearMaps() {
sparseArrayCompat.clear();
}
public static void intMaps(int index) {
HashMap<String, Boolean> map = new HashMap<>();
sparseArrayCompat.put(index, map);
}
public static Context getContext() {
return mContext;
}
public static String getFileDirPath() {
return mContext != null && mContext.getFilesDir() != null ? mContext.getFilesDir().getPath() : "";
}
}
\ No newline at end of file
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.tools;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import android.text.TextUtils;
import android.util.SparseBooleanArray;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.wd.base.log.Logger;
/**
* <数组工具类>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/4/7]
* @since V1.0.0.0
*/
public class ArrayUtils {
private static final String TAG = "ArrayUtils";
private ArrayUtils() {
}
public static boolean isEmpty(String[] str) {
return null == str || 0 == str.length;
}
public static boolean isEmpty(Object[] array) {
return null == array || 0 == array.length;
}
public static boolean isEmpty(Collection<?> collection) {
return null == collection || collection.isEmpty();
}
public static boolean isNotEmpty(Collection<?> collection) {
return null != collection && !collection.isEmpty();
}
public static boolean isEmpty(Map<?, ?> map) {
return null == map || map.isEmpty();
}
public static boolean isNotEmpty(Map<?, ?> map) {
return null != map && !map.isEmpty();
}
public static boolean isEmpty(long[] array) {
return null == array || 0 == array.length;
}
public static boolean isEmpty(int[] array) {
return null == array || 0 == array.length;
}
public static boolean isEmpty(byte[] array) {
return null == array || 0 == array.length;
}
public static <T> List<T> getSubList(List<T> source, int start, int end) {
return null != source && start >= 0 && end >= start && end <= source.size() ? source.subList(start, end) : null;
}
public static <T> T getListElement(List<T> source, int index) {
return !isEmpty((Collection) source) && index >= 0 && index < source.size() ? source.get(index) : null;
}
public static String arrayToString(String[] sources, String separator) {
if (sources == null) {
return "";
} else {
StringBuilder builder = new StringBuilder();
String[] var3 = sources;
int var4 = sources.length;
for (int var5 = 0; var5 < var4; ++var5) {
String source = var3[var5];
builder.append(source).append(separator);
}
String res = builder.toString();
return StringUtils.isEmpty(res) ? "" : StringUtils.cutString(res, 0, res.length() - 1);
}
}
public static String listToString(List<String> sources, String separator) {
if (isEmpty((Collection) sources)) {
return null;
} else {
StringBuilder builder = new StringBuilder();
Iterator var3 = sources.iterator();
while (var3.hasNext()) {
String source = (String) var3.next();
builder.append(source).append(separator);
}
String res = builder.toString();
return TextUtils.isEmpty(res) ? "" : StringUtils.cutString(res, 0, res.length() - 1);
}
}
public static <T> List<T> objToList(Object object, Class<T> clazz) {
if (clazz != null && object instanceof List) {
List objects = (List) object;
if (!isEmpty((Collection) objects)) {
Object obj = objects.get(0);
if (clazz.isInstance(obj)) {
try {
return (List) object;
} catch (ClassCastException var5) {
return null;
}
}
}
}
return null;
}
public static <T> ArrayList<T> objToArrayList(Object object, Class<T> clazz) {
if (clazz != null && object instanceof ArrayList) {
List objects = (ArrayList) object;
if (!isEmpty((Collection) objects)) {
Object obj = objects.get(0);
if (clazz.isInstance(obj)) {
try {
return (ArrayList) object;
} catch (ClassCastException var5) {
return null;
}
}
}
}
return null;
}
public static boolean getValueFromSparseBooleanArray(SparseBooleanArray sparseBooleanArray, int index,
boolean defaultValue) {
return sparseBooleanArray != null && sparseBooleanArray.size() > index ? sparseBooleanArray.get(index)
: defaultValue;
}
public static <T> T getArrayElement(T[] source, int index) {
return !isEmpty(source) && index >= 0 && index < source.length ? source[index] : null;
}
public static float getFloatArrayElement(float[] source, int index) {
return source != null && index >= 0 && index < source.length ? source[index] : 0.0F;
}
public static int getIntArrayElement(int[] source, int index) {
return source != null && index >= 0 && index < source.length ? source[index] : 0;
}
public static void modifyFloatArrayValue(float[] source, int index, float value) {
if (source != null && index >= 0 && index < source.length) {
source[index] = value;
}
}
public static void modifyIntArrayValue(int[] source, int index, int value) {
if (source != null && index >= 0 && index < source.length) {
source[index] = value;
}
}
public static int getListSize(List list) {
return isEmpty((Collection) list) ? 0 : list.size();
}
public static void arrayCopy(byte[] src, int srcPos, byte[] dest, int destPos, int length) {
if (null != src && null != dest) {
if (srcPos >= 0 && srcPos + length <= src.length) {
if (destPos >= 0 && destPos + length <= dest.length) {
System.arraycopy(src, srcPos, dest, destPos, length);
}
}
}
}
public static <T> void replaceAll(List<T> srcList, List<T> toAddedList) {
if (null == srcList) {
Logger.t(TAG).w("replaceAll but srcList is null");
} else {
srcList.clear();
if (!isEmpty((Collection) toAddedList)) {
srcList.addAll(toAddedList);
}
}
}
@Nullable
public static <T> List<T> getSubList(List<T> srcList, List<T> toRemovedList) {
if (null == srcList) {
Logger.t(TAG).w("removeAll but srcList is null");
return null;
} else {
List<T> res = new ArrayList(srcList.size());
res.addAll(srcList);
if (!isEmpty((Collection) toRemovedList)) {
res.removeAll(toRemovedList);
}
return res;
}
}
public static List<Integer> asList(int[] src) {
if (src != null && src.length > 0) {
List<Integer> list = new ArrayList();
int[] var2 = src;
int var3 = src.length;
for (int var4 = 0; var4 < var3; ++var4) {
int i = var2[var4];
list.add(i);
}
return list;
} else {
return null;
}
}
public static void clearList(List list) {
if (!isEmpty((Collection) list)) {
list.clear();
}
}
public static <T> boolean arrayEquals(List<T> list1, List<T> list2) {
if (list1 == list2) {
return true;
} else if (list1 != null && list2 != null && list1.size() == list2.size()) {
for (int i = 0; i < list1.size(); ++i) {
if (!isObjectEqual(list1.get(i), list2.get(i))) {
return false;
}
}
return true;
} else {
return false;
}
}
private static boolean isObjectEqual(Object o1, Object o2) {
if (o1 == o2) {
return true;
} else {
return null != o1 && null != o2 ? o1.equals(o2) : false;
}
}
public static <T> void add(List<T> list, T ele) {
if (list != null && ele != null && !list.contains(ele)) {
list.add(ele);
}
}
@NonNull
public static <T> List<T> getNonNullList(List<T> list) {
if (isEmpty((Collection) list)) {
return Collections.emptyList();
} else {
List<T> res = new ArrayList(list);
List<T> toRemoved = new ArrayList(list.size());
Iterator var3 = list.iterator();
while (var3.hasNext()) {
T t = (T) var3.next();
if (null == t) {
toRemoved.add((T) (Object) null);
}
}
res.removeAll(toRemoved);
return res;
}
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.tools;
import com.wd.base.log.Logger;
/**
* <类型转换工具类>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/5/16]
* @since V1.0.0.0
*/
public class CastUtils {
private static final String TAG = "CastUtils";
private CastUtils() {
}
public static int castToInt(Object obj) {
return castToInt(obj, 0);
}
public static int castToInt(Object obj, int defaultValue) {
Integer ret = (Integer) cast(obj, Integer.class);
return ret == null ? defaultValue : ret;
}
public static boolean castToBoolean(Object obj) {
return castToBoolean(obj, false);
}
public static boolean castToBoolean(Object obj, boolean defaultValue) {
Boolean ret = (Boolean) cast(obj, Boolean.class);
return ret == null ? defaultValue : ret;
}
public static String castToString(Object obj) {
return castToString(obj, "");
}
public static String castToString(Object obj, String defaultValue) {
String ret = (String) cast(obj, String.class);
return ret == null ? defaultValue : ret;
}
public static <T> T cast(Object obj, Class<T> clz) {
if (clz == null) {
Logger.t(TAG).i("class is null");
return null;
} else {
return clz.isInstance(obj) ? (T) obj : null;
}
}
public static <T> T cast(Object obj, T defaultValue) {
if (defaultValue == null) {
Logger.t(TAG).i("defaultValue is null.");
return null;
} else if (obj == null) {
Logger.t(TAG).i("object is null.");
return null;
} else {
return defaultValue.getClass() == obj.getClass() ? (T) obj : defaultValue;
}
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.tools;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* <转换帮助类>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/5/16]
* @since V1.0.0.0
*/
public class ConvertHelper {
public ConvertHelper() {
}
public static <D, S> List<D> convert(List<S> sources, IConverter<S, D> converter) {
if (!ArrayUtils.isEmpty(sources) && null != converter) {
List<D> dests = new ArrayList(sources.size());
Iterator var3 = sources.iterator();
while (var3.hasNext()) {
S source = (S) var3.next();
D dest = converter.convert(source);
if (null != dest) {
dests.add(dest);
}
}
return dests;
} else {
return null;
}
}
public static <D, S> List<D> convert(List<S> sources, IPositionConverter<S, D> converter) {
if (!ArrayUtils.isEmpty(sources) && null != converter) {
List<D> dests = new ArrayList(sources.size());
Iterator var3 = sources.iterator();
while (var3.hasNext()) {
S source = (S) var3.next();
D dest = converter.convert(source, dests.size());
if (null != dest) {
dests.add(dest);
}
}
return dests;
} else {
return null;
}
}
public interface IPositionConverter<S, D> {
D convert(S var1, int var2);
}
public interface IConverter<S, D> {
D convert(S var1);
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.tools;
import android.content.Context;
import android.os.Build;
/**
* 设备相关工具类<BR>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/4/7]
* @since V1.0.0.0
*/
public class DeviceUtils {
/**
* 设备屏幕宽度
*
* @return 屏幕宽度
*/
public static int getDeviceWidth() {
Context context = AppContext.getContext();
if (context == null) {
return 0;
}
return Math.min(context.getResources().getDisplayMetrics().widthPixels,
context.getResources().getDisplayMetrics().heightPixels);
}
/**
* 设备屏幕高度
*
* @return 屏幕高度
*/
public static int getDeviceHeight() {
Context context = AppContext.getContext();
if (context == null) {
return 0;
}
return Math.max(context.getResources().getDisplayMetrics().widthPixels,
context.getResources().getDisplayMetrics().heightPixels);
}
/**
* 获得版本 Model
*
* @return 版本 Model
*/
public static String getModel() {
return Build.MODEL;
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.tools;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* <数据计算工具类>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/5/16]
* @since V1.0.0.0
*/
public class MathUtils {
private static final float FLOAT_SMALL_ENOUGH_NUM = 1.0E-7F;
private static final double DOUBLE_SMALL_ENOUGH_NUM = 1.0E-7D;
private MathUtils() {
}
public static int parseInt(String str, int defInt) {
try {
return Integer.parseInt(str);
} catch (Exception var3) {
return defInt;
}
}
public static int parseInt(Integer integer, int defInt) {
return null == integer ? defInt : integer;
}
public static int parseInt(String str, int radix, int defInt) {
try {
return Integer.parseInt(str, radix);
} catch (Exception var4) {
return defInt;
}
}
public static long parseLong(String str, long defLong) {
try {
return Long.parseLong(str);
} catch (Exception var4) {
return defLong;
}
}
public static long parseLong(String str, int radix, long defLong) {
try {
return Long.parseLong(str, radix);
} catch (Exception var5) {
return defLong;
}
}
public static Boolean parseBoolean(String str, Boolean defBool) {
try {
return Boolean.valueOf(str);
} catch (Exception var3) {
return defBool;
}
}
public static float parseFloat(String str, Float defFloat) {
try {
return Float.parseFloat(str);
} catch (Exception var3) {
return defFloat;
}
}
public static double parseDouble(String str, double defDouble) {
try {
return Double.parseDouble(str);
} catch (Exception var4) {
return defDouble;
}
}
public static byte parseByte(String str, byte defByte) {
try {
return Byte.parseByte(str);
} catch (Exception var3) {
return defByte;
}
}
public static short parseShort(String str, short defShort) {
try {
return Short.parseShort(str);
} catch (Exception var3) {
return defShort;
}
}
public static byte[] xor(String prevStr, String lateStr) {
if (!StringUtils.isBlank(prevStr) && !StringUtils.isBlank(lateStr) && prevStr.length() == lateStr.length()) {
char[] prevArray = prevStr.toCharArray();
char[] lateArray = lateStr.toCharArray();
byte[] xoredArray = new byte[prevArray.length];
int length = prevStr.length();
for (int i = 0; i < length; ++i) {
xoredArray[i] = (byte) (prevArray[i] ^ lateArray[i]);
}
return xoredArray;
} else {
return new byte[0];
}
}
public static boolean isEqual(float f1, float f2) {
return Math.abs(f1 - f2) < FLOAT_SMALL_ENOUGH_NUM;
}
public static boolean isEqual(double f1, double f2) {
return Math.abs(f1 - f2) < DOUBLE_SMALL_ENOUGH_NUM;
}
public static boolean biggerOrEqual(float f1, float f2) {
return isEqual(f1, f2) || f1 > f2;
}
public static boolean biggerOrEqual(double f1, double f2) {
return isEqual(f1, f2) || f1 > f2;
}
public static int getMaxCommonDivisor(int x, int y) {
int xLocal = x;
int yLocal;
int temp;
for (yLocal = y; xLocal % yLocal != 0; yLocal = temp) {
temp = xLocal % yLocal;
xLocal = yLocal;
}
return yLocal;
}
public static int getMinCommonMultiple(int[] nums) {
int multiple = 1;
if (nums != null && nums.length >= 2) {
int x = nums[0];
int y = nums[1];
multiple = getMinCommonMultiple(x, y);
for (int i = 2; i < nums.length; ++i) {
multiple = getMinCommonMultiple(multiple, nums[i]);
}
}
return multiple;
}
public static int getMinCommonMultiple(int x, int y) {
return x * y / getMaxCommonDivisor(x, y);
}
public static boolean isNumber(String str) {
if (!StringUtils.isEmpty(str)) {
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
return isNum.matches();
} else {
return false;
}
}
public static float constrain(float minValue, float maxValue, float value) {
return Math.max(minValue, Math.min(maxValue, value));
}
public static int compare(long x, long y) {
return x < y ? -1 : (x == y ? 0 : 1);
}
public static int getMaxNumber(int minValue, int maxValue) {
return Math.max(minValue, maxValue);
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
*/
package com.wd.foundation.wdkitcore.tools;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import android.text.TextUtils;
import com.wd.base.log.Logger;
/**
* <反射工具类>
*
* @author wangnaiwen
* @version [V1.0.0.0, 2020/5/16]
* @since V1.0.0.0
*/
public final class ReflectionUtils {
private static final String TAG = "ReflectionUtils";
private ReflectionUtils() {
}
/**
* 启用或禁用安全检查
*
* @param object 对象名称
* @param flag 设置值为true表示反射对象应该在使用时抑制Java语言访问检查,设置值为false表示反射对象应强制执行Java语言访问检查。
*/
public static void setAccessible(AccessibleObject object, boolean flag) {
if (null != object) {
object.setAccessible(flag);
}
}
/**
* 获取方法
*
* @param className 类名称
* @param methodName 方法名称
* @param parameterTypes 按照声明顺序标识该方法的形参类型
* @return 方法
*/
public static Method getMethod(String className, String methodName, Class<?>... parameterTypes) {
if (TextUtils.isEmpty(className)) {
Logger.t(TAG).w("getMethod param className is null");
return null;
}
if (TextUtils.isEmpty(methodName)) {
Logger.t(TAG).w("getMethod param methodName is null");
return null;
}
Method method = null;
try {
Class<?> c = Class.forName(className);
method = c.getMethod(methodName, parameterTypes);
} catch (ClassNotFoundException e1) {
Logger.t(TAG).e("getMethod:", e1);
} catch (NoSuchMethodException e2) {
Logger.t(TAG).e("getMethod:", e2);
} catch (Exception e3) {
Logger.t(TAG).e("getMethod:", e3);
}
return method;
}
/**
* 获取方法
*
* @param clz 类
* @param methodName 函数名称
* @param parameterTypes 按照声明顺序标识该方法的形参类型
* @return 方法
*/
public static Method getMethod(Class<?> clz, String methodName, Class<?>... parameterTypes) {
if (clz == null) {
Logger.t(TAG).w("getMethod param clz is null");
return null;
}
if (TextUtils.isEmpty(methodName)) {
Logger.t(TAG).w("getMethod param methodName is null");
return null;
}
Method method = null;
try {
method = clz.getMethod(methodName, parameterTypes);
} catch (NoSuchMethodException e1) {
Logger.t(TAG).e("getMethod:", e1);
} catch (Exception e2) {
Logger.t(TAG).e("getMethod:", e2);
}
return method;
}
/**
* 获取此Class对象所表示的类或接口的指定已声明方法
*
* @param clazz 类
* @param methodName 函数名称
* @param parameterTypes 形参类型
* @return 返回一个Method对象,它反映此Class对象所表示的类或接口的指定已声明方法
*/
public static Method getDeclaredMethod(Class<?> clazz, String methodName, Class<?>... parameterTypes) {
if (clazz != null && !TextUtils.isEmpty(methodName)) {
return getDeclaredMethodImp(clazz, methodName, parameterTypes);
} else {
Logger.t(TAG).w("getDeclaredMethod param clazz or methodname can not be null!");
return null;
}
}
private static Method getDeclaredMethodImp(Class<?> clazz, String methodName, Class<?>... parameterTypes) {
Method method = null;
try {
method = clazz.getDeclaredMethod(methodName, parameterTypes);
} catch (NoSuchMethodException e1) {
Logger.t(TAG).e(methodName, e1);
} catch (Exception e2) {
Logger.t(TAG).e("getDeclaredMethod", e2);
}
return method;
}
/**
* 获取此Class对象所表示的类或接口的指定已声明方法
*
* @param className 类名称
* @param methodName 函数名称
* @param parameterTypes 形参类型
* @return 返回一个Method对象,它反映此Class对象所表示的类或接口的指定已声明方法
*/
public static Method getDeclaredMethod(String className, String methodName, Class<?>... parameterTypes) {
if (!TextUtils.isEmpty(className) && !TextUtils.isEmpty(methodName)) {
Method method = null;
try {
Class<?> c = Class.forName(className);
method = getDeclaredMethodImp(c, methodName, parameterTypes);
} catch (ClassNotFoundException e1) {
Logger.t(TAG).e(className, e1);
}
return method;
} else {
Logger.t(TAG).w("getDeclaredMethod param className or methodname can not be null!");
return null;
}
}
private static Field getDeclaredFieldImp(Class<?> clazz, String fieldName) {
Field field = null;
try {
field = clazz.getDeclaredField(fieldName);
} catch (NoSuchFieldException e1) {
Logger.t(TAG).e(fieldName, e1);
} catch (Exception e2) {
Logger.t(TAG).e("getDeclaredField", e2);
}
return field;
}
/**
* 此Class对象所表示的类或接口的指定已声明字段
*
* @param clazz 类
* @param fieldName 字段名称
* @return 字段
*/
public static Field getDeclaredField(Class<?> clazz, String fieldName) {
if (clazz != null && !TextUtils.isEmpty(fieldName)) {
return getDeclaredFieldImp(clazz, fieldName);
} else {
Logger.t(TAG).w("getDeclaredField param klass or fieldName can not be null!");
return null;
}
}
/**
* 此Class对象所表示的类或接口的指定已声明字段
*
* @param className 类名称
* @param fieldName 字段名称
* @return 字段
*/
public static Field getDeclaredField(String className, String fieldName) {
if (!TextUtils.isEmpty(className) && !TextUtils.isEmpty(fieldName)) {
try {
Class<?> c = Class.forName(className);
return getDeclaredFieldImp(c, fieldName);
} catch (ClassNotFoundException e1) {
Logger.t(TAG).e(className, e1);
return null;
}
} else {
Logger.t(TAG).w("getDeclaredField param className or fieldName can not be null!");
return null;
}
}
/**
* 此Class对象所表示的类或接口的指定已声明字段
*
* @param clz 类子
* @param fieldName 字段名称
* @param instance 实例
* @param clazz 泛型类
* @return 字段
*/
public static <T> T getFieldValueIgnoreError(Class<?> clz, String fieldName, Object instance, Class<T> clazz) {
if (clz != null && !TextUtils.isEmpty(fieldName) && clazz != null) {
Object result = null;
try {
Field field = clz.getField(fieldName);
Object obj = field.get(instance);
if (clazz.isInstance(obj)) {
result = obj;
}
} catch (NoSuchFieldException e1) {
Logger.t(TAG).d(fieldName);
} catch (IllegalArgumentException e2) {
Logger.t(TAG).d("IllegalArgumentException");
} catch (IllegalAccessException e3) {
Logger.t(TAG).d("IllegalAccessException");
} catch (Exception var10) {
Logger.t(TAG).d("getFieldValue");
}
return (T) result;
} else {
Logger.t(TAG).w("getFieldValueIgnoreError getFieldValue param className or fieldName can not be null!");
return null;
}
}
/**
* 此Class对象所表示的类或接口的指定已声明字段
*
* @param clz 类子
* @param fieldName 字段名称
* @param instance 实例
* @param clazz 泛型类
* @return 字段
*/
public static <T> T getFieldValue(Class<?> clz, String fieldName, Object instance, Class<T> clazz) {
if (clz != null && !TextUtils.isEmpty(fieldName) && clazz != null) {
Object result = null;
try {
Field field = clz.getField(fieldName);
Object obj = field.get(instance);
if (clazz.isInstance(obj)) {
result = obj;
}
} catch (NoSuchFieldException e1) {
Logger.t(TAG).e(fieldName, e1);
} catch (IllegalArgumentException e2) {
Logger.t(TAG).e("IllegalArgumentException", e2);
} catch (IllegalAccessException e3) {
Logger.t(TAG).e("IllegalAccessException", e3);
} catch (Exception e4) {
Logger.t(TAG).e("getFieldValue", e4);
}
return (T) result;
} else {
Logger.t(TAG).w("getFieldValue param clz or fieldName can not be null!");
return null;
}
}
/**
* 代理
*
* @param method 函数
* @param receiver 接收的对象
* @param args 参数
* @return 代理类
*/
public static Object invoke(Method method, Object receiver, Object... args) {
if (null == method) {
Logger.t(TAG).w("invoke param method can not be null!");
return null;
} else {
try {
return method.invoke(receiver, args);
} catch (InvocationTargetException e1) {
Logger.t(TAG).e(method + " invoke ", e1.getTargetException());
} catch (Exception e2) {
Logger.t(TAG).e(method + " invoke ", e2);
}
return null;
}
}
/**
* 获得类实例
*
* @param clazz 类
* @return 类实例
*/
public static Object newInstance(Class<?> clazz) {
if (clazz == null) {
return null;
} else {
try {
return clazz.newInstance();
} catch (InstantiationException e1) {
Logger.t(TAG).e("newInstance InstantiationException ", e1);
} catch (IllegalAccessException e2) {
Logger.t(TAG).e("newInstance IllegalAccessException ", e2);
}
return null;
}
}
/**
* 获得类的实例
*
* @param className 类名称
* @param baseClz 类的基类
* @param <T> 泛型
* @return 类的实例
*/
public static <T> T newInstance(String className, Class<T> baseClz) {
if (!TextUtils.isEmpty(className) && baseClz != null) {
try {
Class clz = Class.forName(className);
if (isSubClassOf(clz, baseClz)) {
return (T) clz.newInstance();
}
} catch (ClassNotFoundException e1) {
Logger.t(TAG).w("newInstance ClassNotFoundException");
} catch (InstantiationException e2) {
Logger.t(TAG).w("newInstance InstantiationException");
} catch (IllegalAccessException e3) {
Logger.t(TAG).w("newInstance IllegalAccessException");
}
}
return null;
}
/**
* 是否是一个类的子类对象
*
* @param childClz 子类
* @param parentClz 父类
* @return true: 是子类,false: 不是子类
*/
public static boolean isSubClassOf(Class childClz, Class parentClz) {
return childClz != null && parentClz != null ? parentClz.isAssignableFrom(childClz) : false;
}
/**
* 代理
*
* @param className 类名称
* @param methodName 函数名
* @param paramTypes 形参类型
* @param params 参数
* @return 代理类
*/
public static Object invoke(String className, String methodName, Class<?>[] paramTypes, Object... params) {
if (className != null && !TextUtils.isEmpty(methodName)) {
try {
Class<?> cls = Class.forName(className);
Method method = cls.getMethod(methodName, paramTypes);
return invoke(method, cls.newInstance(), params);
} catch (ClassNotFoundException e1) {
Logger.t(TAG).e("ClassNotFoundException", e1);
} catch (NoSuchMethodException e2) {
Logger.t(TAG).e("NoSuchMethodException", e2);
} catch (InstantiationException e3) {
Logger.t(TAG).e("InstantiationException", e3);
} catch (IllegalAccessException e4) {
Logger.t(TAG).e("IllegalAccessException", e4);
}
return null;
} else {
Logger.t(TAG).w("invoke param className or methodName can not be null!");
return null;
}
}
/**
* 代理
*
* @param clazz 类
* @param methodName 函数名
* @param paramTypes 形参类型
* @param params 参数
* @return 代理类
*/
public static Object invoke(Class<?> clazz, String methodName, Class<?>[] paramTypes, Object... params) {
if (clazz != null && !TextUtils.isEmpty(methodName)) {
try {
Method method = clazz.getMethod(methodName, paramTypes);
return invoke(method, clazz.newInstance(), params);
} catch (NoSuchMethodException e1) {
Logger.t(TAG).e("NoSuchMethodException", e1);
} catch (InstantiationException e2) {
Logger.t(TAG).e("InstantiationException", e2);
} catch (IllegalAccessException e3) {
Logger.t(TAG).e("IllegalAccessException", e3);
}
return null;
} else {
Logger.t(TAG).w("invoke param clazz or methodName can not be null!");
return null;
}
}
/**
* 静态
*
* @param clazz 类
* @param methodName 函数名
* @param paramTypes 形参类型
* @param params 参数
* @return 代理类
*/
public static Object invokeStatic(Class<?> clazz, String methodName, Class<?>[] paramTypes, Object... params) {
if (clazz != null && !TextUtils.isEmpty(methodName)) {
try {
Method method = clazz.getMethod(methodName, paramTypes);
return method.invoke((Object) null, params);
} catch (NoSuchMethodException e1) {
Logger.t(TAG).e("NoSuchMethodException", e1);
} catch (IllegalAccessException e2) {
Logger.t(TAG).e("IllegalAccessException", e2);
} catch (InvocationTargetException e3) {
Logger.t(TAG).e("InvocationTargetException", e3.getTargetException());
}
return null;
} else {
Logger.t(TAG).w("invoke param className or methodName can not be null!");
return null;
}
}
/**
* 获取类
*
* @param className 类名
* @return 类
*/
public static Class<?> getClass(String className) {
return getClass(className, false);
}
private static Class<?> getClass(String className, boolean isSilent) {
if (null == className) {
return null;
} else {
Class clazz = null;
try {
clazz = Class.forName(className);
} catch (ClassNotFoundException e1) {
if (!isSilent) {
Logger.t(TAG).e("ClassNotFoundException:", e1);
}
} catch (LinkageError e2) {
if (!isSilent) {
Logger.t(TAG).e("an error occurs during linkage");
}
}
return clazz;
}
}
/**
* 给属性设置新值
*
* @param field 属性
* @param object 类对象
* @param value 值
*/
public static void setField(Field field, Object object, Object value) {
if (null != field) {
if (!Modifier.isStatic(field.getModifiers()) && null == object) {
Logger.t(TAG).w("field is not null and not static, but object is null");
} else {
try {
field.set(object, value);
} catch (IllegalAccessException e1) {
Logger.t(TAG).e("IllegalAccessException", e1);
} catch (IllegalArgumentException e2) {
Logger.t(TAG).e("IllegalArgumentException", e2);
}
}
}
}
/**
* 返回直接继承的父类(包含泛型参数)
*
* @param clz 类
* @return 直接继承的父类(包含泛型参数)
*/
public static String getTypeArgument(Class clz) {
String arg = null;
if (clz != null) {
Type superType = clz.getGenericSuperclass();
if (superType instanceof ParameterizedType) {
arg = ((ParameterizedType) superType).getActualTypeArguments()[0].toString();
}
}
return arg;
}
/**
* 获取默认值
*
* @param type 类型
* @return 默认值
*/
public static Object getDefaultValue(Class<?> type) {
return null == type ? null : getDefaultValue(type.getName());
}
public static Object getDefaultValue(String fullyQualifiedTypeName) {
if (fullyQualifiedTypeName == null) {
return "";
} else if (fullyQualifiedTypeName.equals(Byte.TYPE.getName())) {
return 0;
} else if (fullyQualifiedTypeName.equals(Integer.TYPE.getName())) {
return 0;
} else if (fullyQualifiedTypeName.equals(Short.TYPE.getName())) {
return Short.valueOf((short) 0);
} else if (fullyQualifiedTypeName.equals(Long.TYPE.getName())) {
return 0L;
} else if (fullyQualifiedTypeName.equals(Float.TYPE.getName())) {
return 0.0F;
} else if (fullyQualifiedTypeName.equals(Double.TYPE.getName())) {
return 0.0D;
} else if (fullyQualifiedTypeName.equals(Boolean.TYPE.getName())) {
return false;
} else {
return fullyQualifiedTypeName.equals(Character.TYPE.getName()) ? ' ' : null;
}
}
public static boolean isVoidMethod(Method method) {
if (method != null && method.getReturnType() != null) {
return StringUtils.isEqual("void", method.getReturnType().getName());
}
return true;
}
}
... ...