Skip to content

Commit 168ab92

Browse files
committed
ANDROID: avoid check permission race
1 parent 3106845 commit 168ab92

File tree

3 files changed

+59
-56
lines changed

3 files changed

+59
-56
lines changed

configure.ac

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ function buildSDL() {
209209

210210
BUILD_SUBDIRS="src/common src/platform/sdl"
211211
AC_SUBST(BUILD_SUBDIRS)
212-
(xxd -i src/platform/android/app/src/main/assets/main.bas > src/platform/sdl/main_bas.h)
212+
(cd src/platform/android/app/src/main/assets && xxd -i main.bas > ../../../../../../../src/platform/sdl/main_bas.h)
213213
(cd documentation && g++ -o build_kwp build_kwp.cpp && ./build_kwp > ../src/ui/kwp.h)
214214
}
215215

src/platform/android/app/src/main/java/net/sourceforge/smallbasic/MainActivity.java

Lines changed: 56 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,5 @@
11
package net.sourceforge.smallbasic;
22

3-
import java.io.BufferedOutputStream;
4-
import java.io.BufferedReader;
5-
import java.io.BufferedWriter;
6-
import java.io.ByteArrayInputStream;
7-
import java.io.ByteArrayOutputStream;
8-
import java.io.DataInputStream;
9-
import java.io.File;
10-
import java.io.FileNotFoundException;
11-
import java.io.FileOutputStream;
12-
import java.io.FileReader;
13-
import java.io.FileWriter;
14-
import java.io.IOException;
15-
import java.io.InputStreamReader;
16-
import java.io.UnsupportedEncodingException;
17-
import java.net.Inet4Address;
18-
import java.net.InetAddress;
19-
import java.net.NetworkInterface;
20-
import java.net.ServerSocket;
21-
import java.net.Socket;
22-
import java.net.SocketException;
23-
import java.net.URLDecoder;
24-
import java.nio.file.Files;
25-
import java.nio.file.Path;
26-
import java.nio.file.Paths;
27-
import java.util.Date;
28-
import java.util.Enumeration;
29-
import java.util.HashMap;
30-
import java.util.Locale;
31-
import java.util.Map;
32-
import java.util.Properties;
33-
import java.util.Queue;
34-
import java.util.concurrent.ConcurrentLinkedQueue;
35-
import java.util.concurrent.ExecutorService;
36-
import java.util.concurrent.Executors;
37-
import java.util.concurrent.Semaphore;
38-
import java.util.zip.GZIPInputStream;
39-
403
import android.Manifest;
414
import android.annotation.SuppressLint;
425
import android.app.Activity;
@@ -57,11 +20,8 @@
5720
import android.media.AudioManager;
5821
import android.media.MediaPlayer;
5922
import android.net.Uri;
60-
import android.os.Build;
6123
import android.os.Bundle;
6224
import android.os.Environment;
63-
import android.support.annotation.NonNull;
64-
import android.support.annotation.RequiresApi;
6525
import android.support.v4.app.ActivityCompat;
6626
import android.support.v4.content.ContextCompat;
6727
import android.util.Base64;
@@ -76,6 +36,39 @@
7636
import android.view.inputmethod.InputMethodManager;
7737
import android.widget.Toast;
7838

