From 62de0cac3f9c1c25395ca31402aec16524d4102d Mon Sep 17 00:00:00 2001 From: Godfather <981964879@qq.com> Date: Wed, 9 Mar 2022 16:14:19 +0800 Subject: [PATCH] =?UTF-8?q?version:3.5=20fix:=E7=AC=AC=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E5=BC=80=E6=9C=BA=E4=B8=8D=E5=BC=B9=E7=AA=97=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E9=87=8D=E5=A4=8D=E8=AF=B7=E6=B1=82=E6=97=B6=E4=B8=8D?= =?UTF-8?q?=E6=8A=9B=E5=87=BAonerror=E5=BC=82=E5=B8=B8=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8Demail=E6=84=8F=E5=A4=96=E5=BC=B9=E5=87=BA=20update:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- .../aoleyun/sn/activity/SplashActivity.java | 3 +- .../activity/checknet/CheckNetActivity.java | 25 +++--- .../activity/checknet/CheckNetPresenter.java | 11 +-- .../com/aoleyun/sn/comm/CommonConfig.java | 3 + .../java/com/aoleyun/sn/comm/JGYActions.java | 1 + .../sn/network/NetInterfaceManager.java | 13 +-- .../com/aoleyun/sn/receiver/BootReceiver.java | 6 +- .../aoleyun/sn/service/main/MainService.java | 77 ++++++++++++++++-- .../java/com/aoleyun/sn/utils/ApkUtils.java | 4 +- app/src/main/res/drawable-hdpi/failed.png | Bin 1948 -> 937 bytes app/src/main/res/drawable-hdpi/succeed.png | Bin 1968 -> 0 bytes app/src/main/res/drawable-hdpi/successful.png | Bin 0 -> 911 bytes 13 files changed, 113 insertions(+), 34 deletions(-) delete mode 100644 app/src/main/res/drawable-hdpi/succeed.png create mode 100644 app/src/main/res/drawable-hdpi/successful.png diff --git a/app/build.gradle b/app/build.gradle index 11e13fe..4839124 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,8 +61,8 @@ android { //新平台正式 cube { flavorDimensions "default" - versionCode 24 - versionName "3.3" + versionCode 26 + versionName "3.5" /*********************************极光推送************************************/ manifestPlaceholders = [ XG_ACCESS_ID : "1500026372", diff --git a/app/src/main/java/com/aoleyun/sn/activity/SplashActivity.java b/app/src/main/java/com/aoleyun/sn/activity/SplashActivity.java index 5acaec0..ba0a710 100644 --- a/app/src/main/java/com/aoleyun/sn/activity/SplashActivity.java +++ b/app/src/main/java/com/aoleyun/sn/activity/SplashActivity.java @@ -25,6 +25,7 @@ import androidx.core.content.ContextCompat; import com.aoleyun.sn.BuildConfig; import com.aoleyun.sn.R; +import com.aoleyun.sn.activity.checknet.CheckNetActivity; import com.aoleyun.sn.activity.main.MainActivity; import com.aoleyun.sn.base.BaseApplication; import com.aoleyun.sn.comm.JGYActions; @@ -64,8 +65,8 @@ public class SplashActivity extends AppCompatActivity { debugTest(); new Handler().postDelayed(() -> { startActivity(new Intent(SplashActivity.this, MainActivity.class)); -// startActivity(new Intent(HomeActivity.this, CheckNetActivity.class)); finish(); +// startActivity(new Intent(SplashActivity.this, CheckNetActivity.class)); }, 2000); } diff --git a/app/src/main/java/com/aoleyun/sn/activity/checknet/CheckNetActivity.java b/app/src/main/java/com/aoleyun/sn/activity/checknet/CheckNetActivity.java index 1b57395..841e110 100644 --- a/app/src/main/java/com/aoleyun/sn/activity/checknet/CheckNetActivity.java +++ b/app/src/main/java/com/aoleyun/sn/activity/checknet/CheckNetActivity.java @@ -1,6 +1,5 @@ package com.aoleyun.sn.activity.checknet; -import android.content.Intent; import android.os.SystemClock; import android.util.Log; import android.view.KeyEvent; @@ -9,13 +8,14 @@ import android.widget.TextView; import com.aoleyun.sn.R; import com.aoleyun.sn.base.BaseActivity; -import com.aoleyun.sn.service.main.MainService; +import com.aoleyun.sn.comm.CommonConfig; import com.aoleyun.sn.utils.JGYUtils; import com.aoleyun.sn.utils.SaveListUtils; import com.aoleyun.sn.utils.SysSettingUtils; import com.aoleyun.sn.utils.ToastUtil; import com.aoleyun.sn.utils.Utils; import com.blankj.utilcode.util.NetworkUtils; +import com.tencent.mmkv.MMKV; import java.util.concurrent.TimeUnit; @@ -48,6 +48,7 @@ public class CheckNetActivity extends BaseActivity implements CheckNetContact.Ma private CheckNetPresenter mCheckNetPresenter; private boolean netWorkIsRunning = false; + private MMKV mMMKV = MMKV.defaultMMKV(); @Override public void onDisconnected() { @@ -58,7 +59,7 @@ public class CheckNetActivity extends BaseActivity implements CheckNetContact.Ma public void onConnected(NetworkUtils.NetworkType networkType) { Log.e("OnNetworkStatusChanged", "onConnected: "); timeMillis = SystemClock.elapsedRealtime(); - giv_1.setImageResource(R.drawable.succeed); + giv_1.setBackgroundResource(R.drawable.successful); //直接获取数据 mCheckNetPresenter.getLockedState(); } @@ -83,10 +84,12 @@ public class CheckNetActivity extends BaseActivity implements CheckNetContact.Ma public void isAvailable(boolean available) { runOnUiThread(() -> { if (available) { - giv_1.setImageResource(R.drawable.succeed); + giv_1.setBackgroundResource(R.drawable.successful); mCheckNetPresenter.getLockedState(); } else { - giv_1.setImageResource(R.drawable.failed); + giv_1.setBackgroundResource(R.drawable.failed); + giv_2.setBackgroundResource(R.drawable.failed); + giv_3.setBackgroundResource(R.drawable.failed); } }); } @@ -162,7 +165,8 @@ public class CheckNetActivity extends BaseActivity implements CheckNetContact.Ma */ @Override public void setFirstConnect(boolean state) { - Log.e(TAG, "isFirstConnect: " + "end request"); + Log.e(TAG, "isFirstConnect: " + "end request "); + Log.e(TAG, "setFirstConnect: " + state); if (state) { mCheckNetPresenter.setDisableSetting(); } else { @@ -257,9 +261,9 @@ public class CheckNetActivity extends BaseActivity implements CheckNetContact.Ma public void setTagsFinish(boolean noTag) { if (mCheckNetPresenter.isRequestSucceeded()) { Log.e(TAG, "setTagsFinish: " + mCheckNetPresenter.isRequestSucceeded()); - giv_2.setImageResource(R.drawable.succeed); + giv_2.setBackgroundResource(R.drawable.successful); } else { - giv_2.setImageResource(R.drawable.failed); + giv_2.setBackgroundResource(R.drawable.failed); } if (noTag) { Log.e(TAG, "setTagsFinished: " + "not set tag"); @@ -355,10 +359,11 @@ public class CheckNetActivity extends BaseActivity implements CheckNetContact.Ma public void getDefaultDesktopFinish() { netWorkIsRunning = false; if (mCheckNetPresenter.isRequestSucceeded()) { - giv_3.setImageResource(R.drawable.succeed); + giv_3.setBackgroundResource(R.drawable.successful); } else { - giv_3.setImageResource(R.drawable.failed); + giv_3.setBackgroundResource(R.drawable.failed); } + mMMKV.encode(CommonConfig.DEVICES_FRIST_START, 0); Log.e(TAG, "SettingFinished: " + (SystemClock.elapsedRealtime() - timeMillis) + " ms"); } diff --git a/app/src/main/java/com/aoleyun/sn/activity/checknet/CheckNetPresenter.java b/app/src/main/java/com/aoleyun/sn/activity/checknet/CheckNetPresenter.java index 64395d3..48b203d 100644 --- a/app/src/main/java/com/aoleyun/sn/activity/checknet/CheckNetPresenter.java +++ b/app/src/main/java/com/aoleyun/sn/activity/checknet/CheckNetPresenter.java @@ -269,7 +269,6 @@ public class CheckNetPresenter implements CheckNetContact.Presenter { mView.getSnTimeControlFinish(); } }); - } @Override @@ -320,21 +319,22 @@ public class CheckNetPresenter implements CheckNetContact.Presenter { .getLockedState(lifecycle, new NetInterfaceManager.ObserverCallback() { @Override public void onSubscribe(Disposable d) { - + Log.e("getLockedState", "onSubscribe: "); } @Override public void onNext(BaseResponse response) { - + Log.e("getLockedState", "onNext: "); } @Override public void onError(Throwable e) { + Log.e("getLockedState", "onError: " + e.getMessage()); } @Override public void onComplete() { - Log.e(TAG, "onComplete: "); + Log.e("getLockedState", "onComplete: "); int locked = Settings.System.getInt(mContext.getContentResolver(), JGYActions.ACTION_QCH_UNLOCK_IPAD, JGYActions.FRAME_CODE_LOCKED); Log.e(TAG + ":" + "getLockedState", "locked: " + locked); mView.setLockedState(locked == JGYActions.FRAME_CODE_LOCKED); @@ -691,9 +691,9 @@ public class CheckNetPresenter implements CheckNetContact.Presenter { public void onNext(@NonNull BaseResponse baseResponse) { requestSucceeded = true; Log.e(TAG + ":" + "getAppLimit", "onNext: " + baseResponse); - JsonObject jsonObject = JsonParser.parseString(baseResponse.data.toString()).getAsJsonObject(); int code = baseResponse.code; if (code == OK) { + JsonObject jsonObject = JsonParser.parseString(new Gson().toJson(baseResponse.data)).getAsJsonObject(); String data = jsonObject.get("result").getAsString(); //开机图标 boolean write = Settings.System.putString(mContext.getContentResolver(), JGYActions.ACTION_JGY_SHORTCUTLIST, data); @@ -1180,6 +1180,7 @@ public class CheckNetPresenter implements CheckNetContact.Presenter { @Override public void onComplete() { Log.e(TAG + ":" + "getDesktopIcon", "onComplete: "); + JGYUtils.getInstance().hideSystemAPP(); mView.getDesktopIconFinish(); } }); diff --git a/app/src/main/java/com/aoleyun/sn/comm/CommonConfig.java b/app/src/main/java/com/aoleyun/sn/comm/CommonConfig.java index b2f7fbe..e915e2c 100644 --- a/app/src/main/java/com/aoleyun/sn/comm/CommonConfig.java +++ b/app/src/main/java/com/aoleyun/sn/comm/CommonConfig.java @@ -19,6 +19,9 @@ public class CommonConfig { /*首次启动app*/ public final static String FIRST_STARTUP = "app_first_startup"; + /**设备是否首次启动*/ + public final static String DEVICES_FRIST_START = "DEVICES_FRIST_START"; + /*保存的应用版本号*/ public final static String SN_VERSIONCODE = "SN_VERSIONCODE"; /*重启标识*/ diff --git a/app/src/main/java/com/aoleyun/sn/comm/JGYActions.java b/app/src/main/java/com/aoleyun/sn/comm/JGYActions.java index 420b1d6..e7ef759 100644 --- a/app/src/main/java/com/aoleyun/sn/comm/JGYActions.java +++ b/app/src/main/java/com/aoleyun/sn/comm/JGYActions.java @@ -1,6 +1,7 @@ package com.aoleyun.sn.comm; public class JGYActions { + /*锁定解锁设备 后台1是锁定,底层0是锁定*/ public final static String ACTION_QCH_UNLOCK_IPAD = "qch_unlock_ipad"; /*后台锁定*/ diff --git a/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java b/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java index 8480942..cee9756 100644 --- a/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java +++ b/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java @@ -8,7 +8,6 @@ import android.util.Log; import com.alibaba.fastjson.JSONObject; import com.aoleyun.sn.BuildConfig; -import com.aoleyun.sn.bean.AppListInfo; import com.aoleyun.sn.bean.Appground; import com.aoleyun.sn.bean.BaseResponse; import com.aoleyun.sn.bean.BrowserBookmarks; @@ -95,10 +94,8 @@ import java.util.concurrent.TimeUnit; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.ObservableSource; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; -import io.reactivex.rxjava3.functions.Function; import io.reactivex.rxjava3.schedulers.Schedulers; import io.reactivex.rxjava3.subjects.BehaviorSubject; import okhttp3.Cache; @@ -138,7 +135,7 @@ public class NetInterfaceManager { private static long cacheSize = 1024 * 1024 * 64; public static final String HTTP_KEY = "YTM3YTAxNTJmMmZmNzkyM2E2YzIwZjlhZTc0NzNmMGI="; - public static final String CUSTOM_REPEAT_REQ_PROTOCOL = "MY_CUSTOM_REPEAT_REQ_PROTOCOL"; + public static final String REPEAT_REQUEST_PROTOCOL = "OKHTTP_REPEAT_REQUEST_PROTOCOL"; private NetInterfaceManager(Context context) { this.mContext = context; @@ -154,9 +151,10 @@ public class NetInterfaceManager { try { if (requestIdsMap.size() > 0 && requestIdsMap.containsKey(requestKey)) { Log.e("REPEAT-REQUEST", "重复请求:" + requestKey + " Method @" + request.method() + " --- " + " URL = " + request.url()); - chain.call().cancel(); + //下面这行写了不会抛出onerror +// chain.call().cancel(); return new Response.Builder() - .protocol(Protocol.get(CUSTOM_REPEAT_REQ_PROTOCOL)) + .protocol(Protocol.get(REPEAT_REQUEST_PROTOCOL)) .request(request) //multi thread .build(); } @@ -166,6 +164,7 @@ public class NetInterfaceManager { // builder.addHeader("header", jsonObject.toString()); return chain.proceed(request); } catch (IOException e) { + Log.e(TAG, "intercept: " + e.getMessage()); throw e; } finally { if (requestIdsMap.containsKey(requestKey) && requestIdsMap.containsValue(time)) {//请求任务完成删除map中的数据 @@ -175,6 +174,7 @@ public class NetInterfaceManager { } } }; + //如果无法生存缓存文件目录,检测权限使用已经加上,检测手机是否把文件读写权限禁止了 OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.connectTimeout(timeOut, TimeUnit.SECONDS); // 设置连接超时时间 @@ -561,6 +561,7 @@ public class NetInterfaceManager { long lastTime = mMMKV.decodeLong(GET_LOCKED_STATE_TIME, 0); if (System.currentTimeMillis() - TEN_MINUTE_TIME < lastTime) { callback.onComplete(); + Log.e(TAG, "getLockedState: " + "return"); return; } NetInterfaceManager.getInstance() diff --git a/app/src/main/java/com/aoleyun/sn/receiver/BootReceiver.java b/app/src/main/java/com/aoleyun/sn/receiver/BootReceiver.java index c7e6c92..58b428b 100644 --- a/app/src/main/java/com/aoleyun/sn/receiver/BootReceiver.java +++ b/app/src/main/java/com/aoleyun/sn/receiver/BootReceiver.java @@ -81,10 +81,10 @@ public class BootReceiver extends BroadcastReceiver { SPUtils.put(context, CommonConfig.FIRST_STARTUP, 1); } else { LogDBManager.getInstance().creatRebootLog("设备重启", TimeUtils.transferLongToDate(System.currentTimeMillis())); + Intent checkNetintent = new Intent(context, CheckNetActivity.class); + checkNetintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(checkNetintent); } - Intent intent1 = new Intent(context, CheckNetActivity.class); - intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent1); JGYUtils.startServices(context); new BootManager(context).start(); break; diff --git a/app/src/main/java/com/aoleyun/sn/service/main/MainService.java b/app/src/main/java/com/aoleyun/sn/service/main/MainService.java index b8735ca..45495b5 100644 --- a/app/src/main/java/com/aoleyun/sn/service/main/MainService.java +++ b/app/src/main/java/com/aoleyun/sn/service/main/MainService.java @@ -36,7 +36,10 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.aoleyun.sn.BuildConfig; import com.aoleyun.sn.R; +import com.aoleyun.sn.activity.SplashActivity; +import com.aoleyun.sn.activity.checknet.CheckNetActivity; import com.aoleyun.sn.activity.main.MainAPresenter; +import com.aoleyun.sn.bean.BaseResponse; import com.aoleyun.sn.bean.PoweroffBean; import com.aoleyun.sn.comm.CommonConfig; import com.aoleyun.sn.comm.JGYActions; @@ -57,6 +60,9 @@ import com.aoleyun.sn.utils.Utils; import com.blankj.utilcode.util.NetworkUtils; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; +import com.tencent.android.tpush.XGIOperateCallback; +import com.tencent.android.tpush.XGPushConfig; +import com.tencent.android.tpush.XGPushManager; import com.tencent.mmkv.MMKV; import com.trello.rxlifecycle4.LifecycleProvider; import com.trello.rxlifecycle4.LifecycleTransformer; @@ -66,6 +72,7 @@ import com.trello.rxlifecycle4.android.RxLifecycleAndroid; import java.lang.reflect.Type; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashSet; @@ -99,6 +106,11 @@ public class MainService extends Service implements MainSContact.MainView, Netwo String WiFiAlias = Utils.getWifiAlias(this); Log.e("OnNetworkStatusChanged", "onConnected: " + WiFiAlias); Utils.getPublicIP(this); + if (mMMKV.decodeInt(CommonConfig.DEVICES_FRIST_START, 1) == 1) { + Intent intent = new Intent(this, CheckNetActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } if (ConnectManager.getInstance().isWiFiFistConnect()) { start.onstar(ConnectManager.WIFI_LAST_CONNECT_TIME); } else { @@ -124,10 +136,64 @@ public class MainService extends Service implements MainSContact.MainView, Netwo super.onPostExecute(aLong); AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); am.setTime(aLong); + tPushInit(); + NetInterfaceManager.getInstance().setPushTags(lifecycleSubject, new NetInterfaceManager.ObserverCallback() { + @Override + public void onSubscribe(Disposable d) { + Log.e("TimeTask", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse response) { + Log.e("TimeTask", "onNext: "); + } + + @Override + public void onError(Throwable e) { + Log.e("TimeTask", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("TimeTask", "onComplete: "); + } + }); Log.e(TAG, "getTimeFromNtpServer: " + aLong); } } + private void tPushInit() { + XGPushConfig.enableDebug(this, true); + XGPushManager.registerPush(this, new XGIOperateCallback() { + @Override + public void onSuccess(Object data, int flag) { + //token在设备卸载重装的时候有可能会变 + Log.e("TPush", "注册成功,设备token为:" + data); + List accountInfoList = new ArrayList<>(); + accountInfoList.add(new XGPushManager.AccountInfo(XGPushManager.AccountType.CUSTOM.getValue(), Utils.getSerial())); + XGPushManager.upsertAccounts(MainService.this, accountInfoList, new XGIOperateCallback() { + @Override + public void onSuccess(Object data, int flag) { + Log.e("TPush", "onSuccess, data:" + data + ", flag:" + flag); + } + + @Override + public void onFail(Object data, int errCode, String msg) { + Log.e("TPush", "onFail, data:" + data + ", code:" + errCode + ", msg:" + msg); + } + }); + } + + @Override + public void onFail(Object data, int errCode, String msg) { + Log.e("TPush", "注册失败,错误码:" + errCode + ",错误信息:" + msg); + } + }); + + + } + + private final BehaviorSubject lifecycleSubject = BehaviorSubject.create(); @Override @@ -265,8 +331,14 @@ public class MainService extends Service implements MainSContact.MainView, Netwo public void onCreate() { super.onCreate(); Log.e(TAG, "onCreate: "); + lifecycleSubject.onNext(ActivityEvent.CREATE); + mPresenter = new MainSPresenter(this); + mPresenter.attachView(this); + mPresenter.setLifecycle(lifecycleSubject); + TimeTask task = new TimeTask(); task.execute("ntp.aliyun.com"); + ApkUtils.UninstallAPP(this, "com.joytv.live"); ApkUtils.UninstallAPP(this, "com.tencent.android.qqdownloader"); @@ -276,11 +348,6 @@ public class MainService extends Service implements MainSContact.MainView, Netwo Log.e(TAG, "onCreate: " + e.getMessage()); } - lifecycleSubject.onNext(ActivityEvent.CREATE); - mPresenter = new MainSPresenter(this); - mPresenter.attachView(this); - mPresenter.setLifecycle(lifecycleSubject); - Observable.create(subscribe) .throttleFirst(1, TimeUnit.MINUTES) .subscribe(timeObserver); diff --git a/app/src/main/java/com/aoleyun/sn/utils/ApkUtils.java b/app/src/main/java/com/aoleyun/sn/utils/ApkUtils.java index 1cd6132..6f782fd 100644 --- a/app/src/main/java/com/aoleyun/sn/utils/ApkUtils.java +++ b/app/src/main/java/com/aoleyun/sn/utils/ApkUtils.java @@ -696,14 +696,14 @@ public class ApkUtils { this.add("com.android.calendar"); this.add("com.android.dreams.basic"); this.add("com.android.musicfx"); -// this.add("com.android.email"); + this.add("com.android.email"); this.add("com.jiaoguanyi.sysc"); }}; //需要管控的系统可以卸载的应用 public static List show_canremove_systemapp = new ArrayList() {{ this.add("com.android.calendar"); - this.add("com.android.email"); +// this.add("com.android.email"); }}; diff --git a/app/src/main/res/drawable-hdpi/failed.png b/app/src/main/res/drawable-hdpi/failed.png index 30c52e1218804c8d13f354a03346fe5d4239ea1f..ae4a62a876a789a8569240c0fa1a618f966233bc 100644 GIT binary patch literal 937 zcmV;a16KTrP)iD)|!btt7e0O+57=7?xcDW!iu78e&My1KgNih$1rAf?<2;0%Cn06QE7 zO#+wz@RXTk1KP;DHv|2Lfius^NDrUIlyWnGU(FV;^94chhln;c$i0P`f7g!Jt$>vBB!HJC11y_)oy)RloMPr> zWjzUC1VF>fBPU!|@jC52W?ptS>j1(qe5;f?Y!IpY_#vg#aU$w>0LmjCMD$Jwam2KR zzFWMU9AIV*VY~Fz3u)=VI{H>MPcrjP6Tn{p8w|6$1Yjv7*UZ;wnP=vWMF5O5b5Cuc z28XaH@j9IqfXx=t!E7Lk6t8odw~*x_u1ogF~n&A&vQ**PG_Z5pYQvl zX<>|iYz0AZhlnoa)RD=Zh(?7FeT|%r0P#w^2XH8pii}SBgNP8KVsf_vh#{T<=rsi_ zX#5*9@3M(y4WNSsL2!?fw$*=gC2d`U~(lAl>!_G($Sna)62VzR_t1IRLKMf&^$E-s!x&RIXy00000 LNkvXXu0mjfmY=PB literal 1948 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 diff --git a/app/src/main/res/drawable-hdpi/successful.png b/app/src/main/res/drawable-hdpi/successful.png new file mode 100644 index 0000000000000000000000000000000000000000..5d573b88c33e9980391886f6e2d82e74220e186d GIT binary patch literal 911 zcmV;A191F_P)7?viZC1X{NHl7t#xmq;?$Rl+RIL z?h6;QrX1?!yC*IWWSX-203jzMo zx-Y^@GZnWFr?svC?F##%h9VU^-bMCbhhR;&irp0;Q5$Jj*}4Q2`w=F@xNO2KjPpGL zj%F&Z`v2Ct1Els6V^!bP3ll@e)?Xu=s6A_+tGca~S6Ne5`vKJEC-C8Ki+Ax7wNJpj zqSzTMK;>iS{b@7MNNuMWclrwO$H=$EdyAzByYi;|me!{MBx<8T&*D)DuB7;O%nO-{ zI{|lO*+0}IYL9?T9+6`}YOq~kI2fp!co*hzrn1=w@Fw8lWPPUMAl$n3PJJt2b@9&2 zc&4)42k;q~;~CW{fFOu^#Jf;mGL^ZN0mOLtJ(aDUjtXa@KJmc-AxnrLh