package com.android.settings.widget.buttons;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.provider.Settings.SettingNotFoundException;
import android.widget.Toast;
import com.android.internal.telephony.Phone;
import com.android.settings.R;
import com.android.settings.widget.SettingsAppWidgetProvider;
import com.android.settings.widget.WidgetSettings;
public class NetworkModeButton extends WidgetButton{
public static final String NETWORK_MODE_CHANGED = "com.android.internal.telephony.NETWORK_MODE_CHANGED";
public static final String REQUEST_NETWORK_MODE = "com.android.internal.telephony.REQUEST_NETWORK_MODE";
public static final String MODIFY_NETWORK_MODE = "com.android.internal.telephony.MODIFY_NETWORK_MODE";
public static final String NETWORK_MODE = "networkMode";
private static final int NO_NETWORK_MODE_YET = -99;
private static final int NETWORK_MODE_UNKNOWN = -100;
private static final int MODE_3G2G = 0;
private static final int MODE_3GONLY = 1;
private static final int MODE_BOTH = 2;
private static final int DEFAULT_SETTTING = 0;
static NetworkModeButton ownButton=null;
private static int networkMode = NO_NETWORK_MODE_YET;
private static int intendedNetworkMode = NO_NETWORK_MODE_YET;
private static int currentInternalState = SettingsAppWidgetProvider.STATE_INTERMEDIATE;
private int currentMode;
private int networkModeToState(Context context) {
if (currentInternalState== SettingsAppWidgetProvider.STATE_TURNING_ON ||
currentInternalState== SettingsAppWidgetProvider.STATE_TURNING_OFF)
return SettingsAppWidgetProvider.STATE_INTERMEDIATE;
switch(networkMode) {
case Phone.NT_MODE_WCDMA_PREF:
case Phone.NT_MODE_WCDMA_ONLY:
case Phone.NT_MODE_GSM_UMTS:
return SettingsAppWidgetProvider.STATE_ENABLED;
case Phone.NT_MODE_GSM_ONLY:
return SettingsAppWidgetProvider.STATE_DISABLED;
}
return SettingsAppWidgetProvider.STATE_INTERMEDIATE;
}
/**
* Gets the state of 2G3g // NOT working
*
* @param context
* @return true if enabled.
*/
private int get2G3G(Context context) {
int state = 99;
try {
state = android.provider.Settings.Secure.getInt(context
.getContentResolver(),
android.provider.Settings.Secure.PREFERRED_NETWORK_MODE);
} catch (SettingNotFoundException e) {
SettingsAppWidgetProvider.logD("Settings not found");
}
return state;
}
public static NetworkModeButton getInstance() {
if (ownButton==null)
ownButton = new NetworkModeButton();
return ownButton;
}
@Override
void initButton() {
buttonID=WidgetButton.BUTTON_2G3G;
preferenceName=WidgetSettings.TOGGLE_2G3G;
}
@Override
public void toggleState(Context context) {
toggleState(context, false);
}
public void toggleState(Context context, int newState) {
if (currentState!=SettingsAppWidgetProvider.STATE_INTERMEDIATE && currentState!=newState) {
toggleState(context,true);
} else if (currentState==SettingsAppWidgetProvider.STATE_INTERMEDIATE){
Toast toast = Toast.makeText(context, "Network mode state unknown. Please change it manually!",Toast.LENGTH_SHORT);
toast.show();
}
}
public void toggleState(Context context, boolean switchModes) {
SettingsAppWidgetProvider.logD("NetworkMode: toggleState");
Intent intent = new Intent(MODIFY_NETWORK_MODE);
switch (networkMode ) {
case Phone.NT_MODE_WCDMA_PREF:
case Phone.NT_MODE_GSM_UMTS:
intent.putExtra(NETWORK_MODE, Phone.NT_MODE_GSM_ONLY);
currentInternalState=SettingsAppWidgetProvider.STATE_TURNING_OFF;
intendedNetworkMode=Phone.NT_MODE_GSM_ONLY;
break;
case Phone.NT_MODE_WCDMA_ONLY:
if (currentMode == MODE_3GONLY || switchModes) {
intent.putExtra(NETWORK_MODE, Phone.NT_MODE_GSM_ONLY);
currentInternalState=SettingsAppWidgetProvider.STATE_TURNING_OFF;
intendedNetworkMode=Phone.NT_MODE_GSM_ONLY;
} else {
intent.putExtra(NETWORK_MODE, Phone.NT_MODE_WCDMA_PREF);
currentInternalState=SettingsAppWidgetProvider.STATE_TURNING_ON;
intendedNetworkMode=Phone.NT_MODE_WCDMA_PREF;
}
break;
case Phone.NT_MODE_GSM_ONLY:
if (currentMode == MODE_3GONLY || currentMode == MODE_BOTH ) {
intent.putExtra(NETWORK_MODE, Phone.NT_MODE_WCDMA_ONLY);
currentInternalState=SettingsAppWidgetProvider.STATE_TURNING_ON;
intendedNetworkMode=Phone.NT_MODE_WCDMA_ONLY;
} else {
intent.putExtra(NETWORK_MODE, Phone.NT_MODE_WCDMA_PREF);
currentInternalState=SettingsAppWidgetProvider.STATE_TURNING_ON;
intendedNetworkMode=Phone.NT_MODE_WCDMA_PREF;
}
break;
}
networkMode = NETWORK_MODE_UNKNOWN;
context.sendBroadcast(intent);
}
@Override
public void updateState(Context context,
SharedPreferences globalPreferences, int[] appWidgetIds) {
currentMode=globalPreferences.getInt(WidgetSettings.NETWORK_MODE_SPINNER, DEFAULT_SETTTING);
networkMode=get2G3G(context);
currentState=networkModeToState(context);
switch (currentState) {
case SettingsAppWidgetProvider.STATE_DISABLED:
currentIcon=R.drawable.ic_appwidget_settings_2g3g_off;
break;
case SettingsAppWidgetProvider.STATE_ENABLED:
if (networkMode==Phone.NT_MODE_WCDMA_ONLY) {
currentIcon=R.drawable.ic_appwidget_settings_3g_on;
} else {
currentIcon=R.drawable.ic_appwidget_settings_2g3g_on;
}
break;
case SettingsAppWidgetProvider.STATE_INTERMEDIATE:
// In the transitional state, the bottom green bar
// shows the tri-state (on, off, transitioning), but
// the top dark-gray-or-bright-white logo shows the
// user's intent. This is much easier to see in
// sunlight.
if (currentInternalState==SettingsAppWidgetProvider.STATE_TURNING_ON) {
if (intendedNetworkMode==Phone.NT_MODE_WCDMA_ONLY) {
currentIcon=R.drawable.ic_appwidget_settings_3g_on;
} else {
currentIcon=R.drawable.ic_appwidget_settings_2g3g_on;
}
} else {
currentIcon=R.drawable.ic_appwidget_settings_2g3g_off;
}
break;
}
}
public void onReceive(Context context, Intent intent) {
if (intent.getExtras()!=null) {
networkMode = intent.getExtras().getInt(NETWORK_MODE);
//Update to actual state
intendedNetworkMode=networkMode;
}
//need to clear intermediate states
currentInternalState=SettingsAppWidgetProvider.STATE_ENABLED;
int widgetState=networkModeToState(context);
currentInternalState=widgetState;
if (widgetState==SettingsAppWidgetProvider.STATE_ENABLED) {
MobileDataButton.getInstance().networkModeChanged(context, networkMode);
}
}
public boolean isDisabled(Context context) {
return networkModeToState(context)==SettingsAppWidgetProvider.STATE_DISABLED;
}
}