package com.bwx.bequick.fwk; import static com.bwx.bequick.fwk.Setting.*; import static com.bwx.bequick.Constants.*; import android.content.Context; import android.os.Build; import android.provider.Settings; import android.telephony.TelephonyManager; import com.bwx.bequick.R; import com.bwx.bequick.handlers.AirplaneModeSettingHandler; import com.bwx.bequick.handlers.BluetoothSettingHandler; import com.bwx.bequick.handlers.BrightnessSettingHandler; import com.bwx.bequick.handlers.BrightnessSettingHandlerX10; import com.bwx.bequick.handlers.GpsSettingHandler; import com.bwx.bequick.handlers.MasterVolumeSettingHandler; import com.bwx.bequick.handlers.MobileDataSettingHandler2; import com.bwx.bequick.handlers.RingerSettingHandler; import com.bwx.bequick.handlers.ScreenTimeoutSettingHandler; import com.bwx.bequick.handlers.SystemPropertySettingHandler; import com.bwx.bequick.handlers.UnlockPatternSettingHandler; import com.bwx.bequick.handlers.UnlockPatternSettingHandler22; import com.bwx.bequick.handlers.VolumeControlSettingHandler; import com.bwx.bequick.handlers.WiFiSettingHandler; import com.bwx.bequick.handlers.WifiHotspotSettingHandler; import com.bwx.bequick.handlers.apn.MobileDataSettingHandler; import com.bwx.bequick.handlers.autosync.AutoSyncSettingHandler; import com.bwx.bequick.handlers.wimax.FourGEvoSettingHandler; import com.bwx.bequick.preferences.AirplaneModePrefs; import com.bwx.bequick.preferences.BrightnessPrefs; import com.bwx.bequick.preferences.GpsPrefs; import com.bwx.bequick.preferences.MobileDataApnPrefs; import com.bwx.bequick.preferences.MobileDataPrefs; public class SettingsFactory { /** * Factory method * @param id setting ID * @param index setting index (within a sorted list) * @param defaultText setting's default description * @param context instance of Context (never null) * @return an instance of configured setting */ public static Setting createSetting(int id, int index, String defaultText, Context context) { Setting setting; switch (id) { case WIFI: setting = new Setting(WIFI, R.drawable.ic_wifi, R.string.wifi_title, defaultText); break; case GPS: setting = new Setting(GPS, R.drawable.ic_gps, R.string.gps_title, defaultText); setting.prefs = GpsPrefs.class; break; case RINGER: setting = new Setting(RINGER, R.drawable.ic_sound, R.string.txt_ringer, defaultText); setting.hasPopup = true; break; case BRIGHTNESS: { RangeSetting set = new RangeSetting(BRIGHTNESS, R.drawable.ic_brightness, R.string.txt_brightness, 0, 100); set.minIconId = R.drawable.ic_brightness_min; set.maxIconId = R.drawable.ic_brightness_max; set.prefs = BrightnessPrefs.class; setting = set; break; } case AIRPLANE_MODE: setting = new Setting(AIRPLANE_MODE, R.drawable.ic_airplane, R.string.airmode_title, defaultText); setting.prefs = AirplaneModePrefs.class; break; case MOBILE_DATA_APN: if (isCDMA(context)) { return null; // not supported } else { setting = new Setting(MOBILE_DATA_APN, R.drawable.ic_apn, R.string.txt_apn_control, defaultText); setting.prefs = MobileDataApnPrefs.class; } break; case BLUETOOTH: setting = new Setting(BLUETOOTH, R.drawable.ic_bt, R.string.txt_bt, defaultText); break; case SCREEN_TIMEOUT: setting = new Setting(SCREEN_TIMEOUT, R.drawable.ic_screentimeout, R.string.txt_screen_timeout, defaultText); break; case VOLUME: setting = new Setting(VOLUME, R.drawable.ic_volume_control, R.string.txt_volume, context.getString(R.string.txt_volume_descr)); break; case AUTO_SYNC: setting = new Setting(AUTO_SYNC, R.drawable.ic_autosync, R.string.txt_auto_sync, defaultText); break; case AUTO_ROTATE: setting = new Setting(AUTO_ROTATE, R.drawable.ic_rotate, R.string.txt_auto_rotate, defaultText); break; case LOCK_PATTERN: setting = new Setting(LOCK_PATTERN, R.drawable.ic_lock, R.string.txt_unlock_pattern, defaultText); break; case MASTER_VOLUME: { RangeSetting set = new RangeSetting(MASTER_VOLUME, R.drawable.ic_volume, R.string.txt_master_volume, 0, 15); set.minIconId = R.drawable.ic_volume_min; set.maxIconId = R.drawable.ic_volume_max; setting = set; break; } case WIFI_HOTSPOT: if (SDK_VERSION >= 8) { setting = new Setting(WIFI_HOTSPOT, R.drawable.ic_wifi_hs, R.string.txt_wifi_hotspot, defaultText); } else { return null; // not supported on this device } break; case MOBILE_DATA: setting = new Setting(MOBILE_DATA, R.drawable.ic_3g, R.string.txt_mobile_data, defaultText); setting.prefs = MobileDataPrefs.class; break; case GROUP_VISIBLE: setting = new Setting(id, R.string.txt_visible_settings); break; case GROUP_HIDDEN: setting = new Setting(id, R.string.txt_hidden_settings); break; case FOUR_G: if (SDK_VERSION >= 8 && (Build.MODEL.equals("PC36100") /*EVO*/ || Build.MODEL.equals("PG06100") /*EVO Shift*/ || Build.MODEL.equals("PG86100") /*EVO 3D*/ )) { setting = new Setting(FOUR_G, R.drawable.ic_4g, R.string.txt_four_g, defaultText); } else { return null; // not supported } break; default: throw new IllegalStateException("unsupported setting type: " + id); } setting.index = index; return setting; } /** * Factory method * @param setting a setting for which a handler will be created * @return a setting handler */ public static SettingHandler createSettingHandler(Setting setting) { switch (setting.id) { // create handlers case WIFI: return new WiFiSettingHandler(setting); case GPS: return new GpsSettingHandler(setting); case RINGER: return new RingerSettingHandler(setting); case BRIGHTNESS: { if (SDK_VERSION == BrightnessSettingHandlerX10.SDK_VERSION && Build.DEVICE.equals(BrightnessSettingHandlerX10.DEVICE)) { return new BrightnessSettingHandlerX10(setting); } else { return new BrightnessSettingHandler(setting); } } case AIRPLANE_MODE: return new AirplaneModeSettingHandler(setting); case MOBILE_DATA_APN: return new MobileDataSettingHandler(setting); case BLUETOOTH: return new BluetoothSettingHandler(setting); case SCREEN_TIMEOUT: return new ScreenTimeoutSettingHandler(setting); case VOLUME: return new VolumeControlSettingHandler(setting); case AUTO_SYNC: return new AutoSyncSettingHandler(setting); case AUTO_ROTATE: return new SystemPropertySettingHandler(setting, Settings.System.ACCELEROMETER_ROTATION, Settings.ACTION_DISPLAY_SETTINGS); case LOCK_PATTERN: return SDK_VERSION >= 8 ? new UnlockPatternSettingHandler22(setting) : new UnlockPatternSettingHandler(setting); case MASTER_VOLUME: return new MasterVolumeSettingHandler(setting); case WIFI_HOTSPOT: return new WifiHotspotSettingHandler(setting); case MOBILE_DATA: return new MobileDataSettingHandler2(setting); case FOUR_G : return new FourGEvoSettingHandler(setting); // null-handlers case Setting.GROUP_VISIBLE: case Setting.GROUP_HIDDEN: default: return null; } } private static final boolean isCDMA(Context context) { TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return telephony != null && telephony.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA; } }