package org.indywidualni.fblite.fragment;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.widget.Toast;
import org.indywidualni.fblite.MyApplication;
import org.indywidualni.fblite.R;
import org.indywidualni.fblite.activity.MainActivity;
import org.indywidualni.fblite.service.NotificationsService;
import org.indywidualni.fblite.util.FileOperation;
public class SettingsFragment extends PreferenceFragment implements Preference.OnPreferenceClickListener {
private static final String TAG = SettingsFragment.class.getSimpleName();
private static final int REQUEST_STORAGE = 1;
@SuppressLint("StaticFieldLeak")
private static Context context;
private SharedPreferences.OnSharedPreferenceChangeListener prefChangeListener;
private SharedPreferences preferences;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
// get context
context = MyApplication.getContextOfApplication();
// get Tray Preferences and Shared Preferences
preferences = PreferenceManager.getDefaultSharedPreferences(context);
// set onPreferenceClickListener for a few preferences
Preference notificationsSettingsPref = findPreference("notifications_settings");
Preference clearCachePref = findPreference("clear_cache");
notificationsSettingsPref.setOnPreferenceClickListener(this);
clearCachePref.setOnPreferenceClickListener(this);
// dependencies (dark_theme cannot be enabled when basic_mode is enabled)
Preference preference_dark = findPreference("dark_theme");
preference_dark.setEnabled(!preferences.getBoolean("basic_mode", false));
Preference preference_basic = findPreference("basic_mode");
preference_basic.setEnabled(!preferences.getBoolean("dark_theme", false) && !preferences.getBoolean("touch_mode", false));
Preference preference_touch = findPreference("touch_mode");
preference_touch.setEnabled(!preferences.getBoolean("basic_mode", false));
// listener for changing preferences (works after the value change)
prefChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
// service intent (start, stop)
final Intent intent = new Intent(context, NotificationsService.class);
switch (key) {
case "notifications_activated":
if (prefs.getBoolean("notifications_activated", false) && preferences.getBoolean("message_notifications", false)) {
context.stopService(intent);
context.startService(intent);
} else //noinspection StatementWithEmptyBody
if (!prefs.getBoolean("notifications_activated", false) && preferences.getBoolean("message_notifications", false)) {
// ignore this case
} else if (prefs.getBoolean("notifications_activated", false) && !preferences.getBoolean("message_notifications", false)) {
context.startService(intent);
} else
context.stopService(intent);
break;
case "message_notifications":
if (prefs.getBoolean("message_notifications", false) && preferences.getBoolean("notifications_activated", false)) {
context.stopService(intent);
context.startService(intent);
} else //noinspection StatementWithEmptyBody
if (!prefs.getBoolean("message_notifications", false) && preferences.getBoolean("notifications_activated", false)) {
// ignore this case
} else if (prefs.getBoolean("message_notifications", false) && !preferences.getBoolean("notifications_activated", false)) {
context.startService(intent);
} else
context.stopService(intent);
break;
case "basic_mode":
Preference preference_dark = findPreference("dark_theme");
preference_dark.setEnabled(!prefs.getBoolean("basic_mode", false));
Preference preference_touch = findPreference("touch_mode");
preference_touch.setEnabled(!prefs.getBoolean("basic_mode", false));
break;
case "touch_mode":
Preference preference_basic = findPreference("basic_mode");
preference_basic.setEnabled(!prefs.getBoolean("touch_mode", false));
break;
case "dark_theme":
Preference basic = findPreference("basic_mode");
basic.setEnabled(!prefs.getBoolean("dark_theme", false));
break;
case "file_logging":
if (prefs.getBoolean("file_logging", false))
requestStoragePermission();
break;
case "font_size":
try {
//noinspection ResultOfMethodCallIgnored
Integer.valueOf(prefs.getString("font_size", "100"));
} catch (NumberFormatException e) {
prefs.edit().remove("font_size").apply();
}
break;
case "transparent_nav":
case "drawer_pos":
case "no_images":
case "keyboard_fix":
case "hardware_acceleration":
case "custom_user_agent":
relaunch();
break;
}
// what's going on, dude?
Log.v("SharedPreferenceChange", key + " changed in SettingsFragment");
}
};
}
// a few preferences are just buttons to click on, let's make them work
@Override
public boolean onPreferenceClick(Preference preference) {
String key = preference.getKey();
Log.v("OnPreferenceClick", key + " clicked in SettingsFragment");
switch (key) {
case "notifications_settings":
//noinspection ResourceType
getFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.slide_in_right, 0)
.addToBackStack(null).replace(R.id.content_frame,
new NotificationsSettingsFragment()).commit();
return true;
case "clear_cache":
// clear cache dirs
FileOperation.deleteCache(getActivity().getApplicationContext());
// restart the app (really ugly way of doing it but...)
android.os.Process.killProcess(android.os.Process.myPid());
return true;
}
return false;
}
@Override
public void onResume() {
super.onResume();
// register the listener
preferences.registerOnSharedPreferenceChangeListener(prefChangeListener);
}
@Override
public void onPause() {
super.onPause();
// unregister the listener
preferences.unregisterOnSharedPreferenceChangeListener(prefChangeListener);
}
// relaunch the app
private void relaunch() {
// notify user about relaunching the app
Toast.makeText(getActivity(), getString(R.string.applying_changes), Toast.LENGTH_SHORT).show();
// sending intent to onNewIntent() of MainActivity
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.putExtra("core_settings_changed", true);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
// request storage permission
private void requestStoragePermission() {
String storagePermission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
int hasPermission = ContextCompat.checkSelfPermission(context, storagePermission);
String[] permissions = new String[] { storagePermission };
if (hasPermission != PackageManager.PERMISSION_GRANTED) {
Log.e(TAG, "No storage permission at the moment. Requesting...");
ActivityCompat.requestPermissions(getActivity(), permissions, REQUEST_STORAGE);
} else
Log.e(TAG, "We already have storage permission. Yay!");
}
}