/*
* Copyright (C) Winson Chiu
*
* 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 cw.kop.autobackground.settings;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.media.effect.EffectFactory;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.preference.PreferenceFragment;
import android.preference.SwitchPreference;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import afzkl.development.colorpickerview.view.ColorPickerView;
import cw.kop.autobackground.CustomNumberPicker;
import cw.kop.autobackground.DialogFactory;
import cw.kop.autobackground.EffectPreference;
import cw.kop.autobackground.R;
public class EffectsSettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener, Preference.OnPreferenceClickListener {
private Context appContext;
private SwitchPreference randomPref;
private SwitchPreference duotonePref;
private SwitchPreference effectsPref;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences_effects);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
appContext = getActivity();
}
@Override
public void onDetach() {
appContext = null;
super.onDetach();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Preference resetPref = findPreference("reset_effects");
resetPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
resetEffects();
if (AppSettings.useToast()) {
Toast.makeText(appContext, "Reset effects", Toast.LENGTH_SHORT).show();
}
return false;
}
});
randomPref = (SwitchPreference) findPreference("use_random_effects");
if (AppSettings.useRandomEffects()) {
randomPref.setSummary("Effect: " + AppSettings.getRandomEffect());
}
duotonePref = (SwitchPreference) findPreference("effect_duotone_switch");
effectsPref = (SwitchPreference) findPreference("use_effects");
Preference blurRadiusPref = findPreference("blur_radius");
blurRadiusPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
DialogFactory.SeekBarDialogListener listener = new DialogFactory.SeekBarDialogListener() {
@Override
public void onClickRight(View v) {
AppSettings.setBlurRadius(getValue());
this.dismissDialog();
}
@Override
public void onValueChanged(SeekBar seekBar, int progress, boolean fromUser) {
setValueText("" + ((float) progress / 10));
}
};
DialogFactory.showSeekBarDialog(appContext,
"Blur effect",
"pixel radius",
listener,
250,
AppSettings.getBlurRadius(),
-1,
R.string.cancel_button,
R.string.ok_button);
return true;
}
});
if (!AppSettings.useAdvanced()) {
PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference(
"title_effects_settings");
preferenceCategory.removePreference(findPreference("use_effects_override"));
preferenceCategory.removePreference(findPreference("use_toast_effects"));
}
findPreference("effects_frequency").setOnPreferenceClickListener(this);
findPreference("random_effects_frequency").setOnPreferenceClickListener(this);
PreferenceCategory parametersCategory = (PreferenceCategory) findPreference(
"title_opengl_effects");
for (int i = 0; i < parametersCategory.getPreferenceCount(); i++) {
String key = parametersCategory.getPreference(i).getKey();
if (key != null && findPreference(key) instanceof EffectPreference) {
EffectPreference effectPref = (EffectPreference) findPreference(key);
effectPref.setSummary(effectPref.getTitle() + ": " + AppSettings.getEffectValue(key) + "%");
effectPref.setOnPreferenceClickListener(this);
}
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_AUTOFIX)) {
parametersCategory.removePreference(findPreference("effect_auto_fix"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_BRIGHTNESS)) {
parametersCategory.removePreference(findPreference("effect_brightness"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_CONTRAST)) {
parametersCategory.removePreference(findPreference("effect_contrast"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_CROSSPROCESS)) {
parametersCategory.removePreference(findPreference("effect_cross_process_switch"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_DOCUMENTARY)) {
parametersCategory.removePreference(findPreference("effect_documentary_switch"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_DUOTONE)) {
parametersCategory.removePreference(findPreference("effect_duotone_switch"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_FILLLIGHT)) {
parametersCategory.removePreference(findPreference("effect_fill_light"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_FISHEYE)) {
parametersCategory.removePreference(findPreference("effect_fisheye"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_GRAIN)) {
parametersCategory.removePreference(findPreference("effect_grain"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_GRAYSCALE)) {
parametersCategory.removePreference(findPreference("effect_grayscale_switch"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_LOMOISH)) {
parametersCategory.removePreference(findPreference("effect_lomoish_switch"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_NEGATIVE)) {
parametersCategory.removePreference(findPreference("effect_negative_switch"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_POSTERIZE)) {
parametersCategory.removePreference(findPreference("effect_posterize_switch"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_SATURATE)) {
parametersCategory.removePreference(findPreference("effect_saturate"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_SEPIA)) {
parametersCategory.removePreference(findPreference("effect_sepia_switch"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_SHARPEN)) {
parametersCategory.removePreference(findPreference("effect_sharpen"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_TEMPERATURE)) {
parametersCategory.removePreference(findPreference("effect_temperature"));
}
if (!EffectFactory.isEffectSupported(EffectFactory.EFFECT_VIGNETTE)) {
parametersCategory.removePreference(findPreference("effect_vignette"));
}
return inflater.inflate(R.layout.fragment_list, container, false);
}
@Override
public void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
private void showEffectDialogMenu() {
DialogFactory.ListDialogListener clickListener = new DialogFactory.ListDialogListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String[] randomEffectsList = getResources().getStringArray(R.array.random_effects_entry_menu);
AppSettings.setRandomEffect(randomEffectsList[position]);
effectsPref.setChecked(true);
this.dismissDialog();
}
@Override
public void onDismiss() {
if (AppSettings.getRandomEffect().equals("None")) {
randomPref.setChecked(false);
}
randomPref.setSummary("Effect: " + AppSettings.getRandomEffect());
}
};
DialogFactory.showListDialog(appContext,
"Random Effect:",
clickListener,
R.array.random_effects_entry_menu);
}
@Override
public void onPause() {
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
super.onPause();
}
private void resetEffects() {
PreferenceCategory settingsCategory = (PreferenceCategory) findPreference(
"title_effects_settings");
for (int i = 0; i < settingsCategory.getPreferenceCount(); i++) {
String key = settingsCategory.getPreference(i).getKey();
if (key != null) {
if (key.equals("effects_frequency")) {
AppSettings.setEffect(key, 100);
}
else if (findPreference(key) instanceof SwitchPreference) {
((SwitchPreference) findPreference(key)).setChecked(false);
}
}
}
AppSettings.setRandomEffect("None");
randomPref.setSummary("Effect: " + AppSettings.getRandomEffect());
PreferenceCategory parametersCategory = (PreferenceCategory) findPreference(
"title_opengl_effects");
for (int i = 0; i < parametersCategory.getPreferenceCount(); i++) {
String key = parametersCategory.getPreference(i).getKey();
if (key != null) {
if (!key.contains("switch")) {
switch (key) {
case "effect_brightness":
case "effect_contrast":
case "effect_saturate":
case "effects_frequency":
AppSettings.setEffect(key, 100);
break;
case "effect_temperature":
AppSettings.setEffect(key, 50);
break;
default:
AppSettings.setEffect(key, 0);
break;
}
EffectPreference effectPref = (EffectPreference) findPreference(key);
effectPref.setSummary(effectPref.getTitle() + ": " + AppSettings.getEffectValue(
key) + "%");
}
else {
((SwitchPreference) findPreference(key)).setChecked(false);
}
}
}
}
private void showDuotoneDialog() {
final Dialog dialog = AppSettings.getTheme().equals(AppSettings.APP_LIGHT_THEME) ?
new Dialog(
appContext,
R.style.LightDialogTheme) :
new Dialog(appContext, R.style.DarkDialogTheme);
View dialogView = View.inflate(appContext, R.layout.duotone_dialog, null);
dialog.setContentView(dialogView);
TextView dialogTitle = (TextView) dialogView.findViewById(R.id.dialog_title);
dialogTitle.setText("Choose dual tone colors:");
final ColorPickerView duoToneView1 = (ColorPickerView) dialogView.findViewById(R.id.duotone_color_picker_one);
final ColorPickerView duoToneView2 = (ColorPickerView) dialogView.findViewById(R.id.duotone_color_picker_two);
duoToneView1.setColor(AppSettings.getDuotoneColor(1));
duoToneView2.setColor(AppSettings.getDuotoneColor(2));
Button tabOneButton = (Button) dialogView.findViewById(R.id.color_one_button);
Button tabTwoButton = (Button) dialogView.findViewById(R.id.color_two_button);
final View tabOneHighlight = dialogView.findViewById(R.id.color_one_button_highlight);
final View tabTwoHighlight = dialogView.findViewById(R.id.color_two_button_highlight);
tabOneButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
duoToneView2.setVisibility(View.GONE);
tabTwoHighlight.setVisibility(View.INVISIBLE);
duoToneView1.setVisibility(View.VISIBLE);
tabOneHighlight.setVisibility(View.VISIBLE);
}
});
tabTwoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
duoToneView1.setVisibility(View.GONE);
tabOneHighlight.setVisibility(View.INVISIBLE);
duoToneView2.setVisibility(View.VISIBLE);
tabTwoHighlight.setVisibility(View.VISIBLE);
}
});
Button positiveButton = (Button) dialogView.findViewById(R.id.dialog_positive_button);
positiveButton.setVisibility(View.VISIBLE);
positiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AppSettings.setDuotoneColor(1, duoToneView1.getColor());
AppSettings.setDuotoneColor(2, duoToneView2.getColor());
dialog.dismiss();
}
});
Button negativeButton = (Button) dialogView.findViewById(R.id.dialog_negative_button);
negativeButton.setVisibility(View.VISIBLE);
negativeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
duotonePref.setChecked(false);
dialog.dismiss();
}
});
if (AppSettings.getTheme().equals(AppSettings.APP_LIGHT_THEME)) {
negativeButton.setTextColor(getResources().getColor(R.color.DARK_GRAY_OPAQUE));
positiveButton.setTextColor(getResources().getColor(R.color.DARK_GRAY_OPAQUE));
}
else {
negativeButton.setTextColor(getResources().getColor(R.color.LIGHT_GRAY_OPAQUE));
positiveButton.setTextColor(getResources().getColor(R.color.LIGHT_GRAY_OPAQUE));
}
dialog.show();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (!((Activity) appContext).isFinishing()) {
if (findPreference(key) instanceof EffectPreference) {
EffectPreference effectPref = (EffectPreference) findPreference(key);
effectPref.setSummary(effectPref.getTitle() + ": " + AppSettings.getEffectValue(key) + "%");
effectsPref.setChecked(true);
}
else if (findPreference(key) instanceof SwitchPreference && key.contains("effect_")) {
effectsPref.setChecked(true);
}
if (key.equals("use_random_effects")) {
if (AppSettings.useRandomEffects()) {
showEffectDialogMenu();
}
else {
AppSettings.setRandomEffect("None");
randomPref.setSummary("Effect: " + AppSettings.getRandomEffect());
}
}
if (key.equals("effect_duotone_switch")) {
if (AppSettings.getDuotoneEffect()) {
showDuotoneDialog();
}
}
}
}
@Override
public boolean onPreferenceClick(Preference preference) {
EffectPreference effectPreference = (EffectPreference) preference;
String title = effectPreference.getTitle();
final String key = effectPreference.getKey();
int maxValue = effectPreference.getMaxValue();
final int defaultValue = effectPreference.getDefaultValue();
final Dialog dialog = AppSettings.getTheme().equals(AppSettings.APP_LIGHT_THEME) ?
new Dialog(
appContext,
R.style.LightDialogTheme) :
new Dialog(appContext, R.style.DarkDialogTheme);
View dialogView = View.inflate(appContext, R.layout.effect_dialog, null);
dialog.setContentView(dialogView);
TextView dialogTitle = (TextView) dialogView.findViewById(R.id.dialog_title);
dialogTitle.setText(title);
final CustomNumberPicker valuePicker = (CustomNumberPicker) dialogView.findViewById(R.id.effect_number_picker);
valuePicker.setMaxValue(maxValue);
valuePicker.setValue(AppSettings.getEffectValue(key));
TextView suffixText = (TextView) dialogView.findViewById(R.id.effect_suffix);
suffixText.setText("%");
Button defaultButton = (Button) dialogView.findViewById(R.id.effect_default_button);
defaultButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
valuePicker.setValue(defaultValue);
}
});
Button positiveButton = (Button) dialogView.findViewById(R.id.effect_ok_button);
positiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AppSettings.setEffect(key, valuePicker.getValue());
dialog.dismiss();
}
});
Button negativeButton = (Button) dialogView.findViewById(R.id.effect_cancel_button);
negativeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
if (AppSettings.getTheme().equals(AppSettings.APP_LIGHT_THEME)) {
defaultButton.setTextColor(getResources().getColor(R.color.DARK_GRAY_OPAQUE));
negativeButton.setTextColor(getResources().getColor(R.color.DARK_GRAY_OPAQUE));
positiveButton.setTextColor(getResources().getColor(R.color.DARK_GRAY_OPAQUE));
}
else {
defaultButton.setTextColor(getResources().getColor(R.color.LIGHT_GRAY_OPAQUE));
negativeButton.setTextColor(getResources().getColor(R.color.LIGHT_GRAY_OPAQUE));
positiveButton.setTextColor(getResources().getColor(R.color.LIGHT_GRAY_OPAQUE));
}
dialog.show();
return true;
}
}