/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.accessibilitywidget;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.provider.Settings;
import android.util.secutil.Log;
import android.view.View;
import android.widget.RemoteViews;
import com.android.settings.R;
import com.sec.android.app.GlobalConfig;
import com.sec.android.hardware.SecHardwareInterface;
//WTL_SIDI_EDM_START
//import android.app.enterprise.IRestrictionPolicy;
//WTL_SIDI_EDM_END
public class AccessibilityWidgetProviderAssistiveLight extends AppWidgetProvider {
static final String TAG = "AccessibilityWidgetProviderAssistiveLight";
static final ComponentName THIS_APPWIDGET = new ComponentName("com.android.settings",
"com.android.settings.accessibilitywidget.AccessibilityWidgetProviderAssistiveLight");
private static final int BUTTON_CENTER = 1;
private static SettingsObserver sSettingsObserver;
private Notification mAssistiveNotification;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.secD(TAG, "onUpdate, appWidgetIds.length : " + appWidgetIds.length );
// Update each requested appWidgetId
RemoteViews view = buildUpdate(context);
for (int i = 0; i < appWidgetIds.length; i++) {
appWidgetManager.updateAppWidget(appWidgetIds[i], view);
}
}
@Override
public void onEnabled(Context context) {
checkObserver(context);
}
@Override
public void onDisabled(Context context) {
if (sSettingsObserver != null) {
sSettingsObserver.stopObserving();
sSettingsObserver = null;
}
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
if (getWidgetMode(context)) {
Settings.System.putInt(context.getContentResolver(), Settings.System.TORCH_LIGHT, 0);
try {
SecHardwareInterface.setTorchLight(0);
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(R.drawable.stat_notify_assistivelight);
} catch (Exception e) {
Log.secE(TAG, "could not turn off torch light", e);
}
}
}
/**
* Load image for given widget and build {@link RemoteViews} for it.
*/
static RemoteViews buildUpdate(Context context) {
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.accessibility_widget);
views.setOnClickPendingIntent(R.id.center_button,
getLaunchPendingIntent(context, BUTTON_CENTER));
updateButtons(views, context);
return views;
}
/**
* Updates the widget when something changes, or when a button is pushed.
*
* @param context
*/
public static void updateWidget(Context context) {
RemoteViews views = buildUpdate(context);
// Update specific list of appWidgetIds if given, otherwise default to
// all
final AppWidgetManager gm = AppWidgetManager.getInstance(context);
Log.secD(TAG, "updateWidget : " + THIS_APPWIDGET );
gm.updateAppWidget(THIS_APPWIDGET, views);
checkObserver(context);
}
/**
* Updates the buttons based on the underlying states of wifi, etc.
*
* @param views The RemoteViews to update.
* @param context
*/
private static void updateButtons(RemoteViews views, Context context) {
views.setViewVisibility(R.id.center_button, View.VISIBLE);
views.setTextViewText(R.id.center_text, context.getString(R.string.accessibility_widget_assistive_light));
if (getWidgetMode(context)) {
views.setImageViewResource(R.id.center_icon, R.drawable.accessibility_ic_light_press);
views.setImageViewResource(R.id.bottom_icon, R.drawable.accessibility_bar_press);
Log.secD(TAG, "updateButtons , icon_on");
}
else {
views.setImageViewResource(R.id.center_icon, R.drawable.accessibility_ic_light_nor);
views.setImageViewResource(R.id.bottom_icon, R.drawable.accessibility_bar_nor);
Log.secD(TAG, "updateButtons , icon_off");
}
/*if (!GlobalConfig.GLOBALCONFIG_SETTINGS_SUPPORT_FLASH ) {
views.setViewVisibility(R.id.main,View.GONE);
} */
}
/**
* Creates PendingIntent to notify the widget of a button click.
*
* @param context
* @param appWidgetId
* @return
*/
private static PendingIntent getLaunchPendingIntent(Context context,
int buttonId) {
Intent launchIntent = new Intent();
launchIntent.setClass(context, AccessibilityWidgetProviderAssistiveLight.class);
launchIntent.addCategory(Intent.CATEGORY_ALTERNATIVE);
launchIntent.setData(Uri.parse("custom:" + buttonId));
PendingIntent pi = PendingIntent.getBroadcast(context, 0 /*
* no
* requestCode
*/, launchIntent, 0 /*
* no
* flags
*/);
return pi;
}
/**
* Receives and processes a button pressed intent or state change.
*
* @param context
* @param intent Indicates the pressed button.
*/
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if (intent.hasCategory(Intent.CATEGORY_ALTERNATIVE)) {
Uri data = intent.getData();
int buttonId = Integer.parseInt(data.getSchemeSpecificPart());
if (buttonId == BUTTON_CENTER) {
Log.secD(TAG, "BUTTON_CENTER : ");
toggleWidgetMode(context);
}
}
else {
if (intent.getAction().equals(Intent.ACTION_LOCALE_CHANGED)) {
if (getWidgetMode(context)) {
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(R.drawable.stat_notify_assistivelight);
if(mAssistiveNotification == null) {
mAssistiveNotification = new Notification();
mAssistiveNotification.icon = R.drawable.stat_notify_assistivelight;
mAssistiveNotification.when = 0;
mAssistiveNotification.flags = Notification.FLAG_ONGOING_EVENT;
mAssistiveNotification.tickerText = context.getString(R.string.torch_light_notification_title);
}
Intent mIntent = new Intent("android.intent.action.ACTION_ASSISTIVE_OFF");
PendingIntent pi = PendingIntent.getBroadcast(context, 0, mIntent, 0);
mAssistiveNotification.setLatestEventInfo(context, context.getString(R.string.torch_light_notification_title),
context.getString(R.string.torch_light_notification_message), pi);
notificationManager.notify(mAssistiveNotification.icon, mAssistiveNotification);
}
}
// Don't fall-through to updating the widget. The Intent
// was something unrelated or that our super class took
// care of.
return;
}
// State changes fall through
updateWidget(context);
}
private void toggleWidgetMode(Context context) {
if (!getWidgetMode(context)) {
Settings.System.putInt(context.getContentResolver(), Settings.System.TORCH_LIGHT, 1);
try {
SecHardwareInterface.setTorchLight(1);
} catch (Exception e) {
Log.secE(TAG, "could not turn off torch light", e);
}
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if(mAssistiveNotification == null) {
mAssistiveNotification = new Notification();
mAssistiveNotification.icon = R.drawable.stat_notify_assistivelight;
mAssistiveNotification.when = 0;
mAssistiveNotification.flags = Notification.FLAG_ONGOING_EVENT;
mAssistiveNotification.tickerText = context.getString(R.string.torch_light_notification_title);
}
Intent mIntent = new Intent("android.intent.action.ACTION_ASSISTIVE_OFF");
PendingIntent pi = PendingIntent.getBroadcast(context, 0, mIntent, 0);
mAssistiveNotification.setLatestEventInfo(context, context.getString(R.string.torch_light_notification_title),
context.getString(R.string.torch_light_notification_message), pi);
notificationManager.notify(mAssistiveNotification.icon, mAssistiveNotification);
} else {
Settings.System.putInt(context.getContentResolver(), Settings.System.TORCH_LIGHT, 0);
try {
SecHardwareInterface.setTorchLight(0);
} catch (Exception e) {
Log.secE(TAG, "could not turn off torch light", e);
}
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(R.drawable.stat_notify_assistivelight);
}
Log.secD(TAG, "toggleWidgetMode : " + getWidgetMode(context));
}
private static boolean getWidgetMode(Context context) {
boolean result =(Settings.System.getInt(context.getContentResolver(),
Settings.System.TORCH_LIGHT, 0) != 0);
Log.secD(TAG, "getWidgetMode : " + result);
return result;
}
private static void checkObserver(Context context) {
if (sSettingsObserver == null) {
sSettingsObserver = new SettingsObserver(new Handler(),
context.getApplicationContext());
sSettingsObserver.startObserving();
}
}
/** Observer to watch for changes to the MONO_AUDIO_KEY_CHECKBOX_DB */
private static class SettingsObserver extends ContentObserver {
private Context mContext;
SettingsObserver(Handler handler, Context context) {
super(handler);
mContext = context;
}
void startObserving() {
ContentResolver resolver = mContext.getContentResolver();
resolver.registerContentObserver(Settings.System
.getUriFor(Settings.System.TORCH_LIGHT), false, this);
}
void stopObserving() {
mContext.getContentResolver().unregisterContentObserver(this);
}
@Override
public void onChange(boolean selfChange) {
updateWidget(mContext);
}
}
}