diff options
Diffstat (limited to 'android/xscreensaver/src/org/jwz/xscreensaver/Activity.java')
-rw-r--r-- | android/xscreensaver/src/org/jwz/xscreensaver/Activity.java | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/android/xscreensaver/src/org/jwz/xscreensaver/Activity.java b/android/xscreensaver/src/org/jwz/xscreensaver/Activity.java new file mode 100644 index 0000000..ac0ab4c --- /dev/null +++ b/android/xscreensaver/src/org/jwz/xscreensaver/Activity.java @@ -0,0 +1,169 @@ +/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * xscreensaver, Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org> + * and Dennis Sheil <dennis@panaceasupplies.com> + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * This is the XScreenSaver "application" that just brings up the + * Live Wallpaper preferences. + */ + +package org.jwz.xscreensaver; + +import android.app.WallpaperManager; +import android.content.ComponentName; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.view.View; +import android.provider.Settings; +import android.Manifest; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.os.Build; +import android.content.pm.PackageManager; + +public class Activity extends android.app.Activity + implements View.OnClickListener { + + private boolean wallpaperButtonClicked, daydreamButtonClicked; + private final static int MY_REQ_READ_EXTERNAL_STORAGE = 271828; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // openList(); + setContentView(R.layout.activity_xscreensaver); + wallpaperButtonClicked = false; + daydreamButtonClicked = false; + + findViewById(R.id.apply_wallpaper).setOnClickListener(this); + findViewById(R.id.apply_daydream).setOnClickListener(this); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.apply_wallpaper: + wallpaperButtonClicked(); + break; + case R.id.apply_daydream: + daydreamButtonClicked(); + break; + } + } + + // synchronized when dealing with wallpaper state - perhaps can + // narrow down more + private synchronized void withProceed() { + if (daydreamButtonClicked) { + String action; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + action = Settings.ACTION_DREAM_SETTINGS; + } else { + action = Settings.ACTION_DISPLAY_SETTINGS; + } + startActivity(new Intent(action)); + } else if (wallpaperButtonClicked) { + startActivity(new Intent(WallpaperManager.ACTION_LIVE_WALLPAPER_CHOOSER)); + } + } + + private void wallpaperButtonClicked() { + wallpaperButtonClicked = true; + checkPermission(); + } + + private void daydreamButtonClicked() { + daydreamButtonClicked = true; + checkPermission(); + } + + void checkPermission() { + // RES introduced in API 16 + String permission = Manifest.permission.READ_EXTERNAL_STORAGE; + if (havePermission(permission)) { + withProceed(); + } else { + noPermission(permission); + } + } + + private void noPermission(String permission) { + int myRequestCode; + myRequestCode = MY_REQ_READ_EXTERNAL_STORAGE; + + if (permissionsDeniedRationale(permission)) { + showDeniedRationale(); + } else { + requestPermission(permission, myRequestCode); + } + } + + private boolean permissionsDeniedRationale(String permission) { + boolean rationale = ActivityCompat.shouldShowRequestPermissionRationale(this, + permission); + return rationale; + } + + private void requestPermission(String permission, int myRequestCode) { + ActivityCompat.requestPermissions(this, + new String[]{permission}, + myRequestCode); + + // myRequestCode is an app-defined int constant. + // The callback method gets the result of the request. + } + + // TODO: This method should be asynchronous, and not block the thread + private void showDeniedRationale() { + withProceed(); + } + + boolean havePermission(String permission) { + + if (Build.VERSION.SDK_INT < 16) { + return true; + } + + if (permissionGranted(permission)) { + return true; + } + + return false; + } + + private boolean permissionGranted(String permission) { + boolean check = ContextCompat.checkSelfPermission(this, permission) == + PackageManager.PERMISSION_GRANTED; + return check; + } + + public void proceedIfPermissionGranted(int[] grantResults) { + + // If request is cancelled, the result arrays are empty. + if (grantResults.length > 0 + && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + withProceed(); + } else if (grantResults.length > 0) { + withProceed(); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, + String permissions[], int[] grantResults) { + switch (requestCode) { + case MY_REQ_READ_EXTERNAL_STORAGE: + proceedIfPermissionGranted(grantResults); + } + } + +} |