Skip to content

Commit dc9453c

Browse files
committed
Combined storage permission check, restart mainactivity & reload all files after grant, by @gsantner (premerge #1359 #1521)
1 parent 5b2e12f commit dc9453c

File tree

4 files changed

+76
-29
lines changed

4 files changed

+76
-29
lines changed

app/src/main/java/net/gsantner/markor/activity/IntroActivity.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package net.gsantner.markor.activity;
22

3-
import android.Manifest;
43
import android.app.Activity;
54
import android.content.Intent;
65
import android.content.SharedPreferences;
@@ -14,16 +13,17 @@
1413
import net.gsantner.markor.R;
1514
import net.gsantner.markor.util.AppSettings;
1615
import net.gsantner.markor.util.ContextUtils;
17-
import net.gsantner.opoc.util.PermissionChecker;
16+
import net.gsantner.markor.util.PermissionChecker;
1817

1918
public class IntroActivity extends AppIntro {
2019
private static final String PREF_KEY_WAS_SHOWN = IntroActivity.class.getCanonicalName() + "was_shown";
20+
public static final int REQ_CODE_APPINTRO = 61234;
2121

2222
public static void optStart(Activity activeActivity) {
2323
SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(activeActivity.getBaseContext());
2424
boolean wasShownYet = getPrefs.getBoolean(PREF_KEY_WAS_SHOWN, false);
2525
if (!wasShownYet) {
26-
activeActivity.startActivity(new Intent(activeActivity, IntroActivity.class));
26+
activeActivity.startActivityForResult(new Intent(activeActivity, IntroActivity.class), REQ_CODE_APPINTRO);
2727
}
2828
}
2929

@@ -42,7 +42,6 @@ public void onCreate(Bundle savedInstanceState) {
4242
addSlide(AppIntroFragment.newInstance(getString(R.string.quicknote), getString(R.string.quicknote_is_the_fastest_option_to_write_down_notes), R.drawable.ic_launcher_quicknote, ContextCompat.getColor(getApplicationContext(), R.color.primary)));
4343

4444
// Permissions -- takes a permission and slide number
45-
askForPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, getSlides().size());
4645
showSkipButton(false);
4746
setNextPageSwipeLock(false);
4847
setSwipeLock(false);
@@ -72,7 +71,8 @@ public void onDonePressed() {
7271

7372
@Override
7473
public void onSlideChanged() {
75-
if (getPager().getCurrentItem() == 2) {
74+
final int i = getPager().getCurrentItem();
75+
if (i == 2 || i == getSlides().size() - 1) {
7676
new PermissionChecker(this).doIfExtStoragePermissionGranted();
7777
}
7878
}

app/src/main/java/net/gsantner/markor/activity/MainActivity.java

+19
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis
155155
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
156156
PermissionChecker permc = new PermissionChecker(this);
157157
permc.checkPermissionResult(requestCode, permissions, grantResults);
158+
159+
if (_shareUtil.checkExternalStoragePermission(false)) {
160+
restartMainActivity();
161+
}
158162
}
159163

160164

@@ -218,12 +222,27 @@ protected void onResume() {
218222
}
219223
}
220224

225+
private void restartMainActivity() {
226+
getWindow().getDecorView().postDelayed(() -> {
227+
Intent intent = new Intent(this, MainActivity.class);
228+
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
229+
finish();
230+
startActivity(intent);
231+
}, 1);
232+
}
233+
221234
@Override
222235
@SuppressWarnings("unused")
223236
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
224237
// Determine some results and forward using Local Broadcast
225238
Object result = _shareUtil.extractResultFromActivityResult(requestCode, resultCode, data, this);
226239

240+
boolean restart = (requestCode == ShareUtil.REQUEST_STORAGE_PERMISSION_R && ((boolean) result));
241+
restart |= requestCode == IntroActivity.REQ_CODE_APPINTRO && _shareUtil.checkExternalStoragePermission(false);
242+
if (restart) {
243+
restartMainActivity();
244+
}
245+
227246

228247
try {
229248
FilesystemViewerFragment frag = (FilesystemViewerFragment) _viewPagerAdapter.getFragmentByTag(FilesystemViewerFragment.FRAGMENT_TAG);

app/src/main/java/net/gsantner/opoc/util/PermissionChecker.java

+5-24
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,14 @@
1010
#########################################################*/
1111
package net.gsantner.opoc.util;
1212

13-
import android.Manifest;
1413
import android.app.Activity;
1514
import android.content.pm.PackageManager;
16-
import android.support.v4.app.ActivityCompat;
17-
import android.support.v4.content.ContextCompat;
18-
import android.support.v7.app.AlertDialog;
1915

2016
import java.io.File;
2117

2218
@SuppressWarnings({"unused", "WeakerAccess"})
2319
public class PermissionChecker {
24-
protected static final int CODE_PERMISSION_EXTERNAL_STORAGE = 4000;
20+
protected static final int CODE_PERMISSION_EXTERNAL_STORAGE = ShareUtil.REQUEST_STORAGE_PERMISSION_M;
2521

2622
protected Activity _activity;
2723

@@ -30,25 +26,10 @@ public PermissionChecker(Activity activity) {
3026
}
3127

3228
public boolean doIfExtStoragePermissionGranted(String... optionalToastMessageForKnowingWhyNeeded) {
33-
if (ContextCompat.checkSelfPermission(_activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
34-
35-
if (optionalToastMessageForKnowingWhyNeeded != null && optionalToastMessageForKnowingWhyNeeded.length > 0 && optionalToastMessageForKnowingWhyNeeded[0] != null) {
36-
new AlertDialog.Builder(_activity)
37-
.setMessage(optionalToastMessageForKnowingWhyNeeded[0])
38-
.setCancelable(false)
39-
.setNegativeButton(android.R.string.no, null)
40-
.setPositiveButton(android.R.string.yes, (dialog, which) -> {
41-
if (android.os.Build.VERSION.SDK_INT >= 23) {
42-
ActivityCompat.requestPermissions(_activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, CODE_PERMISSION_EXTERNAL_STORAGE);
43-
}
44-
})
45-
.show();
46-
return false;
47-
}
48-
ActivityCompat.requestPermissions(_activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, CODE_PERMISSION_EXTERNAL_STORAGE);
49-
return false;
50-
}
51-
return true;
29+
ShareUtil shareUtil = new ShareUtil(_activity);
30+
final boolean ret = shareUtil.checkExternalStoragePermission(true, optionalToastMessageForKnowingWhyNeeded);
31+
shareUtil.freeContextRef();
32+
return ret;
5233
}
5334

5435
public boolean checkPermissionResult(int requestCode, String[] permissions, int[] grantResults) {

app/src/main/java/net/gsantner/opoc/util/ShareUtil.java

+47
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import java.util.List;
7676
import java.util.Locale;
7777
import java.util.Random;
78+
import java.util.concurrent.atomic.AtomicReference;
7879

7980
/**
8081
* A utility class to ease information sharing on Android.
@@ -92,6 +93,8 @@ public class ShareUtil {
9293
public final static int REQUEST_CAMERA_PICTURE = 50001;
9394
public final static int REQUEST_PICK_PICTURE = 50002;
9495
public final static int REQUEST_SAF = 50003;
96+
public final static int REQUEST_STORAGE_PERMISSION_M = 50004;
97+
public final static int REQUEST_STORAGE_PERMISSION_R = 50005;
9598

9699
public final static int MIN_OVERWRITE_LENGTH = 5;
97100

@@ -823,6 +826,11 @@ public Object extractResultFromActivityResult(final int requestCode, final int r
823826
}
824827
break;
825828
}
829+
830+
case REQUEST_STORAGE_PERMISSION_M:
831+
case REQUEST_STORAGE_PERMISSION_R: {
832+
return checkExternalStoragePermission(false);
833+
}
826834
}
827835
return null;
828836
}
@@ -1289,4 +1297,43 @@ public static String formatDateTime(@NonNull final Context context, @NonNull fin
12891297
final Locale locale = ConfigurationCompat.getLocales(context.getResources().getConfiguration()).get(0);
12901298
return formatDateTime(locale, format, datetime, def);
12911299
}
1300+
1301+
@SuppressWarnings("ConstantConditions")
1302+
public boolean checkExternalStoragePermission(final boolean doRequest, String... optionalDescription) {
1303+
final Activity activity = greedyGetActivity();
1304+
final int v = android.os.Build.VERSION.SDK_INT;
1305+
final AtomicReference<Callback.a0> permissionRequest = new AtomicReference<>();
1306+
1307+
// On Android M-Q - request M permission
1308+
if (v >= android.os.Build.VERSION_CODES.M && ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
1309+
permissionRequest.set(() -> ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE_PERMISSION_M));
1310+
}
1311+
1312+
if (doRequest && permissionRequest.get() != null) {
1313+
if (optionalDescription == null || optionalDescription.length == 0 || TextUtils.isEmpty(optionalDescription[0])) {
1314+
permissionRequest.get().callback();
1315+
} else {
1316+
final AlertDialog d = new AlertDialog.Builder(activity)
1317+
.setMessage(optionalDescription[0])
1318+
.setCancelable(false)
1319+
.setPositiveButton(android.R.string.yes, (dialog, which) -> permissionRequest.get().callback())
1320+
.setNegativeButton(android.R.string.no, null)
1321+
.show();
1322+
d.setCanceledOnTouchOutside(false);
1323+
}
1324+
}
1325+
1326+
// Android M permissions
1327+
if (v >= android.os.Build.VERSION_CODES.M) {
1328+
return ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
1329+
}
1330+
1331+
// In case unsure, check if anything is writable at external storage
1332+
for (final File f : Environment.getExternalStorageDirectory() != null ? Environment.getExternalStorageDirectory().listFiles() : new File[0]) {
1333+
if (f.canWrite()) {
1334+
return true;
1335+
}
1336+
}
1337+
return false;
1338+
}
12921339
}

0 commit comments

Comments
 (0)