michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: package org.mozilla.gecko.preferences; michael@0: michael@0: import org.mozilla.gecko.Telemetry; michael@0: import org.mozilla.gecko.TelemetryContract; michael@0: import org.mozilla.gecko.home.HomeConfig; michael@0: import org.mozilla.gecko.home.HomeConfig.PanelConfig; michael@0: import org.mozilla.gecko.home.HomeConfig.State; michael@0: import org.mozilla.gecko.util.ThreadUtils; michael@0: import org.mozilla.gecko.util.UiAsyncTask; michael@0: michael@0: import android.content.Context; michael@0: import android.text.TextUtils; michael@0: import android.util.AttributeSet; michael@0: michael@0: public class PanelsPreferenceCategory extends CustomListCategory { michael@0: public static final String LOGTAG = "PanelsPrefCategory"; michael@0: michael@0: protected HomeConfig mHomeConfig; michael@0: protected HomeConfig.Editor mConfigEditor; michael@0: michael@0: protected UiAsyncTask mLoadTask; michael@0: michael@0: public PanelsPreferenceCategory(Context context) { michael@0: super(context); michael@0: initConfig(context); michael@0: } michael@0: michael@0: public PanelsPreferenceCategory(Context context, AttributeSet attrs) { michael@0: super(context, attrs); michael@0: initConfig(context); michael@0: } michael@0: michael@0: public PanelsPreferenceCategory(Context context, AttributeSet attrs, int defStyle) { michael@0: super(context, attrs, defStyle); michael@0: initConfig(context); michael@0: } michael@0: michael@0: protected void initConfig(Context context) { michael@0: mHomeConfig = HomeConfig.getDefault(context); michael@0: } michael@0: michael@0: @Override michael@0: public void onAttachedToActivity() { michael@0: super.onAttachedToActivity(); michael@0: michael@0: loadHomeConfig(null); michael@0: } michael@0: michael@0: /** michael@0: * Load the Home Panels config and populate the preferences screen and maintain local state. michael@0: */ michael@0: private void loadHomeConfig(final String animatePanelId) { michael@0: mLoadTask = new UiAsyncTask(ThreadUtils.getBackgroundHandler()) { michael@0: @Override michael@0: public HomeConfig.State doInBackground(Void... params) { michael@0: return mHomeConfig.load(); michael@0: } michael@0: michael@0: @Override michael@0: public void onPostExecute(HomeConfig.State configState) { michael@0: mConfigEditor = configState.edit(); michael@0: displayHomeConfig(configState, animatePanelId); michael@0: } michael@0: }; michael@0: mLoadTask.execute(); michael@0: } michael@0: michael@0: /** michael@0: * Simplified refresh of Home Panels when there is no state to be persisted. michael@0: */ michael@0: public void refresh() { michael@0: refresh(null, null); michael@0: } michael@0: michael@0: /** michael@0: * Refresh the Home Panels list and animate a panel, if specified. michael@0: * If null, load from HomeConfig. michael@0: * michael@0: * @param State HomeConfig.State to rebuild Home Panels list from. michael@0: * @param String panelId of panel to be animated. michael@0: */ michael@0: public void refresh(State state, String animatePanelId) { michael@0: // Clear all the existing home panels. michael@0: removeAll(); michael@0: michael@0: if (state == null) { michael@0: loadHomeConfig(animatePanelId); michael@0: } else { michael@0: displayHomeConfig(state, animatePanelId); michael@0: } michael@0: } michael@0: michael@0: private void displayHomeConfig(HomeConfig.State configState, String animatePanelId) { michael@0: int index = 0; michael@0: for (PanelConfig panelConfig : configState) { michael@0: final boolean isRemovable = panelConfig.isDynamic(); michael@0: michael@0: // Create and add the pref. michael@0: final String panelId = panelConfig.getId(); michael@0: final boolean animate = TextUtils.equals(animatePanelId, panelId); michael@0: michael@0: final PanelsPreference pref = new PanelsPreference(getContext(), PanelsPreferenceCategory.this, isRemovable, index, animate); michael@0: pref.setTitle(panelConfig.getTitle()); michael@0: pref.setKey(panelConfig.getId()); michael@0: // XXX: Pull icon from PanelInfo. michael@0: addPreference(pref); michael@0: michael@0: if (panelConfig.isDisabled()) { michael@0: pref.setHidden(true); michael@0: } michael@0: michael@0: index++; michael@0: } michael@0: michael@0: setPositionState(); michael@0: setDefaultFromConfig(); michael@0: } michael@0: michael@0: private void setPositionState() { michael@0: final int prefCount = getPreferenceCount(); michael@0: michael@0: // Pass in position state to first and last preference. michael@0: final PanelsPreference firstPref = (PanelsPreference) getPreference(0); michael@0: firstPref.setIsFirst(); michael@0: michael@0: final PanelsPreference lastPref = (PanelsPreference) getPreference(prefCount - 1); michael@0: lastPref.setIsLast(); michael@0: } michael@0: michael@0: private void setDefaultFromConfig() { michael@0: final String defaultPanelId = mConfigEditor.getDefaultPanelId(); michael@0: if (defaultPanelId == null) { michael@0: mDefaultReference = null; michael@0: return; michael@0: } michael@0: michael@0: final int prefCount = getPreferenceCount(); michael@0: michael@0: for (int i = 0; i < prefCount; i++) { michael@0: final PanelsPreference pref = (PanelsPreference) getPreference(i); michael@0: michael@0: if (defaultPanelId.equals(pref.getKey())) { michael@0: super.setDefault(pref); michael@0: break; michael@0: } michael@0: } michael@0: } michael@0: michael@0: @Override michael@0: public void setDefault(CustomListPreference pref) { michael@0: super.setDefault(pref); michael@0: michael@0: final String id = pref.getKey(); michael@0: michael@0: final String defaultPanelId = mConfigEditor.getDefaultPanelId(); michael@0: if (defaultPanelId != null && defaultPanelId.equals(id)) { michael@0: return; michael@0: } michael@0: michael@0: mConfigEditor.setDefault(id); michael@0: mConfigEditor.apply(); michael@0: michael@0: Telemetry.sendUIEvent(TelemetryContract.Event.PANEL_SET_DEFAULT, null, id); michael@0: } michael@0: michael@0: @Override michael@0: protected void onPrepareForRemoval() { michael@0: if (mLoadTask != null) { michael@0: mLoadTask.cancel(true); michael@0: } michael@0: } michael@0: michael@0: @Override michael@0: public void uninstall(CustomListPreference pref) { michael@0: mConfigEditor.uninstall(pref.getKey()); michael@0: mConfigEditor.apply(); michael@0: michael@0: super.uninstall(pref); michael@0: } michael@0: michael@0: public void moveUp(PanelsPreference pref) { michael@0: final int panelIndex = pref.getIndex(); michael@0: if (panelIndex > 0) { michael@0: final String panelKey = pref.getKey(); michael@0: mConfigEditor.moveTo(panelKey, panelIndex - 1); michael@0: final State state = mConfigEditor.apply(); michael@0: refresh(state, panelKey); michael@0: } michael@0: } michael@0: michael@0: public void moveDown(PanelsPreference pref) { michael@0: final int panelIndex = pref.getIndex(); michael@0: if (panelIndex < getPreferenceCount() - 1) { michael@0: final String panelKey = pref.getKey(); michael@0: mConfigEditor.moveTo(panelKey, panelIndex + 1); michael@0: final State state = mConfigEditor.apply(); michael@0: refresh(state, panelKey); michael@0: } michael@0: } michael@0: michael@0: /** michael@0: * Update the hide/show state of the preference and save the HomeConfig michael@0: * changes. michael@0: * michael@0: * @param pref Preference to update michael@0: * @param toHide New hidden state of the preference michael@0: */ michael@0: protected void setHidden(PanelsPreference pref, boolean toHide) { michael@0: mConfigEditor.setDisabled(pref.getKey(), toHide); michael@0: mConfigEditor.apply(); michael@0: michael@0: pref.setHidden(toHide); michael@0: setDefaultFromConfig(); michael@0: } michael@0: michael@0: /** michael@0: * When the default panel is removed or disabled, find an enabled panel michael@0: * if possible and set it as mDefaultReference. michael@0: */ michael@0: @Override michael@0: protected void setFallbackDefault() { michael@0: setDefaultFromConfig(); michael@0: } michael@0: }