Skip to content

Commit 43b8ef6

Browse files
committed
request permissions from activity
1 parent 6458792 commit 43b8ef6

File tree

2 files changed

+76
-10
lines changed

2 files changed

+76
-10
lines changed

mode/android-support-v4.jar

1.36 MB
Binary file not shown.

src/processing/mode/android/AndroidBuild.java

Lines changed: 76 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import java.io.*;
4444
import java.security.Permission;
4545

46-
4746
class AndroidBuild extends JavaBuild {
4847
// static final String basePackage = "changethispackage.beforesubmitting.tothemarket";
4948
static final String basePackage = "processing.test";
@@ -171,7 +170,8 @@ public File createProject() throws IOException, SketchException {
171170

172171
final File resFolder = new File(tmpFolder, "res");
173172
writeRes(resFolder, sketchClassName);
174-
writeMainActivity(srcFolder);
173+
String[] permissions = manifest.getPermissions();
174+
writeMainActivity(srcFolder, permissions);
175175

176176

177177
// new location for SDK Tools 17: /opt/android/tools/proguard/proguard-android.txt
@@ -186,6 +186,10 @@ public File createProject() throws IOException, SketchException {
186186
// PApplet.saveStream(new File(libsFolder, "processing-core.jar"), input);
187187
Util.copyFile(coreZipFile, new File(libsFolder, "processing-core.jar"));
188188

189+
// Copy the compatibility package, needed for the permission handling
190+
File compatJarFile = mode.getContentFile("mode/android-support-v4.jar");
191+
Util.copyFile(compatJarFile, new File(libsFolder, "android-support-v4.jar"));
192+
189193
// Copy any imported libraries (their libs and assets),
190194
// and anything in the code folder contents to the project.
191195
copyLibraries(libsFolder, assetsFolder);
@@ -893,7 +897,7 @@ private File mkdirs(final File parent, final String name) throws SketchException
893897
}
894898

895899

896-
private void writeMainActivity(final File srcDirectory) {
900+
private void writeMainActivity(final File srcDirectory, String[] permissions) {
897901
File mainActivityFile = new File(new File(srcDirectory, manifest.getPackageName().replace(".", "/")),
898902
"MainActivity.java");
899903
final PrintWriter writer = PApplet.createWriter(mainActivityFile);
@@ -904,25 +908,32 @@ private void writeMainActivity(final File srcDirectory) {
904908
writer.println("import android.view.WindowManager;");
905909
writer.println("import android.widget.FrameLayout;");
906910
writer.println("import android.view.ViewGroup.LayoutParams;");
907-
writer.println("import android.app.FragmentTransaction;");
911+
writer.println("import android.app.FragmentTransaction;");
912+
913+
writer.println("import android.content.pm.PackageManager;");
914+
writer.println("import android.support.v4.app.ActivityCompat;");
915+
writer.println("import android.support.v4.content.ContextCompat;");
916+
writer.println("import java.util.ArrayList;");
917+
writer.println("import android.app.AlertDialog;");
918+
writer.println("import android.content.DialogInterface;");
919+
writer.println("import android.Manifest;");
920+
908921
writer.println("import processing.core.PApplet;");
909922
writer.println("public class MainActivity extends Activity {");
910923
writer.println(" PApplet fragment;");
911924
writer.println(" private static final String MAIN_FRAGMENT_TAG = \"main_fragment\";");
925+
writer.println(" private static final int REQUEST_PERMISSIONS = 1;");
912926
writer.println(" int viewId = 0x1000;");
913927
writer.println(" @Override");
914928
writer.println(" protected void onCreate(Bundle savedInstanceState) {");
915929
writer.println(" super.onCreate(savedInstanceState);");
916930
writer.println(" Window window = getWindow();");
917931
writer.println(" requestWindowFeature(Window.FEATURE_NO_TITLE);");
918-
writer.println("window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,"
919-
+ "WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);");
920-
writer.println("window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,"
921-
+ "WindowManager.LayoutParams.FLAG_FULLSCREEN);");
932+
writer.println(" window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);");
933+
writer.println(" window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);");
922934
writer.println(" FrameLayout frame = new FrameLayout(this);");
923935
writer.println(" frame.setId(viewId);");
924-
writer.println(" setContentView(frame, new LayoutParams(LayoutParams.MATCH_PARENT, "
925-
+ "LayoutParams.MATCH_PARENT));");
936+
writer.println(" setContentView(frame, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));");
926937
writer.println(" if (savedInstanceState == null) {");
927938
writer.println(" fragment = new " + sketchClassName + "();");
928939
writer.println(" FragmentTransaction ft = getFragmentManager().beginTransaction();");
@@ -936,6 +947,61 @@ private void writeMainActivity(final File srcDirectory) {
936947
writer.println(" fragment.onBackPressed();");
937948
writer.println(" super.onBackPressed();");
938949
writer.println(" }");
950+
951+
// Requesting permissions from user when the app resumes.
952+
// Nice example on how to handle user response
953+
// http://stackoverflow.com/a/35495855
954+
// More on permission in Android 23:
955+
// https://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en
956+
writer.println(" @Override");
957+
writer.println(" public void onResume() {");
958+
writer.println(" super.onResume();");
959+
writer.println(" ArrayList<String> needed = new ArrayList<String>();");
960+
writer.println(" int check;");
961+
writer.println(" boolean danger = false;");
962+
for (String p: permissions) {
963+
for (String d: Permissions.dangerous) {
964+
if (d.equals(p)) {
965+
writer.println(" check = ContextCompat.checkSelfPermission(this, Manifest.permission." + p + ");");
966+
writer.println(" if (check != PackageManager.PERMISSION_GRANTED) {");
967+
writer.println(" needed.add(Manifest.permission." + p + ");");
968+
writer.println(" } else {");
969+
writer.println(" danger = true;");
970+
writer.println(" }");
971+
}
972+
}
973+
}
974+
writer.println(" if (!needed.isEmpty()) {");
975+
writer.println(" ActivityCompat.requestPermissions(this, needed.toArray(new String[needed.size()]), REQUEST_PERMISSIONS);");
976+
writer.println(" } else if (danger) {");
977+
writer.println(" fragment.onPermissionsGranted();");
978+
writer.println(" }");
979+
writer.println(" }");
980+
981+
// The event handler for the permission result
982+
writer.println(" @Override");
983+
writer.println(" public void onRequestPermissionsResult(int requestCode,");
984+
writer.println(" String permissions[], int[] grantResults) {");
985+
writer.println(" if (requestCode == REQUEST_PERMISSIONS) {");
986+
writer.println(" if (grantResults.length > 0) {");
987+
writer.println(" for (int i = 0; i < grantResults.length; i++) {");
988+
writer.println(" if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {");
989+
writer.println(" AlertDialog.Builder builder = new AlertDialog.Builder(this);");
990+
writer.println(" builder.setMessage(\"The app cannot run without these permissions, will quit now.\")");
991+
writer.println(" .setCancelable(false)");
992+
writer.println(" .setPositiveButton(\"OK\", new DialogInterface.OnClickListener() {");
993+
writer.println(" public void onClick(DialogInterface dialog, int id) {}");
994+
writer.println(" });");
995+
writer.println(" AlertDialog alert = builder.create();");
996+
writer.println(" alert.show();");
997+
writer.println(" finishAffinity();");
998+
writer.println(" }");
999+
writer.println(" }");
1000+
writer.println(" fragment.onPermissionsGranted();");
1001+
writer.println(" }");
1002+
writer.println(" }");
1003+
writer.println(" }");
1004+
9391005
writer.println("}");
9401006
writer.flush();
9411007
writer.close();

0 commit comments

Comments
 (0)