package com.fastaccess.ui.modules.settings.category; import android.Manifest; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceFragmentCompat; import android.util.Log; import android.widget.FrameLayout; import android.widget.Toast; import com.fastaccess.BuildConfig; import com.fastaccess.R; import com.fastaccess.data.dao.model.Release; import com.fastaccess.data.dao.model.Repo; import com.fastaccess.helper.ActivityHelper; import com.fastaccess.helper.FileHelper; import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.PrefGetter; import com.fastaccess.helper.PrefHelper; import com.fastaccess.provider.tasks.notification.NotificationSchedulerJobTask; import com.fastaccess.ui.base.mvp.BaseMvp; import com.fastaccess.ui.modules.changelog.ChangelogBottomSheetDialog; import com.fastaccess.ui.widgets.SpannableBuilder; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import java.util.Set; import butterknife.BindView; import es.dmoral.toasty.Toasty; import static android.app.Activity.RESULT_OK; public class SettingsCategoryFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceChangeListener { @BindView(R.id.settingsContainer) FrameLayout settingsContainer; private static int PERMISSION_REQUEST_CODE = 128; private static int RESTORE_REQUEST_CODE = 256; private BaseMvp.FAView callback; private String appTheme; private String appColor; private String app_lauguage; private Preference signatureVia; private Preference notificationTime; private Preference notificationRead; private Preference notificationSound; @Override public void onAttach(Context context) { super.onAttach(context); this.callback = (BaseMvp.FAView) context; appTheme = PrefHelper.getString("appTheme"); appColor = PrefHelper.getString("appColor"); app_lauguage = PrefHelper.getString("app_language"); } @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { int settings = getActivity().getIntent().getExtras().getInt("settings", 0); switch (settings) { case 0: addPreferencesFromResource(R.xml.notification_settings); notificationTime = findPreference("notificationTime"); notificationRead = findPreference("markNotificationAsRead"); notificationSound = findPreference("notificationSound"); findPreference("notificationTime").setOnPreferenceChangeListener(this); findPreference("notificationEnabled").setOnPreferenceChangeListener(this); if(!PrefHelper.getBoolean("notificationEnabled")) { getPreferenceScreen().removePreference(notificationTime); getPreferenceScreen().removePreference(notificationRead); getPreferenceScreen().removePreference(notificationSound); } break; case 1: addPreferencesFromResource(R.xml.behaviour_settings); findPreference("sent_via_enabled").setOnPreferenceChangeListener(this); signatureVia = findPreference("sent_via"); if(PrefHelper.getBoolean("sent_via_enabled")) getPreferenceScreen().removePreference(signatureVia); break; case 2: addPreferencesFromResource(R.xml.customization_settings); if (BuildConfig.FDROID) { findPreference("enable_ads").setVisible(false); } findPreference("recylerViewAnimation").setOnPreferenceChangeListener(this); findPreference("rect_avatar").setOnPreferenceChangeListener(this); findPreference("appTheme").setOnPreferenceChangeListener(this); findPreference("appColor").setOnPreferenceChangeListener(this); break; case 3: addPreferencesFromResource(R.xml.about_settings); findPreference("showChangelog").setOnPreferenceClickListener(preference -> { new ChangelogBottomSheetDialog().show(getChildFragmentManager(), "ChangelogBottomSheetDialog"); return true; }); findPreference("joinSlack").setOnPreferenceClickListener(preference -> { ActivityHelper.startCustomTab(getActivity(), "http://rebrand.ly/fasthub"); return true; }); findPreference("currentVersion").setSummary(SpannableBuilder.builder() .append(getString(R.string.current_version)) .append("(") .bold(BuildConfig.VERSION_NAME) .append(")")); findPreference("currentVersion").setOnPreferenceClickListener(preference -> { Release.get("FastHub", "k0shk0sh").subscribe(releases -> { if(releases.get(0).getTagName().equals(BuildConfig.VERSION_NAME)) Toasty.success(getContext(), getString(R.string.up_to_date)).show(); else Toasty.warning(getContext(), getString(R.string.new_version)).show(); }); return true; }); break; case 4: addPreferencesFromResource(R.xml.backup_settings); findPreference("backup").setOnPreferenceClickListener((Preference preference) -> { if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { Map<String, ?> settings_ = PrefHelper.getAll(); settings_.remove("token"); String json = new Gson().toJson(settings_); String path = Environment.getExternalStorageDirectory() + File.separator + "FastHub"; File folder = new File(path); folder.mkdirs(); File backup = new File(folder, "backup.json"); try { backup.createNewFile(); FileOutputStream outputStream = new FileOutputStream(backup); OutputStreamWriter myOutWriter = new OutputStreamWriter(outputStream); myOutWriter.append(json); myOutWriter.close(); outputStream.flush(); outputStream.close(); } catch (IOException e) { Log.e(getTag(), "Couldn't backup: " + e.toString()); } PrefHelper.set("backed_up", new SimpleDateFormat("MM/dd").format(new Date())); } else { requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE); } return true; }); if(PrefHelper.getString("backed_up")!=null) findPreference("backup").setSummary(getString(R.string.backup_summary, PrefHelper.getString("backed_up"))); else findPreference("backup").setSummary(""); findPreference("restore").setOnPreferenceClickListener(preference -> { if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { showFileChooser(); } else { requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE); } return true; }); break; default: addPreferencesFromResource(R.xml.fasthub_settings); break; } } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (preference.getKey().equalsIgnoreCase("notificationEnabled")) { if ((boolean)newValue) { getPreferenceScreen().addPreference(notificationTime); getPreferenceScreen().addPreference(notificationRead); getPreferenceScreen().addPreference(notificationSound); NotificationSchedulerJobTask.scheduleJob(getActivity().getApplicationContext(), PrefGetter.notificationDurationMillis(getActivity().getApplicationContext(), PrefHelper.getString("notificationTime")), true); } else { getPreferenceScreen().removePreference(notificationTime); getPreferenceScreen().removePreference(notificationRead); getPreferenceScreen().removePreference(notificationSound); NotificationSchedulerJobTask.scheduleJob(getActivity().getApplicationContext(), -1, true); } return true; } else if (preference.getKey().equalsIgnoreCase("notificationTime")) { NotificationSchedulerJobTask.scheduleJob(getActivity().getApplicationContext(), PrefGetter.notificationDurationMillis(getActivity().getApplicationContext(), (String) newValue), true); return true; } else if (preference.getKey().equalsIgnoreCase("recylerViewAnimation")) { callback.onThemeChanged(); return true; } else if (preference.getKey().equalsIgnoreCase("rect_avatar")) { callback.onThemeChanged(); return true; } else if (preference.getKey().equalsIgnoreCase("appTheme")) { if (newValue.toString().equalsIgnoreCase(appTheme)) return true; Toasty.warning(getContext(), getString(R.string.change_theme_warning), Toast.LENGTH_LONG).show(); callback.onThemeChanged(); return true; } else if (preference.getKey().equalsIgnoreCase("appColor")) { if (newValue.toString().equalsIgnoreCase(appColor)) return true; Toasty.warning(getContext(), getString(R.string.change_theme_warning), Toast.LENGTH_LONG).show(); callback.onThemeChanged(); return true; } else if (preference.getKey().equalsIgnoreCase("app_language")) { if (newValue.toString().equalsIgnoreCase(app_lauguage)) return true; callback.onThemeChanged(); return true; } else if (preference.getKey().equalsIgnoreCase("sent_via_enabled")) { if((boolean)newValue) getPreferenceScreen().removePreference(signatureVia); else getPreferenceScreen().addPreference(signatureVia); return true; } return false; } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode==PERMISSION_REQUEST_CODE) { if (permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Map<String, ?> settings = PrefHelper.getAll(); settings.remove("token"); String json = new Gson().toJson(settings); String path = Environment.getExternalStorageDirectory() + File.separator + "FastHub"; File folder = new File(path); folder.mkdirs(); File backup = new File(folder, "backup.json"); try { backup.createNewFile(); FileOutputStream outputStream = new FileOutputStream(backup); OutputStreamWriter myOutWriter = new OutputStreamWriter(outputStream); myOutWriter.append(json); myOutWriter.close(); outputStream.flush(); outputStream.close(); } catch (IOException e) { Log.e(getTag(), "Couldn't backup: " + e.toString()); } PrefHelper.set("backed_up", new SimpleDateFormat("MM/dd").format(new Date())); findPreference("backup").setSummary(getString(R.string.backup_summary, getString(R.string.now))); Toasty.success(getContext(), getString(R.string.backed_up)).show(); } else { Toasty.error(getContext(), getString(R.string.permission_failed)).show(); } } else if (permissions[0].equals(Manifest.permission.READ_EXTERNAL_STORAGE)) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { showFileChooser(); } else { Toasty.error(getContext(), getString(R.string.permission_failed)).show(); } } } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode==RESTORE_REQUEST_CODE) { if (resultCode == RESULT_OK) { StringBuilder json = new StringBuilder(); try { InputStream inputStream = getContext().getContentResolver().openInputStream(data.getData()); BufferedReader reader = new BufferedReader(new InputStreamReader( inputStream)); String line; while ((line = reader.readLine()) != null) { json.append(line); } reader.close(); inputStream.close(); }catch (IOException e) { Toasty.error(getContext(), getString(R.string.error)).show(); } Gson gson = new Gson(); JsonObject jsonObject = gson.fromJson(json.toString(), JsonObject.class); Set<Map.Entry<String, JsonElement>> entrySet = jsonObject.entrySet(); for(Map.Entry<String,JsonElement> entry : entrySet){ if (entry.getValue().getAsJsonPrimitive().isBoolean()) PrefHelper.set(entry.getKey(), entry.getValue().getAsBoolean()); else if (entry.getValue().getAsJsonPrimitive().isNumber()) PrefHelper.set(entry.getKey(), entry.getValue().getAsNumber().intValue()); else if (entry.getValue().getAsJsonPrimitive().isString()) PrefHelper.set(entry.getKey(), entry.getValue().getAsString()); PrefHelper.set(entry.getKey(), entry.getValue()); Log.d(getTag(), entry.getKey() + ": " + entry.getValue()); } callback.onThemeChanged(); } } } private void showFileChooser() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("application/json"); startActivityForResult(Intent.createChooser(intent, getString(R.string.select_backup)), RESTORE_REQUEST_CODE); } }