version:1.8.9

fix:
update:密码界面统一,增加权限说明页面
This commit is contained in:
2024-09-05 09:36:49 +08:00
parent d73f0f1371
commit 58b3e18727
47 changed files with 3415 additions and 443 deletions

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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();

View File

@@ -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);
}
}
}

View File

@@ -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() {
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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