张波

提交代码

Showing 63 changed files with 3747 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 +/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 project(path: ':wdstartup')
  60 + api(name: "wdstartup-debug-v1.0.0", ext: "aar")
  61 +}
No preview for this file type
  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 + project.configurations.configureEach {
  75 + resolutionStrategy.eachDependency { details ->
  76 + if (details.requested.group == 'com.android.android.support' && !details.requested.name.contains('multidex')) {
  77 + details.useVersion "28.0.0"
  78 + }
  79 +
  80 + }
  81 + }
  82 +
  83 + // 强制依赖
  84 + configurations.configureEach {
  85 + exclude group: 'com.alipay.android.phone.thirdparty', module: 'securityguard-build'
  86 + resolutionStrategy {
  87 + force 'androidx.activity:activity:1.2.1'
  88 + force 'androidx.annotation:annotation:1.1.0'
  89 + force 'androidx.appcompat:appcompat:1.2.0'
  90 + force 'androidx.arch.core:core-common:2.1.0'
  91 + force 'androidx.arch.core:core-runtime:2.1.0'
  92 + force 'androidx.core:core-ktx:1.6.0'
  93 + force 'androidx.core:core:1.5.0'
  94 + force 'androidx.collection:collection:1.1.0'
  95 + force 'androidx.constraintlayout:constraintlayout:2.0.4'
  96 + force 'androidx.constraintlayout:constraintlayout-solver:2.0.4'
  97 + force 'androidx.coordinatorlayout:coordinatorlayout:1.1.0'
  98 + force 'androidx.fragment:fragment:1.3.1'
  99 + force 'androidx.lifecycle:lifecycle-common:2.3.0'
  100 + force 'androidx.multidex:multidex:2.0.1'
  101 + force 'androidx.recyclerview:recyclerview:1.2.0'
  102 + force 'androidx.vectordrawable:vectordrawable:1.1.0'
  103 + force 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
  104 + force 'com.squareup.okhttp3:okhttp:4.9.1'
  105 + force 'com.squareup.okio:okio:2.7.0'
  106 + force 'org.jetbrains.kotlin:kotlin-stdlib:1.4.32'
  107 + force 'org.jetbrains.kotlin:kotilin-stdlib-jdk8:1.4.32'
  108 + force 'org.jetbrains:annotations:15.0'
  109 + force 'net.sf.proguard:proguard-base:6.1.0'
  110 + }
  111 + }
  112 +}
  113 +
  114 +ext {
  115 + var = [
  116 + // SDK And Tools
  117 + applicationId : "com.wondertek.dss",
  118 + minSdkVersion : 25,
  119 + targetSdkVersion : 30,
  120 + compileSdkVersion: 30,
  121 + buildToolsVersion: "30.0.3",
  122 + // 版本号,正式版本 1.0.0 1000080 后两位,80即标识为发布版本
  123 + // 测试版本 1.0.0_TF1 1000001 后两位,01即为测试版本号,01-79
  124 + // 升级版本 1.0.0_RC1 1000081 后两位,81即为升级版本号,81-99
  125 + versionName : "1.0.0", // release正式
  126 + debugVnName : "", // debug开发模式 用于区分debug模式下上报的日志
  127 + versionCode : 100,
  128 + //此版本号是SDK版本,不能随便改
  129 + aar_version : "1.0.0",
  130 + ]
  131 +
  132 +}
  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 = "wdstartup"
  2 +include ':app'
  3 +include ':wdstartup'
  1 +plugins {
  2 + id 'com.android.library'
  3 + id 'kotlin-android'
  4 +}
  5 +
  6 +android {
  7 + compileSdkVersion var.compileSdkVersion
  8 +
  9 + defaultConfig {
  10 + minSdkVersion var.minSdkVersion
  11 + targetSdkVersion var.targetSdkVersion
  12 + versionCode var.versionCode
  13 + versionName var.versionName
  14 +
  15 + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  16 + consumerProguardFiles "consumer-rules.pro"
  17 +
  18 + buildConfigField "String", "API_VERSION", "\"${requestVersion}\""
  19 + }
  20 +
  21 + buildTypes {
  22 + release {
  23 + minifyEnabled false
  24 + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  25 + }
  26 + }
  27 + compileOptions {
  28 + sourceCompatibility JavaVersion.VERSION_1_8
  29 + targetCompatibility JavaVersion.VERSION_1_8
  30 + }
  31 +
  32 + // 自定义AAR包名
  33 + android.libraryVariants.all { variant ->
  34 + variant.outputs.all {
  35 + if (outputFileName != null && outputFileName.endsWith(".aar")) {
  36 + def fileName = "${project.name}-${buildType.name}-v${var.aar_version}.aar"
  37 + outputFileName = fileName
  38 + }
  39 + }
  40 + }
  41 +}
  42 +
  43 +dependencies {
  44 +
  45 +}
  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.startup">
  4 +
  5 +</manifest>
  1 +
  2 +package com.wd.base.starttask;
  3 +
  4 +import java.util.concurrent.ExecutorService;
  5 +import java.util.concurrent.LinkedBlockingQueue;
  6 +import java.util.concurrent.ThreadFactory;
  7 +import java.util.concurrent.ThreadPoolExecutor;
  8 +import java.util.concurrent.TimeUnit;
  9 +import java.util.concurrent.atomic.AtomicInteger;
  10 +
  11 +import android.content.Context;
  12 +
  13 +public class AlphaConfig {
  14 + private static boolean sIsLoggable = true;
  15 +
  16 + private static int sCoreThreadNum = Runtime.getRuntime().availableProcessors();
  17 +
  18 + private static ThreadFactory sThreadFactory;
  19 +
  20 + private static ExecutorService sExecutor;
  21 +
  22 + private static int sWarningTime = 400;
  23 +
  24 + private static boolean sShowToastToAlarm = false;
  25 +
  26 + private static Context sContext;
  27 +
  28 + public AlphaConfig() {
  29 + }
  30 +
  31 + public static void setCoreThreadNum(int coreThreadNum) {
  32 + sCoreThreadNum = coreThreadNum;
  33 + }
  34 +
  35 + public static void setThreadFactory(ThreadFactory threadFactory) {
  36 + sThreadFactory = threadFactory;
  37 + }
  38 +
  39 + public static void setExecutorService(ExecutorService executorService) {
  40 + sExecutor = executorService;
  41 + }
  42 +
  43 + public static void setLoggable(boolean isLoggable) {
  44 + sIsLoggable = isLoggable;
  45 + }
  46 +
  47 + public static void setWarningTime(int warningTime) {
  48 + sWarningTime = warningTime;
  49 + }
  50 +
  51 + public static void setShowToastToAlarm(Context context, boolean showToastToAlarm) {
  52 + sContext = context;
  53 + sShowToastToAlarm = showToastToAlarm;
  54 + }
  55 +
  56 + static boolean isLoggable() {
  57 + return sIsLoggable;
  58 + }
  59 +
  60 + static ThreadFactory getThreadFactory() {
  61 + if (sThreadFactory == null) {
  62 + sThreadFactory = getDefaultThreadFactory();
  63 + }
  64 +
  65 + return sThreadFactory;
  66 + }
  67 +
  68 + static ExecutorService getExecutor() {
  69 + if (sExecutor == null) {
  70 + sExecutor = getDefaultExecutor();
  71 + }
  72 +
  73 + return sExecutor;
  74 + }
  75 +
  76 + static int getWarmingTime() {
  77 + return sWarningTime;
  78 + }
  79 +
  80 + static boolean shouldShowToastToAlarm() {
  81 + return sShowToastToAlarm;
  82 + }
  83 +
  84 + static Context getContext() {
  85 + return sContext;
  86 + }
  87 +
  88 + private static ThreadFactory getDefaultThreadFactory() {
  89 + ThreadFactory defaultFactory = new ThreadFactory() {
  90 + private final AtomicInteger mCount = new AtomicInteger(1);
  91 +
  92 + public Thread newThread(Runnable r) {
  93 + return new Thread(r, "Alpha Thread #" + this.mCount.getAndIncrement());
  94 + }
  95 + };
  96 + return defaultFactory;
  97 + }
  98 +
  99 + private static ExecutorService getDefaultExecutor() {
  100 + ThreadPoolExecutor executor = new ThreadPoolExecutor(sCoreThreadNum, sCoreThreadNum, 60L, TimeUnit.SECONDS,
  101 + new LinkedBlockingQueue(), getThreadFactory());
  102 + executor.allowCoreThreadTimeOut(true);
  103 + return executor;
  104 + }
  105 +}
  1 +
  2 +package com.wd.base.starttask;
  3 +
  4 +import android.util.Log;
  5 +
  6 +public class AlphaLog {
  7 + public static final String GLOBAL_TAG = "==ALPHA==";
  8 +
  9 + public AlphaLog() {
  10 + }
  11 +
  12 + public static void d(String tag, Object obj) {
  13 + if (AlphaConfig.isLoggable()) {
  14 + Log.d(tag, obj.toString());
  15 + }
  16 +
  17 + }
  18 +
  19 + public static void d(String tag, String msg, Object... args) {
  20 + if (AlphaConfig.isLoggable()) {
  21 + String formattedMsg = String.format(msg, args);
  22 + Log.d(tag, formattedMsg);
  23 + }
  24 +
  25 + }
  26 +
  27 + public static void d(String msg, Object... args) {
  28 + d("==ALPHA==", msg, args);
  29 + }
  30 +
  31 + public static void e(String tag, Object obj) {
  32 + if (AlphaConfig.isLoggable()) {
  33 + Log.e(tag, obj.toString());
  34 + }
  35 +
  36 + }
  37 +
  38 + public static void e(String tag, String msg, Object... args) {
  39 + if (AlphaConfig.isLoggable()) {
  40 + String formattedMsg = String.format(msg, args);
  41 + Log.e(tag, formattedMsg);
  42 + }
  43 +
  44 + }
  45 +
  46 + public static void i(String tag, Object obj) {
  47 + if (AlphaConfig.isLoggable()) {
  48 + Log.i(tag, obj.toString());
  49 + }
  50 +
  51 + }
  52 +
  53 + public static void w(Exception e) {
  54 + if (AlphaConfig.isLoggable()) {
  55 + e.printStackTrace();
  56 + }
  57 +
  58 + }
  59 +
  60 + public static void print(Object msg) {
  61 + d("==ALPHA==", msg);
  62 + }
  63 +
  64 + public static void print(String msg, Object... args) {
  65 + d("==ALPHA==", msg, args);
  66 + }
  67 +}
  1 +package com.wd.base.starttask;
  2 +
  3 +
  4 +
  5 +import android.content.Context;
  6 +import android.text.TextUtils;
  7 +import android.util.SparseArray;
  8 +
  9 +
  10 +import java.io.File;
  11 +import java.io.FileInputStream;
  12 +import java.io.IOException;
  13 +import java.io.InputStream;
  14 +import java.util.ArrayList;
  15 +import java.util.Iterator;
  16 +import java.util.List;
  17 +
  18 +public class AlphaManager {
  19 + public static final int MAIN_PROCESS_MODE = 1;
  20 + public static final int SECONDARY_PROCESS_MODE = 2;
  21 + public static final int ALL_PROCESS_MODE = 3;
  22 + private Task mProjectForCurrentProcess;
  23 + private SparseArray<Task> mProjectArray = new SparseArray();
  24 + private Context mContext;
  25 + private static AlphaManager sInstance = null;
  26 + private volatile boolean mIsStartupFinished = false;
  27 + private OnProjectExecuteListener mProjectExecuteListener = new AlphaManager.ProjectExecuteListener();
  28 + private static byte[] sExtraTaskListLock = new byte[0];
  29 + private static byte[] sExtraTaskMapLock = new byte[0];
  30 + private List<String> mFinishedTask = new ArrayList();
  31 + private ListMultiMap<String, Task> mExtraTaskMap = new ListMultiMap();
  32 + private List<Task> mExtraTaskList = new ArrayList();
  33 + private static byte[] sWaitFinishLock = new byte[0];
  34 +
  35 + private AlphaManager(Context context) {
  36 + if (context == null) {
  37 + throw new IllegalArgumentException("Context is null. ");
  38 + } else {
  39 + this.mContext = context;
  40 + }
  41 + }
  42 +
  43 + public static synchronized AlphaManager getInstance(Context context) {
  44 + if (sInstance == null) {
  45 + sInstance = new AlphaManager(context);
  46 + }
  47 +
  48 + return sInstance;
  49 + }
  50 +
  51 + public void start() {
  52 + Project project = null;
  53 + if (this.mProjectForCurrentProcess != null) {
  54 + project = (Project)this.mProjectForCurrentProcess;
  55 + } else if (AlphaUtils.isInMainProcess(this.mContext) && this.mProjectArray.indexOfKey(1) >= 0) {
  56 + project = (Project)this.mProjectArray.get(1);
  57 + } else if (!AlphaUtils.isInMainProcess(this.mContext) && this.mProjectArray.indexOfKey(2) >= 0) {
  58 + project = (Project)this.mProjectArray.get(2);
  59 + } else if (this.mProjectArray.indexOfKey(3) >= 0) {
  60 + project = (Project)this.mProjectArray.get(3);
  61 + }
  62 +
  63 + if (project != null) {
  64 + this.addListeners(project);
  65 + project.start();
  66 + } else {
  67 + AlphaLog.e("==ALPHA==", "No startup project for current process.");
  68 + }
  69 +
  70 + }
  71 +
  72 + public void addProject(Task project) {
  73 + this.addProject(project, 3);
  74 + }
  75 +
  76 + public void addProject(Task project, String processName) {
  77 + if (AlphaUtils.isMatchProcess(this.mContext, processName)) {
  78 + this.mProjectForCurrentProcess = project;
  79 + }
  80 +
  81 + }
  82 +
  83 + public void addProject(Task project, int mode) {
  84 + if (project == null) {
  85 + throw new IllegalArgumentException("project is null");
  86 + } else if (mode >= 1 && mode <= 3) {
  87 + if (AlphaUtils.isMatchMode(this.mContext, mode)) {
  88 + this.mProjectArray.put(mode, project);
  89 + }
  90 +
  91 + } else {
  92 + throw new IllegalArgumentException("No such mode: " + mode);
  93 + }
  94 + }
  95 +
  96 + public void addProjectsViaFile(String path) {
  97 + File file = new File(path);
  98 + this.addProjectsViaFile(file);
  99 + }
  100 +
  101 + public void addProjectsViaFile(File file) {
  102 + if (!file.exists()) {
  103 + throw new RuntimeException("Alpha config file " + file + " is not exist!");
  104 + } else {
  105 + InputStream in = null;
  106 +
  107 + try {
  108 + in = new FileInputStream(file);
  109 + this.addProjectsViaFile((InputStream)in);
  110 + } catch (IOException var7) {
  111 + throw new RuntimeException(var7);
  112 + } finally {
  113 + AlphaUtils.closeSafely(in);
  114 + }
  115 +
  116 + }
  117 + }
  118 +
  119 + public void addProjectsViaFile(InputStream in) {
  120 + ConfigParser parser = new ConfigParser();
  121 + List<ConfigParser.ProjectInfo> projectInfoList = parser.parse(in);
  122 + if (projectInfoList == null) {
  123 + throw new RuntimeException("Parse alpha config file fail.");
  124 + } else {
  125 + Iterator var4 = projectInfoList.iterator();
  126 +
  127 + while(var4.hasNext()) {
  128 + ConfigParser.ProjectInfo projectInfo = (ConfigParser.ProjectInfo)var4.next();
  129 + if (TextUtils.isEmpty(projectInfo.processName)) {
  130 + this.addProject(projectInfo.project, projectInfo.mode);
  131 + } else {
  132 + this.addProject(projectInfo.project, projectInfo.processName);
  133 + }
  134 + }
  135 +
  136 + }
  137 + }
  138 +
  139 + public boolean isStartupFinished() {
  140 + return this.mIsStartupFinished;
  141 + }
  142 +
  143 + public void executeAfterStartup(Task task) {
  144 + this.executeAfterStartup(task, 3);
  145 + }
  146 +
  147 + public void executeAfterStartup(Task task, int mode) {
  148 + this.executeAfterStartup(task, mode, 0);
  149 + }
  150 +
  151 + public void executeAfterStartup(Task task, int mode, int executePriority) {
  152 + if (AlphaUtils.isMatchMode(this.mContext, mode)) {
  153 + if (this.isStartupFinished()) {
  154 + task.start();
  155 + } else {
  156 + task.setExecutePriority(executePriority);
  157 + this.addProjectBindTask(task);
  158 + }
  159 +
  160 + }
  161 + }
  162 +
  163 + public void executeAfterStartup(Task task, String processName, int executePriority) {
  164 + if (AlphaUtils.isMatchProcess(this.mContext, processName)) {
  165 + if (this.isStartupFinished()) {
  166 + task.start();
  167 + } else {
  168 + task.setExecutePriority(executePriority);
  169 + this.addProjectBindTask(task);
  170 + }
  171 +
  172 + }
  173 + }
  174 +
  175 + public void executeAfterStartup(Task task, String processName) {
  176 + this.executeAfterStartup(task, processName, 0);
  177 + }
  178 +
  179 + public void executeAfterTask(Task task, String taskName) {
  180 + this.executeAfterTask(task, taskName, 3);
  181 + }
  182 +
  183 + public void executeAfterTask(Task task, String taskName, int mode, int executePriority) {
  184 + if (AlphaUtils.isMatchMode(this.mContext, mode)) {
  185 + synchronized(sExtraTaskMapLock) {
  186 + if (!this.isStartupFinished() && !this.mFinishedTask.contains(taskName)) {
  187 + task.setExecutePriority(executePriority);
  188 + this.mExtraTaskMap.put(taskName, task);
  189 + } else {
  190 + task.start();
  191 + }
  192 +
  193 + }
  194 + }
  195 + }
  196 +
  197 + public void executeAfterTask(Task task, String taskName, int mode) {
  198 + this.executeAfterTask(task, taskName, mode, 0);
  199 + }
  200 +
  201 + public void executeAfterTask(Task task, String taskName, String processName, int executePriority) {
  202 + if (AlphaUtils.isMatchProcess(this.mContext, processName)) {
  203 + synchronized(sExtraTaskMapLock) {
  204 + if (!this.isStartupFinished() && !this.mFinishedTask.contains(taskName)) {
  205 + task.setExecutePriority(executePriority);
  206 + this.mExtraTaskMap.put(taskName, task);
  207 + } else {
  208 + task.start();
  209 + }
  210 +
  211 + }
  212 + }
  213 + }
  214 +
  215 + public void executeAfterTask(Task task, String taskName, String processName) {
  216 + this.executeAfterTask(task, taskName, processName, 0);
  217 + }
  218 +
  219 + public void waitUntilFinish() {
  220 + synchronized(sWaitFinishLock) {
  221 + while(!this.mIsStartupFinished) {
  222 + try {
  223 + sWaitFinishLock.wait();
  224 + } catch (InterruptedException var4) {
  225 + AlphaLog.w(var4);
  226 + }
  227 + }
  228 +
  229 + }
  230 + }
  231 +
  232 + public boolean waitUntilFinish(long timeout) {
  233 + long start = System.currentTimeMillis();
  234 + long waitTime = 0L;
  235 + synchronized(sWaitFinishLock) {
  236 + for(; !this.mIsStartupFinished && waitTime < timeout; waitTime = System.currentTimeMillis() - start) {
  237 + try {
  238 + sWaitFinishLock.wait(timeout);
  239 + } catch (InterruptedException var10) {
  240 + AlphaLog.w(var10);
  241 + }
  242 + }
  243 + }
  244 +
  245 + return waitTime > timeout;
  246 + }
  247 +
  248 + private void addListeners(Project project) {
  249 + project.addOnTaskFinishListener(new Task.OnTaskFinishListener() {
  250 + public void onTaskFinish(String taskName) {
  251 + AlphaManager.this.mIsStartupFinished = true;
  252 + AlphaManager.this.recycle();
  253 + AlphaManager.this.releaseWaitFinishLock();
  254 + }
  255 + });
  256 + project.addOnProjectExecuteListener(this.mProjectExecuteListener);
  257 + }
  258 +
  259 + private void releaseWaitFinishLock() {
  260 + synchronized(sWaitFinishLock) {
  261 + sWaitFinishLock.notifyAll();
  262 + }
  263 + }
  264 +
  265 + private void recycle() {
  266 + this.mProjectForCurrentProcess = null;
  267 + this.mProjectArray.clear();
  268 + }
  269 +
  270 + private void executeTaskBindRunnable(String taskName) {
  271 + List<Task> list = this.mExtraTaskMap.get(taskName);
  272 + AlphaUtils.sort(list);
  273 + Iterator var3 = list.iterator();
  274 +
  275 + while(var3.hasNext()) {
  276 + Task task = (Task)var3.next();
  277 + task.start();
  278 + }
  279 +
  280 + this.mExtraTaskMap.remove(taskName);
  281 + }
  282 +
  283 + private void executeProjectBindRunnables() {
  284 + AlphaUtils.sort(this.mExtraTaskList);
  285 + Iterator var1 = this.mExtraTaskList.iterator();
  286 +
  287 + while(var1.hasNext()) {
  288 + Task task = (Task)var1.next();
  289 + task.start();
  290 + }
  291 +
  292 + this.mExtraTaskList.clear();
  293 + }
  294 +
  295 + private void addProjectBindTask(Task task) {
  296 + synchronized(sExtraTaskListLock) {
  297 + this.mExtraTaskList.add(task);
  298 + }
  299 + }
  300 +
  301 + private class ProjectExecuteListener implements OnProjectExecuteListener {
  302 + private ProjectExecuteListener() {
  303 + }
  304 +
  305 + public void onProjectStart() {
  306 + }
  307 +
  308 + public void onTaskFinish(String taskName) {
  309 + synchronized(AlphaManager.sExtraTaskMapLock) {
  310 + AlphaManager.this.mFinishedTask.add(taskName);
  311 + if (AlphaManager.this.mExtraTaskMap.containsKey(taskName)) {
  312 + AlphaManager.this.executeTaskBindRunnable(taskName);
  313 + }
  314 +
  315 + }
  316 + }
  317 +
  318 + public void onProjectFinish() {
  319 + synchronized(AlphaManager.sExtraTaskListLock) {
  320 + if (!AlphaManager.this.mExtraTaskList.isEmpty()) {
  321 + AlphaManager.this.executeProjectBindRunnables();
  322 + }
  323 + }
  324 +
  325 + synchronized(AlphaManager.sExtraTaskMapLock) {
  326 + AlphaManager.this.mFinishedTask.clear();
  327 + }
  328 + }
  329 + }
  330 +}
  331 +
  1 +
  2 +package com.wd.base.starttask;
  3 +
  4 +import java.io.Closeable;
  5 +import java.io.FileInputStream;
  6 +import java.util.Collections;
  7 +import java.util.Comparator;
  8 +import java.util.Iterator;
  9 +import java.util.List;
  10 +
  11 +import android.app.ActivityManager;
  12 +import android.content.Context;
  13 +import android.database.Cursor;
  14 +import android.os.Process;
  15 +import android.text.TextUtils;
  16 +
  17 +public class AlphaUtils {
  18 + private static Comparator<Task> sTaskComparator = new Comparator<Task>() {
  19 + public int compare(Task lhs, Task rhs) {
  20 + return lhs.getExecutePriority() - rhs.getExecutePriority();
  21 + }
  22 + };
  23 +
  24 + private static String sProcessName;
  25 +
  26 + public AlphaUtils() {
  27 + }
  28 +
  29 + public static void sort(List<Task> tasks) {
  30 + if (tasks.size() > 1) {
  31 + Collections.sort(tasks, sTaskComparator);
  32 + }
  33 + }
  34 +
  35 + public static boolean closeSafely(Closeable closeable) {
  36 + if (closeable == null) {
  37 + return false;
  38 + } else {
  39 + boolean ret = false;
  40 +
  41 + try {
  42 + closeable.close();
  43 + ret = true;
  44 + } catch (Exception var3) {
  45 + AlphaLog.w(var3);
  46 + }
  47 +
  48 + return ret;
  49 + }
  50 + }
  51 +
  52 + public static boolean closeSafely(Cursor cursor) {
  53 + if (cursor == null) {
  54 + return false;
  55 + } else {
  56 + boolean ret = false;
  57 +
  58 + try {
  59 + cursor.close();
  60 + ret = true;
  61 + } catch (Exception var3) {
  62 + AlphaLog.w(var3);
  63 + }
  64 +
  65 + return ret;
  66 + }
  67 + }
  68 +
  69 + public static String getCurrProcessName(Context context) {
  70 + String name = getCurrentProcessNameViaLinuxFile();
  71 + if (TextUtils.isEmpty(name) && context != null) {
  72 + name = getCurrentProcessNameViaActivityManager(context);
  73 + }
  74 +
  75 + return name;
  76 + }
  77 +
  78 + public static boolean isInMainProcess(Context context) {
  79 + String mainProcessName = context.getPackageName();
  80 + String currentProcessName = getCurrProcessName(context);
  81 + return mainProcessName != null && mainProcessName.equalsIgnoreCase(currentProcessName);
  82 + }
  83 +
  84 + private static String getCurrentProcessNameViaLinuxFile() {
  85 + int pid = Process.myPid();
  86 + String line = "/proc/" + pid + "/cmdline";
  87 + FileInputStream fis = null;
  88 + String processName = null;
  89 + byte[] bytes = new byte[1024];
  90 + int read = 0;
  91 +
  92 + try {
  93 + fis = new FileInputStream(line);
  94 + read = fis.read(bytes);
  95 + } catch (Exception var10) {
  96 + AlphaLog.w(var10);
  97 + } finally {
  98 + closeSafely((Closeable) fis);
  99 + }
  100 +
  101 + if (read > 0) {
  102 + processName = new String(bytes, 0, read);
  103 + processName = processName.trim();
  104 + }
  105 +
  106 + return processName;
  107 + }
  108 +
  109 + private static String getCurrentProcessNameViaActivityManager(Context context) {
  110 + if (context == null) {
  111 + return null;
  112 + } else if (sProcessName != null) {
  113 + return sProcessName;
  114 + } else {
  115 + int pid = Process.myPid();
  116 + ActivityManager mActivityManager = (ActivityManager) context.getSystemService("activity");
  117 + if (mActivityManager == null) {
  118 + return null;
  119 + } else {
  120 + List<ActivityManager.RunningAppProcessInfo> processes = mActivityManager.getRunningAppProcesses();
  121 + if (processes == null) {
  122 + return null;
  123 + } else {
  124 + Iterator var4 = processes.iterator();
  125 +
  126 + while (var4.hasNext()) {
  127 + ActivityManager.RunningAppProcessInfo appProcess =
  128 + (ActivityManager.RunningAppProcessInfo) var4.next();
  129 + if (appProcess != null && appProcess.pid == pid) {
  130 + sProcessName = appProcess.processName;
  131 + break;
  132 + }
  133 + }
  134 +
  135 + return sProcessName;
  136 + }
  137 + }
  138 + }
  139 + }
  140 +
  141 + public static boolean isMatchProcess(Context context, String processName) {
  142 + String currentProcessName = getCurrProcessName(context);
  143 + return TextUtils.equals(processName, currentProcessName);
  144 + }
  145 +
  146 + public static boolean isMatchMode(Context context, int mode) {
  147 + if (mode == 3) {
  148 + return true;
  149 + } else if (isInMainProcess(context) && mode == 1) {
  150 + return true;
  151 + } else {
  152 + return !isInMainProcess(context) && mode == 2;
  153 + }
  154 + }
  155 +}
  1 +
  2 +package com.wd.base.starttask;
  3 +
  4 +import java.io.FileNotFoundException;
  5 +import java.io.IOException;
  6 +import java.io.InputStream;
  7 +import java.util.ArrayList;
  8 +import java.util.Arrays;
  9 +import java.util.HashMap;
  10 +import java.util.Iterator;
  11 +import java.util.List;
  12 +
  13 +import org.xmlpull.v1.XmlPullParser;
  14 +import org.xmlpull.v1.XmlPullParserException;
  15 +
  16 +import android.text.TextUtils;
  17 +import android.util.Xml;
  18 +
  19 +class ConfigParser {
  20 + private static final String TAG_PROJECTS = "projects";
  21 +
  22 + private static final String TAG_PROJECT = "project";
  23 +
  24 + private static final String TAG_TASK = "task";
  25 +
  26 + private static final String ATTRIBUTE_TASK_NAME = "name";
  27 +
  28 + private static final String ATTRIBUTE_TASK_CLASS = "class";
  29 +
  30 + private static final String ATTRIBUTE_TASK_PREDECESSOR = "predecessor";
  31 +
  32 + private static final String ATTRIBUTE_PROJECT_MODE = "mode";
  33 +
  34 + private static final String ATTRIBUTE_PROCESS_NAME = "process";
  35 +
  36 + private static final String ATTRIBUTE_THREAD_PRIORITY = "threadPriority";
  37 +
  38 + private static final String ATTRIBUTE_EXECUTE_PRIORITY = "executePriority";
  39 +
  40 + private static final String MODE_ALL_PROCESS = "allProcess";
  41 +
  42 + private static final String MODE_MAIN_PROCESS = "mainProcess";
  43 +
  44 + private static final String MODE_SECONDARY_PROCESS = "secondaryProcess";
  45 +
  46 + private static final String PREDECESSOR_DIVIDER = ",";
  47 +
  48 + ConfigParser() {
  49 + }
  50 +
  51 + public List<ConfigParser.ProjectInfo> parse(InputStream in) {
  52 + try {
  53 + XmlPullParser parser = Xml.newPullParser();
  54 + parser.setFeature("http://xmlpull.org/v1/doc/features.html#process-namespaces", false);
  55 + parser.setInput(in, (String) null);
  56 + parser.nextTag();
  57 + List<ConfigParser.TaskBundle> taskBundles = this.readProjects(parser);
  58 + List<ConfigParser.ProjectInfo> result = new ArrayList();
  59 + Iterator var5 = taskBundles.iterator();
  60 +
  61 + while (var5.hasNext()) {
  62 + ConfigParser.TaskBundle info = (ConfigParser.TaskBundle) var5.next();
  63 + ConfigParser.ProjectInfo projectInfo = this.createProject(info);
  64 + result.add(projectInfo);
  65 + }
  66 +
  67 + return result;
  68 + } catch (FileNotFoundException var8) {
  69 + AlphaLog.w(var8);
  70 + } catch (XmlPullParserException var9) {
  71 + AlphaLog.w(var9);
  72 + } catch (IOException var10) {
  73 + AlphaLog.w(var10);
  74 + }
  75 +
  76 + return null;
  77 + }
  78 +
  79 + private List<ConfigParser.TaskBundle> readProjects(XmlPullParser parser)
  80 + throws XmlPullParserException, IOException {
  81 + List<ConfigParser.TaskBundle> projects = new ArrayList();
  82 + parser.require(2, (String) null, "projects");
  83 +
  84 + while (parser.next() != 3) {
  85 + if (parser.getEventType() == 2) {
  86 + String name = parser.getName();
  87 + if ("project".equals(name)) {
  88 + projects.add(this.readProject(parser));
  89 + } else {
  90 + this.skip(parser);
  91 + }
  92 + }
  93 + }
  94 +
  95 + return projects;
  96 + }
  97 +
  98 + private ConfigParser.TaskBundle readProject(XmlPullParser parser) throws IOException, XmlPullParserException {
  99 + parser.require(2, (String) null, "project");
  100 + List<ConfigParser.TaskInfo> taskList = new ArrayList();
  101 + int mode = this.readMode(parser);
  102 + String processName = parser.getAttributeValue((String) null, "process");
  103 +
  104 + while (parser.next() != 3) {
  105 + if (parser.getEventType() == 2) {
  106 + String name = parser.getName();
  107 + if ("task".equals(name)) {
  108 + taskList.add(this.readTask(parser));
  109 + } else {
  110 + this.skip(parser);
  111 + }
  112 + }
  113 + }
  114 +
  115 + ConfigParser.TaskBundle project = new ConfigParser.TaskBundle(mode, processName, taskList);
  116 + return project;
  117 + }
  118 +
  119 + private ConfigParser.TaskInfo readTask(XmlPullParser parser) throws IOException, XmlPullParserException {
  120 + parser.require(2, (String) null, "task");
  121 + String name = parser.getAttributeValue((String) null, "name");
  122 + String path = parser.getAttributeValue((String) null, "class");
  123 + String predecessors = parser.getAttributeValue((String) null, "predecessor");
  124 + String threadPriorityStr = parser.getAttributeValue((String) null, "threadPriority");
  125 + String executePriorityStr = parser.getAttributeValue((String) null, "executePriority");
  126 + if (TextUtils.isEmpty(name)) {
  127 + throw new RuntimeException("Task name is not set.");
  128 + } else if (TextUtils.isEmpty(path)) {
  129 + throw new RuntimeException("The path of task : " + name + " is not set.");
  130 + } else {
  131 + ConfigParser.TaskInfo info = new ConfigParser.TaskInfo(name, path);
  132 + if (!TextUtils.isEmpty(predecessors)) {
  133 + List<String> predecessorList = this.parsePredecessorId(predecessors);
  134 + info.addPredecessors(predecessorList);
  135 + }
  136 +
  137 + if (!TextUtils.isEmpty(threadPriorityStr)) {
  138 + info.threadPriority = Integer.parseInt(threadPriorityStr);
  139 + }
  140 +
  141 + if (!TextUtils.isEmpty(executePriorityStr)) {
  142 + info.executePriority = Integer.parseInt(executePriorityStr);
  143 + }
  144 +
  145 + parser.nextTag();
  146 + parser.require(3, (String) null, "task");
  147 + return info;
  148 + }
  149 + }
  150 +
  151 + private List<String> parsePredecessorId(String predecessorIds) {
  152 + if (TextUtils.isEmpty(predecessorIds)) {
  153 + return null;
  154 + } else {
  155 + predecessorIds = predecessorIds.replace(" ", "");
  156 + String[] predecessorArray = TextUtils.split(predecessorIds, ",");
  157 + return Arrays.asList(predecessorArray);
  158 + }
  159 + }
  160 +
  161 + private int readMode(XmlPullParser parser) {
  162 + String modeStr = parser.getAttributeValue((String) null, "mode");
  163 + if ("allProcess".equals(modeStr)) {
  164 + return 3;
  165 + } else if ("mainProcess".equals(modeStr)) {
  166 + return 1;
  167 + } else {
  168 + return "secondaryProcess".equals(modeStr) ? 2 : 3;
  169 + }
  170 + }
  171 +
  172 + private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
  173 + if (parser.getEventType() != 2) {
  174 + throw new IllegalStateException();
  175 + } else {
  176 + int depth = 1;
  177 +
  178 + while (depth != 0) {
  179 + switch (parser.next()) {
  180 + case 2:
  181 + ++depth;
  182 + break;
  183 + case 3:
  184 + --depth;
  185 + }
  186 + }
  187 +
  188 + }
  189 + }
  190 +
  191 + private ConfigParser.ProjectInfo createProject(ConfigParser.TaskBundle info) {
  192 + List<ConfigParser.TaskInfo> taskInfos = info.taskList;
  193 + HashMap<String, Task> taskMap = new HashMap();
  194 + Iterator var4 = taskInfos.iterator();
  195 +
  196 + while (var4.hasNext()) {
  197 + ConfigParser.TaskInfo taskInfo = (ConfigParser.TaskInfo) var4.next();
  198 + Task task = null;
  199 +
  200 + try {
  201 + Class<?> c = Class.forName(taskInfo.path);
  202 + task = (Task) c.newInstance();
  203 + task.setName(taskInfo.id);
  204 + if (taskInfo.threadPriority != 0) {
  205 + task.setThreadPriority(taskInfo.threadPriority);
  206 + }
  207 +
  208 + if (taskInfo.executePriority != 0) {
  209 + task.setExecutePriority(taskInfo.executePriority);
  210 + }
  211 + } catch (ClassNotFoundException var12) {
  212 + AlphaLog.w(var12);
  213 + } catch (InstantiationException var13) {
  214 + AlphaLog.w(var13);
  215 + } catch (IllegalAccessException var14) {
  216 + AlphaLog.w(var14);
  217 + }
  218 +
  219 + if (task == null) {
  220 + throw new RuntimeException("Can not reflect Task: " + taskInfo.path);
  221 + }
  222 +
  223 + taskMap.put(taskInfo.id, task);
  224 + }
  225 +
  226 + Project.Builder builder = new Project.Builder();
  227 + Iterator var16 = taskInfos.iterator();
  228 +
  229 + while (true) {
  230 + List predecessorList;
  231 + do {
  232 + if (!var16.hasNext()) {
  233 + ConfigParser.ProjectInfo result =
  234 + new ConfigParser.ProjectInfo(builder.create(), info.mode, info.processName);
  235 + return result;
  236 + }
  237 +
  238 + ConfigParser.TaskInfo taskInfo = (ConfigParser.TaskInfo) var16.next();
  239 + Task task = (Task) taskMap.get(taskInfo.id);
  240 + builder.add(task);
  241 + predecessorList = taskInfo.predecessorList;
  242 + } while (predecessorList.isEmpty());
  243 +
  244 + Iterator var9 = predecessorList.iterator();
  245 +
  246 + while (var9.hasNext()) {
  247 + String predecessorName = (String) var9.next();
  248 + Task t = (Task) taskMap.get(predecessorName);
  249 + if (t == null) {
  250 + throw new RuntimeException("No such task: " + predecessorName);
  251 + }
  252 +
  253 + builder.after(t);
  254 + }
  255 + }
  256 + }
  257 +
  258 + public static class ProjectInfo {
  259 + public Task project;
  260 +
  261 + public int mode = 3;
  262 +
  263 + public String processName;
  264 +
  265 + public ProjectInfo(Task project, int mode, String processName) {
  266 + this.project = project;
  267 + this.mode = mode;
  268 + this.processName = processName;
  269 + }
  270 + }
  271 +
  272 + private static class TaskInfo {
  273 + public String id;
  274 +
  275 + public String path;
  276 +
  277 + public List<String> predecessorList = new ArrayList();
  278 +
  279 + public int threadPriority = 0;
  280 +
  281 + public int executePriority = 0;
  282 +
  283 + public TaskInfo(String id, String path) {
  284 + this.id = id;
  285 + this.path = path;
  286 + }
  287 +
  288 + public void addPredecessors(List<String> predecessors) {
  289 + this.predecessorList.addAll(predecessors);
  290 + }
  291 +
  292 + public boolean isFirst() {
  293 + return this.predecessorList.isEmpty();
  294 + }
  295 +
  296 + public String toString() {
  297 + StringBuilder builder = new StringBuilder();
  298 + builder.append("TaskInfo ").append("id: ").append(this.id);
  299 + return builder.toString();
  300 + }
  301 + }
  302 +
  303 + private static class TaskBundle {
  304 + public List<ConfigParser.TaskInfo> taskList = new ArrayList();
  305 +
  306 + public int mode = 3;
  307 +
  308 + public String processName = "";
  309 +
  310 + public TaskBundle(int mode, String processName, List<ConfigParser.TaskInfo> tasks) {
  311 + this.mode = mode;
  312 + this.processName = processName;
  313 + this.taskList = tasks;
  314 + }
  315 + }
  316 +}
  1 +
  2 +package com.wd.base.starttask;
  3 +
  4 +import java.util.HashMap;
  5 +import java.util.Map;
  6 +
  7 +import android.os.Handler;
  8 +import android.os.Looper;
  9 +import android.widget.Toast;
  10 +
  11 +class ExecuteMonitor {
  12 + private Map<String, Long> mExecuteTimeMap = new HashMap();
  13 +
  14 + private long mStartTime;
  15 +
  16 + private long mProjectCostTime;
  17 +
  18 + private Handler mHandler;
  19 +
  20 + ExecuteMonitor() {
  21 + }
  22 +
  23 + public synchronized void record(String taskName, long executeTime) {
  24 + AlphaLog.d("==ALPHA==", "AlphaTask-->Startup task %s cost time: %s ms, in thread: %s",
  25 + new Object[] {taskName, executeTime, Thread.currentThread().getName()});
  26 + if (executeTime >= (long) AlphaConfig.getWarmingTime()) {
  27 + this.toastToWarn("AlphaTask %s run too long, cost time: %s", taskName, executeTime);
  28 + }
  29 +
  30 + this.mExecuteTimeMap.put(taskName, executeTime);
  31 + }
  32 +
  33 + public synchronized Map<String, Long> getExecuteTimeMap() {
  34 + return this.mExecuteTimeMap;
  35 + }
  36 +
  37 + public void recordProjectStart() {
  38 + this.mStartTime = System.currentTimeMillis();
  39 + }
  40 +
  41 + public void recordProjectFinish() {
  42 + this.mProjectCostTime = System.currentTimeMillis() - this.mStartTime;
  43 + AlphaLog.d("==ALPHA==", "tm start up cost time: %s ms", new Object[] {this.mProjectCostTime});
  44 + }
  45 +
  46 + public long getProjectCostTime() {
  47 + return this.mProjectCostTime;
  48 + }
  49 +
  50 + private void toastToWarn(final String msg, final Object... args) {
  51 + if (AlphaConfig.shouldShowToastToAlarm()) {
  52 + this.getHandler().post(new Runnable() {
  53 + public void run() {
  54 + String formattedMsg;
  55 + if (args == null) {
  56 + formattedMsg = msg;
  57 + } else {
  58 + formattedMsg = String.format(msg, args);
  59 + }
  60 +
  61 + Toast.makeText(AlphaConfig.getContext(), formattedMsg, Toast.LENGTH_SHORT).show();
  62 + }
  63 + });
  64 + }
  65 +
  66 + }
  67 +
  68 + private Handler getHandler() {
  69 + if (this.mHandler == null) {
  70 + this.mHandler = new Handler(Looper.getMainLooper());
  71 + }
  72 +
  73 + return this.mHandler;
  74 + }
  75 +}
  1 +
  2 +package com.wd.base.starttask;
  3 +
  4 +public interface ITaskCreator {
  5 + Task createTask(String var1);
  6 +}
  1 +
  2 +package com.wd.base.starttask;
  3 +
  4 +import java.util.ArrayList;
  5 +import java.util.HashMap;
  6 +import java.util.Iterator;
  7 +import java.util.List;
  8 +import java.util.Map;
  9 +
  10 +public class ListMultiMap<K, V> {
  11 + private HashMap<K, List<V>> mInnerMap = new HashMap();
  12 +
  13 + private int mSize = 0;
  14 +
  15 + public ListMultiMap() {
  16 + }
  17 +
  18 + public void clear() {
  19 + this.mInnerMap.clear();
  20 + this.mSize = 0;
  21 + }
  22 +
  23 + public boolean containsKey(K key) {
  24 + return this.mInnerMap.containsKey(key);
  25 + }
  26 +
  27 + public boolean containsValue(V value) {
  28 + Iterator var2 = this.mInnerMap.entrySet().iterator();
  29 +
  30 + List values;
  31 + do {
  32 + if (!var2.hasNext()) {
  33 + return false;
  34 + }
  35 +
  36 + Map.Entry<K, List<V>> entry = (Map.Entry) var2.next();
  37 + values = (List) entry.getValue();
  38 + } while (values == null || !values.contains(value));
  39 +
  40 + return true;
  41 + }
  42 +
  43 + public boolean contains(K key, V value) {
  44 + if (!this.containsKey(key)) {
  45 + return false;
  46 + } else {
  47 + List<V> list = this.get(key);
  48 + return list != null && !list.isEmpty() ? list.contains(value) : false;
  49 + }
  50 + }
  51 +
  52 + public List<V> get(K key) {
  53 + return (List) this.mInnerMap.get(key);
  54 + }
  55 +
  56 + public boolean isEmpty() {
  57 + return this.mSize <= 0;
  58 + }
  59 +
  60 + public void put(K key, V value) {
  61 + if (this.mInnerMap.containsKey(key)) {
  62 + List<V> list = (List) this.mInnerMap.get(key);
  63 + list.add(value);
  64 + } else {
  65 + List<V> list = new ArrayList();
  66 + list.add(value);
  67 + this.mInnerMap.put(key, list);
  68 + }
  69 +
  70 + ++this.mSize;
  71 + }
  72 +
  73 + public List<V> remove(K key) {
  74 + List<V> list = (List) this.mInnerMap.remove(key);
  75 + if (list != null && !list.isEmpty()) {
  76 + this.mSize -= list.size();
  77 + }
  78 +
  79 + return list;
  80 + }
  81 +
  82 + public V remove(K key, V value) {
  83 + List<V> list = (List) this.mInnerMap.get(key);
  84 + V ret = null;
  85 + if (list != null && !list.isEmpty()) {
  86 + boolean isRemoved = list.remove(value);
  87 + if (isRemoved) {
  88 + --this.mSize;
  89 + ret = value;
  90 + }
  91 + }
  92 +
  93 + return ret;
  94 + }
  95 +
  96 + public V removeValue(V value) {
  97 + boolean contains = false;
  98 + Iterator var3 = this.mInnerMap.entrySet().iterator();
  99 +
  100 + while (var3.hasNext()) {
  101 + Map.Entry<K, List<V>> entry = (Map.Entry) var3.next();
  102 + List<V> values = (List) entry.getValue();
  103 + if (values != null && values.contains(value)) {
  104 + values.remove(value);
  105 + contains = true;
  106 + --this.mSize;
  107 + }
  108 + }
  109 +
  110 + return contains ? value : null;
  111 + }
  112 +
  113 + public int size() {
  114 + return this.mSize;
  115 + }
  116 +
  117 + public String toString() {
  118 + return this.mInnerMap.toString();
  119 + }
  120 +}
  1 +
  2 +package com.wd.base.starttask;
  3 +
  4 +import java.util.Map;
  5 +
  6 +public interface OnGetMonitorRecordCallback {
  7 + void onGetTaskExecuteRecord(Map<String, Long> var1);
  8 +
  9 + void onGetProjectExecuteTime(long var1);
  10 +}
  1 +package com.wd.base.starttask;
  2 +
  3 +public interface OnProjectExecuteListener {
  4 + void onProjectStart();
  5 +
  6 + void onTaskFinish(String var1);
  7 +
  8 + void onProjectFinish();
  9 +}
  1 +package com.wd.base.starttask;
  2 +
  3 +import java.util.ArrayList;
  4 +import java.util.Iterator;
  5 +import java.util.List;
  6 +
  7 +public class Project extends Task implements OnProjectExecuteListener {
  8 + private Task mStartTask;
  9 + private Project.AnchorTask mFinishTask;
  10 + private List<OnProjectExecuteListener> mExecuteListeners = new ArrayList();
  11 + private static final String DEFAULT_NAME = "AlphaProject";
  12 + private ExecuteMonitor mProjectExecuteMonitor;
  13 + private OnGetMonitorRecordCallback mOnGetMonitorRecordCallback;
  14 +
  15 + public Project() {
  16 + super("AlphaProject");
  17 + }
  18 +
  19 + public Project(String name) {
  20 + super(name);
  21 + }
  22 +
  23 + public void run() {
  24 + }
  25 +
  26 + public void start() {
  27 + this.mStartTask.start();
  28 + }
  29 +
  30 + synchronized void addSuccessor(Task task) {
  31 + this.mFinishTask.addSuccessor(task);
  32 + }
  33 +
  34 + public int getCurrentState() {
  35 + if (this.mStartTask.getCurrentState() == 0) {
  36 + return 0;
  37 + } else {
  38 + return this.mFinishTask.getCurrentState() == 2 ? 2 : 1;
  39 + }
  40 + }
  41 +
  42 + public boolean isRunning() {
  43 + return this.getCurrentState() == 1;
  44 + }
  45 +
  46 + public boolean isFinished() {
  47 + return this.getCurrentState() == 2;
  48 + }
  49 +
  50 + public void addOnTaskFinishListener(final Task.OnTaskFinishListener listener) {
  51 + this.mFinishTask.addOnTaskFinishListener(new Task.OnTaskFinishListener() {
  52 + public void onTaskFinish(String taskName) {
  53 + listener.onTaskFinish(Project.this.mName);
  54 + }
  55 + });
  56 + }
  57 +
  58 + public void onProjectStart() {
  59 + this.mProjectExecuteMonitor.recordProjectStart();
  60 + if (this.mExecuteListeners != null && !this.mExecuteListeners.isEmpty()) {
  61 + Iterator var1 = this.mExecuteListeners.iterator();
  62 +
  63 + while(var1.hasNext()) {
  64 + OnProjectExecuteListener listener = (OnProjectExecuteListener)var1.next();
  65 + listener.onProjectStart();
  66 + }
  67 + }
  68 +
  69 + }
  70 +
  71 + public void onTaskFinish(String taskName) {
  72 + if (this.mExecuteListeners != null && !this.mExecuteListeners.isEmpty()) {
  73 + Iterator var2 = this.mExecuteListeners.iterator();
  74 +
  75 + while(var2.hasNext()) {
  76 + OnProjectExecuteListener listener = (OnProjectExecuteListener)var2.next();
  77 + listener.onTaskFinish(taskName);
  78 + }
  79 + }
  80 +
  81 + }
  82 +
  83 + public void onProjectFinish() {
  84 + this.mProjectExecuteMonitor.recordProjectFinish();
  85 + this.recordTime(this.mProjectExecuteMonitor.getProjectCostTime());
  86 + if (this.mExecuteListeners != null && !this.mExecuteListeners.isEmpty()) {
  87 + Iterator var1 = this.mExecuteListeners.iterator();
  88 +
  89 + while(var1.hasNext()) {
  90 + OnProjectExecuteListener listener = (OnProjectExecuteListener)var1.next();
  91 + listener.onProjectFinish();
  92 + }
  93 + }
  94 +
  95 + if (this.mOnGetMonitorRecordCallback != null) {
  96 + this.mOnGetMonitorRecordCallback.onGetProjectExecuteTime(this.mProjectExecuteMonitor.getProjectCostTime());
  97 + this.mOnGetMonitorRecordCallback.onGetTaskExecuteRecord(this.mProjectExecuteMonitor.getExecuteTimeMap());
  98 + }
  99 +
  100 + }
  101 +
  102 + public void addOnProjectExecuteListener(OnProjectExecuteListener listener) {
  103 + this.mExecuteListeners.add(listener);
  104 + }
  105 +
  106 + public void setOnGetMonitorRecordCallback(OnGetMonitorRecordCallback callback) {
  107 + this.mOnGetMonitorRecordCallback = callback;
  108 + }
  109 +
  110 + void setStartTask(Task startTask) {
  111 + this.mStartTask = startTask;
  112 + }
  113 +
  114 + void setFinishTask(Project.AnchorTask finishTask) {
  115 + this.mFinishTask = finishTask;
  116 + }
  117 +
  118 + void setProjectExecuteMonitor(ExecuteMonitor monitor) {
  119 + this.mProjectExecuteMonitor = monitor;
  120 + }
  121 +
  122 + void recycle() {
  123 + super.recycle();
  124 + this.mExecuteListeners.clear();
  125 + }
  126 +
  127 + private static class AnchorTask extends Task {
  128 + private boolean mIsStartTask = true;
  129 + private OnProjectExecuteListener mExecuteListener;
  130 +
  131 + public AnchorTask(boolean isStartTask, String name) {
  132 + super(name);
  133 + this.mIsStartTask = isStartTask;
  134 + }
  135 +
  136 + public void setProjectLifecycleCallbacks(OnProjectExecuteListener callbacks) {
  137 + this.mExecuteListener = callbacks;
  138 + }
  139 +
  140 + public void run() {
  141 + if (this.mExecuteListener != null) {
  142 + if (this.mIsStartTask) {
  143 + this.mExecuteListener.onProjectStart();
  144 + } else {
  145 + this.mExecuteListener.onProjectFinish();
  146 + }
  147 + }
  148 +
  149 + }
  150 + }
  151 +
  152 + private static class InnerOnTaskFinishListener implements Task.OnTaskFinishListener {
  153 + private Project mProject;
  154 +
  155 + InnerOnTaskFinishListener(Project project) {
  156 + this.mProject = project;
  157 + }
  158 +
  159 + public void onTaskFinish(String taskName) {
  160 + this.mProject.onTaskFinish(taskName);
  161 + }
  162 + }
  163 +
  164 + public static class Builder {
  165 + private Task mCacheTask;
  166 + private boolean mIsSetPosition;
  167 + private Project.AnchorTask mFinishTask;
  168 + private Project.AnchorTask mStartTask;
  169 + private Project mProject;
  170 + private ExecuteMonitor mMonitor;
  171 + private TaskFactory mTaskFactory;
  172 +
  173 + public Builder() {
  174 + this.init();
  175 + }
  176 +
  177 + public Project create() {
  178 + this.addToRootIfNeed();
  179 + Project project = this.mProject;
  180 + this.init();
  181 + return project;
  182 + }
  183 +
  184 + public Project.Builder withTaskCreator(ITaskCreator creator) {
  185 + this.mTaskFactory = new TaskFactory(creator);
  186 + return this;
  187 + }
  188 +
  189 + public Project.Builder setOnProjectExecuteListener(OnProjectExecuteListener listener) {
  190 + this.mProject.addOnProjectExecuteListener(listener);
  191 + return this;
  192 + }
  193 +
  194 + public Project.Builder setOnGetMonitorRecordCallback(OnGetMonitorRecordCallback callback) {
  195 + this.mProject.setOnGetMonitorRecordCallback(callback);
  196 + return this;
  197 + }
  198 +
  199 + public Project.Builder setProjectName(String name) {
  200 + this.mProject.setName(name);
  201 + return this;
  202 + }
  203 +
  204 + public Project.Builder add(String taskName) {
  205 + if (this.mTaskFactory == null) {
  206 + throw new IllegalAccessError("You should set a ITaskCreator with withTaskCreator(), and then you can call add() and after() with task name.");
  207 + } else {
  208 + Task task = this.mTaskFactory.getTask(taskName);
  209 + this.add(task);
  210 + return this;
  211 + }
  212 + }
  213 +
  214 + public Project.Builder after(String taskName) {
  215 + if (this.mTaskFactory == null) {
  216 + throw new IllegalAccessError("You should set a ITaskCreator with withTaskCreator(), and then you can call add() and after() with task name.");
  217 + } else {
  218 + Task task = this.mTaskFactory.getTask(taskName);
  219 + this.after(task);
  220 + return this;
  221 + }
  222 + }
  223 +
  224 + public Project.Builder after(String... taskNames) {
  225 + if (this.mTaskFactory == null) {
  226 + throw new IllegalAccessError("You should set a ITaskCreator with withTaskCreator(), and then you can call add() and after() with task name.");
  227 + } else {
  228 + Task[] tasks = new Task[taskNames.length];
  229 + int i = 0;
  230 +
  231 + for(int len = taskNames.length; i < len; ++i) {
  232 + String taskName = taskNames[i];
  233 + Task task = this.mTaskFactory.getTask(taskName);
  234 + tasks[i] = task;
  235 + }
  236 +
  237 + this.after(tasks);
  238 + return this;
  239 + }
  240 + }
  241 +
  242 + public Project.Builder add(Task task) {
  243 + this.addToRootIfNeed();
  244 + this.mCacheTask = task;
  245 + this.mCacheTask.setExecuteMonitor(this.mMonitor);
  246 + this.mIsSetPosition = false;
  247 + this.mCacheTask.addOnTaskFinishListener(new Project.InnerOnTaskFinishListener(this.mProject));
  248 + this.mCacheTask.addSuccessor(this.mFinishTask);
  249 + return this;
  250 + }
  251 +
  252 + public Project.Builder after(Task task) {
  253 + task.addSuccessor(this.mCacheTask);
  254 + this.mFinishTask.removePredecessor(task);
  255 + this.mIsSetPosition = true;
  256 + return this;
  257 + }
  258 +
  259 + public Project.Builder after(Task... tasks) {
  260 + Task[] var2 = tasks;
  261 + int var3 = tasks.length;
  262 +
  263 + for(int var4 = 0; var4 < var3; ++var4) {
  264 + Task task = var2[var4];
  265 + task.addSuccessor(this.mCacheTask);
  266 + this.mFinishTask.removePredecessor(task);
  267 + }
  268 +
  269 + this.mIsSetPosition = true;
  270 + return this;
  271 + }
  272 +
  273 + private void addToRootIfNeed() {
  274 + if (!this.mIsSetPosition && this.mCacheTask != null) {
  275 + this.mStartTask.addSuccessor(this.mCacheTask);
  276 + }
  277 +
  278 + }
  279 +
  280 + private void init() {
  281 + this.mCacheTask = null;
  282 + this.mIsSetPosition = true;
  283 + this.mProject = new Project();
  284 + this.mFinishTask = new Project.AnchorTask(false, "==AlphaDefaultFinishTask==");
  285 + this.mFinishTask.setProjectLifecycleCallbacks(this.mProject);
  286 + this.mStartTask = new Project.AnchorTask(true, "==AlphaDefaultStartTask==");
  287 + this.mStartTask.setProjectLifecycleCallbacks(this.mProject);
  288 + this.mProject.setStartTask(this.mStartTask);
  289 + this.mProject.setFinishTask(this.mFinishTask);
  290 + this.mMonitor = new ExecuteMonitor();
  291 + this.mProject.setProjectExecuteMonitor(this.mMonitor);
  292 + }
  293 + }
  294 +}
  295 +
  1 +package com.wd.base.starttask;
  2 +
  3 +import android.os.Handler;
  4 +import android.os.Looper;
  5 +import android.os.Process;
  6 +
  7 +import java.util.ArrayList;
  8 +import java.util.HashSet;
  9 +import java.util.Iterator;
  10 +import java.util.List;
  11 +import java.util.Set;
  12 +import java.util.concurrent.ExecutorService;
  13 +
  14 +public abstract class Task {
  15 + public static final int STATE_IDLE = 0;
  16 + public static final int STATE_RUNNING = 1;
  17 + public static final int STATE_FINISHED = 2;
  18 + public static final int STATE_WAIT = 3;
  19 + public static final int DEFAULT_EXECUTE_PRIORITY = 0;
  20 + private int mExecutePriority;
  21 + private int mThreadPriority;
  22 + private static ExecutorService sExecutor = AlphaConfig.getExecutor();
  23 + private static Handler sHandler = new Handler(Looper.getMainLooper());
  24 + private boolean mIsInUiThread;
  25 + private Runnable mInternalRunnable;
  26 + protected String mName;
  27 + private List<Task.OnTaskFinishListener> mTaskFinishListeners;
  28 + private volatile int mCurrentState;
  29 + private List<Task> mSuccessorList;
  30 + protected Set<Task> mPredecessorSet;
  31 + private ExecuteMonitor mTaskExecuteMonitor;
  32 +
  33 + public Task(String name) {
  34 + this(name, 0);
  35 + }
  36 +
  37 + public Task(String name, int threadPriority) {
  38 + this.mExecutePriority = 0;
  39 + this.mTaskFinishListeners = new ArrayList();
  40 + this.mCurrentState = 0;
  41 + this.mSuccessorList = new ArrayList();
  42 + this.mPredecessorSet = new HashSet();
  43 + this.mName = name;
  44 + this.mThreadPriority = threadPriority;
  45 + }
  46 +
  47 + public Task(String name, boolean isInUiThread) {
  48 + this.mExecutePriority = 0;
  49 + this.mTaskFinishListeners = new ArrayList();
  50 + this.mCurrentState = 0;
  51 + this.mSuccessorList = new ArrayList();
  52 + this.mPredecessorSet = new HashSet();
  53 + this.mName = name;
  54 + this.mIsInUiThread = isInUiThread;
  55 + }
  56 +
  57 + public synchronized void start() {
  58 + if (this.mCurrentState != 0) {
  59 + throw new RuntimeException("You try to run task " + this.mName + " twice, is there a circular dependency?");
  60 + } else {
  61 + this.switchState(3);
  62 + if (this.mInternalRunnable == null) {
  63 + this.mInternalRunnable = new Runnable() {
  64 + public void run() {
  65 + Process.setThreadPriority(Task.this.mThreadPriority);
  66 + long startTime = System.currentTimeMillis();
  67 + Task.this.switchState(1);
  68 + Task.this.run();
  69 + Task.this.switchState(2);
  70 + long finishTime = System.currentTimeMillis();
  71 + Task.this.recordTime(finishTime - startTime);
  72 + Task.this.notifyFinished();
  73 + Task.this.recycle();
  74 + }
  75 + };
  76 + }
  77 +
  78 + if (this.mIsInUiThread) {
  79 + sHandler.post(this.mInternalRunnable);
  80 + } else {
  81 + sExecutor.execute(this.mInternalRunnable);
  82 + }
  83 +
  84 + }
  85 + }
  86 +
  87 + public void addOnTaskFinishListener(Task.OnTaskFinishListener listener) {
  88 + if (!this.mTaskFinishListeners.contains(listener)) {
  89 + this.mTaskFinishListeners.add(listener);
  90 + }
  91 +
  92 + }
  93 +
  94 + public abstract void run();
  95 +
  96 + public int getCurrentState() {
  97 + return this.mCurrentState;
  98 + }
  99 +
  100 + public boolean isRunning() {
  101 + return this.mCurrentState == 1;
  102 + }
  103 +
  104 + public boolean isFinished() {
  105 + return this.mCurrentState == 2;
  106 + }
  107 +
  108 + public void setExecutePriority(int executePriority) {
  109 + this.mExecutePriority = executePriority;
  110 + }
  111 +
  112 + public int getExecutePriority() {
  113 + return this.mExecutePriority;
  114 + }
  115 +
  116 + void addPredecessor(Task task) {
  117 + this.mPredecessorSet.add(task);
  118 + }
  119 +
  120 + void removePredecessor(Task task) {
  121 + this.mPredecessorSet.remove(task);
  122 + }
  123 +
  124 + void addSuccessor(Task task) {
  125 + if (task == this) {
  126 + throw new RuntimeException("A task should not after itself.");
  127 + } else {
  128 + task.addPredecessor(this);
  129 + this.mSuccessorList.add(task);
  130 + }
  131 + }
  132 +
  133 + void notifyFinished() {
  134 + Iterator var1;
  135 + if (!this.mSuccessorList.isEmpty()) {
  136 + AlphaUtils.sort(this.mSuccessorList);
  137 + var1 = this.mSuccessorList.iterator();
  138 +
  139 + while(var1.hasNext()) {
  140 + Task task = (Task)var1.next();
  141 + task.onPredecessorFinished(this);
  142 + }
  143 + }
  144 +
  145 + if (!this.mTaskFinishListeners.isEmpty()) {
  146 + var1 = this.mTaskFinishListeners.iterator();
  147 +
  148 + while(var1.hasNext()) {
  149 + Task.OnTaskFinishListener listener = (Task.OnTaskFinishListener)var1.next();
  150 + listener.onTaskFinish(this.mName);
  151 + }
  152 +
  153 + this.mTaskFinishListeners.clear();
  154 + }
  155 +
  156 + }
  157 +
  158 + synchronized void onPredecessorFinished(Task beforeTask) {
  159 + if (!this.mPredecessorSet.isEmpty()) {
  160 + this.mPredecessorSet.remove(beforeTask);
  161 + if (this.mPredecessorSet.isEmpty()) {
  162 + this.start();
  163 + }
  164 +
  165 + }
  166 + }
  167 +
  168 + void setName(String name) {
  169 + this.mName = name;
  170 + }
  171 +
  172 + void setThreadPriority(int threadPriority) {
  173 + this.mThreadPriority = threadPriority;
  174 + }
  175 +
  176 + void setExecuteMonitor(ExecuteMonitor monitor) {
  177 + this.mTaskExecuteMonitor = monitor;
  178 + }
  179 +
  180 + void recycle() {
  181 + this.mSuccessorList.clear();
  182 + this.mTaskFinishListeners.clear();
  183 + }
  184 +
  185 + protected void recordTime(long costTime) {
  186 + if (this.mTaskExecuteMonitor != null) {
  187 + this.mTaskExecuteMonitor.record(this.mName, costTime);
  188 + }
  189 +
  190 + }
  191 +
  192 + private void switchState(int state) {
  193 + this.mCurrentState = state;
  194 + }
  195 +
  196 + public interface OnTaskFinishListener {
  197 + void onTaskFinish(String var1);
  198 + }
  199 +}
  200 +
  1 +
  2 +package com.wd.base.starttask;
  3 +
  4 +import java.util.HashMap;
  5 +import java.util.Map;
  6 +
  7 +public final class TaskFactory {
  8 + private Map<String, Task> mTasks = new HashMap();
  9 +
  10 + private ITaskCreator mTaskCreator;
  11 +
  12 + public TaskFactory(ITaskCreator creator) {
  13 + this.mTaskCreator = creator;
  14 + }
  15 +
  16 + public synchronized Task getTask(String taskName) {
  17 + Task task = (Task) this.mTasks.get(taskName);
  18 + if (task != null) {
  19 + return task;
  20 + } else {
  21 + task = this.mTaskCreator.createTask(taskName);
  22 + if (task == null) {
  23 + throw new IllegalArgumentException(
  24 + "Create task fail, there is no task corresponding to the task name. Make sure you have create a task instance in TaskCreator.");
  25 + } else {
  26 + this.mTasks.put(taskName, task);
  27 + return task;
  28 + }
  29 + }
  30 + }
  31 +}
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 +
  4 +</resources>