Skip to content

Commit 07b095f

Browse files
Dr. Maxie Dion SchmidtDr. Maxie Dion Schmidt
authored andcommitted
Stashing incremental changes - request permission methods - may not compile
1 parent 3966706 commit 07b095f

7 files changed

Lines changed: 783 additions & 20 deletions

File tree

AndroidFilePickerLightLibrary/build.gradle

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,13 @@ android {
3434

3535
defaultConfig {
3636

37-
minSdkVersion 26
38-
targetSdkVersion 30
39-
compileSdkVersion 31
40-
versionCode 22
41-
versionName "1.2.1"
42-
buildToolsVersion "30.0.1"
37+
ndkVersion null
38+
minSdkVersion 29
39+
targetSdkVersion 36
40+
compileSdkVersion 36
41+
versionCode 23
42+
versionName "1.3.0"
43+
//buildToolsVersion "30.0.1"
4344

4445
}
4546

@@ -50,11 +51,20 @@ android {
5051

5152
}
5253

54+
externalNativeBuild {
55+
56+
cmake {
57+
version "3.23.2"
58+
}
59+
60+
}
61+
5362
buildTypes {
5463

5564
release {
5665

5766
minifyEnabled false
67+
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
5868

5969
buildConfigField "long", "VERSION_CODE", "${android.defaultConfig.versionCode}"
6070
buildConfigField "String", "VERSION_NAME", "\"${android.defaultConfig.versionName}\""
@@ -75,6 +85,7 @@ android {
7585
debug {
7686

7787
minifyEnabled false
88+
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
7889

7990
buildConfigField "long", "VERSION_CODE", "${android.defaultConfig.versionCode}"
8091
buildConfigField "String", "VERSION_NAME", "\"${android.defaultConfig.versionName}\""
@@ -98,12 +109,8 @@ android {
98109

99110
repositories {
100111

101-
maven {
102-
103-
url "https://maven.google.com"
104-
name 'Google'
105-
106-
}
112+
mavenCentral()
113+
maven { url 'https://jitpack.io' }
107114

108115
}
109116

AndroidFilePickerLightLibrary/src/main/java/com/maxieds/androidfilepickerlightlibrary/FileChooserActivity.java

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ This program (the AndroidFilePickerLight library) is free software written by
4040
import java.util.Arrays;
4141
import java.util.List;
4242
import java.util.Locale;
43+
import java.util.jar.Manifest;
4344

4445
import pub.devrel.easypermissions.AfterPermissionGranted;
4546
import pub.devrel.easypermissions.AppSettingsDialog;
@@ -66,10 +67,14 @@ public class FileChooserActivity extends AppCompatActivity implements EasyPermis
6667
private PrefetchFilesUpdater prefetchFilesUpdaterInst;
6768

6869
public static final String[] ACTIVITY_REQUIRED_PERMISSIONS = {
69-
"android.permission.READ_EXTERNAL_STORAGE",
70-
"android.permission.WRITE_EXTERNAL_STORAGE",
71-
"android.permission.ACCESS_MEDIA_LOCATION",
72-
"android.permission.INTERNET"
70+
//"android.permission.READ_EXTERNAL_STORAGE",
71+
Manifest.permission.READ_EXTERNAL_STORAGE,
72+
//"android.permission.WRITE_EXTERNAL_STORAGE",
73+
Manifest.permission.WRITE_EXTERNAL_STORAGE,
74+
//"android.permission.ACCESS_MEDIA_LOCATION",
75+
Manifest.permission.ACCESS_MEDIA_LOCATION,
76+
//"android.permission.INTERNET"
77+
Manifest.permission.INTERNET
7378
};
7479

7580
public static final String[] ACTIVITY_OPTIONAL_PERMISSIONS = {
@@ -141,15 +146,15 @@ private void checkRequiredPermissionsForActivityLaunch(long closeActivityDelayTi
141146
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
142147
for (String permission : requiredPermsList) {
143148
if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
144-
Log.w(LOGTAG, String.format(Locale.getDefault(), "No permission for %s", permission));
149+
Log.w(LOGTAG, String.format(Locale.getDefault(), R.string.activityPermErrorMsgFormat, permission));
145150
checkPermsStatusOK = false;
146151
missingPermission = permission;
147152
break;
148153
}
149154
}
150155
}
151156
if (!checkPermsStatusOK) {
152-
String activityReturnErrorMsg = String.format(Locale.getDefault(), "File chooser activity aborted: Unable to obtain required permission: %s", missingPermission);
157+
String activityReturnErrorMsg = String.format(Locale.getDefault(), R.string.activityPermErrorMsgFormat, missingPermission);
153158
final FileChooserException.AndroidFilePickerLightException closeActivityRTEFinal = new FileChooserException.AndroidFilePickerLightException(activityReturnErrorMsg);
154159
Handler closeActivityDelayTimeoutHandler = new Handler();
155160
Runnable closeActivityDelayTimeoutRunner = new Runnable() {
@@ -167,14 +172,41 @@ public void run() {
167172

168173
}
169174

175+
private static ActivityResultCallback activityResCb;
176+
private static ActivityResultLauncher activityResCbLauncher;
177+
178+
@Override
179+
public void onRequestPermissionsResult(int requestCode,
180+
@NonNull String[] permissions,
181+
@NonNull int[] grantResults) {
182+
183+
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
184+
185+
// TODO: If all permissions are obtained, launch the file
186+
// chooser activity before the default 5-sec timeout.
187+
if (requestCode == PermissionsHandler.REQUEST_CODE_ASK_PERMISSIONS) {
188+
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
189+
// Permission was granted, proceed with the functionality
190+
} else {
191+
// Permission was denied, gracefully degrade the app's functionality
192+
}
193+
}
194+
}
170195
@Override
171196
public void onCreate(Bundle lastSettingsBundle) {
172197

173198
super.onCreate(lastSettingsBundle);
174199

175200
RuntimeException closeActivityRTE = null;
201+
activityResCb = new ActivityResultCallback(this);
202+
activityResCbLauncher = registerForActivityResult(activityResCb);
176203
boolean checkPermsStatus = true;
177204
try {
205+
for (whichPerm : ACTIVITY_REQUIRED_PERMISSIONS) {
206+
if (!PermissionsHandler.obtainLocalPermission(this, whichPerm)) {
207+
activityResCbLauncher.launch(whichPerm);
208+
}
209+
}
178210
PermissionsHandler.obtainRequiredPermissions(this, ACTIVITY_REQUIRED_PERMISSIONS);
179211
PermissionsHandler.requestOptionalPermissions(this, ACTIVITY_OPTIONAL_PERMISSIONS);
180212
} catch (Throwable permsEx) {}

AndroidFilePickerLightLibrary/src/main/java/com/maxieds/androidfilepickerlightlibrary/PermissionsHandler.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ This program (the AndroidFilePickerLight library) is free software written by
2222

2323
import androidx.core.content.ContextCompat;
2424

25+
import java.util.jar.Manifest;
26+
2527
import pub.devrel.easypermissions.EasyPermissions;
2628
import pub.devrel.easypermissions.PermissionRequest;
2729

@@ -33,9 +35,52 @@ protected static boolean hasAccessPermission(Activity activityCtx, String permNa
3335

3436
public static final int REQUEST_REQUIRED_PERMISSIONS_CODE = 0;
3537
public static final int REQUEST_OPTIONAL_PERMISSIONS_CODE = 1;
38+
public static final int REQUEST_CODE_ASK_PERMISSIONS = 123;
3639

3740
public static boolean ABORT_ON_DENIED_PERMISSION = false;
3841

42+
private static Map<String, String> REQUIRED_PERMISSIONS_LOOKUP_RATIONALE_MAP;
43+
static {
44+
REQUIRED_PERMISSIONS_LOOKUP_RATIONALE_MAP.put(
45+
Manifest.permission.READ_EXTERNAL_STORAGE,
46+
R.string.permReadExternalRationale
47+
);
48+
REQUIRED_PERMISSIONS_LOOKUP_RATIONALE_MAP.put(
49+
Manifest.permission.WRITE_EXTERNAL_STORAGE,
50+
R.string.permWriteExternalRationale
51+
);
52+
REQUIRED_PERMISSIONS_LOOKUP_RATIONALE_MAP.put(
53+
Manifest.permission.ACCESS_MEDIA_LOCATION,
54+
R.string.permAccessMediaLocRationale
55+
);
56+
REQUIRED_PERMISSIONS_LOOKUP_RATIONALE_MAP.put(
57+
Manifest.permission.INTERNET,
58+
R.string.permInternetRationale
59+
);
60+
}
61+
public static String lookupPermissionRationale(@NotNull String permID) {
62+
String permRationaleLookupResult = REQUIRED_PERMISSIONS_LOOKUP_RATIONALE_MAP.get(permID);
63+
if (permID == null) {
64+
return String.format(R.string.permOptionalRationaleFormat, permID);
65+
}
66+
return permRationaleLookupResult;
67+
}
68+
69+
public static boolean obtainLocalPermission(@NotNull Activity activityCtx, String whichPerm) {
70+
int hasPerm = activityCtx.checkSelfPermission(whichPerm);
71+
int hasPermCompat = ContextCompat.checkSelfPermission(activityCtx, whichPerm)
72+
if (hasPerm != PackageManager.PERMISSION_GRANTED ||
73+
hasPermCompat == PackageManager.PERMISSION_DENIED) {
74+
if (activityCtx.shouldShowRequestPermissionRationale()) {
75+
String permRationale = lookupPermissionRationale(whichPerm);
76+
displayToastMessageShort(activityCtx, permRationale);
77+
}
78+
String[] reqPerms = new String[] { whichPerm };
79+
activityCtx.requestPermissions(reqPerms, PermissionsHandler.REQUEST_CODE_ASK_PERMISSIONS);
80+
return false;
81+
}
82+
return true;
83+
}
3984
public static boolean obtainRequiredPermissions(Activity activityCtx, String[] permsList) {
4085
if(android.os.Build.VERSION.SDK_INT >= 23) {
4186
activityCtx.requestPermissions(permsList, REQUEST_REQUIRED_PERMISSIONS_CODE);

AndroidFilePickerLightLibrary/src/main/res/values/strings.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,12 @@
4444
this application unless these permissions are granted.
4545
</string>
4646

47+
<string name="activityPermErrorMsgFormat">File chooser activity aborted: Unable to obtain required permission: %s</string>
48+
49+
<string name="permReadExternalRationale">The file chooser needs permission to read/write external storage.</string>
50+
<string name="permWriteExternalRationale">The file chooser needs permission to read/write external storage.</string>
51+
<string name="permAccessMediaLocRationale">The file chooser needs permission to access file media location.</string>
52+
<string name="permInternetRationale">The file chooser needs Internet permissions to post notifications.</string>
53+
<string name="permOptionalRationaleFormat">Unknown (optional) permission requested: %s.</string>
54+
4755
</resources>

0 commit comments

Comments
 (0)