From c9dcdce2ba86630dd8aaffd5348ab0eda7940cd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?whalensun=28=E5=AD=99=E4=BC=9F=29?= <532125505@qq.com> Date: Tue, 23 Nov 2021 17:53:55 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90ID869532311=E3=80=91App=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9A=90=E7=A7=81=E5=90=88=E8=A7=84=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E9=A3=8E=E9=99=A9=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D--?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E7=99=BB=E5=BD=95=E9=A1=B5=E9=9D=A2=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=9F=A5=E7=9C=8B=E7=94=A8=E6=88=B7=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=EF=BC=8C=E9=9A=90=E7=A7=81=E6=94=BF=E7=AD=96=E5=85=A5=E5=8F=A3?= =?UTF-8?q?=E3=80=82=E4=BF=AE=E6=94=B9=E5=BC=B9=E5=87=BA=E6=9D=83=E9=99=90?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=EF=BC=8C=E5=90=AF=E5=8A=A8=E9=A1=B5=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=AF=A2=E9=97=AE=E9=9A=90=E7=A7=81=E6=94=BF=E7=AD=96?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=8D=8F=E8=AE=AE=E7=9A=84=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit http://tapd.oa.com/NEW_IOT/prong/stories/view/1020393192869532311 Change-Id: Iec36cda2a429728c638edc48810a8a634844655c --- app/src/main/AndroidManifest.xml | 416 +++++++++--------- .../java/com/tencent/iot/explorer/link/App.kt | 4 +- .../customview/dialog/PermissionDialog.java | 60 +-- .../activity/AccountAndSafetyActivity.kt | 14 +- .../kitlink/activity/ChooseCountryActivity.kt | 2 +- .../activity/DeviceCategoryActivity.kt | 47 +- .../link/kitlink/activity/LoginActivity.kt | 225 +++++++++- .../link/kitlink/activity/MainActivity.kt | 44 +- .../activity/MarkerPaddingActivity.java | 29 +- .../kitlink/activity/PrivicyDialogActivity.kt | 89 ++++ .../link/kitlink/activity/RegisterActivity.kt | 86 +++- .../link/kitlink/activity/UserInfoActivity.kt | 80 +++- .../link/kitlink/consts/CommonField.kt | 8 + .../link/kitlink/fragment/DeviceFragment.kt | 22 + .../link/kitlink/fragment/HomeFragment.kt | 141 +++++- .../res/drawable/background_permission.xml | 3 +- app/src/main/res/layout/activity_login2.xml | 65 ++- .../res/layout/activity_privicy_dialog.xml | 9 + app/src/main/res/layout/activity_register.xml | 4 +- .../res/layout/popup_permission_layout.xml | 164 ++----- .../main/res/mipmap-hdpi/permission_album.png | Bin 0 -> 1594 bytes .../res/mipmap-hdpi/permission_camera.png | Bin 0 -> 1459 bytes .../res/mipmap-hdpi/permission_location.png | Bin 0 -> 1947 bytes .../main/res/mipmap-hdpi/permission_mic.png | Bin 0 -> 1552 bytes .../main/res/mipmap-hdpi/permission_sms.png | Bin 0 -> 1317 bytes .../main/res/mipmap-mdpi/permission_album.png | Bin 0 -> 1034 bytes .../res/mipmap-mdpi/permission_camera.png | Bin 0 -> 962 bytes .../res/mipmap-mdpi/permission_location.png | Bin 0 -> 1157 bytes .../main/res/mipmap-mdpi/permission_mic.png | Bin 0 -> 976 bytes .../main/res/mipmap-mdpi/permission_sms.png | Bin 0 -> 904 bytes .../res/mipmap-xhdpi/permission_album.png | Bin 0 -> 2243 bytes .../res/mipmap-xhdpi/permission_camera.png | Bin 0 -> 2008 bytes .../res/mipmap-xhdpi/permission_location.png | Bin 0 -> 2737 bytes .../main/res/mipmap-xhdpi/permission_mic.png | Bin 0 -> 2271 bytes .../main/res/mipmap-xhdpi/permission_sms.png | Bin 0 -> 1795 bytes .../res/mipmap-xxhdpi/permission_album.png | Bin 0 -> 2013 bytes .../res/mipmap-xxhdpi/permission_camera.png | Bin 0 -> 1716 bytes .../res/mipmap-xxhdpi/permission_location.png | Bin 0 -> 2369 bytes .../main/res/mipmap-xxhdpi/permission_mic.png | Bin 0 -> 2127 bytes .../main/res/mipmap-xxhdpi/permission_sms.png | Bin 0 -> 1341 bytes .../res/mipmap-xxxhdpi/permission_album.png | Bin 0 -> 5956 bytes .../res/mipmap-xxxhdpi/permission_camera.png | Bin 0 -> 4987 bytes .../mipmap-xxxhdpi/permission_location.png | Bin 0 -> 7349 bytes .../res/mipmap-xxxhdpi/permission_mic.png | Bin 0 -> 5882 bytes .../res/mipmap-xxxhdpi/permission_sms.png | Bin 0 -> 4253 bytes app/src/main/res/values-en-rUS/strings.xml | 23 +- app/src/main/res/values-zh-rCN/strings.xml | 23 +- app/src/main/res/values/strings.xml | 23 +- .../src/main/res/values/strings.xml | 1 + 49 files changed, 1095 insertions(+), 487 deletions(-) create mode 100644 app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/PrivicyDialogActivity.kt create mode 100644 app/src/main/res/layout/activity_privicy_dialog.xml create mode 100644 app/src/main/res/mipmap-hdpi/permission_album.png create mode 100644 app/src/main/res/mipmap-hdpi/permission_camera.png create mode 100644 app/src/main/res/mipmap-hdpi/permission_location.png create mode 100644 app/src/main/res/mipmap-hdpi/permission_mic.png create mode 100644 app/src/main/res/mipmap-hdpi/permission_sms.png create mode 100644 app/src/main/res/mipmap-mdpi/permission_album.png create mode 100644 app/src/main/res/mipmap-mdpi/permission_camera.png create mode 100644 app/src/main/res/mipmap-mdpi/permission_location.png create mode 100644 app/src/main/res/mipmap-mdpi/permission_mic.png create mode 100644 app/src/main/res/mipmap-mdpi/permission_sms.png create mode 100644 app/src/main/res/mipmap-xhdpi/permission_album.png create mode 100644 app/src/main/res/mipmap-xhdpi/permission_camera.png create mode 100644 app/src/main/res/mipmap-xhdpi/permission_location.png create mode 100644 app/src/main/res/mipmap-xhdpi/permission_mic.png create mode 100644 app/src/main/res/mipmap-xhdpi/permission_sms.png create mode 100644 app/src/main/res/mipmap-xxhdpi/permission_album.png create mode 100644 app/src/main/res/mipmap-xxhdpi/permission_camera.png create mode 100644 app/src/main/res/mipmap-xxhdpi/permission_location.png create mode 100644 app/src/main/res/mipmap-xxhdpi/permission_mic.png create mode 100644 app/src/main/res/mipmap-xxhdpi/permission_sms.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/permission_album.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/permission_camera.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/permission_location.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/permission_mic.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/permission_sms.png diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 37c6dd446..756d4f34c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,210 +1,208 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/tencent/iot/explorer/link/App.kt b/app/src/main/java/com/tencent/iot/explorer/link/App.kt index b505eed05..c853f9101 100644 --- a/app/src/main/java/com/tencent/iot/explorer/link/App.kt +++ b/app/src/main/java/com/tencent/iot/explorer/link/App.kt @@ -172,7 +172,9 @@ class App : Application(), Application.ActivityLifecycleCallbacks, PayloadMessag // App enters foreground data.isForeground = true L.e("App foreground") - requestDeviceList() + if (!TextUtils.isEmpty(data.getToken())) { + requestDeviceList() + } if (activity is AppLifeCircleListener) { activity.onAppGoforeground() } diff --git a/app/src/main/java/com/tencent/iot/explorer/link/customview/dialog/PermissionDialog.java b/app/src/main/java/com/tencent/iot/explorer/link/customview/dialog/PermissionDialog.java index 36dd98f02..d75a4ccc3 100644 --- a/app/src/main/java/com/tencent/iot/explorer/link/customview/dialog/PermissionDialog.java +++ b/app/src/main/java/com/tencent/iot/explorer/link/customview/dialog/PermissionDialog.java @@ -2,6 +2,7 @@ import android.content.Context; import android.view.View; +import android.widget.ImageView; import android.widget.TextView; import androidx.constraintlayout.widget.ConstraintLayout; @@ -9,66 +10,33 @@ import com.tencent.iot.explorer.link.R; import com.tencent.iot.explorer.link.customview.dialog.entity.UpgradeInfo; -public class PermissionDialog extends IosCenterStyleDialog implements View.OnClickListener { +public class PermissionDialog extends IosCenterStyleDialog { + private ImageView logo; private TextView detail; - private TextView detailLips; - private TextView btnRefuse; - private TextView btnOK; + private TextView title; private ConstraintLayout outLayout; private String detailString; - private String detailLipsString; + private String titleString; + private int logoResId; - public PermissionDialog(Context context, String detail, String detailLips) { - super(context, R.layout.popup_permission_layout); + public PermissionDialog(Context context, int logoResId, String detail, String title) { + super(context, R.layout.popup_permission_layout, false); + this.logoResId = logoResId; this.detailString = detail; - this.detailLipsString = detailLips; + this.titleString = title; } @Override public void initView() { outLayout = view.findViewById(R.id.permission_dialog_layout); detail = view.findViewById(R.id.tv_detail); - detailLips = view.findViewById(R.id.tv_detail_lips); - btnRefuse = view.findViewById(R.id.tv_refuse); - btnOK = view.findViewById(R.id.tv_ok); - - btnRefuse.setOnClickListener(this); - btnOK.setOnClickListener(this); + title = view.findViewById(R.id.tv_title); + logo = view.findViewById(R.id.iv_logo); detail.setText(detailString); - detailLips.setText(detailLipsString); + title.setText(titleString); + logo.setImageResource(logoResId); outLayout.setBackgroundColor(getContext().getResources().getColor(R.color.dialog_background)); } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.tv_refuse: - dismiss(); - if (onDismisListener != null) { - onDismisListener.OnClickRefuse(); - } - break; - case R.id.tv_ok: - dismiss(); - if (onDismisListener != null) { - onDismisListener.OnClickOK(); - } - break; - default: - break; - } - } - - private volatile OnDismisListener onDismisListener; - - public interface OnDismisListener { - void OnClickRefuse(); - void OnClickOK(); - } - - public void setOnDismisListener(OnDismisListener onDismisListener) { - this.onDismisListener = onDismisListener; - } } diff --git a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/AccountAndSafetyActivity.kt b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/AccountAndSafetyActivity.kt index 7db03a01a..8587da376 100644 --- a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/AccountAndSafetyActivity.kt +++ b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/AccountAndSafetyActivity.kt @@ -15,7 +15,6 @@ import com.tencent.iot.explorer.link.T import com.tencent.iot.explorer.link.core.auth.callback.MyCallback import com.tencent.iot.explorer.link.core.auth.response.BaseResponse import com.tencent.iot.explorer.link.core.utils.Utils -import com.tencent.iot.explorer.link.customview.dialog.PermissionDialog import kotlinx.android.synthetic.main.activity_account_and_safety.* import kotlinx.android.synthetic.main.menu_back_layout.* @@ -73,18 +72,7 @@ class AccountAndSafetyActivity : PActivity(), AccountAndSafetyView, View.OnClick if (App.data.userInfo.HasWxOpenID == "1") { T.show(getString(R.string.wechat_bind_already)) //微信已经绑定过了, 请勿重复绑定 } else { - var dlg = PermissionDialog(this@AccountAndSafetyActivity, getString(R.string.permission_of_wechat), getString(R.string.permission_of_wechat_lips)) - dlg.show() - dlg.setOnDismisListener(object : PermissionDialog.OnDismisListener { - override fun OnClickRefuse() { - - } - - override fun OnClickOK() { - WeChatLogin.getInstance().login(this@AccountAndSafetyActivity, this@AccountAndSafetyActivity) - } - - }) + WeChatLogin.getInstance().login(this, this) } } tv_modify_passwd -> {// 修改密码 diff --git a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/ChooseCountryActivity.kt b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/ChooseCountryActivity.kt index 70954dbf5..8cd77e6a6 100644 --- a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/ChooseCountryActivity.kt +++ b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/ChooseCountryActivity.kt @@ -34,7 +34,7 @@ class ChooseCountryActivity : PActivity(), ChooseCountryView, View.OnClickListen override fun initView() { tv_title.text = getString(R.string.country_or_place) presenter = ChooseCountryPresenter(this) - loadLastCountryInfo() +// loadLastCountryInfo() } override fun setListener() { diff --git a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/DeviceCategoryActivity.kt b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/DeviceCategoryActivity.kt index a0f233f12..ea27b607c 100644 --- a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/DeviceCategoryActivity.kt +++ b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/DeviceCategoryActivity.kt @@ -19,6 +19,7 @@ import android.view.animation.LinearInterpolator import androidx.fragment.app.Fragment import androidx.recyclerview.widget.GridLayoutManager import com.alibaba.fastjson.JSON +import com.alibaba.fastjson.JSONObject import com.example.qrcode.Constant import com.example.qrcode.ScannerActivity import com.tencent.iot.explorer.link.App @@ -66,9 +67,9 @@ class DeviceCategoryActivity : PActivity(), MyCallback, CRecyclerView.RecyclerI Manifest.permission.CAMERA, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.CHANGE_WIFI_STATE, - Manifest.permission.CHANGE_WIFI_MULTICAST_STATE, - Manifest.permission.ACCESS_FINE_LOCATION + Manifest.permission.CHANGE_WIFI_MULTICAST_STATE ) + private var permissionDialog: PermissionDialog? = null private var blueToothPermissions = arrayOf( Manifest.permission.ACCESS_COARSE_LOCATION, @@ -308,10 +309,13 @@ class DeviceCategoryActivity : PActivity(), MyCallback, CRecyclerView.RecyclerI var intent = Intent(Intent(this, ScannerActivity::class.java)) intent.putExtra(Constant.EXTRA_IS_ENABLE_SCAN_FROM_PIC,true) startActivityForResult(intent, CommonField.QR_CODE_REQUEST_CODE) + permissionDialog?.dismiss() + permissionDialog = null } override fun permissionDenied(permission: String) { -// requestPermission(arrayOf(permission)) + permissionDialog?.dismiss() + permissionDialog = null } override fun onClick(v: View?) { @@ -322,18 +326,23 @@ class DeviceCategoryActivity : PActivity(), MyCallback, CRecyclerView.RecyclerI intent.putExtra(Constant.EXTRA_IS_ENABLE_SCAN_FROM_PIC,true) startActivityForResult(intent, CommonField.QR_CODE_REQUEST_CODE) } else { - var dlg = PermissionDialog(this@DeviceCategoryActivity, getString(R.string.permission_of_wifi), getString(R.string.permission_of_wifi_lips)) - dlg.show() - dlg.setOnDismisListener(object : PermissionDialog.OnDismisListener { - override fun OnClickRefuse() { - - } + // 查看请求camera权限的时间是否大于48小时 + var cameraJsonString = Utils.getStringValueFromXml(T.getContext(), CommonField.PERMISSION_CAMERA, CommonField.PERMISSION_CAMERA) + var cameraJson: JSONObject? = JSONObject.parse(cameraJsonString) as JSONObject? + val lasttime = cameraJson?.getLong(CommonField.PERMISSION_CAMERA) + if (lasttime != null && lasttime > 0 && System.currentTimeMillis() / 1000 - lasttime < 48*60*60) { + T.show(getString(R.string.permission_of_camera_scan_refuse)) + return + } + requestPermission(permissions) + permissionDialog = PermissionDialog(App.activity, R.mipmap.permission_camera ,getString(R.string.permission_camera_lips), getString(R.string.permission_camera)) + permissionDialog!!.show() - override fun OnClickOK() { - requestPermission(permissions) - } + // 记录请求camera权限的时间 + var json = JSONObject() + json.put(CommonField.PERMISSION_CAMERA, System.currentTimeMillis() / 1000) + Utils.setXmlStringValue(T.getContext(), CommonField.PERMISSION_CAMERA, CommonField.PERMISSION_CAMERA, json.toJSONString()) - }) } } // iv_question -> { @@ -489,18 +498,6 @@ class DeviceCategoryActivity : PActivity(), MyCallback, CRecyclerView.RecyclerI private fun beginScanning() { if (!checkPermissions(blueToothPermissions)) { - var dlg = PermissionDialog(this@DeviceCategoryActivity, getString(R.string.permission_of_wifi), getString(R.string.permission_of_wifi_lips)) - dlg.show() - dlg.setOnDismisListener(object : PermissionDialog.OnDismisListener { - override fun OnClickRefuse() { - - } - - override fun OnClickOK() { - requestPermission(blueToothPermissions) - } - - }) return } diff --git a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/LoginActivity.kt b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/LoginActivity.kt index 830853f39..f8cad18e8 100644 --- a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/LoginActivity.kt +++ b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/LoginActivity.kt @@ -3,9 +3,9 @@ package com.tencent.iot.explorer.link.kitlink.activity import android.Manifest import android.content.Intent import android.os.Handler -import android.text.Editable -import android.text.TextUtils -import android.text.TextWatcher +import android.text.* +import android.text.method.LinkMovementMethod +import android.text.style.ClickableSpan import android.view.LayoutInflater import android.view.View import android.widget.TextView @@ -28,6 +28,7 @@ import com.tencent.iot.explorer.link.core.auth.callback.MyCallback import com.tencent.iot.explorer.link.core.auth.entity.User import com.tencent.iot.explorer.link.core.auth.response.BaseResponse import com.tencent.iot.explorer.link.core.utils.KeyBoardUtils +import com.tencent.iot.explorer.link.customview.dialog.PermissionDialog import kotlinx.android.synthetic.main.activity_login2.* import kotlinx.android.synthetic.main.layout_account_passwd_login.view.* import kotlinx.android.synthetic.main.layout_verify_code_login.view.* @@ -53,6 +54,10 @@ class LoginActivity : PActivity(), LoginView, View.OnClickListener, WeChatLogin Manifest.permission.SEND_SMS ) + private var permissionDialog: PermissionDialog? = null + private var agreement = false + private val ANDROID_ID = Utils.getAndroidID(T.getContext()) + override fun onResume() { super.onResume() if (!TextUtils.isEmpty(fromTag) && fromTag == CommonField.WAY_SOURCE) { @@ -72,11 +77,6 @@ class LoginActivity : PActivity(), LoginView, View.OnClickListener, WeChatLogin override fun initView() { App.data.regionId = "1" App.data.region = "ap-guangzhou" - if (!checkPermissions(permissions)) { - requestPermission(permissions) - } else { - permissionAllGranted() - } intent.getStringExtra("from")?.let { fromTag = it } @@ -98,6 +98,171 @@ class LoginActivity : PActivity(), LoginView, View.OnClickListener, WeChatLogin verifyCodeLoginView.tv_login_to_country_byverifycode.text = getString(R.string.country_china) + getString(R.string.conutry_code_num, presenter.getCountryCode()) loadLastCountryInfo() + + formatTipText() + + iv_login_agreement.setImageResource(R.mipmap.icon_unselected) + iv_login_agreement_status.visibility = View.GONE + + if (!checkPermissions(permissions)) { + // 查看请求sms权限的时间是否大于48小时 + var smsJsonString = Utils.getStringValueFromXml(T.getContext(), CommonField.PERMISSION_SMS, CommonField.PERMISSION_SMS) + var smsJson: JSONObject? = JSONObject.parse(smsJsonString) as JSONObject? + val lasttime = smsJson?.getLong(CommonField.PERMISSION_SMS) + if (lasttime != null && lasttime > 0 && System.currentTimeMillis() / 1000 - lasttime < 48*60*60) { + T.show(getString(R.string.permission_of_sms_refuse)) + return + } + permissionDialog = PermissionDialog(this@LoginActivity, R.mipmap.permission_sms, getString(R.string.permission_sms_lips), getString(R.string.permission_sms)) + permissionDialog!!.show() + requestPermission(permissions) + + // 记录请求sms权限的时间 + var json = JSONObject() + json.put(CommonField.PERMISSION_SMS, System.currentTimeMillis() / 1000) + Utils.setXmlStringValue(T.getContext(), CommonField.PERMISSION_SMS, CommonField.PERMISSION_SMS, json.toJSONString()) + } else { + permissionAllGranted() + } + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == 102) { + if (permissions.contains(Manifest.permission.READ_SMS)) { + permissionDialog?.dismiss() + permissionDialog = null + } + } + } + + private fun formatTipText() { + val str = resources.getString(R.string.register_agree_1) + val partStr1 = resources.getString(R.string.register_agree_2) + val partStr2 = resources.getString(R.string.register_agree_3) + val partStr3 = resources.getString(R.string.register_agree_4) + val partStr4 = "," + val partStr5 = resources.getString(R.string.rule_content_list) + val partStr6 = resources.getString(R.string.personal_information_list) + var showStr = str + partStr1 + partStr4 + partStr3 + partStr4 + partStr5 + partStr2 + partStr6 + val spannable = SpannableStringBuilder(showStr) + spannable.setSpan(object : ClickableSpan() { + override fun onClick(widget: View) { + if (presenter.getCountryCode() == "86") { + if (Utils.getLang().contains(CommonField.ZH_TAG)) { + val intent = Intent(this@LoginActivity, WebActivity::class.java) + intent.putExtra(CommonField.EXTRA_TITLE, getString(R.string.register_agree_2)) + var url = CommonField.POLICY_PREFIX + url += "?uin=$ANDROID_ID" + url += CommonField.SERVICE_POLICY_SUFFIX + intent.putExtra(CommonField.EXTRA_TEXT, url) + startActivity(intent) + } else { + OpensourceLicenseActivity.startWebWithExtra(this@LoginActivity, getString(R.string.register_agree_2), CommonField.SERVICE_AGREEMENT_URL_CN_EN) + } + } else { + var url = "" + if (Utils.getLang().contains(CommonField.ZH_TAG)) { + url = CommonField.SERVICE_AGREEMENT_URL_US_ZH + } else { + url = CommonField.SERVICE_AGREEMENT_URL_US_EN + } + OpensourceLicenseActivity.startWebWithExtra(this@LoginActivity, getString(R.string.register_agree_2), url) + } + } + + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = resources.getColor(R.color.blue_0066FF) + ds.setUnderlineText(false); + } + }, + str.length, str.length + partStr1.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + + spannable.setSpan(object : ClickableSpan() { + override fun onClick(widget: View) { + if (presenter.getCountryCode() == "86") { + if (Utils.getLang().contains(CommonField.ZH_TAG)) { + val intent = Intent(this@LoginActivity, WebActivity::class.java) + intent.putExtra(CommonField.EXTRA_TITLE, getString(R.string.register_agree_4)) + var url = CommonField.POLICY_PREFIX + url += "?uin=$ANDROID_ID" + url += CommonField.PRIVACY_POLICY_SUFFIX + intent.putExtra(CommonField.EXTRA_TEXT, url) + startActivity(intent) + } else { + OpensourceLicenseActivity.startWebWithExtra(this@LoginActivity, getString(R.string.register_agree_4), CommonField.PRIVACY_POLICY_URL_CN_EN) + } + } else { + var url = "" + if (Utils.getLang().contains(CommonField.ZH_TAG)) { + url = CommonField.PRIVACY_POLICY_URL_US_ZH + } else { + url = CommonField.PRIVACY_POLICY_URL_US_EN + } + OpensourceLicenseActivity.startWebWithExtra(this@LoginActivity, getString(R.string.register_agree_4), url) + } + + } + + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = resources.getColor(R.color.blue_0066FF) + ds.setUnderlineText(false); + } + + }, + str.length + partStr1.length + partStr2.length, str.length + partStr1.length + partStr2.length + partStr3.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + + spannable.setSpan(object : ClickableSpan() { + override fun onClick(widget: View) { + var url = "" + if (Utils.getLang().contains(CommonField.ZH_TAG)) { + url = CommonField.THIRD_SDK_URL_US_ZH + } else { + url = CommonField.THIRD_SDK_URL_US_EN + } + OpensourceLicenseActivity.startWebWithExtra(this@LoginActivity, getString(R.string.rule_content_list), url) + + } + + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = resources.getColor(R.color.blue_0066FF) + ds.setUnderlineText(false); + } + + }, + showStr.length - partStr6.length - partStr2.length - partStr5.length, showStr.length - partStr6.length - partStr2.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + + spannable.setSpan(object : ClickableSpan() { + override fun onClick(widget: View) { + + var url = "" + if (Utils.getLang().contains(CommonField.ZH_TAG)) { + url = CommonField.PERSONAL_INFO_URL_US_ZH + } else { + url = CommonField.PERSONAL_INFO_URL_US_EN + } + OpensourceLicenseActivity.startWebWithExtra(this@LoginActivity, getString(R.string.personal_information_list), url) + + } + + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = resources.getColor(R.color.blue_0066FF) + ds.setUnderlineText(false); + } + + }, + showStr.length - partStr6.length, showStr.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + + tv_login_tip.setMovementMethod(LinkMovementMethod.getInstance()) + tv_login_tip.setText(spannable) } private fun loadLastCountryInfo() { @@ -158,6 +323,8 @@ class LoginActivity : PActivity(), LoginView, View.OnClickListener, WeChatLogin verifyCodeLoginView.et_login_phone_or_email_byverifycode.setText("") verifyCodeLoginView.et_login_phone_or_email_verifycode.setText("") iv_wechat_login.setOnClickListener(this) + + iv_login_agreement.setOnClickListener(this) } private fun pwd2Check() { @@ -275,11 +442,19 @@ class LoginActivity : PActivity(), LoginView, View.OnClickListener, WeChatLogin val account = accoutPasswdLoginView.et_login_phone_or_email.text.trim().toString() val passwd = accoutPasswdLoginView.et_login_phone_or_email_passwd.text.trim().toString() if (!account.contains("@")) { // 手机登录 - presenter.setPhoneData(account, passwd) - presenter.phoneCommit() + if (agreement) { + presenter.setPhoneData(account, passwd) + presenter.phoneCommit() + } else { + T.show(getString(R.string.toast_register_agreement)) + } } else { // 邮箱登录 - presenter.setEmailData(account, passwd) - presenter.emailCommit() + if (agreement) { + presenter.setEmailData(account, passwd) + presenter.emailCommit() + } else { + T.show(getString(R.string.toast_register_agreement)) + } } KeyBoardUtils.hideKeyBoard(this, accoutPasswdLoginView.et_login_phone_or_email_passwd) } @@ -289,16 +464,24 @@ class LoginActivity : PActivity(), LoginView, View.OnClickListener, WeChatLogin if (!account.contains("@")) {// 手机登录 presenter.setPhone(account) if (!TextUtils.isEmpty(verifycode)) { - presenter.setVerifyCode(verifycode) - presenter.phoneVerifyCodeCommit() + if (agreement) { + presenter.setVerifyCode(verifycode) + presenter.phoneVerifyCodeCommit() + } else { + T.show(getString(R.string.toast_register_agreement)) + } } else { T.show(getString(R.string.phone_verifycode_empty)) } } else {// 邮箱登录 presenter.setEmail(account) if (!TextUtils.isEmpty(verifycode)) { - presenter.setVerifyCode(verifycode) - presenter.emailVerifyCodeCommit() + if (agreement) { + presenter.setVerifyCode(verifycode) + presenter.emailVerifyCodeCommit() + } else { + T.show(getString(R.string.toast_register_agreement)) + } } else { T.show(getString(R.string.email_verifycode_empty)) } @@ -341,6 +524,16 @@ class LoginActivity : PActivity(), LoginView, View.OnClickListener, WeChatLogin verifyCodeLoginView.tv_login_to_country_byverifycode, verifyCodeLoginView.iv_login_to_country_byverifycode -> {// 验证码登录时选则国家 startActivityForResult(Intent(this, RegionActivity::class.java), 100) } + iv_login_agreement -> { + agreement = !agreement + if (agreement) { + iv_login_agreement.setImageResource(R.mipmap.readed) + iv_login_agreement_status.visibility = View.VISIBLE + } else { + iv_login_agreement.setImageResource(R.mipmap.icon_unselected) + iv_login_agreement_status.visibility = View.GONE + } + } } } diff --git a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/MainActivity.kt b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/MainActivity.kt index a729ff462..199ac5889 100644 --- a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/MainActivity.kt +++ b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/MainActivity.kt @@ -72,21 +72,15 @@ class MainActivity : PActivity(), MyCallback { private var familyPopup: FamilyListPopup? = null - private var isForceUpgrade = true + private var permissionDialog: PermissionDialog? = null - private var permissions = arrayOf( - Manifest.permission.CAMERA, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.RECORD_AUDIO - ) + private var isForceUpgrade = true private var scanPermissions = arrayOf( Manifest.permission.CAMERA, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.CHANGE_WIFI_STATE, - Manifest.permission.CHANGE_WIFI_MULTICAST_STATE, - Manifest.permission.ACCESS_FINE_LOCATION + Manifest.permission.CHANGE_WIFI_MULTICAST_STATE ) override fun getContentView(): Int { @@ -154,20 +148,6 @@ class MainActivity : PActivity(), MyCallback { FirebaseAnalytics.getInstance(this).setUserId(userId) openXGPush() home_bottom_view.addUnclickAbleItem(2) // 限定2号位置不可选中 - if (!checkPermissions(permissions)) { - var dlg = PermissionDialog(this@MainActivity, getString(R.string.permission_of_mic_camera), getString(R.string.permission_of_mic_camera_lips)) - dlg.show() - dlg.setOnDismisListener(object : PermissionDialog.OnDismisListener { - override fun OnClickRefuse() { - - } - - override fun OnClickOK() { - requestPermission(permissions) - } - - }) - } LogcatHelper.getInstance(this).start() home_bottom_view.addMenu( BottomItemEntity( @@ -256,7 +236,23 @@ class MainActivity : PActivity(), MyCallback { intent.putExtra(Constant.EXTRA_IS_ENABLE_SCAN_FROM_PIC, true) startActivityForResult(intent, CommonField.QR_CODE_REQUEST_CODE) } else { + // 查看请求camera权限的时间是否大于48小时 + var cameraJsonString = Utils.getStringValueFromXml(T.getContext(), CommonField.PERMISSION_CAMERA, CommonField.PERMISSION_CAMERA) + var cameraJson: JSONObject? = JSONObject.parse(cameraJsonString) as JSONObject? + val lasttime = cameraJson?.getLong(CommonField.PERMISSION_CAMERA) + if (lasttime != null && lasttime > 0 && System.currentTimeMillis() / 1000 - lasttime < 48*60*60) { + T.show(getString(R.string.permission_of_camera_scan_refuse)) + return + } + permissionDialog = PermissionDialog(App.activity, R.mipmap.permission_camera ,getString(R.string.permission_camera_lips), getString(R.string.permission_camera)) + permissionDialog!!.show() requestPermission(scanPermissions) + + // 记录请求camera权限的时间 + var json = JSONObject() + json.put(CommonField.PERMISSION_CAMERA, System.currentTimeMillis() / 1000) + Utils.setXmlStringValue(T.getContext(), CommonField.PERMISSION_CAMERA, CommonField.PERMISSION_CAMERA, json.toJSONString()) + } } } @@ -308,6 +304,8 @@ class MainActivity : PActivity(), MyCallback { intent.putExtra(Constant.EXTRA_IS_ENABLE_SCAN_FROM_PIC,true) startActivityForResult(intent, CommonField.QR_CODE_REQUEST_CODE) } + permissionDialog?.dismiss() + permissionDialog = null } } diff --git a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/MarkerPaddingActivity.java b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/MarkerPaddingActivity.java index f210926b8..8dbb1090c 100644 --- a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/MarkerPaddingActivity.java +++ b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/MarkerPaddingActivity.java @@ -29,12 +29,15 @@ import com.scwang.smart.refresh.layout.SmartRefreshLayout; import com.scwang.smart.refresh.layout.api.RefreshLayout; import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener; +import com.tencent.iot.explorer.link.App; import com.tencent.iot.explorer.link.R; import com.tencent.iot.explorer.link.T; import com.tencent.iot.explorer.link.core.auth.callback.MyCallback; import com.tencent.iot.explorer.link.core.auth.http.HttpCallBack; import com.tencent.iot.explorer.link.core.auth.http.HttpUtil; import com.tencent.iot.explorer.link.core.auth.response.BaseResponse; +import com.tencent.iot.explorer.link.core.utils.Utils; +import com.tencent.iot.explorer.link.customview.dialog.PermissionDialog; import com.tencent.iot.explorer.link.kitlink.adapter.PostionsAdapter; import com.tencent.iot.explorer.link.kitlink.consts.CommonField; import com.tencent.iot.explorer.link.kitlink.entity.AdInfo; @@ -65,7 +68,8 @@ public class MarkerPaddingActivity extends BaseActivity implements TencentMap.OnCameraChangeListener, View.OnClickListener, TencentLocationListener { private final int PAGE_SIZE = 20; - private final String[] permissions = {permission.ACCESS_COARSE_LOCATION, permission.READ_PHONE_STATE, permission.WRITE_EXTERNAL_STORAGE}; + private PermissionDialog permissionDialog = null; + private final String[] permissions = {permission.ACCESS_COARSE_LOCATION}; public MapView mMapView; private TencentMap mTencentMap; private RecyclerView recyclerView; @@ -131,12 +135,35 @@ public void autoLocate(String address) { tagPostionByAddress(address); } } else { + // 查看请求location权限的时间是否大于48小时 + String locationJsonString = Utils.INSTANCE.getStringValueFromXml(this, CommonField.PERMISSION_LOCATION, CommonField.PERMISSION_LOCATION); + long lasttime = 0L; + if (locationJsonString != null) { + JSONObject locationJson = JSON.parseObject(locationJsonString); + lasttime = locationJson.getLong(CommonField.PERMISSION_LOCATION); + } + if (locationJsonString != null && lasttime > 0 && System.currentTimeMillis() / 1000 - lasttime < 48 * 60 * 60) { + T.show(getString(R.string.permission_of_location_family_address_refuse)); + return; + } + if (permissionDialog == null) { + permissionDialog = new PermissionDialog(this, R.mipmap.permission_camera ,getString(R.string.permission_camera_lips), getString(R.string.permission_camera)); + permissionDialog.show(); + } requestPermission(permissions); + + // 记录请求location权限的时间 + JSONObject json = new JSONObject(); + json.put(CommonField.PERMISSION_LOCATION, System.currentTimeMillis() / 1000); + Utils.INSTANCE.setXmlStringValue(this, CommonField.PERMISSION_LOCATION, CommonField.PERMISSION_LOCATION, json.toJSONString()); + } } @Override public void onRequestPermissionsResult(int requestCode, @NotNull String[] permissions, @NotNull int[] grantResults) { + permissionDialog.dismiss(); + permissionDialog = null; for (int i = 0; i < permissions.length; i++) { if (grantResults[i] == PackageManager.PERMISSION_DENIED) { permissionDenied(permissions[i]); diff --git a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/PrivicyDialogActivity.kt b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/PrivicyDialogActivity.kt new file mode 100644 index 000000000..547aed055 --- /dev/null +++ b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/PrivicyDialogActivity.kt @@ -0,0 +1,89 @@ +package com.tencent.iot.explorer.link.kitlink.activity + +import android.content.Intent +import android.text.TextUtils +import com.tencent.iot.explorer.link.App +import com.tencent.iot.explorer.link.R +import com.tencent.iot.explorer.link.T +import com.tencent.iot.explorer.link.core.utils.Utils +import com.tencent.iot.explorer.link.customview.dialog.UserAgreeDialog +import com.tencent.iot.explorer.link.kitlink.consts.CommonField + + +class PrivicyDialogActivity : BaseActivity() { + + private var dialog: UserAgreeDialog? = null + private val ANDROID_ID = Utils.getAndroidID(T.getContext()) + + override fun getContentView(): Int { + return R.layout.activity_privicy_dialog + } + + override fun initView() { + if (!TextUtils.isEmpty(App.data.getToken())) { + startActivity(Intent(this, MainActivity::class.java)) + return + } + // 21.11.20 产品沟通这里展示默认的中国对应的协议。 + dialog = UserAgreeDialog(this@PrivicyDialogActivity) + dialog!!.show() + dialog!!.setOnDismisListener(object : UserAgreeDialog.OnDismisListener { + override fun onDismised() { + onBackPressed() + } + override fun onOkClicked() { + Utils.setXmlStringValue(this@PrivicyDialogActivity, CommonField.AGREED_RULE_FLAG, CommonField.AGREED_RULE_FLAG, "1") + finish() + App.toLogin() + } + + override fun onOkClickedUserAgreement() { + if (Utils.getLang().contains(CommonField.ZH_TAG)) { + val intent = Intent(this@PrivicyDialogActivity, WebActivity::class.java) + intent.putExtra(CommonField.EXTRA_TITLE, getString(R.string.register_agree_2)) + var url = CommonField.POLICY_PREFIX + url += "?uin=$ANDROID_ID" + url += CommonField.SERVICE_POLICY_SUFFIX + intent.putExtra(CommonField.EXTRA_TEXT, url) + startActivity(intent) + } else { + OpensourceLicenseActivity.startWebWithExtra(this@PrivicyDialogActivity, getString(R.string.register_agree_2), CommonField.SERVICE_AGREEMENT_URL_CN_EN) + } + } + + override fun onOkClickedPrivacyPolicy() { + if (Utils.getLang().contains(CommonField.ZH_TAG)) { + val intent = Intent(this@PrivicyDialogActivity, WebActivity::class.java) + intent.putExtra(CommonField.EXTRA_TITLE, getString(R.string.register_agree_4)) + var url = CommonField.POLICY_PREFIX + url += "?uin=$ANDROID_ID" + url += CommonField.PRIVACY_POLICY_SUFFIX + intent.putExtra(CommonField.EXTRA_TEXT, url) + startActivity(intent) + } else { + OpensourceLicenseActivity.startWebWithExtra(this@PrivicyDialogActivity, getString(R.string.register_agree_4), CommonField.PRIVACY_POLICY_URL_CN_EN) + } + } + + override fun onOkClickedThirdSDKList() { + var url = "" + if (Utils.getLang().contains(CommonField.ZH_TAG)) { + url = CommonField.THIRD_SDK_URL_US_ZH + } else { + url = CommonField.THIRD_SDK_URL_US_EN + } + OpensourceLicenseActivity.startWebWithExtra(this@PrivicyDialogActivity, getString(R.string.rule_content_list), url) + } + }) + } + + override fun setListener() { + + } + + override fun onDestroy() { + dialog?.dismiss() + dialog = null + super.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/RegisterActivity.kt b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/RegisterActivity.kt index cc99b9afb..edcb14620 100644 --- a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/RegisterActivity.kt +++ b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/RegisterActivity.kt @@ -17,6 +17,7 @@ import com.tencent.iot.explorer.link.T import com.tencent.iot.explorer.link.core.utils.KeyBoardUtils import com.tencent.iot.explorer.link.core.utils.Utils import com.tencent.iot.explorer.link.customview.dialog.InputBirthdayDialog +import com.tencent.iot.explorer.link.customview.dialog.PermissionDialog import com.tencent.iot.explorer.link.customview.dialog.UserAgreeDialog import com.tencent.iot.explorer.link.kitlink.consts.CommonField import com.tencent.iot.explorer.link.kitlink.consts.SocketConstants @@ -52,6 +53,7 @@ class RegisterActivity : PActivity(), RegisterView, View.OnClickListener { private lateinit var phoneView: View private lateinit var emailView: View + private var permissionDialog: PermissionDialog? = null private val ANDROID_ID = Utils.getAndroidID(T.getContext()) override fun getPresenter(): IPresenter? { @@ -85,6 +87,7 @@ class RegisterActivity : PActivity(), RegisterView, View.OnClickListener { phoneView.et_register_phone.setText(account) } } + presenter.agreement() if (presenter.isAgreement()) { iv_register_agreement.setImageResource(R.mipmap.readed) iv_register_agreement_status.visibility = View.VISIBLE @@ -99,21 +102,50 @@ class RegisterActivity : PActivity(), RegisterView, View.OnClickListener { phoneView.layout_phone_country.visibility = View.GONE emailView.layout_email_country.visibility = View.GONE - iv_register_agreement.visibility = View.INVISIBLE +// iv_register_agreement.visibility = View.INVISIBLE loadLastCountryInfo() // showBirthDayDlg() -// formatTipText() + formatTipText() checkIfShowAgreeDlg() } + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == 102) { + if (permissions.contains(Manifest.permission.READ_SMS)) { + permissionDialog?.dismiss() + permissionDialog = null + } + } + } + private fun checkIfShowAgreeDlg() { var agreed = Utils.getStringValueFromXml(this@RegisterActivity, CommonField.AGREED_RULE_FLAG, CommonField.AGREED_RULE_FLAG) agreed?.let { if (it == "1") { presenter.agreement() if (!checkPermissions(permissions)) { + // 查看请求sms权限的时间是否大于48小时 + var smsJsonString = Utils.getStringValueFromXml(T.getContext(), CommonField.PERMISSION_SMS, CommonField.PERMISSION_SMS) + var smsJson: JSONObject? = JSONObject.parse(smsJsonString) as JSONObject? + val lasttime = smsJson?.getLong(CommonField.PERMISSION_SMS) + if (lasttime != null && lasttime > 0 && System.currentTimeMillis() / 1000 - lasttime < 48*60*60) { + T.show(getString(R.string.permission_of_sms_refuse)) + return + } + permissionDialog = PermissionDialog(this@RegisterActivity, R.mipmap.permission_sms, getString(R.string.permission_sms_lips), getString(R.string.permission_sms)) + permissionDialog!!.show() requestPermission(permissions) + + // 记录请求sms权限的时间 + var json = JSONObject() + json.put(CommonField.PERMISSION_SMS, System.currentTimeMillis() / 1000) + Utils.setXmlStringValue(T.getContext(), CommonField.PERMISSION_SMS, CommonField.PERMISSION_SMS, json.toJSONString()) } else { permissionAllGranted() } @@ -199,7 +231,10 @@ class RegisterActivity : PActivity(), RegisterView, View.OnClickListener { val partStr1 = resources.getString(R.string.register_agree_2) val partStr2 = resources.getString(R.string.register_agree_3) val partStr3 = resources.getString(R.string.register_agree_4) - var showStr = str + partStr1 + partStr2 + partStr3 + val partStr4 = "," + val partStr5 = resources.getString(R.string.rule_content_list) + val partStr6 = resources.getString(R.string.personal_information_list) + var showStr = str + partStr1 + partStr4 + partStr3 + partStr4 + partStr5 + partStr2 + partStr6 val spannable = SpannableStringBuilder(showStr) spannable.setSpan(object : ClickableSpan() { override fun onClick(widget: View) { @@ -267,7 +302,50 @@ class RegisterActivity : PActivity(), RegisterView, View.OnClickListener { } }, - showStr.length - partStr1.length, showStr.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + str.length + partStr1.length + partStr2.length, str.length + partStr1.length + partStr2.length + partStr3.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + + spannable.setSpan(object : ClickableSpan() { + override fun onClick(widget: View) { + var url = "" + if (Utils.getLang().contains(CommonField.ZH_TAG)) { + url = CommonField.THIRD_SDK_URL_US_ZH + } else { + url = CommonField.THIRD_SDK_URL_US_EN + } + OpensourceLicenseActivity.startWebWithExtra(this@RegisterActivity, getString(R.string.rule_content_list), url) + + } + + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = resources.getColor(R.color.blue_0066FF) + ds.setUnderlineText(false); + } + + }, + showStr.length - partStr6.length - partStr2.length - partStr5.length, showStr.length - partStr6.length - partStr2.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + + spannable.setSpan(object : ClickableSpan() { + override fun onClick(widget: View) { + + var url = "" + if (Utils.getLang().contains(CommonField.ZH_TAG)) { + url = CommonField.PERSONAL_INFO_URL_US_ZH + } else { + url = CommonField.PERSONAL_INFO_URL_US_EN + } + OpensourceLicenseActivity.startWebWithExtra(this@RegisterActivity, getString(R.string.personal_information_list), url) + + } + + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = resources.getColor(R.color.blue_0066FF) + ds.setUnderlineText(false); + } + + }, + showStr.length - partStr6.length, showStr.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) tv_register_tip.setMovementMethod(LinkMovementMethod.getInstance()) tv_register_tip.setText(spannable) diff --git a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/UserInfoActivity.kt b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/UserInfoActivity.kt index 499064589..56275bb6e 100644 --- a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/UserInfoActivity.kt +++ b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/activity/UserInfoActivity.kt @@ -13,6 +13,7 @@ import android.view.View import android.view.ViewGroup.MarginLayoutParams import android.widget.TextView import com.alibaba.fastjson.JSON +import com.alibaba.fastjson.JSONObject import com.tencent.iot.explorer.link.App import com.tencent.iot.explorer.link.R import com.tencent.iot.explorer.link.core.log.L @@ -25,6 +26,7 @@ import com.tencent.iot.explorer.link.mvp.view.UserInfoView import com.tencent.iot.explorer.link.T import com.tencent.iot.explorer.link.core.utils.Utils import com.tencent.iot.explorer.link.customview.dialog.ListOptionsDialog +import com.tencent.iot.explorer.link.customview.dialog.PermissionDialog import com.tencent.iot.explorer.link.kitlink.consts.CommonField import com.tencent.iot.explorer.link.kitlink.entity.EditNameValue import com.tencent.iot.explorer.link.kitlink.util.picture.imageselectorbrowser.ImageSelectorActivity @@ -52,12 +54,16 @@ class UserInfoActivity : PActivity(), UserInfoView, View.OnClickListener, View.O private val duration = 3 * 1000.toLong() //规定有效时间 private val hits = LongArray(counts) + private var optionDialog: ListOptionsDialog? = null + private var permissionDialog: PermissionDialog? = null + private var clickCamera = false + private var clickAlbum = false + companion object { const val TIMEZONE_REQUESTCODE = 100 } private var permissions = arrayOf( - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE ) @@ -111,9 +117,7 @@ class UserInfoActivity : PActivity(), UserInfoView, View.OnClickListener, View.O override fun onClick(v: View?) { when (v) { tv_title_avatar, iv_avatar, iv_avatar_arrow -> { - if (checkPermissions(permissions)) - showCameraPopup() - else requestPermission(permissions) + showCameraPopup() } tv_title_nick -> { showEditPopup() @@ -168,13 +172,53 @@ class UserInfoActivity : PActivity(), UserInfoView, View.OnClickListener, View.O var options = ArrayList() options.add(getString(R.string.take_photo)) options.add(getString(R.string.select_local_album)) - var optionDialog = ListOptionsDialog(this, options) - optionDialog.show() - optionDialog.setOnDismisListener { + optionDialog = ListOptionsDialog(this, options) + optionDialog!!.show() + optionDialog!!.setOnDismisListener { if (it == 0) { - ImageSelectorUtils.show(this, ImageSelectorActivity.Mode.MODE_SINGLE, true, 1) + if (checkPermissions(arrayOf(Manifest.permission.CAMERA))) + ImageSelectorUtils.show(this, ImageSelectorActivity.Mode.MODE_SINGLE, true, 1) + else { + clickCamera = true + // 查看请求camera权限的时间是否大于48小时 + var cameraJsonString = Utils.getStringValueFromXml(T.getContext(), CommonField.PERMISSION_CAMERA, CommonField.PERMISSION_CAMERA) + var cameraJson: JSONObject? = JSONObject.parse(cameraJsonString) as JSONObject? + val lasttime = cameraJson?.getLong(CommonField.PERMISSION_CAMERA) + if (lasttime != null && lasttime > 0 && System.currentTimeMillis() / 1000 - lasttime < 48*60*60) { + T.show(resources.getString(R.string.permission_of_camera_refuse)) + return@setOnDismisListener + } + permissionDialog = PermissionDialog(App.activity, R.mipmap.permission_camera ,getString(R.string.permission_camera_lips), getString(R.string.permission_camera_avatar)) + permissionDialog!!.show() + requestPermission(arrayOf(Manifest.permission.CAMERA)) + + // 记录请求camera权限的时间 + var json = JSONObject() + json.put(CommonField.PERMISSION_CAMERA, System.currentTimeMillis() / 1000) + Utils.setXmlStringValue(T.getContext(), CommonField.PERMISSION_CAMERA, CommonField.PERMISSION_CAMERA, json.toJSONString()) + } } else if (it == 1) { - ImageSelectorUtils.show(this, ImageSelectorActivity.Mode.MODE_MULTI, false, 1) + if (checkPermissions(permissions)) + ImageSelectorUtils.show(this, ImageSelectorActivity.Mode.MODE_MULTI, false, 1) + else { + clickAlbum = true + // 查看请求album权限的时间是否大于48小时 + var albumJsonString = Utils.getStringValueFromXml(T.getContext(), CommonField.PERMISSION_ALBUM, CommonField.PERMISSION_ALBUM) + var albumJson: JSONObject? = JSONObject.parse(albumJsonString) as JSONObject? + val lasttime = albumJson?.getLong(CommonField.PERMISSION_ALBUM) + if (lasttime != null && lasttime > 0 && System.currentTimeMillis() / 1000 - lasttime < 48*60*60) { + T.show(resources.getString(R.string.permission_of_album_refuse)) + return@setOnDismisListener + } + permissionDialog = PermissionDialog(App.activity, R.mipmap.permission_album ,getString(R.string.permission_album_lips), getString(R.string.permission_album_avatar)) + permissionDialog!!.show() + requestPermission(permissions) + + // 记录请求album权限的时间 + var json = JSONObject() + json.put(CommonField.PERMISSION_ALBUM, System.currentTimeMillis() / 1000) + Utils.setXmlStringValue(T.getContext(), CommonField.PERMISSION_ALBUM, CommonField.PERMISSION_ALBUM, json.toJSONString()) + } } } } @@ -217,11 +261,25 @@ class UserInfoActivity : PActivity(), UserInfoView, View.OnClickListener, View.O } override fun permissionAllGranted() { - showCameraPopup() + if (clickCamera) { + clickCamera = false + ImageSelectorUtils.show(this, ImageSelectorActivity.Mode.MODE_SINGLE, true, 1) + } else if (clickAlbum) { + clickAlbum = false + ImageSelectorUtils.show(this, ImageSelectorActivity.Mode.MODE_MULTI, false, 1) + } + permissionDialog?.dismiss() + permissionDialog = null } override fun permissionDenied(permission: String) { - requestPermission(arrayOf(permission)) + if (permission.contains(Manifest.permission.CAMERA)) { + T.show(resources.getString(R.string.permission_of_camera_refuse)) + } else if (permissions.contains(permission)) { + T.show(resources.getString(R.string.permission_of_album_refuse)) + } + permissionDialog?.dismiss() + permissionDialog = null } override fun logout() { diff --git a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/consts/CommonField.kt b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/consts/CommonField.kt index de5822583..f2a3015cf 100644 --- a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/consts/CommonField.kt +++ b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/consts/CommonField.kt @@ -226,4 +226,12 @@ object CommonField { const val DEFINE_TYPE_TIMESTAMP = "timestamp" const val DEFINE_TYPE_STRUCT = "struct" + + const val PERMISSION_SMS = "PermissionSms" + const val PERMISSION_CAMERA = "PermissionCamera" + const val PERMISSION_ALBUM = "PermissionAlbum" + const val PERMISSION_LOCATION = "PermissionLocation" + const val PERMISSION_MIC = "PermissionMic" + const val PERMISSION_STORAGE = "PermissionStorage" + } \ No newline at end of file diff --git a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/fragment/DeviceFragment.kt b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/fragment/DeviceFragment.kt index 2a11014d3..ce5d0a0fa 100644 --- a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/fragment/DeviceFragment.kt +++ b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/fragment/DeviceFragment.kt @@ -13,6 +13,7 @@ import android.view.ViewGroup import android.widget.* import androidx.core.content.ContextCompat import com.alibaba.fastjson.JSON +import com.alibaba.fastjson.JSONObject import com.squareup.picasso.Picasso import com.tencent.iot.explorer.link.App import com.tencent.iot.explorer.link.ErrorMessage @@ -35,6 +36,8 @@ import com.tencent.iot.explorer.link.T import com.tencent.iot.explorer.link.core.auth.response.BaseResponse import com.tencent.iot.explorer.link.core.link.entity.BleDevice import com.tencent.iot.explorer.link.core.link.service.BleConfigService +import com.tencent.iot.explorer.link.core.utils.Utils +import com.tencent.iot.explorer.link.customview.dialog.PermissionDialog import com.tencent.iot.explorer.link.kitlink.activity.BleConfigHardwareActivity import com.tencent.iot.explorer.link.kitlink.activity.BuleToothActivity import com.tencent.iot.explorer.link.kitlink.activity.SmartConfigStepActivity @@ -63,6 +66,7 @@ class DeviceFragment() : BaseFragment(), MyCallback, AdapterView.OnItemClickList @Volatile private var conditionPrefix = false + private var permissionDialog: PermissionDialog? = null private var permissions = arrayOf( Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.CHANGE_WIFI_STATE, @@ -221,7 +225,23 @@ class DeviceFragment() : BaseFragment(), MyCallback, AdapterView.OnItemClickList isRecommDeviceClicked = false } } + // 查看请求location权限的时间是否大于48小时 + var locationJsonString = Utils.getStringValueFromXml(T.getContext(), CommonField.PERMISSION_LOCATION, CommonField.PERMISSION_LOCATION) + var locationJson: JSONObject? = JSONObject.parse(locationJsonString) as JSONObject? + val lasttime = locationJson?.getLong(CommonField.PERMISSION_LOCATION) + if (lasttime != null && lasttime > 0 && System.currentTimeMillis() / 1000 - lasttime < 48*60*60) { + T.show(getString(R.string.permission_of_location_add_device_refuse)) + return + } + permissionDialog = PermissionDialog(App.activity, R.mipmap.permission_location ,getString(R.string.permission_location_lips), getString(R.string.permission_location_ssid)) + permissionDialog!!.show() requestPermissions(permissions,1) + + // 记录请求location权限的时间 + var json = JSONObject() + json.put(CommonField.PERMISSION_LOCATION, System.currentTimeMillis() / 1000) + Utils.setXmlStringValue(T.getContext(), CommonField.PERMISSION_LOCATION, CommonField.PERMISSION_LOCATION, json.toJSONString()) + } else { when (parent.id) { R.id.gv_recommend_devices->{ // 根据推荐设备的配网方式,跳转到SmartConfig或者SoftAp配网界面 @@ -262,6 +282,8 @@ class DeviceFragment() : BaseFragment(), MyCallback, AdapterView.OnItemClickList jumpActivity(SmartConfigStepActivity::class.java) } } + permissionDialog?.dismiss() + permissionDialog = null } fun setListener() { diff --git a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/fragment/HomeFragment.kt b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/fragment/HomeFragment.kt index 90ecddd20..99b07eeff 100644 --- a/app/src/main/java/com/tencent/iot/explorer/link/kitlink/fragment/HomeFragment.kt +++ b/app/src/main/java/com/tencent/iot/explorer/link/kitlink/fragment/HomeFragment.kt @@ -1,18 +1,22 @@ package com.tencent.iot.explorer.link.kitlink.fragment +import android.Manifest import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter +import android.content.pm.PackageManager import android.os.Handler import android.text.TextUtils import android.view.View +import androidx.core.app.ActivityCompat import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.alibaba.fastjson.JSON import com.alibaba.fastjson.JSONException +import com.alibaba.fastjson.JSONObject import com.google.android.material.appbar.AppBarLayout import com.scwang.smart.refresh.footer.ClassicsFooter import com.scwang.smart.refresh.header.ClassicsHeader @@ -34,6 +38,7 @@ import com.tencent.iot.explorer.link.core.log.L import com.tencent.iot.explorer.link.customview.dialog.DevModeSetDialog import com.tencent.iot.explorer.link.customview.dialog.entity.KeyBooleanValue import com.tencent.iot.explorer.link.customview.dialog.MoreOptionDialog +import com.tencent.iot.explorer.link.customview.dialog.PermissionDialog import com.tencent.iot.explorer.link.customview.dialog.entity.DevOption import com.tencent.iot.explorer.link.customview.dialog.entity.OptionMore import com.tencent.iot.explorer.link.kitlink.activity.ControlPanelActivity @@ -52,6 +57,7 @@ import com.tencent.iot.explorer.link.mvp.IPresenter import com.tencent.iot.explorer.link.mvp.presenter.HomeFragmentPresenter import com.tencent.iot.explorer.link.mvp.view.HomeFragmentView import com.tencent.iot.explorer.link.rtc.model.RoomKey +import com.tencent.iot.explorer.link.core.utils.Utils import kotlinx.android.synthetic.main.fragment_main.* import kotlinx.android.synthetic.main.header.* import kotlinx.android.synthetic.main.inside_fixed_bar.* @@ -68,6 +74,12 @@ class HomeFragment : BaseFragment(), HomeFragmentView, MyCallback, PayloadMessag private var roomList: ArrayList = ArrayList() private var roomsAdapter: RoomsAdapter? = null private var handler = Handler() + private var permissionDialog: PermissionDialog? = null + private var requestCameraPermission = false + private var requestStoragePermission = false + private var requestRecordAudioPermission = false + private var deviceListEnd = false + private var shareDeviceListEnd = false override fun getContentView(): Int { return R.layout.fragment_main @@ -392,7 +404,7 @@ class HomeFragment : BaseFragment(), HomeFragmentView, MyCallback, PayloadMessag override fun onSaveClicked() { var value = "" if (!devOption.modeInt!!.ifInteger) { - var len = Utils.length(devOption!!.modeInt!!.step) + var len = w_length(devOption!!.modeInt!!.step) value = String.format("%.${len}f", dialog.progress) } else { value = dialog.progress.toInt().toString() @@ -404,6 +416,24 @@ class HomeFragment : BaseFragment(), HomeFragmentView, MyCallback, PayloadMessag }) } + fun w_length(num: Float): Int { + var len = 1 + val str = num.toString() + val parts = str.split(".") + if (parts != null && parts.size == 2) { + for (i in parts[1].length - 1 downTo 1) { + if (parts[1][i].toString() != "0") { + len = i + 1 + break + } + } + } + if (len <= 0) { + len = 1 + } + return len + } + private fun convertOptionMore(dev: DeviceEntity, shortCut: ProductUIDevShortCutConfig) : OptionMore { var optionMore = OptionMore() optionMore.title = dev.getAlias() @@ -589,6 +619,115 @@ class HomeFragment : BaseFragment(), HomeFragmentView, MyCallback, PayloadMessag } else { layout_no_dev_2_show.visibility = View.GONE } + requestCameraPermission = false + requestRecordAudioPermission = false + requestStoragePermission = false + + if (deviceListEnd) { + this.deviceListEnd = true + } + if (shareDeviceListEnd) { + this.shareDeviceListEnd = true + } + if (this.deviceListEnd && this.shareDeviceListEnd) { + requestPermission() + } + } + + private fun requestPermission() { + + if ((shareDevList.size > 0 || devList.size > 0) && permissionDialog == null) { + if (!checkPermissions(Manifest.permission.CAMERA) && !requestCameraPermission) { + // 查看请求camera权限的时间是否大于48小时 + var cameraJsonString = Utils.getStringValueFromXml(T.getContext(), CommonField.PERMISSION_CAMERA, CommonField.PERMISSION_CAMERA) + var cameraJson: JSONObject? = JSONObject.parse(cameraJsonString) as JSONObject? + val lasttime = cameraJson?.getLong(CommonField.PERMISSION_CAMERA) + if (lasttime != null && lasttime > 0 && System.currentTimeMillis() / 1000 - lasttime < 48*60*60) { + requestCameraPermission = true + T.show(getString(R.string.permission_of_camera_trtc_refuse)) + return + } + permissionDialog = PermissionDialog(App.activity, R.mipmap.permission_camera ,getString(R.string.permission_camera_lips), getString(R.string.permission_camera_trtc)) + permissionDialog!!.show() + requestPermissions(arrayOf(Manifest.permission.CAMERA), 103) + requestCameraPermission = true + + // 记录请求camera权限的时间 + var json = JSONObject() + json.put(CommonField.PERMISSION_CAMERA, System.currentTimeMillis() / 1000) + Utils.setXmlStringValue(T.getContext(), CommonField.PERMISSION_CAMERA, CommonField.PERMISSION_CAMERA, json.toJSONString()) + return + } + requestCameraPermission = true + if (!checkPermissions(Manifest.permission.RECORD_AUDIO) && !requestRecordAudioPermission) { + // 查看请求mic权限的时间是否大于48小时 + var micJsonString = Utils.getStringValueFromXml(T.getContext(), CommonField.PERMISSION_MIC, CommonField.PERMISSION_MIC) + var micJson: JSONObject? = JSONObject.parse(micJsonString) as JSONObject? + val lasttime = micJson?.getLong(CommonField.PERMISSION_MIC) + if (lasttime != null && lasttime > 0 && System.currentTimeMillis() / 1000 - lasttime < 48*60*60) { + requestRecordAudioPermission = true + T.show(getString(R.string.permission_of_camera_mic_refuse)) + return + } + permissionDialog = PermissionDialog(App.activity, R.mipmap.permission_mic ,getString(R.string.permission_mic_lips), getString(R.string.permission_camera_trtc)) + permissionDialog!!.show() + requestPermissions(arrayOf(Manifest.permission.RECORD_AUDIO), 104) + requestRecordAudioPermission = true + + // 记录请求mic权限的时间 + var json = JSONObject() + json.put(CommonField.PERMISSION_MIC, System.currentTimeMillis() / 1000) + Utils.setXmlStringValue(T.getContext(), CommonField.PERMISSION_MIC, CommonField.PERMISSION_MIC, json.toJSONString()) + return + } + requestRecordAudioPermission = true + if ((!checkPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE) || !checkPermissions(Manifest.permission.READ_EXTERNAL_STORAGE)) && !requestStoragePermission) { + // 查看请求storage权限的时间是否大于48小时 + var storageJsonString = Utils.getStringValueFromXml(T.getContext(), CommonField.PERMISSION_STORAGE, CommonField.PERMISSION_STORAGE) + var storageJson: JSONObject? = JSONObject.parse(storageJsonString) as JSONObject? + val lasttime = storageJson?.getLong(CommonField.PERMISSION_STORAGE) + if (lasttime != null && lasttime > 0 && System.currentTimeMillis() / 1000 - lasttime < 48*60*60) { + requestStoragePermission = true + T.show(getString(R.string.permission_of_camera_mic_refuse)) + return + } + permissionDialog = PermissionDialog(App.activity, R.mipmap.permission_album ,getString(R.string.permission_storage_lips), getString(R.string.permission_storage)) + permissionDialog!!.show() + requestPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE), 105) + requestStoragePermission = true + + // 记录请求storage权限的时间 + var json = JSONObject() + json.put(CommonField.PERMISSION_STORAGE, System.currentTimeMillis() / 1000) + Utils.setXmlStringValue(T.getContext(), CommonField.PERMISSION_STORAGE, CommonField.PERMISSION_STORAGE, json.toJSONString()) + return + } + requestStoragePermission = true + } + } + + private fun checkPermissions(permission: String): Boolean { + if (App.activity?.let { ActivityCompat.checkSelfPermission(it, permission) } == PackageManager.PERMISSION_DENIED) { + L.e(permission + "被拒绝") + return false + } + L.e(permission + "已经申请成功") + return true + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (permissions.contains(Manifest.permission.CAMERA) || permissions.contains(Manifest.permission.RECORD_AUDIO) || permissions.contains(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { + permissionDialog?.dismiss() + permissionDialog = null + if (!requestCameraPermission || !requestRecordAudioPermission || !requestStoragePermission) { + requestPermission() + } + } } override fun showDeviceOnline() { diff --git a/app/src/main/res/drawable/background_permission.xml b/app/src/main/res/drawable/background_permission.xml index 7213b6484..34649117b 100644 --- a/app/src/main/res/drawable/background_permission.xml +++ b/app/src/main/res/drawable/background_permission.xml @@ -4,8 +4,7 @@ diff --git a/app/src/main/res/layout/activity_login2.xml b/app/src/main/res/layout/activity_login2.xml index 080465720..aa06e664d 100644 --- a/app/src/main/res/layout/activity_login2.xml +++ b/app/src/main/res/layout/activity_login2.xml @@ -25,6 +25,69 @@ android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@+id/back_btn_login"/> + + + + + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/ll_register_agreement"> + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_register.xml b/app/src/main/res/layout/activity_register.xml index c62175d67..833720dfc 100644 --- a/app/src/main/res/layout/activity_register.xml +++ b/app/src/main/res/layout/activity_register.xml @@ -60,8 +60,8 @@ android:id="@+id/iv_register_agreement_status" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="4dp" android:layout_centerInParent="true" + android:padding="4dp" android:src="@mipmap/success" /> @@ -102,6 +102,6 @@ android:text="@string/get_code" android:textColor="@color/white" android:textSize="@dimen/ts_16" - app:layout_constraintTop_toBottomOf="@+id/vp_register" /> + app:layout_constraintTop_toBottomOf="@+id/ll_register_agreement" /> \ No newline at end of file diff --git a/app/src/main/res/layout/popup_permission_layout.xml b/app/src/main/res/layout/popup_permission_layout.xml index 3654b8540..8f3e6d447 100644 --- a/app/src/main/res/layout/popup_permission_layout.xml +++ b/app/src/main/res/layout/popup_permission_layout.xml @@ -8,142 +8,56 @@ - - + + + + - - - - - - - - - - - - - - - - - - + android:layout_alignStart="@+id/tv_title" + android:layout_below="@id/tv_title" + android:layout_marginTop="12dp" + android:layout_marginEnd="20dp" + android:text="@string/app_logo_name" + android:textColor="@color/black" + android:textSize="@dimen/ts_14" /> + - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/permission_album.png b/app/src/main/res/mipmap-hdpi/permission_album.png new file mode 100644 index 0000000000000000000000000000000000000000..0c109ff052c4e4de3a4cee4eb3227759d7de99db GIT binary patch literal 1594 zcmV-A2F3Y_P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NHq)9|URA>e5nCpvGRTRK|l#`V` z2y{ZxYNSbeVA|852T@dJh4i8l!>CVv2tO440rkxw=v(w9O(8O&2zx*Tfm%)pJqRO< zhGIso(4Ly5{(gJTx}I_Fy>ss4+#56te)sI>+H0-7_C9B3(xeHQh(Jpbm|S3Xkue3- zG&ST%Q?r<)(NnT#vpU)}Pg|zeQdTXx(H7pHSWiJM#cgW;7d?kEUB}y%nxiq+v##M9 zeK{fZ&9EJQ0mnK< zCpzWGnXGjQ+yN(msk{rGfs`3GM(UXJ8gJw^{ss67!f=YoF`u0hBRvFz@HiMaQ~N5| z0#owW)15TT2HQ5lR&e|7ffaBQoDN1n2X(A$SRzH<)G^o>L1ciLk)m&dxi$yf7IXe{ zP?my@odz>NXO=@qC@b@6uoMl}Hf@{>)8L5dqZoCgt^5OfL66<4{h$)Dycp7Cp6)=W zWFHH8nYgBxOR_y2pgu~BsNyqkWYqI*X<)a0syU#MM&F(I6wG^fNGy9cyrrBQj#4aL zs;;G>)g%UQq*G&;fNk%?o1mDBU6=73@YSsoVYK!Cl+2O^S2{SLsg9O19dKcd(s;ipAAqyLKT>q&d-xcB0^h6`!Xo$`&Vg012I{6! z84l#5Zba{b+rUU0dB5x5hS$M&jN_FL;7V8tI(aep9cDV!ly*CiH~u_UT>(BL>O+** zgNN0z?vfHtd_?&SFx8xMD|`uGLyV<(OsX~>>u#u|F1K4_Zic5|F8l?i%rC+9k&-=g~z}{eLd`g1K{5#6=~Li zeAG4cez*=?Km*-+Bld1q4@aqvE6#WPR=5Ce0Mqb3&|XuiBF#9U@`$9V;(?3n@l?u2 zYF+kptj^YpI^APL{mN@_KA4)`UP|<(N+S;Bqdtw<%U~%O5%b&yHp9lO9*&M$kiH_~ z9OwIHHW*JpRXs%=$QwToWe-Cin4jJ-L$Dt5*JGnmXZk3KRPq}2X7Zh&L#Ag%YB`|6 zAx0vU`Jaj9;0}1p#P#?JPrX4rgbwg+=*hRe9oHjjnwH4@gJ|%)^?*T4w~-DQWj!1O zPrGSx8N3Cn;97|5(eWGLJy3!97~7mrJDS@juHkpoA~3+p4`3=y4hQsd2V4Ofdm~&8 zbHJC9uk~+X9ef92Y>EQ)vcz>XegWJL+NLd^fRY@D2yUZ6!}~yoW`M?5<&ci&KE)BZA*d7J3w2-2|d3QJj}DfgWU}W zjQk*YJ_jHjT%HwMj(32*VX@wBCf8|6c@-0+j1!)dmtAYXATM07*qoM6N<$f{%CCGXMYp literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/permission_camera.png b/app/src/main/res/mipmap-hdpi/permission_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..3f97fa1b6de8c0c031b2a7f9d10d13061999615b GIT binary patch literal 1459 zcmV;k1x)&hP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NH9Z5t%RA>e5m`RHrRTzfjJR~L# ztx+Udh|xqE6buBXMi(NAAh;D34Cu<8`V)kZECVVS`~gk~f-amVoIu2l13_rffQhrl zd3c_C@7vZb>ej8H?N+%TJh#q#-tV06oT~0MYi2fEf!PZDr&r*pWl(=)$1&`81pL{t zfA4NiE`6=n7`-~9{1~_#w!zWR)SUM)ybEtZ=UwRIfZ=yLTmip88&j|$?reBstL(x&dtK80U|k&ROj5T<**}@FPSU$)Qow4nH*b6!njUDmq2hV^D z=X~Wk%l#^MfPQ1<;C3tv8f!#G@tSQ-uY=RU{=O^RddDcXQ=s)1!mZ$8J_Q~C%ca(; zcA&Pygi1vz-0^mRpBHCAZYG5>kE8Gox;B(0C zy-Yfmvg9W|`#O-YapiTwmy>0WfS(p#zvfQ`!|EFN33T)}*ag;W?p78gWrK>kpKNhm zn@M%)yFh~rK=IoB@FckUhLSsQ2p)&~MtR%X=Tgud%bm1sWAU_Iic!;T%?Y*b;3tJ) zqj10Ry)w&YnRQQtZFSCF(K6OB*Wx#;*rLmzsavg`2Ae?ves&~|%@=BfWzC@Nxkp=YV>};4)P`@IcDBE*4+TMwa=TNb=J|jBa>#u zULpMv_}$|w-w9WPZ{F;Jq2)`=I$xf){SaOPEn^LHEq?pFiJeq|z5^bDdqB~a-vrl! zHMdEmkI(E9usZ2KAX5>Nj| ze-GHM&f>%(jqU{xviNP3!>o7(8}o*ZJJDM_V=RjUjuR*RN7b|N0{Dg%g?d{Z1g}l= z%Oaj}8aa?K%hP_7%r=U1#T6_u%RO^C8;4U@_0-v^b51(MP7re-Eze=D{jXzsHriNm z&Z4HJF{&Jh=dR*fxCH!A%j%I_5mSfrp9pGk2a67o9S@;+sMtlA2d}wXAax{H)D-Qx z^1ZPi)TS-zDer(Wr=v>N~b literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/permission_location.png b/app/src/main/res/mipmap-hdpi/permission_location.png new file mode 100644 index 0000000000000000000000000000000000000000..f0214cba43e4a05f0f0682518dfa426152e9bf9b GIT binary patch literal 1947 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 bwF3VG#4i9(x|%`?00000NkvXXu0mjfJlax1 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/permission_album.png b/app/src/main/res/mipmap-mdpi/permission_album.png new file mode 100644 index 0000000000000000000000000000000000000000..3efd6e604e49b7f7920ea2bef12cd83f8642364c GIT binary patch literal 1034 zcmV+l1oiugP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$?bV)=(R9FekmdS6;Q545pLlAR> z1r3#yvLI?$R0ta^Obb(jy_MKt-9NxiB9^8^42f6}q!t=OA{2?B3(*o&(ujGi;q&=< z=jHd_>rY%cdY>`9tk*xwnPuPsv zm+sgOm4j&ysxU~_vTqFZ{vH`GQ3M$l;iGjI`3!W(dWNbbp_Dl^7PFvDh`1>Ttftr=Fp z71$3`VI7PD)yDaGhL!S>wYQ-TX2BEaii)2?M={sHRPBPrunknK#c`RHN{FJq&U)k4 zL;jPq>UH`SJO&HUGx`ekpm~nf@FVe3Q}dapu@XU%0UbMGDBJ_9bv%56OVA%?%->dK%M##% za9D0|Go-%;m;in`kKhF;qE{hV0(#pCK1wVc8{FG-BQ%1wq`iVRH~|)PiDd~Wnb^w< zGh|>t&(*L7yln2m1Mo|l2W!FmWFM4RB?8jBo`lD(U?6YK!*CYNpj?0*;GN=eIHvHt z^;JOZTIWk)6O4oVa0t9LL!fh?!BJ3znYaO8AYTvV3J9mB+?&!}F9fgUQ#rg~(gNuw zeXn1C0XM)FxD5J9M3f^yr|#HAOhu4RsL0N^U~N5=-xBI&a+dOz>tr4sDR0LpRgRoFc4` z(_r0{2uRYwKv*bW#S1?#)8?<3Rqn;|r(H8#Vv5ktK?5v;M1<+odcYT^TJ!VT4D-Ry z%k-TA9r@jd!(!nKWt!`Za}$<;H)Z|^I%zAwf0x{y)jAfuR1QKXM6mC)D=~v>#&82& zb|M4qv>(F)XacPjEVTFFtrokc*=KWe-i97&GZ@@VB)f8FPVh6?4x_=UwZcuC|EyFK zoaKpsH!%jRp}o)nwFb}>(G9o2ch-UnqS$CwW%{v}uEGK6gkPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$?EJ;K`R9Fe+mP?OJK@@<;V;F2m zJmM8Wh=m{_#B3+Vj)jfK&f3Ngv9qwkLc~ri%p_wa79=7Id#sdQ+2DmuW!1`j4lh1YyYQ9za7mDoEuzc*|yn+MT$#!&x3X= z)ZYZWhb*Z}z_IGM0T00t%!aAt8_E&51hb%=tnG4tk~0IBjb_sS4O?J8ynr|0c%3+R zH5`Du@C?ES%_I>cb;_#=#X>Y|8@8zuu4o&4hu3fw=0M9z=qo0>7xb|m+^zu#+vl`D zK*Va6ItEsuJPxkH@+s`F&^7vV1w$zgcidNFve*}{vrYTN#cZ$(z^%M{cBj|KjRRZ%w{kFV>BhQ zjR6f~wT`JTqr;eEd6yN~R@Avo$`G7|-Jm#E-^OT4wE|JrD5u6TAtoDa4-A53Rot!{ zFb19h#j-osw-P=hMjEUpkOpfWPSSzpI|e)9EBHw|?z!0ro8Tm z+yr9MVHyU10O#N-C>y|wO5H&?1IibOElUH{$CS##I99)szWeE2a0(uR<(2#3m=$qr zR)8z+=)a=@PGZm2(e{G54dYO*o(IgaJFp1WLza}Cbeb@Lfyqo1hORIUR=htIIxnFt z=_UcMP%jp@LNS?Y1=X3@N63<@gSttvx<@G8|E;hKOh%m;)B~ta8*P=C+vwFib1I+{ z6a5UA;b?)Y^%u`d_-i=~ex~O^Tj!WqoFST%B_{!A=|~xa1+Wi}fIqt?Xkde0fGc3o zm_xI@jKro>ja3{LOPUx`_)mZ%H8!~g&Q07*qoM6N<$g2rK;P5=M^ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/permission_location.png b/app/src/main/res/mipmap-mdpi/permission_location.png new file mode 100644 index 0000000000000000000000000000000000000000..3078aaba9d79b29270d6d2cbf91e931a0a5398b4 GIT binary patch literal 1157 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/permission_mic.png b/app/src/main/res/mipmap-xhdpi/permission_mic.png new file mode 100644 index 0000000000000000000000000000000000000000..ada540e2374f5f5fe4a9c270b0d2082c3147b9ad GIT binary patch literal 2271 zcmV<52q5=~P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuENl8RORCodHnMsTlRTPGC02B}f z1c8J($e<{QLRctKf}u67y@(Qdbk`0Lo&klU*S900Gr_t$XJT?NZkR51Jf}7ZkPvV!SA5c$q4PRuR&6_ zz#3?S=%84=oL9ZdQyO(j2d{!hVG0}vSJrulf)1Mr=Ys+H4Q!tbSHnJVYt*(-bp;^K z&%*e}U>LZ+by&xb!B%jkcfujC&n2Lo1kZ^DunT^IT7poA(l|c`qo0Ja;QrQmukXQH zaJ7~6A3^yhSPmD0?FPjxcm@nw`ckY$>d1fu^%hKA45q!S{tG-08^Cl|($})7zXRI9 z^uGWM*f?-2ZG&QeZd(@*m?|YJbP-BD?RCH)>%i;qRpFjud%bOnSI+|b*jL*etBxgL zHl#1bYNU<;Xqg9}`}t3BCEf3vzySRP-HH8`jo=u^+TVcA2c=S*D^-SZNzrMPbFw?f z$DpLWP%=lyU5kIK z41f;1S{m#rZt7b05EP}1@oonxWH5<(?ACFi)HS?$$<>$Avn!6)%JL5 zX7Wa#mTc&224vDQZ+0boD%CYM#HLb%`x*cz^-JyIQnS_5SsQ%yP9RFn;ul*PG0ILf z16IL!cpKhqE-vF+TC>h^z*Yn>5F2Pi1KDMlz05^j={U3v6rOX^H{kWiW8s)dTzt$)kt@sI? z0Qec}=W$sX#Q@VgUxYt56lBqy)A?*qU>aSTzeHKHBNAPI*SG9S3~9in{odY_4N~3*|DoX)F<4{Z32PJPxj|{}=FlISTKBqHgD~ zejcdTKzZE>N^I=7>*cS8l#wX+_qzQs35@=Dm<8LwJ_g42HzBKOI(r~K0vao(tv;bLY=Y=a5N@DuDEQA7=XSeg&Qbwz;<6GWjx%rp zXn-l`bNL%^CDKR3t!o1vHW&uo6&3^FDw^&(pe~(vMPCF1s1BV{r+v(nyTGy9uN|ww zLpSqMY)<+TfEaU(DMrC;&>0QC6g~$7QZ)Pr?sdj~I_XyM$>F|tC5M4y_P{!L1&V1O zUBjt=0LFs-y;tvg(0Kz?N>tnzi9tI26pRE78UY``%MjfOSd23O6Tz__jIN}?^uRO# zW`h!kih3TTekqvx2G3Q08XOy&C^j#B$$)5g!V?V^a!oqVpsdq7z&>$=Vtd)AhKHXk z>_NB-O!-5g4*NSkfuq=7zLV>6FpHGIum-+_jGEIq12Qwji`AW*J@Yi5w zIFEhJf&|5@()m7)r@v`_FWd&vZ^oJW9+LKROrNBR066(}m<*F3Mj8+gz60RFSTwTe ze9Ck=)h9vlzg6j5kp2PJXxC14YAJh#Gga00ATPoJfw=oMy-A*Snnums%CI&F}BLKvj) z!ELb{j)IQa?t$i0VJet4!c07fbFmk zl%md#nhO5b6@VD*wRlJwjA<|tZUoN;#Y1x)?1A0jlOt03szf2d@BL@+ zEF@4AtCc!4Kudk2^TWo+oG&=VfLqSJ4xWIb7@(Qp2aw+l_D#SjRwH#j1vFTv*Mnt) zUBqpW$DifSZN4OZ2s*D+?z~E~0+#C%opdGrFe;PEZke5sUw|l{ozhB>TN&F_v}&KA tVTJRQoy(N3CGDGv%s{7s2=tE#{0jqn?4cc**#Q6m002ovPDHLkV1oR0AjJRx literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/permission_sms.png b/app/src/main/res/mipmap-xhdpi/permission_sms.png new file mode 100644 index 0000000000000000000000000000000000000000..486f244e76a4b92ef343a87f7991be0b3050444a GIT binary patch literal 1795 zcmV+e2mJVnP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuCZAnByRCodHn%RpSRTPKEHAamK zsNfP46jyLTMI^oqK?n*_)Ca*Q-^72xKf%8s`YQMke27U6(Ev zMhtw^ej^T7yW4-YHAhf1=(9%Xx6obmvGxSjRa7t8J(KczO$I@CAw>WFfPag@%0BlU zzfJ;T=yI&Ah1IYO>hwiz!Ndgo4u{|^n1T3Cv08=&5d-V!z8+Q-X8x%*x9F{|PWcfw z!460a6no|D-lmf+={QZxlW+ol1DDva#G$e%;wsR$Q4um-hDL8A_!Y=qCjt8Fff6c<$t z&Y*9Fhd^Jg>-)X%8Z=G-eWq4|NpiN&hu2{%R2rjwF-4#DgLkM0;W+5~RiJpjNBXUR zDCVB(Oj|x!oUptUw}7)g1ICr>!N3>?p2SGEWE&X#QcFO5P4KA?JSL!lN|SuDO~542 zZk^cL6;LNjldRLOfHBXm4;v=6@}Z+*EOqNnLQ~rn!}T^beGcfgaH>TIefY@Zagvbw zDa}()lI3TK^e^jKF58K%e!AU#ht|iHfH-smBVGrG;X^0~NOe}Cdl|LcK%IT?Gvpk_ zlVZ?*f4Cidw*L$c!dPS+35e6{@#qn-E+515@M}>wkm%k-`DwTW6yG>s0E3H8j=p`W zn`D`=&9DWcLvb{zyZ`!Gj{~bvFaZX60(=j@8`eQ2y1qv|27Y1kEmJH%0lvs2Q50uo zn%{dsJ#8x{%$3%y>$yfUjs!TM&S)#&3=CF>S3?5#sQ7kv1^D^OKBBIx!EK?Wk7c)& zy0&Euic{D6gT!v9*6>$@^ATr2IRbIoHWP6!9EHqMblvN&ki1d4q}_@p;U`ei$MP?r zEp6H^_Vu%u61$yR!{2cw!2SLSIEy-a5$ND{P?8*v2DuZKf!`R!KDHUGK9z%dgSxgZ z2K5}n@!kietlMd6@H@_n;0DIs539ggeiOa{gLamcIJ=GVF}Mqy+4l-K%+a;)SMVH6 z!wNV6yFp1}JGBvh$B}>prluGZz-QdKURT&c%(TZ^6eSmjqw+pq-0s2vT; z$5F*Wnglu9sp7{i*vR1u8)=FiAC+tS)-M4u@EykdbCWM0zN|a|Gw>yplS6e@Z1XS4 zzU=gq^m7cI_7zzBYJ0^UW>KQua1KC}BQ{tWoVr&|oh zj~71IZ-lDZwM|DvT@!i-Bq!oK5`g|md6|-d-3JUpriiBiG8C-abDtzKBus-i{qxE-1pFL3)mqUGuRFA z0jz!Cwt4POa24GMCL@7+PFpTj6K5hu702@X<1yF+yCL=x3r%xn zPy*&^cK-9q{p9z%<;6*7+~xcz_zj?2ZlS^Ng6?yrD)4QzzYTqzv||mizy6p26Pn;D z_Ln*dh-1#I%l6yCoONgOFgTMD2fhaU$ayokB>h&P9s4-r+Sv!2;Q-ht<4~NJXsfop zIthq31{>oZlK=xua0co!e-^yTJ0l6+!0qEL^cDCB>{qr)bzYJr<~Y!w;C~4MX4}ZiWs(2@002ovPDHLkV1jCBPMiP$ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/permission_album.png b/app/src/main/res/mipmap-xxhdpi/permission_album.png new file mode 100644 index 0000000000000000000000000000000000000000..74321d848b3e1e64e1ea0671bb4c9aa97e4c59dd GIT binary patch literal 2013 zcmZvdSwPZ>7RLX7z$9`3X%Vy(my9xTD=l*gS47Q0P{>jYMa{@P&142m$E~t(&tVXZV3ROr62&^ zBKUn)3i;obSqlBX{~oL~@pS_Lc}J4nNop)OQ$&c;u}8Km&${t=OF+V-e6*b=a2b_q zp%ci$>^S7dE$ zk=L&mxC69-mco|s);3faOdWI-{~MTi_zCH}y>CA^Mi5F~D!cE5_vWvQ@+|X8NSoPK zIZe4uFyISxiaR9%G85J^vFiu9T9YS8gGk`>9C`0DI|$sY+i83^!esE=h|E1DMKY8& zlQ*mYZ95XVZn@140Tvv;Z1(1sREm5g;!6eB>u?T0?wm|o>uT`U<7In6nCOn^im-Lg ztV=`qTzX4RN4}(7NssEd8!iqdjRmWksV4TE@+@>m{z$u?DNsLrr!{A%?Ccx!Bjffj zRx7hvB%;Ab%LiIF>BQN!oUa5?#GQb?ucNVvW@Q95)tk-hdexXu3l6OGFza0AN{0lS z<@r82C!tG9F|3DqQOV=gs=UdRGnsN$#gY}ZJYj1aV%~9YR)pWh{4|?q&gm9HggMI0 zxj`Ip(%(|xPQw+imQmn8XplvMmMF%hQtc%p`#h~~9=9^!xy=2v8r>kZ^Wt_JPr34H z`N^4I@40fOCl%Ro{ua+vn(avXko^6*$oLFmQ4qvBlw7#B(nh?YYvvLA0qe6H#D!QM zih7R!(VCXeC-dDkYy3h`HxblM8e>UXUNR7r7QltmwS2sP`d|f1S}!`%DO{@`)UU5n z20uZ|(jP1H;}(jB7ICsb5REu$-yPJ@D94!JQ0rSmiiLCZK|4rvWB7JWCdVFj`*s_! zo|b(C3=S^AjF+UMx>d%^RN%NNvdt*Lpnb&UhC>ERV^9Bt(Wq$>4~-80;(I`Wuk5mIenJoaUi$V=Z)L$Y_cYhF}GSaQDpA9I_C6nw&cI+N#SOW z65HUJtOGd@P^rr>JvQ5$UotEbxe?ZszM|FM-Oo?bu)SAL|oSyxY&%fVsy;w zDjM&pp`vf$wfX>F_6dqlc%0`_4DdPybdJmCp^7?(2dZP02ercKeKKliG;@A&Z2G z&jOYoN;qtD*S-+pnp@5qC8Qhg5cS7WG@3W?{zJHh5v~QcekY!L;e=|dvvbw7zLX^1 zdwo^AGT>y}o(cPKv)_8d()(O2`@FjF+x-8&d=_RXvyHTyd=`1O#Hr)l;^ZII_YIZK zd@P}14yoM+sw}h01?TDOl~JE4QTC7eJ&kohy5%>kqfS*^UB$z()Fa3J%8k(!c69J( zTO=U!AQ8y2#%5+ae?!nc>ni=tC)G%GH?6MmT5xmE$jhD`O7ZoQh1fj*cLNII>5AJv z`>zI?c6)Ud{1CW%CXshckhh9jnXa$jR46d|4WVlv0aDbQrdP&V9NGZ*3(F97Yy5q1b(CrrC!dOocdeSO%CA>GP2b7jclS+ z%ir{t<9K?<#^35>(t@!8A1g8zdX=Kj$^F?pni&qmD!xt!+YDB&lk=M-l5-Z;4^gpq zCmb&gJTY|us#AyYPh&>zZT6tVU(}vf_#wbX)_z%Q{&o(u;UXjZPll$E>A^Zx_Zc82 z>Xfr=e0UN8@;auyH=JnRkeYoli&M&L`^ZHY;D(px!@%&{1ZMQ~1l$~QgQqR~cl4u{ YHQ0qZ2py|~6W?De$==PbhR96(2jPf(-T(jq literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/permission_camera.png b/app/src/main/res/mipmap-xxhdpi/permission_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc1502d23028cdc3c9a1e404f449ec78f61be8b GIT binary patch literal 1716 zcmaJ?c|03-8~^2~MyzDCnz|Bqwc?m=tyWdjSe-!<#~e-ElsTfPB1CjP=~{E9(HfCa zO$j<$#?-Zr;k7b?R!O~e#L=l^rh>&E+x~jrKfcfRIlj-I&-Y=w5-%S@sv!XYhwSYL zBpK88fsm8MX>Q^f8A0Mmm+_!xKtm!c2*FKv#~5Q8xYi74);x^B-OZ4So8X#ktmz`@$Qwll|-Kzy99X z@~Am9pT)|t!J-gwDD!{Q9}wnUwPSA=7rK*&M$0Eg3(_cCh3lL5?i7fYodGS)q}B7~ zn*(b*f@TJ%MzuPQ?w*zJXzVF=cHgL2e@AyGK9XOZDxA#SHQ4cNj(@KMR$R(`TW7wE z7rRSpwKS8)zjJ%CC1^OX^4rRV!9!L4i_^C4+dde{b(R)mUR?N|fh%DZh1i~Lo7Z%6 zaPF9U>w$3_6Fp}E1*yWF-9;Q0{HbKI?6uPymYgpinpwiFQNV;NE!BZoMprmPlfJOAc zvgG|kulPBn+H7Q>8V3G)_nqNuowEzYS!&8B#b+O3B<9Rt)ioqXNyT3t86PBvy19f_SJLxrBs_y;Z8f*iGenYd^jsWOfGivt6&Iea%Z7Esuu+wfvRG z*AVOPcwFIe+G#Ne{d9u+efT8YD?4}m>dne==50O2 zoA*U}XaT)wbP`@C#m)7&b&vv#K#sP*QD_-HAY3>xL)IZoS%Ng{A@h1iPkan(V47`n?%*ftFDza*Cs8{YR>vyx?pv zRT>IWHdMelb`Gv3=BMAKG%l9r00vvY*KCjvX9KWByfK$HGp_9M)8YJr1?|}jj!HOR zpZ5@Xg~&Bs!At@9nWg7~)wkrjkRp)>2)vmYUC!m|N*>@-$D|?s#6%mMa?Xc?VQ2gp z=H_pYl6EIH@N9PfMDk_>M;>T+KmcCuvdU6+cjO*TQUP*V2h838S}5 z9JD4YFT4;lLW4XJ^H5~_xdZgZwViDdpU2pX+KEGnonlca_!(XCg!I8ln)=@2_%Z(A ztguvcTUGB;_~D?`rrDK6=K8JPKU@(vJFteTA)~7t<@SV~3CHJ)`K=uCG*> zbW8qGtWAOs`?z)DJv{J9_P8i>32tEBiM%epujwZj!JIkgb#iXph2O#69ri;@>z>OuP-!`_xisKL`R{sKTc@r?ig literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/permission_location.png b/app/src/main/res/mipmap-xxhdpi/permission_location.png new file mode 100644 index 0000000000000000000000000000000000000000..e7a3720f40b3ee4c88fdc4fed0730fd63c87873c GIT binary patch literal 2369 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 cNP>4nl&*QvXdU?PzwC>h)d|AWY01akAcmMzZ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/permission_mic.png b/app/src/main/res/mipmap-xxhdpi/permission_mic.png new file mode 100644 index 0000000000000000000000000000000000000000..e08a14726c82a019d0fd46d3baed8d9fd94beaf1 GIT binary patch literal 2127 zcmaJ?Ydq5p8~$&Gtr^=SEHaj!rjbgP^<06LN!3V_lB0m!yQ0*nLzAjJd$QW6Gj z_n6@SOleH1|K{65_7Pu40FZ66wKQ{!1AQ(#n5Aun?D-O^00N`QDbr{&RvrSYCX3`! zI1ekhYBF_cNCVi6++Lca8W_DR`Iy`cFHcPd1g=x*vcPh&WZFj3rN@0lt&OdiNT%ZI75;YUuG30e1Emd(L1kZBQCNaP7YXLSE#|2QGYn)oxYNY-?K$ceinX0P;ptiu4w| zx*cvrDt`~EA^dRV9!6nNiOcZ#Vol?8J$*9orwJJS^tQm2uhe^s(ILO!JGVKO8LUaW zz2~`br6lSrC(5-p$%ij1s3Xg-A_ngY4vK$N36DBHM1l!t3X}Z2RXoxjH_j)7veSjK#)KCw;g;bx`Lh^5Ur3bWOjeraLetMj5Uu#{}8`67$Kx_z8-Q zY179XSLad?xJQdt^-b-L=`@ePPDEX%hg7hst>}F0G<{-c>fd!({jq-N570yim(_w zLZLMt_nz8(J>ou7d5IfupWt1x8XlOTdeOm5MwC%5FKWN5{r=P24NTafFiNY+H6ywc z;SB9u_5mWu{?wAL?9wWkG-I4V_*y)CX>F;S3-_zjuWd~@JMKK!1QTHrCz_@m0|5_#%^B=O`4-;_tDd;0dYk0 zdRhdJFXJ1F6us@4u)A_{s_a3pQW2KxIa2*nS!-p|#~-!w%37oz$qLD}e;l&NdAs&% zwD_2PDH>r1u8l~nr9&~%4L^`VW=NmxKSS&Yu($~b>!Jd^y^73`nV;?6 zO6RWuVKy6QWiC5aKdT!w*?GPCv-a^b48IN0e%mcfNv`JM~+dq>;4s<*rr6Y+{_3~%v!R^*>O z`jPb%Jov?TdcZp=u;2@8(vwNK2l<% zvix5)Ba{GETUg}L+0iEm@cB~buJer~IE*mn$A>WX{bhcXP}L9uyE2PgGGDF_L6H+^ z{MU_-Qn8^&t68ot1rsvT+^GU{06&c8KG)M#>P!p?y$)ciEIx`&(1Os2^6n_1y!G8H zV3FkYRT%ybn~t2w^qR0cuukmgh~3MHvG%5rX_WX=Bqbz0pdnJBpF(Vo(m5?#adHkz zkLfL->vm`j9`wu^kPB;py&%+VF=u=VqfPC)15!z*`HtF~_E-Jjvs&1$-k+tYW;PkX zBe+2MT;u%k{-QqBGmV`H^W2dm@Jo<_ES+~GqVF}* z*;8d9D&mTy_A%km7S$M{nx>Qs!Go>8pFUJF^$7S-@2!c=5lbm`;WMpP+XS_1-zgl~ z4Q4MNTFiKFO~%puA^xH5gLG@|0CZsDU!|ZUiWlQ&*Tf}rCr-8U71qZ12MWV?ccPPU z4Za<_4qK}-HEfMVh$3gJJQ2Ilw|~?o8-H#6YQz5=$s)1U$jOtk#{BNu_T%R6rL z6a&M$7or#SJbv|r^KH0A(q^PdmD?TioJoYXgVznmM0sRqPiJxYGh=nxNr^@Nk7aH< dsH{TrFTfV3S`E2w*tBitwpNaoHRiOGe*i+(z#RYp literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/permission_sms.png b/app/src/main/res/mipmap-xxhdpi/permission_sms.png new file mode 100644 index 0000000000000000000000000000000000000000..e589e29af1ec286ad0a965024aa7309ea6c0e977 GIT binary patch literal 1341 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 H82kSK+Yn>e literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/permission_camera.png b/app/src/main/res/mipmap-xxxhdpi/permission_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..8d928a1389c74815dd6094a83a2c9cb43047fa86 GIT binary patch literal 4987 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/permission_mic.png b/app/src/main/res/mipmap-xxxhdpi/permission_mic.png new file mode 100644 index 0000000000000000000000000000000000000000..3679b948a19b8fcfb895a2064b37fd3bb457c8c4 GIT binary patch literal 5882 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 WH%~l>fz1E@I~(eo=vC=BM*bI`{5rG% literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/permission_sms.png b/app/src/main/res/mipmap-xxxhdpi/permission_sms.png new file mode 100644 index 0000000000000000000000000000000000000000..b697da9d3d11ab6fbef1240d650b2049eeb852df GIT binary patch literal 4253 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/values-en-rUS/strings.xml b/app/src/main/res/values-en-rUS/strings.xml index 090b0fc28..1add1aedf 100644 --- a/app/src/main/res/values-en-rUS/strings.xml +++ b/app/src/main/res/values-en-rUS/strings.xml @@ -699,12 +699,31 @@ Authority management Please authorize Tencent LLink the following permissions In order to provide you with the user agreement and privacy policy of your country/region, please select your country/region - In order to use the real-time communication of the device, Tencent LLink needs to obtain the following permissions: - · camera/microphone + 为了便于您扫码添加设备,因此腾讯连连需获取以下权限: + 为了实时接听使用设备的语音/视频通话功能,因此腾讯连连需获取以下权限: + 为了便于您拍照更换头像,因此腾讯连连需获取以下权限: + · 相机 + · 麦克风 + 为了便于您可选择本地图片以更换头像,因此腾讯连连需获取以下权限: + · 存储(相册) + 为了使用设备的实时语音/视频通话功能,记录运行日志,因此腾讯连连需获取以下权限: + · 存储(日志) + 为了便于给设备配网时,自动获取当前手机连接的WiFi名称,向设备发送WiFi信息完成配网,因此腾讯连连需获取以下权限: + · GPS 定位 + 为了方便您注册或登录时自动获取验证码,因此腾讯连连需获取以下权限: + · 短信 This step will configure the WiFi network for the hardware device to achieve communication, and bind the relationship between the hardware device and the APP user. Therefore, Tencent LLink needs to obtain the following permissions: · WiFi name、WiFi password\n· the IP of the mobile phone You will authorize the following personal information to be bound to your WeChat account: · nickname、profile photo、region、gender\n· device information + 您拒绝使用相机权限,无法修改头像 + 您拒绝访问相册权限,无法修改头像 + 您拒绝访问GPS定位,无法完成配网读取WiFi ssid信息 + 您拒绝使用读取短信权限,无法快速填充短信验证码 + 您拒绝使用相机权限,无法使用扫描二维码功能 + 您拒绝使用相机权限,无法使用实时语音/视频通话功能 + 您拒绝使用麦克风权限,无法使用实时语音/视频通话功能 + 您拒绝访问GPS定位,无法定位当前位置 diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 13c142d18..8ab0e85cb 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -699,12 +699,31 @@ 权限管理 请授权腾讯连连以下权限 为了向您提供对应国家/地区的用户协议和隐私政策,请您选择所在的国家及地区 - 为了使用设备的实时语音/视频通话功能,因此腾讯连连需 获取以下权限: - · 摄像头/麦克风 + 为了便于您扫码添加设备,因此腾讯连连需获取以下权限: + 为了实时接听使用设备的语音/视频通话功能,因此腾讯连连需获取以下权限: + 为了便于您拍照更换头像,因此腾讯连连需获取以下权限: + · 相机 + · 麦克风 + 为了便于您可选择本地图片以更换头像,因此腾讯连连需获取以下权限: + · 存储(相册) + 为了使用设备的实时语音/视频通话功能,记录运行日志,因此腾讯连连需获取以下权限: + · 存储(日志) + 为了便于给设备配网时,自动获取当前手机连接的WiFi名称,向设备发送WiFi信息完成配网,因此腾讯连连需获取以下权限: + · GPS 定位 + 为了方便您注册或登录时自动获取验证码,因此腾讯连连需获取以下权限: + · 短信 该步骤将为硬件设备配置WiFi网络实现通信,绑定硬件设备与APP用户之间的关系。因此 腾讯连连 需获取以下权限: · WiFi名称、WiFi密码\n· 手机IP地址 您将授权以下个人信息与微信账号绑定: · 昵称、头像、地区、性别\n· 设备信息 + 您拒绝使用相机权限,无法修改头像 + 您拒绝访问相册权限,无法修改头像 + 您拒绝访问GPS定位,无法完成配网读取WiFi ssid信息 + 您拒绝使用读取短信权限,无法快速填充短信验证码 + 您拒绝使用相机权限,无法使用扫描二维码功能 + 您拒绝使用相机权限,无法使用实时语音/视频通话功能 + 您拒绝使用麦克风权限,无法使用实时语音/视频通话功能 + 您拒绝访问GPS定位,无法定位当前位置 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 13c142d18..8ab0e85cb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -699,12 +699,31 @@ 权限管理 请授权腾讯连连以下权限 为了向您提供对应国家/地区的用户协议和隐私政策,请您选择所在的国家及地区 - 为了使用设备的实时语音/视频通话功能,因此腾讯连连需 获取以下权限: - · 摄像头/麦克风 + 为了便于您扫码添加设备,因此腾讯连连需获取以下权限: + 为了实时接听使用设备的语音/视频通话功能,因此腾讯连连需获取以下权限: + 为了便于您拍照更换头像,因此腾讯连连需获取以下权限: + · 相机 + · 麦克风 + 为了便于您可选择本地图片以更换头像,因此腾讯连连需获取以下权限: + · 存储(相册) + 为了使用设备的实时语音/视频通话功能,记录运行日志,因此腾讯连连需获取以下权限: + · 存储(日志) + 为了便于给设备配网时,自动获取当前手机连接的WiFi名称,向设备发送WiFi信息完成配网,因此腾讯连连需获取以下权限: + · GPS 定位 + 为了方便您注册或登录时自动获取验证码,因此腾讯连连需获取以下权限: + · 短信 该步骤将为硬件设备配置WiFi网络实现通信,绑定硬件设备与APP用户之间的关系。因此 腾讯连连 需获取以下权限: · WiFi名称、WiFi密码\n· 手机IP地址 您将授权以下个人信息与微信账号绑定: · 昵称、头像、地区、性别\n· 设备信息 + 您拒绝使用相机权限,无法修改头像 + 您拒绝访问相册权限,无法修改头像 + 您拒绝访问GPS定位,无法完成配网读取WiFi ssid信息 + 您拒绝使用读取短信权限,无法快速填充短信验证码 + 您拒绝使用相机权限,无法使用扫描二维码功能 + 您拒绝使用相机权限,无法使用实时语音/视频通话功能 + 您拒绝使用麦克风权限,无法使用实时语音/视频通话功能 + 您拒绝访问GPS定位,无法定位当前位置 \ No newline at end of file diff --git a/sdk/explorer-link-rtc/src/main/res/values/strings.xml b/sdk/explorer-link-rtc/src/main/res/values/strings.xml index b5742b63e..bd39239d5 100644 --- a/sdk/explorer-link-rtc/src/main/res/values/strings.xml +++ b/sdk/explorer-link-rtc/src/main/res/values/strings.xml @@ -43,4 +43,5 @@ 视频通话 语音通话 %s 结束通话 + "用户没有允许需要的权限,加入通话失败"