/*
* Copyright (C) 2015 TeamEos project
*
* 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.
*
* Handle assignable action dialogs and instances of the ActionPreference
* class that holds target widget state
*/
package com.android.settings.du;
import java.util.ArrayList;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.internal.utils.du.ActionConstants.Defaults;
import com.android.internal.utils.du.ActionHandler;
import com.android.internal.utils.du.Config;
import com.android.internal.utils.du.Config.ActionConfig;
import com.android.internal.utils.du.Config.ButtonConfig;
import com.android.settings.du.utils.ShortcutPickHelper;
import com.android.settings.du.preference.ActionPreference;
import com.android.settings.du.utils.CustomActionListAdapter;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
public class ActionFragment extends SettingsPreferenceFragment implements
ShortcutPickHelper.OnPickListener {
private static final int DIALOG_CATEGORY = 69;
private static final int DIALOG_CUSTOM_ACTIONS = 70;
private static final String KEY_FOCUSED_PREFERENCE = "key_focused_preference";
private ShortcutPickHelper mPicker;
protected ArrayList<ActionPreference> mPrefHolder;
private String mHolderTag;
private Defaults mDefaults;
private ArrayList<ButtonConfig> mButtons;
private ArrayList<ButtonConfig> mDefaultButtons;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
if (icicle != null) {
String holderTag = icicle.getString(KEY_FOCUSED_PREFERENCE);
if (holderTag != null) {
mHolderTag = holderTag;
}
}
mPicker = new ShortcutPickHelper(getActivity(), this);
mPrefHolder = new ArrayList<ActionPreference>();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
mPicker.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void shortcutPicked(String uri, String friendlyName, boolean isApplication) {
// activity dialogs pass null here if they are dismissed
// if null, do nothing, no harm
if (uri == null) {
return;
}
findAndUpdatePreference(new ActionConfig(getActivity(), uri), mHolderTag);
}
@Override
public boolean onPreferenceTreeClick(Preference preference) {
if (preference instanceof ActionPreference) {
mHolderTag = ((ActionPreference)preference).getTag();
showDialog(DIALOG_CATEGORY);
return true;
}
return super.onPreferenceTreeClick(preference);
}
@Override
public void onStart() {
super.onStart();
if (mDefaults != null) {
loadAndSetConfigs();
onActionPolicyEnforced(mPrefHolder);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mHolderTag != null) {
outState.putString(KEY_FOCUSED_PREFERENCE, mHolderTag);
}
}
@Override
public Dialog onCreateDialog(int dialogId) {
Dialog dialog = null;
switch (dialogId) {
case DIALOG_CATEGORY:
final DialogInterface.OnClickListener categoryClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
onTargetChange(getResources().getStringArray(R.array.action_dialog_values)[item]);
dialog.dismiss();
}
};
dialog = new AlertDialog.Builder(getActivity())
.setTitle(R.string.choose_action_title)
.setItems(getResources().getStringArray(R.array.action_dialog_entries),
categoryClickListener)
.setNegativeButton(getString(android.R.string.cancel), null)
.create();
break;
case DIALOG_CUSTOM_ACTIONS:
final CustomActionListAdapter adapter = new CustomActionListAdapter(getActivity());
if (!usesExtendedActionsList()) {
adapter.removeAction(ActionHandler.SYSTEMUI_TASK_HOME);
adapter.removeAction(ActionHandler.SYSTEMUI_TASK_BACK);
}
final DialogInterface.OnClickListener customActionClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
findAndUpdatePreference(adapter.getItem(item), mHolderTag);
dialog.dismiss();
}
};
dialog = new AlertDialog.Builder(getActivity())
.setTitle(getString(R.string.action_entry_custom_action))
.setAdapter(adapter, customActionClickListener)
.setNegativeButton(getString(android.R.string.cancel), null)
.create();
break;
}
return dialog;
}
// subclass overrides to include back and home actions
protected boolean usesExtendedActionsList() {
return false;
}
protected void onActionPolicyEnforced(ArrayList<ActionPreference> prefs) {
}
protected void setActionPreferencesEnabled(boolean enabled) {
for (ActionPreference pref : mPrefHolder) {
pref.setEnabled(enabled);
}
}
/**
* load our button lists and ActionPreferences map button action targets from preference keys
* and defaults config maps subclass is required to set desired Defaults interface int
* ActionContants
*/
protected void onPreferenceScreenLoaded(Defaults defaults) {
mDefaults = defaults;
final PreferenceScreen prefScreen = getPreferenceScreen();
for (int i = 0; i < prefScreen.getPreferenceCount(); i++) {
Preference pref = prefScreen.getPreference(i);
if (pref instanceof PreferenceCategory) {
PreferenceCategory cat = (PreferenceCategory) pref;
for (int j = 0; j < cat.getPreferenceCount(); j++) {
Preference child = cat.getPreference(j);
if (child instanceof ActionPreference) {
mPrefHolder.add((ActionPreference) child);
}
}
} else if (pref instanceof ActionPreference) {
mPrefHolder.add((ActionPreference) pref);
}
}
loadAndSetConfigs();
}
private void loadAndSetConfigs() {
mButtons = Config.getConfig(getActivity(), mDefaults);
mDefaultButtons = Config.getDefaultConfig(getActivity(), mDefaults);
for (ActionPreference pref : mPrefHolder) {
pref.setDefaults(mDefaults);
ButtonConfig button = mButtons.get(pref.getConfigMap().button);
ActionConfig action = button.getActionConfig(pref.getConfigMap().action);
pref.setActionConfig(action);
ButtonConfig defButton = mDefaultButtons.get(pref.getConfigMap().button);
ActionConfig defAction = defButton.getActionConfig(pref.getConfigMap().action);
pref.setDefaultActionConfig(defAction);
}
}
private void onTargetChange(String uri) {
if (uri == null) {
return;
} else if (uri.equals(getString(R.string.action_value_default_action))) {
findAndUpdatePreference(null, mHolderTag);
} else if (uri.equals(getString(R.string.action_value_select_app))) {
mPicker.pickShortcut(null, null, getId());
} else if (uri.equals(getString(R.string.action_value_custom_action))) {
showDialog(DIALOG_CUSTOM_ACTIONS);
}
}
protected void findAndUpdatePreference(ActionConfig action, String tag) {
for (ActionPreference pref : mPrefHolder) {
if (pref.getTag().equals(mHolderTag)) {
if (action == null) {
action = pref.getDefaultActionConfig();
}
pref.setActionConfig(action);
ButtonConfig button = mButtons.get(pref.getConfigMap().button);
ActionConfig newAction = pref.getActionConfig();
button.setActionConfig(newAction, pref.getConfigMap().action);
mButtons = Config.replaceButtonAtPosition(mButtons, button, pref.getConfigMap());
Config.setConfig(getActivity(), mDefaults, mButtons);
onActionPolicyEnforced(mPrefHolder);
break;
}
}
}
@Override
protected int getMetricsCategory() {
return MetricsEvent.APPLICATION;
}
}