From 5c287faef715cd78c934af17a07e03a0664149c2 Mon Sep 17 00:00:00 2001 From: jokermonn <429094465@qq.com> Date: Tue, 29 Aug 2017 14:03:19 +0800 Subject: [PATCH] refactor code and support 5.0+ XIAOMI/MEIZU --- .../api/apply/ForceApplyPermissions.java | 44 ++++-- .../api/apply/NormalApplyPermissions.java | 15 +- .../joker/api/apply/PermissionsChecker.java | 147 +++++++++++++++--- .../api/apply/util/AudioRecordManager.java | 72 ++++----- .../api/support/PermissionsPageManager.java | 31 ++-- .../joker/api/wrapper/AbstractWrapper.java | 118 ++++++++++++-- .../joker/api/wrapper/ActivityWrapper.java | 70 +-------- .../api/wrapper/FragmentBaseWrapper.java | 86 ++-------- 8 files changed, 346 insertions(+), 237 deletions(-) diff --git a/permissions4m-api/src/main/java/com/joker/api/apply/ForceApplyPermissions.java b/permissions4m-api/src/main/java/com/joker/api/apply/ForceApplyPermissions.java index 17ebd02..37b285e 100644 --- a/permissions4m-api/src/main/java/com/joker/api/apply/ForceApplyPermissions.java +++ b/permissions4m-api/src/main/java/com/joker/api/apply/ForceApplyPermissions.java @@ -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; @@ -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 @@ -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) { diff --git a/permissions4m-api/src/main/java/com/joker/api/apply/NormalApplyPermissions.java b/permissions4m-api/src/main/java/com/joker/api/apply/NormalApplyPermissions.java index 65aa99e..16d78b9 100644 --- a/permissions4m-api/src/main/java/com/joker/api/apply/NormalApplyPermissions.java +++ b/permissions4m-api/src/main/java/com/joker/api/apply/NormalApplyPermissions.java @@ -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; @@ -16,6 +16,7 @@ */ public class NormalApplyPermissions { + // annotation module =================================================================================== @SuppressWarnings("unchecked") public static void grantedWithAnnotation(Wrapper wrapper) { wrapper.getProxy(wrapper.getContext().getClass().getName()) @@ -38,6 +39,7 @@ public static void deniedWithAnnotation(Wrapper wrapper) { } } + // listener module =================================================================================== public static void grantedWithListener(Wrapper wrapper) { if (wrapper.getPermissionRequestListener() != null) { wrapper.getPermissionRequestListener().permissionGranted(); @@ -45,16 +47,11 @@ public static void grantedWithListener(Wrapper wrapper) { } 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); diff --git a/permissions4m-api/src/main/java/com/joker/api/apply/PermissionsChecker.java b/permissions4m-api/src/main/java/com/joker/api/apply/PermissionsChecker.java index d192ade..ab2946e 100644 --- a/permissions4m-api/src/main/java/com/joker/api/apply/PermissionsChecker.java +++ b/permissions4m-api/src/main/java/com/joker/api/apply/PermissionsChecker.java @@ -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; @@ -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 @@ -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: @@ -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) { @@ -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); @@ -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; } @@ -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); @@ -184,6 +220,13 @@ 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()); @@ -191,17 +234,33 @@ private static boolean checkReadStorage(Activity activity) throws Exception { 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)); @@ -220,18 +279,48 @@ public void onAccuracyChanged(Sensor sensor, int accuracy) { return true; } + /** + * read phone state, {@link android.Manifest.permission#READ_PHONE_STATE} + *
+ * 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 + *
+ * 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;
@@ -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
@@ -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();
@@ -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
diff --git a/permissions4m-api/src/main/java/com/joker/api/apply/util/AudioRecordManager.java b/permissions4m-api/src/main/java/com/joker/api/apply/util/AudioRecordManager.java
index bf4a8d9..e8093a5 100644
--- a/permissions4m-api/src/main/java/com/joker/api/apply/util/AudioRecordManager.java
+++ b/permissions4m-api/src/main/java/com/joker/api/apply/util/AudioRecordManager.java
@@ -15,13 +15,14 @@
public class AudioRecordManager {
private static AudioRecordManager mInstance;
+ public File file;
private AudioRecord mRecorder;
private DataOutputStream dos;
private Thread recordThread;
private boolean isStart = false;
private int bufferSize;
/**
- * 录音线程
+ * record thread
*/
Runnable recordRunnable = new Runnable() {
@Override
@@ -29,16 +30,14 @@ public void run() {
try {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int bytesRecord;
- //int bufferSize = 320;
byte[] tempBuffer = new byte[bufferSize];
- if (mRecorder.getState() != AudioRecord.STATE_INITIALIZED) {
- stopRecord();
- return;
- }
+// if (mRecorder.getState() != AudioRecord.STATE_INITIALIZED) {
+// stopRecord();
+// return;
+// }
mRecorder.startRecording();
- //writeToFileHead();
while (isStart) {
- if (null != mRecorder) {
+ if (mRecorder != null) {
bytesRecord = mRecorder.read(tempBuffer, 0, bufferSize);
if (bytesRecord == AudioRecord.ERROR_INVALID_OPERATION || bytesRecord ==
AudioRecord.ERROR_BAD_VALUE) {
@@ -57,7 +56,7 @@ public void run() {
}
};
- private String path;
+ private long length;
public AudioRecordManager() {
bufferSize = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat
@@ -66,33 +65,22 @@ public AudioRecordManager() {
AudioFormat.ENCODING_PCM_16BIT, bufferSize * 2);
}
- /**
- * 获取单例引用
- *
- * @return
- */
- public static AudioRecordManager getInstance() {
- if (mInstance == null) {
- synchronized (AudioRecordManager.class) {
- if (mInstance == null) {
- mInstance = new AudioRecordManager();
- }
- }
- }
- return mInstance;
+
+ public boolean getSuccess() {
+ return length > 0;
}
/**
- * 销毁线程方法
+ * destroy record thread
*/
private void destroyThread() {
try {
isStart = false;
- if (null != recordThread && Thread.State.RUNNABLE == recordThread.getState()) {
+ if (recordThread != null && recordThread.getState() != Thread.State.TERMINATED) {
try {
- Thread.sleep(500);
recordThread.interrupt();
} catch (Exception e) {
+ e.printStackTrace();
recordThread = null;
}
}
@@ -105,10 +93,9 @@ private void destroyThread() {
}
/**
- * 启动录音线程
+ * start record thread
*/
private void startThread() {
- destroyThread();
isStart = true;
if (recordThread == null) {
recordThread = new Thread(recordRunnable);
@@ -117,35 +104,37 @@ private void startThread() {
}
/**
- * 保存文件
+ * save file
*
- * @param path
* @throws IOException
*/
private void setPath(String path) throws IOException {
- this.path = path;
- File file = new File(path);
- if (file.exists()) {
- file.delete();
- }
+ file = new File(path);
+ deleteFile();
file.createNewFile();
dos = new DataOutputStream(new FileOutputStream(file, true));
}
/**
- * 启动录音
+ * start record
*
* @param path
+ * @throws IOException
*/
- public void startRecord(String path) throws IOException {
+ public void startRecord(String path) throws IOException, InterruptedException {
setPath(path);
startThread();
}
/**
- * 停止录音
+ * stop record
+ *
+ * @throws IOException
+ * @throws InterruptedException
*/
- public void stopRecord() throws IOException {
+ public void stopRecord() throws IOException, InterruptedException {
+ // specially for OPPO、XIAOMI、MEIZU、HUAWEI and so on
+ Thread.sleep(250);
destroyThread();
if (mRecorder != null) {
if (mRecorder.getState() == AudioRecord.STATE_INITIALIZED) {
@@ -159,10 +148,11 @@ public void stopRecord() throws IOException {
dos.flush();
dos.close();
}
+ length = file.length();
+ deleteFile();
}
- public void deleteFile() {
- File file = new File(path);
+ private void deleteFile() {
if (file.exists()) {
file.delete();
}
diff --git a/permissions4m-api/src/main/java/com/joker/api/support/PermissionsPageManager.java b/permissions4m-api/src/main/java/com/joker/api/support/PermissionsPageManager.java
index afadd33..cc93089 100644
--- a/permissions4m-api/src/main/java/com/joker/api/support/PermissionsPageManager.java
+++ b/permissions4m-api/src/main/java/com/joker/api/support/PermissionsPageManager.java
@@ -21,11 +21,11 @@ public class PermissionsPageManager {
/**
* Build.MANUFACTURER
*/
- private static final String MANUFACTURER_HUAWEI = "HUAWEI"; // 华为
- private static final String MANUFACTURER_XIAOMI = "XIAOMI"; // 小米
- private static final String MANUFACTURER_OPPO = "OPPO"; // oppo
- private static final String MANUFACTURER_VIVO = "vivo"; // vivo
- private static final String MANUFACTURER_MEIZU = "meizu"; // meizu
+ private static final String MANUFACTURER_HUAWEI = "HUAWEI";
+ private static final String MANUFACTURER_XIAOMI = "XIAOMI";
+ private static final String MANUFACTURER_OPPO = "OPPO";
+ private static final String MANUFACTURER_VIVO = "vivo";
+ private static final String MANUFACTURER_MEIZU = "meizu";
private static final String manufacturer = Build.MANUFACTURER;
public static String getManufacturer() {
@@ -59,12 +59,21 @@ public static Intent getSettingIntent(Activity activity) {
return new Protogenesis(activity).settingIntent();
}
- /**
- * whether is xiaomi
- *
- * @return true if it is
- */
- public static boolean isXiaoMi() {
+ public static boolean isXIAOMI() {
return getManufacturer().equalsIgnoreCase(MANUFACTURER_XIAOMI);
}
+
+ public static boolean isOPPO() {
+ return getManufacturer().equalsIgnoreCase(MANUFACTURER_OPPO);
+ }
+
+ public static boolean isMEIZU() {
+ return getManufacturer().equalsIgnoreCase(MANUFACTURER_MEIZU);
+ }
+
+ public static boolean isUnderMHasPermissionRequestManufacturer() {
+ return (getManufacturer().equalsIgnoreCase(MANUFACTURER_MEIZU) || getManufacturer()
+ .equalsIgnoreCase(MANUFACTURER_XIAOMI)) && Build.VERSION.SDK_INT >= Build.VERSION_CODES
+ .LOLLIPOP && Build.VERSION.SDK_INT < Build.VERSION_CODES.M;
+ }
}
diff --git a/permissions4m-api/src/main/java/com/joker/api/wrapper/AbstractWrapper.java b/permissions4m-api/src/main/java/com/joker/api/wrapper/AbstractWrapper.java
index 5c8ae24..bb29ada 100644
--- a/permissions4m-api/src/main/java/com/joker/api/wrapper/AbstractWrapper.java
+++ b/permissions4m-api/src/main/java/com/joker/api/wrapper/AbstractWrapper.java
@@ -1,10 +1,16 @@
package com.joker.api.wrapper;
import android.app.Activity;
+import android.content.pm.PackageManager;
import android.os.Build;
+import android.support.v4.content.ContextCompat;
import com.joker.api.Permissions4M;
import com.joker.api.PermissionsProxy;
+import com.joker.api.apply.ForceApplyPermissions;
+import com.joker.api.apply.NormalApplyPermissions;
+import com.joker.api.apply.PermissionsChecker;
+import com.joker.api.support.PermissionsPageManager;
import java.lang.ref.WeakReference;
import java.util.HashMap;
@@ -19,6 +25,7 @@ public abstract class AbstractWrapper implements Wrapper {
@Permissions4M.PageType
private static final int DEFAULT_PAGE_TYPE = Permissions4M.PageType.ANDROID_SETTING_PAGE;
private static final int DEFAULT_REQUEST_CODE = -1;
+ private static final boolean DEFAULT_IS_FORCE = true;
private static Map
+ * 2.it's not the {@link PermissionsPageManager#isUnderMHasPermissionRequestManufacturer()}, and
+ * Version Code is bigger than {@link android.os.Build.VERSION_CODES#M}
+ *
+ * 3.under {@link android.os.Build.VERSION_CODES#M}, and it's
+ * {@link PermissionsPageManager#isUnderMHasPermissionRequestManufacturer()}
+ */
+ @SuppressWarnings("unchecked")
+ private void requestPermissionWithAnnotation() {
+ PermissionsProxy proxy = getProxy(getContext().getClass().getName());
+
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M && !PermissionsPageManager
+ .isUnderMHasPermissionRequestManufacturer()) {
+ proxy.granted(getContext(), getRequestCode());
+ } else if (!PermissionsPageManager.isUnderMHasPermissionRequestManufacturer()) {
+ String permission = getPermission();
+ if (ContextCompat.checkSelfPermission(getActivity(), permission) != PackageManager
+ .PERMISSION_GRANTED) {
+ tryRequestWithAnnotation();
+ } else {
+ mayGrantedWithAnnotation();
+ }
+ } else {
+ if (PermissionsChecker.isPermissionGranted(getActivity(), getPermission())) {
+ proxy.granted(getContext(), getRequestCode());
+ } else {
+ ForceApplyPermissions.deniedOnResultWithAnnotationForUnderMManufacturer(this);
+ }
+ }
+ }
+
+ private void mayGrantedWithAnnotation() {
+ if (isRequestForce()) {
+ ForceApplyPermissions.grantedOnResultWithAnnotation(this);
+ } else {
+ NormalApplyPermissions.grantedWithAnnotation(this);
+ }
+ }
+
+ /**
+ * 1.under {@link android.os.Build.VERSION_CODES#M}, and it's not the
+ * {@link PermissionsPageManager#isUnderMHasPermissionRequestManufacturer()} manufacturer (those are
+ * some manufacturers that has permission manage under M)
+ *
+ * 2.it's not the {@link PermissionsPageManager#isUnderMHasPermissionRequestManufacturer()}, and
+ * Version Code is bigger than {@link android.os.Build.VERSION_CODES#M}
+ *
+ * 3.under {@link android.os.Build.VERSION_CODES#M}, and it's
+ * {@link PermissionsPageManager#isUnderMHasPermissionRequestManufacturer()}
+ */
+ private void requestPermissionWithListener() {
+ PermissionRequestListener listener = getPermissionRequestListener();
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M && !PermissionsPageManager
+ .isUnderMHasPermissionRequestManufacturer()) {
+ if (listener != null) {
+ listener.permissionGranted();
+ }
+ } else if (!PermissionsPageManager.isUnderMHasPermissionRequestManufacturer()) {
+ String permission = getPermission();
+ if (ContextCompat.checkSelfPermission(getActivity(), permission) != PackageManager
+ .PERMISSION_GRANTED) {
+ tryRequestWithListener();
+ } else {
+ mayGrantedWithListener();
+ }
} else {
- getProxy(object.getClass().getName()).startSyncRequestPermissionsMethod(object);
+ if (PermissionsChecker.isPermissionGranted(getActivity(), getPermission())) {
+ if (listener != null) {
+ listener.permissionGranted();
+ }
+ } else {
+ ForceApplyPermissions.deniedOnResultWithListenerForUnderMManufacturer(this);
+ }
+ }
+ }
+
+ private void mayGrantedWithListener() {
+ if (isRequestForce()) {
+ ForceApplyPermissions.grantedOnResultWithListener(this);
+ } else {
+ NormalApplyPermissions.grantedWithListener(this);
}
}
- abstract void requestPermissionWithAnnotation();
+ /**
+ * request in second request, should use original request with no callback.
+ */
+ abstract void originalRequest();
+
+ /**
+ * use annotation request
+ */
+ abstract void tryRequestWithAnnotation();
- abstract void requestPermissionWithListener();
+ /**
+ * use listener request
+ */
+ abstract void tryRequestWithListener();
public static class Key {
private int requestCode;
diff --git a/permissions4m-api/src/main/java/com/joker/api/wrapper/ActivityWrapper.java b/permissions4m-api/src/main/java/com/joker/api/wrapper/ActivityWrapper.java
index 38ca80a..ba8899f 100644
--- a/permissions4m-api/src/main/java/com/joker/api/wrapper/ActivityWrapper.java
+++ b/permissions4m-api/src/main/java/com/joker/api/wrapper/ActivityWrapper.java
@@ -1,14 +1,8 @@
package com.joker.api.wrapper;
+import android.annotation.SuppressLint;
import android.app.Activity;
-import android.content.pm.PackageManager;
-import android.os.Build;
import android.support.v4.app.ActivityCompat;
-import android.support.v4.content.ContextCompat;
-
-import com.joker.api.PermissionsProxy;
-import com.joker.api.apply.ForceApplyPermissions;
-import com.joker.api.apply.NormalApplyPermissions;
/**
* Created by joker on 2017/8/5.
@@ -32,44 +26,13 @@ public void requestSync() {
}
@Override
- void normalRequest() {
- activity.requestPermissions(new String[]{getPermission()}, getRequestCode());
- }
-
- @SuppressWarnings("unchecked")
- @Override
- void requestPermissionWithAnnotation() {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
- getProxy(getContext().getClass().getName()).granted(activity, getRequestCode());
- } else {
- String permission = getPermission();
- if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager
- .PERMISSION_GRANTED) {
- tryRequestWithAnnotation();
- } else {
- // force
- mayGrantedWithAnnotation();
- }
- }
- }
-
- @Override
- void requestPermissionWithListener() {
- String permission = getPermission();
- int requestCode = getRequestCode();
-
- // denied
- if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager
- .PERMISSION_GRANTED) {
- tryRequestWithListener(permission, requestCode);
- } else {
- // may granted
- mayGrantedWithListener();
- }
+ void originalRequest() {
+ ActivityCompat.requestPermissions(getActivity(), new String[]{getPermission()}, getRequestCode());
}
@SuppressWarnings("unchecked")
- private void tryRequestWithAnnotation() {
+ @SuppressLint("NewApi")
+ void tryRequestWithAnnotation() {
if ((getActivity()).shouldShowRequestPermissionRationale(getPermission())) {
if (!getProxy(getContext().getClass().getName()).customRationale(getActivity(),
getRequestCode())) {
@@ -84,31 +47,14 @@ private void tryRequestWithAnnotation() {
}
@SuppressWarnings("unchecked")
- private void mayGrantedWithAnnotation() {
- if (isRequestForce()) {
- // ensure granted
- ForceApplyPermissions.grantedOnResultWithAnnotation(this);
- } else {
- NormalApplyPermissions.grantedWithAnnotation(this);
- }
- }
-
- private void tryRequestWithListener(String permission, int requestCode) {
- if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {
+ void tryRequestWithListener() {
+ if (ActivityCompat.shouldShowRequestPermissionRationale(activity, getPermission())) {
PermissionRequestListener requestListener = getPermissionRequestListener();
if (requestListener != null) {
requestListener.permissionRationale();
}
}
- ActivityCompat.requestPermissions(activity, new String[]{permission}, requestCode);
- }
-
- private void mayGrantedWithListener() {
- if (isRequestForce()) {
- ForceApplyPermissions.grantedOnResultWithListener(this);
- } else {
- NormalApplyPermissions.grantedWithListener(this);
- }
+ ActivityCompat.requestPermissions(activity, new String[]{getPermission()}, getRequestCode());
}
@Override
diff --git a/permissions4m-api/src/main/java/com/joker/api/wrapper/FragmentBaseWrapper.java b/permissions4m-api/src/main/java/com/joker/api/wrapper/FragmentBaseWrapper.java
index 3649794..acf86f7 100644
--- a/permissions4m-api/src/main/java/com/joker/api/wrapper/FragmentBaseWrapper.java
+++ b/permissions4m-api/src/main/java/com/joker/api/wrapper/FragmentBaseWrapper.java
@@ -1,11 +1,6 @@
package com.joker.api.wrapper;
-import android.content.pm.PackageManager;
-import android.os.Build;
-import android.support.v4.content.ContextCompat;
-
-import com.joker.api.apply.ForceApplyPermissions;
-import com.joker.api.apply.NormalApplyPermissions;
+import android.annotation.SuppressLint;
/**
* Created by joker on 2017/8/17.
@@ -16,59 +11,14 @@ public FragmentBaseWrapper() {
}
- @Override
- void requestPermissionWithAnnotation() {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
- if (getPermissionRequestListener() != null) {
- getPermissionRequestListener().permissionGranted();
- }
- } else {
- // Fragment、SupportFragment
- fragmentRequestWithAnnotation();
- }
- }
-
- @Override
- void requestPermissionWithListener() {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
- if (getPermissionRequestListener() != null) {
- getPermissionRequestListener().permissionGranted();
- }
- } else {
- // Fragment、SupportFragment
- fragmentRequestWithListener();
- }
- }
-
@SuppressWarnings("unchecked")
- private void fragmentRequestWithAnnotation() {
- String permission = getPermission();
- if (ContextCompat.checkSelfPermission(getActivity(), permission) != PackageManager
- .PERMISSION_GRANTED) {
- tryRequestWithAnnotation();
- } else {
- // may granted
- mayGrantedWithAnnotation();
- }
- }
-
- private void fragmentRequestWithListener() {
- String permission = getPermission();
- if (ContextCompat.checkSelfPermission(getActivity(), permission) != PackageManager
- .PERMISSION_GRANTED) {
- tryRequestWithListener();
- } else {
- // may granted
- mayGrantedWithListener();
- }
- }
-
- @SuppressWarnings("unchecked")
- private void tryRequestWithAnnotation() {
+ @SuppressLint("NewApi")
+ void tryRequestWithAnnotation() {
if (getContext() instanceof android.support.v4.app.Fragment) {
if (((android.support.v4.app.Fragment) getContext()).shouldShowRequestPermissionRationale
(getPermission())) {
- if (!getProxy(getContext().getClass().getName()).customRationale(getContext(), getRequestCode())) {
+ if (!getProxy(getContext().getClass().getName()).customRationale(getContext(),
+ getRequestCode())) {
getProxy(getContext().getClass().getName()).rationale(getContext(), getRequestCode());
((android.support.v4.app.Fragment) getContext()).requestPermissions(new
String[]{getPermission()}, getRequestCode());
@@ -80,7 +30,8 @@ private void tryRequestWithAnnotation() {
} else {
if (((android.app.Fragment) getContext()).shouldShowRequestPermissionRationale
(getPermission())) {
- if (!getProxy(getContext().getClass().getName()).customRationale(getContext(), getRequestCode())) {
+ if (!getProxy(getContext().getClass().getName()).customRationale(getContext(),
+ getRequestCode())) {
getProxy(getContext().getClass().getName()).rationale(getContext(), getRequestCode());
((android.app.Fragment) getContext()).requestPermissions(new String[]{getPermission()
}, getRequestCode());
@@ -92,15 +43,8 @@ private void tryRequestWithAnnotation() {
}
}
- private void mayGrantedWithListener() {
- if (isRequestForce()) {
- ForceApplyPermissions.grantedOnResultWithListener(this);
- } else {
- NormalApplyPermissions.grantedWithListener(this);
- }
- }
-
- private void tryRequestWithListener() {
+ @SuppressLint("NewApi")
+ void tryRequestWithListener() {
if (getContext() instanceof android.app.Fragment) {
if (((android.app.Fragment) getContext()).shouldShowRequestPermissionRationale(getPermission
())) {
@@ -124,17 +68,9 @@ private void tryRequestWithListener() {
}
}
- @SuppressWarnings("unchecked")
- private void mayGrantedWithAnnotation() {
- if (isRequestForce()) {
- ForceApplyPermissions.grantedOnResultWithAnnotation(this);
- } else {
- NormalApplyPermissions.grantedWithAnnotation(this);
- }
- }
-
@Override
- void normalRequest() {
+ @SuppressLint("NewApi")
+ void originalRequest() {
if (getContext() instanceof android.app.Fragment) {
((android.app.Fragment) getContext()).requestPermissions(new String[]{getPermission()},
getRequestCode());