/*
* Copyright (C) 2009-2013 Geometer Plus <contact@geometerplus.com>
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
package org.geometerplus.android.fbreader.preferences;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
import org.geometerplus.android.fbreader.libraryService.BookCollectionShadow;
import org.geometerplus.fbreader.bookmodel.FBTextKind;
import org.geometerplus.fbreader.fbreader.ActionCode;
import org.geometerplus.fbreader.fbreader.ColorProfile;
import org.geometerplus.fbreader.fbreader.FBReaderApp;
import org.geometerplus.fbreader.fbreader.FBView;
import org.geometerplus.fbreader.fbreader.options.CancelMenuOptions;
import org.geometerplus.fbreader.fbreader.options.FooterOptions;
import org.geometerplus.fbreader.fbreader.options.PageTurningOptions;
import org.geometerplus.zlibrary.core.application.ZLKeyBindings;
import org.geometerplus.zlibrary.core.options.ZLIntegerOption;
import org.geometerplus.zlibrary.core.options.ZLIntegerRangeOption;
import org.geometerplus.zlibrary.text.view.style.ZLTextBaseStyle;
import org.geometerplus.zlibrary.text.view.style.ZLTextFullStyleDecoration;
import org.geometerplus.zlibrary.text.view.style.ZLTextStyleCollection;
import org.geometerplus.zlibrary.text.view.style.ZLTextStyleDecoration;
import org.geometerplus.zlibrary.ui.android.library.ZLAndroidLibrary;
import org.geometerplus.zlibrary.ui.android.view.ZLAndroidPaintContext;
import android.content.Intent;
import android.view.KeyEvent;
import com.yamin.reader.activity.CoreReadActivity;
public class PreferenceActivity extends ZLPreferenceActivity {
private BookCollectionShadow myCollection = new BookCollectionShadow();
public PreferenceActivity() {
super("Preferences");
}
@Override
protected void onStart() {
super.onStart();
myCollection.bindToService(this, null);
}
@Override
protected void onStop() {
myCollection.unbind();
super.onStop();
}
@Override
protected void init(Intent intent) {
setResult(CoreReadActivity.RESULT_REPAINT);
final FBReaderApp fbReader = (FBReaderApp)FBReaderApp.Instance();
final ZLAndroidLibrary androidLibrary = (ZLAndroidLibrary)ZLAndroidLibrary.Instance();
final ColorProfile profile = fbReader.getColorProfile();
// TODO: use user-defined locale, not the default one,
// or set user-defined locale as default
final String decimalSeparator =
String.valueOf(new DecimalFormatSymbols(Locale.getDefault()).getDecimalSeparator());
/*
final Screen directoriesScreen = createPreferenceScreen("directories");
directoriesScreen.addPreference(new ZLStringOptionPreference(
this, Paths.BooksDirectoryOption(), directoriesScreen.Resource, "books"
) {
protected void setValue(String value) {
super.setValue(value);
myCollection.reset(false);
}
});
directoriesScreen.addOption(Paths.FontsDirectoryOption(), "fonts");
directoriesScreen.addOption(Paths.WallpapersDirectoryOption(), "wallpapers");
final Screen appearanceScreen = createPreferenceScreen("appearance");
/*
appearanceScreen.addPreference(new LanguagePreference(
this, appearanceScreen.Resource, "language", ZLResource.languages()
) {
@Override
protected void init() {
setInitialValue(ZLResource.getLanguageOption().getValue());
}
@Override
protected void setLanguage(String code) {
final ZLStringOption languageOption = ZLResource.getLanguageOption();
if (!code.equals(languageOption.getValue())) {
languageOption.setValue(code);
finish();
startActivity(new Intent(
Intent.ACTION_VIEW, Uri.parse("fbreader-action:preferences#appearance")
));
}
}
});
*/
/*
appearanceScreen.addPreference(new ZLStringChoicePreference(
this, appearanceScreen.Resource, "screenOrientation",
androidLibrary.getOrientationOption(), androidLibrary.allOrientations()
));
appearanceScreen.addPreference(new ZLBooleanPreference(
this,
fbReader.TwoColumnViewOption,
appearanceScreen.Resource,
"twoColumnView"
));
appearanceScreen.addPreference(new ZLBooleanPreference(
this,
fbReader.AllowScreenBrightnessAdjustmentOption,
appearanceScreen.Resource,
"allowScreenBrightnessAdjustment"
) {
private final int myLevel = androidLibrary.ScreenBrightnessLevelOption.getValue();
@Override
protected void onClick() {
super.onClick();
androidLibrary.ScreenBrightnessLevelOption.setValue(isChecked() ? myLevel : 0);
}
});
appearanceScreen.addPreference(new BatteryLevelToTurnScreenOffPreference(
this,
androidLibrary.BatteryLevelToTurnScreenOffOption,
appearanceScreen.Resource,
"dontTurnScreenOff"
));
/*
appearanceScreen.addPreference(new ZLBooleanPreference(
this,
androidLibrary.DontTurnScreenOffDuringChargingOption,
appearanceScreen.Resource,
"dontTurnScreenOffDuringCharging"
));
appearanceScreen.addOption(androidLibrary.ShowStatusBarOption, "showStatusBar");
appearanceScreen.addOption(androidLibrary.DisableButtonLightsOption, "disableButtonLights");
*/
final Screen textScreen = createPreferenceScreen("text");
final Screen fontPropertiesScreen = textScreen.createPreferenceScreen("fontProperties");
fontPropertiesScreen.addOption(ZLAndroidPaintContext.AntiAliasOption, "antiAlias");
fontPropertiesScreen.addOption(ZLAndroidPaintContext.DeviceKerningOption, "deviceKerning");
fontPropertiesScreen.addOption(ZLAndroidPaintContext.DitheringOption, "dithering");
fontPropertiesScreen.addOption(ZLAndroidPaintContext.SubpixelOption, "subpixel");
final ZLTextStyleCollection collection = ZLTextStyleCollection.Instance();
final ZLTextBaseStyle baseStyle = collection.getBaseStyle();
textScreen.addPreference(new FontOption(
this, textScreen.Resource, "font",
baseStyle.FontFamilyOption, false
));
textScreen.addPreference(new ZLIntegerRangePreference(
this, textScreen.Resource.getResource("fontSize"),
baseStyle.FontSizeOption
));
textScreen.addPreference(new FontStylePreference(
this, textScreen.Resource, "fontStyle",
baseStyle.BoldOption, baseStyle.ItalicOption
));
final ZLIntegerRangeOption spaceOption = baseStyle.LineSpaceOption;
final String[] spacings = new String[spaceOption.MaxValue - spaceOption.MinValue + 1];
for (int i = 0; i < spacings.length; ++i) {
final int val = spaceOption.MinValue + i;
spacings[i] = (char)(val / 10 + '0') + decimalSeparator + (char)(val % 10 + '0');
}
textScreen.addPreference(new ZLChoicePreference(
this, textScreen.Resource, "lineSpacing",
spaceOption, spacings
));
final String[] alignments = { "left", "right", "center", "justify" };
textScreen.addPreference(new ZLChoicePreference(
this, textScreen.Resource, "alignment",
baseStyle.AlignmentOption, alignments
));
textScreen.addOption(baseStyle.AutoHyphenationOption, "autoHyphenations");
final Screen moreStylesScreen = textScreen.createPreferenceScreen("more");
byte styles[] = {
FBTextKind.REGULAR,
FBTextKind.TITLE,
FBTextKind.SECTION_TITLE,
FBTextKind.SUBTITLE,
FBTextKind.H1,
FBTextKind.H2,
FBTextKind.H3,
FBTextKind.H4,
FBTextKind.H5,
FBTextKind.H6,
FBTextKind.ANNOTATION,
FBTextKind.EPIGRAPH,
FBTextKind.AUTHOR,
FBTextKind.POEM_TITLE,
FBTextKind.STANZA,
FBTextKind.VERSE,
FBTextKind.CITE,
FBTextKind.INTERNAL_HYPERLINK,
FBTextKind.EXTERNAL_HYPERLINK,
FBTextKind.FOOTNOTE,
FBTextKind.ITALIC,
FBTextKind.EMPHASIS,
FBTextKind.BOLD,
FBTextKind.STRONG,
FBTextKind.DEFINITION,
FBTextKind.DEFINITION_DESCRIPTION,
FBTextKind.PREFORMATTED,
FBTextKind.CODE
};
for (int i = 0; i < styles.length; ++i) {
final ZLTextStyleDecoration decoration = collection.getDecoration(styles[i]);
if (decoration == null) {
continue;
}
ZLTextFullStyleDecoration fullDecoration =
decoration instanceof ZLTextFullStyleDecoration ?
(ZLTextFullStyleDecoration)decoration : null;
final Screen formatScreen = moreStylesScreen.createPreferenceScreen(decoration.getName());
formatScreen.addPreference(new FontOption(
this, textScreen.Resource, "font",
decoration.FontFamilyOption, true
));
formatScreen.addPreference(new ZLIntegerRangePreference(
this, textScreen.Resource.getResource("fontSizeDifference"),
decoration.FontSizeDeltaOption
));
formatScreen.addPreference(new ZLBoolean3Preference(
this, textScreen.Resource, "bold",
decoration.BoldOption
));
formatScreen.addPreference(new ZLBoolean3Preference(
this, textScreen.Resource, "italic",
decoration.ItalicOption
));
formatScreen.addPreference(new ZLBoolean3Preference(
this, textScreen.Resource, "underlined",
decoration.UnderlineOption
));
formatScreen.addPreference(new ZLBoolean3Preference(
this, textScreen.Resource, "strikedThrough",
decoration.StrikeThroughOption
));
if (fullDecoration != null) {
final String[] allAlignments = { "unchanged", "left", "right", "center", "justify" };
formatScreen.addPreference(new ZLChoicePreference(
this, textScreen.Resource, "alignment",
fullDecoration.AlignmentOption, allAlignments
));
}
formatScreen.addPreference(new ZLBoolean3Preference(
this, textScreen.Resource, "allowHyphenations",
decoration.AllowHyphenationsOption
));
if (fullDecoration != null) {
formatScreen.addPreference(new ZLIntegerRangePreference(
this, textScreen.Resource.getResource("spaceBefore"),
fullDecoration.SpaceBeforeOption
));
formatScreen.addPreference(new ZLIntegerRangePreference(
this, textScreen.Resource.getResource("spaceAfter"),
fullDecoration.SpaceAfterOption
));
formatScreen.addPreference(new ZLIntegerRangePreference(
this, textScreen.Resource.getResource("leftIndent"),
fullDecoration.LeftIndentOption
));
formatScreen.addPreference(new ZLIntegerRangePreference(
this, textScreen.Resource.getResource("rightIndent"),
fullDecoration.RightIndentOption
));
formatScreen.addPreference(new ZLIntegerRangePreference(
this, textScreen.Resource.getResource("firstLineIndent"),
fullDecoration.FirstLineIndentDeltaOption
));
final ZLIntegerOption spacePercentOption = fullDecoration.LineSpacePercentOption;
final int[] spacingValues = new int[17];
final String[] spacingKeys = new String[17];
spacingValues[0] = -1;
spacingKeys[0] = "unchanged";
for (int j = 1; j < spacingValues.length; ++j) {
final int val = 4 + j;
spacingValues[j] = 10 * val;
spacingKeys[j] = (char)(val / 10 + '0') + decimalSeparator + (char)(val % 10 + '0');
}
formatScreen.addPreference(new ZLIntegerChoicePreference(
this, textScreen.Resource, "lineSpacing",
spacePercentOption, spacingValues, spacingKeys
));
}
}
final ZLPreferenceSet footerPreferences = new ZLPreferenceSet();
final ZLPreferenceSet bgPreferences = new ZLPreferenceSet();
/*
final Screen cssScreen = createPreferenceScreen("css");
cssScreen.addOption(collection.UseCSSFontSizeOption, "fontSize");
cssScreen.addOption(collection.UseCSSTextAlignmentOption, "textAlignment");
*/
final Screen colorsScreen = createPreferenceScreen("colors");
colorsScreen.addPreference(new WallpaperPreference(
this, profile, colorsScreen.Resource, "background"
) {
@Override
protected void onDialogClosed(boolean result) {
super.onDialogClosed(result);
bgPreferences.setEnabled("".equals(getValue()));
}
});
bgPreferences.add(
colorsScreen.addOption(profile.BackgroundOption, "backgroundColor")
);
bgPreferences.setEnabled("".equals(profile.WallpaperOption.getValue()));
colorsScreen.addOption(profile.SelectionBackgroundOption, "selectionBackground");
colorsScreen.addOption(profile.HighlightingOption, "highlighting");
colorsScreen.addOption(profile.RegularTextOption, "text");
colorsScreen.addOption(profile.HyperlinkTextOption, "hyperlink");
colorsScreen.addOption(profile.VisitedHyperlinkTextOption, "hyperlinkVisited");
colorsScreen.addOption(profile.FooterFillOption, "footer");
colorsScreen.addOption(profile.SelectionBackgroundOption, "selectionBackground");
colorsScreen.addOption(profile.SelectionForegroundOption, "selectionForeground");
final Screen marginsScreen = createPreferenceScreen("margins");
marginsScreen.addPreference(new ZLIntegerRangePreference(
this, marginsScreen.Resource.getResource("left"),
fbReader.LeftMarginOption
));
marginsScreen.addPreference(new ZLIntegerRangePreference(
this, marginsScreen.Resource.getResource("right"),
fbReader.RightMarginOption
));
marginsScreen.addPreference(new ZLIntegerRangePreference(
this, marginsScreen.Resource.getResource("top"),
fbReader.TopMarginOption
));
marginsScreen.addPreference(new ZLIntegerRangePreference(
this, marginsScreen.Resource.getResource("bottom"),
fbReader.BottomMarginOption
));
marginsScreen.addPreference(new ZLIntegerRangePreference(
this, marginsScreen.Resource.getResource("spaceBetweenColumns"),
fbReader.SpaceBetweenColumnsOption
));
final Screen statusLineScreen = createPreferenceScreen("scrollBar");
final String[] scrollBarTypes = {"hide", "show", "showAsProgress", "showAsFooter"};
statusLineScreen.addPreference(new ZLChoicePreference(
this, statusLineScreen.Resource, "scrollbarType",
fbReader.ScrollbarTypeOption, scrollBarTypes
) {
@Override
protected void onDialogClosed(boolean result) {
super.onDialogClosed(result);
footerPreferences.setEnabled(
findIndexOfValue(getValue()) == FBView.SCROLLBAR_SHOW_AS_FOOTER
);
}
});
final FooterOptions footerOptions = fbReader.FooterOptions;
footerPreferences.add(statusLineScreen.addPreference(new ZLIntegerRangePreference(
this, statusLineScreen.Resource.getResource("footerHeight"),
fbReader.FooterHeightOption
)));
footerPreferences.add(statusLineScreen.addOption(profile.FooterFillOption, "footerColor"));
footerPreferences.add(statusLineScreen.addOption(footerOptions.ShowTOCMarks, "tocMarks"));
footerPreferences.add(statusLineScreen.addOption(footerOptions.ShowClock, "showClock"));
footerPreferences.add(statusLineScreen.addOption(footerOptions.ShowBattery, "showBattery"));
footerPreferences.add(statusLineScreen.addOption(footerOptions.ShowProgress, "showProgress"));
footerPreferences.add(statusLineScreen.addPreference(new FontOption(
this, statusLineScreen.Resource, "font",
footerOptions.Font, false
)));
footerPreferences.setEnabled(
fbReader.ScrollbarTypeOption.getValue() == FBView.SCROLLBAR_SHOW_AS_FOOTER
);
/*
final Screen colorProfileScreen = createPreferenceScreen("colorProfile");
final ZLResource resource = colorProfileScreen.Resource;
colorProfileScreen.setSummary(ColorProfilePreference.createTitle(resource, fbreader.getColorProfileName()));
for (String key : ColorProfile.names()) {
colorProfileScreen.addPreference(new ColorProfilePreference(
this, fbreader, colorProfileScreen, key, ColorProfilePreference.createTitle(resource, key)
));
}
*/
final PageTurningOptions pageTurningOptions = fbReader.PageTurningOptions;
final ZLKeyBindings keyBindings = fbReader.keyBindings();
final Screen scrollingScreen = createPreferenceScreen("scrolling");
scrollingScreen.addOption(pageTurningOptions.FingerScrolling, "fingerScrolling");
scrollingScreen.addOption(fbReader.EnableDoubleTapOption, "enableDoubleTapDetection");
final ZLPreferenceSet volumeKeysPreferences = new ZLPreferenceSet();
scrollingScreen.addPreference(new ZLCheckBoxPreference(
this, scrollingScreen.Resource, "volumeKeys"
) {
{
setChecked(fbReader.hasActionForKey(KeyEvent.KEYCODE_VOLUME_UP, false));
}
@Override
protected void onClick() {
super.onClick();
if (isChecked()) {
keyBindings.bindKey(KeyEvent.KEYCODE_VOLUME_DOWN, false, ActionCode.VOLUME_KEY_SCROLL_FORWARD);
keyBindings.bindKey(KeyEvent.KEYCODE_VOLUME_UP, false, ActionCode.VOLUME_KEY_SCROLL_BACK);
} else {
keyBindings.bindKey(KeyEvent.KEYCODE_VOLUME_DOWN, false, FBReaderApp.NoAction);
keyBindings.bindKey(KeyEvent.KEYCODE_VOLUME_UP, false, FBReaderApp.NoAction);
}
volumeKeysPreferences.setEnabled(isChecked());
}
});
volumeKeysPreferences.add(scrollingScreen.addPreference(new ZLCheckBoxPreference(
this, scrollingScreen.Resource, "invertVolumeKeys"
) {
{
setChecked(ActionCode.VOLUME_KEY_SCROLL_FORWARD.equals(
keyBindings.getBinding(KeyEvent.KEYCODE_VOLUME_UP, false)
));
}
@Override
protected void onClick() {
super.onClick();
if (isChecked()) {
keyBindings.bindKey(KeyEvent.KEYCODE_VOLUME_DOWN, false, ActionCode.VOLUME_KEY_SCROLL_BACK);
keyBindings.bindKey(KeyEvent.KEYCODE_VOLUME_UP, false, ActionCode.VOLUME_KEY_SCROLL_FORWARD);
} else {
keyBindings.bindKey(KeyEvent.KEYCODE_VOLUME_DOWN, false, ActionCode.VOLUME_KEY_SCROLL_FORWARD);
keyBindings.bindKey(KeyEvent.KEYCODE_VOLUME_UP, false, ActionCode.VOLUME_KEY_SCROLL_BACK);
}
}
}));
volumeKeysPreferences.setEnabled(fbReader.hasActionForKey(KeyEvent.KEYCODE_VOLUME_UP, false));
scrollingScreen.addOption(pageTurningOptions.Animation, "animation");
scrollingScreen.addPreference(new AnimationSpeedPreference(
this,
scrollingScreen.Resource,
"animationSpeed",
pageTurningOptions.AnimationSpeed
));
scrollingScreen.addOption(pageTurningOptions.Horizontal, "horizontal");
/*
final Screen imagesScreen = createPreferenceScreen("images");
imagesScreen.addOption(fbReader.ImageTappingActionOption, "tappingAction");
imagesScreen.addOption(fbReader.FitImagesToScreenOption, "fitImagesToScreen");
imagesScreen.addOption(fbReader.ImageViewBackgroundOption, "backgroundColor");
*/
final CancelMenuOptions cancelMenuOptions = fbReader.CancelMenuOptions;
final Screen cancelMenuScreen = createPreferenceScreen("cancelMenu");
cancelMenuScreen.addOption(cancelMenuOptions.ShowLibraryItem, "library");
cancelMenuScreen.addOption(cancelMenuOptions.ShowNetworkLibraryItem, "networkLibrary");
cancelMenuScreen.addOption(cancelMenuOptions.ShowPreviousBookItem, "previousBook");
cancelMenuScreen.addOption(cancelMenuOptions.ShowPositionItems, "positions");
final String[] backKeyActions =
{ ActionCode.EXIT, ActionCode.SHOW_CANCEL_MENU };
cancelMenuScreen.addPreference(new ZLStringChoicePreference(
this, cancelMenuScreen.Resource, "backKeyAction",
keyBindings.getOption(KeyEvent.KEYCODE_BACK, false), backKeyActions
));
final String[] backKeyLongPressActions =
{ ActionCode.EXIT, ActionCode.SHOW_CANCEL_MENU, FBReaderApp.NoAction };
cancelMenuScreen.addPreference(new ZLStringChoicePreference(
this, cancelMenuScreen.Resource, "backKeyLongPressAction",
keyBindings.getOption(KeyEvent.KEYCODE_BACK, true), backKeyLongPressActions
));
}
}