/* * Copyright (C) 2013 FMSoft (http://www.fmsoft.cn) * * 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 org.espier.ios7.ui; import java.util.ArrayList; import java.util.List; import org.espier.ios7.ui.CommonSettingInfo; import org.espier.ios7.ui.SettingInfo; import org.espier.ios7.ui.SettingInfoListGetter; import org.espier.ios7.ui.cb.SimpleActivitySettingCb; import org.espier.ios7.ui.cb.StatusActivitySettingCb; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.util.Log; import android.util.SparseArray; public class SettingsController { protected static final String TAG = "SettingsController"; private Context mContext; private Resources mRes; private boolean mUseLanguagePackage = false; private SparseArray<ArrayList<SettingInfo>> mSettingMap = new SparseArray<ArrayList<SettingInfo>>(); private SparseArray<String[]> mGroupInfoMap = new SparseArray<String[]>(); private static final String[] mNullGroupInfo = new String[]{null, null}; private static SettingsController mInstance; private String mLocale; private int mStart, mEnd; public static SettingsController getInstance(Context context, int s, int e) { final Configuration configuration = context.getResources().getConfiguration(); final String locale = configuration.locale.toString(); Log.v(TAG, "getInstance locale ============== " + locale); if (mInstance == null) { mInstance = new SettingsController(context, s, e); mInstance.mLocale = locale; mInstance.mStart = s; mInstance.mEnd = e; } else { if(!mInstance.mLocale.equals(locale)) { mInstance.mLocale = locale; mInstance.init(context, mInstance.mStart, mInstance.mEnd); } } return mInstance; } public static void reload() { if (mInstance != null) { mInstance.releaseResource(); } // let next time getInstance() reload resource. mInstance = null; } public static SettingInfo findInfoById(List<SettingInfo> infoList, String id) { if (null == infoList || null == id) { return null; } for (SettingInfo info : infoList) { if (null == info) { continue; } if (id.equalsIgnoreCase(info.getId())) { return info; } } return null; } public void releaseResource() { if (null != mGroupInfoMap) { mGroupInfoMap.clear(); mGroupInfoMap = null; } if (null != mSettingMap) { mSettingMap.clear(); mSettingMap = null; } } private SettingsController(Context context, int s, int e) { init(context, s, e); } public List<SettingInfo> getSettingInfoList(int resId) { return mSettingMap.get(resId); } public String getGroupTitle(int resId) { return mGroupInfoMap.get(resId, mNullGroupInfo)[0]; } public String getGroupDesc(int resId) { return mGroupInfoMap.get(resId, mNullGroupInfo)[1]; } private void init(Context context, int settings_begin, int settings_end) { mContext = context.getApplicationContext(); mRes = mContext.getResources(); mSettingMap.clear(); mGroupInfoMap.clear(); for (int i = settings_begin; i < settings_end; ++i) { loadSettings(i); } } public void unloadSettings(int resId){ mSettingMap.remove(resId); } private String getLocalizedArrayString(TypedArray typedArray, int index) { int temp = typedArray.getResourceId(index, -1); if (temp != -1) { return mRes.getString(temp); } return typedArray.getString(index); } public void loadSettings(int resId) { TypedArray setting = mRes.obtainTypedArray(resId); ArrayList<SettingInfo> settingList = new ArrayList<SettingInfo>(); mSettingMap.put(resId, settingList); for (int i = 0; i < setting.length();) { //id, type, activityOrCbClass, description, icon, title String id = setting.getString(i++); int type = setting.getInt(i++, 0); String activityOrCbClass = setting.getString(i++); String statusCbClass; String title; if (!mUseLanguagePackage) { statusCbClass = setting.getString(i++); title = setting.getString(i+1); } else { statusCbClass = getLocalizedArrayString(setting, i); i++; title = getLocalizedArrayString(setting, i + 1); } Drawable icon = null; try { icon = setting.getDrawable(i++); } catch (Exception e) { } //skip title i++; String decs = statusCbClass; CommonSettingInfo.SettingCallback settingCb = null; StatusActivitySettingCb.StatusGetter statusCb = null; Intent intent = null; try { switch (type) { case SettingInfo.TYPE_SWITCH: case SettingInfo.TYPE_CHOICE: case SettingInfo.TYPE_WIFI_CHOICE: case SettingInfo.TYPE_VOLUME_SETTING: case SettingInfo.TYPE_BRIGHTNESS_SETTING: case SettingInfo.TYPE_LABEL: case SettingInfo.TYPE_ENTER: case SettingInfo.TYPE_IMAGE_CHIOCE: case SettingInfo.TYPE_CHOICE_WITH_FOOT: settingCb = (CommonSettingInfo.SettingCallback) Class.forName(activityOrCbClass) .newInstance(); break; case SettingInfo.TYPE_SIMPLE_ACTIVITY: intent = new Intent(mContext, Class.forName(activityOrCbClass)); settingCb = new SimpleActivitySettingCb(intent); break; case SettingInfo.TYPE_STATUS_ACTIVITY: intent = new Intent(mContext, Class.forName(activityOrCbClass)); statusCb = (StatusActivitySettingCb.StatusGetter) Class.forName(statusCbClass) .newInstance(); settingCb = new StatusActivitySettingCb(intent, statusCb); break; case SettingInfo.INNER_TYPE_GROUP_INFO: String[] groupInfo = new String[] { activityOrCbClass, decs, }; mGroupInfoMap.put(resId, groupInfo); break; case SettingInfo.INNER_TYPE_DYNAMIC: SettingInfoListGetter getter = (SettingInfoListGetter) Class.forName( activityOrCbClass).newInstance(); getter.get(mContext, settingList); break; default: break; } } catch (ClassNotFoundException e) { // ignore this exception. //e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } if (type < SettingInfo.INNER_TYPE_BEGIN) settingList.add(new CommonSettingInfo(id, type, icon, title, decs, settingCb)); } setting.recycle(); } }