/*******************************************************************************
* Copyright 2013-2016 alladin-IT GmbH
*
* 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 at.alladin.rmbt.android.preferences;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import android.app.ActionBar;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceActivity;
import android.view.MenuItem;
import android.widget.ListView;
import at.alladin.openrmbt.android.R;
import at.alladin.rmbt.android.main.AppConstants;
import at.alladin.rmbt.android.terms.RMBTCheckFragment.CheckType;
import at.alladin.rmbt.android.terms.RMBTTermsActivity;
import at.alladin.rmbt.android.util.ConfigHelper;
import at.alladin.rmbt.android.util.Server;
public class RMBTPreferenceActivity extends PreferenceActivity
{
protected static final int REQUEST_NDT_CHECK = 1;
protected static final int REQUEST_LOOP_MODE_CHECK = 2;
protected Method mLoadHeaders = null;
protected Method mHasHeaders = null;
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
/**
* Checks to see if using new v11+ way of handling PrefsFragments.
*
* @return Returns false pre-v11, else checks to see if using headers.
*/
public boolean isNewV11Prefs()
{
if (mHasHeaders != null && mLoadHeaders != null)
try
{
return (Boolean) mHasHeaders.invoke(this);
}
catch (final IllegalArgumentException e)
{
}
catch (final IllegalAccessException e)
{
}
catch (final InvocationTargetException e)
{
}
return false;
}
@Override
public void onCreate(final Bundle savedInstanceState)
{
// onBuildHeaders() will be called during super.onCreate()
try
{
mLoadHeaders = getClass().getMethod("loadHeadersFromResource", int.class, List.class);
mHasHeaders = getClass().getMethod("hasHeaders");
}
catch (final NoSuchMethodException e)
{
}
super.onCreate(savedInstanceState);
if (!isNewV11Prefs())
{
if (ConfigHelper.isUserLoopModeActivated(this) && !ConfigHelper.isDevEnabled(this)) {
addPreferencesFromResource(R.xml.preferences_loop);
}
addPreferencesFromResource(R.xml.preferences);
if (ConfigHelper.isDevEnabled(this)) {
addPreferencesFromResource(R.xml.preferences_dev);
}
}
ActionBar actionBar = getActionBar();
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE);
actionBar.setDisplayHomeAsUpEnabled(true);
final ListView v = getListView();
v.setCacheColorHint(0);
//final float scale = getResources().getDisplayMetrics().density;
//final int padding = Helperfunctions.dpToPx(10, scale);
//final ViewGroup vg = (ViewGroup) v.getRootView();
//vg.setPadding(padding, padding, padding, padding);
//final int paddingTopBottom = Helperfunctions.dpToPx(3, scale);
//final int paddingLeftRight = Helperfunctions.dpToPx(10, scale);
//v.setBackgroundResource(R.drawable.box_large);
v.setBackgroundResource(R.drawable.app_bgdn_radiant);
//v.setPadding(paddingLeftRight, paddingTopBottom, paddingLeftRight, paddingTopBottom);
final Preference loopModeMaxDelayPreference = findPreference("loop_mode_max_delay");
if (loopModeMaxDelayPreference != null && !ConfigHelper.isDevEnabled(this)) {
loopModeMaxDelayPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
return checkInputValidity(RMBTPreferenceActivity.this, newValue,
AppConstants.LOOP_MODE_MIN_DELAY, AppConstants.LOOP_MODE_MAX_DELAY, R.string.loop_mode_max_delay_invalid);
}
});
}
final Preference loopModeMaxMovementPreference = findPreference("loop_mode_max_movement");
if (loopModeMaxMovementPreference != null && !ConfigHelper.isDevEnabled(this)) {
loopModeMaxMovementPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
return checkInputValidity(RMBTPreferenceActivity.this, newValue,
AppConstants.LOOP_MODE_MIN_MOVEMENT, AppConstants.LOOP_MODE_MAX_MOVEMENT, R.string.loop_mode_max_movement_invalid);
}
});
}
final Preference loopModePref = (Preference) findPreference("loop_mode");
if (loopModePref != null)
{
loopModePref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference)
{
if (preference instanceof CheckBoxPreference)
{
final CheckBoxPreference cbp = (CheckBoxPreference) preference;
if (cbp.isChecked())
{
cbp.setChecked(false);
final Intent intent = new Intent(getBaseContext(), RMBTTermsActivity.class);
intent.putExtra(RMBTTermsActivity.EXTRA_KEY_CHECK_TYPE, CheckType.LOOP_MODE.name());
intent.putExtra(RMBTTermsActivity.EXTRA_KEY_CHECK_TERMS_AND_COND, false);
startActivityForResult(intent, REQUEST_LOOP_MODE_CHECK);
}
}
return true;
}
});
}
final Preference ndtPref = (Preference) findPreference("ndt");
if (ndtPref != null)
{
ndtPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference)
{
if (preference instanceof CheckBoxPreference)
{
final CheckBoxPreference cbp = (CheckBoxPreference) preference;
if (cbp.isChecked())
{
cbp.setChecked(false);
final Intent intent = new Intent(getBaseContext(), RMBTTermsActivity.class);
intent.putExtra(RMBTTermsActivity.EXTRA_KEY_CHECK_TYPE, CheckType.NDT.name());
startActivityForResult(intent, REQUEST_NDT_CHECK);
}
}
return true;
}
});
}
final Preference gpsPref = (Preference) findPreference("location_settings");
if (gpsPref != null)
{
gpsPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference)
{
startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
return true;
}
});
}
// v.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_INSET);
// addPreferencesFromResource(R.xml.preferences);
final Preference serverSelectionPrefCat = findPreference("server_selection_preferences");
if (serverSelectionPrefCat != null)
{
if (! ConfigHelper.isUserServerSelectionActivated(this) || ConfigHelper.getServers(this) == null)
getPreferenceScreen().removePreference(serverSelectionPrefCat);
else
{
final ListPreference serverSelectionPref = (ListPreference) findPreference("server_selection");
if (serverSelectionPref != null)
{
boolean foundCurrentSelection = false;
String currentSelection = ConfigHelper.getServerSelection(this);
if (currentSelection == null)
{
ConfigHelper.setServerSelection(this, ConfigHelper.DEFAULT_SERVER);
currentSelection = ConfigHelper.DEFAULT_SERVER;
}
if (currentSelection.equals(ConfigHelper.DEFAULT_SERVER))
foundCurrentSelection = true;
final Set<String> servers = ConfigHelper.getServers(this);
if (servers != null)
{
final List<String> entries = new ArrayList<String>();
final List<String> entryValues = new ArrayList<String>();
entries.add("Default");
entryValues.add(ConfigHelper.DEFAULT_SERVER);
for (String serverStr : servers)
{
final Server server = Server.decode(serverStr);
entries.add(server.getName());
final String serverUuid = server.getUuid();
if (currentSelection.equals(serverUuid))
foundCurrentSelection = true;
entryValues.add(serverUuid);
}
serverSelectionPref.setEntries(entries.toArray(new String[]{}));
serverSelectionPref.setEntryValues(entryValues.toArray(new String[]{}));
if (! foundCurrentSelection)
{
ConfigHelper.setServerSelection(this, ConfigHelper.DEFAULT_SERVER);
recreate();
}
// final String serverSelection = ConfigHelper.getServerSelection(this);
// serverSelectionPref.setSummary(serverSelection != null ? serverSelection : "");
}
}
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_NDT_CHECK) {
((CheckBoxPreference) findPreference("ndt")).setChecked(ConfigHelper.isNDT(this));
}
else if (requestCode == REQUEST_LOOP_MODE_CHECK) {
((CheckBoxPreference) findPreference("loop_mode")).setChecked(ConfigHelper.isLoopMode(this));
}
}
public static boolean checkInputValidity(final Context context, final Object v, final long minValue, final long maxValue, final int errorMsgId) {
boolean showErrorDialog = false;
try {
final long value = Long.valueOf(String.valueOf(v));
if (value > maxValue || value < minValue) {
showErrorDialog = true;
}
}
catch (Exception e) {
showErrorDialog = true;
}
if (showErrorDialog) {
final String msg = context.getString(errorMsgId);
final AlertDialog dialog = new AlertDialog.Builder(context)
.setTitle(R.string.value_invalid)
.setMessage(MessageFormat.format(msg, minValue, maxValue))
.setPositiveButton(android.R.string.ok, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.create();
dialog.show();
}
return !showErrorDialog;
}
/*
* @Override public void onBuildHeaders(List<Header> aTarget) { try {
* mLoadHeaders.invoke(this,new Object[]{R.xml.pref_headers,aTarget}); }
* catch (IllegalArgumentException e) { } catch (IllegalAccessException e) {
* } catch (InvocationTargetException e) { } }
*
* @TargetApi(11) static public class PrefsFragment extends
* PreferenceFragment {
*
* @Override public void onCreate(Bundle aSavedState) {
* super.onCreate(aSavedState); Context anAct =
* getActivity().getApplicationContext(); int thePrefRes =
* anAct.getResources
* ().getIdentifier(getArguments().getString("pref-resource"),
* "xml",anAct.getPackageName()); addPreferencesFromResource(thePrefRes);
* //addPreferencesFromResource(R.xml.preferences);
* Log.i("test","Preferences Loaded"); } }
*/
}