From ec2c26e829e06b89ccefcf80948f2c50c4782629 Mon Sep 17 00:00:00 2001 From: fengjignqi <15192412330@163.com> Date: Tue, 22 Sep 2026 16:52:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=97=E8=A1=A8=EF=BC=8C=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../birds/device/DeviceDetailActivity.kt | 45 ++++++-- .../com/juhabi/birds/login/LoginActivity.kt | 9 ++ .../com/juhabi/birds/mine/MineFragment.kt | 39 +++++++ .../com/juhabi/birds/mine/mvp/MineContract.kt | 3 + .../com/juhabi/birds/mine/mvp/MineImpl.kt | 30 +++++ .../juhabi/birds/mine/mvp/MinePresenter.kt | 25 +++++ .../com/juhabi/birds/network/ApiService.kt | 9 ++ .../drawable/shape_dev_eye_ctrl_line_bg.xml | 6 + app/src/main/res/layout/activity_login.xml | 12 +- .../main/res/layout/activity_mine_center.xml | 2 +- .../main/res/layout/device_detail_layout.xml | 103 +++++++++++++++++- .../include_activity_back_greenbg_layout.xml | 62 +++++++++++ .../include_activity_back_whitebg_layout.xml | 2 +- .../res/mipmap-xhdpi/icon_dev_detail_eye.png | Bin 0 -> 789 bytes .../mipmap-xhdpi/icon_dev_detail_power.png | Bin 0 -> 322 bytes .../res/mipmap-xhdpi/icon_dev_detail_wifi.png | Bin 0 -> 518 bytes .../res/mipmap-xhdpi/icon_login_email.png | Bin 0 -> 634 bytes .../res/mipmap-xxhdpi/icon_dev_detail_eye.png | Bin 0 -> 1923 bytes .../mipmap-xxhdpi/icon_dev_detail_power.png | Bin 0 -> 509 bytes .../mipmap-xxhdpi/icon_dev_detail_wifi.png | Bin 0 -> 1151 bytes .../mipmap-xxxhdpi/icon_dev_detail_eye.png | Bin 0 -> 771 bytes .../mipmap-xxxhdpi/icon_dev_detail_power.png | Bin 0 -> 493 bytes .../mipmap-xxxhdpi/icon_dev_detail_wifi.png | Bin 0 -> 484 bytes app/src/main/res/values/colors.xml | 14 +++ 24 files changed, 341 insertions(+), 20 deletions(-) create mode 100644 app/src/main/res/drawable/shape_dev_eye_ctrl_line_bg.xml create mode 100644 app/src/main/res/layout/include_activity_back_greenbg_layout.xml create mode 100644 app/src/main/res/mipmap-xhdpi/icon_dev_detail_eye.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_dev_detail_power.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_dev_detail_wifi.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_login_email.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_dev_detail_eye.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_dev_detail_power.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_dev_detail_wifi.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icon_dev_detail_eye.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icon_dev_detail_power.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icon_dev_detail_wifi.png diff --git a/app/src/main/java/com/juhabi/birds/device/DeviceDetailActivity.kt b/app/src/main/java/com/juhabi/birds/device/DeviceDetailActivity.kt index 9238a7b..34e3c4f 100644 --- a/app/src/main/java/com/juhabi/birds/device/DeviceDetailActivity.kt +++ b/app/src/main/java/com/juhabi/birds/device/DeviceDetailActivity.kt @@ -26,6 +26,8 @@ class DeviceDetailActivity : } private var device: DeviceEntity? = null + /** 当前正在提交的眼罩目标状态,0 表示打开,1 表示关闭。 */ + private var pendingCoverOn: Boolean? = null override fun createBinding(inflater: LayoutInflater): DeviceDetailLayoutBinding { return DeviceDetailLayoutBinding.inflate(inflater) } @@ -38,7 +40,7 @@ class DeviceDetailActivity : ImmersionBar.with(this) .statusBarView(binding.statusBarView) .statusBarDarkFont(true) - .navigationBarColor(R.color.color_zhu) + .navigationBarColor(R.color.white) .navigationBarDarkIcon(true) .init() } @@ -46,7 +48,7 @@ class DeviceDetailActivity : override fun initView(savedInstanceState: Bundle?) { device = intent.getSerializableExtra(EXTRA_DEVICE) as? DeviceEntity - binding.includedTitle.tvTitle.text = device?.name ?: "设备详情" + binding.includeTitle.tvTitle.text = device?.name ?: "设备详情" val deviceNo = device?.deviceNo if (deviceNo.isNullOrBlank()) { showError("设备信息无效") @@ -57,7 +59,8 @@ class DeviceDetailActivity : listOf( binding.tvBind, binding.switchCtrl, - binding.includedTitle.imgBack, + binding.imgSwitchCtrl, + binding.includeTitle.imgBack, ).forEach { button -> button.setOnClickListener(this) } @@ -68,16 +71,23 @@ class DeviceDetailActivity : R.id.img_back ->{ finish() } - R.id.switch_ctrl ->{ - if(device?.status == "0"){ - showMessage("设备已经离线") - return; - } + + R.id.img_switch_ctrl ->{ val currentDevice = device ?: return - // hoodCoverOn:0 表示打开,1 表示关闭;点击后发送切换后的目标状态。 + if (currentDevice.status == "0") { + showMessage("设备已经离线") + return + } + + // 根据当前服务端状态计算目标状态,再由图片按钮统一发起控制请求。 val coverOn = currentDevice.hoodCoverOn != HOOD_COVER_ON + pendingCoverOn = coverOn presenter?.controlEye(currentDevice.deviceNo, coverOn) } + + R.id.switch_ctrl ->{ + // 开关控件仅保留展示用途,实际控制统一由图片按钮处理。 + } } } @@ -91,20 +101,31 @@ class DeviceDetailActivity : override fun getDeviceDetailSuccess(device: DeviceEntity) { this.device = device - binding.includedTitle.tvTitle.text = device.name + binding.includeTitle.tvTitle.text = device.name binding.tvBind.text = "设备编号:${device.deviceNo}" - binding.switchCtrl.isChecked = device.hoodCoverOn == HOOD_COVER_ON + updateCoverControlState(device.hoodCoverOn == HOOD_COVER_ON) } override fun controlEyeSuccess(message: String) { showMessage(message) + val coverOn = pendingCoverOn ?: return + pendingCoverOn = null device = device?.copy( - hoodCoverOn = if (binding.switchCtrl.isChecked) { + hoodCoverOn = if (coverOn) { HOOD_COVER_ON } else { HOOD_COVER_OFF } ) + updateCoverControlState(coverOn) + } + + /** 同步开关控件和图片按钮的视觉状态,避免请求成功前出现错误状态。 */ + private fun updateCoverControlState(coverOn: Boolean) { + binding.switchCtrl.isChecked = coverOn + binding.imgSwitchCtrl.setImageResource( + if (coverOn) R.mipmap.icon_switch_on else R.mipmap.icon_switch_off + ) } override fun bindDeviceSuccess(message: String) { diff --git a/app/src/main/java/com/juhabi/birds/login/LoginActivity.kt b/app/src/main/java/com/juhabi/birds/login/LoginActivity.kt index f2ea6af..c30f436 100644 --- a/app/src/main/java/com/juhabi/birds/login/LoginActivity.kt +++ b/app/src/main/java/com/juhabi/birds/login/LoginActivity.kt @@ -55,6 +55,7 @@ class LoginActivity : BaseActivity(), binding.getCodeButton, binding.loginButton, binding.registerButton, + binding.tvChangeLoginType, ).forEach { button -> button.setOnClickListener(this) } @@ -63,6 +64,7 @@ class LoginActivity : BaseActivity(), override fun onClick(view: View) { when (view.id) { R.id.tvChangeCode -> {//更换登录方式 + //Todo 2.目前这里的切换,只是针对的手机 验证码/密码登录,两种方式。需要修改一下,参考【Todo 1】这里不仅要对手机号的 验证码/密码登录 做处理,同时也要处理 邮箱的 验证码/密码登录;所以这里应该是四种登录方式。 手机验证码/密码 + 邮箱验证码/密码。 if (loginByPassword) { binding.linearCode.visibility = View.VISIBLE binding.linearPsd.visibility = View.GONE @@ -76,7 +78,13 @@ class LoginActivity : BaseActivity(), } } + R.id.tv_change_login_type ->{ + //Todo 1.这里是切换手机/邮箱 两种登录方式的按钮,点击切换,同时img_login_type改变,【icon_login_phone】/【icon_login_email】两种。 + + } + R.id.getCodeButton -> {//获取验证码 + //Todo 3. 这里获取验证码,是2种,发送手机验证码和邮箱验证码。另外我【Apiservice】中已经写好了方法,两种获取验证码的接口都有。 val phone = binding.accountEditText.text.toString().trim() if (phone.isBlank()) { ToastUtil.showShort(mContext, "手机号不能为空") @@ -98,6 +106,7 @@ class LoginActivity : BaseActivity(), } R.id.loginButton -> {//登录 + //Todo 4.同样也是和前面的逻辑一样,4种登录方法。需要你补齐目前缺少的。 val account = binding.accountEditText.text.toString().trim() if (account.isBlank()) { ToastUtil.showShort(mContext, "账号不能为空") diff --git a/app/src/main/java/com/juhabi/birds/mine/MineFragment.kt b/app/src/main/java/com/juhabi/birds/mine/MineFragment.kt index 4c4dc95..719f49e 100644 --- a/app/src/main/java/com/juhabi/birds/mine/MineFragment.kt +++ b/app/src/main/java/com/juhabi/birds/mine/MineFragment.kt @@ -86,6 +86,27 @@ class MineFragment : BaseFragment(), } + //注销账号 + R.id.linear_zxzh -> { + showDialogtext( + "确认注销账号?", + "注销账号后,账号将被删除,所有设备" + + "解绑、个人信息被清除,无法恢复,请谨慎操作?", + "确认注销", + "取消", + object : OnDialogClick { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + // 用户确认后调用服务端注销账号接口。 + presenter?.userLogoff() + } + } + ) + } + + //退出登录 R.id.tv_logout -> { showDialogtext( @@ -133,6 +154,9 @@ class MineFragment : BaseFragment(), showMessage(message) } + /** + * 退出登录 + */ override fun onLogoutSuccess(message: String) { val context = context ?: return // 服务端退出成功后清除本地账号信息,避免应用重启后恢复旧登录状态。 @@ -144,6 +168,21 @@ class MineFragment : BaseFragment(), goToClearTask(LoginActivity::class.java, null) } + + /** + * 注销账号 + */ + override fun onLogoffSuccess(message: String) { + val context = context ?: return + // 注销成功后清理本地会话,避免已注销账号继续被本地恢复。 + UserInfoManager.clearUser(context) + AppConfig.USER_LOGIN = false + showMessage(message) + + // 注销后清空页面栈并回到登录页。 + goToClearTask(LoginActivity::class.java, null) + } + /** 查询应用缓存大小,并将结果显示在个人中心页面。 */ private fun displayCacheSize() { val context = context ?: return diff --git a/app/src/main/java/com/juhabi/birds/mine/mvp/MineContract.kt b/app/src/main/java/com/juhabi/birds/mine/mvp/MineContract.kt index e992799..22afa3d 100644 --- a/app/src/main/java/com/juhabi/birds/mine/mvp/MineContract.kt +++ b/app/src/main/java/com/juhabi/birds/mine/mvp/MineContract.kt @@ -29,6 +29,7 @@ interface MineContract { callback: Callback> ) fun userLogout(callback: Callback>) + fun userLogoff(callback: Callback>) fun cancel() } @@ -47,5 +48,7 @@ interface MineContract { fun onUpdateBindNewPhoneSuccess(message: String) {} /** 退出登录成功回调。 */ fun onLogoutSuccess(message: String) {} + /** 注销账号成功回调。 */ + fun onLogoffSuccess(message: String) {} } } diff --git a/app/src/main/java/com/juhabi/birds/mine/mvp/MineImpl.kt b/app/src/main/java/com/juhabi/birds/mine/mvp/MineImpl.kt index 16836a3..522bbd6 100644 --- a/app/src/main/java/com/juhabi/birds/mine/mvp/MineImpl.kt +++ b/app/src/main/java/com/juhabi/birds/mine/mvp/MineImpl.kt @@ -23,6 +23,7 @@ class MineImpl : MineContract.DataModel { private var newPhoneCodeCall: Call>? = null private var updateBindNewPhoneCall: Call>? = null private var logoutCall: Call>? = null + private var logoffCall: Call>? = null override fun getCurrentPhoneCode( callback: MineContract.Callback> @@ -183,6 +184,33 @@ class MineImpl : MineContract.DataModel { } } + override fun userLogoff(callback: MineContract.Callback>) { + logoffCall?.cancel() + logoffCall = ApiClient.apiService + .userLogoff(NetworkManager.getToken()) + .also { call -> + call.enqueue(object : Callback> { + override fun onResponse( + call: Call>, + response: Response> + ) { + mainHandler.post { + response.body()?.let(callback::success) + ?: callback.fail("注销账号失败") + } + } + + override fun onFailure(call: Call>, error: Throwable) { + if (!call.isCanceled) { + mainHandler.post { + callback.fail(error.message ?: "网络请求失败") + } + } + } + }) + } + } + override fun getUserInfo( params: Map, callback: MineContract.Callback @@ -320,6 +348,8 @@ class MineImpl : MineContract.DataModel { updateBindNewPhoneCall = null logoutCall?.cancel() logoutCall = null + logoffCall?.cancel() + logoffCall = null mainHandler.removeCallbacksAndMessages(null) } } diff --git a/app/src/main/java/com/juhabi/birds/mine/mvp/MinePresenter.kt b/app/src/main/java/com/juhabi/birds/mine/mvp/MinePresenter.kt index c902a7b..ce5a24c 100644 --- a/app/src/main/java/com/juhabi/birds/mine/mvp/MinePresenter.kt +++ b/app/src/main/java/com/juhabi/birds/mine/mvp/MinePresenter.kt @@ -146,6 +146,31 @@ class MinePresenter(private val mineImpl: MineImpl) : BasePresenter> { + override fun success(data: BaseBean) { + view?.apply { + hideLoading() + if (data.code == 0 || data.code == 200) { + onLogoffSuccess(data.message.ifBlank { "账号注销成功" }) + } else { + showError(data.message.ifBlank { "注销账号失败" }) + } + } + } + + override fun fail(message: String) { + view?.apply { + hideLoading() + showError(message) + } + } + }) + } + fun getUserInfo() { val currentView = view ?: return currentView.showLoading() diff --git a/app/src/main/java/com/juhabi/birds/network/ApiService.kt b/app/src/main/java/com/juhabi/birds/network/ApiService.kt index c2856c8..1b82c0d 100644 --- a/app/src/main/java/com/juhabi/birds/network/ApiService.kt +++ b/app/src/main/java/com/juhabi/birds/network/ApiService.kt @@ -244,6 +244,15 @@ interface ApiService { fun userLogout(@HeaderMap headers: Map): Call> + /** + * 注销账号 + * + * 不需要任何入参, + */ + @POST("app/user/account") + fun userLogoff(@HeaderMap headers: Map): Call> + + @GET("app/v1/checkVersion") diff --git a/app/src/main/res/drawable/shape_dev_eye_ctrl_line_bg.xml b/app/src/main/res/drawable/shape_dev_eye_ctrl_line_bg.xml new file mode 100644 index 0000000..14ad348 --- /dev/null +++ b/app/src/main/res/drawable/shape_dev_eye_ctrl_line_bg.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index c7d96df..9a23b03 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -55,6 +55,7 @@ android:paddingEnd="16dp"> + + layout="@layout/include_activity_back_greenbg_layout" /> + android:background="@color/white" /> - + android:layout_height="wrap_content" + android:background="@color/mainBackgroundColor"> + android:id="@+id/include_title" + layout="@layout/include_activity_back_whitebg_layout"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/include_activity_back_whitebg_layout.xml b/app/src/main/res/layout/include_activity_back_whitebg_layout.xml index 1e945ac..88d1815 100644 --- a/app/src/main/res/layout/include_activity_back_whitebg_layout.xml +++ b/app/src/main/res/layout/include_activity_back_whitebg_layout.xml @@ -6,7 +6,7 @@ android:id="@+id/relative_title" android:layout_width="match_parent" android:layout_height="48dp" - android:background="@color/color_zhu"> + android:background="@color/white"> LTG3xkc^Cs zOiN1xGE!1fl9Q8x3?LWCNJ>fqvQtx2)6>&|Qb56sj0^}DNCLS)K{PHWfgS|ZGB^NYkOyR zZ~x%%==kL1^z8iN^6L8f=JxLX$~P2`u*qczoU1( zVPjxmTl>gtH->{aSgnDFy|e39Ts-v_J_JB!L@ z?!5f`?t%S(=I+>epgjCYUijjB(>pqNtiM0qs`_HVKTXZf-OKCD_WUrKSScBsy5k4G z*^Z7AE1pGsXm>t2EiaMpe!#PnuU#$IT)Ce#Rb`IkBc1vPM0i zjX5;k`DN&zu&VgiS!bSa`*nYEk=d!Mi&JK}8t*!J&}4m9o_NA)RV5+w+6L}qnJ0`N zLauQvFyXz$&k(-#Bg=tasTYb5>i^blV_Y}YmW8Y8R-fvDdB5H<`tA*A*cW8N7{2}w zN4)%n&ujKF8+f&z$!r&2eKA%?D*o;o&T&g6b{=@!wCuj@13yhKhkHF+TU8m} zrSHo2y1eLj<$<^7_4G=mTpQ+Y>p1b`AoGrpQ(yZ%Q%GvELDfBnC?HO!r&Z<=@R^>YTM O1O`u6KbLh*2~7aAyk6G; literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/icon_dev_detail_power.png b/app/src/main/res/mipmap-xhdpi/icon_dev_detail_power.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0bca2429c0c341c45ca0b213d5eb73ce5aba3b GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^MnEjX!3-ot++~geDW?FR5LY1mpEAG^f2j>=Ai#F;Ovihnc#70mKCEuojh<^1!%8&^jqM*#HSws5ZSy>J?^|}Eo%ULWoKt0M7-x$z zbbNY~{<`R0g)2kX9ixOTWl5oo6Bh6mrasp={(Re_$NLu92ff=~zenA7|Ea!pOM@$S z{c*gx=?j0(!L;1#n>|k5$M%M3~wq*606Sqb}ZE@&xEg22WQ% Jmvv4FO#pMjrXc_T literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/icon_dev_detail_wifi.png b/app/src/main/res/mipmap-xhdpi/icon_dev_detail_wifi.png new file mode 100644 index 0000000000000000000000000000000000000000..98dd9ab3059c4acbfad295a0914c624d6338559e GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Ew!3-qLWqbvI)Y1T-5LY1mf6#*+e;Yo}FJ_UEkc^-9LTy;^pf%Z{L6T`04YPuiw7^ z`1$MipTGaUFj?pc(1cr_E{-7*l4lPlhBp~7uwGzSI=9G;aVqyoBg5V>q3Zwtmz&-^ z*`i$gEpE>A)4QjiU6;7_v=ZM1^UzuDv!;G2P>GTF7AnM^c{bRq@mhxG@jbe7msCzq zk1yG$`fXcI?j^%ISJ$&)JlSrmcQrj;Y^oeLFnW@KNQBE;M@>zoX;NOV*}$D*aIZJI&cf86(S&zUQ~rqE#Jt1s$Xfxcw$boFyt I=akR{0OmF`7ytkO literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/icon_login_email.png b/app/src/main/res/mipmap-xhdpi/icon_login_email.png new file mode 100644 index 0000000000000000000000000000000000000000..ec883992f00df66ef5b7d8b42509c479386c18ae GIT binary patch literal 634 zcmV-=0)_pFP)e;mk#~E$i|Bl2c5+`S4F7uyg}c2T}(H zRv;arfdw4w{+%5tiekUrZcn@2u3U*63&FH8K4u5q%Y}WL;Dc}9 z%KO-F5x}WQ0-d~ECjc?;BG}^7ut`c2*oOPWB4()T zI`2h*;J4fDOk(C<04B%c>GueG*m!$JVi1dYAL&hiWF!Uv^FSOxgY{#oI`>%UAAE_S z%U;791nl?#koIR~S)K!n8i^)&Z1KT2@aZ)jOu%QoUatp$`L&D>5*B!DWq*`sGyvU5+!1P5@YPzPScCDvpS**Z+9&d-+U4fUJ<9 z;s|qeQ^;flrT}ZjOa!c|%&AKqn6uheuG9gmDs$>uJ0M>|d+stz3K-f75)qIq?w@zi zpL<*j78AwbAw^?EK(Dv}j*J&pnAeer03h|N9}=q&ITZ)R1iYG<1hBwiEuyCaSdly> z5LvENkq9i^m}xpNBdbJU#$ubPQU}bk%&7eM4*UZE0RR8a(kDXz000I_L_t&o0F-R^ UaL#opp8x;=07*qoM6N<$f@m`o6aWAK literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/icon_dev_detail_eye.png b/app/src/main/res/mipmap-xxhdpi/icon_dev_detail_eye.png new file mode 100644 index 0000000000000000000000000000000000000000..f455b63f8d8842d0c11b62eb07f0ef59805ab0ad GIT binary patch literal 1923 zcmaKsc{G%39LEPEV~v`z#&SA^%wWtIL};Nfwz#(BTC$WiODT!S za*9F3OxB{JiEfCLNJ5?abl-F4IOlfnd(Qmk`};hf=l8sSyziTAZ+lEwKw1C>g9+m- z%^bnM<&PhN2UHT)G#m!wF0;46n}ZfyF)=aD&dx?gMj(*MWRP(5}A zdV72O`T6)#Ass==p58NWMFvs zsF8`OnZ+?{8#{Xkyz_Av7gskocLIS(^6@46QK~{d|Y1sw6ePTdF{*k z*Nx51t#9AIH}-onVKAQCI5T6sE5n;0$y-K1+QVH@VFRPcE>(aif8L`CT31BZJ6m=(><#&1yhc9v+32vN< zDL{m(?aMHfhl`9E)QMpd4QQ{JeDNKVGZp98Q;GLHKE=4!4dtLJ_1eTDwRAj=G}FfJ znMz>LBG(aY?W!%smg$22>F_apIZ|iUG{>t4v6@^uZbQTuCS3nGbw^)Enb(SWaj7(6 z)KFG!2bFcqPH$w7y(zuBo`15Brj8j9JCR0aCBPMg%(wbxhismw2VL$GIDqoYs)=&|$eH6um8IQ=?hX}+R2lbN9DHBJn}Rj>FhPkVRGnd{)NCoNu^7D;76kt4 zY)Yque3X56Z)O47c)H`vP^$G5xr5Ja@ zuFGMauei}UsImC?OVZrf(7eiYO_{mC8~mlV*M11+OF}}@lFn=RhNsBfaNUUP_MX^0 zi>}F;kxKbwwmIa9fxzWyoGX3Tu^>jAGUxjp}a`Ca^vTd;G;F`7M*=%&6&V%nNq;3%xTHm~?Ab)TM)kb5eR5l&oJX zaVAVMlK%E!m0terofW%tomzj5>SoqP8mJbd!>+4C1KU%h_w_TBprA3uHm^6mSN zpTBM?L#RuH|%g#E`5{|v%uD6j%=vq<}8ojDK!gD z`SZ9oXa78M^2fmzqu?D`ZYL#FW_GTfdi3VTgN}}cm8x51CkqJK-rEzv8?{ncV4=|K zObzy_3D3ffKYKY_Y_$#&Q<}&pzUs^L=ZTKInRQDi=7w9jaSoF@?Fz>8rCT`r*vDBLaC0~&t)2Qk5gGD zDaG|hC@Gxo<6hDtZe04}*|((L&Ffeq*L0p=z?yFIoFn;i!o|)4H{ZmvLQ^N_nI>ku z3pOw8##w?{+@ZX)*OEQFL{f zC?FVCq40>g{KtY;QJsA~9ol~r3_FbX73}D;_^uG+x~4k8>eH7Q?yJ={F*0OM(3mAC S#h?aEi42~uelF{r5}E+Ia_N-- literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/icon_dev_detail_eye.png b/app/src/main/res/mipmap-xxxhdpi/icon_dev_detail_eye.png new file mode 100644 index 0000000000000000000000000000000000000000..e651b3e00d661cb5d34650950f06b281cd59be45 GIT binary patch literal 771 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy$g0(?STL4pYh85tR=si`R`DQRhG za0ZYK1nKGNKoTej=0S-Qr5$U4It5FD{DK(-6bu{!5(*0H`{%FUfByb^-TJ<73=B-! zo-U3d8TZ~s+%9^pz{A6oTGB8JZ~V&?i@WTOoN<}pBK0xlpYLw%PX);r|6KGsQvdL) z{ZkI{tA11L_j7lbJZyU_f903Wv&IeQLqb~x`MWlp|JEvf!qWGKy6ua5|JFpkdVNDu zyl~&VD!v>a)#K^^mTUdqb?|+(-ZpPJ(>3cJn!ZTnbv3!89Qf2Tj$8Jm^~$?-+dn8S zy^zPwX@NY+a zfYM=^&BxzI-coh-3*uR5p6k^&$xCZd^2|riWpX!jzsreiDOL$;75CDZG*|S*wnsA3 zZqwGue{M*O>bSdv>rQL((%%Lr!qXC#9dVYDcy+mXdB^lRh36*~3>3v(XD_XcS+i8u z&i8)u^A{3ESLK3EzD)g4Rex^tD`}(EKUBExD(Ak5yD2#Ro&5dJXMW`AS2YC4JpA{9 z)3v%{wR6Maz~5(#zfI>(?M!%8cFht`m z#miVV%@^2DvN|HE_i8{Z3{(K01L ze!&c^ocsd9GP1e`md-v=(FvJFHEkVTJ^eGcy!z~RUZQ}3fl<@b#W5t}@Y@-;^O_9= zT+~g}j%;ClV`j(l@4xl$0GD<8Q_aLy*~mY5{IN8B>7uo(vVPAn2;gciKQAb|?A5%4 zKF;K&k8K~%6@T&f96Q6p(y1q(U9)2ffBx^QfW=#5haV>xf1YAo=)kqaVOybOv5off?f*Ysng0I! z`w2QnV_D|Z&WvJCZ2jW>GdHH7I$?*W&_O$^BdR(&lJA9@%EUgVmvcJm<w7 zoO0Qht-eRfaw~dnRL)|pyd^hjbKV1+_{!()375ONYNJL&0wqCy z!3+Wl1`YuU1@-;&*Y7`n|2=D9OAZ4AV}PfNV~B+0+k??f%?bi62iOGJjx2m%f9tNV z3EScyH|~c#e7*YU&lzr^lU6+zXgNU6bh;{qz3~IX&eP+$%g$1s%X^mTj<{o69K4oje z$rI(45^p}td@nNjfNNRC%c^S>_B71XJxE)6y$4Q|NC$&8f8YXVLktEET zF0n`AwN>-(n4o`}&i&GRiWbU=&pb0rD&|t**@sezz6Dc1%za?>(5axkKy8Qn50xF> nKimuEPZ0Ujo^jy%^@Z|AyR5|LIBn+!hC73&tDnm{r-UW|3V`NU literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index d2aeb33..923f2ad 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -129,6 +129,17 @@ #0d000000 + #1A000000 + #33000000 + #4D000000 + #66000000 + #80000000 + #99000000 + #B3000000 + #CC000000 + #E6000000 + + #FFBB86FC #FF6200EE @@ -145,4 +156,7 @@ #286F51 + + +