/** * ON/OFF Widget implementation * * Copyright (C) 2009-2011 Rodrigo Zechin Rosauro * Copyright (C) 2012 Umakanthan Chandran * * 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/>. * * @author Rodrigo Zechin Rosauro, Umakanthan Chandran * @version 1.1 */ package dev.ukanth.ufirewall.widget; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.widget.RemoteViews; import android.widget.Toast; import dev.ukanth.ufirewall.Api; import dev.ukanth.ufirewall.R; import dev.ukanth.ufirewall.service.RootShell.RootCommand; import dev.ukanth.ufirewall.util.G; /** * ON/OFF Widget implementation */ public class StatusWidget extends AppWidgetProvider { @Override public void onReceive(final Context context, final Intent intent) { super.onReceive(context, intent); if (Api.STATUS_CHANGED_MSG.equals(intent.getAction())) { // Broadcast sent when the DroidWall status has changed final Bundle extras = intent.getExtras(); if (extras != null && extras.containsKey(Api.STATUS_EXTRA)) { final boolean firewallEnabled = extras.getBoolean(Api.STATUS_EXTRA); final AppWidgetManager manager = AppWidgetManager.getInstance(context); final int[] widgetIds = manager.getAppWidgetIds(new ComponentName(context,StatusWidget.class)); showWidget(context, manager, widgetIds, firewallEnabled); } } else if (Api.TOGGLE_REQUEST_MSG.equals(intent.getAction())) { // Broadcast sent to request toggling DroidWall's status /*final String oldPwd = G.profile_pwd(); final String newPwd = context.getSharedPreferences(Api.PREF_FIREWALL_STATUS, 0).getString("LockPassword", ""); */ final SharedPreferences prefs = context.getSharedPreferences(Api.PREF_FIREWALL_STATUS, 0); final boolean enabled = !prefs.getBoolean(Api.PREF_ENABLED, true); if (!enabled && !G.protectionLevel().equals("p0")) { Toast.makeText(context, R.string.widget_disable_fail,Toast.LENGTH_SHORT).show(); return; } if (enabled) { Api.applySavedIptablesRules(context, true, new RootCommand() .setSuccessToast(R.string.toast_enabled) .setFailureToast(R.string.toast_error_enabling) .setReopenShell(true) .setCallback(new RootCommand.Callback() { public void cbFunc(RootCommand state) { // setEnabled always sends us a STATUS_CHANGED_MSG intent to update the icon Api.setEnabled(context, state.exitCode == 0, true); } })); } else { Api.purgeIptables(context, true, new RootCommand() .setSuccessToast(R.string.toast_disabled) .setFailureToast(R.string.toast_error_disabling) .setReopenShell(true) .setCallback(new RootCommand.Callback() { public void cbFunc(RootCommand state) { Api.setEnabled(context, state.exitCode != 0, true); } })); } } } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] ints) { super.onUpdate(context, appWidgetManager, ints); final SharedPreferences prefs = context.getSharedPreferences(Api.PREF_FIREWALL_STATUS, 0); boolean enabled = prefs.getBoolean(Api.PREF_ENABLED, true); showWidget(context, appWidgetManager, ints, enabled); } private void showWidget(Context context, AppWidgetManager manager, int[] widgetIds, boolean enabled) { final RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.onoff_widget); final int iconId = enabled ? R.drawable.widget_on: R.drawable.widget_off; views.setInt(R.id.widgetCanvas, "setBackgroundResource", iconId); final Intent msg = new Intent(Api.TOGGLE_REQUEST_MSG); final PendingIntent intent = PendingIntent.getBroadcast(context, -1,msg, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.widgetCanvas, intent); manager.updateAppWidget(widgetIds, views); } }