/*
* Copyright (C) 2012 The CyanogenMod 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.
*/
package com.cyanogenmod.filemanager.adapters;
import android.content.Context;
import android.content.res.Resources;
import com.cyanogenmod.filemanager.preferences.FileManagerSettings;
import com.cyanogenmod.filemanager.preferences.ObjectIdentifier;
import com.cyanogenmod.filemanager.preferences.ObjectStringIdentifier;
import com.cyanogenmod.filemanager.preferences.Preferences;
import com.cyanogenmod.filemanager.util.ResourcesHelper;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* An implementation of {@link CheckableListAdapter} for display settings.<br/>
* Only 2 type of settings are allowed:
* <ul>
* <li>{@link Enum}<{@link ObjectIdentifier}></li>
* <li>{@link Boolean}</li>
* </ul>
*
* @see CheckableListAdapter
* @see CheckableListAdapter.CheckableItem
*/
public class MenuSettingsAdapter extends CheckableListAdapter {
/**
* A class that holds the full data information.
*/
private static class DataHolder {
/**
* @hide
*/
public DataHolder() {
super();
}
int mId;
FileManagerSettings mSetting;
CheckableListAdapter.CheckableItem mItem;
}
private List<DataHolder> mData;
/**
* Constructor of <code>MenuSettingsAdapter</code>.
*
* @param context The current context
* @param setting The setting to add to the current list
*/
public MenuSettingsAdapter(Context context, FileManagerSettings setting) {
this(context, Arrays.asList(new FileManagerSettings[]{setting}));
addSetting(context, setting);
}
/**
* Constructor of <code>MenuSettingsAdapter</code>.
*
* @param context The current context
* @param settings An array of setting to add to the current list
*/
public MenuSettingsAdapter(Context context, List<FileManagerSettings> settings) {
super(context, new ArrayList<CheckableListAdapter.CheckableItem>());
//Process the data
this.mData = new ArrayList<MenuSettingsAdapter.DataHolder>();
int cc = settings.size();
for (int i = 0; i < cc; i++) {
addSetting(context, settings.get(i));
}
}
/**
* Method that dispose the elements of the adapter.
*/
@Override
public void dispose() {
this.mData = null;
super.dispose();
}
/**
* Method that returns the identifier of the setting.
*
* @param position The position of the item
* @return int The identifier of the setting
*/
@Override
public int getId(int position) {
return this.mData.get(position).mId;
}
/**
* Method that returns the setting.
*
* @param position The position of the item
* @return FileManagerSettings The setting
*/
public FileManagerSettings getSetting(int position) {
return this.mData.get(position).mSetting;
}
/**
* Method that adds a new setting to the collection of items.<br />
*
* @param context The current context
* @param setting The setting to add to the current list
*/
private void addSetting(Context context, FileManagerSettings setting) {
//Only 2 type of settings are allowed
final Resources res = context.getResources();
try {
// Enum<ObjectIdentifier>
if (setting.getDefaultValue() instanceof Enum<?>
&& setting.getDefaultValue() instanceof ObjectIdentifier) {
//Retrieve all the items of the enumeration
int resid =
ResourcesHelper.getIdentifier(res, "array", setting.getId()); //$NON-NLS-1$
String[] titles = res.getStringArray(resid);
Method method =
setting.getDefaultValue().getClass().getMethod("values"); //$NON-NLS-1$
ObjectIdentifier[] ids = (ObjectIdentifier[])method.invoke(null);
int defaultid = ((ObjectIdentifier)setting.getDefaultValue()).getId();
int selected =
Preferences.getSharedPreferences().getInt(setting.getId(), defaultid);
int cc = ids.length;
for (int i = 0; i < cc; i++) {
//Create the data holder
DataHolder dataHolder =
createDataHolder(
ids[i].getId(),
setting,
titles[i],
ids[i].getId() == selected);
this.mData.add(dataHolder);
//Add to the list
add(dataHolder.mItem);
}
return;
}
// Enum<ObjectStringIdentifier>
if (setting.getDefaultValue() instanceof Enum<?>
&& setting.getDefaultValue() instanceof ObjectStringIdentifier) {
//Retrieve all the items of the enumeration
int resid =
ResourcesHelper.getIdentifier(res, "array", setting.getId()); //$NON-NLS-1$
String[] titles = res.getStringArray(resid);
Method method =
setting.getDefaultValue().getClass().getMethod("values"); //$NON-NLS-1$
ObjectStringIdentifier[] ids = (ObjectStringIdentifier[])method.invoke(null);
String defaultid = ((ObjectStringIdentifier)setting.getDefaultValue()).getId();
String selected =
Preferences.getSharedPreferences().getString(setting.getId(), defaultid);
int cc = ids.length;
for (int i = 0; i < cc; i++) {
//Create the data holder
DataHolder dataHolder =
createDataHolder(
i,
setting,
titles[i],
ids[i].getId() == selected);
this.mData.add(dataHolder);
//Add to the list
add(dataHolder.mItem);
}
return;
}
// Boolean
if (setting.getDefaultValue() instanceof Boolean) {
int resid =
ResourcesHelper.getIdentifier(
res, "string", setting.getId()); //$NON-NLS-1$
String title = res.getString(resid);
boolean selected =
Preferences.getSharedPreferences().
getBoolean(
setting.getId(),
((Boolean)setting.getDefaultValue()).booleanValue());
//Create the data holder
DataHolder dataHolder = createDataHolder(-1, setting, title, selected);
this.mData.add(dataHolder);
//Add to the list
add(dataHolder.mItem);
return;
}
} catch (Exception e) {
/**NON BLOCK**/
}
//Not allowed
throw new IllegalArgumentException();
}
/**
* Method that creates a data holder.
*
* @param id The identifier of the setting
* @param title The title
* @param setting The setting
* @param selected If the setting is selected
* @return DataHolder The holder with the data
*/
@SuppressWarnings("static-method")
private DataHolder createDataHolder(
int id, FileManagerSettings setting, String title, boolean selected) {
DataHolder dataHolder = new DataHolder();
dataHolder.mId = id;
dataHolder.mSetting = setting;
dataHolder.mItem = new CheckableItem(title, true, selected);
return dataHolder;
}
}