diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
index 698f1d0b..9af5f6fb 100644
--- a/android/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -69,7 +69,7 @@
-
+
diff --git a/android/res/values-ru/strings.xml b/android/res/values-ru/strings.xml
index 5933ad91..fe8ea494 100644
--- a/android/res/values-ru/strings.xml
+++ b/android/res/values-ru/strings.xml
@@ -9,6 +9,7 @@
Конец
Выход
Путь к игровым ресурсам
+ Нет разрешений, закрываюсь...
diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml
index e8c954e4..725d1cc3 100644
--- a/android/res/values/strings.xml
+++ b/android/res/values/strings.xml
@@ -14,6 +14,7 @@
Finish
Exit
Path to game resources
+ No permissions, closing...
diff --git a/android/src/su/xash/engine/LauncherActivity.java b/android/src/su/xash/engine/LauncherActivity.java
index 64b3cf35..5aa253c6 100644
--- a/android/src/su/xash/engine/LauncherActivity.java
+++ b/android/src/su/xash/engine/LauncherActivity.java
@@ -2,6 +2,7 @@ package su.xash.engine;
import android.app.*;
import android.content.*;
+import android.content.pm.*;
import android.graphics.*;
import android.graphics.drawable.*;
import android.net.*;
@@ -18,6 +19,8 @@ import java.net.*;
import org.json.*;
import android.preference.*;
import su.xash.fwgslib.*;
+import android.Manifest;
+
public class LauncherActivity extends Activity
{
@@ -37,10 +40,11 @@ public class LauncherActivity extends Activity
static LinearLayout rodirSettings; // to easy show/hide
static int mEngineWidth, mEngineHeight;
+ final static int REQUEST_PERMISSIONS = 42;
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
+ @Override
+ protected void onCreate(Bundle savedInstanceState)
+ {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
//super.setTheme( 0x01030005 );
@@ -263,10 +267,28 @@ public class LauncherActivity extends Activity
hideRodirSettings( !useRoDir.isChecked() );
updateResolutionResult();
toggleResolutionFields();
+ FWGSLib.applyPermissions( this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, REQUEST_PERMISSIONS );
if( !mPref.getBoolean("successfulRun",false) )
showFirstRun();
}
-
+
+ @Override
+ public void onRequestPermissionsResult( int requestCode, String[] permissions, int[] grantResults )
+ {
+ if( requestCode == REQUEST_PERMISSIONS )
+ {
+ if( grantResults[0] == PackageManager.PERMISSION_DENIED )
+ {
+ Toast.makeText( this, R.string.no_permissions, Toast.LENGTH_LONG ).show();
+ finish();
+ }
+ else
+ {
+ // open again?
+ }
+ }
+ }
+
@Override
public void onResume()
{
diff --git a/android/src/su/xash/engine/XashActivity.java b/android/src/su/xash/engine/XashActivity.java
index a85eb586..9297cbb6 100644
--- a/android/src/su/xash/engine/XashActivity.java
+++ b/android/src/su/xash/engine/XashActivity.java
@@ -34,6 +34,7 @@ import su.xash.engine.R;
import su.xash.engine.XashConfig;
import su.xash.engine.JoystickHandler;
import android.provider.Settings.Secure;
+import android.Manifest;
import su.xash.fwgslib.*;
import android.sax.*;
@@ -88,6 +89,8 @@ public class XashActivity extends Activity {
public final static byte JOY_AXIS_YAW = 3;
public final static byte JOY_AXIS_RT = 4;
public final static byte JOY_AXIS_LT = 5;
+
+ final static int REQUEST_PERMISSIONS = 42;
// Preferences
public static SharedPreferences mPref = null;
@@ -128,12 +131,14 @@ public class XashActivity extends Activity {
// landscapeSensor is not supported until API9
if( sdk < 9 )
setRequestedOrientation( 0 );
-
+
mPref = this.getSharedPreferences( "engine", 0 );
mUseRoDir = mPref.getBoolean("use_rodir", false);
mWriteDir = mPref.getString("writedir", FWGSLib.getExternalFilesDir( this ));
+ FWGSLib.applyPermissions( this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, REQUEST_PERMISSIONS );
+
// just in case
if( mWriteDir.length() == 0 )
{
@@ -157,6 +162,23 @@ public class XashActivity extends Activity {
}
}
+ @Override
+ public void onRequestPermissionsResult( int requestCode, String[] permissions, int[] grantResults )
+ {
+ if( requestCode == REQUEST_PERMISSIONS )
+ {
+ if( grantResults[0] == PackageManager.PERMISSION_DENIED )
+ {
+ Toast.makeText( this, R.string.no_permissions, Toast.LENGTH_LONG ).show();
+ finish();
+ }
+ else
+ {
+ // open again?
+ }
+ }
+ }
+
@Override
public void onActivityResult( int requestCode, int resultCode, Intent resultData )
{
diff --git a/android/src/su/xash/fwgslib/FWGSLib.java b/android/src/su/xash/fwgslib/FWGSLib.java
index c25ed2b9..944ac6df 100644
--- a/android/src/su/xash/fwgslib/FWGSLib.java
+++ b/android/src/su/xash/fwgslib/FWGSLib.java
@@ -1,7 +1,9 @@
package su.xash.fwgslib;
+import android.Manifest;
import android.app.*;
import android.content.*;
+import android.content.pm.*;
import android.graphics.*;
import android.graphics.drawable.*;
import android.net.*;
@@ -14,6 +16,8 @@ import android.view.*;
import android.widget.*;
import java.io.*;
import java.net.*;
+import java.lang.*;
+import java.util.*;
import org.json.*;
import android.preference.*;
@@ -222,10 +226,35 @@ public class FWGSLib
catch( Exception e )
{
}
- }
- }
-
+ }
+ }
+
+ public static void applyPermissions( final Activity act, final String permissions[], final int code )
+ {
+ if( sdk >= 23 )
+ {
+ List requestPermissions = new ArrayList();
+
+ for( int i = 0; i < permissions.length; i++ )
+ {
+ if( act.checkSelfPermission(permissions[i]) != PackageManager.PERMISSION_GRANTED )
+ {
+ requestPermissions.add(permissions[i]);
+ }
+ }
+
+ if( !requestPermissions.isEmpty() )
+ {
+ String[] requestPermissionsArray = new String[requestPermissions.size()];
+ for( int i = 0; i < requestPermissions.size(); i++ )
+ {
+ requestPermissionsArray[i] = requestPermissions.get(i);
+ }
+ act.requestPermissions(requestPermissionsArray, code);
+ }
+ }
+ }
public static final int sdk = Integer.valueOf(Build.VERSION.SDK);
}
diff --git a/android/wscript b/android/wscript
index 7a5e889d..355aa1b3 100644
--- a/android/wscript
+++ b/android/wscript
@@ -21,5 +21,5 @@ def build(bld):
jni = 'lib',
keystore = bld.path.parent.find_node('debug.keystore'),
debug = bld.env.D8_DEBUG,
- target_api = 19)
+ target_api = 28)
return