/*
* Overchan Android (Meta Imageboard Client)
* Copyright (C) 2014-2016 miku-nyan <https://github.com/miku-nyan>
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*/
package nya.miku.wishmaster.ui.settings;
import nya.miku.wishmaster.R;
import nya.miku.wishmaster.api.ChanModule;
import nya.miku.wishmaster.api.models.UrlPageModel;
import nya.miku.wishmaster.common.Async;
import nya.miku.wishmaster.common.Logger;
import nya.miku.wishmaster.common.MainApplication;
import nya.miku.wishmaster.ui.BoardsListFragment;
import nya.miku.wishmaster.ui.CompatibilityImpl;
import nya.miku.wishmaster.ui.NewTabFragment;
import nya.miku.wishmaster.ui.tabs.TabsTrackerService;
import nya.miku.wishmaster.ui.tabs.UrlHandler;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceGroup;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.text.InputType;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.Toast;
//отсутствует альтернатива, поддерживающая API 4
@SuppressWarnings("deprecation")
public class PreferencesActivity extends PreferenceActivity {
private static final String TAG = "PreferencesActivity";
public static boolean needUpdateChansScreen = false;
private SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener;
private SharedPreferences sharedPreferences;
private static final int[] KEYS_AUTOUPDATE = new int[] {
R.string.pref_key_enable_autoupdate,
R.string.pref_key_autoupdate_delay,
R.string.pref_key_autoupdate_notification,
R.string.pref_key_autoupdate_background };
protected void onCreate(Bundle savedInstanceState) {
MainApplication.getInstance().settings.getTheme().setToPreferencesActivity(this);
setTitle(R.string.preferences);
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
updateChansScreen((PreferenceScreen) getPreferenceManager().findPreference(getString(R.string.pref_key_cat_chans)));
updateListSummary(R.string.pref_key_theme);
updateListSummary(R.string.pref_key_font_size);
updateListSummary(R.string.pref_key_download_thumbs);
updateListSummary(R.string.pref_key_download_format);
final Preference clearSubscriptionsPreference = getPreferenceManager().findPreference(getString(R.string.pref_key_clear_subscriptions));
int subscriptionsCount = (int) MainApplication.getInstance().subscriptions.getCurrentCount();
clearSubscriptionsPreference.setSummary(getResources().getQuantityString(R.plurals.pref_clear_subscriptions_summary,
subscriptionsCount, subscriptionsCount));
if (subscriptionsCount > 0) {
clearSubscriptionsPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
MainApplication.getInstance().subscriptions.reset();
int count = (int) MainApplication.getInstance().subscriptions.getCurrentCount();
clearSubscriptionsPreference.setSummary(getResources().getQuantityString(R.plurals.pref_clear_subscriptions_summary,
count, count));
MainApplication.getInstance().settings.setSubscriptionsClear(true);
return true;
}
});
}
((EditTextPreference) getPreferenceManager().findPreference(getString(R.string.pref_key_download_dir))).
getEditText().setHint(MainApplication.getInstance().settings.getDefaultDownloadDir().getAbsolutePath());
final Preference clearCachePreference = getPreferenceManager().findPreference(getString(R.string.pref_key_clear_cache));
clearCachePreference.setSummary(getString(R.string.pref_clear_cache_summary, MainApplication.getInstance().fileCache.getCurrentSizeMB()));
clearCachePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
final ProgressDialog progressDlg = ProgressDialog.show(PreferencesActivity.this, null, getString(R.string.dialog_wait));
Async.runAsync(new Runnable() {
@Override
public void run() {
MainApplication.getInstance().fileCache.clearCache();
runOnUiThread(new Runnable() {
@Override
public void run() {
progressDlg.dismiss();
clearCachePreference.setSummary(getString(R.string.pref_clear_cache_summary,
MainApplication.getInstance().fileCache.getCurrentSizeMB()));
}
});
}
});
}
}
};
new AlertDialog.Builder(PreferencesActivity.this).
setMessage(R.string.pref_clear_cache_confirmation).
setPositiveButton(android.R.string.yes, dialogClickListener).
setNegativeButton(android.R.string.no, null).
show();
return true;
}
});
Preference aboutPreference = getPreferenceManager().findPreference(getString(R.string.pref_key_about_version));
try {
String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
aboutPreference.setSummary(versionName);
} catch (Exception e) {}
if (MainApplication.getInstance().settings.enableAppUpdateCheck()) {
aboutPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
AppUpdatesChecker.checkForUpdates(PreferencesActivity.this);
return true;
}
});
}
Preference licensePreference = getPreferenceManager().findPreference(getString(R.string.pref_key_about_license));
licensePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
UrlHandler.launchExternalBrowser(PreferencesActivity.this, "https://www.gnu.org/licenses/gpl-3.0.html");
return true;
}
});
Preference certificatesPreference = getPreferenceManager().findPreference(getString(R.string.pref_key_ssl_certificates));
if (CertificatesActivity.hasCertificates()) {
certificatesPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
startActivity(new Intent(PreferencesActivity.this, CertificatesActivity.class));
return true;
}
});
} else {
((PreferenceGroup) getPreferenceManager().findPreference(getString(R.string.pref_key_cat_advanced))).
removePreference(certificatesPreference);
}
getPreferenceManager().findPreference(getString(R.string.pref_key_autohide)).setOnPreferenceClickListener(
new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
startActivity(new Intent(PreferencesActivity.this, AutohideActivity.class));
return true;
}
});
getPreferenceManager().findPreference(getString(R.string.pref_key_cache_maxsize)).setOnPreferenceChangeListener(
new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
int newSize;
try {
newSize = Integer.parseInt(newValue.toString());
} catch (NumberFormatException e) {
newSize = 50;
}
MainApplication.getInstance().fileCache.setMaxSize(newSize * 1024 * 1024);
clearCachePreference.setSummary(getString(R.string.pref_clear_cache_summary,
MainApplication.getInstance().fileCache.getCurrentSizeMB()));
return true;
}
});
getPreferenceManager().findPreference(getString(R.string.pref_key_autoupdate_delay)).setOnPreferenceChangeListener(
new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String newValueStr = newValue.toString();
if (newValueStr.length() == 0) return true;
try {
int intVal = Integer.parseInt(newValueStr);
if (intVal < 30) throw new NumberFormatException();
return true;
} catch (NumberFormatException e) {
Toast.makeText(PreferencesActivity.this, R.string.pref_autoupdate_delay_incorrect, Toast.LENGTH_LONG).show();
return false;
}
}
});
getPreferenceManager().findPreference(getString(R.string.pref_key_theme)).setOnPreferenceChangeListener(
new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (getString(R.string.pref_theme_value_custom).equals(newValue)) {
startActivity(new Intent(PreferencesActivity.this, CustomThemeListActivity.class));
return false;
}
return true;
}
});
sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Preference preference = getPreferenceManager().findPreference(key);
if (preference instanceof ListPreference) {
updateListSummary(key);
} else {
for (int autoupdateKey : KEYS_AUTOUPDATE) {
if (getString(autoupdateKey).equals(key)) {
if (TabsTrackerService.isRunning())
stopService(new Intent(PreferencesActivity.this, TabsTrackerService.class));
if (MainApplication.getInstance().settings.isAutoupdateEnabled())
startService(new Intent(PreferencesActivity.this, TabsTrackerService.class));
}
}
if (getString(R.string.pref_key_show_nsfw_boards).equals(key)) {
if (MainApplication.getInstance().tabsSwitcher.currentFragment instanceof BoardsListFragment) {
((BoardsListFragment) MainApplication.getInstance().tabsSwitcher.currentFragment).updateList();
}
} else if (getString(R.string.pref_key_show_all_chans_list).equals(key)) {
if (MainApplication.getInstance().tabsSwitcher.currentFragment instanceof NewTabFragment) {
((NewTabFragment) MainApplication.getInstance().tabsSwitcher.currentFragment).updateList();
}
}
}
}
};
if (MainApplication.getInstance().settings.isSFWRelease()) {
Preference p = getPreferenceManager().findPreference(getString(R.string.pref_key_show_all_chans_list));
((PreferenceGroup) getPreferenceManager().findPreference(getString(R.string.pref_key_cat_advanced))).removePreference(p);
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD_MR1) {
Preference p = getPreferenceManager().findPreference(getString(R.string.pref_key_gallery_scaleimageview));
((PreferenceGroup) getPreferenceManager().findPreference(getString(R.string.pref_key_gallery_screen))).removePreference(p);
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
Preference p = getPreferenceManager().findPreference(getString(R.string.pref_key_gallery_fullscreen));
((PreferenceGroup) getPreferenceManager().findPreference(getString(R.string.pref_key_gallery_screen))).removePreference(p);
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
Preference p = getPreferenceManager().findPreference(getString(R.string.pref_key_hide_actionbar_on_scroll));
((PreferenceGroup) getPreferenceManager().findPreference(getString(R.string.pref_key_cat_appearance))).removePreference(p);
}
if (!MainApplication.getInstance().settings.isRealTablet()) {
Preference pHide = getPreferenceManager().findPreference(getString(R.string.pref_key_sidepanel_hide));
Preference pWidth = getPreferenceManager().findPreference(getString(R.string.pref_key_sidepanel_width));
Preference pRight = getPreferenceManager().findPreference(getString(R.string.pref_key_sidepanel_right));
PreferenceGroup appearanceGroup = (PreferenceGroup) getPreferenceManager().findPreference(getString(R.string.pref_key_cat_appearance));
appearanceGroup.removePreference(pHide);
appearanceGroup.removePreference(pWidth);
appearanceGroup.removePreference(pRight);
} else {
updateListSummary(R.string.pref_key_sidepanel_width);
}
}
@Override
protected void onResume() {
super.onResume();
sharedPreferences.registerOnSharedPreferenceChangeListener(this.sharedPreferenceChangeListener);
if (needUpdateChansScreen) {
updateChansScreen((PreferenceScreen) getPreferenceManager().findPreference(getString(R.string.pref_key_cat_chans)));
}
ListPreference themePreference = ((ListPreference) getPreferenceManager().findPreference(getString(R.string.pref_key_theme)));
String currentValue = sharedPreferences.getString(getString(R.string.pref_key_theme), "");
if (!currentValue.equals("") && !currentValue.equals(themePreference.getValue())) {
themePreference.setValue(currentValue);
updateListSummary(R.string.pref_key_theme);
}
}
@Override
protected void onPause() {
super.onPause();
sharedPreferences.unregisterOnSharedPreferenceChangeListener(this.sharedPreferenceChangeListener);
}
private void updateListSummary(int prefKeyId) {
this.updateListSummary(this.getString(prefKeyId));
}
private void updateListSummary(String prefKey) {
ListPreference preference = (ListPreference) getPreferenceManager().findPreference(prefKey);
preference.setSummary(preference.getEntry());
}
private void updateChansScreen(final PreferenceScreen chansCat) {
needUpdateChansScreen = false;
chansCat.removeAll();
Preference enterUrl = new Preference(this);
enterUrl.setTitle(R.string.pref_chans_enter_url);
enterUrl.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
final EditText inputField = new EditText(PreferencesActivity.this);
inputField.setSingleLine();
inputField.setHint(R.string.pref_chans_enter_url_hint);
inputField.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI);
DialogInterface.OnClickListener dlgOnClick = new DialogInterface.OnClickListener() {
private boolean openPreference(String key) {
try {
ListAdapter adapter = chansCat.getRootAdapter();
for (int i=0, size=adapter.getCount(); i<size; ++i) {
Object object = adapter.getItem(i);
if (!(object instanceof Preference)) continue;
Preference preference = (Preference) object;
if (key.equals(preference.getKey())) {
chansCat.onItemClick(null, null, i, 0);
return true;
}
}
} catch (Exception e) {
Logger.e(TAG, e);
}
return false;
}
@Override
public void onClick(final DialogInterface dialog, final int which) {
String url = inputField.getText().toString();
if (url == null || url.length() == 0) return;
UrlPageModel model = UrlHandler.getPageModel(url);
if (model == null || model.chanName == null) {
Toast.makeText(PreferencesActivity.this, R.string.pref_chans_enter_url_incorrect, Toast.LENGTH_LONG).show();
} else {
final String key = "chan_preference_screen_" + model.chanName;
if (openPreference(key)) return;
updateChansScreen(chansCat);
//need wait for Root Adapter synchronization (it will be called from UI thread)
Async.runAsync(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(200);
PreferencesActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
openPreference(key);
}
});
} catch (Exception e) {
Logger.e(TAG, e);
}
}
});
}
}
};
new AlertDialog.Builder(PreferencesActivity.this).
setTitle(R.string.pref_chans_enter_url).
setView(inputField).
setPositiveButton(android.R.string.ok, dlgOnClick).
create().
show();
return true;
}
});
chansCat.addPreference(enterUrl);
ApplicationSettings settings = MainApplication.getInstance().settings;
int visibleChansCount = 0;
for (ChanModule chan : MainApplication.getInstance().chanModulesList) {
if (!settings.isUnlockedChan(chan.getChanName())) continue;
PreferenceScreen curScreen = getPreferenceManager().createPreferenceScreen(this);
curScreen.setTitle(chan.getDisplayingName());
curScreen.setKey("chan_preference_screen_" + chan.getChanName());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
CompatibilityImpl.setIcon(curScreen, chan.getChanFavicon());
}
chansCat.addPreference(curScreen);
chan.addPreferencesOnScreen(curScreen);
++visibleChansCount;
}
if (visibleChansCount >= 2) {
Preference rearrange = new Preference(this);
rearrange.setTitle(R.string.pref_chans_rearrange);
rearrange.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
startActivity(new Intent(PreferencesActivity.this, ChansSortActivity.class));
return true;
}
});
chansCat.addPreference(rearrange);
}
}
}