package com.openfarmanager.android;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceScreen;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.openfarmanager.android.core.FontManager;
import com.openfarmanager.android.core.Settings;
import com.openfarmanager.android.filesystem.FileSystemScanner;
import com.openfarmanager.android.filesystem.actions.RootTask;
import com.openfarmanager.android.utils.StorageUtils;
import com.openfarmanager.android.utils.SystemUtils;
import com.openfarmanager.android.dialogs.FontSetupDialog;
import com.openfarmanager.android.dialogs.MarginSetupDialog;
import com.openfarmanager.android.view.ToastNotification;
import com.openfarmanager.android.view.YesNoPreference;
import java.util.HashMap;
import afzkl.development.colorpickerview.preference.ColorPickerPreference;
import afzkl.development.colorpickerview.view.ColorPickerView;
public class SettingsActivity extends PreferenceActivity {
private Intent mResultData;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mResultData = new Intent(App.sInstance, SettingsActivity.class);
setResult(Main.RESULT_SETTINGS_CHANGED, mResultData);
addPreferencesFromResource(R.xml.preferences);
Preference sdcardAccess = findPreference("sdcard_access");
if (!StorageUtils.checkVersion()) {
((PreferenceCategory) findPreference("pref_key_file_system")).removePreference(findPreference("sdcard_access"));
} else {
sdcardAccess.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
mResultData.putExtra(Main.RESULT_REQUEST_SDCARD_ACCEESS, true);
finish();
return true;
}
});
}
findPreference("file_system_sort").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
showSingleChoiceDialog(R.layout.preference_list_view, getString(R.string.file_system_sort),
getResources().getStringArray(R.array.files_sort_array),
getResources().getStringArray(R.array.files_sort_array_values), App.sInstance.getSettings().getFileSortValue(),
new OnChooserValueSelectedListener() {
@Override
public void onValueSelected(int index) {
App.sInstance.getSettings().setFileSortValue(getResources().getStringArray(R.array.files_sort_array_values)[index]);
}
});
return true;
}
});
findPreference("file_system_file_info").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
showSingleChoiceDialog(R.layout.preference_list_view, getString(R.string.file_system_file_info),
getResources().getStringArray(R.array.file_info_type_array),
getResources().getStringArray(R.array.file_info_type_array_values), App.sInstance.getSettings().getFileInfoType(),
new OnChooserValueSelectedListener() {
@Override
public void onValueSelected(int index) {
App.sInstance.getSettings().setFileInfoTypeValue(getResources().getStringArray(R.array.file_info_type_array_values)[index]);
}
});
return true;
}
});
findPreference("panel_font_size").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
final Dialog dialog = new FontSetupDialog(SettingsActivity.this, new FontSetupDialog.SaveAction() {
@Override
public void execute(int newValue) {
App.sInstance.getSettings().setMainPanelFontSize(newValue);
}
@Override
public int getDefaultValue() {
return App.sInstance.getSettings().getMainPanelFontSize();
}
});
dialog.show();
adjustDialogSize(dialog);
return true;
}
});
findPreference("panel_margin").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
final Dialog dialog = new MarginSetupDialog(SettingsActivity.this, new FontSetupDialog.SaveAction() {
@Override
public void execute(int newValue) {
App.sInstance.getSettings().setMainPanelCellMargin(newValue);
}
@Override
public int getDefaultValue() {
return App.sInstance.getSettings().getMainPanelCellMargin();
}
});
dialog.show();
adjustDialogSize(dialog);
return true;
}
});
findPreference("toolbar_font_size").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
final Dialog dialog = new FontSetupDialog(SettingsActivity.this, new FontSetupDialog.SaveAction() {
@Override
public void execute(int newValue) {
if (newValue != getDefaultValue()) {
mResultData.putExtra(Main.RESULT_BOTTOM_PANEL_INVALIDATE, true);
}
App.sInstance.getSettings().setBottomPanelFontSize(newValue);
}
@Override
public int getDefaultValue() {
return App.sInstance.getSettings().getBottomPanelFontSize();
}
});
dialog.show();
adjustDialogSize(dialog);
return true;
}
});
findPreference("viewer_font_size").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
final Dialog dialog = new FontSetupDialog(SettingsActivity.this, new FontSetupDialog.SaveAction() {
@Override
public void execute(int newValue) {
App.sInstance.getSettings().setViewerFontSize(newValue);
}
@Override
public int getDefaultValue() {
return App.sInstance.getSettings().getViewerFontSize();
}
});
dialog.show();
adjustDialogSize(dialog);
return true;
}
});
final HashMap<String, String> fonts = FontManager.enumerateFonts();
if (fonts != null) {
final String[] fontNames = new String[fonts.values().size()];
fonts.values().toArray(fontNames);
final String[] fontPathes = new String[fonts.keySet().size()];
fonts.keySet().toArray(fontPathes);
findPreference("panel_font").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
showSingleChoiceDialog(R.layout.preference_list_view, getString(R.string.main_panel_font),
fontNames,
fontPathes, App.sInstance.getSettings().getMainPanelFont(),
new OnChooserValueSelectedListener() {
@Override
public void onValueSelected(int index) {
App.sInstance.getSettings().setMainPanelFont(fontPathes[index]);
mResultData.putExtra(Main.RESULT_BOTTOM_PANEL_INVALIDATE, true);
}
}
);
return true;
}
});
findPreference("viewer_font").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
showSingleChoiceDialog(R.layout.preference_list_view, getString(R.string.viewer_font),
fontNames,
fontPathes, App.sInstance.getSettings().getViewerFont(),
new OnChooserValueSelectedListener() {
@Override
public void onValueSelected(int index) {
App.sInstance.getSettings().setViewerFont(fontPathes[index]);
}
}
);
return true;
}
});
}
final Settings settings = App.sInstance.getSettings();
CheckBoxPreference multiPanels = (CheckBoxPreference) findPreference("multi_panels");
multiPanels.setChecked(settings.isMultiPanelMode());
CheckBoxPreference flexiblePanels = (CheckBoxPreference) findPreference("flexible_panels");
flexiblePanels.setChecked(settings.isFlexiblePanelsMode());
flexiblePanels.setEnabled(settings.isMultiPanelMode());
CheckBoxPreference enableHomeFolder = (CheckBoxPreference) findPreference("enable_home_folder");
enableHomeFolder.setChecked(settings.isEnableHomeFolder());
Preference homeFolder = findPreference("home_folder");
homeFolder.setEnabled(settings.isEnableHomeFolder());
homeFolder.setSummary(settings.getHomeFolder());
final ColorPickerPreference mainPanelColor = (ColorPickerPreference) findPreference("main_panel_color");
mainPanelColor.setDefaultColor(settings.getMainPanelColor());
mainPanelColor.setOnColorChangedListener(new ColorPickerView.OnColorChangedListener() {
@Override
public void onColorChanged(int newColor) {
settings.setMainPanelColor(newColor);
}
});
final ColorPickerPreference secondaryColor = (ColorPickerPreference) findPreference("secondary_color");
secondaryColor.setDefaultColor(settings.getSecondaryColor());
secondaryColor.setOnColorChangedListener(new ColorPickerView.OnColorChangedListener() {
@Override
public void onColorChanged(int newColor) {
settings.setSecondaryColor(newColor);
mResultData.putExtra(Main.RESULT_BOTTOM_PANEL_INVALIDATE, true);
}
});
final ColorPickerPreference viewerColor = (ColorPickerPreference) findPreference("viewer_color");
viewerColor.setDefaultColor(settings.getViewerColor());
viewerColor.setOnColorChangedListener(new ColorPickerView.OnColorChangedListener() {
@Override
public void onColorChanged(int newColor) {
settings.setViewerColor(newColor);
}
});
final ColorPickerPreference textColor = (ColorPickerPreference) findPreference("text_color");
textColor.setDefaultColor(settings.getTextColor());
textColor.setOnColorChangedListener(new ColorPickerView.OnColorChangedListener() {
@Override
public void onColorChanged(int newColor) {
settings.setTextColor(newColor);
}
});
final ColorPickerPreference folderColor = (ColorPickerPreference) findPreference("folder_color");
folderColor.setDefaultColor(settings.getFolderColor());
folderColor.setOnColorChangedListener(new ColorPickerView.OnColorChangedListener() {
@Override
public void onColorChanged(int newColor) {
settings.setFolderColor(newColor);
}
});
final ColorPickerPreference selectedColor = (ColorPickerPreference) findPreference("selected_color");
selectedColor.setDefaultColor(settings.getSelectedColor());
selectedColor.setOnColorChangedListener(new ColorPickerView.OnColorChangedListener() {
@Override
public void onColorChanged(int newColor) {
settings.setSelectedColor(newColor);
}
});
final ColorPickerPreference hiddenColor = (ColorPickerPreference) findPreference("hidden_color");
hiddenColor.setDefaultColor(settings.getHiddenColor());
hiddenColor.setOnColorChangedListener(new ColorPickerView.OnColorChangedListener() {
@Override
public void onColorChanged(int newColor) {
settings.setHiddenColor(newColor);
}
});
final ColorPickerPreference installColor = (ColorPickerPreference) findPreference("install_color");
installColor.setDefaultColor(settings.getInstallColor());
installColor.setOnColorChangedListener(new ColorPickerView.OnColorChangedListener() {
@Override
public void onColorChanged(int newColor) {
settings.setInstallColor(newColor);
}
});
final ColorPickerPreference archiveColor = (ColorPickerPreference) findPreference("archive_color");
archiveColor.setDefaultColor(settings.getArchiveColor());
archiveColor.setOnColorChangedListener(new ColorPickerView.OnColorChangedListener() {
@Override
public void onColorChanged(int newColor) {
settings.setArchiveColor(newColor);
}
});
findPreference("feedback").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
sendFeedback();
return true;
}
});
findPreference("tips").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
mResultData.putExtra(Main.RESULT_SHOW_HINT, true);
App.sInstance.getSettings().getSharedPreferences().edit().putBoolean(Settings.SHOW_TIPS, true).commit();
finish();
return true;
}
});
findPreference("rate").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Uri uri = Uri.parse(getString(R.string.rate_app_url));
Intent intent = new Intent (Intent.ACTION_VIEW, uri);
startActivity(intent);
return true;
}
});
findPreference("reset_to_defaults").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
final Dialog dialog = new YesNoPreference(SettingsActivity.this, getString(R.string.reset_to_defaults_summary),
new YesNoPreference.YesNoAction() {
@Override
public void onResult(boolean result) {
if (result) {
Settings settings = App.sInstance.getSettings();
try {
settings.resetStyle();
} catch (Exception ignore) {}
mResultData.putExtra(Main.RESULT_BOTTOM_PANEL_INVALIDATE, true);
mainPanelColor.setPreviewColor(settings.getMainPanelColor());
secondaryColor.setPreviewColor(settings.getSecondaryColor());
viewerColor.setPreviewColor(settings.getViewerColor());
textColor.setPreviewColor(settings.getTextColor());
folderColor.setPreviewColor(settings.getFolderColor());
selectedColor.setPreviewColor(settings.getSelectedColor());
hiddenColor.setPreviewColor(settings.getHiddenColor());
installColor.setPreviewColor(settings.getInstallColor());
archiveColor.setPreviewColor(settings.getArchiveColor());
}
}
});
dialog.show();
adjustDialogSize(dialog);
return true;
}
});
App.sInstance.getSettings().getSharedPreferences().registerOnSharedPreferenceChangeListener(mPreferenceChangeListener);
}
private void showSingleChoiceDialog(int layoutId, String title, final String[] items, final String[] values,
String defaultValue, final OnChooserValueSelectedListener listener) {
View view = getLayoutInflater().inflate(layoutId, null);
final Dialog dialog = new Dialog(SettingsActivity.this, R.style.Action_Dialog);
dialog.setContentView(view);
RadioGroup group = (RadioGroup) view.findViewById(R.id.items_list);
int i = 0;
for (String item : items) {
RadioButton button = new RadioButton(SettingsActivity.this);
button.setButtonDrawable(R.drawable.radio_selector);
button.setText(item);
group.addView(button);
button.setId(i);
if (values[i++].equals(defaultValue)) {
button.setChecked(true);
}
}
group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
listener.onValueSelected(i);
if (dialog.isShowing()) {
dialog.dismiss();
}
}
});
((TextView) view.findViewById(R.id.title)).setText(title);
view.findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (dialog.isShowing()) {
dialog.dismiss();
}
}
});
dialog.show();
adjustDialogSize(dialog);
}
SharedPreferences.OnSharedPreferenceChangeListener mPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
if ("folders_first".equals(s) || "sdcard_root".equals(s)) {
FileSystemScanner.sInstance.initFilters();
} else if ("multi_panels".equals(s)) {
mResultData.putExtra(Main.RESULT_CODE_PANELS_MODE_CHANGED, true);
SharedPreferences preferences = App.sInstance.getSettings().getSharedPreferences();
if (!preferences.getBoolean(Settings.MULTI_PANELS_CHANGED, false)) {
preferences.edit().putBoolean(Settings.MULTI_PANELS_CHANGED, true).commit();
}
findPreference("flexible_panels").setEnabled(App.sInstance.getSettings().isMultiPanelMode());
} else if ("enable_home_folder".equals(s)) {
findPreference("home_folder").setEnabled(App.sInstance.getSettings().isEnableHomeFolder());
} else if ("force_en_lang".equals(s)) {
ToastNotification.makeText(getApplicationContext(), getString(R.string.will_be_applied_after_restarts),
Toast.LENGTH_LONG).show();
} else if (Settings.ROOT_ENABLED.equals(s)){
if (sharedPreferences.getBoolean(s, false)) {
if (!RootTask.requestRootsAccess()) {
sharedPreferences.edit().putBoolean(s, false).commit();
ToastNotification.makeText(getApplicationContext(), getString(R.string.root_not_found_or_denied),
Toast.LENGTH_LONG).show();
}
}
}
}
};
private void sendFeedback() {
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", getString(R.string.feedback_to), null));
String version = "";
try {
PackageInfo pi = getPackageManager().getPackageInfo(getPackageName(), 0);
version = pi.versionName + "/" + pi.versionCode;
} catch (PackageManager.NameNotFoundException e) {
throw new IllegalStateException("Invalid package name", e);
}
String subject = getString(R.string.feedback_subject, version);
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
try {
startActivity(emailIntent);
} catch (ActivityNotFoundException anfe) {
runOnUiThread(new Runnable() {
public void run() {
if (!isFinishing())
Toast.makeText(SettingsActivity.this, getString(R.string.no_email_client), Toast.LENGTH_SHORT).show();
}
});
}
}
@Override
public void onDestroy() {
App.sInstance.getSettings().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(mPreferenceChangeListener);
super.onDestroy();
}
/**
* Adjust dialog size. Actuall for old android version only (due to absence of Holo themes).
*/
private void adjustDialogSize(Dialog dialog) {
if (!SystemUtils.isHoneycombOrNever()) {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.copyFrom(getWindow().getAttributes());
params.width = (int) (metrics.widthPixels * 0.8f);
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
dialog.getWindow().setAttributes(params);
}
}
private interface OnChooserValueSelectedListener {
void onValueSelected(int index);
}
}