39+
import java.io.BufferedOutputStream;
40+
import java.io.BufferedReader;
41+
import java.io.BufferedWriter;
42+
import java.io.ByteArrayInputStream;
43+
import java.io.ByteArrayOutputStream;
44+
import java.io.DataInputStream;
45+
import java.io.File;
46+
import java.io.FileNotFoundException;
47+
import java.io.FileReader;
48+
import java.io.FileWriter;
49+
import java.io.IOException;
50+
import java.io.InputStreamReader;
51+
import java.io.UnsupportedEncodingException;
52+
import java.net.Inet4Address;
53+
import java.net.InetAddress;
54+
import java.net.NetworkInterface;
55+
import java.net.ServerSocket;
56+
import java.net.Socket;
57+
import java.net.SocketException;
58+
import java.net.URLDecoder;
59+
import java.util.Date;
60+
import java.util.Enumeration;
61+
import java.util.HashMap;
62+
import java.util.Locale;
63+
import java.util.Map;
64+
import java.util.Properties;
65+
import java.util.Queue;
66+
import java.util.concurrent.ConcurrentLinkedQueue;
67+
import java.util.concurrent.ExecutorService;
68+
import java.util.concurrent.Executors;
69+
import java.util.concurrent.Semaphore;
70+
import java.util.zip.GZIPInputStream;
71+
7972
/**
8073
* Extends NativeActivity to provide interface methods for runtime.cpp
8174
*
@@ -92,6 +85,7 @@ public class MainActivity extends NativeActivity {
9285
private static final float LOCATION_DISTANCE = 1;
9386
private static final int REQUEST_STORAGE_PERMISSION = 1;
9487
private static final int REQUEST_LOCATION_PERMISSION = 2;
88+
private static final String FOLDER_NAME = "SmallBASIC";
9589
private String _startupBas = null;
9690
private boolean _untrusted = false;
9791
private final ExecutorService _audioExecutor = Executors.newSingleThreadExecutor();
@@ -192,6 +186,17 @@ public void browseFile(final byte[] pathBytes) {
192186
}
193187
}
194188

189+
public int checkFilePermission() {
190+
int result;
191+
if (!permitted(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
192+
checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, REQUEST_STORAGE_PERMISSION);
193+
result = 1;
194+
} else {
195+
result = 0;
196+
}
197+
return result;
198+
}
199+
195200
public void clearSoundQueue() {
196201
Log.i(TAG, "clearSoundQueue");
197202
for (Sound sound : _sounds) {
@@ -250,9 +255,9 @@ public String getExternalStorage() {
250255
String result;
251256
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
252257
if (isPublicStorage(path)) {
253-
File sb = new File(path, "sbasic");
258+
File sb = new File(path, FOLDER_NAME);
254259
if ((sb.isDirectory() && sb.canWrite()) || sb.mkdirs()) {
255-
result = path + "/sbasic";
260+
result = path + "/" + FOLDER_NAME;
256261
} else {
257262
result = path;
258263
}
@@ -451,13 +456,7 @@ public boolean requestLocationUpdates() {
451456
final LocationManager locationService = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
452457
boolean result = false;
453458
if (!permitted(Manifest.permission.ACCESS_FINE_LOCATION)) {
454-
runOnUiThread(new Runnable() {
455-
@Override
456-
public void run() {
457-
String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION};
458-
ActivityCompat.requestPermissions(MainActivity.this, permissions, REQUEST_LOCATION_PERMISSION);
459-
}
460-
});
459+
checkPermission(Manifest.permission.ACCESS_FINE_LOCATION, REQUEST_LOCATION_PERMISSION);
461460
} else if (locationService != null) {
462461
final Criteria criteria = new Criteria();
463462
final String provider = locationService.getBestProvider(criteria, true);
@@ -605,7 +604,6 @@ public void speak(final byte[] textBytes) {
605604
@Override
606605
protected void onCreate(Bundle savedInstanceState) {
607606
super.onCreate(savedInstanceState);
608-
checkFilePermission();
609607
processIntent();
610608
processSettings();
611609
}
@@ -637,11 +635,14 @@ private String buildTokenForm() {
637635
"<input value=OK name=okay type=submit style='vertical-align:top'></form>";
638636
}
639637

640-
private void checkFilePermission() {
641-
if (!permitted(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
642-
String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
643-
ActivityCompat.requestPermissions(this, permissions, REQUEST_STORAGE_PERMISSION);
644-
}
638+
private void checkPermission(final String permission, final int result) {
639+
runOnUiThread(new Runnable() {
640+
@Override
641+
public void run() {
642+
String[] permissions = {permission};
643+
ActivityCompat.requestPermissions(MainActivity.this, permissions, result);
644+
}
645+
});
645646
}
646647

647648
private String execBuffer(final String buffer, final String name, boolean run) throws IOException {

src/platform/android/jni/runtime.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,8 @@ void Runtime::runShell() {
458458
_app->activity->callbacks->onContentRectChanged = onContentRectChanged;
459459
loadConfig();
460460

461+
getInteger("checkFilePermission");
462+
461463
String ipAddress = getString("getIpAddress");
462464
if (!ipAddress.empty()) {
463465
setenv("IP_ADDR", ipAddress.c_str(), 1);

0 commit comments

Comments
 (0)