张波

提交代码

Showing 71 changed files with 3497 additions and 0 deletions
  1 +*.iml
  2 +.gradle
  3 +/local.properties
  4 +/.idea
  5 +.DS_Store
  6 +/build
  7 +/captures
  8 +.externalNativeBuild
  9 +.cxx
  10 +local.properties
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project version="4">
  3 + <component name="EclipseCodeFormatterProjectSettings">
  4 + <option name="projectSpecificProfile">
  5 + <ProjectSpecificProfile>
  6 + <option name="formatter" value="ECLIPSE" />
  7 + <option name="importOrder" value="java;javax;org;android;androidx;com;" />
  8 + <option name="pathToConfigFileJava" value="$PROJECT_DIR$/config/CodeQuality/WonderTek_CodeFormatter_Convention_v1.0.xml" />
  9 + <option name="selectedJavaProfile" value="WonderTek_CodeFormatter_Convention_v1.0" />
  10 + </ProjectSpecificProfile>
  11 + </option>
  12 + </component>
  13 +</project>
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project version="4">
  3 + <component name="VcsDirectoryMappings">
  4 + <mapping directory="$PROJECT_DIR$" vcs="Git" />
  5 + </component>
  6 +</project>
  1 +/build
  1 +plugins {
  2 + id 'com.android.application'
  3 + id 'kotlin-android'
  4 + id 'kotlin-android-extensions'
  5 +}
  6 +
  7 +android {
  8 + compileSdkVersion var.compileSdkVersion
  9 + buildToolsVersion var.buildToolsVersion
  10 +
  11 + defaultConfig {
  12 + applicationId "com.example.myapplication"
  13 + minSdkVersion var.minSdkVersion
  14 + targetSdkVersion var.targetSdkVersion
  15 + versionCode 1
  16 + versionName "1.0"
  17 +
  18 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  19 + multiDexEnabled true
  20 + ndk {
  21 + // noinspection ChromeOsAbiSupport
  22 + abiFilters "armeabi-v7a", "arm64-v8a", "x86"
  23 + }
  24 +
  25 + javaCompileOptions {
  26 + annotationProcessorOptions {
  27 + arguments = [AROUTER_MODULE_NAME: project.getName()]
  28 + }
  29 + }
  30 + }
  31 +
  32 + buildTypes {
  33 + release {
  34 + minifyEnabled false
  35 + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  36 + }
  37 + }
  38 +
  39 + lintOptions {
  40 + abortOnError false
  41 + }
  42 +
  43 + compileOptions {
  44 + // Java兼容性设置为Java 8
  45 + sourceCompatibility JavaVersion.VERSION_1_8
  46 + targetCompatibility JavaVersion.VERSION_1_8
  47 + }
  48 +}
  49 +
  50 +repositories {
  51 + flatDir {
  52 + dirs 'libs'
  53 + }
  54 +}
  55 +
  56 +dependencies {
  57 +// implementation 'androidx.appcompat:appcompat:1.6.1'
  58 + implementation "com.google.android.material:material:1.4.0"
  59 + implementation 'com.wd:wdkit:1.0.0'
  60 +}
  1 +# Add project specific ProGuard rules here.
  2 +# You can control the set of applied configuration files using the
  3 +# proguardFiles setting in build.gradle.
  4 +#
  5 +# For more details, see
  6 +# http://developer.android.com/guide/developing/tools/proguard.html
  7 +
  8 +# If your project uses WebView with JS, uncomment the following
  9 +# and specify the fully qualified class name to the JavaScript interface
  10 +# class:
  11 +#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
  12 +# public *;
  13 +#}
  14 +
  15 +# Uncomment this to preserve the line number information for
  16 +# debugging stack traces.
  17 +#-keepattributes SourceFile,LineNumberTable
  18 +
  19 +# If you keep the line number information, uncomment this to
  20 +# hide the original source file name.
  21 +#-renamesourcefileattribute SourceFile
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3 + xmlns:tools="http://schemas.android.com/tools"
  4 + package="com.example.myapplication">
  5 + <!-- 请求网络 -->
  6 + <uses-permission android:name="android.permission.INTERNET" />
  7 + <uses-feature
  8 + android:name="android.software.leanback"
  9 + android:required="false" />
  10 + <application
  11 + android:name=".MyApplication"
  12 + android:allowBackup="true"
  13 + android:fullBackupContent="@xml/backup_rules"
  14 + android:icon="@mipmap/ic_launcher"
  15 + android:label="@string/app_name"
  16 + android:roundIcon="@mipmap/ic_launcher_round"
  17 + android:supportsRtl="true"
  18 + android:theme="@style/Theme.MyApplication"
  19 + tools:targetApi="31">
  20 +
  21 + <activity
  22 + android:name="com.example.myapplication.MainActivity"
  23 + android:exported="true"
  24 + android:launchMode="singleTask">
  25 + <intent-filter>
  26 + <action android:name="android.intent.action.MAIN" />
  27 + <category android:name="android.intent.category.LAUNCHER" />
  28 + </intent-filter>
  29 + </activity>
  30 + </application>
  31 +</manifest>
  1 +
  2 +package com.example.myapplication;
  3 +
  4 +import android.app.Activity;
  5 +import android.os.Bundle;
  6 +
  7 +import androidx.annotation.Nullable;
  8 +
  9 +/**
  10 + * @ProjectName: PeopleDailyVideo
  11 + * @Package: com.people.displayui.main
  12 + * @ClassName: WelcomeActivity
  13 + * @Description: 启动APP过渡页面
  14 + * @Author: wd
  15 + * @CreateDate: 2022/10/28 17:36
  16 + * @UpdateUser: wd
  17 + * @UpdateDate: 2022/10/28 17:36
  18 + * @UpdateRemark: 更新说明:
  19 + * @Version: 1.0
  20 + */
  21 +public class MainActivity extends Activity {
  22 +
  23 + @Override
  24 + protected void onCreate(@Nullable Bundle savedInstanceState) {
  25 + super.onCreate(savedInstanceState);
  26 + // 直接进入首页
  27 + }
  28 +}
  1 +
  2 +package com.example.myapplication;
  3 +
  4 +import android.app.Application;
  5 +import android.util.Log;
  6 +
  7 +import com.example.myapplication.starttask.StartTaskConfig;
  8 +import com.example.myapplication.starttask.StartTaskTool;
  9 +
  10 +/**
  11 + * @author devel
  12 + * @time 2024/8/28 星期三 16:23
  13 + */
  14 +public class MyApplication extends Application {
  15 + @Override
  16 + public void onCreate() {
  17 + super.onCreate();
  18 + Log.e("zzzz","MyApplication onCreate");
  19 + // test
  20 + StartTaskConfig taskConfig = new StartTaskConfig(this);
  21 + taskConfig.start();
  22 + StartTaskTool.startTaskInMain(this);
  23 + StartTaskTool.startPrivate(this);
  24 + StartTaskTool.startTaskInSplash(this);
  25 + }
  26 +}
  1 +/*
  2 + * Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
  3 + */
  4 +
  5 +package com.example.myapplication.starttask;
  6 +
  7 +import android.content.Context;
  8 +import android.util.Log;
  9 +
  10 +import com.example.myapplication.starttask.task.MyTaskCreator;
  11 +import com.wd.base.starttask.AlphaManager;
  12 +import com.wd.base.starttask.Project;
  13 +
  14 +/**
  15 + * 描述:启动初始化任务
  16 + * 默认放在子线程执行,如果子线程执行有问题,构造函数中使用super(name,isInUiThread)
  17 + *
  18 + * @author : lvjinhui
  19 + * @since: 2022/7/2
  20 + */
  21 +
  22 +public class StartTaskConfig {
  23 +
  24 + private Context mContext;
  25 +
  26 + public StartTaskConfig(Context mContext) {
  27 + this.mContext = mContext;
  28 + }
  29 +
  30 + /**
  31 + * 开始全部的初始化,在application
  32 + */
  33 + public void start() {
  34 + if (mContext == null) {
  35 + return;
  36 + }
  37 + Project.Builder builder = new Project.Builder().withTaskCreator(new MyTaskCreator(mContext));
  38 + // 日志
  39 + builder.add(MyTaskCreator.TASK_LOG);
  40 + // AppContext.init、CompComponent 组件服务注册,MyFileUtil.init,直播消息弹幕和打赏
  41 + builder.add(MyTaskCreator.TASK_LOCAL);
  42 + AlphaManager.getInstance(mContext).addProject(builder.create());
  43 + AlphaManager.getInstance(mContext).start();
  44 +
  45 + Log.e("zzzz","start");
  46 + }
  47 +
  48 + /**
  49 + * 适当的放一部分延时初始化
  50 + */
  51 + public void startTaskDelay() {
  52 + if (mContext == null) {
  53 + return;
  54 + }
  55 + Project.Builder builder = new Project.Builder().withTaskCreator(new MyTaskCreator(mContext));
  56 + // 延时初始化,短视频SDK,辅助通道
  57 + builder.add(MyTaskCreator.TASK_DELAY);
  58 + builder.setProjectName("delayGroup");
  59 + AlphaManager.getInstance(mContext).addProject(builder.create());
  60 + AlphaManager.getInstance(mContext).start();
  61 + Log.e("zzzz","startTaskDelay");
  62 + }
  63 +
  64 + /**
  65 + * 需要用户同意隐私政策才能初始化的SDK,放在PrivatePolicyTask
  66 + */
  67 + public void startPrivate() {
  68 + if (mContext == null) {
  69 + return;
  70 + }
  71 + Project.Builder builder = new Project.Builder().withTaskCreator(new MyTaskCreator(mContext));
  72 + // umeng 正式init
  73 + builder.add(MyTaskCreator.TASK_PRIVATE);
  74 + builder.setProjectName("privateGroup");
  75 + AlphaManager.getInstance(mContext).addProject(builder.create());
  76 + AlphaManager.getInstance(mContext).start();
  77 + Log.e("zzzz","startPrivate");
  78 + }
  79 +
  80 + /**
  81 + * 优先级最高(未同意隐私政策,等同意隐私政策完成后初始化;
  82 + * 已同意隐私政策,直接初始化)
  83 + * 进入主页在初始的,但是在隐私弹窗之前,不可以放涉及隐私的SDK
  84 + */
  85 + public void startTaskInMain() {
  86 + if (mContext == null) {
  87 + return;
  88 + }
  89 +
  90 + Project.Builder builder = new Project.Builder().withTaskCreator(new MyTaskCreator(mContext));
  91 + // 子线程 内容组件、comp组件、语音识别
  92 + builder.add(MyTaskCreator.TASK_WD);
  93 + builder.setProjectName("inMainGroup");
  94 + AlphaManager.getInstance(mContext).addProject(builder.create());
  95 + AlphaManager.getInstance(mContext).start();
  96 + Log.e("zzzz","startTaskInMain");
  97 + }
  98 +
  99 +}
  1 +/*
  2 + * Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
  3 + */
  4 +
  5 +package com.example.myapplication.starttask;
  6 +
  7 +import android.content.Context;
  8 +
  9 +/**
  10 + * 描述:
  11 + *
  12 + * @author : lvjinhui
  13 + * @since: 2022/7/7
  14 + */
  15 +public class StartTaskTool {
  16 + public static void startTaskInMain(Context context) {
  17 + StartTaskConfig taskConfig = new StartTaskConfig(context);
  18 + taskConfig.startTaskInMain();
  19 + }
  20 +
  21 + public static void startPrivate(Context context) {
  22 + StartTaskConfig taskConfig = new StartTaskConfig(context);
  23 + taskConfig.startPrivate();
  24 + }
  25 +
  26 + public static void startTaskInSplash(Context context) {
  27 + StartTaskConfig taskConfig = new StartTaskConfig(context);
  28 + taskConfig.startTaskDelay();
  29 + }
  30 +}
  1 +/*
  2 + * Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
  3 + */
  4 +
  5 +package com.example.myapplication.starttask.task;
  6 +
  7 +import android.content.Context;
  8 +
  9 +import com.wd.base.starttask.Task;
  10 +
  11 +//import com.orhanobut.logger.Logger;
  12 +//import com.people.kittools.constant.CommonConstant;
  13 +//import com.people.kittools.sp.SpUtils;
  14 +//import com.people.umeng.UmSdkHelper;
  15 +
  16 +/**
  17 + * 描述:在主页初始化,不着急使用,进入主页用户必然已经同意隐私政策
  18 + *
  19 + * @author : lvjinhui
  20 + * @since: 2022/7/2
  21 + */
  22 +public class DelayTask extends Task {
  23 +
  24 + public DelayTask(Context mContext) {
  25 + super("DelayTask");
  26 + setExecutePriority(9);
  27 +// if (SpUtils.isFirstAgreementFlag()){
  28 +// return;
  29 +// }
  30 + try {
  31 + //友盟分享
  32 +// UmSdkHelper.initUmThirdSDk(mContext, CommonConstant.FILE_PROVIDER);
  33 +// Logger.e("DelayTask 执行");
  34 +
  35 + } catch (Exception e) {
  36 + e.printStackTrace();
  37 + }
  38 +
  39 + }
  40 +
  41 + @Override
  42 + public void run() {
  43 +
  44 + }
  45 +}
  1 +/*
  2 + * Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
  3 + */
  4 +
  5 +package com.example.myapplication.starttask.task;
  6 +
  7 +import java.lang.ref.WeakReference;
  8 +
  9 +import android.content.Context;
  10 +
  11 +import com.wd.base.starttask.Task;
  12 +
  13 +//import com.people.kittools.file.MyFileUtils;
  14 +//import com.people.uiframework.CompComponent;
  15 +
  16 +/**
  17 + * 描述:本地代码初始化context,都在子线程执行
  18 + * 无关用户信息,收集用户信息的SDK初始化不要放进这里
  19 + * @author : lvjinhui
  20 + * @since: 2022/7/2
  21 + */
  22 +public class LocalThreadTask extends Task {
  23 +
  24 + private WeakReference<Context> weakReference;
  25 + public LocalThreadTask(Context context) {
  26 + super("LocalThreadTask");
  27 + weakReference = new WeakReference<>(context);
  28 + setExecutePriority(1);
  29 + }
  30 +
  31 + @Override
  32 + public void run() {
  33 + Context mContext = weakReference.get();
  34 + // 注册创建对象
  35 +// new CompComponent().registerServices();
  36 +// // 赋值context
  37 +// MyFileUtils.init(mContext);
  38 + }
  39 +
  40 +}
  1 +/*
  2 + * Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
  3 + */
  4 +
  5 +package com.example.myapplication.starttask.task;
  6 +
  7 +import com.wd.base.starttask.Task;
  8 +//import com.people.logutil.LoggerInit;
  9 +
  10 +/**
  11 + * 描述:com.orhanobut.logger 初始化,子线程初始化
  12 + *
  13 + * @author : lvjinhui
  14 + * @since: 2022/7/2
  15 + */
  16 +public class LoggerTask extends Task {
  17 +
  18 + public LoggerTask() {
  19 + super("LoggerTask");
  20 + }
  21 +
  22 + @Override
  23 + public void run() {
  24 + // log 初始化
  25 +// LoggerInit.getInstance().init(true);// BuildConfig.DEBUG
  26 + }
  27 +}
  1 +/*
  2 + * Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
  3 + */
  4 +
  5 +package com.example.myapplication.starttask.task;
  6 +
  7 +import android.content.Context;
  8 +import android.util.Log;
  9 +
  10 +import com.wd.base.starttask.ITaskCreator;
  11 +import com.wd.base.starttask.Task;
  12 +
  13 +/**
  14 + * 描述:create task
  15 + *
  16 + * @author : lvjinhui
  17 + * @since: 2022/7/2
  18 + */
  19 +public class MyTaskCreator implements ITaskCreator {
  20 + /**
  21 + * 定义的task 名字, 比如 LoggerTask 在 task 构造函数传入
  22 + */
  23 + public static final String TASK_LOG = "LoggerTask";
  24 +
  25 + public static final String TASK_LOCAL = "LocalThreadTask";
  26 +
  27 + public static final String TASK_DELAY = "DelayTask";
  28 +
  29 + public static final String TASK_PRIVATE = "PrivatePolicyTask";
  30 +
  31 + public static final String TASK_WD = "WCompTask";
  32 +
  33 + private final Context mContext;
  34 +
  35 + public MyTaskCreator(Context context) {
  36 + this.mContext = context;
  37 + }
  38 +
  39 + @Override
  40 + public Task createTask(String taskName) {
  41 + Log.d("==ALPHA==", taskName);
  42 + switch (taskName) {
  43 + case TASK_LOG:
  44 + return new LoggerTask();
  45 + case TASK_LOCAL:
  46 + return new LocalThreadTask(mContext);
  47 + case TASK_DELAY:
  48 + return new DelayTask(mContext);
  49 + case TASK_PRIVATE:
  50 + return new PrivatePolicyTask(mContext);
  51 + case TASK_WD:
  52 + return new WCompTask();
  53 + default:
  54 + break;
  55 + }
  56 +
  57 + return null;
  58 + }
  59 +}
  1 +/*
  2 + * Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
  3 + */
  4 +
  5 +package com.example.myapplication.starttask.task;
  6 +
  7 +import android.content.Context;
  8 +
  9 +import com.wd.base.starttask.Task;
  10 +
  11 +
  12 +//import com.orhanobut.logger.Logger;
  13 +//import com.people.kittools.sp.SpUtils;
  14 +//import com.people.umeng.UmSdkHelper;
  15 +
  16 +
  17 +/**
  18 + * 描述:需要用户同意隐私政策的SDK初始化
  19 + *
  20 + * @author : lvjinhui
  21 + * @since: 2022/7/2
  22 + */
  23 +public class PrivatePolicyTask extends Task {
  24 +
  25 + private Context instance;
  26 +
  27 + public PrivatePolicyTask(Context context) {
  28 + super("PrivatePolicyTask");
  29 + this.instance = context;
  30 +// if (SpUtils.isFirstAgreementFlag()) {
  31 +// return;
  32 +// }
  33 + /**
  34 + * 友盟SDK正式初始化
  35 + */
  36 +// UmSdkHelper.initUmSdk(instance);
  37 +// Logger.e("隐私SDK初始化");
  38 + }
  39 +
  40 + @Override
  41 + public void run() {
  42 +
  43 + }
  44 +}
  1 +/*
  2 + * Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
  3 + */
  4 +
  5 +package com.example.myapplication.starttask.task;
  6 +
  7 +//import com.wondertek.wheat.ability.scheduler.WComponent;
  8 +//import com.wondertek.wheat.ability.scheduler.listener.IComponentRegister;
  9 +//import com.wondertek.wheat.ability.scheduler.listener.InitListener;
  10 +
  11 +import com.wd.base.starttask.Task;
  12 +
  13 +/**
  14 + * 描述:组件注册,反射多了影响性能
  15 + *
  16 + * @author : lvjinhui
  17 + * @since: 2022/7/2
  18 + */
  19 +public class WCompTask extends Task {
  20 +
  21 + public WCompTask() {
  22 + super("WCompTask");
  23 + }
  24 +
  25 + @Override
  26 + public void run() {
  27 + // 代码组件
  28 + initWComponent();
  29 + }
  30 +
  31 + private void initWComponent() {
  32 +// WComponent.init(new InitListener() {
  33 +// @Override
  34 +// public void beforeInit() {
  35 +//
  36 +// }
  37 +//
  38 +// @Override
  39 +// public void registerComponent(IComponentRegister iComponentRegister) {
  40 +// // 内容获取组件
  41 +// iComponentRegister.registerComponent("ContentComponent",
  42 +// "com.people.component.content.ContentComponent");
  43 +// // comp组件
  44 +// iComponentRegister.registerComponent("CompComponent", "com.people.component.comp.CompComponent");
  45 +// // 语音识别
  46 +// iComponentRegister.registerComponent("SpeechComponent", "com.people.speech.SpeechComponent");
  47 +// }
  48 +//
  49 +// @Override
  50 +// public void initFinish() {
  51 +//
  52 +// }
  53 +// });
  54 + }
  55 +
  56 +}
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<vector xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:width="108dp"
  4 + android:height="108dp"
  5 + android:viewportWidth="108"
  6 + android:viewportHeight="108">
  7 + <path
  8 + android:fillColor="#3DDC84"
  9 + android:pathData="M0,0h108v108h-108z" />
  10 + <path
  11 + android:fillColor="#00000000"
  12 + android:pathData="M9,0L9,108"
  13 + android:strokeWidth="0.8"
  14 + android:strokeColor="#33FFFFFF" />
  15 + <path
  16 + android:fillColor="#00000000"
  17 + android:pathData="M19,0L19,108"
  18 + android:strokeWidth="0.8"
  19 + android:strokeColor="#33FFFFFF" />
  20 + <path
  21 + android:fillColor="#00000000"
  22 + android:pathData="M29,0L29,108"
  23 + android:strokeWidth="0.8"
  24 + android:strokeColor="#33FFFFFF" />
  25 + <path
  26 + android:fillColor="#00000000"
  27 + android:pathData="M39,0L39,108"
  28 + android:strokeWidth="0.8"
  29 + android:strokeColor="#33FFFFFF" />
  30 + <path
  31 + android:fillColor="#00000000"
  32 + android:pathData="M49,0L49,108"
  33 + android:strokeWidth="0.8"
  34 + android:strokeColor="#33FFFFFF" />
  35 + <path
  36 + android:fillColor="#00000000"
  37 + android:pathData="M59,0L59,108"
  38 + android:strokeWidth="0.8"
  39 + android:strokeColor="#33FFFFFF" />
  40 + <path
  41 + android:fillColor="#00000000"
  42 + android:pathData="M69,0L69,108"
  43 + android:strokeWidth="0.8"
  44 + android:strokeColor="#33FFFFFF" />
  45 + <path
  46 + android:fillColor="#00000000"
  47 + android:pathData="M79,0L79,108"
  48 + android:strokeWidth="0.8"
  49 + android:strokeColor="#33FFFFFF" />
  50 + <path
  51 + android:fillColor="#00000000"
  52 + android:pathData="M89,0L89,108"
  53 + android:strokeWidth="0.8"
  54 + android:strokeColor="#33FFFFFF" />
  55 + <path
  56 + android:fillColor="#00000000"
  57 + android:pathData="M99,0L99,108"
  58 + android:strokeWidth="0.8"
  59 + android:strokeColor="#33FFFFFF" />
  60 + <path
  61 + android:fillColor="#00000000"
  62 + android:pathData="M0,9L108,9"
  63 + android:strokeWidth="0.8"
  64 + android:strokeColor="#33FFFFFF" />
  65 + <path
  66 + android:fillColor="#00000000"
  67 + android:pathData="M0,19L108,19"
  68 + android:strokeWidth="0.8"
  69 + android:strokeColor="#33FFFFFF" />
  70 + <path
  71 + android:fillColor="#00000000"
  72 + android:pathData="M0,29L108,29"
  73 + android:strokeWidth="0.8"
  74 + android:strokeColor="#33FFFFFF" />
  75 + <path
  76 + android:fillColor="#00000000"
  77 + android:pathData="M0,39L108,39"
  78 + android:strokeWidth="0.8"
  79 + android:strokeColor="#33FFFFFF" />
  80 + <path
  81 + android:fillColor="#00000000"
  82 + android:pathData="M0,49L108,49"
  83 + android:strokeWidth="0.8"
  84 + android:strokeColor="#33FFFFFF" />
  85 + <path
  86 + android:fillColor="#00000000"
  87 + android:pathData="M0,59L108,59"
  88 + android:strokeWidth="0.8"
  89 + android:strokeColor="#33FFFFFF" />
  90 + <path
  91 + android:fillColor="#00000000"
  92 + android:pathData="M0,69L108,69"
  93 + android:strokeWidth="0.8"
  94 + android:strokeColor="#33FFFFFF" />
  95 + <path
  96 + android:fillColor="#00000000"
  97 + android:pathData="M0,79L108,79"
  98 + android:strokeWidth="0.8"
  99 + android:strokeColor="#33FFFFFF" />
  100 + <path
  101 + android:fillColor="#00000000"
  102 + android:pathData="M0,89L108,89"
  103 + android:strokeWidth="0.8"
  104 + android:strokeColor="#33FFFFFF" />
  105 + <path
  106 + android:fillColor="#00000000"
  107 + android:pathData="M0,99L108,99"
  108 + android:strokeWidth="0.8"
  109 + android:strokeColor="#33FFFFFF" />
  110 + <path
  111 + android:fillColor="#00000000"
  112 + android:pathData="M19,29L89,29"
  113 + android:strokeWidth="0.8"
  114 + android:strokeColor="#33FFFFFF" />
  115 + <path
  116 + android:fillColor="#00000000"
  117 + android:pathData="M19,39L89,39"
  118 + android:strokeWidth="0.8"
  119 + android:strokeColor="#33FFFFFF" />
  120 + <path
  121 + android:fillColor="#00000000"
  122 + android:pathData="M19,49L89,49"
  123 + android:strokeWidth="0.8"
  124 + android:strokeColor="#33FFFFFF" />
  125 + <path
  126 + android:fillColor="#00000000"
  127 + android:pathData="M19,59L89,59"
  128 + android:strokeWidth="0.8"
  129 + android:strokeColor="#33FFFFFF" />
  130 + <path
  131 + android:fillColor="#00000000"
  132 + android:pathData="M19,69L89,69"
  133 + android:strokeWidth="0.8"
  134 + android:strokeColor="#33FFFFFF" />
  135 + <path
  136 + android:fillColor="#00000000"
  137 + android:pathData="M19,79L89,79"
  138 + android:strokeWidth="0.8"
  139 + android:strokeColor="#33FFFFFF" />
  140 + <path
  141 + android:fillColor="#00000000"
  142 + android:pathData="M29,19L29,89"
  143 + android:strokeWidth="0.8"
  144 + android:strokeColor="#33FFFFFF" />
  145 + <path
  146 + android:fillColor="#00000000"
  147 + android:pathData="M39,19L39,89"
  148 + android:strokeWidth="0.8"
  149 + android:strokeColor="#33FFFFFF" />
  150 + <path
  151 + android:fillColor="#00000000"
  152 + android:pathData="M49,19L49,89"
  153 + android:strokeWidth="0.8"
  154 + android:strokeColor="#33FFFFFF" />
  155 + <path
  156 + android:fillColor="#00000000"
  157 + android:pathData="M59,19L59,89"
  158 + android:strokeWidth="0.8"
  159 + android:strokeColor="#33FFFFFF" />
  160 + <path
  161 + android:fillColor="#00000000"
  162 + android:pathData="M69,19L69,89"
  163 + android:strokeWidth="0.8"
  164 + android:strokeColor="#33FFFFFF" />
  165 + <path
  166 + android:fillColor="#00000000"
  167 + android:pathData="M79,19L79,89"
  168 + android:strokeWidth="0.8"
  169 + android:strokeColor="#33FFFFFF" />
  170 +</vector>
  1 +<vector xmlns:android="http://schemas.android.com/apk/res/android"
  2 + xmlns:aapt="http://schemas.android.com/aapt"
  3 + android:width="108dp"
  4 + android:height="108dp"
  5 + android:viewportWidth="108"
  6 + android:viewportHeight="108">
  7 + <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">
  8 + <aapt:attr name="android:fillColor">
  9 + <gradient
  10 + android:endX="85.84757"
  11 + android:endY="92.4963"
  12 + android:startX="42.9492"
  13 + android:startY="49.59793"
  14 + android:type="linear">
  15 + <item
  16 + android:color="#44000000"
  17 + android:offset="0.0" />
  18 + <item
  19 + android:color="#00000000"
  20 + android:offset="1.0" />
  21 + </gradient>
  22 + </aapt:attr>
  23 + </path>
  24 + <path
  25 + android:fillColor="#FFFFFF"
  26 + android:fillType="nonZero"
  27 + 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"
  28 + android:strokeWidth="1"
  29 + android:strokeColor="#00000000" />
  30 +</vector>
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:id="@+id/rl_parent"
  4 + android:layout_width="match_parent"
  5 + android:layout_height="match_parent"
  6 + android:background="@color/white" />
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <background android:drawable="@drawable/ic_launcher_background" />
  4 + <foreground android:drawable="@drawable/ic_launcher_foreground" />
  5 + <monochrome android:drawable="@drawable/ic_launcher_foreground" />
  6 +</adaptive-icon>
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <background android:drawable="@drawable/ic_launcher_background" />
  4 + <foreground android:drawable="@drawable/ic_launcher_foreground" />
  5 + <monochrome android:drawable="@drawable/ic_launcher_foreground" />
  6 +</adaptive-icon>
