Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 8c7db05d authored by Michael W's avatar Michael W Committed by Michael Bestas
Browse files

DeskClock: Refactor to ask user for permissions

* In preparation for T's POST_NOTIFICATION permission, we need
  to ask the user to grant it (if he revoked it, since we pregrant it)
  or to finish the app since it will not work anyway
* Use the chance to show the rationale for the power-off permission
  already

Change-Id: I117586781e03320a3662d26fbe1ee85950f1fd50
parent 3342cbe0
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -39,4 +39,13 @@
    <string name="timer_channel">Timer</string>

    <string name="add_label">Add label</string>

    <!-- Permissions dialog title -->
    <string name="dialog_permissions_title">Permissions</string>
    <!-- Permissions dialog action: ask permissions access again -->
    <string name="dialog_permissions_ask">Ask again</string>
    <!-- Permissions dialog action: dismiss dialog -->
    <string name="dialog_permissions_dismiss">Dismiss</string>
    <!-- Permission dialog: ask for power off alarm permission -->
    <string name="dialog_permissions_power_off_alarm">Without this permission your device won\'t be able to power on itself to fire an alarm</string>
</resources>
+66 −7
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.app.AlertDialog;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
@@ -57,6 +58,9 @@ import com.google.android.material.snackbar.Snackbar;
import static android.text.format.DateUtils.SECOND_IN_MILLIS;
import static com.android.deskclock.AnimatorUtils.getScaleAnimator;

import java.util.ArrayList;
import java.util.List;

/**
 * The main activity of the application which displays 4 different tabs contains alarms, world
 * clocks, timers and a stopwatch.
@@ -126,6 +130,8 @@ public class DeskClock extends BaseActivity

    private static final int CODE_FOR_ALARM_PERMISSION = 1;

    private static final int INVALID_RES = -1;

    @Override
    public void onNewIntent(Intent newIntent) {
        super.onNewIntent(newIntent);
@@ -428,18 +434,71 @@ public class DeskClock extends BaseActivity
    }

    private void checkPermissions() {
        if (checkSelfPermission(PERMISSION_POWER_OFF_ALARM)
                != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{PERMISSION_POWER_OFF_ALARM}, CODE_FOR_ALARM_PERMISSION);
        final List<String> missingPermissions = new ArrayList<>();
        if (!hasPermission(PERMISSION_POWER_OFF_ALARM)) {
            missingPermissions.add(PERMISSION_POWER_OFF_ALARM);
        }

        if (!missingPermissions.isEmpty()) {
            final String[] requestArray = missingPermissions.toArray(new String[0]);
            requestPermissions(requestArray, CODE_FOR_ALARM_PERMISSION);
        }
    }

    private boolean hasPermission(String permission) {
        return checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String[] permissions, int[] grantResults) {
    public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                           int[] grantResults) {
        if (requestCode == CODE_FOR_ALARM_PERMISSION) {
            if (hasPermission(PERMISSION_POWER_OFF_ALARM)) {
                LogUtils.i("Power off alarm permission is granted.");
            } else {
                showRationale(PERMISSION_POWER_OFF_ALARM,
                        R.string.dialog_permissions_power_off_alarm, INVALID_RES, false);
            }
        }
    }

    private void showRationale(String permission, @StringRes int messageRes,
                               @StringRes int errorRes, boolean finishWhenDenied) {
        if (shouldShowRequestPermissionRationale(permission)) {
            showPermissionRationale(messageRes, this::checkPermissions, finishWhenDenied);
        } else if (errorRes != INVALID_RES){
            showPermissionError(errorRes, finishWhenDenied);
        }
    }

    private void showPermissionRationale(@StringRes int messageRes, Runnable requestAgain,
                                         Boolean finishWhenDenied) {
        new AlertDialog.Builder(this)
                .setTitle(R.string.dialog_permissions_title)
                .setMessage(messageRes)
                .setPositiveButton(R.string.dialog_permissions_ask,
                        (dialog, position) -> {
                            dialog.dismiss();
                            requestAgain.run();
                        })
                .setNegativeButton(R.string.dialog_permissions_dismiss, (dialog, position) -> {
                    if (finishWhenDenied) {
                        finish();
                    }
                })
                .show();
    }

    private void showPermissionError(@StringRes int messageRes, boolean finishWhenDenied) {
        new AlertDialog.Builder(this)
                .setTitle(R.string.dialog_permissions_title)
                .setMessage(messageRes)
                .setPositiveButton(R.string.dialog_permissions_dismiss, (dialog, position) -> {
                    if (finishWhenDenied) {
                        finish();
                    }
                })
                .show();
    }

    /**