Commit 4f62092f5b2e04342ae494db71d8181b37320053

Authored by 韩亚云
2 parents aba0dff9 70af6e72

Merge branch 'master' of bj.gitlab.cnlive.com:cnlive-team/newModuleStrike

Showing 40 changed files with 1276 additions and 2711 deletions

Too many changes to show.

To preserve performance only 40 of 195 files are displayed.

.idea/gradle.xml
... ... @@ -24,7 +24,6 @@
24 24 <option value="$PROJECT_DIR$/core/app_qr" />
25 25 <option value="$PROJECT_DIR$/core/base" />
26 26 <option value="$PROJECT_DIR$/core/database" />
27   - <option value="$PROJECT_DIR$/core/dentity_verfication" />
28 27 <option value="$PROJECT_DIR$/core/imageload" />
29 28 <option value="$PROJECT_DIR$/core/network" />
30 29 <option value="$PROJECT_DIR$/library_baidumap" />
... ...
app/strike/build.gradle
... ... @@ -187,7 +187,6 @@ dependencies {
187 187 // implementation project(path: ':core:encipher')
188 188 // implementation project(path: ':cloud:user')
189 189 implementation project(path: ':cloud:wjj_lib')
190   - implementation project(path: ':core:dentity_verfication')
191 190 implementation "androidx.viewpager2:viewpager2:1.0.0"
192 191  
193 192  
... ...
app/strike/src/main/AndroidManifest.xml
... ... @@ -17,7 +17,6 @@
17 17 android:roundIcon="@mipmap/ic_launcher_round"
18 18 android:supportsRtl="true"
19 19 android:theme="@style/AppTheme">
20   - <activity android:name="com.cnlive.strike.imgutil.UgcActivity"></activity>
21 20 <activity android:name="com.cnlive.strike.imgutil.SimplePrevActivity" />
22 21 <activity android:name="com.cnlive.strike.demo.activity.HappyChinaActivity" />
23 22  
... ...
app/strike/src/main/java/com/cnlive/strike/MainActivity.java
... ... @@ -10,7 +10,6 @@ import android.view.View;
10 10 import com.cnlive.cloud.R;
11 11 import com.cnlive.strike.demo.activity.DemoMvpActivity;
12 12 import com.cnlive.strike.imgutil.ImgActivity;
13   -import com.cnlive.strike.imgutil.UgcActivity;
14 13  
15 14 import androidx.annotation.NonNull;
16 15 import androidx.annotation.Nullable;
... ... @@ -31,7 +30,6 @@ public class MainActivity extends AppCompatActivity {
31 30 }
32 31 });
33 32 findViewById(R.id.to_img).setOnClickListener(view -> startActivity(new Intent(this, ImgActivity.class)));
34   - findViewById(R.id.ugc_btn).setOnClickListener(view -> startActivity(new Intent(this, UgcActivity.class)));
35 33 }
36 34  
37 35 @Nullable
... ...
app/strike/src/main/java/com/cnlive/strike/imgutil/UgcActivity.java deleted 100644 → 0
1   -package com.cnlive.strike.imgutil;
2   -
3   -import android.content.Intent;
4   -import android.os.Bundle;
5   -
6   -import com.cnlive.cloud.R;
7   -import com.cnlive.core.company_verfication.ui.activity.FillInCompanyDataActivity;
8   -import com.cnlive.core.company_verfication.ui.activity.SelectCompanyDataActivity;
9   -import com.cnlive.core.people_verfication.activity.CheckResultActivity;
10   -import com.cnlive.core.people_verfication.activity.PersonCheckActivity;
11   -import com.cnlive.core.people_verfication.activity.TakeIdentityPictureActivity;
12   -
13   -import androidx.appcompat.app.AppCompatActivity;
14   -
15   -public class UgcActivity extends AppCompatActivity {
16   -
17   - @Override
18   - protected void onCreate(Bundle savedInstanceState) {
19   - super.onCreate(savedInstanceState);
20   - setContentView(R.layout.activity_ugc);
21   -
22   - findViewById(R.id.people_denty).setOnClickListener(view -> startActivity(new Intent(this, TakeIdentityPictureActivity.class)));
23   - findViewById(R.id.company_denty).setOnClickListener(view -> startActivity(new Intent(this, FillInCompanyDataActivity.class)));
24   - findViewById(R.id.company_denty_list).setOnClickListener(view -> startActivity(new Intent(this, SelectCompanyDataActivity.class)));
25   -
26   - findViewById(R.id.btn1).setOnClickListener(view ->PersonCheckActivity.startActivity(this,"","-1"));
27   - findViewById(R.id.btn2).setOnClickListener(view ->PersonCheckActivity.startActivity(this,"","0"));
28   - findViewById(R.id.btn3).setOnClickListener(view ->PersonCheckActivity.startActivity(this,"","2"));
29   - findViewById(R.id.btn4).setOnClickListener(view ->PersonCheckActivity.startActivity(this,"","1"));
30   -
31   - findViewById(R.id.btn01).setOnClickListener(view -> CheckResultActivity.startActivity(this,"","person","-1"));
32   - findViewById(R.id.btn02).setOnClickListener(view ->CheckResultActivity.startActivity(this,"","person","0"));
33   - findViewById(R.id.btn03).setOnClickListener(view ->CheckResultActivity.startActivity(this,"","person","2"));
34   - findViewById(R.id.btn04).setOnClickListener(view ->CheckResultActivity.startActivity(this,"","person","1"));
35   -
36   - findViewById(R.id.btn11).setOnClickListener(view -> CheckResultActivity.startActivity(this,"","company","-1"));
37   - findViewById(R.id.btn12).setOnClickListener(view ->CheckResultActivity.startActivity(this,"","company","0"));
38   - findViewById(R.id.btn13).setOnClickListener(view ->CheckResultActivity.startActivity(this,"","company","2"));
39   - findViewById(R.id.btn14).setOnClickListener(view ->CheckResultActivity.startActivity(this,"","company","1"));
40   - }
41   -}
app/strike/src/main/res/layout/activity_main.xml
... ... @@ -21,11 +21,5 @@
21 21 android:layout_height="wrap_content"
22 22 android:text="图片加载测试"/>
23 23  
24   - <Button
25   - android:id="@+id/ugc_btn"
26   - android:layout_width="wrap_content"
27   - android:layout_height="wrap_content"
28   - android:text="ugc直播认证"
29   - />
30 24 </LinearLayout>
31 25 </layout>
32 26 \ No newline at end of file
... ...
app/strike/src/main/res/layout/activity_ugc.xml deleted 100644 → 0
1   -<?xml version="1.0" encoding="utf-8"?>
2   -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3   - xmlns:app="http://schemas.android.com/apk/res-auto"
4   - xmlns:tools="http://schemas.android.com/tools"
5   - android:layout_width="match_parent"
6   - android:layout_height="match_parent"
7   - android:orientation="vertical"
8   - tools:context="com.cnlive.strike.imgutil.UgcActivity">
9   -
10   - <Button
11   - android:id="@+id/people_denty"
12   - android:layout_width="match_parent"
13   - android:layout_height="wrap_content"
14   - android:layout_margin="@dimen/dp_10"
15   - android:text="个人认证" />
16   -
17   - <TextView
18   - android:layout_width="wrap_content"
19   - android:layout_height="wrap_content"
20   - android:text="身份校验" />
21   -
22   - <LinearLayout
23   - android:layout_width="match_parent"
24   - android:layout_height="wrap_content"
25   - android:orientation="horizontal">
26   -
27   - <Button
28   - android:id="@+id/btn1"
29   - android:layout_width="wrap_content"
30   - android:layout_height="wrap_content"
31   - android:text="未校验" />
32   -
33   - <Button
34   - android:id="@+id/btn2"
35   - android:layout_width="wrap_content"
36   - android:layout_height="wrap_content"
37   - android:text="审核中" />
38   -
39   - <Button
40   - android:id="@+id/btn3"
41   - android:layout_width="wrap_content"
42   - android:layout_height="wrap_content"
43   - android:text="失败" />
44   -
45   - <Button
46   - android:id="@+id/btn4"
47   - android:layout_width="wrap_content"
48   - android:layout_height="wrap_content"
49   - android:text="成功" />
50   - </LinearLayout>
51   -
52   - <TextView
53   - android:layout_width="wrap_content"
54   - android:layout_height="wrap_content"
55   - android:text="个人认证" />
56   -
57   - <LinearLayout
58   - android:layout_width="match_parent"
59   - android:layout_height="wrap_content"
60   - android:orientation="horizontal">
61   -
62   - <Button
63   - android:id="@+id/btn01"
64   - android:layout_width="wrap_content"
65   - android:layout_height="wrap_content"
66   - android:text="未认证" />
67   -
68   - <Button
69   - android:id="@+id/btn02"
70   - android:layout_width="wrap_content"
71   - android:layout_height="wrap_content"
72   - android:text="审核中" />
73   -
74   - <Button
75   - android:id="@+id/btn03"
76   - android:layout_width="wrap_content"
77   - android:layout_height="wrap_content"
78   - android:text="失败" />
79   -
80   - <Button
81   - android:id="@+id/btn04"
82   - android:layout_width="wrap_content"
83   - android:layout_height="wrap_content"
84   - android:text="成功" />
85   - </LinearLayout>
86   -
87   -
88   -
89   - <Button
90   - android:id="@+id/company_denty"
91   - android:layout_width="match_parent"
92   - android:layout_height="wrap_content"
93   - android:layout_margin="@dimen/dp_10"
94   - android:text="机构认证" />
95   -
96   - <TextView
97   - android:layout_width="wrap_content"
98   - android:layout_height="wrap_content"
99   - android:text="机构认证" />
100   -
101   - <LinearLayout
102   - android:layout_width="match_parent"
103   - android:layout_height="wrap_content"
104   - android:orientation="horizontal">
105   -
106   - <Button
107   - android:id="@+id/btn11"
108   - android:layout_width="wrap_content"
109   - android:layout_height="wrap_content"
110   - android:text="未认证" />
111   -
112   - <Button
113   - android:id="@+id/btn12"
114   - android:layout_width="wrap_content"
115   - android:layout_height="wrap_content"
116   - android:text="审核中" />
117   -
118   - <Button
119   - android:id="@+id/btn13"
120   - android:layout_width="wrap_content"
121   - android:layout_height="wrap_content"
122   - android:text="失败" />
123   -
124   - <Button
125   - android:id="@+id/btn14"
126   - android:layout_width="wrap_content"
127   - android:layout_height="wrap_content"
128   - android:text="成功" />
129   - </LinearLayout>
130   -
131   - <Button
132   - android:id="@+id/company_denty_list"
133   - android:layout_width="match_parent"
134   - android:layout_height="wrap_content"
135   - android:layout_margin="@dimen/dp_10"
136   - android:text="机构认证列表" />
137   -</LinearLayout>
core/base/src/main/java/com/cnlive/core/libs/base/frame/activity/BaseActivity.java
1 1 package com.cnlive.core.libs.base.frame.activity;
2 2  
3 3  
  4 +import android.annotation.SuppressLint;
4 5 import android.app.Activity;
5 6 import android.content.Context;
6   -import android.content.DialogInterface;
7 7 import android.content.Intent;
8 8 import android.content.pm.ActivityInfo;
9 9 import android.content.pm.PackageManager;
10 10 import android.content.res.Configuration;
11 11 import android.content.res.Resources;
12 12 import android.graphics.Bitmap;
13   -import android.graphics.Color;
  13 +import android.graphics.drawable.Drawable;
14 14 import android.net.Uri;
15 15 import android.os.Build;
16 16 import android.os.Bundle;
... ... @@ -20,42 +20,48 @@ import android.provider.Settings;
20 20 import android.text.TextUtils;
21 21 import android.util.DisplayMetrics;
22 22 import android.util.Log;
  23 +import android.view.Gravity;
23 24 import android.view.MotionEvent;
24 25 import android.view.View;
25 26 import android.view.ViewGroup;
26   -import android.view.Window;
27 27 import android.view.WindowManager;
28 28 import android.view.inputmethod.InputMethodManager;
29 29  
30   -import androidx.annotation.ColorInt;
31 30 import androidx.annotation.ColorRes;
32 31 import androidx.annotation.DrawableRes;
33 32 import androidx.annotation.IntRange;
34 33 import androidx.annotation.NonNull;
35 34 import androidx.annotation.Nullable;
36 35 import androidx.annotation.StringRes;
37   -import androidx.appcompat.app.AlertDialog;
38 36 import androidx.core.app.ActivityCompat;
39 37 import androidx.core.content.ContextCompat;
40 38 import androidx.databinding.DataBindingUtil;
41 39 import androidx.databinding.ViewDataBinding;
42 40 import androidx.fragment.app.Fragment;
43 41  
  42 +import com.alibaba.android.arouter.facade.Postcard;
  43 +import com.alibaba.android.arouter.facade.template.IProvider;
44 44 import com.alibaba.android.arouter.launcher.ARouter;
45   -import com.cnlive.core.libs.base.application.AppConfig;
  45 +import com.cnlive.cloud.base.BuildConfig;
  46 +import com.cnlive.cloud.base.R;
46 47 import com.cnlive.core.libs.base.frame.fragment.BaseFragment;
47 48 import com.cnlive.core.libs.base.frame.presenter.BasePresenter;
48 49 import com.cnlive.core.libs.base.frame.view.BaseView;
49 50 import com.cnlive.core.libs.base.interfaces.OnPermissionResponseListener;
50   -import com.cnlive.core.libs.base.network.manager.SubscriptionManager;
  51 +import com.cnlive.core.libs.base.listener.Callback;
  52 +import com.cnlive.core.libs.base.network.manager.RxManager;
  53 +import com.cnlive.core.libs.base.ui.widget.SelectDialog;
  54 +import com.cnlive.core.libs.base.util.AlertUtil;
51 55 import com.cnlive.core.libs.base.util.AppManager;
  56 +import com.cnlive.core.libs.base.util.BaseHelpUtil;
  57 +import com.cnlive.core.libs.base.util.GlobalLifeCircleListener;
  58 +import com.cnlive.core.libs.base.util.LifeCircleListener;
52 59 import com.cnlive.core.libs.base.util.ReflectUtil;
  60 +import com.cnlive.core.libs.base.util.SharedPreferencesHelper;
53 61 import com.cnlive.core.libs.base.util.StatusBarConfig;
54 62 import com.cnlive.core.libs.base.util.StatusBarUtil;
55   -import com.cnlive.cloud.base.R;
56 63 import com.hannesdorfmann.mosby3.mvp.MvpActivity;
57 64 import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
58   -import com.hannesdorfmann.mosby3.mvp.delegate.ActivityMvpDelegate;
59 65 import com.me.yokeyword.fragmentation.ExtraTransaction;
60 66 import com.me.yokeyword.fragmentation.Fragmentation;
61 67 import com.me.yokeyword.fragmentation.ISupportActivity;
... ... @@ -75,6 +81,9 @@ import java.util.List;
75 81 import java.util.Observable;
76 82 import java.util.Observer;
77 83  
  84 +import io.reactivex.disposables.CompositeDisposable;
  85 +import io.reactivex.disposables.Disposable;
  86 +
