/**
* Copyright (C) 2013 - 2015 the enviroCar community
*
* This file is part of the enviroCar app.
*
* The enviroCar app 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.
*
* The enviroCar app 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 the enviroCar app. If not, see http://www.gnu.org/licenses/.
*/
package org.envirocar.app.view.preferences;
import android.app.AlertDialog;
import android.content.Context;
import android.preference.DialogPreference;
import android.support.v7.widget.Toolbar;
import android.util.AttributeSet;
import android.view.View;
import android.widget.NumberPicker;
import android.widget.TextView;
import org.envirocar.app.R;
import org.envirocar.core.logging.Logger;
import org.envirocar.core.injection.Injector;
import org.envirocar.app.handler.PreferenceConstants;
import butterknife.ButterKnife;
import butterknife.InjectView;
/**
* @author dewall
*/
public class BluetoothDiscoveryIntervalPreference extends DialogPreference {
private static final Logger LOGGER = Logger.getLogger(BluetoothDiscoveryIntervalPreference
.class);
private static final String[] DISPLAY_SECONDS = {"00", "10", "20", "30", "40", "50"};
/**
*
*/
private static final NumberPicker.Formatter FORMATTER_TWO_DIGITS = new NumberPicker.Formatter
() {
final StringBuilder mBuilder = new StringBuilder();
final java.util.Formatter mFormatter = new java.util.Formatter(mBuilder, java.util.Locale
.US);
final Object[] mArgs = new Object[1];
public String format(int value) {
mArgs[0] = value;
mBuilder.delete(0, mBuilder.length());
mFormatter.format("%02d", mArgs);
return mFormatter.toString();
}
};
@InjectView(R.id.default_header_toolbar)
protected Toolbar mToolbar;
@InjectView(R.id.bluetooth_discovery_interval_preference_numberpicker_text)
protected TextView mText;
@InjectView(R.id.bluetooth_discovery_interval_preference_numberpicker_min)
protected NumberPicker mMinutePicker;
@InjectView(R.id.bluetooth_discovery_interval_preference_numberpicker_sec)
protected NumberPicker mSecondsPicker;
// The seconds and minutes the timepicker have to show
private int mCurrentSeconds;
private int mCurrentMinutes;
/**
* Constructor.
*
* @param context the context of the current scope.
* @param attrs the attriute set
*/
public BluetoothDiscoveryIntervalPreference(Context context, AttributeSet attrs) {
super(context, attrs);
// Inject ourselves.
((Injector) context).injectObjects(this);
// Set the layout of the dialog to show.
setDialogLayoutResource(R.layout.bluetooth_discovery_interval_preference);
}
@Override
protected void onBindDialogView(View view) {
LOGGER.info("onBindDialogView()");
super.onBindDialogView(view);
// Inject all views
ButterKnife.inject(this, view);
// Toolbar settings.
mToolbar.setTitle(R.string.pref_bt_discovery_interval_title);
mToolbar.setNavigationIcon(R.drawable.ic_timer_white_24dp);
mToolbar.setTitleTextColor(getContext().getResources().getColor(R.color.white_cario));
// Set the textview text
mText.setText(R.string.pref_bt_discovery_interval_explanation);
onSetInitialValue(true, null);
// set the settings for the minute NumberPicker.
mMinutePicker.setMinValue(0);
mMinutePicker.setMaxValue(59);
mMinutePicker.setOnLongPressUpdateInterval(100);
mMinutePicker.setFormatter(FORMATTER_TWO_DIGITS);
mMinutePicker.setOnValueChangedListener((picker, oldVal, newVal) -> {
int minValue = mMinutePicker.getMinValue();
int maxValue = mMinutePicker.getMaxValue();
if (oldVal == maxValue && newVal == minValue) {
}
});
// set the settings for the seconds number picker.
mSecondsPicker.setMinValue(0);
mSecondsPicker.setMaxValue(5);
mSecondsPicker.setDisplayedValues(DISPLAY_SECONDS);
mSecondsPicker.setOnLongPressUpdateInterval(100);
mSecondsPicker.setFormatter(FORMATTER_TWO_DIGITS);
mSecondsPicker.setOnValueChangedListener((spinner, oldVal, newVal) -> {
int minValue = mSecondsPicker.getMinValue();
int maxValue = mSecondsPicker.getMaxValue();
if (oldVal == maxValue && newVal == minValue) {
int newMinute = mMinutePicker.getValue() + 1;
mMinutePicker.setValue(newMinute);
} else if (oldVal == minValue && newVal == maxValue) {
int newMinute = mMinutePicker.getValue() - 1;
mMinutePicker.setValue(newMinute);
}
});
mSecondsPicker.setValue(mCurrentSeconds);
mMinutePicker.setValue(mCurrentMinutes);
}
@Override
protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
LOGGER.info("onSetInitialValue");
super.onSetInitialValue(restorePersistedValue, defaultValue);
int time = -1;
// First either get the persisted value or the value stored in the shared preferences.
if (restorePersistedValue) {
time = getPersistedInt(-1);
}
if(time == -1){
time = getSharedPreferences().getInt(PreferenceConstants
.PREF_BLUETOOTH_DISCOVERY_INTERVAL, PreferenceConstants
.DEFAULT_BLUETOOTH_DISCOVERY_INTERVAL);
}
if (time != -1){
int seconds = time % 60;
int minutes = (time - seconds) / 60;
mCurrentMinutes = minutes;
mCurrentSeconds = seconds / 10;
}
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if (positiveResult) {
mCurrentMinutes = mMinutePicker.getValue();
mCurrentSeconds = mSecondsPicker.getValue();
int time = mMinutePicker.getValue() * 60 + mSecondsPicker.getValue() * 10;
persistInt(time);
getSharedPreferences().edit()
.putInt(PreferenceConstants.PREF_BLUETOOTH_DISCOVERY_INTERVAL, time)
.commit();
}
}
@Override
protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
super.onPrepareDialogBuilder(builder);
// Remove default preference title.
builder.setTitle(null);
}
}