/**
* Copyright (C) 2010-2012 Regis Montoya (aka r3gis - www.r3gis.fr)
* This file is part of CSipSimple.
*
* CSipSimple is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* If you own a pjsip commercial license you can also redistribute it
* and/or modify it under the terms of the GNU Lesser General Public License
* as an android library.
*
* CSipSimple is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with CSipSimple. If not, see <http://www.gnu.org/licenses/>.
*/
package com.csipsimple.ui.prefs.hc;
import android.annotation.TargetApi;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
import android.text.TextUtils;
import com.csipsimple.R;
import com.csipsimple.ui.prefs.IPreferenceHelper;
import com.csipsimple.ui.prefs.PrefsLogic;
import com.csipsimple.utils.Log;
@TargetApi(11)
public class PrefsLoaderFragment extends PreferenceFragment implements IPreferenceHelper {
public PrefsLoaderFragment() {
}
private int getPreferenceType() {
return getArguments().getInt(PrefsLogic.EXTRA_PREFERENCE_TYPE);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int type = getPreferenceType();
addPreferencesFromResource(PrefsLogic.getXmlResourceForType(type));
PrefsLogic.afterBuildPrefsForType(getActivity(), this, getPreferenceType());
}
@Override
public void hidePreference(String parent, String fieldName) {
PreferenceScreen pfs = getPreferenceScreen();
PreferenceGroup parentPref = pfs;
if (parent != null) {
parentPref = (PreferenceGroup) pfs.findPreference(parent);
}
Preference toRemovePref = pfs.findPreference(fieldName);
if (toRemovePref != null && parentPref != null) {
boolean rem = parentPref.removePreference(toRemovePref);
Log.d("Generic prefs", "Has removed it : " + rem);
} else {
Log.d("Generic prefs", "Not able to find" + parent + " " + fieldName);
}
}
// Utilities for update Descriptions
/**
* Get field summary if nothing set. By default it will try to add _summary
* to name of the current field
*
* @param field_name Name of the current field
* @return Translated summary for this field
*/
protected String getDefaultFieldSummary(String field_name) {
try {
String keyid = R.string.class.getField(field_name + "_summary").get(null).toString();
return getString(Integer.parseInt(keyid));
} catch (SecurityException e) {
// Nothing to do : desc is null
} catch (NoSuchFieldException e) {
// Nothing to do : desc is null
} catch (IllegalArgumentException e) {
// Nothing to do : desc is null
} catch (IllegalAccessException e) {
// Nothing to do : desc is null
}
return "";
}
@Override
public void setStringFieldSummary(String fieldName) {
PreferenceScreen pfs = getPreferenceScreen();
SharedPreferences sp = pfs.getSharedPreferences();
Preference pref = pfs.findPreference(fieldName);
String val = sp.getString(fieldName, null);
if (TextUtils.isEmpty(val)) {
val = getDefaultFieldSummary(fieldName);
}
setPreferenceSummary(pref, val);
}
/**
* Safe setSummary on a Preference object that make sure that the preference
* exists before doing anything
*
* @param pref the preference to change summary of
* @param val the string to set as preference summary
*/
protected void setPreferenceSummary(Preference pref, CharSequence val) {
if (pref != null) {
pref.setSummary(val);
}
}
@Override
public void setPreferenceScreenType(String key, int type) {
setPreferenceScreenType(getClass(), key, type);
}
@Override
public void setPreferenceScreenSub(String key, Class<?> activityClass, Class<?> fragmentClass, int type) {
setPreferenceScreenType(fragmentClass, key, type);
}
private void setPreferenceScreenType(Class<?> classObj, String key, int type) {
Preference pf = findPreference(key);
pf.setFragment(classObj.getCanonicalName());
Bundle b = pf.getExtras();
b.putInt(PrefsLogic.EXTRA_PREFERENCE_TYPE, type);
}
}