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