78 87  
79 88 /**
80 89 * @author ys
... ... @@ -86,8 +95,6 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
86 95 private ViewDataBinding baseBinding;
87 96 //获取TAG的activity名称
88 97 public final String TAG = this.getClass().getSimpleName();
89   - //是否显示标题栏
90   - private boolean isShowTitle = true;
91 98 //是否显示状态栏
92 99 private boolean isShowStatusBar = true;
93 100 public Context context;
... ... @@ -110,9 +117,17 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
110 117 private boolean isUserClickAllowBtn = false;//用户是否点击允许按钮
111 118 private boolean isShowRefuseDialog = true;//是否显示拒绝提示框
112 119 private String[] userSetPermission;
  120 + private SelectDialog permissionTipDialog;
113 121 private Handler myActHandler;
114 122 private List<Observable> observableList;
115 123 private boolean isCreateDefultEmptyView = true;//如果没有填充布局,是否设置默认布局,默认是设置的
  124 + private LifeCircleListener lifeCircleListener; //快速管理生命周期
  125 + private static GlobalLifeCircleListener globalLifeCircleListener; //全局生命周期
  126 +
  127 + public boolean isActive = false; //当前Activity是否处于前台
  128 + public boolean isAlive = false; //当前Activity是否处于存活状态
  129 + private CompositeDisposable destoryDisposable;//生命周期在destory销毁
  130 + private CompositeDisposable pauseDisposable;//生命周期在onPause销毁
116 131  
117 132 public final ViewDataBinding getBaseBinding() {
118 133 return baseBinding;
... ... @@ -122,55 +137,213 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
122 137 @Override
123 138 protected void onCreate(@Nullable Bundle savedInstanceState) {
124 139 super.onCreate(savedInstanceState);
125   - if (0 != getBindLayoutId()) {
126   - baseBinding = DataBindingUtil.setContentView(this, getBindLayoutId());
127   - } else if (0 != getViewLayoutId()) {
128   - setContentView(getViewLayoutId());
129   - }
130 140 context = this;
131 141 me = this;
  142 + isAlive = true;
132 143 this.savedInstanceState = savedInstanceState;
133   -// //路由参数初始化
134   -// ARouter.getInstance().inject(this);
  144 + initRxjava();
  145 + //路由参数初始化
  146 + ARouter.getInstance().inject(this);
135 147 //activity管理
136 148 AppManager.getInstance().pushActivity(me);
137   - //创建订阅映射
138   - SubscriptionManager.getInstance().setCurrentDisposables(TAG);
139 149 //fragment管理
140 150 mDelegate.onCreate(savedInstanceState);
141 151 mSwipeDelegate.onCreate(savedInstanceState);
142 152 init(savedInstanceState);
  153 +// if (!isShowTitle) {
  154 +// requestWindowFeature(Window.FEATURE_NO_TITLE);
  155 +// }
  156 + if (!isShowStatusBar) {
  157 + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
  158 + , WindowManager.LayoutParams.FLAG_FULLSCREEN);
  159 + }
  160 + if (0 != getBindLayoutId()) {
  161 + baseBinding = DataBindingUtil.setContentView(this, getBindLayoutId());
  162 + } else if (0 != getViewLayoutId()) {
  163 + setContentView(getViewLayoutId());
  164 + }
143 165 //两种视图都没有设置,就加载默认跟视图,用于fragment切换
144   - if (isCreateDefultEmptyView) {
  166 + else if (isCreateDefultEmptyView) {
145 167 if (0 == getBindLayoutId() && 0 == getViewLayoutId()) {
146 168 setContentView(R.layout.base_activity_main);
147 169 }
148 170 }
149   - if (null == observableList) {
150   - observableList = new ArrayList<>();
151   - }
152   -
153 171 //设置binding数据
154 172 if (null != baseBinding) {
155 173 initBindingLayoutData(baseBinding);
  174 + if (isViewAttached()) {
  175 + getMvpView().initActBindingLayout(this, baseBinding);
  176 + }
156 177 }
157 178 if (null != getIntent()) {
158 179 initParams(getIntent());
159 180 }
160 181 //初始化控件
161 182 initView();
162   - if (!isShowTitle) {
163   - requestWindowFeature(Window.FEATURE_NO_TITLE);
164   - }
165   -
166   - if (!isShowStatusBar) {
167   - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
168   - , WindowManager.LayoutParams.FLAG_FULLSCREEN);
169   - }
170 183 //设置数据
171 184 initData();
  185 + if (null == observableList) {
  186 + observableList = new ArrayList<>();
  187 + }
172 188 //是否开启滑动返回
173 189 setSwipeBackEnable(isOpenSwipBack);
  190 + //生命周期监听
  191 + if (lifeCircleListener != null) {
  192 + lifeCircleListener.onCreate();
  193 + }
  194 + //全局生命周期监听
  195 + if (globalLifeCircleListener != null) {
  196 + globalLifeCircleListener.onCreate(me, me.getClass().getName());
  197 + }
  198 + }
  199 +
  200 + private void initRxjava() {
  201 + pauseDisposable = new CompositeDisposable();
  202 + destoryDisposable = new CompositeDisposable();
  203 + }
  204 +
  205 + protected void init(@Nullable Bundle savedInstanceState) {
  206 + }
  207 +
  208 + protected void initParams(Intent params) {
  209 + }
  210 +
  211 + /**
  212 + * 获取自己的databinding
  213 + *
  214 + * @param baseBinding
  215 + */
  216 + protected void initBindingLayoutData(ViewDataBinding baseBinding) {
  217 +
  218 + }
  219 +
  220 + /**
  221 + * 初始化控件
  222 + */
  223 + protected abstract void initView();
  224 +
  225 +
  226 + /**
  227 + * 设置数据
  228 + */
  229 + protected void initData() {
  230 + }
  231 +
  232 + /**
  233 + * 添加订阅
  234 + * Pause 销毁
  235 + *
  236 + * @param disposable
  237 + * @return
  238 + */
  239 + public Disposable addPauseDisPosable(Disposable disposable) {
  240 + if (null != disposable) {
  241 + if (null != pauseDisposable) {
  242 + pauseDisposable.add(disposable);
  243 + }
  244 + }
  245 + return disposable;
  246 + }
  247 +
  248 + /**
  249 + * 添加订阅
  250 + * Destory 销毁
  251 + *
  252 + * @param disposable
  253 + * @return
  254 + */
  255 + public Disposable addDestoryDisPosable(Disposable disposable) {
  256 + if (null != disposable) {
  257 + if (null != destoryDisposable) {
  258 + destoryDisposable.add(disposable);
  259 + }
  260 + }
  261 + return disposable;
  262 + }
  263 +
  264 + /**
  265 + * 实例化路由-对象
  266 + */
  267 + public <T extends IProvider> T initRouterImpl(String routerPath) {
  268 + T obj = null;
  269 + try {
  270 + obj = (T) ARouter.getInstance().build(routerPath).navigation(this);
  271 + } catch (Exception ignored) {
  272 + }
  273 + return obj;
  274 + }
  275 +
  276 + /**
  277 + * 获取资源颜色
  278 + *
  279 + * @param colorId
  280 + * @return
  281 + */
  282 + public int getResourceColor(@ColorRes int colorId) {
  283 + return BaseHelpUtil.getResourceColor(me, colorId);
  284 + }
  285 +
  286 + /**
  287 + * 获取资源字符串
  288 + *
  289 + * @param stringId
  290 + * @return
  291 + */
  292 + public String getResourceStr(@StringRes int stringId) {
  293 + return BaseHelpUtil.getResourceStr(me, stringId);
  294 + }
  295 +
  296 + /**
  297 + * 获取资源
  298 + *
  299 + * @param drawableId
  300 + * @return
  301 + */
  302 + public Drawable getResourceDrawable(@DrawableRes int drawableId) {
  303 + return BaseHelpUtil.getResourceDrawable(me, drawableId);
  304 + }
  305 +
  306 + /**
  307 + * 用户提示
  308 + */
  309 + public void showToast(String message) {
  310 + AlertUtil.showDeftToast(me, message);
  311 + }
  312 +
  313 + /**
  314 + * Arouter跳转
  315 + *
  316 + * @param routerPath
  317 + * @return
  318 + */
  319 + public Postcard goToRouter(String routerPath) {
  320 + return ARouter.getInstance().build(routerPath);
  321 + }
  322 +
  323 + /**
  324 + * Arouter跳转无参数
  325 + *
  326 + * @param routerPath
  327 + * @return
  328 + */
  329 + public void goToRouterNoParams(String routerPath) {
  330 + ARouter.getInstance().build(routerPath).navigation(this);
  331 + }
  332 +
  333 + /**
  334 + * 实例化路由-对象 (异步)
  335 + */
  336 + public <T extends IProvider> void initRouterImpl(String routerPath, Callback<T> callback) {
  337 + if (callback == null) return;
  338 +
  339 + T obj = null;
  340 + try {
  341 + obj = (T) ARouter.getInstance().build(routerPath).navigation(this);
  342 + } catch (Exception ignored) {
  343 + }
  344 +
  345 + if (obj != null) callback.call(obj);
  346 + else if (BuildConfig.DEBUG) AlertUtil.showDeftToast(this, "功能暂未开放");
174 347 }
175 348  
176 349  
... ... @@ -250,34 +423,37 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
250 423 return StatusBarUtil.getStatusBarHeight(this);
251 424 }
252 425  
253   - /**将标题视图自适应沉浸式状态栏
  426 + /**
  427 + * 将标题视图自适应沉浸式状态栏
  428 + *
254 429 * @param view
255 430 */
256   - public void setTitleViewAdjustImmersiveStatusBar(View view) {
257   - if (null==view){
258   - Log.e(TAG,"setTitleViewAdjustImmersiveStatusBar->view is Null");
  431 + public void setTitleViewAdjustImmersiveStatusBar(View view) {
  432 + if (null == view) {
  433 + Log.e(TAG, "setTitleViewAdjustImmersiveStatusBar->view is Null");
259 434 }
260 435 ViewGroup.LayoutParams params = view.getLayoutParams();
261   - if (null==params){
262   - Log.e(TAG,"setTitleViewAdjustImmersiveStatusBar->LayoutParams is Null 无法将标题视图自适应沉浸式状态栏!");
  436 + if (null == params) {
  437 + Log.e(TAG, "setTitleViewAdjustImmersiveStatusBar->LayoutParams is Null 无法将标题视图自适应沉浸式状态栏!");
263 438 return;
264 439 }
265 440 int oldHeight = params.height;
266   - if (oldHeight<=0){
267   - Log.e(TAG,"setTitleViewAdjustImmersiveStatusBar->无法获取标题视图高度!");
  441 + if (oldHeight <= 0) {
  442 + Log.e(TAG, "setTitleViewAdjustImmersiveStatusBar->无法获取标题视图高度!");
268 443 return;
269 444 }
270   - if (0==getStatusBarHeight()){
271   - Log.e(TAG,"setTitleViewAdjustImmersiveStatusBar->无法获取状态栏高度!");
  445 + if (0 == getStatusBarHeight()) {
  446 + Log.e(TAG, "setTitleViewAdjustImmersiveStatusBar->无法获取状态栏高度!");
272 447 return;
273 448 }
274 449 params.height = oldHeight + getStatusBarHeight();
275 450 view.setLayoutParams(params);
276 451 }
  452 +
277 453 /**
278 454 * 设置状态栏字体颜色
279 455 */
280   - // 定义适用于参数的注解,限定取值范围为{STATUS_OPEN, STATUS_CLOSE}
  456 + // 定义适用于参数的注解,限定取值范围为{BLACK, WHITE}
281 457 public void setStatusBarTextColor(@StatusBarConfig.Unit final int type) {
282 458 if (type == StatusBarConfig.BLACK) {
283 459 StatusBarUtil.setStatusBarWrite(this);
... ... @@ -295,6 +471,11 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
295 471 isCreateDefultEmptyView = enable;
296 472 }
297 473  
  474 + /**
  475 + * 初始化handler
  476 + *
  477 + * @return
  478 + */
298 479 public Handler getMyActHandler() {
299 480 if (null == myActHandler) {
300 481 myActHandler = new Handler() {
... ... @@ -308,6 +489,11 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
308 489 return myActHandler;
309 490 }
310 491  
  492 + /**
  493 + * 收到Activity的handler
  494 + *
  495 + * @param msg
  496 + */
311 497 public void onReceiveActHandleMessage(@NonNull Message msg) {
312 498 if (null != getMvpView()) {
313 499 getMvpView().onReceiveActHandleMessage(msg);
... ... @@ -337,6 +523,12 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
337 523 }
338 524 }
339 525  
  526 + /**
  527 + * 收到观察者通知
  528 + *
  529 + * @param o
  530 + * @param data
  531 + */
340 532 @Override
341 533 public void update(Observable o, Object data) {
342 534 if (null == getMvpView()) {
... ... @@ -360,6 +552,7 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
360 552 /**
361 553 * 显示竖屏
362 554 */
  555 + @SuppressLint("SourceLockedOrientationActivity")
363 556 public void showPortraitScreen() {
364 557 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
365 558 }
... ... @@ -367,46 +560,22 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
367 560 /**
368 561 * 显示横屏
369 562 */
  563 + @SuppressLint("SourceLockedOrientationActivity")
370 564 public void showLandscapeScreen() {
371 565 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
372 566 }
373 567  
374   - protected void init(@Nullable Bundle savedInstanceState) {
375   - }
376   -
377   - protected void initParams(Intent params) {
378   - }
379 568  
380 569 /**
381   - * 初始化控件
382   - */
383   - protected abstract void initView();
384   -
385   -
386   - /**
387   - * 设置数据
  570 + * 是否已经开启侧滑返回
  571 + *
  572 + * @return
388 573 */
389   - protected void initData() {
390   - }
391   -
392   - protected void initBindingLayoutData(ViewDataBinding baseBinding) {
393   -
394   - }
395   -
396 574 public boolean isOpenSwipBack() {
397 575 return isOpenSwipBack;
398 576 }
399 577  
400 578 /**
401   - * 设置是否显示标题栏
402   - *
403   - * @param showTitle true or false
404   - */
405   - public void setShowTitle(boolean showTitle) {
406   - isShowTitle = showTitle;
407   - }
408   -
409   - /**
410 579 * 设置是否显示状态栏
411 580 *
412 581 * @param showStatusBar true or false
... ... @@ -420,6 +589,7 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
420 589 * 设置屏幕为横屏
421 590 * Set the screen to landscape.
422 591 */
  592 + @SuppressLint("SourceLockedOrientationActivity")
423 593 public void setLandscape() {
424 594 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
425 595 }
... ... @@ -428,6 +598,7 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
428 598 * 设置屏幕为竖屏
429 599 * Set the screen to portrait.
430 600 */
  601 + @SuppressLint("SourceLockedOrientationActivity")
431 602 public void setPortrait() {
432 603 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
433 604 }
... ... @@ -551,9 +722,19 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
551 722 imm.showSoftInput(view, InputMethodManager.SHOW_FORCED);
552 723 }
553 724  
  725 + /**
  726 + * 获取 SharedPreferencesHelper
  727 + */
  728 + protected SharedPreferencesHelper getSP() {
  729 + return SharedPreferencesHelper.getInstance(this);
  730 + }
  731 +
554 732 @Override
555 733 protected void onResume() {
556 734 super.onResume();
  735 + isActive = true;
  736 + //创建订阅映射
  737 + RxManager.getInstance().setCurrentDisposables(TAG);
557 738 if (isUserClickAllowBtn) {
558 739 isUserClickAllowBtn = false;
559 740 int requestCode = DEFAULT_REQUEST_CODE_PERMISSION;
... ... @@ -570,6 +751,35 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
570 751 requestPermission(requestCode, tip, isDefinePermissionCloseActivity, userSetPermission, isShowDialog, onPermissionResponseListener);
571 752 }
572 753 }
  754 + if (lifeCircleListener != null) {
  755 + lifeCircleListener.onResume();
  756 + }
  757 + if (globalLifeCircleListener != null) {
  758 + globalLifeCircleListener.onResume(me, me.getClass().getName());
  759 + }
  760 + AppManager.setActiveActivity(this);
  761 + }
  762 +
  763 +
  764 + @Override
  765 + protected void onPause() {
  766 + if (null != getPresenter()) {
  767 + getPresenter().onPause();
  768 + }
  769 + if (null != getMvpView()) {
  770 + getMvpView().onPause();
  771 + }
  772 + if (null != pauseDisposable && pauseDisposable.size() > 0) {
  773 + pauseDisposable.clear();
  774 + }
  775 + isActive = false;
  776 + if (lifeCircleListener != null) {
  777 + lifeCircleListener.onPause();
  778 + }
  779 + if (globalLifeCircleListener != null) {
  780 + globalLifeCircleListener.onPause(me, me.getClass().getName());
  781 + }
  782 + super.onPause();
573 783 }
574 784  
575 785 public void registerEventBus() {
... ... @@ -598,31 +808,92 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
598 808 @Override
599 809 protected void onDestroy() {
600 810 super.onDestroy();
  811 + isAlive = false;
601 812 //删除观察者
602 813 deleteObservable();
603 814 mDelegate.onDestroy();
604   - if (null != baseBinding) {
605   - baseBinding.unbind();
606   - }
607 815 if (null != myActHandler) {
608 816 myActHandler.removeCallbacksAndMessages(null);
609 817 }
  818 + //清除当前订阅
  819 + RxManager.getInstance().cancel(TAG);
  820 + //取消Rxjava订阅
  821 + if (null != destoryDisposable && destoryDisposable.size() > 0) {
  822 + destoryDisposable.clear();
  823 + }
610 824 unRegisterEventBus();
611 825 onPermissionResponseListener = null;
612 826 userSetPermission = null;
613 827 userSetDefinePermissionTip = null;
614   - //activity管理
615   - AppManager.getInstance().deleteActivity(me);
616   - //清除当前订阅
617   - SubscriptionManager.getInstance().cancel(TAG);
  828 + if (null != baseBinding) {
  829 + baseBinding.unbind();
  830 + }
618 831 if (null != getPresenter()) {
619   - getPresenter().onDestory();
  832 + getPresenter().onDestroy();
620 833 }
621 834 if (null != getMvpView()) {
622 835 getMvpView().onDestory();
623 836 }
  837 + //activity管理
  838 + AppManager.getInstance().deleteActivity(me);
  839 + if (lifeCircleListener != null) {
  840 + lifeCircleListener.onDestroy();
  841 + }
  842 + if (globalLifeCircleListener != null) {
  843 + globalLifeCircleListener.onDestroy(me, me.getClass().getName());
  844 + }
  845 +
624 846 }
625 847  
  848 + public void setLifeCircleListener(LifeCircleListener lifeCircleListener) {
  849 + this.lifeCircleListener = lifeCircleListener;
  850 + }
  851 +
  852 + public static GlobalLifeCircleListener getGlobalLifeCircleListener() {
  853 + return globalLifeCircleListener;
  854 + }
  855 +
  856 + public static void setGlobalLifeCircleListener(GlobalLifeCircleListener globalLifeCircleListener) {
  857 + BaseActivity.globalLifeCircleListener = globalLifeCircleListener;
  858 + }
  859 +
  860 +
  861 + public void runOnMain(Runnable runnable) {
  862 + runOnUiThread(new Runnable() {
  863 + @Override
  864 + public void run() {
  865 + if (isAlive) {
  866 + runnable.run();
  867 + }
  868 + }
  869 + });
  870 + }
  871 +
  872 + public void runOnMainDelayed(Runnable runnable, long time) {
  873 + getMyActHandler().postDelayed(new Runnable() {
  874 + @Override
  875 + public void run() {
  876 + runOnMain(runnable);
  877 + }
  878 + }, time);
  879 + }
  880 +
  881 + public void runDelayed(Runnable runnable, long time) {
  882 + getMyActHandler().postDelayed(new Runnable() {
  883 + @Override
  884 + public void run() {
  885 + runnable.run();
  886 + }
  887 + }, time);
  888 + }
  889 +
  890 + @Override
  891 + public void onWindowFocusChanged(boolean hasFocus) {
  892 + super.onWindowFocusChanged(hasFocus);
  893 + if (globalLifeCircleListener != null) {
  894 + globalLifeCircleListener.windowFocus(me, me.getClass().getName(), hasFocus);
  895 + }
  896 + }
626 897  
627 898 @NonNull
628 899 public final V createView() {
... ... @@ -689,19 +960,11 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
689 960 /**
690 961 * 判空
691 962 *
692   - * @param o
  963 + * @param os
693 964 * @return
694 965 */
695   - public boolean isNull(Object o) {
696   - if (o instanceof String) {
697   - String s = (String) o;
698   - if (s == null || s.trim().isEmpty() || "null".equals(s) || "(null)".equals(s)) {
699   - return true;
700   - }
701   - } else if (null == o) {
702   - return true;
703   - }
704   - return false;
  966 + public boolean isNull(Object... os) {
  967 + return BaseHelpUtil.isNull(os);
705 968 }
706 969  
707 970 @Override
... ... @@ -1286,27 +1549,55 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
1286 1549 } else {
1287 1550 tip = userSetDefinePermissionTip;
1288 1551 }
1289   - new AlertDialog.Builder(this)
1290   - .setTitle("温馨提示")
1291   - .setMessage(tip)
1292   - .setCancelable(false)
1293   - .setNegativeButton("取消", new DialogInterface.OnClickListener() {
1294   - @Override
1295   - public void onClick(DialogInterface dialog, int which) {
1296   - if (isDefinePermissionCloseActivity) {
1297   - finish();
1298   - }
1299   - resetPermissionConfig();
1300   - }
1301   - })
1302   - .setPositiveButton("去设置", new DialogInterface.OnClickListener() {
1303   - @Override
1304   - public void onClick(DialogInterface dialog, int which) {
1305   - dialog.dismiss();
1306   - startAppSettings();
1307   - isUserClickAllowBtn = true;
  1552 +// new AlertDialog.Builder(this)
  1553 +// .setTitle("温馨提示")
  1554 +// .setMessage(tip)
  1555 +// .setCancelable(false)
  1556 +// .setNegativeButton("取消", new DialogInterface.OnClickListener() {
  1557 +// @Override
  1558 +// public void onClick(DialogInterface dialog, int which) {
  1559 +// if (isDefinePermissionCloseActivity) {
  1560 +// finish();
  1561 +// }
  1562 +// resetPermissionConfig();
  1563 +// }
  1564 +// })
  1565 +// .setPositiveButton("去设置", new DialogInterface.OnClickListener() {
  1566 +// @Override
  1567 +// public void onClick(DialogInterface dialog, int which) {
  1568 +// dialog.dismiss();
  1569 +// startAppSettings();
  1570 +// isUserClickAllowBtn = true;
  1571 +// }
  1572 +// }).show();
  1573 + if (null == permissionTipDialog) {
  1574 + permissionTipDialog = new SelectDialog(me, tip, "取消", new SelectDialog.DialogInterface() {
  1575 + @Override
  1576 + public void onClick(SelectDialog dialog) {
  1577 + dialog.dismiss();
  1578 + if (isDefinePermissionCloseActivity) {
  1579 + finish();
1308 1580 }
1309   - }).show();
  1581 + resetPermissionConfig();
  1582 + }
  1583 + }, "去设置", new SelectDialog.DialogInterface() {
  1584 + @Override
  1585 + public void onClick(SelectDialog dialog) {
  1586 + dialog.dismiss();
  1587 + startAppSettings();
  1588 + isUserClickAllowBtn = true;
  1589 + }
  1590 + });
  1591 + permissionTipDialog.setCanceledOnTouchOutside(false);
  1592 + permissionTipDialog.setCancelable(false);
  1593 + permissionTipDialog.setTipGravity(Gravity.LEFT);
  1594 + permissionTipDialog.setLeftBtnColor(R.color.color_282828);
  1595 + } else {
  1596 + permissionTipDialog.setTipMessage(tip);
  1597 + }
  1598 + if (!permissionTipDialog.isShowing()) {
  1599 + permissionTipDialog.show();
  1600 + }
1310 1601 }
1311 1602  
1312 1603  
... ... @@ -1474,6 +1765,10 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
1474 1765 mDelegate.loadRootFragment(R.id.root_container, toFragment, allowAnimation);
1475 1766 }
1476 1767  
  1768 + public final void loadRootFragment(ISupportFragment toFragment, boolean addToBackStack, boolean allowAnimation) {
  1769 + mDelegate.loadRootFragment(R.id.root_container, toFragment, addToBackStack, allowAnimation);
  1770 + }
  1771 +
1477 1772 /**
1478 1773 * 加载根Fragment, 即Activity内的第一个Fragment 或 Fragment内的第一个子Fragment
1479 1774 *
... ... @@ -1644,7 +1939,7 @@ public abstract class BaseActivity&lt;V extends BaseView, P extends BasePresenter&lt;V
1644 1939 Fragmentation.builder()
1645 1940 // show stack view. Mode: BUBBLE, SHAKE, NONE
1646 1941 .stackViewMode(Fragmentation.BUBBLE)
1647   - .debug(AppConfig.isDebug())
  1942 + .debug(BuildConfig.DEBUG)
1648 1943 .install();
1649 1944 }
1650 1945 /***********************************滑动返回********************************************/
... ...
core/base/src/main/java/com/cnlive/core/libs/base/frame/fragment/BaseFragment.java
... ... @@ -2,6 +2,7 @@ package com.cnlive.core.libs.base.frame.fragment;
2 2  
3 3 import android.app.Activity;
4 4 import android.content.Intent;
  5 +import android.graphics.drawable.Drawable;
5 6 import android.os.Bundle;
6 7 import android.os.Handler;
7 8 import android.os.Message;
... ... @@ -10,8 +11,8 @@ import android.view.View;
10 11 import android.view.ViewGroup;
11 12 import android.view.animation.Animation;
12 13  
13   -import androidx.annotation.ColorInt;
14 14 import androidx.annotation.ColorRes;
  15 +import androidx.annotation.DrawableRes;
15 16 import androidx.annotation.FloatRange;
16 17 import androidx.annotation.IntRange;
17 18 import androidx.annotation.NonNull;
... ... @@ -20,16 +21,20 @@ import androidx.annotation.StringRes;
20 21 import androidx.databinding.DataBindingUtil;
21 22 import androidx.databinding.ViewDataBinding;
22 23  
  24 +import com.alibaba.android.arouter.facade.Postcard;
  25 +import com.alibaba.android.arouter.facade.template.IProvider;
23 26 import com.alibaba.android.arouter.launcher.ARouter;
  27 +import com.cnlive.cloud.base.R;
24 28 import com.cnlive.core.libs.base.frame.activity.BaseActivity;
25 29 import com.cnlive.core.libs.base.frame.presenter.BasePresenter;
  30 +import com.cnlive.core.libs.base.frame.view.BaseView;
26 31 import com.cnlive.core.libs.base.interfaces.OnPermissionResponseListener;
27   -import com.cnlive.core.libs.base.network.manager.SubscriptionManager;
  32 +import com.cnlive.core.libs.base.network.manager.RxManager;
  33 +import com.cnlive.core.libs.base.util.AlertUtil;
  34 +import com.cnlive.core.libs.base.util.BaseHelpUtil;
  35 +import com.cnlive.core.libs.base.util.LifeCircleListener;
28 36 import com.cnlive.core.libs.base.util.ReflectUtil;
29   -import com.cnlive.core.libs.base.frame.view.BaseView;
30 37 import com.cnlive.core.libs.base.util.StatusBarConfig;
31   -import com.cnlive.cloud.base.R;
32   -import com.cnlive.core.libs.base.util.StatusBarUtil;
33 38 import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
34 39 import com.me.yokeyword.fragmentation.ExtraTransaction;
35 40 import com.me.yokeyword.fragmentation.ISupportFragment;
... ... @@ -48,6 +53,9 @@ import java.util.List;
48 53 import java.util.Observable;
49 54 import java.util.Observer;
50 55  
  56 +import io.reactivex.disposables.CompositeDisposable;
  57 +import io.reactivex.disposables.Disposable;
  58 +
51 59 /**
52 60 * 基类fragment
53 61 *
... ... @@ -69,6 +77,14 @@ public abstract class BaseFragment&lt;V extends BaseView, P extends BasePresenter&lt;V
69 77 private List<Observable> observableList;
70 78 private Bundle savedInstanceState;
71 79 private boolean isCreateDefultEmptyView = true;//默认显示空视图
  80 + public boolean isActive = false;//当前Fragment是否活跃
  81 + private CompositeDisposable destoryDisposable;//生命周期在destory销毁
  82 + private CompositeDisposable pauseDisposable;//生命周期在onPause销毁
  83 +
  84 + /**
  85 + * 快速管理生命周期
  86 + */
  87 + private LifeCircleListener lifeCircleListener;
72 88  
73 89 public final ViewDataBinding getBaseBinding() {
74 90 return baseBinding;
... ... @@ -86,9 +102,9 @@ public abstract class BaseFragment&lt;V extends BaseView, P extends BasePresenter&lt;V
86 102 if (null == observableList) {
87 103 observableList = new ArrayList<>();
88 104 }
  105 + //初始化rxjava管理
  106 + initRxjava();
89 107 this.savedInstanceState = savedInstanceState;
90   - //创建订阅映射
91   - SubscriptionManager.getInstance().setCurrentDisposables(TAG);
92 108 mDelegate.onCreate(savedInstanceState);
93 109 mSwipeDelegate.onCreate(savedInstanceState);
94 110 setSwipeBackEnable(me.isOpenSwipBack());
... ... @@ -97,6 +113,14 @@ public abstract class BaseFragment&lt;V extends BaseView, P extends BasePresenter&lt;V
97 113 if (null != getArguments()) {
98 114 initParams(getArguments());
99 115 }
  116 + if (lifeCircleListener != null) {
  117 + lifeCircleListener.onCreate();
  118 + }
  119 + }
  120 +
  121 + private void initRxjava() {
  122 + pauseDisposable = new CompositeDisposable();
  123 + destoryDisposable = new CompositeDisposable();
100 124 }
101 125  
102 126 @Nullable
... ... @@ -128,15 +152,115 @@ public abstract class BaseFragment&lt;V extends BaseView, P extends BasePresenter&lt;V
128 152 }
129 153 }
130 154 }
  155 +
131 156 return super.onCreateView(inflater, container, savedInstanceState);
132 157 }
133 158  
  159 + public void setLifeCircleListener(LifeCircleListener lifeCircleListener) {
  160 + this.lifeCircleListener = lifeCircleListener;
  161 + }
  162 +
  163 + /**
  164 + * 添加订阅
  165 + * Pause 销毁
  166 + *
  167 + * @param disposable
  168 + * @return
  169 + */
  170 + public Disposable addPauseDisPosable(Disposable disposable) {
  171 + if (null != disposable) {
  172 + if (null != pauseDisposable) {
  173 + pauseDisposable.add(disposable);
  174 + }
  175 + }
  176 + return disposable;
  177 + }
  178 +
  179 + /**
  180 + * 添加订阅
  181 + * Destory 销毁
  182 + *
  183 + * @param disposable
  184 + * @return
  185 + */
  186 + public Disposable addDestoryDisPosable(Disposable disposable) {
  187 + if (null != disposable) {
  188 + if (null != destoryDisposable) {
  189 + destoryDisposable.add(disposable);
  190 + }
  191 + }
  192 + return disposable;
  193 + }
134 194  
135   - public boolean isNull(Object o) {
  195 + /**
  196 + * 获取资源颜色
  197 + *
  198 + * @param colorId
  199 + * @return
  200 + */
  201 + public int getResourceColor(@ColorRes int colorId) {
  202 + return BaseHelpUtil.getResourceColor(me, colorId);
  203 + }
  204 +
  205 + /**
  206 + * 获取资源字符串
  207 + *
  208 + * @param stringId
  209 + * @return
  210 + */
  211 + public String getResourceStr(@StringRes int stringId) {
  212 + return BaseHelpUtil.getResourceStr(me, stringId);
  213 + }
  214 +
  215 + /**
  216 + * 获取资源
  217 + *
  218 + * @param drawableId
  219 + * @return
  220 + */
  221 + public Drawable getResourceDrawable(@DrawableRes int drawableId) {
  222 + return BaseHelpUtil.getResourceDrawable(me, drawableId);
  223 + }
  224 +
  225 + /**
  226 + * 用户提示
  227 + */
  228 + public void showToast(String message) {
  229 + AlertUtil.showDeftToast(me, message);
  230 + }
  231 +
  232 + public boolean isNull(Object... o) {
136 233 return me.isNull(o);
137 234 }
138 235  
139 236 /**
  237 + * 实例化路由-对象
  238 + */
  239 + public <T extends IProvider> T initRouterImpl(String routerPath) {
  240 + return (T) me.initRouterImpl(routerPath);
  241 + }
  242 +
  243 + /**
  244 + * Arouter跳转
  245 + *
  246 + * @param routerPath
  247 + * @return
  248 + */
  249 + public Postcard goToRouter(String routerPath) {
  250 + return ARouter.getInstance().build(routerPath);
  251 + }
  252 +
  253 + /**
  254 + * Arouter跳转无参数
  255 + *
  256 + * @param routerPath
  257 + * @return
  258 + */
  259 + public void goToRouterNoParams(String routerPath) {
  260 + ARouter.getInstance().build(routerPath).navigation(me);
  261 + }
  262 +
  263 + /**
140 264 * 显示白色通知栏
141 265 */
142 266 public void showDefaultWhiteStatusBar() {
... ... @@ -166,9 +290,15 @@ public abstract class BaseFragment&lt;V extends BaseView, P extends BasePresenter&lt;V
166 290 if (null != getMvpView() && null != getPresenter()) {
167 291 if (null != baseBinding) {
168 292 initBindingLayoutData(baseBinding);
  293 + if (isViewAttached() && !isNull(me)) {
  294 + getMvpView().initFragBindingLayout(me, this, baseBinding);
  295 + }
169 296 }
170 297 if (null != baseView) {
171 298 initViewLayoutData(baseView);
  299 + if (isViewAttached() && !isNull(me)) {
  300 + getMvpView().initFragViewLayout(me, this, baseView);
  301 + }
172 302 }
173 303 initView();
174 304 initData();
... ... @@ -276,6 +406,11 @@ public abstract class BaseFragment&lt;V extends BaseView, P extends BasePresenter&lt;V
276 406 EventBus.getDefault().postSticky(object);
277 407 }
278 408  
  409 + /**
  410 + * 初始化fragment的handler
  411 + *
  412 + * @return
  413 + */
279 414 public Handler getMyFragHandler() {
280 415 if (null == myFragHandler) {
281 416 myFragHandler = new Handler() {
... ... @@ -289,12 +424,22 @@ public abstract class BaseFragment&lt;V extends BaseView, P extends BasePresenter&lt;V
289 424 return myFragHandler;
290 425 }
291 426  
  427 + /**
  428 + * 收到fragment对应的Activity的handler
  429 + *
  430 + * @param msg
  431 + */
292 432 public void onReceiveActHandleMessage(@NonNull Message msg) {
293 433 if (null != getMvpView()) {
294 434 getMvpView().onReceiveActHandleMessage(msg);
295 435 }
296 436 }
297 437  
  438 + /**
  439 + * 收到当前fragment的handler
  440 + *
  441 + * @param msg
  442 + */
298 443 public void onReceiveFragHandleMessage(@NonNull Message msg) {
299 444 if (null != getMvpView()) {
300 445 getMvpView().onReceiveFragHandleMessage(msg);
... ... @@ -417,6 +562,15 @@ public abstract class BaseFragment&lt;V extends BaseView, P extends BasePresenter&lt;V
417 562 }
418 563  
419 564 /**
  565 + * 获取状态栏高度dp
  566 + *
  567 + * @return
  568 + */
  569 + public int getStatusBarHeight() {
  570 + return me.getStatusBarHeight();
  571 + }
  572 +
  573 + /**
420 574 * 将标题视图自适应沉浸式状态栏
421 575 *
422 576 * @param view
... ... @@ -426,37 +580,63 @@ public abstract class BaseFragment&lt;V extends BaseView, P extends BasePresenter&lt;V
426 580 }
427 581  
428 582 /**
429   - * 获取状态栏高度
430   - *
431   - * @return
  583 + * 销毁 Rx Dispose
432 584 */
433   - public int getStatusBarHeight() {
434   - return me.getStatusBarHeight();
  585 + public void disposeRxEvent(Disposable... disposables) {
  586 + if (disposables == null) return;
  587 + for (Disposable disposable : disposables) if (disposable != null) disposable.dispose();
  588 + }
  589 +
  590 + @Override
  591 + public void onDestroyView() {
  592 + mDelegate.onDestroyView();
  593 + super.onDestroyView();
  594 + deleteObservable();
  595 + if (null != myFragHandler) {
  596 + myFragHandler.removeCallbacksAndMessages(null);
  597 + }
  598 + unRegisterEventBus();
  599 + //清除当前订阅
  600 + RxManager.getInstance().cancel(TAG);
  601 + if (null != getMvpView()) {
  602 + getMvpView().onDestory();
  603 + }
  604 + if (null != getPresenter()) {
  605 + getPresenter().onDestroy();
  606 + }
435 607 }
436 608  
437 609 @Override
438 610 public void onDestroy() {
439 611 super.onDestroy();
440 612 deleteObservable();
441   - if (null != baseBinding) {
442   - baseBinding.unbind();
  613 + unRegisterEventBus();
  614 + //清除当前订阅
  615 + RxManager.getInstance().cancel(TAG);
  616 + //取消Rxjava订阅
  617 + if (null != destoryDisposable && destoryDisposable.size() > 0) {
  618 + destoryDisposable.clear();
443 619 }
444 620 if (null != myFragHandler) {
445 621 myFragHandler.removeCallbacksAndMessages(null);
446 622 }
447   - unRegisterEventBus();
  623 + if (null != baseBinding) {
  624 + baseBinding.unbind();
  625 + }
448 626 mDelegate.onDestroy();
449 627 mSwipeDelegate.onDestroyView();
450   - //清除当前订阅
451   - SubscriptionManager.getInstance().cancel(TAG);
452 628 if (null != getPresenter()) {
453   - getPresenter().onDestory();
  629 + getPresenter().onDestroy();
454 630 }
455 631 if (null != getMvpView()) {
456 632 getMvpView().onDestory();
457 633 }
  634 + if (lifeCircleListener != null) {
  635 + lifeCircleListener.onDestroy();
  636 + }
458 637 }
459 638  
  639 +
460 640 /**
461 641 * 设置状态栏字体颜色
462 642 */
... ... @@ -674,34 +854,37 @@ public abstract class BaseFragment&lt;V extends BaseView, P extends BasePresenter&lt;V
674 854 @Override
675 855 public void onResume() {
676 856 super.onResume();
  857 + //创建订阅映射
  858 + RxManager.getInstance().setCurrentDisposables(TAG);
677 859 mDelegate.onResume();
678   - }
  860 + isActive = true;
  861 + if (lifeCircleListener != null) {
  862 + lifeCircleListener.onResume();
  863 + }
679 864  
680   - @Override
681   - public void onPause() {
682   - super.onPause();
683   - mDelegate.onPause();
684 865 }
685 866  
686 867 @Override
687   - public void onDestroyView() {
688   - mDelegate.onDestroyView();
689   - super.onDestroyView();
690   - deleteObservable();
691   - if (null != myFragHandler) {
692   - myFragHandler.removeCallbacksAndMessages(null);
  868 + public void onPause() {
  869 + if (null != getPresenter()) {
  870 + getPresenter().onPause();
693 871 }
694   - unRegisterEventBus();
695   - //清除当前订阅
696   - SubscriptionManager.getInstance().cancel(TAG);
697 872 if (null != getMvpView()) {
698   - getMvpView().onDestory();
  873 + getMvpView().onPause();
699 874 }
700   - if (null != getPresenter()) {
701   - getPresenter().onDestory();
  875 + if (null != pauseDisposable && pauseDisposable.size() > 0) {
  876 + pauseDisposable.clear();
702 877 }
  878 + isActive = false;
  879 + if (lifeCircleListener != null) {
  880 + lifeCircleListener.onPause();
  881 + }
  882 +
  883 + super.onPause();
  884 + mDelegate.onPause();
703 885 }
704 886  
  887 +
705 888 @Override
706 889 public void onHiddenChanged(boolean hidden) {
707 890 super.onHiddenChanged(hidden);
... ... @@ -1131,4 +1314,16 @@ public abstract class BaseFragment&lt;V extends BaseView, P extends BasePresenter&lt;V
1131 1314 public void setParallaxOffset(@FloatRange(from = 0.0f, to = 1.0f) float offset) {
1132 1315 mSwipeDelegate.setParallaxOffset(offset);
1133 1316 }
  1317 +
  1318 + /**
  1319 + * 设置底层view是否可点击
  1320 + * fragment根布局是否可点击,多用于多个fragment叠加在一个activity,是否可点击下层的fragment,默认是false可以点击下层的
  1321 + *
  1322 + * @param isEnable
  1323 + */
  1324 + public void setFragmentRootViewCanClickable(boolean isEnable) {
  1325 + if (null != mDelegate) {
  1326 + mDelegate.setFragmentRootViewCanClickable(isEnable);
  1327 + }
  1328 + }
1134 1329 }
... ...
core/base/src/main/java/com/cnlive/core/libs/base/frame/presenter/BasePresenter.java
1 1 package com.cnlive.core.libs.base.frame.presenter;
2 2  
  3 +import android.app.Dialog;
  4 +import android.content.Context;
  5 +
  6 +import com.alibaba.android.arouter.facade.template.IProvider;
  7 +import com.alibaba.android.arouter.launcher.ARouter;
3 8 import com.cnlive.core.libs.base.frame.view.BaseView;
  9 +import com.cnlive.core.libs.base.network.manager.RxManager;
  10 +import com.cnlive.core.libs.base.util.BaseHelpUtil;
  11 +import com.cnlive.core.libs.base.util.SharedPreferencesHelper;
4 12 import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
5 13 import com.orhanobut.logger.Logger;
6 14  
7 15 import org.greenrobot.eventbus.EventBus;
8 16  
  17 +import java.util.UUID;
  18 +
  19 +import io.reactivex.disposables.CompositeDisposable;
  20 +import io.reactivex.disposables.Disposable;
  21 +
9 22 /**
10 23 * @param <V>
11 24 */
... ... @@ -20,21 +33,98 @@ public class BasePresenter&lt;V extends BaseView&gt; extends MvpBasePresenter&lt;V&gt; {
20 33 EventBus.getDefault().postSticky(object);
21 34 }
22 35  
23   - public boolean isNull(Object o) {
24   - if (o instanceof String) {
25   - String s = (String) o;
26   - if (s == null || s.trim().isEmpty() || "null".equals(s) || "(null)".equals(s)) {
27   - return true;
  36 + //用于自动取消rxjava
  37 + public final String FLAG = UUID.randomUUID().toString().replaceAll("-", "");
  38 +
  39 + private CompositeDisposable destoryDisposable;//生命周期在destory销毁
  40 + private CompositeDisposable pauseDisposable;//生命周期在onPause销毁
  41 +
  42 + public BasePresenter() {
  43 + //创建订阅映射
  44 + RxManager.getInstance().setCurrentDisposables(FLAG);
  45 + initRxjava();
  46 + }
  47 +
  48 + private void initRxjava() {
  49 + pauseDisposable = new CompositeDisposable();
  50 + destoryDisposable = new CompositeDisposable();
  51 + }
  52 +
  53 + /**
  54 + * 添加订阅
  55 + * Pause 销毁
  56 + *
  57 + * @param disposable
  58 + * @return
  59 + */
  60 + public Disposable addPauseDisPosable(Disposable disposable) {
  61 + if (null != disposable) {
  62 + if (null != pauseDisposable) {
  63 + pauseDisposable.add(disposable);
  64 + }
  65 + }
  66 + return disposable;
  67 + }
  68 +
  69 + /**
  70 + * 添加订阅
  71 + * Destory 销毁
  72 + *
  73 + * @param disposable
  74 + * @return
  75 + */
  76 + public Disposable addDestoryDisPosable(Disposable disposable) {
  77 + if (null != disposable) {
  78 + if (null != destoryDisposable) {
  79 + destoryDisposable.add(disposable);
28 80 }
29   - } else if (null == o) {
30   - return true;
31 81 }
32   - return false;
  82 + return disposable;
  83 + }
  84 +
  85 + /**
  86 + * 实例化路由-对象
  87 + */
  88 + public <T extends IProvider> T initRouterImpl(String routerPath) {
  89 + T obj = null;
  90 + try {
  91 + obj = (T) ARouter.getInstance().build(routerPath).navigation();
  92 + } catch (Exception ignored) {
  93 + }
  94 + return obj;
  95 + }
  96 +
  97 + /**
  98 + * 销毁 Rx Dispose
  99 + */
  100 + protected void disposeRxEvent(Disposable... disposables) {
  101 + if (disposables == null) return;
  102 + for (Disposable disposable : disposables) {
  103 + if (disposable == null) continue;
  104 + if (disposable.isDisposed()) continue;
  105 +
  106 + disposable.dispose();
  107 + }
  108 + }
  109 +
  110 + /**
  111 + * 销毁 Dialog
  112 + */
  113 + protected void disposeDialog(Dialog... dialogs) {
  114 + if (dialogs == null) return;
  115 + for (Dialog dialog : dialogs) if (dialog != null) dialog.dismiss();
  116 + }
  117 +
  118 + /**
  119 + * 获取 SharedPreferencesHelper
  120 + */
  121 + protected SharedPreferencesHelper getSP(Context context) {
  122 + return SharedPreferencesHelper.getInstance(context);
  123 + }
  124 +
  125 + public boolean isNull(Object... os) {
  126 + return BaseHelpUtil.isNull(os);
33 127 }
34   - // @Override
35   -// public V getView() {
36   -// return super.getView();
37   -// }
38 128  
39 129 public void logError(String info) {
40 130 Logger.e(info);
... ... @@ -64,7 +154,22 @@ public class BasePresenter&lt;V extends BaseView&gt; extends MvpBasePresenter&lt;V&gt; {
64 154 Logger.xml(xml);
65 155 }
66 156  
67   - public void onDestory(){};
  157 +
  158 + public void onPause() {
  159 + //取消订阅
  160 + if (null != pauseDisposable && pauseDisposable.size() > 0) {
  161 + pauseDisposable.clear();
  162 + }
  163 + }
  164 +
  165 + public void onDestroy() {
  166 + //取消订阅
  167 + if (null != destoryDisposable && destoryDisposable.size() > 0) {
  168 + destoryDisposable.clear();
  169 + }
  170 + //创建订阅映射
  171 + RxManager.getInstance().cancel(FLAG);
  172 + }
68 173  
69 174 @Override
70 175 public boolean isViewAttached() {
... ...
core/base/src/main/java/com/cnlive/core/libs/base/frame/view/BaseView.java
1 1 package com.cnlive.core.libs.base.frame.view;
2 2  
  3 +import android.app.Dialog;
  4 +import android.content.Context;
  5 +import android.graphics.drawable.Drawable;
3 6 import android.os.Message;
4 7 import android.text.TextUtils;
  8 +import android.view.View;
5 9  
  10 +import androidx.annotation.ColorRes;
  11 +import androidx.annotation.DrawableRes;
6 12 import androidx.annotation.NonNull;
7   -
  13 +import androidx.annotation.StringRes;
  14 +import androidx.databinding.ViewDataBinding;
  15 +
  16 +import com.alibaba.android.arouter.facade.template.IProvider;
  17 +import com.alibaba.android.arouter.launcher.ARouter;
  18 +import com.cnlive.core.libs.base.frame.activity.BaseActivity;
  19 +import com.cnlive.core.libs.base.frame.fragment.BaseFragment;
  20 +import com.cnlive.core.libs.base.util.AlertUtil;
  21 +import com.cnlive.core.libs.base.util.BaseHelpUtil;
8 22 import com.hannesdorfmann.mosby3.mvp.MvpView;
9 23 import com.orhanobut.logger.Logger;
10 24  
11 25 import org.greenrobot.eventbus.EventBus;
12 26  
  27 +import io.reactivex.disposables.CompositeDisposable;
  28 +import io.reactivex.disposables.Disposable;
  29 +
13 30 /**
14 31 * @author ys
15 32 * 基类View
16 33 */
17 34 public class BaseView implements MvpView {
18 35 protected final String TAG = this.getClass().getSimpleName();
  36 + public BaseActivity me;
  37 + private CompositeDisposable destoryDisposable;//生命周期在destory销毁
  38 + private CompositeDisposable pauseDisposable;//生命周期在onPause销毁
19 39  
20 40 public final void postEvent(Object object) {
21 41 EventBus.getDefault().post(object);
... ... @@ -25,22 +45,92 @@ public class BaseView implements MvpView {
25 45 EventBus.getDefault().postSticky(object);
26 46 }
27 47  
  48 + public BaseView() {
  49 + initRxjava();
  50 + }
  51 +
  52 + private void initRxjava() {
  53 + pauseDisposable = new CompositeDisposable();
  54 + destoryDisposable = new CompositeDisposable();
  55 + }
  56 +
  57 + /**
  58 + * 添加订阅
  59 + * Pause 销毁
  60 + *
  61 + * @param disposable
  62 + * @return
  63 + */
  64 + public Disposable addPauseDisPosable(Disposable disposable) {
  65 + if (null != disposable) {
  66 + if (null != pauseDisposable) {
  67 + pauseDisposable.add(disposable);
  68 + }
  69 + }
  70 + return disposable;
  71 + }
  72 +
  73 + /**
  74 + * 添加订阅
  75 + * Destory 销毁
  76 + *
  77 + * @param disposable
  78 + * @return
  79 + */
  80 + public Disposable addDestoryDisPosable(Disposable disposable) {
  81 + if (null != disposable) {
  82 + if (null != destoryDisposable) {
  83 + destoryDisposable.add(disposable);
  84 + }
  85 + }
  86 + return disposable;
  87 + }
  88 +
  89 + /**
  90 + * 在Activity的View层直接重写方法获取
  91 + *
  92 + * @param baseActivity
  93 + * @param baseBinding
  94 + */
  95 + public void initActBindingLayout(BaseActivity baseActivity, ViewDataBinding baseBinding) {
  96 + this.me = baseActivity;
  97 + }
  98 +
  99 + /**
  100 + * 在Fragment的View层直接重写方法获取 当前fragment ,
  101 + *
  102 + * @param baseActivity
  103 + * @param baseFragment
  104 + * @param baseBinding
  105 + */
  106 + public void initFragBindingLayout(BaseActivity baseActivity, BaseFragment baseFragment, ViewDataBinding baseBinding) {
  107 + this.me = baseActivity;
  108 + }
  109 +
  110 + public void initFragViewLayout(BaseActivity baseActivity, BaseFragment baseFragment, View baseView) {
  111 + this.me = baseActivity;
  112 + }
  113 +
28 114 public void initView() {
29 115 }
30 116  
31 117 public void initData() {
32 118 }
33 119  
34   - public boolean isNull(Object o) {
35   - if (o instanceof String) {
36   - String s = (String) o;
37   - if (s == null || s.trim().isEmpty() || "null".equals(s) || "(null)".equals(s)) {
38   - return true;
39   - }
40   - } else if (null == o) {
41   - return true;
  120 + /**
  121 + * 实例化路由-对象
  122 + */
  123 + public <T extends IProvider> T initRouterImpl(String routerPath) {
  124 + T obj = null;
  125 + try {
  126 + obj = (T) ARouter.getInstance().build(routerPath).navigation();
  127 + } catch (Exception ignored) {
42 128 }
43   - return false;
  129 + return obj;
  130 + }
  131 +
  132 + public boolean isNull(Object... os) {
  133 + return BaseHelpUtil.isNull(os);
44 134 }
45 135  
46 136 public void onReceiveActHandleMessage(@NonNull Message msg) {
... ... @@ -79,5 +169,85 @@ public class BaseView implements MvpView {
79 169 Logger.xml(xml);
80 170 }
81 171  
82   - public void onDestory(){};
  172 +
  173 + public void onPause() {
  174 + //取消订阅
  175 + if (null != pauseDisposable && pauseDisposable.size() > 0) {
  176 + pauseDisposable.clear();
  177 + }
  178 + }
  179 +
  180 + public void onDestory() {
  181 + //取消订阅
  182 + if (null != destoryDisposable && destoryDisposable.size() > 0) {
  183 + destoryDisposable.clear();
  184 + }
  185 + }
  186 +
  187 + /**
  188 + * 获取资源颜色
  189 + *
  190 + * @param colorId
  191 + * @return
  192 + */
  193 + public int getResourceColor(@ColorRes int colorId) {
  194 + return BaseHelpUtil.getResourceColor(me, colorId);
  195 + }
  196 +
  197 + /**
  198 + * 获取资源字符串
  199 + *
  200 + * @param stringId
  201 + * @return
  202 + */
  203 + public String getResourceStr(@StringRes int stringId) {
  204 + return BaseHelpUtil.getResourceStr(me, stringId);
  205 + }
  206 +
  207 + /**
  208 + * 获取资源
  209 + *
  210 + * @param drawableId
  211 + * @return
  212 + */
  213 + public Drawable getResourceDrawable(@DrawableRes int drawableId) {
  214 + return BaseHelpUtil.getResourceDrawable(me, drawableId);
  215 + }
  216 +
  217 + /**
  218 + * 用户提示
  219 + */
  220 + public void showToast(String message) {
  221 + AlertUtil.showDeftToast(me, message);
  222 + }
  223 +
  224 + /**
  225 + * 销毁 Dialog
  226 + */
  227 + protected void disposeDialog(Dialog... dialogs) {
  228 + if (dialogs == null) return;
  229 + for (Dialog dialog : dialogs) if (dialog != null) dialog.dismiss();
  230 + }
  231 +
  232 + public void onNetworkError(Context context, String errCode, String errMsg, Exception e) {
  233 + if (!TextUtils.isEmpty(errMsg)) {
  234 + showToast(errMsg);
  235 + } else if (!TextUtils.isEmpty(errCode)) {
  236 + switch (errCode) {
  237 + case "-7001"://当前没有网络
  238 + showToast("请检查当前网络.");
  239 + break;
  240 + case "-1"://服务端错误
  241 + showToast("服务正在维护当中,请稍候.");
  242 + break;
  243 + default:
  244 + showToast("服务正在升级当中,请稍候.");
  245 + break;
  246 + }
  247 + } else if (e != null) {
  248 + showToast("功能正在维护当中,请稍候.");
  249 + } else {
  250 + showToast("获取信息失败,请稍候.");
  251 + }
  252 + }
83 253 }
... ...
core/base/src/main/java/com/cnlive/core/libs/base/listener/Callback.java 0 → 100644
  1 +package com.cnlive.core.libs.base.listener;
  2 +
  3 +public interface Callback<T> {
  4 +
  5 + void call(T service);
  6 +}
... ...
core/base/src/main/java/com/cnlive/core/libs/base/network/manager/SubscriptionManager.java renamed to core/base/src/main/java/com/cnlive/core/libs/base/network/manager/RxManager.java
... ... @@ -4,6 +4,9 @@ package com.cnlive.core.libs.base.network.manager;
4 4 import android.text.TextUtils;
5 5 import android.util.Log;
6 6  
  7 +
  8 +import com.cnlive.cloud.base.BuildConfig;
  9 +
7 10 import java.util.HashMap;
8 11  
9 12 import io.reactivex.disposables.CompositeDisposable;
... ... @@ -14,17 +17,18 @@ import io.reactivex.disposables.Disposable;
14 17 *
15 18 * @author ys
16 19 */
17   -public class SubscriptionManager {
18   - private static SubscriptionManager instance;
  20 +public class RxManager {
  21 + private static RxManager instance;
19 22 private HashMap<String, CompositeDisposable> hashDisposable;//所有订阅关系
20 23 private HashMap<Integer, String> hashTag;//当前activity
21 24 private HashMap<String, Integer> hashTagIndex;//当前activity
22 25 private String currentClassName;
  26 + private final String className = this.getClass().getName();
23 27  
24 28 /**
25 29 * 构造函数 new CompositeDisposable对象
26 30 */
27   - public SubscriptionManager() {
  31 + public RxManager() {
28 32 if (null == hashDisposable) {
29 33 hashDisposable = new HashMap<>();
30 34 }
... ... @@ -41,11 +45,11 @@ public class SubscriptionManager {
41 45 *
42 46 * @return
43 47 */
44   - public static SubscriptionManager getInstance() {
  48 + public synchronized static RxManager getInstance() {
45 49 if (instance == null) {
46   - synchronized (SubscriptionManager.class) {
  50 + synchronized (RxManager.class) {
47 51 if (instance == null) {
48   - instance = new SubscriptionManager();
  52 + instance = new RxManager();
49 53 }
50 54 }
51 55 }
... ... @@ -53,79 +57,80 @@ public class SubscriptionManager {
53 57 }
54 58  
55 59 public synchronized void setCurrentDisposables(String TAG) {
  60 + currentClassName = TAG;
56 61 if (null == hashDisposable.get(TAG)) {
57   - currentClassName = TAG;
58 62 hashDisposable.put(TAG, new CompositeDisposable());
59 63 //存放当前class映射
60 64 hashTag.put(hashDisposable.size() - 1, TAG);
61 65 hashTagIndex.put(TAG, hashTag.size() - 1);
62   - Log.d(TAG, "初始化: ");
  66 + logDebug(className, TAG + "初始化订阅映射");
63 67 }
64 68 }
65 69  
66 70 /**
67 71 * 取消订阅事件
68 72 */
69   - public synchronized void cancel(String TAG) {
  73 + public synchronized void cancel(String FLAG) {
70 74 try {
71 75 if (null != hashDisposable && hashDisposable.size() > 0) {
72   - if (null != hashDisposable.get(TAG) && hashDisposable.get(TAG).size() > 0) {
73   - CompositeDisposable mDisposables = hashDisposable.get(TAG);
74   - if (null!=mDisposables&&!mDisposables.isDisposed()) {
75   - Log.e(TAG, "cancel: 解除订阅");
  76 + if (null != hashDisposable.get(FLAG) && hashDisposable.get(FLAG).size() > 0) {
  77 + CompositeDisposable mDisposables = hashDisposable.get(FLAG);
  78 + if (null != mDisposables && !mDisposables.isDisposed()) {
  79 + logDebug(currentClassName, FLAG + "cancel: 解除订阅");
76 80 mDisposables.clear();
77 81 }
78 82 }
79 83 //移除
80   - hashDisposable.remove(TAG);
  84 + hashDisposable.remove(FLAG);
81 85 }
82   - if (null != hashTagIndex.get(TAG)) {
83   - int currentIndex = hashTagIndex.get(TAG);
  86 + if (null != hashTagIndex.get(FLAG)) {
  87 + int currentIndex = hashTagIndex.get(FLAG);
84 88 //移除
85 89 if (null != hashTag.get(currentIndex)) {
86   - Log.e(TAG, "cancel: " + hashTag.get(currentIndex));
  90 + logDebug(className, FLAG + "订阅cancel: " + hashTag.get(currentIndex));
87 91 hashTag.remove(currentIndex);
88 92 }
89   - hashTagIndex.remove(TAG);
  93 + hashTagIndex.remove(FLAG);
90 94 }
91 95 } catch (Exception e) {
92   - Log.d(TAG, "cancel: " + e.getMessage());
  96 + logErr(className, FLAG + "订阅cancel异常: " + e.getMessage());
93 97 }
94 98 }
95 99  
96 100 /**
97 101 * 订阅事件加入到CompositeDisposable容器中
  102 + * 可以不写setCurrentDisposables
98 103 *
99 104 * @param disposable 订阅事件
100 105 */
101   - public synchronized void add(Disposable disposable) {
  106 + public synchronized void add(String FLAG, Disposable disposable) {
  107 + //判断是否已经存在该订阅关系
  108 + if (!TextUtils.isEmpty(FLAG)) {
  109 + setCurrentDisposables(FLAG);
  110 + }
  111 + String tempFlag = "";
  112 + if (TextUtils.isEmpty(FLAG)) {
  113 + tempFlag = currentClassName;
  114 + } else {
  115 + tempFlag = FLAG;
  116 + }
102 117 try {
103 118 if (disposable == null) return;
104 119 //每次去除最新的activity进行存放
105 120 if (null != hashDisposable && hashDisposable.size() > 0) {
106   - if (!TextUtils.isEmpty(currentClassName)) {
107   - if (null != hashDisposable.get(currentClassName)) {
  121 + if (!TextUtils.isEmpty(tempFlag)) {
  122 + if (null != hashDisposable.get(tempFlag)) {
108 123 //存放当前activity对应的订阅
109   - hashDisposable.get(currentClassName).add(disposable);
110   - Log.d(currentClassName, "add: 添加订阅关系" + hashDisposable.size());
  124 + hashDisposable.get(tempFlag).add(disposable);
  125 + logDebug(className, tempFlag + "add: 添加订阅关系" + hashDisposable.get(tempFlag).size());
111 126 }
112 127 }
113 128 }
114 129 } catch (Exception e) {
115   - Log.e("SubscriptionManager", "cancel: " + e.getMessage());
  130 + logErr(className, "cancel: " + e.getMessage());
116 131 }
117 132 }
118 133  
119   -// /**
120   -// * 取消订阅事件
121   -// *
122   -// * @param disposable 订阅事件
123   -// */
124   -// public void cancel(Disposable disposable) {
125   -// if (disposable != null) {
126   -// mDisposables.delete(disposable);
127   -// }
128   -// }
129 134  
130 135 /**
131 136 * 清除容器所有
... ... @@ -148,7 +153,19 @@ public class SubscriptionManager {
148 153 hashTag.clear();
149 154 hashTagIndex.clear();
150 155 } catch (Exception e) {
151   - Log.e("SubscriptionManager", "cancelAll: " + e.getMessage());
  156 + logErr(className, "清除所有订阅cancelAll: " + e.getMessage());
  157 + }
  158 + }
  159 +
  160 + private void logDebug(String tag, String msg) {
  161 + if (BuildConfig.DEBUG) {
  162 + Log.d(tag, msg);
  163 + }
  164 + }
  165 +
  166 + private void logErr(String tag, String msg) {
  167 + if (BuildConfig.DEBUG) {
  168 + Log.e(tag, msg);
152 169 }
153 170 }
154 171 }
... ...
core/base/src/main/java/com/cnlive/core/libs/base/ui/widget/SelectDialog.java
... ... @@ -12,14 +12,16 @@ import android.widget.Button;
12 12 import android.widget.LinearLayout;
13 13 import android.widget.TextView;
14 14  
  15 +import androidx.annotation.ColorRes;
15 16 import androidx.annotation.NonNull;
16 17 import androidx.core.content.ContextCompat;
17 18  
18 19 import com.cnlive.cloud.base.R;
  20 +import com.cnlive.core.libs.base.util.DensityUtils;
19 21  
20 22  
21 23 /**
22   - * 任务编辑对话框
  24 + * 选择对话框
23 25 *
24 26 * @author ShinnyYang
25 27 * @date 2019/3/27 14:11
... ... @@ -51,21 +53,96 @@ public class SelectDialog extends Dialog {
51 53  
52 54 }
53 55  
54   - public void setLeftBtnColor(int textColor) {
55   - if (null != btn_cancel && null != cancelInterface) {
  56 + public SelectDialog(@NonNull Context context, String tipText, String btnCancelText, String btnOkText) {
  57 + super(context, R.style.MyDialog);
  58 + this.context = context;
  59 + view = LayoutInflater.from(context).inflate(R.layout.my_dialog_select, null);
  60 + initView(view);
  61 + layoutParams = new LinearLayout.LayoutParams((int) (getScreenWidth(context) * 0.8), ViewGroup.LayoutParams.WRAP_CONTENT);
  62 + ll_child.setLayoutParams(layoutParams);
  63 +
  64 + tv_dialog_tip.setText(tipText);
  65 + btn_cancel.setText(btnCancelText);
  66 + btn_ok.setText(btnOkText);
  67 +
  68 + }
  69 +
  70 + public SelectDialog(@NonNull Context context, String tipText) {
  71 + super(context, R.style.MyDialog);
  72 + this.context = context;
  73 + view = LayoutInflater.from(context).inflate(R.layout.my_dialog_select, null);
  74 + initView(view);
  75 + layoutParams = new LinearLayout.LayoutParams((int) (getScreenWidth(context) * 0.8), ViewGroup.LayoutParams.WRAP_CONTENT);
  76 + ll_child.setLayoutParams(layoutParams);
  77 +
  78 + tv_dialog_tip.setText(tipText);
  79 + }
  80 +
  81 + public SelectDialog(@NonNull Context context) {
  82 + super(context, R.style.MyDialog);
  83 + this.context = context;
  84 + view = LayoutInflater.from(context).inflate(R.layout.my_dialog_select, null);
  85 + initView(view);
  86 + layoutParams = new LinearLayout.LayoutParams((int) (getScreenWidth(context) * 0.8), ViewGroup.LayoutParams.WRAP_CONTENT);
  87 + ll_child.setLayoutParams(layoutParams);
  88 + }
  89 +
  90 + public void setLeftInterface(DialogInterface cancelInterface) {
  91 + this.cancelInterface = cancelInterface;
  92 + }
  93 +
  94 + public void setRightInterface(DialogInterface okInterface) {
  95 + this.okInterface = okInterface;
  96 + }
  97 +
  98 + public void setLeftText(String text) {
  99 + if (null != btn_cancel) {
  100 + btn_cancel.setText(text);
  101 + }
  102 + }
  103 +
  104 + public void setRightText(String text) {
  105 + if (null != btn_ok) {
  106 + btn_ok.setText(text);
  107 + }
  108 + }
  109 +
  110 + public void setLeftBtnColor(@ColorRes int textColor) {
  111 + if (null != btn_cancel) {
56 112 btn_cancel.setTextColor(ContextCompat.getColor(context, textColor));
57 113 }
58 114 }
59 115  
60   - public void setRightBtnColor(int textColor) {
61   - if (null != btn_ok && null != cancelInterface) {
  116 + public void setRightBtnColor(@ColorRes int textColor) {
  117 + if (null != btn_ok) {
62 118 btn_ok.setTextColor(ContextCompat.getColor(context, textColor));
63 119 }
64 120 }
65 121  
66   - public void setTipTextStyle(Typeface typeface){
  122 + public void setTipTextStyle(Typeface typeface) {
67 123 tv_dialog_tip.setTypeface(typeface);
68 124 }
  125 +
  126 + public void setTipGravity(int gravity) {
  127 + tv_dialog_tip.setGravity(gravity);
  128 + }
  129 +
  130 + public void setTipTextSize(float textSize) {
  131 + tv_dialog_tip.setTextSize(textSize);
  132 + }
  133 +
  134 + public void setTipTextPaddingLeft(float dp){
  135 + tv_dialog_tip.setPadding(DensityUtils.dp2px(dp),0,0,0);
  136 + }
  137 +
  138 + public void setLeftTextStyle(Typeface typeface) {
  139 + btn_cancel.setTypeface(typeface);
  140 + }
  141 +
  142 + public void setRightTextStyle(Typeface typeface) {
  143 + btn_ok.setTypeface(typeface);
  144 + }
  145 +
69 146 public void setTipMessage(String message) {
70 147 tv_dialog_tip.setText(message);
71 148 }
... ... @@ -79,8 +156,6 @@ public class SelectDialog extends Dialog {
79 156 @Override
80 157 protected void onCreate(Bundle savedInstanceState) {
81 158 super.onCreate(savedInstanceState);
82   -
83   -
84 159 //显示视图
85 160 this.setContentView(view);
86 161 }
... ... @@ -93,14 +168,17 @@ public class SelectDialog extends Dialog {
93 168 btn_cancel.setOnClickListener(new View.OnClickListener() {
94 169 @Override
95 170 public void onClick(View view) {
96   - cancelInterface.onClick(SelectDialog.this);
  171 + if (null != cancelInterface) {
  172 + cancelInterface.onClick(SelectDialog.this);
  173 + }
97 174 }
98 175 });
99 176 btn_ok.setOnClickListener(new View.OnClickListener() {
100 177 @Override
101 178 public void onClick(View view) {
102   -
103   - okInterface.onClick(SelectDialog.this);
  179 + if (null != okInterface) {
  180 + okInterface.onClick(SelectDialog.this);
  181 + }
104 182 }
105 183 });
106 184 }
... ...
core/base/src/main/java/com/cnlive/core/libs/base/util/AppManager.java
... ... @@ -6,6 +6,7 @@ import android.content.Context;
6 6  
7 7 import com.cnlive.core.libs.base.frame.activity.BaseActivity;
8 8  
  9 +import java.lang.ref.WeakReference;
9 10 import java.util.Arrays;
10 11 import java.util.Collections;
11 12 import java.util.Iterator;
... ... @@ -24,6 +25,7 @@ public class AppManager {
24 25 private static OnActivityStatusChangeListener onActivityStatusChangeListener;
25 26 private static Stack<BaseActivity> activityStack;
26 27 private static AppManager instance;
  28 + private static WeakReference<BaseActivity> activeActivity;
27 29  
28 30 private AppManager() {
29 31 }
... ... @@ -55,6 +57,9 @@ public class AppManager {
55 57 * 获取当前Activity(堆栈中最后一个压入的)
56 58 */
57 59 public BaseActivity currentActivity() {
  60 + if (activityStack == null) {
  61 + return null;
  62 + }
58 63 BaseActivity activity = null;
59 64 if (!activityStack.empty()) {
60 65 activity = activityStack.lastElement();
... ... @@ -63,9 +68,21 @@ public class AppManager {
63 68 }
64 69  
65 70 /**
  71 + * 获取当前处于活动状态的Activity
  72 + *
  73 + * @return
  74 + */
  75 + public BaseActivity getActiveActivity() {
  76 + return activeActivity.get();
  77 + }
  78 +
  79 + /**
66 80 * 结束当前Activity(堆栈中最后一个压入的)
67 81 */
68 82 public void finishActivity() {
  83 + if (activityStack == null) {
  84 + return;
  85 + }
69 86 BaseActivity activity = activityStack.lastElement();
70 87 killActivity(activity);
71 88 }
... ... @@ -74,7 +91,7 @@ public class AppManager {
74 91 * 结束指定的Activity
75 92 */
76 93 public void killActivity(BaseActivity activity) {
77   - if (activity != null) {
  94 + if (activity != null && activityStack != null) {
78 95 if (activity != null) {
79 96 activity.finishActivity();
80 97 }
... ... @@ -87,6 +104,9 @@ public class AppManager {
87 104 * 结束指定类名的Activity
88 105 */
89 106 public void killActivity(Class<?> cls) {
  107 + if (activityStack == null) {
  108 + return;
  109 + }
90 110 Iterator<BaseActivity> iterator = activityStack.iterator();
91 111 BaseActivity temp = null;
92 112 while (iterator.hasNext()) {
... ... @@ -133,14 +153,18 @@ public class AppManager {
133 153 }
134 154  
135 155 public void deleteActivity(BaseActivity activity) {
136   - if (activity != null) {
137   - activityStack.remove(activity);
138   - if (onActivityStatusChangeListener != null) {
139   - onActivityStatusChangeListener.onActivityDestroy(activity);
140   - if (activityStack.isEmpty()) {
141   - onActivityStatusChangeListener.onAllActivityClose();
  156 + try {
  157 + if (activity != null && activityStack != null) {
  158 + activityStack.remove(activity);
  159 + if (onActivityStatusChangeListener != null) {
  160 + onActivityStatusChangeListener.onActivityDestroy(activity);
  161 + if (activityStack.isEmpty()) {
  162 + onActivityStatusChangeListener.onAllActivityClose();
  163 + }
142 164 }
143 165 }
  166 + } catch (Exception e) {
  167 +
144 168 }
145 169 }
146 170  
... ... @@ -174,6 +198,9 @@ public class AppManager {
174 198 * @param cls activity
175 199 */
176 200 public BaseActivity getActivityInstance(Class<?> cls) {
  201 + if (activityStack == null) {
  202 + return null;
  203 + }
177 204 if (!activityStack.empty()) {
178 205 Stack<BaseActivity> reverseList = new Stack<BaseActivity>();
179 206 reverseList.addAll(activityStack);
... ... @@ -216,4 +243,8 @@ public class AppManager {
216 243  
217 244 void onAllActivityClose();
218 245 }
  246 +
  247 + public static void setActiveActivity(BaseActivity activeActivity) {
  248 + AppManager.activeActivity = new WeakReference<>(activeActivity);
  249 + }
219 250 }
... ...
core/base/src/main/java/com/cnlive/core/libs/base/util/BaseHelpUtil.java 0 → 100644
  1 +package com.cnlive.core.libs.base.util;
  2 +
  3 +import android.content.Context;
  4 +import android.graphics.drawable.Drawable;
  5 +import android.text.TextUtils;
  6 +
  7 +import androidx.annotation.ColorRes;
  8 +import androidx.annotation.DrawableRes;
  9 +import androidx.annotation.StringRes;
  10 +
  11 +/*
  12 + *@date:2020/4/11 12:11
  13 + *@author:杨帅
  14 + */public class BaseHelpUtil {
  15 + /**
  16 + * 获取资源颜色
  17 + *
  18 + * @param colorId
  19 + * @param context
  20 + * @return
  21 + */
  22 + public static int getResourceColor(Context context, @ColorRes int colorId) {
  23 + return context.getResources().getColor(colorId);
  24 + }
  25 +
  26 + /**
  27 + * 获取资源
  28 + *
  29 + * @param drawableId
  30 + * @param context
  31 + * @return
  32 + */
  33 + public static Drawable getResourceDrawable(Context context, @DrawableRes int drawableId) {
  34 + return context.getResources().getDrawable(drawableId);
  35 + }
  36 +
  37 + /**
  38 + * 获取资源字符串
  39 + *
  40 + * @param stringId
  41 + * @param context
  42 + * @return
  43 + */
  44 + public static String getResourceStr(Context context, @StringRes int stringId) {
  45 + return context.getResources().getString(stringId);
  46 + }
  47 +
  48 + public static boolean isNull(Object... os) {
  49 +
  50 + if (null == os) {
  51 + return true;
  52 + }
  53 + for (Object o : os) {
  54 + if (null == o) {
  55 + return true;
  56 + }
  57 + if (o instanceof String) {
  58 + String s = (String) o;
  59 + if (TextUtils.isEmpty(s) || s.trim().isEmpty() || "null".equals(s) || "(null)".equals(s))
  60 + return true;
  61 + }
  62 + }
  63 + return false;
  64 + }
  65 +}
... ...
core/base/src/main/java/com/cnlive/core/libs/base/util/GlobalLifeCircleListener.java 0 → 100644
  1 +package com.cnlive.core.libs.base.util;
  2 +
  3 +
  4 +import com.cnlive.core.libs.base.frame.activity.BaseActivity;
  5 +
  6 +/**
  7 + * Author: @Kongzue
  8 + * Github: https://github.com/kongzue/
  9 + * Homepage: http://kongzue.com/
  10 + * Mail: myzcxhh@live.cn
  11 + * CreateTime: 2018/9/1 15:44
  12 + */
  13 +public abstract class GlobalLifeCircleListener {
  14 +
  15 + public abstract void onCreate(BaseActivity me, String className);
  16 +
  17 + public abstract void onResume(BaseActivity me, String className);
  18 +
  19 + public abstract void onPause(BaseActivity me, String className);
  20 +
  21 + public abstract void onDestroy(BaseActivity me, String className);
  22 +
  23 + public void windowFocus(BaseActivity me, String className, boolean hasFocus) {
  24 +
  25 + }
  26 +}
... ...
core/base/src/main/java/com/cnlive/core/libs/base/util/LifeCircleListener.java 0 → 100644
  1 +package com.cnlive.core.libs.base.util;
  2 +
  3 +/**
  4 + * Author: @Kongzue
  5 + * Github: https://github.com/kongzue/
  6 + * Homepage: http://kongzue.com/
  7 + * Mail: myzcxhh@live.cn
  8 + * CreateTime: 2018/8/1 01:36
  9 + */
  10 +public interface LifeCircleListener {
  11 +
  12 + void onCreate();
  13 +
  14 + void onResume();
  15 +
  16 + void onPause();
  17 +
  18 + void onDestroy();
  19 +
  20 +}
... ...
core/base/src/main/java/com/me/yokeyword/fragmentation/SupportFragmentDelegate.java
... ... @@ -57,7 +57,9 @@ public class SupportFragmentDelegate {
57 57 private ISupportActivity mSupport;
58 58 boolean mAnimByActivity = true;
59 59 EnterAnimListener mEnterAnimListener;
60   -
  60 + //fragment根布局是否可点击,多用于多个fragment叠加在一个activity,是否可点击下层的fragment,默认是可以点击下层的
  61 + private boolean isRootViewCanClickable = false;
  62 + private View rootView = null;
61 63 private boolean mRootViewClickable;
62 64  
63 65 public SupportFragmentDelegate(ISupportFragment support) {
... ... @@ -187,11 +189,15 @@ public class SupportFragmentDelegate {
187 189 public void onActivityCreated(@Nullable Bundle savedInstanceState) {
188 190 getVisibleDelegate().onActivityCreated(savedInstanceState);
189 191  
190   - View view = mFragment.getView();
191   - if (view != null) {
192   - mRootViewClickable = view.isClickable();
193   - view.setClickable(true);
194   - setBackground(view);
  192 + rootView = mFragment.getView();
  193 + if (rootView != null) {
  194 + //只有设置为可点击的时候才设置
  195 + if (isRootViewCanClickable) {
  196 + //解决多个fragment点击无响应的问题
  197 + rootView.setClickable(isRootViewCanClickable);
  198 + }
  199 + setBackground(rootView);
  200 + mRootViewClickable = rootView.isClickable();
195 201 }
196 202  
197 203  
... ... @@ -210,6 +216,32 @@ public class SupportFragmentDelegate {
210 216 }
211 217 }
212 218  
  219 + /**
  220 + * 获取fragment根布局是否可以点击
  221 + * 如设置可点击,那么,多个fragment使用时,需要注意层级叠加顺序
  222 + * 默认为底层不可点击
  223 + *
  224 + * @return
  225 + */
  226 + private boolean getRootViewCanClickable() {
  227 + return isRootViewCanClickable;
  228 + }
  229 +
  230 + /**
  231 + * 设置底层view是否可点击
  232 + *
  233 + * @param isclick
  234 + */
  235 + public void setFragmentRootViewCanClickable(boolean isclick) {
  236 + isRootViewCanClickable = isclick;
  237 + if (rootView != null) {
  238 + mRootViewClickable = isclick;
  239 + if (isclick) {
  240 + rootView.setClickable(isclick);
  241 + }
  242 + }
  243 + }
  244 +
213 245 public void onResume() {
214 246 getVisibleDelegate().onResume();
215 247 }
... ... @@ -359,9 +391,9 @@ public class SupportFragmentDelegate {
359 391 }
360 392  
361 393 /**
362   - * 类似 {@link Activity#onActivityResult(int, int, Intent)}
  394 + * 类似 {@link Activity onActivityResult(int, int, Intent)}
363 395 * <p>
364   - * Similar to {@link Activity#onActivityResult(int, int, Intent)}
  396 + * Similar to {@link Activity onActivityResult(int, int, Intent)}
365 397 *
366 398 * @see #startForResult(ISupportFragment, int)
367 399 */
... ... @@ -370,9 +402,9 @@ public class SupportFragmentDelegate {
370 402  
371 403 /**
372 404 * 在start(TargetFragment,LaunchMode)时,启动模式为SingleTask/SingleTop, 回调TargetFragment的该方法
373   - * 类似 {@link Activity#onNewIntent(Intent)}
  405 + * 类似 {@link Activity onNewIntent(Intent)}
374 406 * <p>
375   - * Similar to {@link Activity#onNewIntent(Intent)}
  407 + * Similar to {@link Activity onNewIntent(Intent)}
376 408 *
377 409 * @param args putNewBundle(Bundle newBundle)
378 410 * @see #start(ISupportFragment, int)
... ...
core/dentity_verfication/.gitignore deleted 100644 → 0
1   -/build
core/dentity_verfication/build.gradle deleted 100644 → 0
1   -apply plugin: 'com.android.library'
2   -
3   -android {
4   -
5   -}
6   -
7   -dependencies {
8   - implementation fileTree(include: ['*.jar'], dir: 'libs')
9   - implementation 'androidx.appcompat:appcompat:1.0.2'
10   - implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
11   - implementation 'androidx.legacy:legacy-support-v4:1.0.0'
12   - testImplementation 'junit:junit:4.12'
13   - androidTestImplementation 'androidx.test.ext:junit:1.1.1'
14   - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
15   - implementation "com.cnlive.libs:mediapicker:$rootProject.libMediaPicker"
16   - implementation files('libs/license.jar')
17   -}
core/dentity_verfication/consumer-rules.pro deleted 100644 → 0
core/dentity_verfication/libs/license.jar deleted 100644 → 0
No preview for this file type
core/dentity_verfication/libs/ocr-sdk.jar deleted 100644 → 0
No preview for this file type
core/dentity_verfication/proguard-rules.pro deleted 100644 → 0
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
core/dentity_verfication/src/main/AndroidManifest.xml deleted 100644 → 0
1   -<?xml version="1.0" encoding="utf-8"?>
2   -<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3   - package="com.cnlive.core.people_verfication">
4   -
5   - <uses-permission android:name="android.permission.CAMERA" />
6   - <uses-permission android:name="android.permission.INTERNET" />
7   - <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
8   - <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
9   -
10   - <uses-feature android:name="android.hardware.camera2.full" />
11   - <uses-feature android:name="android.hardware.camera" />
12   - <uses-feature android:name="android.hardware.camera.autofocus" />
13   -
14   - <application>
15   - <activity android:name=".activity.PersonCheckActivity"></activity>
16   - <activity android:name=".activity.CheckResultActivity" />
17   - <activity android:name="com.cnlive.core.company_verfication.ui.activity.FillInCompanyDataActivity"></activity>
18   - <activity android:name="com.cnlive.core.company_verfication.ui.activity.SelectCompanyDataActivity" />
19   - <activity android:name=".activity.TakeIdentityPictureActivity" />
20   - <activity
21   - android:name="com.cnlive.core.ocr.ui.camera.CameraActivity"
22   - android:configChanges="screenSize|orientation"
23   - android:launchMode="singleTop"
24   - android:screenOrientation="portrait"
25   - android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" />
26   - </application>
27   -
28   -</manifest>
29 0 \ No newline at end of file
core/dentity_verfication/src/main/assets/models/integrity_model_secret.bin deleted 100644 → 0
No preview for this file type
core/dentity_verfication/src/main/assets/models/quality_model_secret.bin deleted 100644 → 0
No preview for this file type
core/dentity_verfication/src/main/java/com/cnlive/core/company_verfication/ui/activity/FillInCompanyDataActivity.java deleted 100644 → 0
1   -package com.cnlive.core.company_verfication.ui.activity;
2   -
3   -import android.content.Context;
4   -import android.content.Intent;
5   -
6   -import com.cnlive.core.company_verfication.ui.fragment.FillInCompanyDataFragment;
7   -import com.cnlive.core.libs.base.frame.activity.BaseActivity;
8   -import com.cnlive.core.people_verfication.R;
9   -import com.cnlive.core.people_verfication.activity.CheckResultActivity;
10   -
11   -public class FillInCompanyDataActivity extends BaseActivity {
12   -
13   - public static void startActivity(Context context, String userId){
14   - Intent intent = new Intent(context, FillInCompanyDataActivity.class);
15   - intent.putExtra("userId",userId);
16   - context.startActivity(intent);
17   - }
18   - @Override
19   - protected void initView() {
20   - loadRootFragment(new FillInCompanyDataFragment());
21   - }
22   -}
core/dentity_verfication/src/main/java/com/cnlive/core/company_verfication/ui/activity/SelectCompanyDataActivity.java deleted 100644 → 0
1   -package com.cnlive.core.company_verfication.ui.activity;
2   -
3   -import androidx.databinding.ViewDataBinding;
4   -import androidx.recyclerview.widget.LinearLayoutManager;
5   -
6   -import com.cnlive.core.company_verfication.ui.adapter.CompanyDataAdapter;
7   -import com.cnlive.core.company_verfication.ui.fragment.SelectCompanyDataFragment;
8   -import com.cnlive.core.libs.base.frame.activity.BaseActivity;
9   -import com.cnlive.core.people_verfication.R;
10   -import com.cnlive.core.people_verfication.databinding.FragmentFillInCompanyDataBinding;
11   -
12   -import java.util.ArrayList;
13   -import java.util.List;
14   -
15   -public class SelectCompanyDataActivity extends BaseActivity {
16   -
17   - @Override
18   - protected void initView() {
19   - loadRootFragment(new SelectCompanyDataFragment());
20   - }
21   -}
core/dentity_verfication/src/main/java/com/cnlive/core/company_verfication/ui/adapter/CompanyDataAdapter.java deleted 100644 → 0
1   -package com.cnlive.core.company_verfication.ui.adapter;
2   -
3   -import android.content.Context;
4   -import android.view.LayoutInflater;
5   -import android.view.View;
6   -import android.view.ViewGroup;
7   -import android.widget.TextView;
8   -
9   -import androidx.annotation.NonNull;
10   -import androidx.databinding.DataBindingUtil;
11   -import androidx.recyclerview.widget.RecyclerView;
12   -
13   -import com.cnlive.core.people_verfication.R;
14   -import com.cnlive.core.people_verfication.databinding.ItemCompanyDateBinding;
15   -
16   -import java.util.List;
17   -
18   -public class CompanyDataAdapter extends RecyclerView.Adapter {
19   - private Context context;
20   - private List<String> data;
21   -
22   - public CompanyDataAdapter(Context context, List<String> data) {
23   - this.context = context;
24   - this.data = data;
25   - }
26   -
27   - @NonNull
28   - @Override
29   - public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
30   - LayoutInflater inflater = LayoutInflater.from(context);
31   - ItemCompanyDateBinding binding = DataBindingUtil.inflate(inflater, R.layout.item_company_date, parent, false);
32   - return new MyViewHolder(binding);
33   - }
34   -
35   - @Override
36   - public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
37   - ItemCompanyDateBinding binding = ((MyViewHolder) holder).binding;
38   - binding.includeAccountChild.llRoot.getBaselineAlignedChildIndex();
39   - binding.includeAccountChild.llChildAccountDelete.setVisibility(View.GONE);
40   - }
41   -
42   - @Override
43   - public int getItemCount() {
44   - return data.size();
45   - }
46   -
47   - private class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
48   - private ItemCompanyDateBinding binding;
49   -
50   - public MyViewHolder(@NonNull ItemCompanyDateBinding binding) {
51   - super(binding.getRoot());
52   - this.binding = binding;
53   - binding.includeAddCircle.btnAddChildCircle.setOnClickListener(this);
54   - binding.includeAddChildAccount.btnAddChildAccount.setOnClickListener(this);
55   - }
56   -
57   -
58   - @Override
59   - public void onClick(View v) {
60   - //添加圈子
61   - if (v.getId() == R.id.btn_addChildCircle) {
62   - View child = LayoutInflater.from(context).inflate(R.layout.item_company_data_type_circle_child, null);
63   - binding.includeCircleChild.llRoot.addView(child);
64   - }
65   - //添加群组
66   - else if (v.getId() == R.id.btn_addChildAccount) {
67   - View child = LayoutInflater.from(context).inflate(R.layout.item_company_data_type_child_account, null);
68   - int index=binding.includeAccountChild.llRoot.getChildCount() - 1;
69   - binding.includeAccountChild.llRoot.addView(child, index);
70   - TextView textView = child.findViewById(R.id.ll_child_account_delete);
71   - textView.setVisibility(View.VISIBLE);
72   - textView.setOnClickListener(this);
73   - textView.setTag(child);
74   -// textView.setOnClickListener(new View.OnClickListener() {
75   -// @Override
76   -// public void onClick(View v) {
77   -// binding.includeAccountChild.llRoot.removeView(child);
78   -// }
79   -// });
80   - } else if (v.getId() == R.id.ll_child_account_delete) {
81   - if (null!=v&&null!=v.getTag()){
82   - View child= (View) v.getTag();
83   - //获取当前子类
84   - binding.includeAccountChild.llRoot.removeView(child);
85   - }
86   -
87   - }
88   - }
89   - }
90   -}
core/dentity_verfication/src/main/java/com/cnlive/core/company_verfication/ui/adapter/CompanyItemDataAdapter.java deleted 100644 → 0
1   -package com.cnlive.core.company_verfication.ui.adapter;
2   -
3   -import android.content.Context;
4   -import android.view.LayoutInflater;
5   -import android.view.View;
6   -import android.view.ViewGroup;
7   -import android.widget.TextView;
8   -
9   -import com.cnlive.core.company_verfication.ui.model.CompanyItemData;
10   -import com.cnlive.core.people_verfication.R;
11   -import com.cnlive.core.people_verfication.databinding.ItemCompanyDataTypeAddChildAccountBinding;
12   -import com.cnlive.core.people_verfication.databinding.ItemCompanyDataTypeAddCircleBinding;
13   -import com.cnlive.core.people_verfication.databinding.ItemCompanyDataTypeAddOrganizationBinding;
14   -import com.cnlive.core.people_verfication.databinding.ItemCompanyDataTypeChildAccountBinding;
15   -import com.cnlive.core.people_verfication.databinding.ItemCompanyDataTypeCircleChildBinding;
16   -import com.cnlive.core.people_verfication.databinding.ItemCompanyDataTypeOrganizationBinding;
17   -
18   -import java.util.List;
19   -
20   -import androidx.annotation.NonNull;
21   -import androidx.databinding.DataBindingUtil;
22   -import androidx.recyclerview.widget.RecyclerView;
23   -
24   -/*
25   - *@date:2020/4/7 16:29
26   - *@author:杨帅
27   - */public class CompanyItemDataAdapter extends RecyclerView.Adapter {
28   - private Context context;
29   - private List<CompanyItemData> dataList;
30   - private OnClickListener onClickListener;
31   -
32   - public CompanyItemDataAdapter(Context context, List<CompanyItemData> dataList) {
33   - this.context = context;
34   - this.dataList = dataList;
35   - }
36   -
37   - public void setOnClickListener(OnClickListener onClickListener) {
38   - this.onClickListener = onClickListener;
39   - }
40   -
41   - @NonNull
42   - @Override
43   - public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
44   - switch (viewType) {
45   - case CompanyItemData.TYPE_ORGANIZATION:
46   - ItemCompanyDataTypeOrganizationBinding organizationBinding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_company_data_type_organization, parent, false);
47   - OrganizactionHolder organizactionHolder = new OrganizactionHolder(organizationBinding);
48   - return organizactionHolder;
49   - case CompanyItemData.TYPE_CIRCLE:
50   - ItemCompanyDataTypeCircleChildBinding circleChildBinding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_company_data_type_circle_child, parent, false);
51   - CircleHolder circleHolder = new CircleHolder(circleChildBinding);
52   - return circleHolder;
53   - case CompanyItemData.TYPE_ADD_CIRCLE:
54   - ItemCompanyDataTypeAddCircleBinding addCircleBinding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_company_data_type_add_circle, parent, false);
55   - AddCircleHolder addCircleHolder = new AddCircleHolder(addCircleBinding);
56   - return addCircleHolder;
57   - case CompanyItemData.TYPE_CHILD_ACCOUNT:
58   - ItemCompanyDataTypeChildAccountBinding childAccountBinding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_company_data_type_child_account, parent, false);
59   - ChildAccountHolder childAccountHolder = new ChildAccountHolder(childAccountBinding);
60   - return childAccountHolder;
61   - case CompanyItemData.TYPE_ADD_CHILD_ACCOUNT:
62   - ItemCompanyDataTypeAddChildAccountBinding addChildAccountBinding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_company_data_type_add_child_account, parent, false);
63   - AddChildAccountHolder addChildAccountHolder = new AddChildAccountHolder(addChildAccountBinding);
64   - return addChildAccountHolder;
65   - case CompanyItemData.TYPE_ADD_ORGANIZATION:
66   - ItemCompanyDataTypeAddOrganizationBinding addOrganizationBinding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_company_data_type_add_organization, parent, false);
67   - AddOrganizactionHolder addOrganizactionHolder = new AddOrganizactionHolder(addOrganizationBinding);
68   - return addOrganizactionHolder;
69   - }
70   - return null;
71   - }
72   -
73   - @Override
74   - public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
75   - switch (getItemViewType(position)) {
76   - case CompanyItemData.TYPE_ORGANIZATION:
77   - OrganizactionHolder organizactionHolder = (OrganizactionHolder) holder;
78   - organizactionHolder.binding.llTopLine.setVisibility(dataList.get(position).isShowTopLine() ? View.VISIBLE : View.GONE);
79   - organizactionHolder.binding.ivOrganizationDelete.setVisibility(dataList.get(position).isShowOrganizactionDelete() ? View.VISIBLE : View.GONE);
80   -
81   - break;
82   - case CompanyItemData.TYPE_CIRCLE:
83   - CircleHolder circleHolder = (CircleHolder) holder;
84   - circleHolder.binding.llCircleDelete.setVisibility(dataList.get(position).isShowDelete() ? View.VISIBLE : View.GONE);
85   - break;
86   - case CompanyItemData.TYPE_ADD_CIRCLE:
87   - break;
88   - case CompanyItemData.TYPE_CHILD_ACCOUNT:
89   - ChildAccountHolder childAccountHolder = (ChildAccountHolder) holder;
90   - childAccountHolder.binding.llChildAccountDelete.setVisibility(dataList.get(position).isShowDelete() ? View.VISIBLE : View.GONE);
91   - break;
92   - case CompanyItemData.TYPE_ADD_CHILD_ACCOUNT:
93   - break;
94   - case CompanyItemData.TYPE_ADD_ORGANIZATION:
95   -
96   - break;
97   - }
98   - }
99   -
100   - @Override
101   - public int getItemCount() {
102   - return dataList.size();
103   - }
104   -
105   - @Override
106   - public int getItemViewType(int position) {
107   - return dataList.get(position).getType();
108   - }
109   -
110   -
111   - /**
112   - * 所属机构
113   - */
114   - public class OrganizactionHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
115   - private ItemCompanyDataTypeOrganizationBinding binding;
116   -
117   - public OrganizactionHolder(@NonNull ItemCompanyDataTypeOrganizationBinding binding) {
118   - super(binding.getRoot());
119   - this.binding = binding;
120   - binding.ivOrganizationDelete.setOnClickListener(this);
121   - binding.tvOrganization.setOnClickListener(this);
122   - }
123   -
124   - @Override
125   - public void onClick(View v) {
126   - //删除机构
127   - if (v.getId() == R.id.iv_organization_delete) {
128   - //获取当前所在逻辑位置
129   - int logicPosition = dataList.get(getLayoutPosition()).getLogicPosition();
130   - deleteLogicItem(logicPosition);
131   - dataList.add(new CompanyItemData(CompanyItemData.TYPE_ADD_ORGANIZATION, dataList.get(dataList.size() - 1).getLogicPosition()));
132   - notifyDataSetChanged();
133   - }
134   - //选中机构
135   - else if (v.getId() == R.id.tv_organization) {
136   - if (null != onClickListener) {
137   - onClickListener.onClick(binding.tvOrganization);
138   - }
139   - }
140   - }
141   - }
142   -
143   - private void deleteLogicItem(int logicPosition) {
144   - if (dataList.size() == 0) {
145   - return;
146   - }
147   - for (int i = dataList.size() - 1; i >= 0; i--) {
148   - if (dataList.get(i).getLogicPosition() == logicPosition) {
149   - dataList.remove(i);
150   - }
151   - }
152   - }
153   -
154   - /**
155   - * 所属机构圈子
156   - */
157   - public class CircleHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
158   - private ItemCompanyDataTypeCircleChildBinding binding;
159   -
160   - public CircleHolder(@NonNull ItemCompanyDataTypeCircleChildBinding binding) {
161   - super(binding.getRoot());
162   - this.binding = binding;
163   - binding.llCircleDelete.setOnClickListener(this);
164   - }
165   -
166   - @Override
167   - public void onClick(View v) {
168   - if (v.getId() == R.id.ll_circle_delete) {
169   - int removeIndex = getLayoutPosition();
170   - dataList.remove(removeIndex);
171   - notifyItemRemoved(removeIndex);
172   - }
173   - }
174   - }
175   -
176   - /**
177   - * 添加圈子
178   - */
179   - public class AddCircleHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
180   - private ItemCompanyDataTypeAddCircleBinding binding;
181   -
182   - public AddCircleHolder(@NonNull ItemCompanyDataTypeAddCircleBinding binding) {
183   - super(binding.getRoot());
184   - this.binding = binding;
185   - binding.btnAddChildCircle.setOnClickListener(this);
186   - }
187   -
188   - @Override
189   - public void onClick(View v) {
190   - if (v.getId() == R.id.btn_addChildCircle) {
191   - //获取当前逻辑上的数量
192   - int logicSize = dataList.get(getLayoutPosition()).getLogicPosition();
193   - dataList.add(getLayoutPosition(), new CompanyItemData(CompanyItemData.TYPE_CIRCLE, logicSize, true));
194   - notifyItemInserted(getLayoutPosition() + 1);
195   - }
196   - }
197   - }
198   -
199   - /**
200   - * 所属子账号
201   - */
202   - public class ChildAccountHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
203   - private ItemCompanyDataTypeChildAccountBinding binding;
204   -
205   - public ChildAccountHolder(@NonNull ItemCompanyDataTypeChildAccountBinding binding) {
206   - super(binding.getRoot());
207   - this.binding = binding;
208   - binding.llChildAccountDelete.setOnClickListener(this);
209   - }
210   -
211   - @Override
212   - public void onClick(View v) {
213   - if (v.getId() == R.id.ll_child_account_delete) {
214   - int removeIndex = getLayoutPosition();
215   - dataList.remove(removeIndex);
216   - notifyItemRemoved(removeIndex);
217   -
218   - }
219   - }
220   - }
221   -
222   - /**
223   - * 添加子账号
224   - */
225   - public class AddChildAccountHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
226   - private ItemCompanyDataTypeAddChildAccountBinding binding;
227   -
228   - public AddChildAccountHolder(@NonNull ItemCompanyDataTypeAddChildAccountBinding binding) {
229   - super(binding.getRoot());
230   - this.binding = binding;
231   - binding.btnAddChildAccount.setOnClickListener(this);
232   - }
233   -
234   - @Override
235   - public void onClick(View v) {
236   - if (v.getId() == R.id.btn_addChildAccount) {
237   - //获取当前逻辑上的数量
238   - int logicSize = dataList.get(getLayoutPosition()).getLogicPosition();
239   - dataList.add(getAdapterPosition(), new CompanyItemData(CompanyItemData.TYPE_CHILD_ACCOUNT, logicSize, true));
240   - notifyItemInserted(getLayoutPosition() + 1);
241   -
242   - }
243   - }
244   - }
245   -
246   - /**
247   - * 添加机构
248   - */
249   - public class AddOrganizactionHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
250   - private ItemCompanyDataTypeAddOrganizationBinding binding;
251   -
252   - public AddOrganizactionHolder(@NonNull ItemCompanyDataTypeAddOrganizationBinding binding) {
253   - super(binding.getRoot());
254   - this.binding = binding;
255   - binding.btnAddOrganization.setOnClickListener(this);
256   - }
257   -
258   - @Override
259   - public void onClick(View v) {
260   - if (v.getId() == R.id.btn_addOrganization) {
261   - //获取当前逻辑上的数量
262   - int logicSize = dataList.get(getLayoutPosition()).getLogicPosition();
263   - int selectIndex = getLayoutPosition();
264   - dataList.remove(dataList.size() - 1);
265   - dataList.add(new CompanyItemData(CompanyItemData.TYPE_ORGANIZATION, logicSize + 1, true, true));
266   - dataList.add(new CompanyItemData(CompanyItemData.TYPE_CIRCLE, logicSize + 1));
267   - dataList.add(new CompanyItemData(CompanyItemData.TYPE_ADD_CIRCLE, logicSize + 1));
268   - dataList.add(new CompanyItemData(CompanyItemData.TYPE_CHILD_ACCOUNT, logicSize + 1));
269   - dataList.add(new CompanyItemData(CompanyItemData.TYPE_ADD_CHILD_ACCOUNT, logicSize + 1));
270   - dataList.add(new CompanyItemData(CompanyItemData.TYPE_ADD_ORGANIZATION, logicSize + 1));
271   - notifyItemInserted(selectIndex);
272   - }
273   - }
274   - }
275   -
276   - public interface OnClickListener {
277   - void onClick(TextView textView);
278   - }
279   -}
core/dentity_verfication/src/main/java/com/cnlive/core/company_verfication/ui/fragment/BottomSheetDialog.java deleted 100644 → 0
1   -package com.cnlive.core.company_verfication.ui.fragment;
2   -
3   -import android.os.Bundle;
4   -import android.view.LayoutInflater;
5   -import android.view.View;
6   -import android.view.ViewGroup;
7   -
8   -import androidx.annotation.NonNull;
9   -import androidx.annotation.Nullable;
10   -
11   -import com.cnlive.core.people_verfication.R;
12   -import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
13   -
14   -public class BottomSheetDialog extends BottomSheetDialogFragment {
15   - @Nullable
16   - @Override
17   - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
18   -
19   - return inflater.inflate(R.layout.fragment_bottom, container, false);
20   - }
21   -
22   - @Override
23   - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
24   - super.onViewCreated(view, savedInstanceState);
25   -
26   -
27   - }
28   -}
29 0 \ No newline at end of file
core/dentity_verfication/src/main/java/com/cnlive/core/company_verfication/ui/fragment/FillInCompanyDataFragment.java deleted 100644 → 0
1   -package com.cnlive.core.company_verfication.ui.fragment;
2   -
3   -import android.os.Bundle;
4   -import android.view.View;
5   -
6   -import com.cnlive.core.libs.base.frame.fragment.BaseFragment;
7   -import com.cnlive.core.people_verfication.R;
8   -import com.cnlive.core.people_verfication.databinding.FragmentFillInCompanyDataBinding;
9   -
10   -import androidx.databinding.ViewDataBinding;
11   -
12   -/*
13   - *@date:2020/4/7 14:50
14   - *@author:杨帅
15   - */public class FillInCompanyDataFragment extends BaseFragment {
16   - private FragmentFillInCompanyDataBinding binding;
17   -
18   - public static FillInCompanyDataFragment newInstance(String userId) {
19   - FillInCompanyDataFragment fragment = new FillInCompanyDataFragment();
20   - Bundle args = new Bundle();
21   - args.putString("userId", userId);
22   - fragment.setArguments(args);
23   - return fragment;
24   - }
25   -
26   - @Override
27   - protected int getBindLayoutId() {
28   - return R.layout.fragment_fill_in_company_data;
29   - }
30   -
31   - @Override
32   - protected void initBindingLayoutData(ViewDataBinding baseBinding) {
33   - super.initBindingLayoutData(baseBinding);
34   - binding = (FragmentFillInCompanyDataBinding) baseBinding;
35   - }
36   -
37   - @Override
38   - protected void initView() {
39   - showDefaultWhiteStatusBar();
40   - binding.topbar.setTitle("填写公司信息");
41   - binding.topbar.addLeftImageButton(R.drawable.icon_verficat_back,R.id.back_btn).setOnClickListener(new View.OnClickListener() {
42   - @Override
43   - public void onClick(View v) {
44   - me.finish();
45   - }
46   - });
47   - }
48   -}
core/dentity_verfication/src/main/java/com/cnlive/core/company_verfication/ui/fragment/SelectCompanyDataFragment.java deleted 100644 → 0
1   -package com.cnlive.core.company_verfication.ui.fragment;
2   -
3   -import android.os.Bundle;
4   -import android.view.View;
5   -import android.widget.TextView;
6   -
7   -import com.cnlive.core.company_verfication.ui.adapter.CompanyItemDataAdapter;
8   -import com.cnlive.core.company_verfication.ui.model.CompanyItemData;
9   -import com.cnlive.core.libs.base.frame.fragment.BaseFragment;
10   -import com.cnlive.core.libs.base.util.StatusBarConfig;
11   -import com.cnlive.core.libs.base.util.StatusBarUtil;
12   -import com.cnlive.core.people_verfication.R;
13   -import com.cnlive.core.people_verfication.databinding.FragmentSelectInCompanyDataBinding;
14   -import com.google.android.material.bottomsheet.BottomSheetBehavior;
15   -
16   -import java.util.ArrayList;
17   -import java.util.List;
18   -
19   -import androidx.annotation.NonNull;
20   -import androidx.databinding.ViewDataBinding;
21   -import androidx.recyclerview.widget.LinearLayoutManager;
22   -
23   -/*
24   - *@date:2020/4/7 14:54
25   - *@author:杨帅
26   - */public class SelectCompanyDataFragment extends BaseFragment {
27   - private List<String> data = new ArrayList<>();
28   - private FragmentSelectInCompanyDataBinding binding;
29   - private CompanyItemDataAdapter itemDataAdapter;
30   - private BottomSheetBehavior behavior;
31   -
32   - public static SelectCompanyDataFragment newInstance(String userId) {
33   - SelectCompanyDataFragment fragment = new SelectCompanyDataFragment();
34   - Bundle args = new Bundle();
35   - args.putString("userId", userId);
36   - fragment.setArguments(args);
37   - return fragment;
38   - }
39   - @Override
40   - protected int getBindLayoutId() {
41   - return R.layout.fragment_select_in_company_data;
42   - }
43   -
44   - @Override
45   - protected void initBindingLayoutData(ViewDataBinding baseBinding) {
46   - super.initBindingLayoutData(baseBinding);
47   - binding = (FragmentSelectInCompanyDataBinding) baseBinding;
48   - }
49   -
50   - @Override
51   - protected void initView() {
52   - //设置沉浸式状态栏
53   - showImmersiveStatusBar();
54   - //设置状态栏提示文字颜色
55   - setStatusBarTextColor(StatusBarConfig.BLACK);
56   - initTopBar();
57   - List<CompanyItemData> list = new ArrayList<>();
58   - list.add(new CompanyItemData(CompanyItemData.TYPE_ORGANIZATION, 0));
59   - list.add(new CompanyItemData(CompanyItemData.TYPE_CIRCLE, 0));
60   - list.add(new CompanyItemData(CompanyItemData.TYPE_ADD_CIRCLE, 0));
61   - list.add(new CompanyItemData(CompanyItemData.TYPE_CHILD_ACCOUNT, 0));
62   - list.add(new CompanyItemData(CompanyItemData.TYPE_ADD_CHILD_ACCOUNT, 0));
63   - list.add(new CompanyItemData(CompanyItemData.TYPE_ADD_ORGANIZATION, 0));
64   - itemDataAdapter = new CompanyItemDataAdapter(me, list);
65   - binding.recyclerView.setLayoutManager(new LinearLayoutManager(me));
66   - binding.recyclerView.setAdapter(itemDataAdapter);
67   - binding.viewMask.setVisibility(View.GONE);
68   - behavior = BottomSheetBehavior.from(binding.llBottom);
69   - behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
70   - @Override
71   - public void onStateChanged(@NonNull View bottomSheet, @BottomSheetBehavior.State int newState) {
72   - String state = "null";
73   - switch (newState) {
74   - case 1:
75   - state = "STATE_DRAGGING";//过渡状态此时用户正在向上或者向下拖动bottom sheet
76   - break;
77   - case 2:
78   - state = "STATE_SETTLING"; // 视图从脱离手指自由滑动到最终停下的这一小段时间
79   - break;
80   - case 3:
81   - state = "STATE_EXPANDED"; //处于完全展开的状态
82   -
83   - break;
84   - case 4:
85   - state = "STATE_COLLAPSED"; //默认的折叠状态
86   - binding.viewMask.setVisibility(View.GONE);
87   - break;
88   - case 5:
89   - state = "STATE_HIDDEN"; //下滑动完全隐藏 bottom sheet
90   - binding.viewMask.setVisibility(View.GONE);
91   - break;
92   - }
93   -
94   - }
95   -
96   - @Override
97   - public void onSlide(@NonNull View view, float v) {
98   -
99   - }
100   - });
101   - //蒙版点击
102   - binding.viewMask.setOnClickListener(new View.OnClickListener() {
103   - @Override
104   - public void onClick(View v) {
105   - if (!isNull(behavior)) {
106   - binding.viewMask.setVisibility(View.GONE);
107   - behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
108   - }
109   - }
110   - });
111   -
112   - itemDataAdapter.setOnClickListener(new CompanyItemDataAdapter.OnClickListener() {
113   - @Override
114   - public void onClick(TextView textView) {
115   - if (!isNull(behavior)) {
116   - binding.viewMask.setVisibility(View.VISIBLE);
117   - behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
118   - }
119   -// BottomSheetDialog bottomSheetDialog=new BottomSheetDialog();
120   -// bottomSheetDialog.show(getFragmentManager(),TAG);
121   - }
122   - });
123   - }
124   -
125   - private void initTopBar() {
126   - // 设置标题栏的内容在状态栏之下
127   - binding.topbar.setTitle("填写公司信息");
128   - // 设置标题栏 + 状态栏的高度
129   - setTitleViewAdjustImmersiveStatusBar(binding.llTop);
130   - binding.topbar.addLeftImageButton(R.drawable.icon_verficat_back, R.id.back_btn).setOnClickListener(new View.OnClickListener() {
131   - @Override
132   - public void onClick(View v) {
133   - me.finish();
134   - }
135   - });
136   - }
137   -}
core/dentity_verfication/src/main/java/com/cnlive/core/company_verfication/ui/model/CompanyItemData.java deleted 100644 → 0
1   -package com.cnlive.core.company_verfication.ui.model;
2   -
3   -/*机构数据
4   - *@date:2020/4/7 16:24
5   - *@author:杨帅
6   - */public class CompanyItemData {
7   - public static final int TYPE_ORGANIZATION = 0;//所属机构
8   - public static final int TYPE_CIRCLE = 1;//您的圈子
9   - public static final int TYPE_ADD_CIRCLE = 2;//添加圈子
10   - public static final int TYPE_CHILD_ACCOUNT = 3;//相关账号
11   - public static final int TYPE_ADD_CHILD_ACCOUNT = 4;//添加子账号
12   - public static final int TYPE_ADD_ORGANIZATION = 5;//添加机构
13   -
14   - private int type;
15   - private boolean showDelete;
16   - private int logicPosition;//逻辑上数量
17   - private boolean showTopLine;
18   - private boolean showOrganizactionDelete;
19   -
20   - public int getType() {
21   - return type;
22   - }
23   -
24   - public void setType(int type) {
25   - this.type = type;
26   - }
27   -
28   - public boolean isShowDelete() {
29   - return showDelete;
30   - }
31   -
32   - public void setShowDelete(boolean showDelete) {
33   - this.showDelete = showDelete;
34   - }
35   - public CompanyItemData(int type, int logicPosition) {
36   - this.type = type;
37   - this.logicPosition = logicPosition;
38   - }
39   -
40   - public CompanyItemData(int type, int logicPosition, boolean showTopLine, boolean showOrganizactionDelete) {
41   - this.type = type;
42   - this.logicPosition = logicPosition;
43   - this.showTopLine = showTopLine;
44   - this.showOrganizactionDelete = showOrganizactionDelete;
45   - }
46   -
47   - public CompanyItemData(int type, int logicPosition, boolean showDelete) {
48   - this.type = type;
49   - this.logicPosition = logicPosition;
50   - this.showDelete = showDelete;
51   - }
52   -
53   - public boolean isShowTopLine() {
54   - return showTopLine;
55   - }
56   -
57   - public void setShowTopLine(boolean showTopLine) {
58   - this.showTopLine = showTopLine;
59   - }
60   -
61   - public int getLogicPosition() {
62   - return logicPosition;
63   - }
64   -
65   - public void setLogicPosition(int logicPosition) {
66   - this.logicPosition = logicPosition;
67   - }
68   -
69   - public boolean isShowOrganizactionDelete() {
70   - return showOrganizactionDelete;
71   - }
72   -
73   - public void setShowOrganizactionDelete(boolean showOrganizactionDelete) {
74   - this.showOrganizactionDelete = showOrganizactionDelete;
75   - }
76   -}
core/dentity_verfication/src/main/java/com/cnlive/core/ocr/RecognizeService.java deleted 100644 → 0
1   -package com.cnlive.core.ocr;
2   -
3   -import android.content.Context;
4   -import android.util.Log;
5   -
6   -import com.baidu.ocr.sdk.OCR;
7   -import com.baidu.ocr.sdk.OnResultListener;
8   -import com.baidu.ocr.sdk.exception.OCRError;
9   -import com.baidu.ocr.sdk.model.AccessToken;
10   -import com.baidu.ocr.sdk.model.BankCardParams;
11   -import com.baidu.ocr.sdk.model.BankCardResult;
12   -import com.baidu.ocr.sdk.model.IDCardParams;
13   -import com.baidu.ocr.sdk.model.IDCardResult;
14   -
15   -import java.io.File;
16   -
17   -/**
18   - * @author Lynn
19   - * @date 2018/1/4
20   - */
21   -
22   -public class RecognizeService {
23   -
24   - /**
25   - * 识别银行卡
26   - *
27   - * @param filePath 文件路径
28   - * @param listener 回调
29   - */
30   - public static void recBankCard(String filePath, OnResultListener<BankCardResult> listener) {
31   - BankCardParams params = new BankCardParams();
32   - params.setImageFile(new File(filePath));
33   - OCR.getInstance().recognizeBankCard(params, listener);
34   - }
35   -
36   - /**
37   - * 识别身份证
38   - *
39   - * @param idCardSide 身份证正反面
40   - * @param filePath 文件路径
41   - * @param listener 回调
42   - */
43   - public static void recIDCard(String idCardSide, String filePath, OnResultListener<IDCardResult> listener) {
44   - IDCardParams param = new IDCardParams();
45   - param.setImageFile(new File(filePath));
46   - // 设置身份证正反面
47   - param.setIdCardSide(idCardSide);
48   - // 设置方向检测
49   - param.setDetectDirection(true);
50   - // 设置图像参数压缩质量0-100, 越大图像质量越好但是请求时间越长。 不设置则默认值为20
51   - param.setImageQuality(20);
52   - OCR.getInstance().recognizeIDCard(param, listener);
53   - }
54   -
55   - /**
56   - * 初始化 with AK & SK
57   - *
58   - * @param context context
59   - */
60   - public static void initAccessTokenWithAkSk(final Context context) {
61   - OCR.getInstance().initAccessTokenWithAkSk(new OnResultListener<AccessToken>() {
62   - @Override
63   - public void onResult(AccessToken result) {
64   - String token = result.getAccessToken();
65   - Log.e("LynnTest", result.toString());
66   - }
67   -
68   - @Override
69   - public void onError(OCRError error) {
70   - error.printStackTrace();
71   - Log.e("LynnTest", error.getMessage());
72   - }
73   - }, context, "YIGsVzdh35y3GCaNUDsxM3cC", "neAe1orXgeTaiHkAbygrgCevKe1fPrG1");
74   - }
75   -
76   - /**
77   - * 初始化 授权文件(安全模式)
78   - *
79   - * @param context
80   - */
81   - public static void initAccessToken(Context context) {
82   - OCR.getInstance().initAccessToken(new OnResultListener<AccessToken>() {
83   - @Override
84   - public void onResult(AccessToken accessToken) {
85   - String token = accessToken.getAccessToken();
86   - }
87   -
88   - @Override
89   - public void onError(OCRError ocrError) {
90   -
91   - }
92   - }, context);
93   - }
94   -}
core/dentity_verfication/src/main/java/com/cnlive/core/ocr/idcardquality/IDcardQualityProcess.java deleted 100644 → 0
1   -/*
2   - * Copyright (C) 2017 Baidu, Inc. All Rights Reserved.
3   - */
4   -package com.cnlive.core.ocr.idcardquality;
5   -
6   -import android.content.res.AssetManager;
7   -import android.graphics.Bitmap;
8   -
9   -import com.baidu.idl.authority.AlgorithmOnMainThreadException;
10   -import com.baidu.idl.authority.IDLAuthorityException;
11   -import com.baidu.idl.license.License;
12   -import com.baidu.idl.util.UIThread;
13   -
14   -
15   -public class IDcardQualityProcess {
16   -
17   - private static IDcardQualityProcess mInstance;
18   - private static String tokenString;
19   - private static int mAuthorityStatus;
20   - private static Throwable loadNativeException = null;
21   - private static volatile boolean hasReleased;
22   -
23   - public IDcardQualityProcess() {
24   - }
25   -
26   - public static synchronized IDcardQualityProcess getInstance() {
27   - if (null == mInstance) {
28   - mInstance = new IDcardQualityProcess();
29   - }
30   -
31   - return mInstance;
32   - }
33   -
34   - public native byte[] convertRGBImage(int[] colors, int width, int height);
35   -
36   - public native int idcardQualityModelInit(AssetManager var1, String var2);
37   -
38   - public native int idcardQualityCaptchaRelease();
39   -
40   - public native int idcardQualityProcess(byte[] var1, int var2, int var3, boolean var4, int var5);
41   -
42   - public static synchronized int init(String token) throws AlgorithmOnMainThreadException, IDLAuthorityException {
43   - if (UIThread.isUITread()) {
44   - throw new AlgorithmOnMainThreadException();
45   - } else {
46   - tokenString = token;
47   -
48   - try {
49   - mAuthorityStatus = License.getInstance().init(tokenString);
50   - } catch (Exception var2) {
51   - if (var2!=null)
52   - var2.printStackTrace();
53   - }
54   -
55   - return mAuthorityStatus;
56   - }
57   - }
58   -
59   - public int idcardQualityInit(AssetManager assetManager, String modelPath) {
60   - if (mAuthorityStatus == 0) {
61   - hasReleased = false;
62   - return this.idcardQualityModelInit(assetManager, modelPath);
63   - } else {
64   - return mAuthorityStatus;
65   - }
66   - }
67   -
68   - public int idcardQualityRelease() {
69   - if (mAuthorityStatus == 0) {
70   - hasReleased = true;
71   - this.idcardQualityCaptchaRelease();
72   - return 0;
73   - } else {
74   - return mAuthorityStatus;
75   - }
76   - }
77   -
78   - public int idcardQualityDetectionImg(Bitmap img, boolean isfont) {
79   - if (mAuthorityStatus == 0) {
80   - if (hasReleased) {
81   - return -1;
82   - }
83   - int imgHeight = img.getHeight();
84   - int imgWidth = img.getWidth();
85   - byte[] imageData = this.getRGBImageData(img);
86   - return this.idcardQualityProcess(imageData, imgHeight, imgWidth, isfont, 3);
87   - } else {
88   - return mAuthorityStatus;
89   - }
90   - }
91   -
92   - public static Throwable getLoadSoException() {
93   - return loadNativeException;
94   - }
95   -
96   - public byte[] getRGBImageData(Bitmap img) {
97   - int imgWidth = img.getWidth();
98   - int imgHeight = img.getHeight();
99   - int[] pixels = new int[imgWidth * imgHeight];
100   - img.getPixels(pixels, 0, imgWidth, 0, 0, imgWidth, imgHeight);
101   - byte[] imageData = convertRGBImage(pixels, imgWidth, imgHeight);
102   - return imageData;
103   - }
104   -
105   - public void releaseModel() {
106   - this.idcardQualityRelease();
107   - }
108   -
109   - static {
110   - try {
111   - System.loadLibrary("idl_license");
112   - System.loadLibrary("idcard_quality.1.1.1");
113   - } catch (Throwable e) {
114   - loadNativeException = e;
115   - }
116   - mInstance = null;
117   - mAuthorityStatus = 256;
118   - }
119   -}
core/dentity_verfication/src/main/java/com/cnlive/core/ocr/ui/camera/Camera1Control.java deleted 100644 → 0
1   -/*
2   - * Copyright (C) 2017 Baidu, Inc. All Rights Reserved.
3   - */
4   -package com.cnlive.core.ocr.ui.camera;
5   -
6   -import android.Manifest;
7   -import android.content.Context;
8   -import android.content.pm.FeatureInfo;
9   -import android.content.pm.PackageManager;
10   -import android.graphics.ImageFormat;
11   -import android.graphics.Rect;
12   -import android.graphics.SurfaceTexture;
13   -import android.graphics.YuvImage;
14   -import android.hardware.Camera;
15   -import android.os.Build;
16   -import android.util.Log;
17   -import android.view.TextureView;
18   -import android.view.View;
19   -import android.widget.FrameLayout;
20   -
21   -import com.cnlive.core.libs.base.util.AlertUtil;
22   -
23   -import java.io.ByteArrayOutputStream;
24   -import java.io.IOException;
25   -import java.util.ArrayList;
26   -import java.util.Collections;
27   -import java.util.Comparator;
28   -import java.util.List;
29   -import java.util.concurrent.atomic.AtomicBoolean;
30   -
31   -import androidx.core.app.ActivityCompat;
32   -
33   -/**
34   - * 5.0以下相机API的封装。
35   - */
36   -@SuppressWarnings("deprecation")
37   -public class Camera1Control implements ICameraControl {
38   -
39   - private int displayOrientation = 0;
40   - private int cameraId = 0;
41   - private int flashMode;
42   - private AtomicBoolean takingPicture = new AtomicBoolean(false);
43   - private AtomicBoolean abortingScan = new AtomicBoolean(false);
44   - private Context context;
45   - private Camera camera;
46   -
47   - private Camera.Parameters parameters;
48   - private PermissionCallback permissionCallback;
49   - private Rect previewFrame = new Rect();
50   -
51   - private PreviewView previewView;
52   - private View displayView;
53   - private int rotation = 0;
54   - private OnDetectPictureCallback detectCallback;
55   - private int previewFrameCount = 0;
56   - private Camera.Size optSize;
57   -
58   - /*
59   - * 非扫描模式
60   - */
61   - private final int MODEL_NOSCAN = 0;
62   -
63   - /*
64   - * 本地质量控制扫描模式
65   - */
66   - private final int MODEL_SCAN = 1;
67   -
68   - private int detectType = MODEL_NOSCAN;
69   -
70   - public int getCameraRotation() {
71   - return rotation;
72   - }
73   -
74   - public AtomicBoolean getAbortingScan() {
75   - return abortingScan;
76   - }
77   -
78   - @Override
79   - public void setDetectCallback(OnDetectPictureCallback callback) {
80   - detectType = MODEL_SCAN;
81   - detectCallback = callback;
82   - }
83   -
84   - private void onRequestDetect(byte[] data) {
85   - // 相机已经关闭
86   - if (camera == null || data == null) {
87   - return;
88   - }
89   -
90   - YuvImage img = new YuvImage(data, ImageFormat.NV21, optSize.width, optSize.height, null);
91   - ByteArrayOutputStream os = null;
92   - try {
93   - os = new ByteArrayOutputStream(data.length);
94   - img.compressToJpeg(new Rect(0, 0, optSize.width, optSize.height), 80, os);
95   - byte[] jpeg = os.toByteArray();
96   - int status = detectCallback.onDetect(jpeg, getCameraRotation());
97   -
98   - if (status == 0) {
99   - clearPreviewCallback();
100   - }
101   - } catch (OutOfMemoryError e) {
102   - // 内存溢出则取消当次操作
103   - } finally {
104   - try {
105   - os.close();
106   - } catch (Throwable e) {
107   - e.printStackTrace();
108   - }
109   - }
110   -
111   - }
112   -
113   - @Override
114   - public void setDisplayOrientation(@CameraView.Orientation int displayOrientation) {
115   - this.displayOrientation = displayOrientation;
116   - switch (displayOrientation) {
117   - case CameraView.ORIENTATION_PORTRAIT:
118   - rotation = 90;
119   - break;
120   - case CameraView.ORIENTATION_HORIZONTAL:
121   - rotation = 0;
122   - break;
123   - case CameraView.ORIENTATION_INVERT:
124   - rotation = 180;
125   - break;
126   - default:
127   - rotation = 0;
128   - }
129   - previewView.requestLayout();
130   - }
131   -
132   - /**
133   - * {@inheritDoc}
134   - */
135   - @Override
136   - public void refreshPermission() {
137   - startPreview(true);
138   - }
139   -
140   - /**
141   - * {@inheritDoc}
142   - */
143   - @Override
144   - public void setFlashMode(@FlashMode int flashMode) {
145   - if (this.flashMode == flashMode) {
146   - return;
147   - }
148   - this.flashMode = flashMode;
149   - updateFlashMode(flashMode);
150   - }
151   -
152   - @Override
153   - public int getFlashMode() {
154   - return flashMode;
155   - }
156   -
157   - @Override
158   - public void start() {
159   -
160   - }
161   -
162   - @Override
163   - public void stop() {
164   - if (camera != null) {
165   - camera.setPreviewCallback(null);
166   - stopPreview();
167   - // 避免同步代码,为了先设置null后release
168   - Camera tempC = camera;
169   - camera = null;
170   - tempC.release();
171   - camera = null;
172   - buffer = null;
173   - }
174   - }
175   -
176   - private void stopPreview() {
177   - if (camera != null) {
178   - camera.stopPreview();
179   - }
180   - }
181   -
182   - @Override
183   - public void pause() {
184   - if (camera != null) {
185   - stopPreview();
186   - }
187   - setFlashMode(FLASH_MODE_OFF);
188   - }
189   -
190   - @Override
191   - public void resume() {
192   - takingPicture.set(false);
193   - if (camera == null) {
194   - openCamera();
195   - } else {
196   - previewView.textureView.setSurfaceTextureListener(surfaceTextureListener);
197   - if (previewView.textureView.isAvailable()) {
198   - startPreview(false);
199   - }
200   - }
201   - }
202   -
203   - @Override
204   - public View getDisplayView() {
205   - return displayView;
206   - }
207   -
208   - @Override
209   - public void takePicture(final OnTakePictureCallback onTakePictureCallback) {
210   - if (takingPicture.get()) {
211   - return;
212   - }
213   - try {
214   - switch (displayOrientation) {
215   - case CameraView.ORIENTATION_PORTRAIT:
216   - parameters.setRotation(90);
217   - break;
218   - case CameraView.ORIENTATION_HORIZONTAL:
219   - parameters.setRotation(0);
220   - break;
221   - case CameraView.ORIENTATION_INVERT:
222   - parameters.setRotation(180);
223   - break;
224   - }
225   - Camera.Size picSize = getOptimalSize(camera.getParameters().getSupportedPictureSizes());
226   - parameters.setPictureSize(picSize.width, picSize.height);
227   - camera.setParameters(parameters);
228   - takingPicture.set(true);
229   -
230   - camera.takePicture(null, null, new Camera.PictureCallback() {
231   - @Override
232   - public void onPictureTaken(byte[] data, Camera camera) {
233   - startPreview(false);
234   - takingPicture.set(false);
235   - if (onTakePictureCallback != null) {
236   - onTakePictureCallback.onPictureTaken(data);
237   - }
238   - }
239   - });
240   - } catch (RuntimeException e) {
241   - e.printStackTrace();
242   - startPreview(false);
243   - ;
244   - takingPicture.set(false);
245   - }
246   - }
247   -
248   - @Override
249   - public void setPermissionCallback(PermissionCallback callback) {
250   - this.permissionCallback = callback;
251   - }
252   -
253   - public Camera1Control(Context context) {
254   - this.context = context;
255   - previewView = new PreviewView(context);
256   - openCamera();
257   - }
258   -
259   - private void openCamera() {
260   - setupDisplayView();
261   - }
262   -
263   - private void setupDisplayView() {
264   - final TextureView textureView = new TextureView(context);
265   - previewView.textureView = textureView;
266   - previewView.setTextureView(textureView);
267   - displayView = previewView;
268   - textureView.setSurfaceTextureListener(surfaceTextureListener);
269   - }
270   -
271   - private SurfaceTexture surfaceCache;
272   -
273   - private byte[] buffer = null;
274   -
275   - private void setPreviewCallbackImpl() {
276   - if (buffer == null) {
277   - buffer = new byte[displayView.getWidth()
278   - * displayView.getHeight() * ImageFormat.getBitsPerPixel(ImageFormat.NV21) / 8];
279   - }
280   - if (camera != null && detectType == MODEL_SCAN) {
281   - camera.addCallbackBuffer(buffer);
282   - camera.setPreviewCallback(previewCallback);
283   - }
284   - }
285   -
286   - private void clearPreviewCallback() {
287   - if (camera != null && detectType == MODEL_SCAN) {
288   - camera.setPreviewCallback(null);
289   - stopPreview();
290   - }
291   - }
292   -
293   - Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() {
294   - @Override
295   - public void onPreviewFrame(final byte[] data, Camera camera) {
296   - // 扫描成功阻止打开新线程处理
297   - if (abortingScan.get()) {
298   - return;
299   - }
300   - // 节流
301   - if (previewFrameCount++ % 5 != 0) {
302   - return;
303   - }
304   -
305   - // 在某些机型和某项项目中,某些帧的data的数据不符合nv21的格式,需要过滤,否则后续处理会导致crash
306   - if (data.length != parameters.getPreviewSize().width * parameters.getPreviewSize().height * 1.5) {
307   - return;
308   - }
309   -
310   - camera.addCallbackBuffer(buffer);
311   -
312   - CameraThreadPool.execute(new Runnable() {
313   - @Override
314   - public void run() {
315   - Camera1Control.this.onRequestDetect(data);
316   - }
317   - });
318   - }
319   - };
320   -
321   -
322   - private void initCamera() {
323   - try {
324   - if (camera == null) {
325   - Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
326   - for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
327   - Camera.getCameraInfo(i, cameraInfo);
328   - if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
329   - cameraId = i;
330   - }
331   - }
332   - try {
333   - camera = Camera.open(cameraId);
334   - } catch (Throwable e) {
335   - e.printStackTrace();
336   - startPreview(true);
337   - return;
338   - }
339   -
340   - }
341   - if (parameters == null) {
342   - parameters = camera.getParameters();
343   - parameters.setPreviewFormat(ImageFormat.NV21);
344   - }
345   - opPreviewSize(previewView.getWidth(), previewView.getHeight());
346   - camera.setPreviewTexture(surfaceCache);
347   - setPreviewCallbackImpl();
348   - startPreview(false);
349   - } catch (IOException e) {
350   - e.printStackTrace();
351   - }
352   - }
353   -
354   - private TextureView.SurfaceTextureListener surfaceTextureListener = new TextureView.SurfaceTextureListener() {
355   - @Override
356   - public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
357   - surfaceCache = surface;
358   - initCamera();
359   - }
360   -
361   - @Override
362   - public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
363   - opPreviewSize(previewView.getWidth(), previewView.getHeight());
364   - setPreviewCallbackImpl();
365   - }
366   -
367   - @Override
368   - public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
369   - return false;
370   - }
371   -
372   - @Override
373   - public void onSurfaceTextureUpdated(SurfaceTexture surface) {
374   - setPreviewCallbackImpl();
375   - }
376   - };
377   -
378   - // 开启预览
379   - private void startPreview(boolean checkPermission) {
380   - if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
381   - != PackageManager.PERMISSION_GRANTED) {
382   - if (checkPermission && permissionCallback != null) {
383   - permissionCallback.onRequestPermission();
384   - }
385   - return;
386   - }
387   - if (camera == null) {
388   - initCamera();
389   - } else {
390   - try {
391   - camera.startPreview();
392   - CameraThreadPool.createAutoFocusTimerTask(new Runnable() {
393   - @Override
394   - public void run() {
395   - synchronized (Camera1Control.this) {
396   - if (camera != null && !takingPicture.get()) {
397   - try {
398   - camera.autoFocus(new Camera.AutoFocusCallback() {
399   - @Override
400   - public void onAutoFocus(boolean success, Camera camera) {
401   - }
402   - });
403   - } catch (Throwable e) {
404   - // startPreview是异步实现,可能在某些机器上前几次调用会autofocus failß
405   - }
406   - }
407   - }
408   - }
409   - });
410   - } catch (Exception e) {
411   - Log.e("ocr_ui startPreview", "startPreview: " + (e == null ? "" : e.getMessage()));
412   - }
413   - }
414   - }
415   -
416   - private void opPreviewSize(int width, @SuppressWarnings("unused") int height) {
417   -
418   - if (parameters != null && camera != null && width > 0) {
419   - try {
420   - optSize = getOptimalSize(camera.getParameters().getSupportedPreviewSizes());
421   - }catch (Exception e){
422   - e.printStackTrace();
423   - }
424   - optSize = getOptimalSize(camera.getParameters().getSupportedPreviewSizes());
425   - parameters.setPreviewSize(optSize.width, optSize.height);
426   - previewView.setRatio(1.0f * optSize.width / optSize.height);
427   -
428   - camera.setDisplayOrientation(getSurfaceOrientation());
429   - stopPreview();
430   - try {
431   - camera.setParameters(parameters);
432   - } catch (RuntimeException e) {
433   - e.printStackTrace();
434   -
435   - }
436   - startPreview(false);
437   - }
438   - }
439   -
440   - private Camera.Size getOptimalSize(List<Camera.Size> sizes) {
441   - int width = previewView.textureView.getWidth();
442   - int height = previewView.textureView.getHeight();
443   - Camera.Size pictureSize = sizes.get(0);
444   -
445   - List<Camera.Size> candidates = new ArrayList<>();
446   -
447   - for (Camera.Size size : sizes) {
448   - if (size.width >= width && size.height >= height && size.width * height == size.height * width) {
449   - // 比例相同
450   - candidates.add(size);
451   - } else if (size.height >= width && size.width >= height && size.width * width == size.height * height) {
452   - // 反比例
453   - candidates.add(size);
454   - }
455   - }
456   - if (!candidates.isEmpty()) {
457   - return Collections.min(candidates, sizeComparator);
458   - }
459   -
460   - for (Camera.Size size : sizes) {
461   - if (size.width > width && size.height > height) {
462   - return size;
463   - }
464   - }
465   -
466   - return pictureSize;
467   - }
468   -
469   - private Comparator<Camera.Size> sizeComparator = new Comparator<Camera.Size>() {
470   - @Override
471   - public int compare(Camera.Size lhs, Camera.Size rhs) {
472   - return Long.signum((long) lhs.width * lhs.height - (long) rhs.width * rhs.height);
473   - }
474   - };
475   -
476   - private void updateFlashMode(int flashMode) {
477   - switch (flashMode) {
478   - case FLASH_MODE_TORCH:
479   - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
480   - try {
481   - parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
482   - } catch (Exception e) {
483   - e.printStackTrace();
484   - }
485   - }else {
486   - boolean isUse = false;
487   - PackageManager packageManager = context.getPackageManager();
488   - FeatureInfo[] features = packageManager.getSystemAvailableFeatures();
489   - for (FeatureInfo featureInfo : features) {
490   - if (PackageManager.FEATURE_CAMERA_FLASH.equals(featureInfo.name)) { // 断设备是否支持闪光灯
491   - try {
492   - parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
493   - isUse = true;
494   - } catch (Exception e) {
495   - e.printStackTrace();
496   - }
497   - }
498   - }
499   - if(!isUse) AlertUtil.showDeftToast(context,"该设备不支持闪光灯");
500   - }
501   - break;
502   - case FLASH_MODE_OFF:
503   - parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
504   - break;
505   - case ICameraControl.FLASH_MODE_AUTO:
506   - parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
507   - break;
508   - default:
509   - parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
510   - break;
511   - }
512   - if (parameters == null || camera == null)
513   - return;
514   - camera.setParameters(parameters);
515   - }
516   -
517   - private int getSurfaceOrientation() {
518   - @CameraView.Orientation
519   - int orientation = displayOrientation;
520   - switch (orientation) {
521   - case CameraView.ORIENTATION_PORTRAIT:
522   - return 90;
523   - case CameraView.ORIENTATION_HORIZONTAL:
524   - return 0;
525   - case CameraView.ORIENTATION_INVERT:
526   - return 180;
527   - default:
528   - return 90;
529   - }
530   - }
531   -
532   - /**
533   - * 有些相机匹配不到完美的比例。比如。我们的layout是4:3的。预览只有16:9
534   - * 的,如果直接显示图片会拉伸,变形。缩放的话,又有黑边。所以我们采取的策略
535   - * 是,等比例放大。这样预览的有一部分会超出屏幕。拍照后再进行裁剪处理。
536   - */
537   - private class PreviewView extends FrameLayout {
538   -
539   - private TextureView textureView;
540   -
541   - private float ratio = 0.75f;
542   -
543   - void setTextureView(TextureView textureView) {
544   - this.textureView = textureView;
545   - removeAllViews();
546   - addView(textureView);
547   - }
548   -
549   - void setRatio(float ratio) {
550   - this.ratio = ratio;
551   - requestLayout();
552   - relayout(getWidth(), getHeight());
553   - }
554   -
555   - public PreviewView(Context context) {
556   - super(context);
557   - }
558   -
559   - @Override
560   - protected void onSizeChanged(int w, int h, int oldw, int oldh) {
561   - super.onSizeChanged(w, h, oldw, oldh);
562   - relayout(w, h);
563   - }
564   -
565   - private void relayout(int w, int h) {
566   - int width = w;
567   - int height = h;
568   - if (w < h) {
569   - // 垂直模式,高度固定。
570   - height = (int) (width * ratio);
571   - } else {
572   - // 水平模式,宽度固定。
573   - width = (int) (height * ratio);
574   - }
575   -
576   - int l = (getWidth() - width) / 2;
577   - int t = (getHeight() - height) / 2;
578   -
579   - previewFrame.left = l;
580   - previewFrame.top = t;
581   - previewFrame.right = l + width;
582   - previewFrame.bottom = t + height;
583   - }
584   -
585   - @Override
586   - protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
587   - super.onLayout(changed, left, top, right, bottom);
588   - textureView.layout(previewFrame.left, previewFrame.top, previewFrame.right, previewFrame.bottom);
589   - }
590   - }
591   -
592   - @Override
593   - public Rect getPreviewFrame() {
594   - return previewFrame;
595   - }
596   -}
core/dentity_verfication/src/main/java/com/cnlive/core/ocr/ui/camera/Camera2Control.java deleted 100644 → 0
1   -/*
2   - * Copyright (C) 2017 Baidu, Inc. All Rights Reserved.
3   - */
4   -
5   -package com.cnlive.core.ocr.ui.camera;
6   -
7   -import android.Manifest;
8   -import android.annotation.SuppressLint;
9   -import android.annotation.TargetApi;
10   -import android.content.Context;
11   -import android.content.pm.PackageManager;
12   -import android.graphics.ImageFormat;
13   -import android.graphics.Matrix;
14   -import android.graphics.Point;
15   -import android.graphics.Rect;
16   -import android.graphics.RectF;
17   -import android.graphics.SurfaceTexture;
18   -import android.hardware.camera2.CameraAccessException;
19   -import android.hardware.camera2.CameraCaptureSession;
20   -import android.hardware.camera2.CameraCharacteristics;
21   -import android.hardware.camera2.CameraDevice;
22   -import android.hardware.camera2.CameraManager;
23   -import android.hardware.camera2.CameraMetadata;
24   -import android.hardware.camera2.CaptureFailure;
25   -import android.hardware.camera2.CaptureRequest;
26   -import android.hardware.camera2.CaptureResult;
27   -import android.hardware.camera2.TotalCaptureResult;
28   -import android.hardware.camera2.params.StreamConfigurationMap;
29   -import android.media.Image;
30   -import android.media.ImageReader;
31   -import android.os.Build;
32   -import android.os.Handler;
33   -import android.os.HandlerThread;
34   -import android.util.Size;
35   -import android.util.SparseIntArray;
36   -import android.view.Surface;
37   -import android.view.TextureView;
38   -import android.view.View;
39   -import android.view.WindowManager;
40   -
41   -import java.nio.ByteBuffer;
42   -import java.util.ArrayList;
43   -import java.util.Arrays;
44   -import java.util.Collections;
45   -import java.util.Comparator;
46   -import java.util.List;
47   -import java.util.concurrent.Semaphore;
48   -import java.util.concurrent.TimeUnit;
49   -import java.util.concurrent.atomic.AtomicBoolean;
50   -
51   -import androidx.annotation.NonNull;
52   -import androidx.core.content.ContextCompat;
53   -
54   -@TargetApi(Build.VERSION_CODES.LOLLIPOP)
55   -public class Camera2Control implements ICameraControl {
56   - @Override
57   - public void setDetectCallback(OnDetectPictureCallback callback) {
58   - // TODO 暂时只用camera
59   - }
60   -
61   - @Override
62   - public AtomicBoolean getAbortingScan() {
63   - // TODO 暂时只用camera
64   - return null;
65   - }
66   -
67   - /**
68   - * Conversion from screen rotation to JPEG orientation.
69   - */
70   - private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
71   - private static final int MAX_PREVIEW_SIZE = 2048;
72   -
73   - static {
74   - ORIENTATIONS.append(Surface.ROTATION_0, 90);
75   - ORIENTATIONS.append(Surface.ROTATION_90, 0);
76   - ORIENTATIONS.append(Surface.ROTATION_180, 270);
77   - ORIENTATIONS.append(Surface.ROTATION_270, 180);
78   - }
79   -
80   - private static final int STATE_PREVIEW = 0;
81   - private static final int STATE_WAITING_FOR_LOCK = 1;
82   - private static final int STATE_WAITING_FOR_CAPTURE = 2;
83   - private static final int STATE_CAPTURING = 3;
84   - private static final int STATE_PICTURE_TAKEN = 4;
85   -
86   - private static final int MAX_PREVIEW_WIDTH = 1920;
87   - private static final int MAX_PREVIEW_HEIGHT = 1080;
88   -
89   - private int flashMode;
90   - private int orientation = 0;
91   - private int state = STATE_PREVIEW;
92   -
93   - private Context context;
94   - private OnTakePictureCallback onTakePictureCallback;
95   - private PermissionCallback permissionCallback;
96   -
97   - private String cameraId;
98   - private TextureView textureView;
99   - private Size previewSize;
100   - private Rect previewFrame = new Rect();
101   -
102   - private HandlerThread backgroundThread;
103   - private Handler backgroundHandler;
104   - private ImageReader imageReader;
105   - private CameraCaptureSession captureSession;
106   - private CameraDevice cameraDevice;
107   -
108   - private CaptureRequest.Builder previewRequestBuilder;
109   - private CaptureRequest previewRequest;
110   -
111   - private Semaphore cameraLock = new Semaphore(1);
112   - private int sensorOrientation;
113   -
114   - @Override
115   - public void start() {
116   - startBackgroundThread();
117   - if (textureView.isAvailable()) {
118   - openCamera(textureView.getWidth(), textureView.getHeight());
119   - textureView.setSurfaceTextureListener(surfaceTextureListener);
120   - } else {
121   - textureView.setSurfaceTextureListener(surfaceTextureListener);
122   - }
123   - }
124   -
125   - @Override
126   - public void stop() {
127   - textureView.setSurfaceTextureListener(null);
128   - closeCamera();
129   - stopBackgroundThread();
130   - }
131   -
132   - @Override
133   - public void pause() {
134   - setFlashMode(FLASH_MODE_OFF);
135   - }
136   -
137   - @Override
138   - public void resume() {
139   - state = STATE_PREVIEW;
140   - }
141   -
142   - @Override
143   - public View getDisplayView() {
144   - return textureView;
145   - }
146   -
147   - @Override
148   - public Rect getPreviewFrame() {
149   - return previewFrame;
150   - }
151   -
152   - @Override
153   - public void takePicture(OnTakePictureCallback callback) {
154   - this.onTakePictureCallback = callback;
155   - // 拍照第一步,对焦
156   - lockFocus();
157   - }
158   -
159   - @Override
160   - public void setPermissionCallback(PermissionCallback callback) {
161   - this.permissionCallback = callback;
162   - }
163   -
164   - @Override
165   - public void setDisplayOrientation(@CameraView.Orientation int displayOrientation) {
166   - this.orientation = displayOrientation / 90;
167   - }
168   -
169   - @Override
170   - public void refreshPermission() {
171   - openCamera(textureView.getWidth(), textureView.getHeight());
172   - }
173   -
174   - @Override
175   - public void setFlashMode(@FlashMode int flashMode) {
176   - if (this.flashMode == flashMode) {
177   - return;
178   - }
179   - this.flashMode = flashMode;
180   - try {
181   - previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
182   - CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
183   - updateFlashMode(flashMode, previewRequestBuilder);
184   - previewRequest = previewRequestBuilder.build();
185   - captureSession.setRepeatingRequest(previewRequest, captureCallback, backgroundHandler);
186   - } catch (Exception e) {
187   - if (e!=null)
188   - e.printStackTrace();
189   - }
190   - }
191   -
192   - @Override
193   - public int getFlashMode() {
194   - return flashMode;
195   - }
196   -
197   - public Camera2Control(Context activity) {
198   - this.context = activity;
199   - textureView = new TextureView(activity);
200   - }
201   -
202   - private final TextureView.SurfaceTextureListener surfaceTextureListener =
203   - new TextureView.SurfaceTextureListener() {
204   - @Override
205   - public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) {
206   - openCamera(width, height);
207   - }
208   -
209   - @Override
210   - public void onSurfaceTextureSizeChanged(SurfaceTexture texture, int width, int height) {
211   - configureTransform(width, height);
212   - previewFrame.left = 0;
213   - previewFrame.top = 0;
214   - previewFrame.right = width;
215   - previewFrame.bottom = height;
216   - }
217   -
218   - @Override
219   - public boolean onSurfaceTextureDestroyed(SurfaceTexture texture) {
220   - stop();
221   - return true;
222   - }
223   -
224   - @Override
225   - public void onSurfaceTextureUpdated(SurfaceTexture texture) {
226   - }
227   - };
228   -
229   - @SuppressLint("MissingPermission")
230   - private void openCamera(int width, int height) {
231   - // 6.0+的系统需要检查系统权限 。
232   - if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
233   - != PackageManager.PERMISSION_GRANTED) {
234   - requestCameraPermission();
235   - return;
236   - }
237   - setUpCameraOutputs(width, height);
238   - configureTransform(width, height);
239   - CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
240   - try {
241   - if (!cameraLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
242   - throw new RuntimeException("Time out waiting to lock camera opening.");
243   - }
244   - manager.openCamera(cameraId, deviceStateCallback, backgroundHandler);
245   - } catch (CameraAccessException e) {
246   - if (e!=null)
247   - e.printStackTrace();
248   - } catch (InterruptedException e) {
249   - if (e!=null)
250   - throw new RuntimeException("Interrupted while trying to lock camera opening.", e);
251   - }
252   - }
253   -
254   - private final CameraDevice.StateCallback deviceStateCallback = new CameraDevice.StateCallback() {
255   - @Override
256   - public void onOpened(@NonNull CameraDevice cameraDevice) {
257   - cameraLock.release();
258   - Camera2Control.this.cameraDevice = cameraDevice;
259   - createCameraPreviewSession();
260   - }
261   -
262   - @Override
263   - public void onDisconnected(@NonNull CameraDevice cameraDevice) {
264   - cameraLock.release();
265   - cameraDevice.close();
266   - Camera2Control.this.cameraDevice = null;
267   - }
268   -
269   - @Override
270   - public void onError(@NonNull CameraDevice cameraDevice, int error) {
271   - cameraLock.release();
272   - cameraDevice.close();
273   - Camera2Control.this.cameraDevice = null;
274   - }
275   - };
276   -
277   - private void createCameraPreviewSession() {
278   - try {
279   - SurfaceTexture texture = textureView.getSurfaceTexture();
280   - assert texture != null;
281   - texture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight());
282   - Surface surface = new Surface(texture);
283   - previewRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
284   - previewRequestBuilder.addTarget(surface);
285   - updateFlashMode(this.flashMode, previewRequestBuilder);
286   - cameraDevice.createCaptureSession(Arrays.asList(surface, imageReader.getSurface()),
287   - new CameraCaptureSession.StateCallback() {
288   -
289   - @Override
290   - public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
291   - // The camera is already closed
292   - if (null == cameraDevice) {
293   - return;
294   - }
295   - captureSession = cameraCaptureSession;
296   - try {
297   - previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
298   - CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
299   - previewRequest = previewRequestBuilder.build();
300   - captureSession.setRepeatingRequest(previewRequest,
301   - captureCallback, backgroundHandler);
302   - } catch (CameraAccessException e) {
303   - if (e!=null)
304   - e.printStackTrace();
305   - }
306   - }
307   -
308   - @Override
309   - public void onConfigureFailed(
310   - @NonNull CameraCaptureSession cameraCaptureSession) {
311   - // TODO
312   - }
313   - }, null
314   - );
315   - } catch (CameraAccessException e) {
316   - if (e!=null)
317   - e.printStackTrace();
318   - }
319   - }
320   -
321   - private final ImageReader.OnImageAvailableListener onImageAvailableListener =
322   - new ImageReader.OnImageAvailableListener() {
323   - @Override
324   - public void onImageAvailable(ImageReader reader) {
325   - if (onTakePictureCallback != null) {
326   - Image image = reader.acquireNextImage();
327   - ByteBuffer buffer = image.getPlanes()[0].getBuffer();
328   - byte[] bytes = new byte[buffer.remaining()];
329   - buffer.get(bytes);
330   -
331   - image.close();
332   - onTakePictureCallback.onPictureTaken(bytes);
333   - }
334   - }
335   - };
336   -
337   - private CameraCaptureSession.CaptureCallback captureCallback =
338   - new CameraCaptureSession.CaptureCallback() {
339   - private void process(CaptureResult result) {
340   - switch (state) {
341   - case STATE_PREVIEW: {
342   - break;
343   - }
344   - case STATE_WAITING_FOR_LOCK: {
345   - Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
346   - if (afState == null) {
347   - captureStillPicture();
348   - return;
349   - }
350   - switch (afState) {
351   - case CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED:
352   - case CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
353   - case CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED: {
354   - Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
355   - if (aeState == null
356   - || aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) {
357   - captureStillPicture();
358   - } else {
359   - runPreCaptureSequence();
360   - }
361   - break;
362   - }
363   - default:
364   - captureStillPicture();
365   - }
366   - break;
367   - }
368   - case STATE_WAITING_FOR_CAPTURE: {
369   - Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
370   - if (aeState == null
371   - || aeState == CaptureResult.CONTROL_AE_STATE_PRECAPTURE
372   - || aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED) {
373   - state = STATE_CAPTURING;
374   - } else {
375   - if (aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) {
376   - captureStillPicture();
377   - }
378   - }
379   - break;
380   - }
381   - case STATE_CAPTURING: {
382   - Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
383   - if (aeState == null || aeState != CaptureResult.CONTROL_AE_STATE_PRECAPTURE) {
384   - captureStillPicture();
385   - }
386   - break;
387   - }
388   - default:
389   - break;
390   - }
391   - }
392   -
393   - @Override
394   - public void onCaptureProgressed(@NonNull CameraCaptureSession session,
395   - @NonNull CaptureRequest request,
396   - @NonNull CaptureResult partialResult) {
397   - process(partialResult);
398   - }
399   -
400   - @Override
401   - public void onCaptureCompleted(@NonNull CameraCaptureSession session,
402   - @NonNull CaptureRequest request,
403   - @NonNull TotalCaptureResult result) {
404   - process(result);
405   - }
406   -
407   - };
408   -
409   - private Size getOptimalSize(Size[] choices, int textureViewWidth,
410   - int textureViewHeight, int maxWidth, int maxHeight, Size aspectRatio) {
411   - List<Size> bigEnough = new ArrayList<>();
412   - List<Size> notBigEnough = new ArrayList<>();
413   - int w = aspectRatio.getWidth();
414   - int h = aspectRatio.getHeight();
415   - for (Size option : choices) {
416   - if (option.getWidth() <= maxWidth && option.getHeight() <= maxHeight
417   - && option.getHeight() == option.getWidth() * h / w) {
418   - if (option.getWidth() >= textureViewWidth
419   - && option.getHeight() >= textureViewHeight) {
420   - bigEnough.add(option);
421   - } else {
422   - notBigEnough.add(option);
423   - }
424   - }
425   - }
426   -
427   - // Pick the smallest of those big enough. If there is no one big enough, pick the
428   - // largest of those not big enough.
429   - if (bigEnough.size() > 0) {
430   - return Collections.min(bigEnough, sizeComparator);
431   - }
432   -
433   - for (Size option : choices) {
434   - if (option.getWidth() >= maxWidth && option.getHeight() >= maxHeight) {
435   - return option;
436   - }
437   - }
438   -
439   - if (notBigEnough.size() > 0) {
440   - return Collections.max(notBigEnough, sizeComparator);
441   - }
442   -
443   - return choices[0];
444   - }
445   -
446   - private Comparator<Size> sizeComparator = new Comparator<Size>() {
447   - @Override
448   - public int compare(Size lhs, Size rhs) {
449   - return Long.signum((long) lhs.getWidth() * lhs.getHeight() - (long) rhs.getWidth() * rhs.getHeight());
450   - }
451   - };
452   -
453   - private void requestCameraPermission() {
454   - if (permissionCallback != null) {
455   - permissionCallback.onRequestPermission();
456   - }
457   - }
458   -
459   - @SuppressWarnings("SuspiciousNameCombination")
460   - private void setUpCameraOutputs(int width, int height) {
461   - CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
462   - try {
463   - for (String cameraId : manager.getCameraIdList()) {
464   - CameraCharacteristics characteristics =
465   - manager.getCameraCharacteristics(cameraId);
466   -
467   - Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);
468   - if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) {
469   - continue;
470   - }
471   -
472   - StreamConfigurationMap map = characteristics.get(
473   - CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
474   - if (map == null) {
475   - continue;
476   - }
477   -
478   - // int preferredPictureSize = (int) (Math.max(textureView.getWidth(), textureView
479   - // .getHeight()) * 1.5);
480   - // preferredPictureSize = Math.min(preferredPictureSize, 2560);
481   -
482   - WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
483   - Point screenSize = new Point();
484   - windowManager.getDefaultDisplay().getSize(screenSize);
485   - int maxImageSize = Math.max(MAX_PREVIEW_SIZE, screenSize.y * 3 / 2);
486   -
487   - Size size = getOptimalSize(map.getOutputSizes(ImageFormat.JPEG), textureView.getWidth(),
488   - textureView.getHeight(), maxImageSize, maxImageSize, new Size(4, 3));
489   -
490   - imageReader = ImageReader.newInstance(size.getWidth(), size.getHeight(),
491   - ImageFormat.JPEG, 1);
492   - imageReader.setOnImageAvailableListener(
493   - onImageAvailableListener, backgroundHandler);
494   -
495   - int displayRotation = orientation;
496   - // noinspection ConstantConditions
497   - sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
498   - boolean swappedDimensions = false;
499   - switch (displayRotation) {
500   - case Surface.ROTATION_0:
501   - case Surface.ROTATION_180:
502   - if (sensorOrientation == 90 || sensorOrientation == 270) {
503   - swappedDimensions = true;
504   - }
505   - break;
506   - case Surface.ROTATION_90:
507   - case Surface.ROTATION_270:
508   - if (sensorOrientation == 0 || sensorOrientation == 180) {
509   - swappedDimensions = true;
510   - }
511   - break;
512   - default:
513   - }
514   -
515   - int rotatedPreviewWidth = width;
516   - int rotatedPreviewHeight = height;
517   - int maxPreviewWidth = screenSize.x;
518   - int maxPreviewHeight = screenSize.y;
519   -
520   - if (swappedDimensions) {
521   - rotatedPreviewWidth = height;
522   - rotatedPreviewHeight = width;
523   - maxPreviewWidth = screenSize.y;
524   - maxPreviewHeight = screenSize.x;
525   - }
526   -
527   - maxPreviewWidth = Math.min(maxPreviewWidth, MAX_PREVIEW_WIDTH);
528   - maxPreviewHeight = Math.min(maxPreviewHeight, MAX_PREVIEW_HEIGHT);
529   -
530   - previewSize = getOptimalSize(map.getOutputSizes(SurfaceTexture.class),
531   - rotatedPreviewWidth, rotatedPreviewHeight, maxPreviewWidth,
532   - maxPreviewHeight, size);
533   - this.cameraId = cameraId;
534   - return;
535   - }
536   - } catch (CameraAccessException | NullPointerException e) {
537   - if (e!=null)
538   - e.printStackTrace();
539   - }
540   - }
541   -
542   - private void closeCamera() {
543   - try {
544   - cameraLock.acquire();
545   - if (null != captureSession) {
546   - captureSession.close();
547   - captureSession = null;
548   - }
549   - if (null != cameraDevice) {
550   - cameraDevice.close();
551   - cameraDevice = null;
552   - }
553   - if (null != imageReader) {
554   - imageReader.close();
555   - imageReader = null;
556   - }
557   - } catch (InterruptedException e) {
558   - throw new RuntimeException("Interrupted while trying to lock camera closing.", e);
559   - } finally {
560   - cameraLock.release();
561   - }
562   - }
563   -
564   - private void startBackgroundThread() {
565   - backgroundThread = new HandlerThread("ocr_camera");
566   - backgroundThread.start();
567   - backgroundHandler = new Handler(backgroundThread.getLooper());
568   - }
569   -
570   - private void stopBackgroundThread() {
571   - if (backgroundThread != null) {
572   - backgroundThread.quitSafely();
573   - backgroundThread = null;
574   - backgroundHandler = null;
575   - }
576   - }
577   -
578   - private void configureTransform(int viewWidth, int viewHeight) {
579   - if (null == textureView || null == previewSize || null == context) {
580   - return;
581   - }
582   - int rotation = orientation;
583   - Matrix matrix = new Matrix();
584   - RectF viewRect = new RectF(0, 0, viewWidth, viewHeight);
585   - RectF bufferRect = new RectF(0, 0, previewSize.getHeight(), previewSize.getWidth());
586   - float centerX = viewRect.centerX();
587   - float centerY = viewRect.centerY();
588   - if (Surface.ROTATION_90 == rotation || Surface.ROTATION_270 == rotation) {
589   - bufferRect.offset(centerX - bufferRect.centerX(), centerY - bufferRect.centerY());
590   - matrix.setRectToRect(viewRect, bufferRect, Matrix.ScaleToFit.FILL);
591   - float scale = Math.max(
592   - (float) viewHeight / previewSize.getHeight(),
593   - (float) viewWidth / previewSize.getWidth());
594   - matrix.postScale(scale, scale, centerX, centerY);
595   - matrix.postRotate(90 * (rotation - 2), centerX, centerY);
596   - } else if (Surface.ROTATION_180 == rotation) {
597   - matrix.postRotate(180, centerX, centerY);
598   - }
599   - textureView.setTransform(matrix);
600   - }
601   -
602   - // 拍照前,先对焦
603   - private void lockFocus() {
604   - if (captureSession != null && state == STATE_PREVIEW) {
605   - try {
606   - previewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
607   - CameraMetadata.CONTROL_AF_TRIGGER_START);
608   - state = STATE_WAITING_FOR_LOCK;
609   - captureSession.capture(previewRequestBuilder.build(), captureCallback,
610   - backgroundHandler);
611   - } catch (CameraAccessException e) {
612   - if (e!=null)
613   - e.printStackTrace();
614   - }
615   - }
616   - }
617   -
618   - private void runPreCaptureSequence() {
619   - try {
620   - previewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
621   - CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
622   - state = STATE_WAITING_FOR_CAPTURE;
623   - captureSession.capture(previewRequestBuilder.build(), captureCallback,
624   - backgroundHandler);
625   - } catch (CameraAccessException e) {
626   - if (e!=null)
627   - e.printStackTrace();
628   - }
629   - }
630   -
631   - // 拍照session
632   - private void captureStillPicture() {
633   - try {
634   - if (null == context || null == cameraDevice) {
635   - return;
636   - }
637   - final CaptureRequest.Builder captureBuilder =
638   - cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
639   - captureBuilder.addTarget(imageReader.getSurface());
640   - captureBuilder.set(CaptureRequest.CONTROL_AF_MODE,
641   - CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
642   -
643   - captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(orientation));
644   - updateFlashMode(this.flashMode, captureBuilder);
645   - CameraCaptureSession.CaptureCallback captureCallback =
646   - new CameraCaptureSession.CaptureCallback() {
647   - @Override
648   - public void onCaptureCompleted(@NonNull CameraCaptureSession session,
649   - @NonNull CaptureRequest request,
650   - @NonNull TotalCaptureResult result) {
651   - unlockFocus();
652   - }
653   -
654   - @Override
655   - public void onCaptureFailed(@NonNull CameraCaptureSession session,
656   - @NonNull CaptureRequest request,
657   - @NonNull CaptureFailure failure) {
658   - super.onCaptureFailed(session, request, failure);
659   - }
660   - };
661   -
662   - // 停止预览
663   - captureSession.stopRepeating();
664   - captureSession.capture(captureBuilder.build(), captureCallback, backgroundHandler);
665   - state = STATE_PICTURE_TAKEN;
666   - // unlockFocus();
667   - } catch (CameraAccessException e) {
668   - if (e!=null)
669   - e.printStackTrace();
670   - }
671   - }
672   -
673   - private int getOrientation(int rotation) {
674   - return (ORIENTATIONS.get(rotation) + sensorOrientation + 270) % 360;
675   - }
676   -
677   - // 停止对焦
678   - private void unlockFocus() {
679   - try {
680   - previewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
681   - CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
682   - captureSession.capture(previewRequestBuilder.build(), captureCallback,
683   - backgroundHandler);
684   - state = STATE_PREVIEW;
685   - // 预览
686   - captureSession.setRepeatingRequest(previewRequest, captureCallback,
687   - backgroundHandler);
688   - textureView.setSurfaceTextureListener(surfaceTextureListener);
689   - } catch (CameraAccessException e) {
690   - if (e!=null)
691   - e.printStackTrace();
692   - }
693   - }
694   -
695   - private void updateFlashMode(@FlashMode int flashMode, CaptureRequest.Builder builder) {
696   - switch (flashMode) {
697   - case FLASH_MODE_TORCH:
698   - builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
699   - break;
700   - case FLASH_MODE_OFF:
701   - builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
702   - break;
703   - case ICameraControl.FLASH_MODE_AUTO:
704   - default:
705   - builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_SINGLE);
706   - break;
707   - }
708   - }
709   -}