org.namelessrom.devicecontrol.widgets.RebootWidget.java Source code

Java tutorial

Introduction

Here is the source code for org.namelessrom.devicecontrol.widgets.RebootWidget.java

Source

/*
 *  Copyright (C) 2013 - 2014 Alexander "Evisceration" Martinz
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
package org.namelessrom.devicecontrol.widgets;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.widget.RemoteViews;

import org.namelessrom.devicecontrol.App;
import org.namelessrom.devicecontrol.R;
import org.namelessrom.devicecontrol.modules.flasher.RebootHelper;
import org.namelessrom.devicecontrol.utils.DrawableHelper;

import at.amartinz.execution.RootShell;

public class RebootWidget extends AppWidgetProvider {

    private static final String SHOW_POPUP_DIALOG_REBOOT_ACTION = "org.namelessrom.devicecontrol.ui.widgets.showrebootdialog";

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] ids) {
        final ComponentName widget = new ComponentName(context, RebootWidget.class);

        final int[] allWidgetInstancesIds = appWidgetManager.getAppWidgetIds(widget);
        for (int widgetId : allWidgetInstancesIds) {
            final RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_reboot);

            final Intent intent = new Intent(context, RebootWidget.class);
            intent.setAction(SHOW_POPUP_DIALOG_REBOOT_ACTION);

            final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.widget_reboot_image, pendingIntent);

            appWidgetManager.updateAppWidget(widgetId, remoteViews);
        }

        super.onUpdate(context, appWidgetManager, ids);
    }

    @Override
    public void onReceive(@NonNull final Context context, @NonNull final Intent intent) {
        if (TextUtils.isEmpty(intent.getAction())) {
            return;
        }

        if (intent.getAction().equals(SHOW_POPUP_DIALOG_REBOOT_ACTION)) {
            final Intent popUpIntent = new Intent(context, RebootDialogActivity.class);
            popUpIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(popUpIntent);
        }

        super.onReceive(context, intent);
    }

    public static class RebootDialogActivity extends Activity implements DialogInterface.OnClickListener {
        private AlertDialog chooserDialog;
        private ProgressDialog rebootDialog;

        @Override
        protected void onDestroy() {
            if (chooserDialog != null) {
                chooserDialog.dismiss();
            }
            if (rebootDialog != null) {
                rebootDialog.dismiss();
            }
            super.onDestroy();
        }

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            final String[] rebootOptions = new String[] { App.get().getString(R.string.shutdown),
                    App.get().getString(R.string.reboot), App.get().getString(R.string.hot_reboot),
                    App.get().getString(R.string.recovery), App.get().getString(R.string.bootloader), };

            final Drawable powerDrawable = ContextCompat
                    .getDrawable(this, R.drawable.ic_power_settings_new_white_24dp).mutate();
            final int powerColor = ContextCompat.getColor(this, R.color.accent_light);
            DrawableHelper.applyColorFilter(powerDrawable, powerColor);

            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setCancelable(false);
            builder.setIcon(powerDrawable);
            builder.setTitle(R.string.widget_power);
            builder.setItems(rebootOptions, this);
            builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dialogInterface.dismiss();
                    finish();
                }
            });

            chooserDialog = builder.create();
            chooserDialog.show();
        }

        @Override
        public void onClick(DialogInterface dialogInterface, int item) {
            final String cmd;
            switch (item) {
            case 0: // shutdown
                cmd = "reboot -p";
                break;
            case 1: // normal
                cmd = "reboot";
                break;
            case 2: // "hot" reboot
                cmd = "pkill -TERM zygote";
                break;
            case 3: // recovery
                cmd = "reboot recovery";
                break;
            case 4: // bootloader
                cmd = "reboot bootloader";
                break;
            default: // not handled
                cmd = "";
                break;
            }
            dialogInterface.dismiss();

            if (!TextUtils.isEmpty(cmd)) {
                final String rebootCmd = String.format("sync;%s;", cmd);
                showRebootDialog(rebootCmd);
                return;
            }

            // close dialog and finish
            finish();
        }

        private void showRebootDialog(final String rebootCmd) {
            rebootDialog = RebootHelper.showRebootProgressDialog(this);

            new AsyncTask<Void, Void, Void>() {
                @Override
                protected void onPreExecute() {
                    rebootDialog.show();
                }

                @Override
                protected Void doInBackground(Void... params) {
                    RootShell.fireAndBlock(rebootCmd);
                    return null;
                }

                @Override
                protected void onPostExecute(Void aVoid) {
                    rebootDialog.dismiss();
                    finish();
                }
            }.execute();
        }
    }

}