Skip to content

Commit c3a0f77

Browse files
committed
适配 AndroidX
1 parent b1dd7dd commit c3a0f77

File tree

18 files changed

+1652
-2
lines changed

18 files changed

+1652
-2
lines changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,10 @@ ActivityResultPermissionUtils.requestPermissions(this, Manifest.permission.CAMER
8484
- 一种是启动一个新的Activity来判断权限,获取ActivityForResult的结果.
8585
- 一种是添加一个Fragment,在Fragment中获取回调,进行解耦合.
8686

87-
RxActivityResult,RxPermission采用都是前者,而此处采用了后者,使用Fragment,优点Fragment占用资源更少.
87+
RxActivityResult,RxPermission采用都是前者,而此处采用了后者,使用Fragment,优点Fragment占用资源更少.
88+
89+
## 关于适配 AndroidX
90+
查看xlibrary下的代码
8891

8992

9093

settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
include ':sample', ':library'
1+
include ':sample', ':library', ':xlibrary'

xlibrary/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

xlibrary/build.gradle

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
apply plugin: 'com.android.library'
2+
3+
android {
4+
compileSdkVersion 28
5+
6+
defaultConfig {
7+
minSdkVersion 9
8+
targetSdkVersion 28
9+
versionCode 1
10+
versionName "1.0"
11+
12+
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
13+
14+
}
15+
16+
buildTypes {
17+
release {
18+
minifyEnabled false
19+
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
20+
}
21+
}
22+
23+
}
24+
25+
dependencies {
26+
implementation fileTree(dir: 'libs', include: ['*.jar'])
27+
28+
implementation 'androidx.appcompat:appcompat:1.0.2'
29+
testImplementation 'junit:junit:4.12'
30+
androidTestImplementation 'androidx.test:runner:1.2.0'
31+
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
32+
}

xlibrary/proguard-rules.pro

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Add project specific ProGuard rules here.
2+
# You can control the set of applied configuration files using the
3+
# proguardFiles setting in build.gradle.
4+
#
5+
# For more details, see
6+
# http://developer.android.com/guide/developing/tools/proguard.html
7+
8+
# If your project uses WebView with JS, uncomment the following
9+
# and specify the fully qualified class name to the JavaScript interface
10+
# class:
11+
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12+
# public *;
13+
#}
14+
15+
# Uncomment this to preserve the line number information for
16+
# debugging stack traces.
17+
#-keepattributes SourceFile,LineNumberTable
18+
19+
# If you keep the line number information, uncomment this to
20+
# hide the original source file name.
21+
#-renamesourcefileattribute SourceFile
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.have.moeny.xlibrary;
2+
3+
import android.content.Context;
4+
5+
import androidx.test.InstrumentationRegistry;
6+
import androidx.test.runner.AndroidJUnit4;
7+
8+
import org.junit.Test;
9+
import org.junit.runner.RunWith;
10+
11+
import static org.junit.Assert.*;
12+
13+
/**
14+
* Instrumented test, which will execute on an Android device.
15+
*
16+
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
17+
*/
18+
@RunWith(AndroidJUnit4.class)
19+
public class ExampleInstrumentedTest {
20+
@Test
21+
public void useAppContext() {
22+
// Context of the app under test.
23+
Context appContext = InstrumentationRegistry.getTargetContext();
24+
25+
assertEquals("com.have.moeny.xlibrary.test", appContext.getPackageName());
26+
}
27+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2+
package="com.ding.xlibrary" />
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
package com.ding.xlibrary;
2+
3+
4+
import android.app.Activity;
5+
import android.content.Intent;
6+
import android.os.Build;
7+
8+
import androidx.annotation.RequiresApi;
9+
import androidx.fragment.app.FragmentActivity;
10+
import androidx.fragment.app.FragmentManager;
11+
12+
13+
/**
14+
* author:DingDeGao
15+
* time:2019-07-16-15:22
16+
* function: ActivityResultPermissionUtils
17+
*/
18+
public final class ActivityResultPermissionUtils {
19+
20+
private static final int TYPE_RESULT = 1;
21+
private static final int TYPE_PERMISSION = 2;
22+
23+
/**
24+
* startActivityForResult
25+
* @param hostActivity if is fragment,please fragment get host activity
26+
* @param intent request intent
27+
*/
28+
public static ResultWrap startActivityForResult(FragmentActivity hostActivity, Intent intent){
29+
ResultWrap resultWrap = new ResultWrap();
30+
getReplaceFragment(hostActivity,TYPE_RESULT,resultWrap).startActivityForResult(intent,ReplaceFragment.ACTIVITY_REQUEST_CODE);
31+
return resultWrap;
32+
}
33+
34+
/**
35+
* requestPermissions
36+
* @param hostActivity if is fragment,please fragment get host activity
37+
* @param permissions 请求的权限列表
38+
* @return
39+
*/
40+
public static PermissionsWrap requestPermissions(FragmentActivity hostActivity, String ...permissions){
41+
return new PermissionsWrap(hostActivity,permissions);
42+
}
43+
44+
45+
private static ReplaceFragment getReplaceFragment(FragmentActivity hostActivity,int type, RequestWarp requestWarp){
46+
FragmentManager fragmentManager = hostActivity.getSupportFragmentManager();
47+
ReplaceFragment fragment = (ReplaceFragment) fragmentManager.findFragmentByTag("ActivityResultPermissionUtilsResult");
48+
if(fragment == null){
49+
fragment = new ReplaceFragment();
50+
fragmentManager.beginTransaction().add(fragment, "ActivityResultPermissionUtilsResult").commit();
51+
fragmentManager.executePendingTransactions();
52+
}
53+
fragment.setIHandle(new HandleImpl());
54+
55+
if(type == TYPE_RESULT){
56+
ResultWrap resultWrap = (ResultWrap) requestWarp;
57+
fragment.getIHandle().setResultListener(resultWrap.innerResultListener);
58+
}else if(type == TYPE_PERMISSION){
59+
PermissionsWrap permissionsWrap = (PermissionsWrap) requestWarp;
60+
fragment.getIHandle().setPermissionResultListener(permissionsWrap.innerPermissionResultListener);
61+
}
62+
return fragment;
63+
}
64+
65+
66+
interface RequestWarp{
67+
68+
}
69+
70+
71+
public static class PermissionsWrap implements RequestWarp{
72+
73+
private Listener.PermissionResultListener mPermissionResultListener;
74+
75+
private FragmentActivity activity;
76+
private String [] permissions;
77+
78+
79+
PermissionsWrap(FragmentActivity activity, String[] permissions) {
80+
this.activity = activity;
81+
this.permissions = permissions;
82+
}
83+
84+
85+
Listener.PermissionResultListener innerPermissionResultListener = new Listener.PermissionResultListener() {
86+
@Override
87+
public void permissionDenied(String permission,boolean rationale) {
88+
if(mPermissionResultListener != null){
89+
mPermissionResultListener.permissionDenied(permission,rationale);
90+
}
91+
}
92+
93+
@Override
94+
public void permissionGranted() {
95+
if(mPermissionResultListener != null){
96+
mPermissionResultListener.permissionGranted();
97+
}
98+
}
99+
};
100+
101+
public void permissions(Listener.PermissionResultListener permissionResultListener) {
102+
this.mPermissionResultListener = permissionResultListener;
103+
if(mPermissionResultListener != null && permissions != null){
104+
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M){
105+
mPermissionResultListener.permissionGranted();
106+
return;
107+
}
108+
109+
if (PermissionUtils.selfPermissionGranted(activity,permissions)) {
110+
mPermissionResultListener.permissionGranted();
111+
return;
112+
}
113+
request();
114+
}
115+
}
116+
117+
public void permissionsWithoutCheck(Listener.PermissionResultListener permissionResultListener) {
118+
this.mPermissionResultListener = permissionResultListener;
119+
if(mPermissionResultListener != null && permissions != null){
120+
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M){
121+
mPermissionResultListener.permissionGranted();
122+
return;
123+
}
124+
request();
125+
}
126+
}
127+
128+
129+
@RequiresApi(api = Build.VERSION_CODES.M)
130+
private void request(){
131+
ReplaceFragment replaceFragment = ActivityResultPermissionUtils.getReplaceFragment(activity,
132+
ActivityResultPermissionUtils.TYPE_PERMISSION, this);
133+
replaceFragment.requestPermissions(permissions,ReplaceFragment.PERMISSION_REQUEST_CODE);
134+
}
135+
}
136+
137+
138+
public static class ResultWrap implements RequestWarp{
139+
140+
private Listener.ResultListener mResultListener;
141+
142+
ResultWrap() {
143+
}
144+
145+
Listener.ResultListener innerResultListener = new Listener.ResultListener() {
146+
147+
@Override
148+
public void onResult(Intent data) {
149+
if(mResultListener != null){
150+
mResultListener.onResult(data);
151+
}
152+
}
153+
154+
@Override
155+
public void onCancel() {
156+
if(mResultListener != null){
157+
mResultListener.onCancel();
158+
}
159+
}
160+
};
161+
162+
public void activityResult(Listener.ResultListener resultListener) {
163+
this.mResultListener = resultListener;
164+
}
165+
166+
}
167+
168+
169+
170+
171+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.ding.xlibrary;
2+
3+
import android.app.Activity;
4+
import android.content.Intent;
5+
import android.content.pm.PackageManager;
6+
7+
import androidx.core.app.ActivityCompat;
8+
9+
/**
10+
* author:DingDeGao
11+
* time:2019-07-16-14:54
12+
* function: HandleImpl
13+
*/
14+
public class HandleImpl implements IHandle{
15+
16+
17+
private Listener.ResultListener resultListener;
18+
private Listener.PermissionResultListener permissionResultListener;
19+
20+
HandleImpl(){
21+
22+
}
23+
24+
@Override
25+
public void onActivityResultHandle(int resultCode, Intent data) {
26+
if(resultListener != null){
27+
if(resultCode == Activity.RESULT_OK){
28+
resultListener.onResult(data);
29+
}else{
30+
resultListener.onCancel();
31+
}
32+
}
33+
}
34+
35+
@Override
36+
public void onRequestPermissionsResultHandle(Activity activity,String[] permissions, int[] grantResults) {
37+
if(permissionResultListener == null) return;
38+
int permissionCount = 0;
39+
for (int i = 0; i < permissions.length; i++) {
40+
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
41+
// 权限申请被拒绝
42+
if(activity != null){
43+
permissionResultListener.permissionDenied(permissions[i],
44+
ActivityCompat.shouldShowRequestPermissionRationale(activity, permissions[i]));
45+
}else{
46+
permissionResultListener.permissionDenied(permissions[i],false);
47+
}
48+
return;
49+
}
50+
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
51+
// 权限申请被同意
52+
permissionCount++;
53+
}
54+
}
55+
if(permissionCount == permissions.length){
56+
permissionResultListener.permissionGranted();
57+
}
58+
}
59+
60+
@Override
61+
public void setResultListener(Listener.ResultListener resultListener) {
62+
this.resultListener = resultListener;
63+
}
64+
65+
@Override
66+
public void setPermissionResultListener(Listener.PermissionResultListener permissionResultListener) {
67+
this.permissionResultListener = permissionResultListener;
68+
}
69+
70+
71+
72+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.ding.xlibrary;
2+
3+
import android.app.Activity;
4+
import android.content.Intent;
5+
6+
/**
7+
* author:DingDeGao
8+
* time:2019-07-16-14:53
9+
* function: IHandle
10+
*/
11+
public interface IHandle {
12+
13+
/**
14+
* ActivityResult Handle
15+
*
16+
* result came from.
17+
* @param resultCode The integer result code returned by the child activity
18+
* through its setResult().
19+
* @param data An Intent, which can return result data to the caller
20+
* (various data can be attached to Intent "extras").
21+
*/
22+
void onActivityResultHandle(int resultCode, Intent data);
23+
24+
/**
25+
* PermissionsResultHandle
26+
* @param activity hostActivity
27+
* @param permissions The requested permissions. Never null.
28+
* @param grantResults The grant results for the corresponding permissions
29+
* which is either
30+
* . Never null.
31+
*/
32+
void onRequestPermissionsResultHandle(Activity activity, String[] permissions, int[] grantResults);
33+
34+
35+
/**
36+
*
37+
* @param resultListener ResultListener {@link Listener.ResultListener}
38+
*/
39+
void setResultListener(Listener.ResultListener resultListener);
40+
41+
/**
42+
*
43+
* @param permissionResultListener PermissionResultListener {@link Listener.PermissionResultListener}
44+
*/
45+
void setPermissionResultListener(Listener.PermissionResultListener permissionResultListener);
46+
47+
}

0 commit comments

Comments
 (0)