content: package uk.co.adventuregamestudio.agsplayer;
  
  import android.Manifest;
  import android.app.AlertDialog;
  import android.content.pm.PackageManager;
  import android.os.Build;
  import android.os.Bundle;
  import android.util.Log;
  
  import androidx.annotation.Keep;
  import androidx.core.app.ActivityCompat;
  
  import uk.co.adventuregamestudio.runtime.AGSRuntimeActivity;
  
  public class AGSPlayerRuntimeActivity extends AGSRuntimeActivity {
      protected final int[] externalStorageRequestDummy = new int[1];
      public static final int EXTERNAL_STORAGE_REQUEST_CODE = 2;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
  
          if(Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
              if (!hasExternalStoragePermission()) {
                  showExternalStoragePermissionMissingDialog();
              }
          }
  
          super.onCreate(savedInstanceState);
      }
  
      public void showExternalStoragePermissionMissingDialog() {
          AlertDialog dialog = new AlertDialog.Builder(mSingleton)
                  .setTitle("Storage Permission Missing")
                  .setMessage("AGS for Android will not be able to run non-packaged games without storage permission.")
                  .setNeutralButton("Continue", null)
                  .create();
          dialog.show();
      }
  
      @Override
      public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
          if (grantResults.length > 0) {
              Log.d("AGSPlayerRuntimeActivit", "Received a request permission result");
  
              switch (requestCode) {
                  case EXTERNAL_STORAGE_REQUEST_CODE: {
                      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                          Log.d("AGSPlayerRuntimeActivit", "Permission granted");
                      } else {
                          Log.d("AGSPlayerRuntimeActivit", "Did not get permission.");
                          if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
                              showExternalStoragePermissionMissingDialog();
                          }
                      }
  
                      Log.d("AGSPlayerRuntimeActivit", "Unlocking AGS thread");
                      synchronized (externalStorageRequestDummy) {
                          externalStorageRequestDummy[0] = grantResults[0];
                          externalStorageRequestDummy.notify();
                      }
                      break;
                  }
                  default:
                      super.onRequestPermissionsResult(requestCode, permissions, grantResults);
              }
          }
      }
  
  
      @Keep
      public boolean hasExternalStoragePermission() {
          if (ActivityCompat.checkSelfPermission(this,
                  Manifest.permission.READ_EXTERNAL_STORAGE)
                  == PackageManager.PERMISSION_GRANTED) {
              return true;
          }
  
          Log.d("AGSPlayerRuntimeActivit", "Requesting permission and locking AGS thread until we have an answer.");
          ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_REQUEST_CODE);
  
          synchronized (externalStorageRequestDummy) {
              try {
                  externalStorageRequestDummy.wait();
              } catch (InterruptedException e) {
                  Log.d("AGSPlayerRuntimeActivit", "requesting external storage permission", e);
                  return false;
              }
          }
  
          return ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
      }
  }
  