[Android] Ask for permission
This commit is contained in:
parent
c6dc4d6e88
commit
d650e230e3
|
@ -1,9 +1,9 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="emu.project64" android:versionCode="10" android:versionName="2.3.3" >
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="emu.project64" android:versionCode="11" android:versionName="2.3.3" >
|
||||||
|
|
||||||
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
|
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
|
||||||
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
|
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
|
||||||
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="26" />
|
<uses-sdk android:minSdkVersion="17" android:targetSdkVersion="26" />
|
||||||
|
|
||||||
<uses-permission android:name="com.android.vending.BILLING" />
|
<uses-permission android:name="com.android.vending.BILLING" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
|
|
@ -193,7 +193,11 @@
|
||||||
<string name="assetExtractor_version">version</string>
|
<string name="assetExtractor_version">version</string>
|
||||||
<string name="assetExtractor_progress">%1$.0f%% done: extracting - %2$s</string>
|
<string name="assetExtractor_progress">%1$.0f%% done: extracting - %2$s</string>
|
||||||
<string name="assetExtractor_finished">Finished</string>
|
<string name="assetExtractor_finished">Finished</string>
|
||||||
|
<string name="assetExtractor_error">Error</string>
|
||||||
<string name="assetExtractor_failed">Error extracting app data.\nPlease unplug USB cable, reboot device, and re-launch app.\nFor help, please visit %1$s.</string>
|
<string name="assetExtractor_failed">Error extracting app data.\nPlease unplug USB cable, reboot device, and re-launch app.\nFor help, please visit %1$s.</string>
|
||||||
|
<string name="assetExtractor_failed_permissions">This app cannot proceed without these permissions</string>
|
||||||
|
<string name="assetExtractor_permissions_title">Permissions</string>
|
||||||
|
<string name="assetExtractor_permissions_rationale">Project64 needs to be able to: \nRead your storage to read game files, save states, and configuration.\nWrite to your storage to write configuration and save data.</string>
|
||||||
|
|
||||||
<!-- Game Directory Dialog -->
|
<!-- Game Directory Dialog -->
|
||||||
<string name="scanning_title">Scanning…</string>
|
<string name="scanning_title">Scanning…</string>
|
||||||
|
|
|
@ -22,11 +22,20 @@ import emu.project64.jni.UISettingID;
|
||||||
import emu.project64.task.ExtractAssetsTask;
|
import emu.project64.task.ExtractAssetsTask;
|
||||||
import emu.project64.task.ExtractAssetsTask.ExtractAssetsListener;
|
import emu.project64.task.ExtractAssetsTask.ExtractAssetsListener;
|
||||||
import emu.project64.task.ExtractAssetsTask.Failure;
|
import emu.project64.task.ExtractAssetsTask.Failure;
|
||||||
|
import android.Manifest;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.app.AlertDialog.Builder;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.DialogInterface.OnClickListener;
|
||||||
import android.content.pm.ActivityInfo;
|
import android.content.pm.ActivityInfo;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.support.v4.app.ActivityCompat;
|
||||||
|
import android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback;
|
||||||
|
import android.support.v4.content.ContextCompat;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
|
@ -37,13 +46,16 @@ import android.widget.TextView;
|
||||||
* The main activity that presents the splash screen, extracts the assets if necessary, and launches
|
* The main activity that presents the splash screen, extracts the assets if necessary, and launches
|
||||||
* the main menu activity.
|
* the main menu activity.
|
||||||
*/
|
*/
|
||||||
public class SplashActivity extends Activity implements ExtractAssetsListener
|
public class SplashActivity extends Activity implements ExtractAssetsListener, OnRequestPermissionsResultCallback
|
||||||
{
|
{
|
||||||
|
static final int PERMISSION_REQUEST = 177;
|
||||||
|
static final int NUM_PERMISSIONS = 2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Asset version number, used to determine stale assets. Increment this number every time the
|
* Asset version number, used to determine stale assets. Increment this number every time the
|
||||||
* assets are updated on disk.
|
* assets are updated on disk.
|
||||||
*/
|
*/
|
||||||
private static final int ASSET_VERSION = 2;
|
private static final int ASSET_VERSION = 3;
|
||||||
|
|
||||||
/** The total number of assets to be extracted (for computing progress %). */
|
/** The total number of assets to be extracted (for computing progress %). */
|
||||||
private static final int TOTAL_ASSETS = 89;
|
private static final int TOTAL_ASSETS = 89;
|
||||||
|
@ -80,35 +92,130 @@ public class SplashActivity extends Activity implements ExtractAssetsListener
|
||||||
((TextView) findViewById( R.id.versionText )).setText(NativeExports.appVersion());
|
((TextView) findViewById( R.id.versionText )).setText(NativeExports.appVersion());
|
||||||
mTextView = (TextView) findViewById( R.id.mainText );
|
mTextView = (TextView) findViewById( R.id.mainText );
|
||||||
|
|
||||||
if (!mInit)
|
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
|
||||||
{
|
|
||||||
mInit = true;
|
|
||||||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
|
|
||||||
|
|
||||||
String ConfigFile = AndroidDevice.PACKAGE_DIRECTORY + "/Config/Project64.cfg";
|
if ((ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
|
||||||
if(( new File( ConfigFile ) ).exists())
|
ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) ||
|
||||||
|
!AndroidDevice.IS_LOLLIPOP)
|
||||||
|
{
|
||||||
|
StartExtraction();
|
||||||
|
}
|
||||||
|
else if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE) ||
|
||||||
|
ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE))
|
||||||
|
{
|
||||||
|
new AlertDialog.Builder(this)
|
||||||
|
.setTitle(getString(R.string.assetExtractor_permissions_title))
|
||||||
|
.setMessage(getString(R.string.assetExtractor_permissions_rationale))
|
||||||
|
.setPositiveButton(getString(android.R.string.ok), new OnClickListener()
|
||||||
{
|
{
|
||||||
InitProject64();
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which)
|
||||||
|
{
|
||||||
|
actuallyRequestPermissions();
|
||||||
|
}
|
||||||
|
|
||||||
|
}).setNegativeButton(getString(android.R.string.cancel), new OnClickListener()
|
||||||
|
{
|
||||||
|
//Show dialog stating that the app can't continue without proper permissions
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which)
|
||||||
|
{
|
||||||
|
new AlertDialog.Builder(SplashActivity.this).setTitle(getString(R.string.assetExtractor_error))
|
||||||
|
.setMessage(getString(R.string.assetExtractor_failed_permissions))
|
||||||
|
.setPositiveButton(getString( android.R.string.ok ), new OnClickListener()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which)
|
||||||
|
{
|
||||||
|
SplashActivity.this.finish();
|
||||||
|
}
|
||||||
|
}).setCancelable(false).show();
|
||||||
|
}
|
||||||
|
}).setCancelable(false).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StartExtraction()
|
||||||
|
{
|
||||||
|
if (mInit)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mInit = true;
|
||||||
|
String ConfigFile = AndroidDevice.PACKAGE_DIRECTORY + "/Config/Project64.cfg";
|
||||||
|
if(( new File( ConfigFile ) ).exists())
|
||||||
|
{
|
||||||
|
InitProject64();
|
||||||
|
}
|
||||||
|
|
||||||
|
((Project64Application) getApplication()).getDefaultTracker().send(new HitBuilders.EventBuilder()
|
||||||
|
.setCategory("start")
|
||||||
|
.setLabel(NativeExports.appVersion())
|
||||||
|
.build());
|
||||||
|
|
||||||
|
// Extract the assets in a separate thread and launch the menu activity
|
||||||
|
// Handler.postDelayed ensures this runs only after activity has resumed
|
||||||
|
Log.e( "Splash", "extractAssetsTaskLauncher - startup");
|
||||||
|
final Handler handler = new Handler();
|
||||||
|
if (!mAppInit || NativeExports.UISettingsLoadDword(UISettingID.Asserts_Version.getValue()) != ASSET_VERSION)
|
||||||
|
{
|
||||||
|
handler.post( extractAssetsTaskLauncher );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
handler.postDelayed( startGalleryLauncher, SPLASH_DELAY );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void actuallyRequestPermissions()
|
||||||
|
{
|
||||||
|
ActivityCompat.requestPermissions(this, new String[] {
|
||||||
|
Manifest.permission.READ_EXTERNAL_STORAGE,
|
||||||
|
Manifest.permission.WRITE_EXTERNAL_STORAGE }, PERMISSION_REQUEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
|
||||||
|
{
|
||||||
|
switch (requestCode)
|
||||||
|
{
|
||||||
|
case PERMISSION_REQUEST:
|
||||||
|
{
|
||||||
|
// If request is cancelled, the result arrays are empty.
|
||||||
|
boolean good = true;
|
||||||
|
if (permissions.length != NUM_PERMISSIONS || grantResults.length != NUM_PERMISSIONS)
|
||||||
|
{
|
||||||
|
good = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
((Project64Application) getApplication()).getDefaultTracker().send(new HitBuilders.EventBuilder()
|
for (int i = 0; i < grantResults.length && good; i++)
|
||||||
.setCategory("start")
|
|
||||||
.setLabel(NativeExports.appVersion())
|
|
||||||
.build());
|
|
||||||
|
|
||||||
// Extract the assets in a separate thread and launch the menu activity
|
|
||||||
// Handler.postDelayed ensures this runs only after activity has resumed
|
|
||||||
Log.e( "Splash", "extractAssetsTaskLauncher - startup");
|
|
||||||
final Handler handler = new Handler();
|
|
||||||
if (!mAppInit || NativeExports.UISettingsLoadDword(UISettingID.Asserts_Version.getValue()) != ASSET_VERSION)
|
|
||||||
{
|
{
|
||||||
handler.post( extractAssetsTaskLauncher );
|
if (grantResults[i] != PackageManager.PERMISSION_GRANTED)
|
||||||
|
{
|
||||||
|
good = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!good)
|
||||||
|
{
|
||||||
|
new AlertDialog.Builder(SplashActivity.this).setTitle(getString(R.string.assetExtractor_error))
|
||||||
|
.setMessage(getString(R.string.assetExtractor_failed_permissions))
|
||||||
|
.setPositiveButton(getString( android.R.string.ok ), new OnClickListener()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which)
|
||||||
|
{
|
||||||
|
SplashActivity.this.finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
}).setCancelable(false).show();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
handler.postDelayed( startGalleryLauncher, SPLASH_DELAY );
|
StartExtraction();
|
||||||
}
|
}
|
||||||
}
|
return;
|
||||||
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -185,6 +292,7 @@ public class SplashActivity extends Activity implements ExtractAssetsListener
|
||||||
@Override
|
@Override
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
|
Log.e( "Splash", "extractAssetsTaskLauncher - start");
|
||||||
// Extract and merge the assets if they are out of date
|
// Extract and merge the assets if they are out of date
|
||||||
mAssetsExtracted = 0;
|
mAssetsExtracted = 0;
|
||||||
new ExtractAssetsTask( getAssets(), SOURCE_DIR, AndroidDevice.PACKAGE_DIRECTORY, SplashActivity.this ).execute();
|
new ExtractAssetsTask( getAssets(), SOURCE_DIR, AndroidDevice.PACKAGE_DIRECTORY, SplashActivity.this ).execute();
|
||||||
|
|
Loading…
Reference in New Issue