version:1.8.9
fix: update:密码界面统一,增加权限说明页面
This commit is contained in:
@@ -31,17 +31,8 @@ public class ExitActivity extends BaseDataBindingActivity {
|
||||
private int soundId;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
|
||||
AudioAttributes attr = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_GAME) // 设置音效使用场景
|
||||
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build(); // 设置音效的类型
|
||||
soundPool = new SoundPool.Builder().setAudioAttributes(attr) // 设置音效池的属性
|
||||
.setMaxStreams(1) // 设置最多可容纳10个音频流
|
||||
.build(); // ①
|
||||
// load方法加载指定音频文件,并返回所加载的音效ID
|
||||
// 此处使用HashMap来管理这些音频流
|
||||
soundId = soundPool.load(this, R.raw.click, 1);
|
||||
public boolean setNightMode() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -51,6 +42,16 @@ public class ExitActivity extends BaseDataBindingActivity {
|
||||
|
||||
@Override
|
||||
public void initView() {
|
||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
|
||||
AudioAttributes attr = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_GAME) // 设置音效使用场景
|
||||
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build(); // 设置音效的类型
|
||||
soundPool = new SoundPool.Builder().setAudioAttributes(attr) // 设置音效池的属性
|
||||
.setMaxStreams(1) // 设置最多可容纳10个音频流
|
||||
.build(); // ①
|
||||
// load方法加载指定音频文件,并返回所加载的音效ID
|
||||
// 此处使用HashMap来管理这些音频流
|
||||
soundId = soundPool.load(this, R.raw.click, 1);
|
||||
|
||||
InputMethodManager imm = (InputMethodManager) ExitActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.hideSoftInputFromWindow(mBinding.icv.getWindowToken(), 0);
|
||||
mBinding.icv.getEditText().setOnClickListener(new View.OnClickListener() {
|
||||
|
||||
@@ -26,9 +26,8 @@ public class PasswordActivity extends BaseDataBindingActivity {
|
||||
private ActivityPasswdBinding mBinding;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
|
||||
public boolean setNightMode() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -38,6 +37,8 @@ public class PasswordActivity extends BaseDataBindingActivity {
|
||||
|
||||
@Override
|
||||
public void initView() {
|
||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
|
||||
|
||||
InputMethodManager imm = (InputMethodManager) PasswordActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.hideSoftInputFromWindow(mBinding.icv.getWindowToken(), 0);
|
||||
mBinding.icv.getEditText().setOnClickListener(new View.OnClickListener() {
|
||||
|
||||
@@ -34,6 +34,7 @@ import com.tencent.mmkv.MMKV;
|
||||
import com.uiui.zyos.BuildConfig;
|
||||
import com.uiui.zyos.R;
|
||||
import com.uiui.zyos.activity.ExitActivity;
|
||||
import com.uiui.zyos.activity.permission.PermissionActivity;
|
||||
import com.uiui.zyos.activity.update.UpdateActivity;
|
||||
import com.uiui.zyos.base.mvvm.BaseMvvmActivity;
|
||||
import com.uiui.zyos.bean.AppUpdateInfo;
|
||||
@@ -213,6 +214,8 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
|
||||
|
||||
@Override
|
||||
public void initData() {
|
||||
registmNewAppReceiver();
|
||||
registmUpdateAddressReceiver();
|
||||
mViewModel.getAppUpdateInfoData().observe(this, new Observer<AppUpdateInfo>() {
|
||||
@Override
|
||||
public void onChanged(AppUpdateInfo appUpdateInfo) {
|
||||
@@ -231,9 +234,7 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
|
||||
}
|
||||
}
|
||||
});
|
||||
getStorgePermission();
|
||||
registmNewAppReceiver();
|
||||
registmUpdateAddressReceiver();
|
||||
mViewModel.checkUpdate();
|
||||
}
|
||||
|
||||
private void hideSystemUI() {
|
||||
@@ -335,7 +336,11 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
|
||||
if (agree == 0) {
|
||||
showPolicyDialog();
|
||||
} else {
|
||||
getPermission();
|
||||
if (checkPermission()) {
|
||||
Log.e(TAG, "onResume: all permission granted" );
|
||||
} else {
|
||||
startActivity(new Intent(MainActivity.this, PermissionActivity.class));
|
||||
}
|
||||
}
|
||||
setDefaultDesktop();
|
||||
}
|
||||
@@ -404,6 +409,10 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
|
||||
view.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
private boolean checkPermission() {
|
||||
return XXPermissions.isGranted(this, PermissionActivity.PERMISSION_CHECK);
|
||||
}
|
||||
|
||||
private String[] permission = new String[]{
|
||||
Permission.CALL_PHONE,
|
||||
Permission.WRITE_EXTERNAL_STORAGE,
|
||||
@@ -540,8 +549,11 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
|
||||
public void onConfirm() {
|
||||
mMMKV.encode("AgreePrivacyPolicy", 1);
|
||||
privacyPolicyDialog.dismiss();
|
||||
getPermission();
|
||||
getLocationPermission();
|
||||
if (checkPermission()) {
|
||||
Log.e(TAG, "onConfirm: all permission granted");
|
||||
} else {
|
||||
startActivity(new Intent(MainActivity.this, PermissionActivity.class));
|
||||
}
|
||||
}
|
||||
});
|
||||
privacyPolicyDialog.show();
|
||||
|
||||
@@ -0,0 +1,167 @@
|
||||
package com.uiui.zyos.activity.permission;
|
||||
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.hjq.permissions.OnPermissionCallback;
|
||||
import com.hjq.permissions.Permission;
|
||||
import com.hjq.permissions.XXPermissions;
|
||||
import com.uiui.zyos.R;
|
||||
import com.uiui.zyos.base.mvvm.BaseMvvmActivity;
|
||||
import com.uiui.zyos.databinding.ActivityPermissionBinding;
|
||||
import com.uiui.zyos.interceptor.PermissionInterceptor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PermissionActivity extends BaseMvvmActivity<PermissionViewModel, ActivityPermissionBinding> {
|
||||
private static final String TAG = "PermissionActivity";
|
||||
|
||||
|
||||
public static final String[] PERMISSION_CHECK = new String[]{
|
||||
Permission.WRITE_EXTERNAL_STORAGE,
|
||||
Permission.READ_PHONE_STATE,
|
||||
// Permission.WRITE_SETTINGS,
|
||||
Permission.ACCESS_COARSE_LOCATION,
|
||||
Permission.ACCESS_FINE_LOCATION,
|
||||
Permission.ACCESS_BACKGROUND_LOCATION,
|
||||
};
|
||||
|
||||
@Override
|
||||
public boolean setNightMode() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.activity_permission;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initDataBinding() {
|
||||
mViewModel.setCtx(this);
|
||||
mViewModel.setVDBinding(mViewDataBinding);
|
||||
mViewModel.setLifecycle(getLifecycleSubject());
|
||||
mViewDataBinding.setClick(new BtnClick());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initView() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initData() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
if (XXPermissions.isGranted(this, PermissionActivity.PERMISSION_CHECK)) {
|
||||
finish();
|
||||
}
|
||||
if (XXPermissions.isGranted(this, Permission.WRITE_EXTERNAL_STORAGE)) {
|
||||
mViewDataBinding.tvAuth0.setText("已授权");
|
||||
mViewDataBinding.tvAuth0.setEnabled(false);
|
||||
} else {
|
||||
mViewDataBinding.tvAuth0.setText("去授权");
|
||||
}
|
||||
if (XXPermissions.isGranted(this, Permission.READ_PHONE_STATE)) {
|
||||
mViewDataBinding.tvAuth1.setText("已授权");
|
||||
mViewDataBinding.tvAuth1.setEnabled(false);
|
||||
} else {
|
||||
mViewDataBinding.tvAuth1.setText("去授权");
|
||||
}
|
||||
if (XXPermissions.isGranted(this, Permission.WRITE_SETTINGS)) {
|
||||
mViewDataBinding.tvAuth2.setText("已授权");
|
||||
mViewDataBinding.tvAuth2.setEnabled(false);
|
||||
} else {
|
||||
mViewDataBinding.tvAuth2.setText("去授权");
|
||||
}
|
||||
if (XXPermissions.isGranted(this, Permission.ACCESS_COARSE_LOCATION)) {
|
||||
mViewDataBinding.tvAuth3.setText("已授权");
|
||||
mViewDataBinding.tvAuth3.setEnabled(false);
|
||||
} else {
|
||||
mViewDataBinding.tvAuth3.setText("去授权");
|
||||
}
|
||||
if (XXPermissions.isGranted(this, Permission.ACCESS_FINE_LOCATION)) {
|
||||
mViewDataBinding.tvAuth4.setText("已授权");
|
||||
mViewDataBinding.tvAuth4.setEnabled(false);
|
||||
} else {
|
||||
mViewDataBinding.tvAuth4.setText("去授权");
|
||||
}
|
||||
if (XXPermissions.isGranted(this, Permission.ACCESS_BACKGROUND_LOCATION)) {
|
||||
mViewDataBinding.tvAuth5.setText("已授权");
|
||||
mViewDataBinding.tvAuth5.setEnabled(false);
|
||||
} else {
|
||||
mViewDataBinding.tvAuth5.setText("去授权");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void getPermission(String... permissions) {
|
||||
XXPermissions.with(this)
|
||||
// 申请单个权限
|
||||
.permission(permissions)
|
||||
// 申请多个权限
|
||||
// .permission(Permission.Group.STORAGE)
|
||||
// 设置权限请求拦截器(局部设置)
|
||||
.interceptor(new PermissionInterceptor())
|
||||
// 设置不触发错误检测机制(局部设置)
|
||||
//.unchecked()
|
||||
.request(new OnPermissionCallback() {
|
||||
@Override
|
||||
public void onGranted(@NonNull List<String> permissions, boolean allGranted) {
|
||||
Log.e(TAG, "onGranted: permissions = " + permissions + " allGranted = " + allGranted);
|
||||
if (!allGranted) {
|
||||
Toast.makeText(PermissionActivity.this, "获取部分权限成功,但部分权限未正常授予", Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
Log.e(TAG, "onGranted: 获取权限成功");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {
|
||||
Log.e(TAG, "onDenied: permissions = " + permissions + " doNotAskAgain = " + doNotAskAgain);
|
||||
if (doNotAskAgain) {
|
||||
Toast.makeText(PermissionActivity.this, "被永久拒绝授权,请手动授予权限", Toast.LENGTH_SHORT).show();
|
||||
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
||||
XXPermissions.startPermissionActivity(PermissionActivity.this, permissions);
|
||||
} else {
|
||||
Log.e(TAG, "onGranted: 获取权限失败");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public class BtnClick {
|
||||
public void openStorage(View view) {
|
||||
getPermission(Permission.WRITE_EXTERNAL_STORAGE);
|
||||
}
|
||||
|
||||
public void openReadPhone(View view) {
|
||||
getPermission(Permission.READ_PHONE_STATE);
|
||||
}
|
||||
|
||||
public void openWriteSettings(View view) {
|
||||
getPermission(Permission.WRITE_SETTINGS);
|
||||
}
|
||||
|
||||
public void open_coarse_location(View view) {
|
||||
getPermission(Permission.ACCESS_COARSE_LOCATION);
|
||||
}
|
||||
|
||||
public void open_fine_location(View view) {
|
||||
getPermission(Permission.ACCESS_FINE_LOCATION);
|
||||
}
|
||||
|
||||
public void open_background_location(View view) {
|
||||
getPermission(Permission.ACCESS_BACKGROUND_LOCATION);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.uiui.zyos.activity.permission;
|
||||
|
||||
import com.trello.rxlifecycle4.android.ActivityEvent;
|
||||
import com.uiui.zyos.base.mvvm.BaseViewModel;
|
||||
import com.uiui.zyos.databinding.ActivityPermissionBinding;
|
||||
|
||||
public class PermissionViewModel extends BaseViewModel<ActivityPermissionBinding, ActivityEvent> {
|
||||
|
||||
@Override
|
||||
public ActivityPermissionBinding getVDBinding() {
|
||||
return binding;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package com.uiui.zyos.interceptor;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
|
||||
import com.uiui.zyos.R;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* author : Android 轮子哥
|
||||
* github : https://github.com/getActivity/XXPermissions
|
||||
* time : 2023/01/02
|
||||
* desc : 权限描述转换器
|
||||
*/
|
||||
public final class PermissionDescriptionConvert {
|
||||
|
||||
/**
|
||||
* 获取权限描述
|
||||
*/
|
||||
public static String getPermissionDescription(Context context, List<String> permissions) {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
List<String> permissionNames = PermissionNameConvert.permissionsToNames(context, permissions);
|
||||
for (String permissionName : permissionNames) {
|
||||
stringBuilder.append(permissionName)
|
||||
.append(context.getString(R.string.common_permission_colon))
|
||||
.append(permissionsToDescription(context, permissionName))
|
||||
.append("\n");
|
||||
}
|
||||
return stringBuilder.toString().trim();
|
||||
}
|
||||
|
||||
/**
|
||||
* 将权限名称列表转换成对应权限描述
|
||||
*/
|
||||
@NonNull
|
||||
public static String permissionsToDescription(Context context, String permissionName) {
|
||||
// 请根据权限名称转换成对应权限说明
|
||||
Log.e("TAG", "permissionsToDescription: " + permissionName);
|
||||
switch (permissionName) {
|
||||
case "存储权限":
|
||||
return "存储图片或视频";
|
||||
case "电话权限":
|
||||
return "拨打电话";
|
||||
case "定位权限":
|
||||
return "获取设备定位";
|
||||
default:
|
||||
return "用于" + permissionName;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,306 @@
|
||||
package com.uiui.zyos.interceptor;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.text.TextUtils;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.PopupWindow;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import com.hjq.permissions.OnPermissionCallback;
|
||||
import com.hjq.permissions.OnPermissionInterceptor;
|
||||
import com.hjq.permissions.OnPermissionPageCallback;
|
||||
import com.hjq.permissions.Permission;
|
||||
import com.hjq.permissions.PermissionFragment;
|
||||
import com.hjq.permissions.XXPermissions;
|
||||
import com.hjq.toast.Toaster;
|
||||
import com.uiui.zyos.R;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* author : Android 轮子哥
|
||||
* github : https://github.com/getActivity/XXPermissions
|
||||
* time : 2021/01/04
|
||||
* desc : 权限申请拦截器
|
||||
*/
|
||||
public final class PermissionInterceptor implements OnPermissionInterceptor {
|
||||
|
||||
public static final Handler HANDLER = new Handler(Looper.getMainLooper());
|
||||
|
||||
/**
|
||||
* 权限申请标记
|
||||
*/
|
||||
private boolean mRequestFlag;
|
||||
|
||||
/**
|
||||
* 权限申请说明 Popup
|
||||
*/
|
||||
private PopupWindow mPermissionPopup;
|
||||
|
||||
/**
|
||||
* 权限说明文案
|
||||
*/
|
||||
@Nullable
|
||||
private String mPermissionDescription;
|
||||
|
||||
public PermissionInterceptor() {
|
||||
this(null);
|
||||
}
|
||||
|
||||
public PermissionInterceptor(@Nullable String permissionDescription) {
|
||||
mPermissionDescription = permissionDescription;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void launchPermissionRequest(@NonNull Activity activity, @NonNull List<String> allPermissions, @Nullable OnPermissionCallback callback) {
|
||||
mRequestFlag = true;
|
||||
List<String> deniedPermissions = XXPermissions.getDenied(activity, allPermissions);
|
||||
|
||||
if (TextUtils.isEmpty(mPermissionDescription)) {
|
||||
mPermissionDescription = generatePermissionDescription(activity, deniedPermissions);
|
||||
}
|
||||
|
||||
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
|
||||
int activityOrientation = activity.getResources().getConfiguration().orientation;
|
||||
|
||||
boolean showPopupWindow = activityOrientation == Configuration.ORIENTATION_PORTRAIT;
|
||||
for (String permission : allPermissions) {
|
||||
if (!XXPermissions.isSpecial(permission)) {
|
||||
continue;
|
||||
}
|
||||
if (XXPermissions.isGranted(activity, permission)) {
|
||||
continue;
|
||||
}
|
||||
// if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R &&
|
||||
if (Build.VERSION.SDK_INT < 30 &&
|
||||
TextUtils.equals(Permission.MANAGE_EXTERNAL_STORAGE, permission)) {
|
||||
continue;
|
||||
}
|
||||
// 如果申请的权限带有特殊权限,并且还没有授予的话
|
||||
// 就不用 PopupWindow 对话框来显示,而是用 Dialog 来显示
|
||||
showPopupWindow = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (showPopupWindow) {
|
||||
PermissionFragment.launch(activity, allPermissions, this, callback);
|
||||
// 延迟 300 毫秒是为了避免出现 PopupWindow 显示然后立马消失的情况
|
||||
// 因为框架没有办法在还没有申请权限的情况下,去判断权限是否永久拒绝了,必须要在发起权限申请之后
|
||||
// 所以只能通过延迟显示 PopupWindow 来做这件事,如果 300 毫秒内权限申请没有结束,证明本次申请的权限没有永久拒绝
|
||||
HANDLER.postDelayed(() -> {
|
||||
if (!mRequestFlag) {
|
||||
return;
|
||||
}
|
||||
if (activity.isFinishing() ||
|
||||
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed())) {
|
||||
return;
|
||||
}
|
||||
showPopupWindow(activity, decorView, mPermissionDescription);
|
||||
}, 300);
|
||||
} else {
|
||||
// 注意:这里的 Dialog 只是示例,没有用 DialogFragment 来处理 Dialog 生命周期
|
||||
new AlertDialog.Builder(activity)
|
||||
.setTitle(R.string.common_permission_description_title)
|
||||
.setMessage(mPermissionDescription)
|
||||
.setCancelable(false)
|
||||
.setPositiveButton(R.string.common_permission_granted, (dialog, which) -> {
|
||||
dialog.dismiss();
|
||||
PermissionFragment.launch(activity, allPermissions,
|
||||
PermissionInterceptor.this, callback);
|
||||
})
|
||||
.setNegativeButton(R.string.common_permission_denied, (dialog, which) -> {
|
||||
dialog.dismiss();
|
||||
if (callback == null) {
|
||||
return;
|
||||
}
|
||||
callback.onDenied(deniedPermissions, false);
|
||||
})
|
||||
.show();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void grantedPermissionRequest(@NonNull Activity activity, @NonNull List<String> allPermissions,
|
||||
@NonNull List<String> grantedPermissions, boolean allGranted,
|
||||
@Nullable OnPermissionCallback callback) {
|
||||
if (callback == null) {
|
||||
return;
|
||||
}
|
||||
callback.onGranted(grantedPermissions, allGranted);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deniedPermissionRequest(@NonNull Activity activity, @NonNull List<String> allPermissions,
|
||||
@NonNull List<String> deniedPermissions, boolean doNotAskAgain,
|
||||
@Nullable OnPermissionCallback callback) {
|
||||
if (callback != null) {
|
||||
callback.onDenied(deniedPermissions, doNotAskAgain);
|
||||
}
|
||||
|
||||
if (doNotAskAgain) {
|
||||
if (deniedPermissions.size() == 1 && Permission.ACCESS_MEDIA_LOCATION.equals(deniedPermissions.get(0))) {
|
||||
Toaster.show(R.string.common_permission_media_location_hint_fail);
|
||||
return;
|
||||
}
|
||||
|
||||
showPermissionSettingDialog(activity, allPermissions, deniedPermissions, callback);
|
||||
return;
|
||||
}
|
||||
|
||||
if (deniedPermissions.size() == 1) {
|
||||
|
||||
String deniedPermission = deniedPermissions.get(0);
|
||||
|
||||
String backgroundPermissionOptionLabel = getBackgroundPermissionOptionLabel(activity);
|
||||
|
||||
if (Permission.ACCESS_BACKGROUND_LOCATION.equals(deniedPermission)) {
|
||||
Toaster.show(activity.getString(R.string.common_permission_background_location_fail_hint, backgroundPermissionOptionLabel));
|
||||
return;
|
||||
}
|
||||
|
||||
if (Permission.BODY_SENSORS_BACKGROUND.equals(deniedPermission)) {
|
||||
Toaster.show(activity.getString(R.string.common_permission_background_sensors_fail_hint, backgroundPermissionOptionLabel));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
final String message;
|
||||
List<String> permissionNames = PermissionNameConvert.permissionsToNames(activity, deniedPermissions);
|
||||
if (!permissionNames.isEmpty()) {
|
||||
message = activity.getString(R.string.common_permission_fail_assign_hint,
|
||||
PermissionNameConvert.listToString(activity, permissionNames));
|
||||
} else {
|
||||
message = activity.getString(R.string.common_permission_fail_hint);
|
||||
}
|
||||
Toaster.show(message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finishPermissionRequest(@NonNull Activity activity, @NonNull List<String> allPermissions,
|
||||
boolean skipRequest, @Nullable OnPermissionCallback callback) {
|
||||
mRequestFlag = false;
|
||||
dismissPopupWindow();
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成权限说明文案
|
||||
*/
|
||||
protected String generatePermissionDescription(Context context, @NonNull List<String> permissions) {
|
||||
return PermissionDescriptionConvert.getPermissionDescription(context, permissions);
|
||||
}
|
||||
|
||||
private void showPopupWindow(Activity activity, ViewGroup decorView, String message) {
|
||||
if (mPermissionPopup == null) {
|
||||
View contentView = LayoutInflater.from(activity)
|
||||
.inflate(R.layout.permission_description_popup, decorView, false);
|
||||
mPermissionPopup = new PopupWindow(activity);
|
||||
mPermissionPopup.setContentView(contentView);
|
||||
mPermissionPopup.setWidth(WindowManager.LayoutParams.MATCH_PARENT);
|
||||
mPermissionPopup.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
|
||||
mPermissionPopup.setAnimationStyle(android.R.style.Animation_Dialog);
|
||||
mPermissionPopup.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
|
||||
mPermissionPopup.setTouchable(true);
|
||||
mPermissionPopup.setOutsideTouchable(true);
|
||||
}
|
||||
TextView messageView = mPermissionPopup.getContentView().findViewById(R.id.tv_permission_description_message);
|
||||
messageView.setText(message);
|
||||
// 注意:这里的 PopupWindow 只是示例,没有监听 Activity onDestroy 来处理 PopupWindow 生命周期
|
||||
mPermissionPopup.showAtLocation(decorView, Gravity.TOP, 0, 0);
|
||||
}
|
||||
|
||||
private void dismissPopupWindow() {
|
||||
if (mPermissionPopup == null) {
|
||||
return;
|
||||
}
|
||||
if (!mPermissionPopup.isShowing()) {
|
||||
return;
|
||||
}
|
||||
mPermissionPopup.dismiss();
|
||||
}
|
||||
|
||||
private void showPermissionSettingDialog(Activity activity, List<String> allPermissions,
|
||||
List<String> deniedPermissions, OnPermissionCallback callback) {
|
||||
if (activity == null || activity.isFinishing() ||
|
||||
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed())) {
|
||||
return;
|
||||
}
|
||||
|
||||
String message = null;
|
||||
|
||||
List<String> permissionNames = PermissionNameConvert.permissionsToNames(activity, deniedPermissions);
|
||||
if (!permissionNames.isEmpty()) {
|
||||
if (deniedPermissions.size() == 1) {
|
||||
String deniedPermission = deniedPermissions.get(0);
|
||||
|
||||
if (Permission.ACCESS_BACKGROUND_LOCATION.equals(deniedPermission)) {
|
||||
message = activity.getString(R.string.common_permission_manual_assign_fail_background_location_hint, getBackgroundPermissionOptionLabel(activity));
|
||||
} else if (Permission.BODY_SENSORS_BACKGROUND.equals(deniedPermission)) {
|
||||
message = activity.getString(R.string.common_permission_manual_assign_fail_background_sensors_hint, getBackgroundPermissionOptionLabel(activity));
|
||||
}
|
||||
}
|
||||
if (TextUtils.isEmpty(message)) {
|
||||
message = activity.getString(R.string.common_permission_manual_assign_fail_hint,
|
||||
PermissionNameConvert.listToString(activity, permissionNames));
|
||||
}
|
||||
} else {
|
||||
message = activity.getString(R.string.common_permission_manual_fail_hint);
|
||||
}
|
||||
|
||||
// 这里的 Dialog 只是示例,没有用 DialogFragment 来处理 Dialog 生命周期
|
||||
new AlertDialog.Builder(activity)
|
||||
.setTitle(R.string.common_permission_alert)
|
||||
.setMessage(message)
|
||||
.setPositiveButton(R.string.common_permission_goto_setting_page, (dialog, which) -> {
|
||||
dialog.dismiss();
|
||||
XXPermissions.startPermissionActivity(activity,
|
||||
deniedPermissions, new OnPermissionPageCallback() {
|
||||
|
||||
@Override
|
||||
public void onGranted() {
|
||||
if (callback == null) {
|
||||
return;
|
||||
}
|
||||
callback.onGranted(allPermissions, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDenied() {
|
||||
showPermissionSettingDialog(activity, allPermissions,
|
||||
XXPermissions.getDenied(activity, allPermissions), callback);
|
||||
}
|
||||
});
|
||||
})
|
||||
.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取后台权限的《始终允许》选项的文案
|
||||
*/
|
||||
@NonNull
|
||||
private String getBackgroundPermissionOptionLabel(Context context) {
|
||||
String backgroundPermissionOptionLabel = "";
|
||||
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
// if (Build.VERSION.SDK_INT >= 30) {
|
||||
// backgroundPermissionOptionLabel = String.valueOf(context.getPackageManager().getBackgroundPermissionOptionLabel());
|
||||
// }
|
||||
if (TextUtils.isEmpty(backgroundPermissionOptionLabel)) {
|
||||
backgroundPermissionOptionLabel = context.getString(R.string.common_permission_background_default_option_label);
|
||||
}
|
||||
return backgroundPermissionOptionLabel;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,333 @@
|
||||
package com.uiui.zyos.interceptor;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.hjq.permissions.Permission;
|
||||
import com.uiui.zyos.R;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* author : Android 轮子哥
|
||||
* github : https://github.com/getActivity/XXPermissions
|
||||
* time : 2022/06/11
|
||||
* desc : 权限名称转换器
|
||||
*/
|
||||
public final class PermissionNameConvert {
|
||||
|
||||
/**
|
||||
* 获取权限名称
|
||||
*/
|
||||
public static String getPermissionNames(Context context, List<String> permissions) {
|
||||
return listToString(context, permissionsToNames(context, permissions));
|
||||
}
|
||||
|
||||
/**
|
||||
* String 列表拼接成一个字符串
|
||||
*/
|
||||
public static String listToString(Context context, List<String> hints) {
|
||||
if (hints == null || hints.isEmpty()) {
|
||||
return context.getString(R.string.common_permission_unknown);
|
||||
}
|
||||
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (String text : hints) {
|
||||
if (builder.length() == 0) {
|
||||
builder.append(text);
|
||||
} else {
|
||||
builder.append("、")
|
||||
.append(text);
|
||||
}
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 将权限列表转换成对应名称列表
|
||||
*/
|
||||
@NonNull
|
||||
public static List<String> permissionsToNames(Context context, List<String> permissions) {
|
||||
List<String> permissionNames = new ArrayList<>();
|
||||
if (context == null) {
|
||||
return permissionNames;
|
||||
}
|
||||
if (permissions == null) {
|
||||
return permissionNames;
|
||||
}
|
||||
for (String permission : permissions) {
|
||||
switch (permission) {
|
||||
case Permission.READ_EXTERNAL_STORAGE:
|
||||
case Permission.WRITE_EXTERNAL_STORAGE: {
|
||||
String hint = context.getString(R.string.common_permission_storage);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.READ_MEDIA_IMAGES:
|
||||
case Permission.READ_MEDIA_VIDEO:
|
||||
case Permission.READ_MEDIA_VISUAL_USER_SELECTED: {
|
||||
if (Build.VERSION.SDK_INT >= 33) {
|
||||
String hint = context.getString(R.string.common_permission_image_and_video);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.READ_MEDIA_AUDIO: {
|
||||
if (Build.VERSION.SDK_INT >= 33) {
|
||||
String hint = context.getString(R.string.common_permission_music_and_audio);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.CAMERA: {
|
||||
String hint = context.getString(R.string.common_permission_camera);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.RECORD_AUDIO: {
|
||||
String hint = context.getString(R.string.common_permission_microphone);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.ACCESS_FINE_LOCATION:
|
||||
case Permission.ACCESS_COARSE_LOCATION:
|
||||
case Permission.ACCESS_BACKGROUND_LOCATION: {
|
||||
String hint;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q &&
|
||||
!permissions.contains(Permission.ACCESS_FINE_LOCATION) &&
|
||||
!permissions.contains(Permission.ACCESS_COARSE_LOCATION)) {
|
||||
hint = context.getString(R.string.common_permission_location_background);
|
||||
} else {
|
||||
hint = context.getString(R.string.common_permission_location);
|
||||
}
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.BODY_SENSORS:
|
||||
case Permission.BODY_SENSORS_BACKGROUND: {
|
||||
String hint;
|
||||
if (Build.VERSION.SDK_INT >= 33 &&
|
||||
!permissions.contains(Permission.BODY_SENSORS)) {
|
||||
hint = context.getString(R.string.common_permission_body_sensors_background);
|
||||
} else {
|
||||
hint = context.getString(R.string.common_permission_body_sensors);
|
||||
}
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.BLUETOOTH_SCAN:
|
||||
case Permission.BLUETOOTH_CONNECT:
|
||||
case Permission.BLUETOOTH_ADVERTISE: {
|
||||
if (Build.VERSION.SDK_INT >= 31) {
|
||||
String hint = context.getString(R.string.common_permission_nearby_devices);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.NEARBY_WIFI_DEVICES: {
|
||||
if (Build.VERSION.SDK_INT >= 33) {
|
||||
String hint = context.getString(R.string.common_permission_nearby_devices);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.READ_PHONE_STATE:
|
||||
case Permission.CALL_PHONE:
|
||||
case Permission.ADD_VOICEMAIL:
|
||||
case Permission.USE_SIP:
|
||||
case Permission.READ_PHONE_NUMBERS:
|
||||
case Permission.ANSWER_PHONE_CALLS: {
|
||||
String hint = context.getString(R.string.common_permission_phone);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.GET_ACCOUNTS:
|
||||
case Permission.READ_CONTACTS:
|
||||
case Permission.WRITE_CONTACTS: {
|
||||
String hint = context.getString(R.string.common_permission_contacts);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.READ_CALENDAR:
|
||||
case Permission.WRITE_CALENDAR: {
|
||||
String hint = context.getString(R.string.common_permission_calendar);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.READ_CALL_LOG:
|
||||
case Permission.WRITE_CALL_LOG:
|
||||
case Permission.PROCESS_OUTGOING_CALLS: {
|
||||
String hint = context.getString(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ?
|
||||
R.string.common_permission_call_logs :
|
||||
R.string.common_permission_phone);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.ACTIVITY_RECOGNITION: {
|
||||
String hint = context.getString(Build.VERSION.SDK_INT >= 30 ?
|
||||
R.string.common_permission_activity_recognition_api30 :
|
||||
R.string.common_permission_activity_recognition_api29);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.ACCESS_MEDIA_LOCATION: {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||
String hint = context.getString(R.string.common_permission_access_media_location);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.SEND_SMS:
|
||||
case Permission.RECEIVE_SMS:
|
||||
case Permission.READ_SMS:
|
||||
case Permission.RECEIVE_WAP_PUSH:
|
||||
case Permission.RECEIVE_MMS: {
|
||||
String hint = context.getString(R.string.common_permission_sms);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.MANAGE_EXTERNAL_STORAGE: {
|
||||
if (Build.VERSION.SDK_INT >= 30) {
|
||||
String hint = context.getString(R.string.common_permission_all_file_access);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.REQUEST_INSTALL_PACKAGES: {
|
||||
String hint = context.getString(R.string.common_permission_install_unknown_apps);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.SYSTEM_ALERT_WINDOW: {
|
||||
String hint = context.getString(R.string.common_permission_display_over_other_apps);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.WRITE_SETTINGS: {
|
||||
String hint = context.getString(R.string.common_permission_modify_system_settings);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.NOTIFICATION_SERVICE: {
|
||||
String hint = context.getString(R.string.common_permission_allow_notifications);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.POST_NOTIFICATIONS: {
|
||||
if (Build.VERSION.SDK_INT >= 33) {
|
||||
String hint = context.getString(R.string.common_permission_post_notifications);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.BIND_NOTIFICATION_LISTENER_SERVICE: {
|
||||
String hint = context.getString(R.string.common_permission_allow_notifications_access);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.PACKAGE_USAGE_STATS: {
|
||||
String hint = context.getString(R.string.common_permission_apps_with_usage_access);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.SCHEDULE_EXACT_ALARM: {
|
||||
String hint = context.getString(R.string.common_permission_alarms_reminders);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.ACCESS_NOTIFICATION_POLICY: {
|
||||
String hint = context.getString(R.string.common_permission_do_not_disturb_access);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS: {
|
||||
String hint = context.getString(R.string.common_permission_ignore_battery_optimize);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.BIND_VPN_SERVICE: {
|
||||
String hint = context.getString(R.string.common_permission_vpn);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.PICTURE_IN_PICTURE: {
|
||||
String hint = context.getString(R.string.common_permission_picture_in_picture);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.GET_INSTALLED_APPS: {
|
||||
String hint = context.getString(R.string.common_permission_get_installed_apps);
|
||||
if (!permissionNames.contains(hint)) {
|
||||
permissionNames.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return permissionNames;
|
||||
}
|
||||
}
|
||||
@@ -36,9 +36,9 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
|
||||
@Override
|
||||
public void onConnected(NetworkUtils.NetworkType networkType) {
|
||||
Log.e(TAG, "onConnected: ");
|
||||
if (Utils.isScreenOn(MainService.this)) {
|
||||
mPresenter.getCloudLessonSettings();
|
||||
}
|
||||
// if (Utils.isScreenOn(MainService.this)) {
|
||||
// mPresenter.getCloudLessonSettings();
|
||||
// }
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user