Skip to content
This repository has been archived by the owner on Aug 26, 2019. It is now read-only.

Commit

Permalink
refactor code and support 5.0+ XIAOMI/MEIZU
Browse files Browse the repository at this point in the history
  • Loading branch information
jokermonn committed Aug 29, 2017
1 parent 47d38b7 commit 5c287fa
Show file tree
Hide file tree
Showing 8 changed files with 346 additions and 237 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.joker.api.PermissionsProxy;
import com.joker.api.apply.util.SupportUtil;
import com.joker.api.support.PermissionsPageManager;
import com.joker.api.wrapper.ListenerWrapper;
import com.joker.api.wrapper.Wrapper;


Expand All @@ -17,22 +18,19 @@
public class ForceApplyPermissions {
// listener module ===================================================================
public static void grantedOnResultWithListener(Wrapper wrapper) {
grantedWithListener(wrapper);
}

private static void grantedWithListener(Wrapper wrapper) {
Activity activity = getActivity(wrapper);

Wrapper.PermissionRequestListener requestListener = wrapper
.getPermissionRequestListener();
if (requestListener == null) {
return;
}

if (PermissionsChecker.isPermissionGranted(activity, wrapper.getPermission())) {
requestListener.permissionGranted();
if (requestListener != null) {
requestListener.permissionGranted();
}
} else {
requestListener.permissionDenied();
if (requestListener != null) {
requestListener.permissionDenied();
}
Wrapper.PermissionPageListener pageListener = wrapper.getPermissionPageListener();
if (SupportUtil.pageListenerNonNull(wrapper) && SupportUtil.nonShowRationale(wrapper)) {
boolean androidPage = wrapper.getPageType() == Permissions4M.PageType
Expand Down Expand Up @@ -66,6 +64,34 @@ public static void grantedOnResultWithAnnotation(Wrapper wrapper) {
}
}

public static void deniedOnResultWithListenerForUnderMManufacturer(Wrapper wrapper) {
Activity activity = getActivity(wrapper);
ListenerWrapper.PermissionRequestListener requestListener = wrapper.getPermissionRequestListener();
if (requestListener != null) {
requestListener.permissionDenied();
}

ListenerWrapper.PermissionPageListener pageListener = wrapper.getPermissionPageListener();
if (pageListener != null) {
boolean androidPage = wrapper.getPageType() == Permissions4M.PageType.ANDROID_SETTING_PAGE;
Intent intent = androidPage ? PermissionsPageManager.getSettingIntent(activity) :
PermissionsPageManager.getIntent(activity);
pageListener.pageIntent(intent);
}
}

@SuppressWarnings("unchecked")
public static void deniedOnResultWithAnnotationForUnderMManufacturer(Wrapper wrapper) {
PermissionsProxy proxy = wrapper.getProxy(wrapper.getContext().getClass().getName());
proxy.denied(wrapper.getContext(), wrapper.getRequestCode());

boolean androidPage = wrapper.getPageType() == Permissions4M.PageType
.ANDROID_SETTING_PAGE;
Intent intent = androidPage ? PermissionsPageManager.getSettingIntent(getActivity(wrapper)) :
PermissionsPageManager.getIntent(getActivity(wrapper));
proxy.intent(wrapper.getContext(), wrapper.getRequestCode(), intent);
}

private static Activity getActivity(Wrapper wrapper) {
Activity activity;
if (wrapper.getContext() instanceof android.app.Fragment) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

import android.app.Activity;
import android.content.Intent;
import android.os.Build;

import com.joker.api.Permissions4M;
import com.joker.api.PermissionsProxy;
import com.joker.api.apply.util.SupportUtil;
import com.joker.api.support.PermissionsPageManager;
import com.joker.api.wrapper.ListenerWrapper;
import com.joker.api.wrapper.Wrapper;


Expand All @@ -16,6 +16,7 @@
*/

public class NormalApplyPermissions {
// annotation module ===================================================================================
@SuppressWarnings("unchecked")
public static void grantedWithAnnotation(Wrapper wrapper) {
wrapper.getProxy(wrapper.getContext().getClass().getName())
Expand All @@ -38,23 +39,19 @@ public static void deniedWithAnnotation(Wrapper wrapper) {
}
}

// listener module ===================================================================================
public static void grantedWithListener(Wrapper wrapper) {
if (wrapper.getPermissionRequestListener() != null) {
wrapper.getPermissionRequestListener().permissionGranted();
}
}

public static void deniedOnResultWithListener(Wrapper wrapper) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return;
ListenerWrapper.PermissionRequestListener requestListener = wrapper.getPermissionRequestListener();
if (requestListener != null) {
requestListener.permissionDenied();
}

if (wrapper.getPermissionRequestListener() == null) {
return;
}

wrapper.getPermissionRequestListener().permissionDenied();

if (SupportUtil.pageListenerNonNull(wrapper) && SupportUtil.nonShowRationale(wrapper)) {
Activity activity = getActivity(wrapper);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.joker.api.apply;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
Expand Down Expand Up @@ -38,6 +39,7 @@
public class PermissionsChecker {
private static final String TAG = "permissions4m";
private static final String TAG_NUMBER = "1";
private static int count = 0;

/**
* ensure whether permission granted
Expand Down Expand Up @@ -66,7 +68,6 @@ public static boolean isPermissionGranted(Activity activity, String permission)
return checkWriteCallLog(activity);
case Manifest.permission.USE_SIP:
return true;
// can not apply
case Manifest.permission.PROCESS_OUTGOING_CALLS:
return true;
case Manifest.permission.ADD_VOICEMAIL:
Expand Down Expand Up @@ -106,25 +107,36 @@ public static boolean isPermissionGranted(Activity activity, String permission)
return true;
}
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, "throwing exception in PermissionChecker: ", e);
return false;
}
}

private static boolean checkRecordAudio(Activity activity) {
try {
AudioRecordManager.getInstance().startRecord(activity.getCacheDir().getPath() + TAG +
".3gp");
AudioRecordManager.getInstance().stopRecord();
AudioRecordManager.getInstance().deleteFile();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
/**
* record audio, {@link android.Manifest.permission#RECORD_AUDIO},
* it will consume some resource!!
*
* @param activity
* @return true if success
*/
private static boolean checkRecordAudio(Activity activity) throws Exception {
AudioRecordManager recordManager = new AudioRecordManager();

recordManager.startRecord(activity.getExternalFilesDir(Environment.DIRECTORY_RINGTONES) + "/" +
TAG + ".3gp");
recordManager.stopRecord();

return recordManager.getSuccess();
}

private static boolean checkReadCalendar(Activity activity) {
/**
* read calendar, {@link android.Manifest.permission#READ_CALENDAR}
*
* @param activity
* @return true if success
*/
private static boolean checkReadCalendar(Activity activity) throws Exception {
Cursor cursor = activity.getContentResolver().query(Uri.parse("content://com" +
".android.calendar/calendars"), null, null, null, null);
if (cursor != null) {
Expand All @@ -135,7 +147,13 @@ private static boolean checkReadCalendar(Activity activity) {
}
}

private static boolean checkWriteCallLog(Activity activity) {
/**
* write or delete call log, {@link android.Manifest.permission#WRITE_CALL_LOG}
*
* @param activity
* @return true if success
*/
private static boolean checkWriteCallLog(Activity activity) throws Exception {
ContentResolver contentResolver = activity.getContentResolver();
ContentValues content = new ContentValues();
content.put(CallLog.Calls.TYPE, CallLog.Calls.INCOMING_TYPE);
Expand All @@ -150,12 +168,23 @@ private static boolean checkWriteCallLog(Activity activity) {
return true;
}

/**
* read sms, {@link android.Manifest.permission#READ_SMS}
* in MEIZU 5.0~6.0, just according normal phone request
* in XIAOMI 6.0~, need force judge
* in XIAOMI 5.0~6.0, not test!!!
*
* @param activity
* @return true if success
* @throws Exception
*/
private static boolean checkReadSms(Activity activity) throws Exception {
Cursor cursor = activity.getContentResolver().query(Uri.parse("content://sms/"), null, null,
null, null);
if (cursor != null) {
if (PermissionsPageManager.isXiaoMi()) {
if (isNumberIndexInfoIsNull(cursor, cursor.getColumnIndex(Telephony.Sms.PERSON))) {
if (PermissionsPageManager.isUnderMHasPermissionRequestManufacturer() ||
PermissionsPageManager.isXIAOMI()) {
if (isNumberIndexInfoIsNull(cursor, cursor.getColumnIndex(Telephony.Sms.DATE))) {
cursor.close();
return false;
}
Expand All @@ -167,6 +196,13 @@ private static boolean checkReadSms(Activity activity) throws Exception {
}
}

/**
* write storage, {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE}
*
* @param activity
* @return true if success
* @throws Exception
*/
private static boolean checkWriteStorage(Activity activity) throws Exception {
File file = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES).getPath(), TAG);
Expand All @@ -184,24 +220,47 @@ private static boolean checkWriteStorage(Activity activity) throws Exception {
}
}

/**
* read storage, {@link android.Manifest.permission#READ_EXTERNAL_STORAGE}
*
* @param activity
* @return true if success
* @throws Exception
*/
private static boolean checkReadStorage(Activity activity) throws Exception {
File file = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES).getPath());
File[] files = file.listFiles();
return files != null;
}

/**
* use location, {@link android.Manifest.permission#ACCESS_FINE_LOCATION},
* {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}
*
* @param activity
* @return true if success
* @throws Exception
*/
private static boolean checkLocation(Activity activity) throws Exception {
LocationManager locationManager = (LocationManager) activity.getSystemService
(LOCATION_SERVICE);
Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
// fuck XIAOMI!
if (PermissionsPageManager.isXiaoMi()) {
if (PermissionsPageManager.isUnderMHasPermissionRequestManufacturer() || PermissionsPageManager
.isXIAOMI()) {
double latitude = location.getLatitude();
}
return true;
}

/**
* use sensors, {@link android.Manifest.permission#BODY_SENSORS}
*
* @param activity
* @return true if success
* @throws Exception
*/
private static boolean checkBodySensors(Activity activity) throws Exception {
SensorManager sensorManager = (SensorManager) activity.getSystemService(SENSOR_SERVICE);
Sensor sensor = sensorManager.getDefaultSensor((Sensor.TYPE_ACCELEROMETER));
Expand All @@ -220,18 +279,48 @@ public void onAccuracyChanged(Sensor sensor, int accuracy) {
return true;
}

/**
* read phone state, {@link android.Manifest.permission#READ_PHONE_STATE}
* <p>
* in {@link com.joker.api.support.manufacturer.XIAOMI} or
* {@link com.joker.api.support.manufacturer.OPPO} :
* -> {@link TelephonyManager#getDeviceId()} will be null if deny permission
* <p>
* in {@link com.joker.api.support.manufacturer.MEIZU} :
* -> {@link TelephonyManager#getSubscriberId()} will be null if deny permission
*
* @param activity
* @return true if success
* @throws Exception
*/
@SuppressLint("HardwareIds")
private static boolean checkReadPhoneState(Activity activity) throws Exception {
TelephonyManager service = (TelephonyManager) activity.getSystemService
(TELEPHONY_SERVICE);
return !TextUtils.isEmpty(service.getDeviceId());
if (PermissionsPageManager.isMEIZU()) {
return !TextUtils.isEmpty(service.getSubscriberId());
} else if (PermissionsPageManager.isXIAOMI() || PermissionsPageManager.isOPPO()) {
return !TextUtils.isEmpty(service.getDeviceId());
} else {
return !TextUtils.isEmpty(service.getDeviceId()) || !TextUtils.isEmpty(service
.getSubscriberId());
}
}

/**
* read call log, {@link android.Manifest.permission#READ_CALL_LOG}
*
* @param activity
* @return true if success
* @throws Exception
*/
private static boolean checkReadCallLog(Activity activity) throws Exception {
Cursor cursor = activity.getContentResolver().query(Uri.parse
("content://call_log/calls"), null, null,
null, null);
if (cursor != null) {
if (PermissionsPageManager.isXiaoMi()) {
if (PermissionsPageManager.isUnderMHasPermissionRequestManufacturer() ||
PermissionsPageManager.isXIAOMI()) {
if (isNumberIndexInfoIsNull(cursor, cursor.getColumnIndex(CallLog.Calls.NUMBER))) {
cursor.close();
return false;
Expand All @@ -244,6 +333,14 @@ private static boolean checkReadCallLog(Activity activity) throws Exception {
}
}

/**
* write and delete contacts info, {@link android.Manifest.permission#WRITE_CONTACTS}
* and we should get read contacts permission first.
*
* @param activity
* @return true if success
* @throws Exception
*/
private static boolean checkWriteContacts(Activity activity) throws Exception {
if (checkReadContacts(activity)) {
// write some info
Expand Down Expand Up @@ -279,11 +376,19 @@ private static boolean checkWriteContacts(Activity activity) throws Exception {
}
}

/**
* read contacts, {@link android.Manifest.permission#READ_CONTACTS}
*
* @param activity
* @return true if success
* @throws Exception
*/
private static boolean checkReadContacts(Activity activity) throws Exception {
Cursor cursor = activity.getContentResolver().query(ContactsContract.CommonDataKinds.Phone
.CONTENT_URI, null, null, null, null);
if (cursor != null) {
if (PermissionsPageManager.isXiaoMi()) {
if (PermissionsPageManager.isUnderMHasPermissionRequestManufacturer() ||
PermissionsPageManager.isXIAOMI()) {
if (isNumberIndexInfoIsNull(cursor, cursor.getColumnIndex(ContactsContract.CommonDataKinds
.Phone.NUMBER))) {
cursor.close();
Expand All @@ -298,7 +403,7 @@ private static boolean checkReadContacts(Activity activity) throws Exception {
}

/**
* in XIAOMI
* in {@link com.joker.api.support.manufacturer.XIAOMI}
* 1.denied {@link android.Manifest.permission#READ_CONTACTS} permission
* ---->cursor.getCount == 0
* 2.granted {@link android.Manifest.permission#READ_CONTACTS} permission
Expand Down
Loading

0 comments on commit 5c287fa

Please sign in to comment.