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 proxyMap = new HashMap<>(); private static Map> wrapperMap = new HashMap<>(); @Permissions4M.PageType @@ -27,7 +34,7 @@ public abstract class AbstractWrapper implements Wrapper { private String permission; private PermissionRequestListener permissionRequestListener; private PermissionPageListener permissionPageListener; - private boolean force; + private boolean force = DEFAULT_IS_FORCE; private boolean requestOnRationale; public AbstractWrapper() { @@ -142,7 +149,7 @@ public void request() { // on rationale, it should use normal request if (isRequestOnRationale()) { - normalRequest(); + originalRequest(); } else { // not on rationale, judge condition if (permissionRequestListener == null) { @@ -153,8 +160,6 @@ public void request() { } } - abstract void normalRequest(); - void requestSync(Activity activity) { privateRequestSync(activity); } @@ -169,16 +174,111 @@ void requestSync(android.support.v4.app.Fragment fragment) { @SuppressWarnings("unchecked") private void privateRequestSync(Object object) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - getProxy(object.getClass().getName()).granted(object, getRequestCode()); + getProxy(object.getClass().getName()).startSyncRequestPermissionsMethod(object); + } + + /** + * 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()} + */ + @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());