/*
* Copyright 2011 yingxinwu.g@gmail.com
*
* 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 xink.vpn;
import static xink.vpn.Constants.*;
import xink.vpn.wrapper.VpnState;
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.util.Log;
import android.view.View;
import android.widget.RemoteViews;
/**
* Install / update app widgets, according to active vpn conn status.
*
* @author ywu
*
*/
public class VpnAppWidgetProvider extends AppWidgetProvider {
private static final String TAG = "xink.AppWidget";
private static final ComponentName THIS_APPWIDGET = new ComponentName("xink.vpn", "xink.vpn.VpnAppWidgetProvider");
private Context context;
@Override
public void onEnabled(final Context context) {
super.onEnabled(context);
Log.d(TAG, "VpnAppWidgetProvider enabled");
this.context = context;
updateViews(getActiveVpnState(context));
}
@Override
public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, final int[] appWidgetIds) {
Log.d(TAG, "VpnAppWidgetProvider onUpdate");
this.context = context;
updateViews(getActiveVpnState(context));
}
private VpnState getActiveVpnState(final Context context) {
return VpnProfileRepository.getInstance(context).getActiveVpnState();
}
@Override
public void onDisabled(final Context context) {
Log.d(TAG, "VpnAppWidgetProvider onDisabled");
this.context = context;
super.onDisabled(context);
}
/*
* (non-Javadoc)
*
* @see android.appwidget.AppWidgetProvider#onReceive(android.content.Context, android.content.Intent)
*/
@Override
public void onReceive(final Context context, final Intent intent) {
this.context = context;
// Log.d(TAG, "received " + intent);
if (ACTION_VPN_CONNECTIVITY.equals(intent.getAction())) {
onStateChanged(intent);
return;
}
super.onReceive(context, intent);
}
private void onStateChanged(final Intent intent) {
String profileName = intent.getStringExtra(BROADCAST_PROFILE_NAME);
VpnState newState = Utils.extractVpnState(intent);
if (!profileName.equals(Utils.getActvieProfileName(context)))
// Log.d(TAG, "updateViews, ignores non-active profile event for " + profileName);
return;
Log.d(TAG, "update state of the active vpn");
VpnProfileRepository.getInstance(context).setActiveVpnState(newState);
updateViews(newState);
}
private void updateViews(final VpnState state) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.vpn_widget);
views.setViewVisibility(R.id.propStateTransition, getConnProgVisibility(state));
views.setTextColor(R.id.txtState, getStateTextColor(state));
views.setInt(R.id.txtState, "setBackgroundResource", getIndicator(state));
installIntent(views, state);
final AppWidgetManager gm = AppWidgetManager.getInstance(context);
gm.updateAppWidget(THIS_APPWIDGET, views);
}
private int getConnProgVisibility(final VpnState state) {
return (state != null && state.isTransitive()) ? View.VISIBLE : View.GONE;
}
private int getStateTextColor(final VpnState state) {
int color = state == VpnState.CONNECTED ? R.color.vpn_widget_text_color_on : R.color.vpn_widget_text_color_off;
return context.getResources().getColor(color);
}
private int getIndicator(final VpnState state) {
return state == VpnState.CONNECTED ? R.drawable.vpn_on : R.drawable.vpn_off;
}
private void installIntent(final RemoteViews views, final VpnState state) {
Intent intent = new Intent(context, ToggleVpn.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.frmToggleVpnStatue, pendingIntent);
}
}