No preview for this file type
No preview for this file type
No preview for this file type
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 + <color name="purple_200">#FFBB86FC</color>
  4 + <color name="purple_500">#FF6200EE</color>
  5 + <color name="purple_700">#FF3700B3</color>
  6 + <color name="teal_200">#FF03DAC5</color>
  7 + <color name="teal_700">#FF018786</color>
  8 + <color name="black">#FF000000</color>
  9 + <color name="white">#FFFFFFFF</color>
  10 +</resources>
  1 +<resources>
  2 + <string name="app_name">My Application</string>
  3 +</resources>
  1 +<resources xmlns:tools="http://schemas.android.com/tools">
  2 + <!-- Base application theme. -->
  3 + <style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
  4 + <!-- Primary brand color. -->
  5 + <item name="colorPrimary">@color/purple_500</item>
  6 + <item name="colorPrimaryVariant">@color/purple_700</item>
  7 + <item name="colorOnPrimary">@color/white</item>
  8 + <!-- Secondary brand color. -->
  9 + <item name="colorSecondary">@color/teal_200</item>
  10 + <item name="colorSecondaryVariant">@color/teal_700</item>
  11 + <item name="colorOnSecondary">@color/black</item>
  12 + <!-- Status bar color. -->
  13 + <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
  14 + <!-- Customize your theme here. -->
  15 + </style>
  16 +</resources>
  1 +<?xml version="1.0" encoding="utf-8"?><!--
  2 + Sample backup rules file; uncomment and customize as necessary.
  3 + See https://developer.android.com/guide/topics/data/autobackup
  4 + for details.
  5 + Note: This file is ignored for devices older that API 31
  6 + See https://developer.android.com/about/versions/12/backup-restore
  7 +-->
  8 +<full-backup-content>
  9 + <!--
  10 + <include domain="sharedpref" path="."/>
  11 + <exclude domain="sharedpref" path="device.xml"/>
  12 +-->
  13 +</full-backup-content>
  1 +apply plugin: 'maven'
  2 +
  3 +buildscript {
  4 + ext.kotlin_version = "1.4.32"
  5 + repositories {
  6 + mavenLocal()
  7 + mavenCentral()
  8 + // 以下四行代码为阿里gradle源,需要的人自己放開使用
  9 + maven { url 'https://maven.aliyun.com/repository/google' }
  10 + maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
  11 + maven { url 'https://maven.aliyun.com/repository/public' }
  12 + maven { url 'https://maven.aliyun.com/repository/jcenter' }
  13 + maven { url 'https://maven.aliyun.com/nexus/content/repositories/releases' }
  14 + //阿里云 maven
  15 + maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
  16 + maven { url 'https://maven.aliyun.com/repository/releases' }
  17 +
  18 + google()
  19 +
  20 + maven { url "https://jitpack.io" }
  21 + //华为
  22 + maven { url 'https://developer.huawei.com/repo/' }
  23 + //阿里云QuickTracking
  24 + maven { url 'https://repo1.maven.org/maven2/' }
  25 +
  26 + maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
  27 + maven {
  28 + url 'https://maven.aliyun.com/nexus/content/repositories/google/'
  29 + name 'aliyun-google'
  30 + }
  31 +
  32 + // TingYun
  33 + maven { url "https://nexus2.tingyun.com/nexus/content/repositories/snapshots/" }
  34 + }
  35 +
  36 + dependencies {
  37 + classpath "com.android.tools.build:gradle:4.0.2"
  38 + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  39 + classpath 'com.billy.android:autoregister:1.4.2'
  40 + // NOTE: Do not place your application dependencies here; they belong
  41 + // in the individual module build.gradle files
  42 + }
  43 +}
  44 +
  45 +allprojects {
  46 + repositories {
  47 + mavenLocal()
  48 + mavenCentral()
  49 + // 以下四行代码为阿里gradle源,需要的人自己放開使用
  50 + maven { url 'https://maven.aliyun.com/repository/google' }
  51 + maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
  52 + maven { url 'https://maven.aliyun.com/repository/public' }
  53 + maven { url 'https://maven.aliyun.com/repository/jcenter' }
  54 + maven { url 'https://maven.aliyun.com/nexus/content/repositories/releases' }
  55 + //阿里云 maven
  56 + maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
  57 + maven { url 'https://maven.aliyun.com/repository/releases' }
  58 + google()
  59 +
  60 + maven { url "https://jitpack.io" }
  61 + //华为
  62 + maven { url 'https://developer.huawei.com/repo/' }
  63 + //阿里云QuickTracking
  64 + maven { url 'https://repo1.maven.org/maven2/' }
  65 + maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
  66 + maven {
  67 + url 'https://maven.aliyun.com/nexus/content/repositories/google/'
  68 + name 'aliyun-google'
  69 + }
  70 +
  71 + flatDir { dirs 'src/main/libs' }
  72 +
  73 + // 快马私库
  74 + maven {
  75 + credentials {
  76 + username '6708d1cf6f4c940bd257c88d'
  77 + password 'Wm51gc4rARyr'
  78 + }
  79 + url 'https://packages.aliyun.com/6708d221eef79c23d7b02189/maven/repo-higom'
  80 + }
  81 + }
  82 +
  83 + project.configurations.configureEach {
  84 + resolutionStrategy.eachDependency { details ->
  85 + if (details.requested.group == 'com.android.android.support' && !details.requested.name.contains('multidex')) {
  86 + details.useVersion "28.0.0"
  87 + }
  88 +
  89 + }
  90 + }
  91 +
  92 + // 强制依赖
  93 + configurations.configureEach {
  94 + exclude group: 'com.alipay.android.phone.thirdparty', module: 'securityguard-build'
  95 + resolutionStrategy {
  96 + force 'androidx.activity:activity:1.2.1'
  97 + force 'androidx.annotation:annotation:1.1.0'
  98 + force 'androidx.appcompat:appcompat:1.2.0'
  99 + force 'androidx.arch.core:core-common:2.1.0'
  100 + force 'androidx.arch.core:core-runtime:2.1.0'
  101 + force 'androidx.core:core-ktx:1.6.0'
  102 + force 'androidx.core:core:1.5.0'
  103 + force 'androidx.collection:collection:1.1.0'
  104 + force 'androidx.constraintlayout:constraintlayout:2.0.4'
  105 + force 'androidx.constraintlayout:constraintlayout-solver:2.0.4'
  106 + force 'androidx.coordinatorlayout:coordinatorlayout:1.1.0'
  107 + force 'androidx.fragment:fragment:1.3.1'
  108 + force 'androidx.lifecycle:lifecycle-common:2.3.0'
  109 + force 'androidx.multidex:multidex:2.0.1'
  110 + force 'androidx.recyclerview:recyclerview:1.2.0'
  111 + force 'androidx.vectordrawable:vectordrawable:1.1.0'
  112 + force 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
  113 + force 'com.squareup.okhttp3:okhttp:4.9.1'
  114 + force 'com.squareup.okio:okio:2.7.0'
  115 + force 'org.jetbrains.kotlin:kotlin-stdlib:1.4.32'
  116 + force 'org.jetbrains.kotlin:kotilin-stdlib-jdk8:1.4.32'
  117 + force 'org.jetbrains:annotations:15.0'
  118 + force 'net.sf.proguard:proguard-base:6.1.0'
  119 + }
  120 + }
  121 +}
  122 +
  123 +ext {
  124 + var = [
  125 + // SDK And Tools
  126 + applicationId : "com.wondertek.dss",
  127 + minSdkVersion : 25,
  128 + targetSdkVersion : 30,
  129 + compileSdkVersion: 30,
  130 + buildToolsVersion: "30.0.3",
  131 + // 版本号,正式版本 1.0.0 1000080 后两位,80即标识为发布版本
  132 + // 测试版本 1.0.0_TF1 1000001 后两位,01即为测试版本号,01-79
  133 + // 升级版本 1.0.0_RC1 1000081 后两位,81即为升级版本号,81-99
  134 + versionName : "1.0.0", // release正式
  135 + debugVnName : "", // debug开发模式 用于区分debug模式下上报的日志
  136 + versionCode : 100,
  137 + //此版本号是SDK版本,不能随便改
  138 + aar_version : "1.0.0",
  139 + ]
  140 +
  141 +}
  1 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2 +<profiles version="12">
  3 + <profile kind="CodeFormatterProfile" name="WonderTek_CodeFormatter_Convention_v1.0"
  4 + version="12">
  5 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert" />
  6 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations"
  7 + value="insert" />
  8 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration"
  9 + value="insert" />
  10 + <setting
  11 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression"
  12 + value="do not insert" />
  13 + <setting
  14 + id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration"
  15 + value="insert" />
  16 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment"
  17 + value="common_lines" />
  18 + <setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries"
  19 + value="true" />
  20 + <setting
  21 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters"
  22 + value="insert" />
  23 + <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter"
  24 + value="do not insert" />
  25 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package"
  26 + value="insert" />
  27 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation"
  28 + value="common_lines" />
  29 + <setting
  30 + id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant"
  31 + value="do not insert" />
  32 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1" />
  33 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while"
  34 + value="do not insert" />
  35 + <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags"
  36 + value="insert" />
  37 + <setting
  38 + id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration"
  39 + value="do not insert" />
  40 + <setting
  41 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws"
  42 + value="do not insert" />
  43 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement"
  44 + value="common_lines" />
  45 + <setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true" />
  46 + <setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4" />
  47 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator"
  48 + value="do not insert" />
  49 + <setting
  50 + id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration"
  51 + value="common_lines" />
  52 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments"
  53 + value="insert" />
  54 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments"
  55 + value="insert" />
  56 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits"
  57 + value="do not insert" />
  58 + <setting
  59 + id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration"
  60 + value="do not insert" />
  61 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for"
  62 + value="insert" />
  63 + <setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off" />
  64 + <setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="1" />
  65 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="49" />
  66 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1" />
  67 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1" />
  68 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator"
  69 + value="insert" />
  70 + <setting
  71 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations"
  72 + value="insert" />
  73 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement"
  74 + value="common_lines" />
  75 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant"
  76 + value="16" />
  77 + <setting
  78 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference"
  79 + value="do not insert" />
  80 + <setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true" />
  81 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch"
  82 + value="true" />
  83 + <setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on" />
  84 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block"
  85 + value="insert" />
  86 + <setting
  87 + id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return"
  88 + value="insert" />
  89 + <setting
  90 + id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration"
  91 + value="20" />
  92 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter"
  93 + value="do not insert" />
  94 + <setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line"
  95 + value="false" />
  96 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field"
  97 + value="insert" />
  98 + <setting
  99 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments"
  100 + value="insert" />
  101 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block"
  102 + value="insert" />
  103 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator"
  104 + value="do not insert" />
  105 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations"
  106 + value="1" />
  107 + <setting
  108 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer"
  109 + value="do not insert" />
  110 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for"
  111 + value="do not insert" />
  112 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch"
  113 + value="do not insert" />
  114 + <setting
  115 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments"
  116 + value="do not insert" />
  117 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method"
  118 + value="insert" />
  119 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch"
  120 + value="do not insert" />
  121 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references"
  122 + value="16" />
  123 + <setting
  124 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration"
  125 + value="insert" />
  126 + <setting
  127 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression"
  128 + value="do not insert" />
  129 + <setting
  130 + id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant"
  131 + value="insert" />
  132 + <setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column"
  133 + value="false" />
  134 + <setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error" />
  135 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter"
  136 + value="insert" />
  137 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits"
  138 + value="insert" />
  139 + <setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block"
  140 + value="true" />
  141 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration"
  142 + value="end_of_line" />
  143 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard"
  144 + value="do not insert" />
  145 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation"
  146 + value="do not insert" />
  147 + <setting
  148 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments"
  149 + value="do not insert" />
  150 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch"
  151 + value="insert" />
  152 + <setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="120" />
  153 + <setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false" />
  154 + <setting
  155 + id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression"
  156 + value="do not insert" />
  157 + <setting
  158 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant"
  159 + value="insert" />
  160 + <setting
  161 + id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation"
  162 + value="do not insert" />
  163 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator"
  164 + value="insert" />
  165 + <setting
  166 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration"
  167 + value="insert" />
  168 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for"
  169 + value="do not insert" />
  170 + <setting
  171 + id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments"
  172 + value="true" />
  173 + <setting
  174 + id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable"
  175 + value="insert" />
  176 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration"
  177 + value="end_of_line" />
  178 + <setting
  179 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation"
  180 + value="do not insert" />
  181 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch"
  182 + value="16" />
  183 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for"
  184 + value="insert" />
  185 + <setting
  186 + id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body"
  187 + value="0" />
  188 + <setting
  189 + id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments"
  190 + value="insert" />
  191 + <setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line"
  192 + value="false" />
  193 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16" />
  194 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause"
  195 + value="common_lines" />
  196 + <setting
  197 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference"
  198 + value="insert" />
  199 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer"
  200 + value="do not insert" />
  201 + <setting
  202 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations"
  203 + value="insert" />
  204 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation"
  205 + value="do not insert" />
  206 + <setting
  207 + id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call"
  208 + value="16" />
  209 + <setting
  210 + id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header"
  211 + value="true" />
  212 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces"
  213 + value="insert" />
  214 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default"
  215 + value="do not insert" />
  216 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional"
  217 + value="insert" />
  218 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line" />
  219 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration"
  220 + value="end_of_line" />
  221 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body"
  222 + value="end_of_line" />
  223 + <setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true" />
  224 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters"
  225 + value="do not insert" />
  226 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch"
  227 + value="insert" />
  228 + <setting
  229 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation"
  230 + value="do not insert" />
  231 + <setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true" />
  232 + <setting
  233 + id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration"
  234 + value="20" />
  235 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="16" />
  236 + <setting
  237 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments"
  238 + value="insert" />
  239 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation"
  240 + value="16" />
  241 + <setting
  242 + id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration"
  243 + value="20" />
  244 + <setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error" />
  245 + <setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment"
  246 + value="true" />
  247 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement"
  248 + value="do not insert" />
  249 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try"
  250 + value="insert" />
  251 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing"
  252 + value="do not insert" />
  253 + <setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment"
  254 + value="true" />
  255 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer"
  256 + value="insert" />
  257 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator"
  258 + value="insert" />
  259 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator"
  260 + value="do not insert" />
  261 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer"
  262 + value="20" />
  263 + <setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column"
  264 + value="true" />
  265 + <setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1" />
  266 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation"
  267 + value="common_lines" />
  268 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case"
  269 + value="insert" />
  270 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis"
  271 + value="do not insert" />
  272 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources"
  273 + value="do not insert" />
  274 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert"
  275 + value="insert" />
  276 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if"
  277 + value="do not insert" />
  278 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments"
  279 + value="do not insert" />
  280 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter"
  281 + value="insert" />
  282 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration"
  283 + value="insert" />
  284 + <setting
  285 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression"
  286 + value="do not insert" />
  287 + <setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true" />
  288 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement"
  289 + value="insert" />
  290 + <setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false" />
  291 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="20" />
  292 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body"
  293 + value="insert" />
  294 + <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header"
  295 + value="true" />
  296 + <setting
  297 + id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration"
  298 + value="do not insert" />
  299 + <setting
  300 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant"
  301 + value="do not insert" />
  302 + <setting
  303 + id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration"
  304 + value="16" />
  305 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration"
  306 + value="0" />
  307 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression"
  308 + value="16" />
  309 + <setting
  310 + id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer"
  311 + value="do not insert" />
  312 + <setting
  313 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters"
  314 + value="do not insert" />
  315 + <setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line"
  316 + value="false" />
  317 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if"
  318 + value="insert" />
  319 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type"
  320 + value="insert" />
  321 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block"
  322 + value="insert" />
  323 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration"
  324 + value="end_of_line" />
  325 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case"
  326 + value="end_of_line" />
  327 + <setting
  328 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration"
  329 + value="do not insert" />
  330 + <setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false" />
  331 + <setting
  332 + id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression"
  333 + value="16" />
  334 + <setting
  335 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation"
  336 + value="do not insert" />
  337 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while"
  338 + value="insert" />
  339 + <setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled" />
  340 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch"
  341 + value="do not insert" />
  342 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="16" />
  343 + <setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true" />
  344 + <setting
  345 + id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration"
  346 + value="do not insert" />
  347 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator"
  348 + value="true" />
  349 + <setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases"
  350 + value="true" />
  351 + <setting
  352 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression"
  353 + value="do not insert" />
  354 + <setting
  355 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized"
  356 + value="do not insert" />
  357 + <setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines"
  358 + value="2147483647" />
  359 + <setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries"
  360 + value="true" />
  361 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration"
  362 + value="end_of_line" />
  363 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for"
  364 + value="insert" />
  365 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="16" />
  366 + <setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations"
  367 + value="false" />
  368 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause"
  369 + value="common_lines" />
  370 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation"
  371 + value="80" />
  372 + <setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column"
  373 + value="false" />
  374 + <setting id="org.eclipse.jdt.core.compiler.source" value="1.8" />
  375 + <setting
  376 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized"
  377 + value="do not insert" />
  378 + <setting
  379 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws"
  380 + value="insert" />
  381 + <setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4" />
  382 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant"
  383 + value="insert" />
  384 + <setting
  385 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression"
  386 + value="insert" />
  387 + <setting
  388 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference"
  389 + value="do not insert" />
  390 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional"
  391 + value="insert" />
  392 + <setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true" />
  393 + <setting
  394 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer"
  395 + value="insert" />
  396 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try"
  397 + value="do not insert" />
  398 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources"
  399 + value="insert" />
  400 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="1" />
  401 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation"
  402 + value="do not insert" />
  403 + <setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer"
  404 + value="1" />
  405 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard"
  406 + value="do not insert" />
  407 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1" />
  408 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration"
  409 + value="16" />
  410 + <setting
  411 + id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration"
  412 + value="16" />
  413 + <setting
  414 + id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw"
  415 + value="insert" />
  416 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator"
  417 + value="false" />
  418 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement"
  419 + value="do not insert" />
  420 + <setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.8" />
  421 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch"
  422 + value="end_of_line" />
  423 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces"
  424 + value="do not insert" />
  425 + <setting
  426 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters"
  427 + value="insert" />
  428 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation"
  429 + value="do not insert" />
  430 + <setting
  431 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer"
  432 + value="do not insert" />
  433 + <setting
  434 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression"
  435 + value="do not insert" />
  436 + <setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true" />
  437 + <setting
  438 + id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration"
  439 + value="do not insert" />
  440 + <setting
  441 + id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters"
  442 + value="insert" />
  443 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration"
  444 + value="common_lines" />
  445 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16" />
  446 + <setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false" />
  447 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="16" />
  448 + <setting
  449 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference"
  450 + value="do not insert" />
  451 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator"
  452 + value="do not insert" />
  453 + <setting
  454 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant"
  455 + value="do not insert" />
  456 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation"
  457 + value="16" />
  458 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations"
  459 + value="do not insert" />
  460 + <setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line"
  461 + value="true" />
  462 + <setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch"
  463 + value="true" />
  464 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement"
  465 + value="do not insert" />
  466 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator"
  467 + value="insert" />
  468 + <setting
  469 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration"
  470 + value="do not insert" />
  471 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1" />
  472 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label"
  473 + value="do not insert" />
  474 + <setting
  475 + id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header"
  476 + value="true" />
  477 + <setting
  478 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression"
  479 + value="do not insert" />
  480 + <setting
  481 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration"
  482 + value="do not insert" />
  483 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional"
  484 + value="insert" />
  485 + <setting
  486 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference"
  487 + value="do not insert" />
  488 + <setting
  489 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters"
  490 + value="do not insert" />
  491 + <setting
  492 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments"
  493 + value="do not insert" />
  494 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast"
  495 + value="do not insert" />
  496 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert"
  497 + value="insert" />
  498 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1" />
  499 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement"
  500 + value="do not insert" />
  501 + <setting
  502 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference"
  503 + value="do not insert" />
  504 + <setting
  505 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference"
  506 + value="do not insert" />
  507 + <setting
  508 + id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression"
  509 + value="16" />
  510 + <setting
  511 + id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer"
  512 + value="do not insert" />
  513 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration"
  514 + value="insert" />
  515 + <setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true" />
  516 + <setting
  517 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration"
  518 + value="do not insert" />
  519 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if"
  520 + value="do not insert" />
  521 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon"
  522 + value="do not insert" />
  523 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator"
  524 + value="do not insert" />
  525 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try"
  526 + value="do not insert" />
  527 + <setting
  528 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments"
  529 + value="do not insert" />
  530 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast"
  531 + value="do not insert" />
  532 + <setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true" />
  533 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow"
  534 + value="insert" />
  535 + <setting
  536 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration"
  537 + value="do not insert" />
  538 + <setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false" />
  539 + <setting
  540 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration"
  541 + value="insert" />
  542 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration"
  543 + value="16" />
  544 + <setting
  545 + id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference"
  546 + value="do not insert" />
  547 + <setting
  548 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters"
  549 + value="do not insert" />
  550 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for"
  551 + value="do not insert" />
  552 + <setting
  553 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws"
  554 + value="insert" />
  555 + <setting
  556 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression"
  557 + value="do not insert" />
  558 + <setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body"
  559 + value="true" />
  560 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16" />
  561 + <setting
  562 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments"
  563 + value="insert" />
  564 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator"
  565 + value="do not insert" />
  566 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer"
  567 + value="end_of_line" />
  568 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true" />
  569 + <setting
  570 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration"
  571 + value="insert" />
  572 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters"
  573 + value="insert" />
  574 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch"
  575 + value="do not insert" />
  576 + <setting id="org.eclipse.jdt.core.compiler.compliance" value="1.8" />
  577 + <setting
  578 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference"
  579 + value="do not insert" />
  580 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation"
  581 + value="insert" />
  582 + <setting
  583 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments"
  584 + value="do not insert" />
  585 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration"
  586 + value="common_lines" />
  587 + <setting
  588 + id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer"
  589 + value="do not insert" />
  590 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case"
  591 + value="do not insert" />
  592 + <setting
  593 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations"
  594 + value="do not insert" />
  595 + <setting
  596 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration"
  597 + value="insert" />
  598 + <setting
  599 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference"
  600 + value="do not insert" />
  601 + <setting
  602 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration"
  603 + value="do not insert" />
  604 + <setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested"
  605 + value="true" />
  606 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast"
  607 + value="insert" />
  608 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant"
  609 + value="end_of_line" />
  610 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration"
  611 + value="end_of_line" />
  612 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="1" />
  613 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for"
  614 + value="insert" />
  615 + <setting
  616 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized"
  617 + value="insert" />
  618 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments"
  619 + value="do not insert" />
  620 + <setting
  621 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration"
  622 + value="do not insert" />
  623 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header"
  624 + value="16" />
  625 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while"
  626 + value="do not insert" />
  627 + <setting
  628 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant"
  629 + value="do not insert" />
  630 + <setting
  631 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments"
  632 + value="do not insert" />
  633 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation"
  634 + value="do not insert" />
  635 + <setting
  636 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters"
  637 + value="do not insert" />
  638 + <setting
  639 + id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header"
  640 + value="true" />
  641 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow"
  642 + value="insert" />
  643 + <setting
  644 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration"
  645 + value="insert" />
  646 + <setting
  647 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws"
  648 + value="do not insert" />
  649 + <setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="false" />
  650 + <setting
  651 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters"
  652 + value="do not insert" />
  653 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional"
  654 + value="insert" />
  655 + <setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description"
  656 + value="false" />
  657 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement"
  658 + value="do not insert" />
  659 + <setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space" />
  660 + <setting
  661 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations"
  662 + value="do not insert" />
  663 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1" />
  664 + <setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120" />
  665 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation"
  666 + value="do not insert" />
  667 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch"
  668 + value="insert" />
  669 + </profile>
  670 +</profiles>
  1 +# Project-wide Gradle settings.
  2 +# IDE (e.g. Android Studio) users:
  3 +# Gradle settings configured through the IDE *will override*
  4 +# any settings specified in this file.
  5 +# For more details on how to configure your build environment visit
  6 +# http://www.gradle.org/docs/current/userguide/build_environment.html
  7 +# Specifies the JVM arguments used for the daemon process.
  8 +# The setting is particularly useful for tweaking memory settings.
  9 +#org.gradle.jvmargs=-Xmx2048m
  10 +# When configured, Gradle will run in incubating parallel mode.
  11 +# This option should only be used with decoupled projects. More details, visit
  12 +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
  13 +# org.gradle.parallel=true
  14 +# AndroidX package structure to make it clearer which packages are bundled with the
  15 +# Android operating system, and which are packaged with your app's APK
  16 +# https://developer.android.com/topic/libraries/support-library/androidx-rn
  17 +android.useAndroidX=true
  18 +# Automatically convert third-party libraries to use AndroidX
  19 +android.enableJetifier=true
  20 +android.enableResourceOptimizations=false
  21 +#建议您关闭 R8 后再进行混淆
  22 +android.enableR8=false
  23 +android.enableR8.libraries=false
  24 +# 如果使用最新稳定版本 Android Studio 3.5 或以上,那么您需要在 gradle.properties 里面新增
  25 +android.buildOnlyTargetAbi=false
  26 +#网络请求接口版本 202204151851
  27 +requestVersion=107
  28 +#设置组件是否作为app还是lib,true是lib ,false 是app
  29 +#分享
  30 +isShareModule=true
  31 +#播放器
  32 +isPlayerModule=true
  33 +#是否直播模块运行 false可以单独运行
  34 +isLiveModule=true
  35 +org.gradle.daemon=true
  36 +org.gradle.parallel=true
  37 +org.gradle.configureondemand=true
  38 +org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
  39 +# Kotlin code style for this project: "official" or "obsolete":
  40 +kotlin.code.style=official
  41 +# Enables namespacing of each library's R class so that its R class includes only the
  42 +# resources declared in the library itself and none from the library's dependencies,
  43 +# thereby reducing the size of the R class for that library
  44 +#android.nonTransitiveRClass=true
  45 +
  46 +
