/**
* Copyright (C) 2010-2012 Regis Montoya (aka r3gis - www.r3gis.fr)
* This file is part of CSipSimple.
*
* CSipSimple 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.
* If you own a pjsip commercial license you can also redistribute it
* and/or modify it under the terms of the GNU Lesser General Public License
* as an android library.
*
* CSipSimple 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 CSipSimple. If not, see <http://www.gnu.org/licenses/>.
*/
package com.csipsimple.widgets;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.view.View;
import android.widget.RemoteViews;
import com.csipsimple.R;
import com.csipsimple.api.SipManager;
import com.csipsimple.api.SipProfile;
import com.csipsimple.utils.AccountListUtils;
import com.csipsimple.utils.AccountListUtils.AccountStatusDisplay;
import com.csipsimple.utils.Log;
import com.csipsimple.wizards.WizardUtils;
public class AccountWidgetProvider extends AppWidgetProvider {
private static final String THIS_FILE = "Widget provider";
static ComponentName THIS_APPWIDGET = null;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// Update each requested appWidgetId
for (int widgetId : appWidgetIds) {
RemoteViews view = buildUpdate(context, widgetId);
appWidgetManager.updateAppWidget(widgetId, view);
}
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
for (int widgetId : appWidgetIds) {
AccountWidgetConfigure.deleteWidget(context, widgetId);
}
super.onDeleted(context, appWidgetIds);
}
/**
* Receives and processes a button pressed intent or state change.
*
* @param context
* @param intent Indicates the pressed button.
*/
@Override
public void onReceive(final Context context, Intent intent) {
String act = intent.getAction();
if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(act)) {
final int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
this.onDeleted(context, new int[] { appWidgetId });
}
} else if (SipManager.ACTION_SIP_REGISTRATION_CHANGED.equals(act) || SipManager.ACTION_SIP_ACCOUNT_CHANGED.equals(act)) {
//Thread t = new Thread() {
// public void run() {
updateWidget(context);
// };
//};
//t.start();
}
super.onReceive(context, intent);
}
/**
* Updates the widget when something changes, or when a button is pushed.
*
* @param context
*/
public static void updateWidget(Context context) {
final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
if(THIS_APPWIDGET == null) {
THIS_APPWIDGET = new ComponentName(context, AccountWidgetProvider.class);
}
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(THIS_APPWIDGET);
for (int widgetId : appWidgetIds) {
RemoteViews view = buildUpdate(context, widgetId);
appWidgetManager.updateAppWidget(widgetId, view);
}
}
static RemoteViews buildUpdate(Context context, int appWidgetId) {
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.widget);
long accId = AccountWidgetConfigure.getAccountForWidget(context, appWidgetId);
Log.d(THIS_FILE, "Updating wiget " + appWidgetId + " for account " + accId);
if(accId != SipProfile.INVALID_ID) {
ContentResolver cr = context.getContentResolver();
Cursor c = cr.query(ContentUris.withAppendedId(SipProfile.ACCOUNT_ID_URI_BASE, accId),
new String[] {
SipProfile.FIELD_WIZARD,
SipProfile.FIELD_ACTIVE,
SipProfile.FIELD_ID,
SipProfile.FIELD_DISPLAY_NAME
}, null, null, null);
if(c != null) {
try {
if(c.getCount() > 0) {
c.moveToFirst();
ContentValues acc = new ContentValues();
DatabaseUtils.cursorRowToContentValues(c, acc);
views.setImageViewResource(R.id.img_account, WizardUtils.getWizardIconRes(acc.getAsString(SipProfile.FIELD_WIZARD)));
boolean active = (acc.getAsInteger(SipProfile.FIELD_ACTIVE) == 1);
views.setImageViewResource(R.id.ind_account, active ? R.drawable.appwidget_settings_ind_on : R.drawable.appwidget_settings_ind_off);
views.setTextViewText(R.id.txt_account, acc.getAsString(SipProfile.FIELD_DISPLAY_NAME));
views.setOnClickPendingIntent(R.id.btn_account, getLaunchPendingIntent(context, accId, !active));
// In case of active account, we have to check status of the account
boolean showStatus = false;
if(active) {
AccountStatusDisplay accountStatusDisplay = AccountListUtils.getAccountDisplay(context, accId);
Integer drawable = null;
if(accountStatusDisplay.checkBoxIndicator == R.drawable.ic_indicator_red) {
drawable = R.drawable.appwidget_settings_ind_red;
showStatus = true;
}else if (accountStatusDisplay.checkBoxIndicator == R.drawable.ic_indicator_yellow) {
drawable = R.drawable.appwidget_settings_ind_yellow;
}
if(showStatus) {
views.setTextViewText(R.id.txt_status, accountStatusDisplay.statusLabel);
}
if(drawable != null) {
views.setImageViewResource(R.id.ind_account, drawable);
}
}
views.setViewVisibility(R.id.txt_status, showStatus ? View.VISIBLE : View.GONE);
}
}catch(Exception e) {
Log.e(THIS_FILE, "Something went wrong while retrieving the account", e);
} finally {
c.close();
}
}
}
return views;
}
/**
* Creates PendingIntent to notify the widget of a button click.
*
* @param context
* @param accId
* @return
*/
private static PendingIntent getLaunchPendingIntent(Context context, long accId, boolean activate ) {
Intent launchIntent = new Intent(SipManager.INTENT_SIP_ACCOUNT_ACTIVATE);
launchIntent.putExtra(SipProfile.FIELD_ID, accId);
launchIntent.putExtra(SipProfile.FIELD_ACTIVE, activate);
Log.d(THIS_FILE, "Create intent "+activate);
PendingIntent pi = PendingIntent.getBroadcast(context, (int)accId,
launchIntent, PendingIntent.FLAG_UPDATE_CURRENT);
return pi;
}
}