package com.blackice.control.fragments; import java.util.ArrayList; import android.app.AlertDialog; import android.app.FragmentTransaction; import android.app.ListFragment; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnMultiChoiceClickListener; import android.content.pm.PackageManager; import android.content.res.Resources; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceFragment; import android.preference.PreferenceScreen; import android.provider.Settings; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import com.blackice.control.R; import com.blackice.control.widgets.TouchInterceptor; import com.scheffsblend.smw.Preferences.ImageListPreference; public class StatusBarToggles extends PreferenceFragment implements OnPreferenceChangeListener { private static final String TAG = "TogglesLayout"; private static final String PREF_ENABLE_TOGGLES = "enable_toggles"; private static final String PREF_BRIGHTNESS_LOC = "brightness_location"; private static final String PREF_TOGGLES_STYLE = "toggle_style"; private static final String PREF_ALT_BUTTON_LAYOUT = "toggles_layout_preference"; Preference mEnabledToggles; Preference mLayout; ListPreference mBrightnessLocation; ImageListPreference mTogglesLayout; ListPreference mToggleStyle; Preference mResetToggles; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.prefs_statusbar_toggles); mEnabledToggles = findPreference(PREF_ENABLE_TOGGLES); mBrightnessLocation = (ListPreference) findPreference(PREF_BRIGHTNESS_LOC); mBrightnessLocation.setOnPreferenceChangeListener(this); mBrightnessLocation.setValue(Integer.toString(Settings.System.getInt(getActivity() .getContentResolver(), Settings.System.STATUSBAR_TOGGLES_BRIGHTNESS_LOC, 1))); mToggleStyle = (ListPreference) findPreference(PREF_TOGGLES_STYLE); mToggleStyle.setOnPreferenceChangeListener(this); mToggleStyle.setValue(Integer.toString(Settings.System.getInt(getActivity() .getContentResolver(), Settings.System.STATUSBAR_TOGGLES_STYLE, 3))); mTogglesLayout = (ImageListPreference) findPreference(PREF_ALT_BUTTON_LAYOUT); mTogglesLayout.setOnPreferenceChangeListener(this); mLayout = findPreference("toggles"); mResetToggles = findPreference("reset_toggles"); } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if (preference == mEnabledToggles) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); ArrayList<String> enabledToggles = getTogglesStringArray(getActivity()); final String[] finalArray = getResources().getStringArray( R.array.available_toggles_entries); final String[] values = getResources().getStringArray(R.array.available_toggles_values); boolean checkedToggles[] = new boolean[finalArray.length]; for (int i = 0; i < checkedToggles.length; i++) { if (enabledToggles.contains(finalArray[i])) { checkedToggles[i] = true; } } builder.setTitle(R.string.toggles_display_dialog); builder.setCancelable(true); builder.setPositiveButton(R.string.toggles_display_close, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.setMultiChoiceItems(values, checkedToggles, new OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { String toggleKey = (finalArray[which]); if (isChecked) addToggle(getActivity(), toggleKey); else removeToggle(getActivity(), toggleKey); } }); AlertDialog d = builder.create(); d.show(); return true; } else if (preference == mLayout) { FragmentTransaction ft = getFragmentManager().beginTransaction(); TogglesLayout fragment = new TogglesLayout(); ft.addToBackStack("toggles_layout"); ft.replace(this.getId(), fragment); ft.commit(); } else if (preference == mResetToggles) { Settings.System.putString(getActivity().getContentResolver(), Settings.System.STATUSBAR_TOGGLES, "WIFI"); return true; } return super.onPreferenceTreeClick(preferenceScreen, preference); } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { boolean result = false; if (preference == mBrightnessLocation) { int val = Integer.parseInt((String) newValue); result = Settings.System.putInt(getActivity().getContentResolver(), Settings.System.STATUSBAR_TOGGLES_BRIGHTNESS_LOC, val); } else if (preference == mToggleStyle) { int val = Integer.parseInt((String) newValue); result = Settings.System.putInt(getActivity().getContentResolver(), Settings.System.STATUSBAR_TOGGLES_STYLE, val); } else if (preference == mTogglesLayout) { int val = Integer.parseInt((String) newValue); Settings.System.putInt(getActivity().getContentResolver(), Settings.System.STATUSBAR_TOGGLES_STYLE, val == 0 ? 3 : 2); result = Settings.System.putInt(getActivity().getContentResolver(), Settings.System.STATUSBAR_TOGGLES_USE_BUTTONS, val); } return result; } public static void addToggle(Context context, String key) { ArrayList<String> enabledToggles = getTogglesStringArray(context); enabledToggles.add(key); setTogglesFromStringArray(context, enabledToggles); } public static void removeToggle(Context context, String key) { ArrayList<String> enabledToggles = getTogglesStringArray(context); enabledToggles.remove(key); setTogglesFromStringArray(context, enabledToggles); } public static class TogglesLayout extends ListFragment { private ListView mButtonList; private ButtonAdapter mButtonAdapter; private Context mContext; /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); mContext = getActivity().getBaseContext(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View v = inflater.inflate(R.layout.order_power_widget_buttons_activity, container, false); return v; } public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mButtonList = this.getListView(); ((TouchInterceptor) mButtonList).setDropListener(mDropListener); mButtonAdapter = new ButtonAdapter(mContext); setListAdapter(mButtonAdapter); }; @Override public void onDestroy() { ((TouchInterceptor) mButtonList).setDropListener(null); setListAdapter(null); super.onDestroy(); } @Override public void onResume() { super.onResume(); // reload our buttons and invalidate the views for redraw mButtonAdapter.reloadButtons(); mButtonList.invalidateViews(); } private TouchInterceptor.DropListener mDropListener = new TouchInterceptor.DropListener() { public void drop(int from, int to) { // get the current button list ArrayList<String> toggles = getTogglesStringArray(mContext); // move the button if (from < toggles.size()) { String toggle = toggles.remove(from); if (to <= toggles.size()) { toggles.add(to, toggle); // save our buttons setTogglesFromStringArray(mContext, toggles); // tell our adapter/listview to reload mButtonAdapter.reloadButtons(); mButtonList.invalidateViews(); } } } }; private class ButtonAdapter extends BaseAdapter { private Context mContext; private Resources mSystemUIResources = null; private LayoutInflater mInflater; private ArrayList<Toggle> mToggles; public ButtonAdapter(Context c) { mContext = c; mInflater = LayoutInflater.from(mContext); PackageManager pm = mContext.getPackageManager(); if (pm != null) { try { mSystemUIResources = pm.getResourcesForApplication("com.android.systemui"); } catch (Exception e) { mSystemUIResources = null; Log.e(TAG, "Could not load SystemUI resources", e); } } reloadButtons(); } public void reloadButtons() { ArrayList<String> toggles = getTogglesStringArray(mContext); mToggles = new ArrayList<Toggle>(); for (String toggle : toggles) { mToggles.add(new Toggle(toggle, 0)); } } public int getCount() { return mToggles.size(); } public Object getItem(int position) { return mToggles.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { final View v; if (convertView == null) { v = mInflater.inflate(R.layout.order_power_widget_button_list_item, null); } else { v = convertView; } Toggle toggle = mToggles.get(position); final TextView name = (TextView) v.findViewById(R.id.name); name.setText(toggle.getId()); return v; } } } public static class Toggle { private String mId; private int mTitleResId; public Toggle(String id, int titleResId) { mId = id; mTitleResId = titleResId; } public String getId() { return mId; } public int getTitleResId() { return mTitleResId; } } public static void setTogglesFromStringArray(Context c, ArrayList<String> newGoodies) { String newToggles = ""; for (String s : newGoodies) newToggles += s + "|"; // remote last | try { newToggles = newToggles.substring(0, newToggles.length() - 1); } catch (StringIndexOutOfBoundsException e) { } Settings.System.putString(c.getContentResolver(), Settings.System.STATUSBAR_TOGGLES, newToggles); } public static ArrayList<String> getTogglesStringArray(Context c) { String clusterfuck = Settings.System.getString(c.getContentResolver(), Settings.System.STATUSBAR_TOGGLES); if (clusterfuck == null) { Log.e(TAG, "clusterfuck was null"); // return null; clusterfuck = "WIFI|BT|GPS|ROTATE"; } String[] togglesStringArray = clusterfuck.split("\\|"); ArrayList<String> iloveyou = new ArrayList<String>(); for (String s : togglesStringArray) { Log.e(TAG, "adding: " + s); iloveyou.add(s); } return iloveyou; } }