No preview for this file type
  1 +#Fri Oct 23 14:37:25 CST 2020
  2 +distributionBase=GRADLE_USER_HOME
  3 +distributionPath=wrapper/dists
  4 +zipStoreBase=GRADLE_USER_HOME
  5 +zipStorePath=wrapper/dists
  6 +distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-6.8-all.zip
  1 +#!/usr/bin/env sh
  2 +
  3 +##############################################################################
  4 +##
  5 +## Gradle start up script for UN*X
  6 +##
  7 +##############################################################################
  8 +
  9 +# Attempt to set APP_HOME
  10 +# Resolve links: $0 may be a link
  11 +PRG="$0"
  12 +# Need this for relative symlinks.
  13 +while [ -h "$PRG" ] ; do
  14 + ls=`ls -ld "$PRG"`
  15 + link=`expr "$ls" : '.*-> \(.*\)$'`
  16 + if expr "$link" : '/.*' > /dev/null; then
  17 + PRG="$link"
  18 + else
  19 + PRG=`dirname "$PRG"`"/$link"
  20 + fi
  21 +done
  22 +SAVED="`pwd`"
  23 +cd "`dirname \"$PRG\"`/" >/dev/null
  24 +APP_HOME="`pwd -P`"
  25 +cd "$SAVED" >/dev/null
  26 +
  27 +APP_NAME="Gradle"
  28 +APP_BASE_NAME=`basename "$0"`
  29 +
  30 +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
  31 +DEFAULT_JVM_OPTS=""
  32 +
  33 +# Use the maximum available, or set MAX_FD != -1 to use that value.
  34 +MAX_FD="maximum"
  35 +
  36 +warn () {
  37 + echo "$*"
  38 +}
  39 +
  40 +die () {
  41 + echo
  42 + echo "$*"
  43 + echo
  44 + exit 1
  45 +}
  46 +
  47 +# OS specific support (must be 'true' or 'false').
  48 +cygwin=false
  49 +msys=false
  50 +darwin=false
  51 +nonstop=false
  52 +case "`uname`" in
  53 + CYGWIN* )
  54 + cygwin=true
  55 + ;;
  56 + Darwin* )
  57 + darwin=true
  58 + ;;
  59 + MINGW* )
  60 + msys=true
  61 + ;;
  62 + NONSTOP* )
  63 + nonstop=true
  64 + ;;
  65 +esac
  66 +
  67 +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
  68 +
  69 +# Determine the Java command to use to start the JVM.
  70 +if [ -n "$JAVA_HOME" ] ; then
  71 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
  72 + # IBM's JDK on AIX uses strange locations for the executables
  73 + JAVACMD="$JAVA_HOME/jre/sh/java"
  74 + else
  75 + JAVACMD="$JAVA_HOME/bin/java"
  76 + fi
  77 + if [ ! -x "$JAVACMD" ] ; then
  78 + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
  79 +
  80 +Please set the JAVA_HOME variable in your environment to match the
  81 +location of your Java installation."
  82 + fi
  83 +else
  84 + JAVACMD="java"
  85 + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
  86 +
  87 +Please set the JAVA_HOME variable in your environment to match the
  88 +location of your Java installation."
  89 +fi
  90 +
  91 +# Increase the maximum file descriptors if we can.
  92 +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
  93 + MAX_FD_LIMIT=`ulimit -H -n`
  94 + if [ $? -eq 0 ] ; then
  95 + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
  96 + MAX_FD="$MAX_FD_LIMIT"
  97 + fi
  98 + ulimit -n $MAX_FD
  99 + if [ $? -ne 0 ] ; then
  100 + warn "Could not set maximum file descriptor limit: $MAX_FD"
  101 + fi
  102 + else
  103 + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
  104 + fi
  105 +fi
  106 +
  107 +# For Darwin, add options to specify how the application appears in the dock
  108 +if $darwin; then
  109 + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
  110 +fi
  111 +
  112 +# For Cygwin, switch paths to Windows format before running java
  113 +if $cygwin ; then
  114 + APP_HOME=`cygpath --path --mixed "$APP_HOME"`
  115 + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
  116 + JAVACMD=`cygpath --unix "$JAVACMD"`
  117 +
  118 + # We build the pattern for arguments to be converted via cygpath
  119 + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
  120 + SEP=""
  121 + for dir in $ROOTDIRSRAW ; do
  122 + ROOTDIRS="$ROOTDIRS$SEP$dir"
  123 + SEP="|"
  124 + done
  125 + OURCYGPATTERN="(^($ROOTDIRS))"
  126 + # Add a user-defined pattern to the cygpath arguments
  127 + if [ "$GRADLE_CYGPATTERN" != "" ] ; then
  128 + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
  129 + fi
  130 + # Now convert the arguments - kludge to limit ourselves to /bin/sh
  131 + i=0
  132 + for arg in "$@" ; do
  133 + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
  134 + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
  135 +
  136 + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
  137 + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
  138 + else
  139 + eval `echo args$i`="\"$arg\""
  140 + fi
  141 + i=$((i+1))
  142 + done
  143 + case $i in
  144 + (0) set -- ;;
  145 + (1) set -- "$args0" ;;
  146 + (2) set -- "$args0" "$args1" ;;
  147 + (3) set -- "$args0" "$args1" "$args2" ;;
  148 + (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
  149 + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
  150 + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
  151 + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
  152 + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
  153 + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
  154 + esac
  155 +fi
  156 +
  157 +# Escape application args
  158 +save () {
  159 + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
  160 + echo " "
  161 +}
  162 +APP_ARGS=$(save "$@")
  163 +
  164 +# Collect all arguments for the java command, following the shell quoting and substitution rules
  165 +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
  166 +
  167 +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
  168 +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
  169 + cd "$(dirname "$0")"
  170 +fi
  171 +
  172 +exec "$JAVACMD" "$@"
  1 +@if "%DEBUG%" == "" @echo off
  2 +@rem ##########################################################################
  3 +@rem
  4 +@rem Gradle startup script for Windows
  5 +@rem
  6 +@rem ##########################################################################
  7 +
  8 +@rem Set local scope for the variables with windows NT shell
  9 +if "%OS%"=="Windows_NT" setlocal
  10 +
  11 +set DIRNAME=%~dp0
  12 +if "%DIRNAME%" == "" set DIRNAME=.
  13 +set APP_BASE_NAME=%~n0
  14 +set APP_HOME=%DIRNAME%
  15 +
  16 +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
  17 +set DEFAULT_JVM_OPTS=
  18 +
  19 +@rem Find java.exe
  20 +if defined JAVA_HOME goto findJavaFromJavaHome
  21 +
  22 +set JAVA_EXE=java.exe
  23 +%JAVA_EXE% -version >NUL 2>&1
  24 +if "%ERRORLEVEL%" == "0" goto init
  25 +
  26 +echo.
  27 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
  28 +echo.
  29 +echo Please set the JAVA_HOME variable in your environment to match the
  30 +echo location of your Java installation.
  31 +
  32 +goto fail
  33 +
  34 +:findJavaFromJavaHome
  35 +set JAVA_HOME=%JAVA_HOME:"=%
  36 +set JAVA_EXE=%JAVA_HOME%/bin/java.exe
  37 +
  38 +if exist "%JAVA_EXE%" goto init
  39 +
  40 +echo.
  41 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
  42 +echo.
  43 +echo Please set the JAVA_HOME variable in your environment to match the
  44 +echo location of your Java installation.
  45 +
  46 +goto fail
  47 +
  48 +:init
  49 +@rem Get command-line arguments, handling Windows variants
  50 +
  51 +if not "%OS%" == "Windows_NT" goto win9xME_args
  52 +
  53 +:win9xME_args
  54 +@rem Slurp the command line arguments.
  55 +set CMD_LINE_ARGS=
  56 +set _SKIP=2
  57 +
  58 +:win9xME_args_slurp
  59 +if "x%~1" == "x" goto execute
  60 +
  61 +set CMD_LINE_ARGS=%*
  62 +
  63 +:execute
  64 +@rem Setup the command line
  65 +
  66 +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
  67 +
  68 +@rem Execute Gradle
  69 +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
  70 +
  71 +:end
  72 +@rem End local scope for the variables with windows NT shell
  73 +if "%ERRORLEVEL%"=="0" goto mainEnd
  74 +
  75 +:fail
  76 +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
  77 +rem the _cmd.exe /c_ return code!
  78 +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
  79 +exit /b 1
  80 +
  81 +:mainEnd
  82 +if "%OS%"=="Windows_NT" endlocal
  83 +
  84 +:omega
  1 +rootProject.name = "wdkit"
  2 +include ':app'
  3 +include ':wdkit'
  1 +plugins {
  2 + id 'com.android.library'
  3 + id 'kotlin-android'
  4 + id 'maven'
  5 +}
  6 +
  7 +android {
  8 + compileSdkVersion var.compileSdkVersion
  9 +
  10 + defaultConfig {
  11 + minSdkVersion var.minSdkVersion
  12 + targetSdkVersion var.targetSdkVersion
  13 + versionCode var.versionCode
  14 + versionName var.versionName
  15 +
  16 + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  17 + consumerProguardFiles "consumer-rules.pro"
  18 +
  19 + buildConfigField "String", "API_VERSION", "\"${requestVersion}\""
  20 + }
  21 +
  22 + buildTypes {
  23 + release {
  24 + minifyEnabled false
  25 + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  26 + }
  27 + }
  28 + compileOptions {
  29 + sourceCompatibility JavaVersion.VERSION_1_8
  30 + targetCompatibility JavaVersion.VERSION_1_8
  31 + }
  32 +
  33 + // 自定义AAR包名
  34 + android.libraryVariants.all { variant ->
  35 + variant.outputs.all {
  36 + if (outputFileName != null && outputFileName.endsWith(".aar")) {
  37 + def fileName = "${project.name}-${buildType.name}-v${var.aar_version}.aar"
  38 + outputFileName = fileName
  39 + }
  40 + }
  41 + }
  42 +}
  43 +
  44 +dependencies {
  45 + implementation 'androidx.appcompat:appcompat:1.2.0'
  46 + implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
  47 + implementation 'com.wd:log:1.0.0'
  48 + implementation 'com.wd:wdkitcore:1.0.0'
  49 +}
  50 +
  51 +uploadArchives {
  52 + repositories {
  53 + mavenDeployer {
  54 + repository(url: "https://packages.aliyun.com/6708d221eef79c23d7b02189/maven/repo-higom/") {
  55 + authentication(userName: '6708d1cf6f4c940bd257c88d', password: 'Wm51gc4rARyr')
  56 + }
  57 + pom.project {
  58 + artifactId 'wdkit'
  59 + version '1.0.0'
  60 + groupId 'com.wd'
  61 + packaging 'aar'
  62 + }
  63 + }
  64 + }
  65 +}
  1 +# Add project specific ProGuard rules here.
  2 +# You can control the set of applied configuration files using the
  3 +# proguardFiles setting in build.gradle.
  4 +#
  5 +# For more details, see
  6 +# http://developer.android.com/guide/developing/tools/proguard.html
  7 +
  8 +# If your project uses WebView with JS, uncomment the following
  9 +# and specify the fully qualified class name to the JavaScript interface
  10 +# class:
  11 +#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
  12 +# public *;
  13 +#}
  14 +
  15 +# Uncomment this to preserve the line number information for
  16 +# debugging stack traces.
  17 +#-keepattributes SourceFile,LineNumberTable
  18 +
  19 +# If you keep the line number information, uncomment this to
  20 +# hide the original source file name.
  21 +#-renamesourcefileattribute SourceFile
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3 + package="com.wd.foundation.wdkit">
  4 +
  5 +</manifest>
  1 +package com.wd.foundation.wdkit;
  2 +
  3 +public class Teat {
  4 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2021. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm;
  6 +
  7 +import android.os.Handler;
  8 +import android.os.Looper;
  9 +import android.os.Message;
  10 +
  11 +import java.lang.ref.WeakReference;
  12 +
  13 +/**
  14 + * Handler包装类<BR>
  15 + *
  16 + * @author 马文杰 wx4357
  17 + * @version [V1.0.0, 2021/03/16]
  18 + * @since V1.0.0
  19 + */
  20 +public abstract class BaseHandler {
  21 + private final WeakReferenceHandler mHandler = new WeakReferenceHandler(this);
  22 +
  23 + /**
  24 + * 构造方法
  25 + */
  26 + public BaseHandler() {
  27 + }
  28 +
  29 + /**
  30 + * mHandler message
  31 + *
  32 + * @param msg message
  33 + */
  34 + public abstract void handleMessage(Message msg);
  35 +
  36 + /**
  37 + * get Handler
  38 + *
  39 + * @return WeakReferenceHandler
  40 + */
  41 + public Handler getHandler() {
  42 + return this.mHandler;
  43 + }
  44 +
  45 + /**
  46 + * obtain message
  47 + *
  48 + * @param what what
  49 + * @return message
  50 + */
  51 + public Message obtainMessage(int what) {
  52 + return this.mHandler.obtainMessage(what);
  53 + }
  54 +
  55 + /**
  56 + * obtain message
  57 + *
  58 + * @param what what
  59 + * @param obj obj
  60 + * @return message
  61 + */
  62 + public Message obtainMessage(int what, Object obj) {
  63 + return this.mHandler.obtainMessage(what, obj);
  64 + }
  65 +
  66 + /**
  67 + * obtain message
  68 + *
  69 + * @param what what
  70 + * @param arg1 arg1
  71 + * @param arg2 arg1
  72 + * @return message
  73 + */
  74 + public Message obtainMessage(int what, int arg1, int arg2) {
  75 + return this.mHandler.obtainMessage(what, arg1, arg2);
  76 + }
  77 +
  78 + /**
  79 + * obtain message
  80 + *
  81 + * @param what what
  82 + * @param arg1 arg1
  83 + * @param arg2 arg2
  84 + * @param obj obj
  85 + * @return message
  86 + */
  87 + public Message obtainMessage(int what, int arg1, int arg2, Object obj) {
  88 + return this.mHandler.obtainMessage(what, arg1, arg2, obj);
  89 + }
  90 +
  91 + /**
  92 + * has message
  93 + *
  94 + * @param what what
  95 + * @return has message or not
  96 + */
  97 + public boolean hasMessages(int what) {
  98 + return this.mHandler.hasMessages(what);
  99 + }
  100 +
  101 + /**
  102 + * remove message
  103 + *
  104 + * @param what what
  105 + */
  106 + public void removeMessages(int what) {
  107 + this.mHandler.removeMessages(what);
  108 + }
  109 +
  110 + /**
  111 + * Remove any pending posts of callbacks and sent messages whose obj is token. If token is null, all callbacks and
  112 + * messages will be removed.
  113 + *
  114 + * @param token Object
  115 + */
  116 + public final void removeCallbacksAndMessages(Object token) {
  117 + this.mHandler.removeCallbacksAndMessages(token);
  118 + }
  119 +
  120 + /**
  121 + * removeCallbacks
  122 + *
  123 + * @param r the runable
  124 + */
  125 + public final void removeCallbacks(Runnable r) {
  126 + this.mHandler.removeCallbacks(r);
  127 + }
  128 +
  129 + /**
  130 + * send empty message
  131 + *
  132 + * @param what what
  133 + */
  134 + public void sendEmptyMessage(int what) {
  135 + this.mHandler.sendEmptyMessage(what);
  136 + }
  137 +
  138 + /**
  139 + * send empty message delayed
  140 + *
  141 + * @param what what
  142 + * @param delayMillis delay
  143 + */
  144 + public void sendEmptyMessageDelayed(int what, long delayMillis) {
  145 + this.mHandler.sendEmptyMessageDelayed(what, delayMillis);
  146 + }
  147 +
  148 + /**
  149 + * send message
  150 + *
  151 + * @param msg message
  152 + */
  153 + public void sendMessage(Message msg) {
  154 + this.mHandler.sendMessage(msg);
  155 + }
  156 +
  157 + /**
  158 + * send message delayed
  159 + *
  160 + * @param msg message
  161 + * @param delayMillis delay
  162 + */
  163 + public void sendMessageDelayed(Message msg, long delayMillis) {
  164 + this.mHandler.sendMessageDelayed(msg, delayMillis);
  165 + }
  166 +
  167 + /**
  168 + * postDelayed
  169 + *
  170 + * @param r the Runnable
  171 + * @param delayMillis the long
  172 + */
  173 + /**
  174 + * postDelayed
  175 + *
  176 + * @param r The Runnable that will be executed.
  177 + * @param delayMillis The delay (in milliseconds) until the Runnable will be executed.
  178 + * @return Returns true if the Runnable was successfully placed in to the message queue. Returns false on failure,
  179 + * usually because the looper processing the message queue is exiting. Note that a result of true does not
  180 + * mean the Runnable will be processed -- if the looper is quit before the delivery time of the message
  181 + * occurs then the message will be dropped.
  182 + */
  183 + public boolean postDelayed(Runnable r, long delayMillis) {
  184 + return mHandler.postDelayed(r, delayMillis);
  185 + }
  186 +
  187 + /**
  188 + * Causes the Runnable r to be added to the message queue. The runnable will be run on the thread to which this
  189 + * mHandler is attached.
  190 + *
  191 + * @param r The Runnable that will be executed.
  192 + * @return Returns true if the Runnable was successfully placed in to the message queue. Returns false on failure,
  193 + * usually because the looper processing the message queue is exiting.
  194 + */
  195 + public final boolean post(Runnable r) {
  196 + return mHandler.postDelayed(r, 0);
  197 + }
  198 +
  199 + /**
  200 + * Weak mHandler
  201 + */
  202 + private static final class WeakReferenceHandler extends Handler {
  203 + private WeakReference<BaseHandler> mOuter;
  204 +
  205 + private WeakReferenceHandler(BaseHandler callback) {
  206 + super(Looper.getMainLooper());
  207 + this.mOuter = new WeakReference(callback);
  208 + }
  209 +
  210 + @Override
  211 + public final void handleMessage(Message msg) {
  212 + BaseHandler outer = this.mOuter.get();
  213 + if (outer != null) {
  214 + outer.handleMessage(msg);
  215 + super.handleMessage(msg);
  216 + }
  217 + }
  218 + }
  219 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm;
  6 +
  7 +import android.view.KeyEvent;
  8 +
  9 +import androidx.fragment.app.Fragment;
  10 +import androidx.fragment.app.FragmentActivity;
  11 +import androidx.lifecycle.ViewModel;
  12 +import androidx.lifecycle.ViewModelProviders;
  13 +
  14 +/**
  15 + * MVVM架构中View的基础实现<BR>
  16 + *
  17 + * @author zoukang
  18 + * @version [V1.0.0, 2020/5/23]
  19 + * @since V1.0.0
  20 + */
  21 +public class BaseView {
  22 + private Fragment mFragment;
  23 +
  24 + /**
  25 + * 构造函数
  26 + *
  27 + * @param fragment fragment实例
  28 + */
  29 + public BaseView(Fragment fragment) {
  30 + mFragment = fragment;
  31 + }
  32 +
  33 + /**
  34 + * onKeyDown回调<BR>
  35 + * 需要Activity主动触发,层层传递
  36 + *
  37 + * @param keyCode 按键类型
  38 + * @param event 按键事件
  39 + * @return 是否消费事件
  40 + */
  41 + public boolean onKeyDown(int keyCode, KeyEvent event) {
  42 + return false;
  43 + }
  44 +
  45 + /**
  46 + * onPause生命周期View<BR>
  47 + */
  48 + public void onPauseView() {
  49 + }
  50 +
  51 + /**
  52 + * onKeyUp 回调<BR>
  53 + * 需要Activity主动触发
  54 + *
  55 + * @param keyCode 按键类型
  56 + * @param event 按键事件
  57 + * @return 是否消费事件
  58 + */
  59 + public boolean onKeyUp(int keyCode, KeyEvent event) {
  60 + return false;
  61 + }
  62 +
  63 + /**
  64 + * 获取FragmentActivity实例
  65 + *
  66 + * @return FragmentActivity实例
  67 + */
  68 + protected FragmentActivity getActivity() {
  69 + return mFragment.getActivity();
  70 + }
  71 +
  72 + /**
  73 + * 获取Fragment实例
  74 + *
  75 + * @return Fragment实例
  76 + */
  77 + protected Fragment getFragment() {
  78 + return mFragment;
  79 + }
  80 +
  81 + /**
  82 + * 获取VM实例
  83 + *
  84 + * @param viewModelClazz VM的类型
  85 + * @param <T> VM的泛型定义
  86 + * @return VM实例
  87 + */
  88 + protected <T extends ViewModel> T getViewModel(Class<T> viewModelClazz) {
  89 + return ViewModelProviders.of(getActivity()).get(viewModelClazz);
  90 + }
  91 +
  92 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.base;
  6 +
  7 +import android.os.Bundle;
  8 +
  9 +import androidx.annotation.LayoutRes;
  10 +import androidx.appcompat.app.AppCompatActivity;
  11 +import androidx.lifecycle.ViewModel;
  12 +import androidx.lifecycle.ViewModelProvider;
  13 +
  14 +import com.wd.base.log.Logger;
  15 +
  16 +/**
  17 + * MVVM框架Activity基类
  18 + *
  19 + * @author huweixiong
  20 + * @version [V1.0.0.1, 2020/11/26]
  21 + * @since V1.0.0.1
  22 + */
  23 +public abstract class BaseMvvmActivity extends AppCompatActivity {
  24 +
  25 + @Override
  26 + protected void onCreate(Bundle savedInstanceState) {
  27 + perCreate();
  28 + super.onCreate(savedInstanceState);
  29 + setContentView(getLayoutId());
  30 + initView();
  31 + initData();
  32 + initViewModel();
  33 + afterCreate();
  34 + }
  35 +
  36 + /**
  37 + * 来源onCreate,顺序perCreate initView,initData, initViewModel, afterCreate
  38 + */
  39 + protected void perCreate() {
  40 + Logger.t(getTag()).i("perCreate onCreate begin ...");
  41 + }
  42 +
  43 + /**
  44 + * 获取Activity布局文件id
  45 + *
  46 + * @return Activity布局文件id
  47 + */
  48 + protected abstract @LayoutRes int getLayoutId();
  49 +
  50 + protected abstract String getTag();
  51 +
  52 + /**
  53 + * 初始化UI控件,来源onCreate,顺序perCreate initView,initData, initViewModel, afterCreate
  54 + */
  55 + protected abstract void initView();
  56 +
  57 + /**
  58 + * 处理页面数据,来源onCreate,顺序perCreate initView,initData, initViewModel, afterCreate
  59 + */
  60 + protected abstract void initData();
  61 +
  62 + /**
  63 + * 处理页面数据,来源onCreate,顺序perCreate initView,initData, initViewModel, afterCreate
  64 + */
  65 + protected abstract void initViewModel();
  66 +
  67 + /**
  68 + * 来源onCreate,顺序perCreate initView,initData, initViewModel, afterCreate
  69 + */
  70 + protected void afterCreate() {
  71 + Logger.t(getTag()).i("afterCreate onCreate end ...");
  72 + }
  73 +
  74 + /**
  75 + * 获取页面ViewModel
  76 + *
  77 + * @param viewModelClazz 类class对象
  78 + * @param <T> 目标类对象
  79 + * @return 返回类对象
  80 + */
  81 + protected <T extends ViewModel> T getViewModel(Class<T> viewModelClazz) {
  82 + return new ViewModelProvider(this).get(viewModelClazz);
  83 + }
  84 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.model;
  6 +
  7 +
  8 +import com.wd.base.log.Logger;
  9 +import com.wd.foundation.wdkitcore.thread.ThreadPoolUtils;
  10 +
  11 +/**
  12 + * 任务基类
  13 + *
  14 + * @author zoukang
  15 + * @version [V1.0.0, 2020/5/23]
  16 + * @since V1.0.0
  17 + */
  18 +public abstract class BaseTask implements Runnable, IBaseTask {
  19 + /**
  20 + * 获取任务标志描述
  21 + *
  22 + * @return 任务标志描述
  23 + */
  24 + protected abstract String getTaskTag();
  25 +
  26 + /**
  27 + * 任务是否主动取消<BR>
  28 + */
  29 + private volatile boolean bCancel;
  30 +
  31 + /**
  32 + * 具体任务执行操作
  33 + */
  34 + protected abstract void onStart();
  35 +
  36 + /**
  37 + * 任务取消操作
  38 + */
  39 + protected void onCancel() {
  40 +
  41 + }
  42 +
  43 + @Override
  44 + public void start() {
  45 + Logger.t(getTaskTag()).i( "start task");
  46 + bCancel = false;
  47 + onStart();
  48 + }
  49 +
  50 + @Override
  51 + public void cancel() {
  52 + Logger.t(getTaskTag()).i( "cancel task");
  53 + bCancel = true;
  54 + onCancel();
  55 + }
  56 +
  57 + /**
  58 + * 开始任务<BR>
  59 + * 异步执行
  60 + */
  61 + public void startAsync() {
  62 + bCancel = false;
  63 + ThreadPoolUtils.submit(this);
  64 + }
  65 +
  66 + @Override
  67 + public void run() {
  68 + Logger.t(getTaskTag()).i( "start task async");
  69 + try {
  70 + if (!bCancel) {
  71 + onStart();
  72 + }
  73 + } catch (Throwable e) {
  74 + Logger.t(getTaskTag()).e( "task exception:", e);
  75 + }
  76 + }
  77 +
  78 + /**
  79 + * 任务是否取消
  80 + */
  81 + public boolean isCancel() {
  82 + return bCancel;
  83 + }
  84 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.model;
  6 +
  7 +import java.util.ArrayDeque;
  8 +import java.util.Queue;
  9 +
  10 +import com.wd.base.log.Logger;
  11 +
  12 +/**
  13 + * 串行任务链
  14 + * 支持任务从头到尾依次执行,执行完成的任务则从任务链中移除
  15 + * 任务链执行过程中进行cancel,已执行完成的任务忽略【已经被移除】,未执行的任务清空,执行中的任务能打断则打断,打断不了即使回调结果也忽略
  16 + * 任务链本身也是一个任务,可以起线程执行,也可以在当前线程执行;任务链中的子任务根据自己的需要选择执行的线程
  17 + *
  18 + * @author zoukang
  19 + * @version [V1.0.0, 2020/5/23]
  20 + * @since V1.0.0
  21 + */
  22 +public abstract class BaseTaskChain<T> extends BaseTask implements ITaskCallback<T> {
  23 + /**
  24 + * 等待中的任务队列
  25 + */
  26 + private Queue<BaseTaskWithResult<T>> mWaitingTaskList = new ArrayDeque<>();
  27 +
  28 + /**
  29 + * 已执行的任务队列【包括执行完成和正在执行的任务】
  30 + */
  31 + private Queue<BaseTaskWithResult<T>> mExecutedTaskList = new ArrayDeque<>();
  32 +
  33 + public BaseTaskChain() {
  34 + onRegisterChainTask(this);
  35 + }
  36 +
  37 + /**
  38 + * 开始注册需要的子任务
  39 + *
  40 + * @param taskCallback 子任务回调【子类在创建子任务时,需要将改回调注入到子任务的构造函数中】
  41 + */
  42 + protected abstract void onRegisterChainTask(ITaskCallback<T> taskCallback);
  43 +
  44 + /**
  45 + * 注册子任务
  46 + *
  47 + * @param task 子任务
  48 + */
  49 + protected void registerTask(BaseTaskWithResult task) {
  50 + boolean result = mWaitingTaskList.offer(task);
  51 + Logger.t("BaseTaskChain").d("registerTask offer: " + result);
  52 + }
  53 +
  54 + @Override
  55 + protected void onStart() {
  56 + startNextTask();
  57 + }
  58 +
  59 + private void startNextTask() {
  60 + if (mWaitingTaskList.isEmpty()) {
  61 + Logger.t(getTaskTag()).i("startNextTask, all task is finish.");
  62 + onAllTaskFinish(getTaskTag());
  63 + return;
  64 + }
  65 +
  66 + BaseTaskWithResult nextTask = mWaitingTaskList.poll();
  67 + if (null == nextTask) {
  68 + Logger.t(getTaskTag()).i("startNextTask, all task is finish.");
  69 + onAllTaskFinish(getTaskTag());
  70 + return;
  71 + }
  72 +
  73 + boolean result = mExecutedTaskList.offer(nextTask);
  74 + Logger.t(getTaskTag()).i("startNextTask, sub task is " + nextTask.getTaskTag() + ",offer: " + result);
  75 + nextTask.start();
  76 + }
  77 +
  78 + @Override
  79 + protected void onCancel() {
  80 + super.onCancel();
  81 + Logger.t(getTaskTag()).i("onCancel, cancel all waiting tasks, size is " + mWaitingTaskList.size());
  82 + while (!mWaitingTaskList.isEmpty()) {
  83 + BaseTaskWithResult nextTask = mWaitingTaskList.poll();
  84 + if (null == nextTask) {
  85 + break;
  86 + }
  87 + nextTask.cancel();
  88 + }
  89 +
  90 + Logger.t(getTaskTag()).i("onCancel, cancel all executed tasks, size is " + mExecutedTaskList.size());
  91 + while (!mExecutedTaskList.isEmpty()) {
  92 + BaseTaskWithResult nextTask = mExecutedTaskList.poll();
  93 + if (null == nextTask) {
  94 + break;
  95 + }
  96 + nextTask.cancel();
  97 + }
  98 + }
  99 +
  100 + @Override
  101 + public void onFinish(String taskTag, T taskContext) {
  102 + Logger.t(getTaskTag()).i("onFinish, sub task is " + taskTag);
  103 + if (isCancel()) {
  104 + Logger.t(getTaskTag()).w("chain task is canceled.");
  105 + return;
  106 + }
  107 +
  108 + onSubTaskFinish(taskTag, taskContext);
  109 + startNextTask();
  110 + }
  111 +
  112 + @Override
  113 + public void onFailed(String taskTag, String errorCode) {
  114 + Logger.t(getTaskTag()).i("onFailed, sub task is " + taskTag + ", errorCode is " + errorCode);
  115 + cancel();
  116 + onSubTaskFailed(taskTag, errorCode);
  117 + }
  118 +
  119 + /**
  120 + * 子任务执行结束
  121 + *
  122 + * @param taskTag 子任务标识
  123 + * @param taskContext 任务的上下文信息
  124 + */
  125 + protected abstract void onSubTaskFinish(String taskTag, T taskContext);
  126 +
  127 + /**
  128 + * 任务执行失败
  129 + *
  130 + * @param taskTag 子任务标识
  131 + * @param errorCode 错误码
  132 + */
  133 + protected abstract void onSubTaskFailed(String taskTag, String errorCode);
  134 +
  135 + /**
  136 + * 所有任务执行结束
  137 + *
  138 + * @param taskTag 任务链标识
  139 + */
  140 + protected abstract void onAllTaskFinish(String taskTag);
  141 +
  142 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.model;
  6 +
  7 +import com.wd.base.log.Logger;
  8 +
  9 +/**
  10 + * 带结果反馈的任务基类<BR>
  11 + * 子类在实现onStart方法之后,需要主动触发onFinish方法通知任务结束<BR>
  12 + *
  13 + * @author zoukang
  14 + * @version [V1.0.0, 2020/5/23]
  15 + * @since V1.0.0
  16 + */
  17 +public abstract class BaseTaskWithResult<T> extends BaseTask {
  18 + private ITaskCallback<T> mTaskCallback;
  19 +
  20 + public BaseTaskWithResult(ITaskCallback<T> taskCallback) {
  21 + this.mTaskCallback = taskCallback;
  22 + }
  23 +
  24 + /**
  25 + * 任务结束通知
  26 + *
  27 + * @param taskContext 任务上下文信息
  28 + */
  29 + protected void onFinish(T taskContext) {
  30 + if (isCancel()) {
  31 + Logger.t(getTaskTag()).w("onFinish, but task is canceled.");
  32 + return;
  33 + }
  34 +
  35 + if (null == this.mTaskCallback) {
  36 + Logger.t(getTaskTag()).w("onFinish and no callback.");
  37 + return;
  38 + }
  39 +
  40 + this.mTaskCallback.onFinish(getTaskTag(), taskContext);
  41 + }
  42 +
  43 + /**
  44 + * 任务失败通知
  45 + *
  46 + * @param errorCode 错误码信息
  47 + */
  48 + protected void onFailed(String errorCode) {
  49 + if (isCancel()) {
  50 + Logger.t(getTaskTag()).w("onFailed, but task is canceled.");
  51 + return;
  52 + }
  53 +
  54 + if (null == this.mTaskCallback) {
  55 + Logger.t(getTaskTag()).w("onFailed and no callback.");
  56 + return;
  57 + }
  58 +
  59 + this.mTaskCallback.onFailed(getTaskTag(), errorCode);
  60 + }
  61 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.model;
  6 +
  7 +import java.util.ArrayList;
  8 +import java.util.List;
  9 +
  10 +import com.wd.base.log.Logger;
  11 +
  12 +public abstract class ConditionTask<ContextType> {
  13 + private static final String TAG = "ConditionTask";
  14 +
  15 + private final List<String> taskConditions = new ArrayList();
  16 +
  17 + private final ContextType hubContext = this.onInstantiateContext();
  18 +
  19 + private final Object lock = new Object();
  20 +
  21 + private volatile boolean hasProcessed = false;
  22 +
  23 + private volatile boolean hasCanceled = false;
  24 +
  25 + public ConditionTask() {
  26 + }
  27 +
  28 + public void registerCondition(String... conditionNames) {
  29 + synchronized (this.lock) {
  30 + String[] var3 = conditionNames;
  31 + int var4 = conditionNames.length;
  32 +
  33 + for (int var5 = 0; var5 < var4; ++var5) {
  34 + String condition = var3[var5];
  35 + Logger.t("ConditionTask").i("add task condition:" + condition);
  36 + this.taskConditions.add(condition);
  37 + }
  38 +
  39 + }
  40 + }
  41 +
  42 + public void cancel() {
  43 + synchronized (this.lock) {
  44 + this.hasCanceled = true;
  45 + }
  46 + }
  47 +
  48 + public void matchCondition(String conditionName) {
  49 + synchronized (this.lock) {
  50 + this.taskConditions.remove(conditionName);
  51 + if (this.taskConditions.isEmpty() && !this.hasProcessed && !this.hasCanceled) {
  52 + Logger.t("ConditionTask").i("all condition matched");
  53 + this.onExecute(this.hubContext);
  54 + this.hasProcessed = true;
  55 + }
  56 +
  57 + }
  58 + }
  59 +
  60 + public ContextType getHubContext() {
  61 + return this.hubContext;
  62 + }
  63 +
  64 + protected abstract ContextType onInstantiateContext();
  65 +
  66 + protected abstract void onExecute(ContextType var1);
  67 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.model;
  6 +
  7 +/**
  8 + * Model接口的基类<BR>
  9 + *
  10 + * @author zoukang
  11 + * @version [V1.0.0, 2020/5/23]
  12 + * @since V1.0.0
  13 + */
  14 +public interface IBaseModel {
  15 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.model;
  6 +
  7 +import com.wd.foundation.wdkit.mvvm.vm.IVMCallback;
  8 +
  9 +/**
  10 + * 任务接口类<BR>
  11 + *
  12 + * @author zoukang
  13 + * @version [V1.0.0, 2020/5/23]
  14 + * @since V1.0.0
  15 + */
  16 +public interface IBaseTask extends IVMCallback {
  17 + /**
  18 + * 开始任务
  19 + */
  20 + void start();
  21 +
  22 + /**
  23 + * 结束任务
  24 + */
  25 + void cancel();
  26 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.model;
  6 +
  7 +/**
  8 + * 任务回调对象<BR>
  9 + *
  10 + * @author zoukang
  11 + * @version [V1.0.0, 2020/5/23]
  12 + * @since V1.0.0
  13 + */
  14 +public interface ITaskCallback<T> {
  15 + /**
  16 + * 任务执行结束回调
  17 + *
  18 + * @param taskTag 任务标签
  19 + * @param taskContext 上下文信息
  20 + */
  21 + void onFinish(String taskTag, T taskContext);
  22 +
  23 + /**
  24 + * 任务执行失败回调
  25 + *
  26 + * @param taskTag 任务标签
  27 + * @param errorCode 错误码信息
  28 + */
  29 + void onFailed(String taskTag, String errorCode);
  30 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.vm;
  6 +
  7 +import java.lang.reflect.InvocationHandler;
  8 +import java.lang.reflect.Method;
  9 +import java.lang.reflect.Proxy;
  10 +
  11 +import android.os.Looper;
  12 +
  13 +import androidx.annotation.NonNull;
  14 +import androidx.annotation.Nullable;
  15 +import androidx.lifecycle.LifecycleOwner;
  16 +import androidx.lifecycle.MutableLiveData;
  17 +import androidx.lifecycle.Observer;
  18 +import androidx.lifecycle.ViewModel;
  19 +
  20 +import com.wd.foundation.wdkitcore.thread.ThreadPoolUtils;
  21 +import com.wd.foundation.wdkitcore.tools.CastUtils;
  22 +import com.wd.foundation.wdkitcore.tools.ReflectionUtils;
  23 +
  24 +/**
  25 + * MVVM架构中VM的基础实现<BR>
  26 + *
  27 + * @author zoukang
  28 + * @version [V1.0.0, 2020/5/23]
  29 + * @since V1.0.0
  30 + */
  31 +public class BaseViewModel extends ViewModel implements IVMObserverToCallback {
  32 + private static final String TAG = "BaseViewModel";
  33 +
  34 + @Override
  35 + public <T extends IVMCallback> T observe(@NonNull LifecycleOwner owner, @NonNull T callback,
  36 + @NonNull Class<T> callbackClazz) {
  37 + MutableLiveData<ObserverData> observerData = new MutableLiveData<>();
  38 + Object proxyCallbackObj = Proxy.newProxyInstance(callback.getClass().getClassLoader(),
  39 + new Class[] {callbackClazz, IVMProxyCallback.class}, new CallbackInvocationHandler(observerData));
  40 + Observer<ObserverData> observer = new Observer2Callback<>(callback);
  41 + observerData.observe(owner, observer);
  42 + // 此处不需要保存,CallbackInvocationHandler已经保存了observerData
  43 + // if (proxyCallbackObj instanceof IVMProxyCallback) {
  44 + // ((IVMProxyCallback) proxyCallbackObj).saveLiveData(observerData);
  45 + // }
  46 +
  47 + if (callback instanceof LiveDataWrapper) {
  48 + // 拿到这个LiveData可以进行手动去注册
  49 + ((LiveDataWrapper) callback).save(observerData, observer);
  50 + }
  51 + return CastUtils.cast(proxyCallbackObj, callbackClazz);
  52 + }
  53 +
  54 + @Override
  55 + public <T extends IVMCallback> boolean observeRepeat(@NonNull LifecycleOwner owner, @NonNull T callback,
  56 + @NonNull T proxyCallback) {
  57 + if (proxyCallback instanceof IVMProxyCallback) {
  58 + MutableLiveData<ObserverData> observerData = ((IVMProxyCallback) proxyCallback).getLiveDataAvoidTheSame();
  59 + if (null == observerData) {
  60 + return false;
  61 + }
  62 +
  63 + Observer<ObserverData> observer = new Observer2Callback<>(callback);
  64 + observerData.observe(owner, observer);
  65 +
  66 + if (callback instanceof LiveDataWrapper) {
  67 + // 拿到这个LiveData可以进行手动去注册
  68 + ((LiveDataWrapper) callback).save(observerData, observer);
  69 + }
  70 + return true;
  71 + }
  72 + return false;
  73 + }
  74 +
  75 + /**
  76 + * 包装和注册Observer监听<BR>
  77 + *
  78 + * @param owner LiveData监听需要的生命周期对象
  79 + * @param mutableLiveData LiveData对象
  80 + * @param observer 监听对象
  81 + * @param <T> 回调类型
  82 + */
  83 + protected <T> void observe(LifecycleOwner owner, MutableLiveData<T> mutableLiveData, Observer<T> observer) {
  84 + if (observer instanceof LiveDataWrapper) {
  85 + // 拿到这个LiveData可以进行手动去注册
  86 + ((LiveDataWrapper) observer).save(mutableLiveData, observer);
  87 + }
  88 + mutableLiveData.observe(owner, observer);
  89 + }
  90 +
  91 + /**
  92 + * 动态代理的Handler类<BR>
  93 + * 监听动态代理的方法,转换成LiveData进行回调<BR>
  94 + *
  95 + * @author zoukang
  96 + * @version [V1.0.0, 2020/5/23]
  97 + * @since V1.0.0
  98 + */
  99 + private static class CallbackInvocationHandler implements InvocationHandler {
  100 + private MutableLiveData<ObserverData> mObserverData;
  101 +
  102 + CallbackInvocationHandler(MutableLiveData<ObserverData> observerData) {
  103 + mObserverData = observerData;
  104 + }
  105 +
  106 + @Override
  107 + public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
  108 + if (null == mObserverData) {
  109 + return null;
  110 + }
  111 +
  112 + if (isGetLiveDataMethod(method)) {
  113 + return mObserverData;
  114 + }
  115 +
  116 + ObserverData observerData = new ObserverData();
  117 + observerData.setMethod(method);
  118 + observerData.setParams(objects);
  119 +
  120 + // 非主线程操作才进行线程切换,避免真实回调延时
  121 + if (Looper.myLooper() == Looper.getMainLooper()) {
  122 + mObserverData.setValue(observerData);
  123 + } else {
  124 + ThreadPoolUtils.postToMain(new PostValueRunnable(observerData));
  125 + }
  126 + return null;
  127 + }
  128 +
  129 + /**
  130 + * 判断是否是预定义的获取LiveData方法<BR>
  131 + * 方法名需要确保和下面的方法名保持一致 {@link IVMProxyCallback#getLiveDataAvoidTheSame()}
  132 + *
  133 + * @param method 输入的方法对象
  134 + * @return true表示是,否则反之
  135 + */
  136 + private boolean isGetLiveDataMethod(Method method) {
  137 + if (null == method) {
  138 + return false;
  139 + }
  140 + return "getLiveDataAvoidTheSame".equals(method.getName());
  141 + }
  142 +
  143 + /**
  144 + * ObserverData 数据变化Runable<BR>
  145 + *
  146 + * @author zoukang
  147 + * @version [V1.0.0, 2020/5/23]
  148 + * @since V1.0.0
  149 + */
  150 + private class PostValueRunnable implements Runnable {
  151 + ObserverData rObserverData;
  152 +
  153 + PostValueRunnable(ObserverData observerData) {
  154 + rObserverData = observerData;
  155 + }
  156 +
  157 + @Override
  158 + public void run() {
  159 + mObserverData.setValue(rObserverData);
  160 + }
  161 + }
  162 + }
  163 +
  164 + /**
  165 + * Observer回调转换成Callback回调<BR>
  166 + * 监听LiveData的回调,将其转换成接口调用的形式回调出去<BR>
  167 + *
  168 + * @param <T> 回调类型
  169 + * @author zoukang
  170 + * @version [V1.0.0, 2020/5/23]
  171 + * @since V1.0.0
  172 + */
  173 + private static class Observer2Callback<T> implements Observer<ObserverData> {
  174 + private T mCallback;
  175 +
  176 + Observer2Callback(T callback) {
  177 + mCallback = callback;
  178 + }
  179 +
  180 + @Override
  181 + public void onChanged(@Nullable ObserverData observerData) {
  182 + if (null == observerData) {
  183 + return;
  184 + }
  185 + ReflectionUtils.invoke(observerData.getMethod(), mCallback, observerData.getParams());
  186 + }
  187 + }
  188 +
  189 + /**
  190 + * 增强的Observer数据结构<BR>
  191 + *
  192 + * @author zoukang
  193 + * @version [V1.0.0, 2020/5/23]
  194 + * @since V1.0.0
  195 + */
  196 + static class ObserverData {
  197 + private Method method;
  198 +
  199 + private Object[] params;
  200 +
  201 + public Method getMethod() {
  202 + return method;
  203 + }
  204 +
  205 + public void setMethod(Method method) {
  206 + this.method = method;
  207 + }
  208 +
  209 + public Object[] getParams() {
  210 + return params;
  211 + }
  212 +
  213 + public void setParams(Object[] params) {
  214 + this.params = params;
  215 + }
  216 + }
  217 +
  218 + /**
  219 + * VM框架中的代理回调定义<BR>
  220 + *
  221 + * @author zoukang
  222 + * @version [V1.0.0, 2020/5/23]
  223 + * @since V1.0.0
  224 + */
  225 + interface IVMProxyCallback {
  226 + /**
  227 + * 读取LiveData对象<BR>
  228 + * 方法名为了避免和外面接口定义重复,故意为之
  229 + *
  230 + * @return LiveData对象
  231 + */
  232 + MutableLiveData<ObserverData> getLiveDataAvoidTheSame();
  233 +
  234 + // /**
  235 + // * 保存LiveData对象
  236 + // * @param liveData LiveData对象
  237 + // */
  238 + // void saveLiveData(MutableLiveData<ObserverData> liveData);
  239 + }
  240 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.vm;
  6 +
  7 +/**
  8 + * ViewModel框架定义的回调<BR>
  9 + * 用于确保混淆时候,不会把callback给混淆<BR>
  10 + *
  11 + * @author zoukang
  12 + * @version [V1.0.0, 2020/5/23]
  13 + * @since V1.0.0
  14 + */
  15 +public interface IVMCallback {
  16 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.vm;
  6 +
  7 +import androidx.annotation.NonNull;
  8 +import androidx.lifecycle.LifecycleOwner;
  9 +
  10 +/**
  11 + * ViewModel的观察者创建器<BR>
  12 + *
  13 + * @author zoukang
  14 + * @version [V1.0.0, 2020/5/23]
  15 + * @since V1.0.0
  16 + */
  17 +public interface IVMObserverToCallback {
  18 +
  19 + /**
  20 + * 包装和注册Callback回调对象<BR>
  21 + * 1.对Callback进行动态代理并返回代理对象; 2.原始的Callback对象存储在LiveData的监听回调中,以便于真实地回调。
  22 + *
  23 + * @param owner LiveData监听需要的生命周期对象
  24 + * @param callback 真实的回调对象
  25 + * @param callbackClazz 回调对象的类型(无法通过callback进行反射查找)
  26 + * @param <T> 回调类型
  27 + * @return 动态代理的回调对象
  28 + */
  29 + <T extends IVMCallback> T observe(@NonNull LifecycleOwner owner, @NonNull T callback,
  30 + @NonNull Class<T> callbackClazz);
  31 +
  32 + /**
  33 + * 重复注册Callback回调对象<BR>
  34 + * 1.取出ProxyCallback中的LiveData对象; 2.将新的Callback对象保存到LiveData中,以实现重复注册的目的。
  35 + *
  36 + * @param owner LiveData监听需要的生命周期对象
  37 + * @param callback 真实的回调对象
  38 + * @param proxyCallback 动态代理的回调对象
  39 + * @param <T> 回调类型
  40 + * @return true表示注册成功,false反之
  41 + */
  42 + <T extends IVMCallback> boolean observeRepeat(@NonNull LifecycleOwner owner, @NonNull T callback,
  43 + @NonNull T proxyCallback);
  44 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.vm;
  6 +
  7 +import androidx.lifecycle.MutableLiveData;
  8 +import androidx.lifecycle.Observer;
  9 +
  10 +import com.wd.base.log.Logger;
  11 +
  12 +/**
  13 + * LiveData包装器<BR>
  14 + * 里面持有LiveData对象,可用于Observer的释放
  15 + *
  16 + * @author zoukang
  17 + * @version [V1.0.0, 2020/5/23]
  18 + * @since V1.0.0
  19 + */
  20 +public class LiveDataWrapper {
  21 + private MutableLiveData mLiveData;
  22 +
  23 + private Observer mObserver;
  24 +
  25 + void save(MutableLiveData liveData, Observer observer) {
  26 + mLiveData = liveData;
  27 + mObserver = observer;
  28 + }
  29 +
  30 + /**
  31 + * 释放Observer对象
  32 + */
  33 + public void removeObserver() {
  34 + if (null == mLiveData || null == mObserver) {
  35 + return;
  36 + }
  37 +
  38 + try {
  39 + mLiveData.removeObserver(mObserver);
  40 + } catch (ClassCastException e) {
  41 + Logger.t("LiveDataWrapper").e("removeObserver failed.", e);
  42 + }
  43 + }
  44 +
  45 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.vm;
  6 +
  7 +import java.util.concurrent.ConcurrentHashMap;
  8 +
  9 +import androidx.annotation.NonNull;
  10 +import androidx.lifecycle.LifecycleOwner;
  11 +
  12 +import com.wd.foundation.wdkit.mvvm.model.ConditionTask;
  13 +
  14 +/**
  15 + * VM监听器包装类<BR>
  16 + *
  17 + * @param <T> 监听器实际类型
  18 + * @author zoukang
  19 + * @version [V1.0.0, 2020/5/23]
  20 + * @since V1.0.0
  21 + */
  22 +public abstract class VMListenerWrapperBase<T extends IVMCallback> {
  23 +
  24 + private static final String CALLBACK_CONDITION_NAME = "wait_for_register_callback";
  25 +
  26 + protected T mVMListener;
  27 +
  28 + private ConcurrentHashMap<String, ListenerConditionTask> mCachedConditionTasks = new ConcurrentHashMap<>();
  29 +
  30 + private IVMObserverToCallback mVMObserverCreator;
  31 +
  32 + /**
  33 + * 构造函数
  34 + *
  35 + * @param observerCreator ViewModel的观察者创建器
  36 + */
  37 + public VMListenerWrapperBase(@NonNull IVMObserverToCallback observerCreator) {
  38 + mVMObserverCreator = observerCreator;
  39 + }
  40 +
  41 + /**
  42 + * 注册用户信息结果监听
  43 + *
  44 + * @param lifecycleOwner 生命周期对象
  45 + * @param listener 监听对象
  46 + */
  47 + public void observe(LifecycleOwner lifecycleOwner, T listener) {
  48 + if (null == mVMListener) {
  49 + mVMListener = mVMObserverCreator.observe(lifecycleOwner, listener, getListenerClazz());
  50 + } else {
  51 + mVMObserverCreator.observeRepeat(lifecycleOwner, listener, mVMListener);
  52 + }
  53 + for (ListenerConditionTask conditionTask : mCachedConditionTasks.values()) {
  54 + conditionTask.setListener(mVMListener);
  55 + conditionTask.matchCondition(CALLBACK_CONDITION_NAME);
  56 + }
  57 + }
  58 +
  59 + /**
  60 + * 释放监听任务
  61 + */
  62 + public void release() {
  63 + for (ListenerConditionTask conditionTask : mCachedConditionTasks.values()) {
  64 + conditionTask.cancel();
  65 + }
  66 + mCachedConditionTasks.clear();
  67 + }
  68 +
  69 + /**
  70 + * 添加条件任务
  71 + *
  72 + * @param conditionTask 条件任务
  73 + */
  74 + protected void addConditionTask(ListenerConditionTask conditionTask) {
  75 + conditionTask.registerCondition(CALLBACK_CONDITION_NAME);
  76 + mCachedConditionTasks.put(conditionTask.getType(), conditionTask);
  77 + }
  78 +
  79 + /**
  80 + * 获取Listener的类型
  81 + *
  82 + * @return Listener的类型
  83 + */
  84 + protected abstract Class<T> getListenerClazz();
  85 +
  86 + /**
  87 + * 条件回调任务<BR>
  88 + *
  89 + * @author zoukang
  90 + * @version [V1.0.0, 2020/5/23]
  91 + * @since V1.0.0
  92 + */
  93 + public abstract class ListenerConditionTask extends ConditionTask<String> {
  94 +
  95 + T mListener;
  96 +
  97 + @Override
  98 + protected String onInstantiateContext() {
  99 + return "";
  100 + }
  101 +
  102 + @Override
  103 + protected void onExecute(String contextType) {
  104 + onExecute(mListener);
  105 + }
  106 +
  107 + /**
  108 + * 执行
  109 + *
  110 + * @param listener 回调
  111 + */
  112 + protected abstract void onExecute(T listener);
  113 +
  114 + /**
  115 + * 获取类型
  116 + *
  117 + * @return 类型
  118 + */
  119 + protected abstract String getType();
  120 +
  121 + public void setListener(T mListener) {
  122 + this.mListener = mListener;
  123 + }
  124 + }
  125 +
  126 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.vm.helper;
  6 +
  7 +/**
  8 + * VM层Helper接口基类<BR>
  9 + *
  10 + * @author zoukang
  11 + * @version [V1.0.0, 2020/5/23]
  12 + * @since V1.0.0
  13 + */
  14 +public interface IVMHelperBase {
  15 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.vm.helper;
  6 +
  7 +/**
  8 + * VM层Helper存储器接口定义<BR>
  9 + *
  10 + * @author zoukang
  11 + * @version [V1.0.0, 2020/5/23]
  12 + * @since V1.0.0
  13 + */
  14 +public interface IVMHelperHolder {
  15 +
  16 + /**
  17 + * 添加VM层Helper实例
  18 + *
  19 + * @param helperApiClazz VM层Helper Class对象
  20 + * @param playHelper VM层Helper实例
  21 + * @param <T> VM层Helper Class对象类型
  22 + */
  23 + <T extends IVMHelperBase> void register(Class<T> helperApiClazz, T playHelper);
  24 +
  25 + /**
  26 + * 根据VM层Helper的class对象获取对应的播放Helper类
  27 + *
  28 + * @param helperApiClazz VM层Helper Class对象
  29 + * @param <T> VM层Helper Class对象类型
  30 + * @return VM层Helper实例
  31 + */
  32 + <T extends IVMHelperBase> T getVMHelper(Class<T> helperApiClazz);
  33 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.vm.helper;
  6 +
  7 +/**
  8 + * VM帮助类基类<BR>
  9 + *
  10 + * @author zoukang
  11 + * @version [V1.0.0, 2020/5/23]
  12 + * @since V1.0.0
  13 + * @param <T> 回调对象类型
  14 + */
  15 +public class VMHelperBase<T> implements IVMHelperBase {
  16 + /**
  17 + * VM回调汇总
  18 + */
  19 + protected T mVMListener;
  20 +
  21 + /**
  22 + * VM helper容器
  23 + */
  24 + private VMHelperHolder mVMHelperHolder;
  25 +
  26 + /**
  27 + * 构造函数
  28 + *
  29 + * @param listener VM回调汇总
  30 + * @param vmHelperHolder VM Helper存储器
  31 + */
  32 + public VMHelperBase(T listener, VMHelperHolder vmHelperHolder) {
  33 + mVMListener = listener;
  34 + mVMHelperHolder = vmHelperHolder;
  35 + }
  36 +
  37 + /**
  38 + * 获取VM Helper存储器
  39 + *
  40 + * @return VM Helper存储器
  41 + */
  42 + protected VMHelperHolder getVMHelperHolder() {
  43 + return mVMHelperHolder;
  44 + }
  45 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.foundation.wdkit.mvvm.vm.helper;
  6 +
  7 +import java.util.HashMap;
  8 +import java.util.Map;
  9 +
  10 +import com.wd.foundation.wdkitcore.tools.CastUtils;
  11 +
  12 +/**
  13 + * VM层Helper存储器<BR>
  14 + *
  15 + * @author zoukang
  16 + * @version [V1.0.0, 2020/5/23]
  17 + * @since V1.0.0
  18 + */
  19 +public class VMHelperHolder implements IVMHelperHolder {
  20 + private Map<Class<? extends IVMHelperBase>, IVMHelperBase> mHelpers = new HashMap<>();
  21 +
  22 + @Override
  23 + public <T extends IVMHelperBase> void register(Class<T> helperApiClazz, T playHelper) {
  24 + if (null == helperApiClazz || null == playHelper) {
  25 + return;
  26 + }
  27 +
  28 + mHelpers.put(helperApiClazz, playHelper);
  29 + }
  30 +
  31 + @Override
  32 + public <T extends IVMHelperBase> T getVMHelper(Class<T> helperApiClazz) {
  33 + return CastUtils.cast(mHelpers.get(helperApiClazz), helperApiClazz);
  34 + }
  35 +}
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 +
  4 +</resources>