/* * Copyright 2016 Gleb Godonoga. * * 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 com.andrada.sitracker.ui; import android.annotation.SuppressLint; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceFragment; import android.support.v7.widget.Toolbar; import android.view.View; import com.afollestad.materialdialogs.MaterialDialog; import com.andrada.sitracker.Constants; import com.andrada.sitracker.R; import com.andrada.sitracker.analytics.AnalyticsManager; import com.andrada.sitracker.analytics.FBAEvent; import com.andrada.sitracker.contracts.SIPrefs_; import com.andrada.sitracker.events.AuthorSortMethodChanged; import com.andrada.sitracker.tasks.ClearPublicationCacheTask; import com.andrada.sitracker.tasks.UpdateAuthorsTask_; import com.andrada.sitracker.util.ShareHelper; import com.google.firebase.analytics.FirebaseAnalytics; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.SystemService; import org.androidannotations.annotations.sharedpreferences.Pref; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import de.greenrobot.event.EventBus; @SuppressLint("Registered") @EActivity(R.layout.activity_settings) public class SettingsActivity extends BaseActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { getFragmentManager().beginTransaction() .add(R.id.container, SettingsActivity_.SettingsFragment_.builder().build()) .commit(); } } @AfterViews protected void afterViews() { Toolbar toolbar = getActionBarToolbar(); toolbar.setTitle(R.string.title_settings); toolbar.setNavigationIcon(R.drawable.ic_up); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { navigateUpOrBack(SettingsActivity.this, SiMainActivity_.class); } }); } @EFragment public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener, DirectoryChooserController.DirectoryChooserResultListener { private DirectoryChooserController dirChooserController; @NotNull public static final String PREF_NAME = "SIPrefs"; @Nullable private final Preference.OnPreferenceClickListener clickListener = new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { Intent updateIntent = new Intent(getActivity().getApplicationContext(), ClearPublicationCacheTask.class); getActivity().getApplicationContext().startService(updateIntent); return true; } }; private final Preference.OnPreferenceClickListener dirChooserClickListener = new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { dirChooserController.showDialog(SettingsFragment.this); return true; } }; @SystemService AlarmManager alarmManager; @Pref SIPrefs_ prefs; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getPreferenceManager().setSharedPreferencesName(PREF_NAME); if (getActivity().getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { addPreferencesFromResource(R.xml.preferences); } else { addPreferencesFromResource(R.xml.preferences_no3g); } setUpdateIntervalSummary(prefs.updateInterval().get()); setAuthorSortSummary(prefs.authorsSortType().get()); setDownloadFolderSummary(prefs.downloadFolder().get()); dirChooserController = new DirectoryChooserController(getActivity(), prefs.downloadFolder().get(), true); dirChooserController.setListener(this); } @Override public void onResume() { super.onResume(); getActivity().getSharedPreferences(Constants.SI_PREF_NAME, MODE_MULTI_PROCESS).registerOnSharedPreferenceChangeListener(this); Preference pref = findPreference(Constants.PREF_CLEAR_SAVED_PUBS_KEY); if (pref != null) { pref.setOnPreferenceClickListener(clickListener); } Preference dirChooserPref = findPreference(Constants.CONTENT_DOWNLOAD_FOLDER_KEY); if (dirChooserPref != null) { dirChooserPref.setOnPreferenceClickListener(dirChooserClickListener); } } @Override public void onPause() { super.onPause(); getActivity().getSharedPreferences(Constants.SI_PREF_NAME, MODE_MULTI_PROCESS).unregisterOnSharedPreferenceChangeListener(this); Preference pref = findPreference(Constants.PREF_CLEAR_SAVED_PUBS_KEY); if (pref != null) { pref.setOnPreferenceClickListener(null); } } @Override public void onDirectoryChooserResult(int resultCode, String absoluteDir) { if (resultCode == DirectoryChooserController.RESULT_CODE_DIR_SELECTED) { SharedPreferences.Editor editor = getPreferenceManager().getSharedPreferences().edit(); editor.putString(Constants.CONTENT_DOWNLOAD_FOLDER_KEY, absoluteDir); editor.apply(); setDownloadFolderSummary(absoluteDir); } } @Override public void onSharedPreferenceChanged(SharedPreferences preference, String key) { Intent intent = UpdateAuthorsTask_.intent(this.getActivity().getApplicationContext()).get(); PendingIntent pi = PendingIntent.getService(this.getActivity().getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); if (Constants.UPDATES_ENABLED_KEY.equals(key)) { Boolean isSyncing = prefs.updatesEnabled().get(); if (!isSyncing) { alarmManager.cancel(pi); } } else if (Constants.UPDATE_INTERVAL_KEY.equals(key)) { alarmManager.cancel(pi); long updateInterval = Long.parseLong(prefs.updateInterval().get()); alarmManager.setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis(), updateInterval, pi); setUpdateIntervalSummary(prefs.updateInterval().get()); FBAEvent event = new FBAEvent(Constants.GA_EVENT_CHANGED_UPDATE_INTERVAL); event.getParamMap().put(FirebaseAnalytics.Param.VALUE, prefs.updateInterval().get()); AnalyticsManager.getInstance().logEvent(event); } else if (Constants.AUTHOR_SORT_TYPE_KEY.equals(key)) { EventBus.getDefault().post(new AuthorSortMethodChanged()); setAuthorSortSummary(prefs.authorsSortType().get()); } else if (Constants.CONTENT_DOWNLOAD_FOLDER_KEY.equals(key)) { String path = prefs.downloadFolder().get(); //Perform validation if (ShareHelper.getExternalDirectoryBasedOnPath(path) != null) { setDownloadFolderSummary(path); } else { final MaterialDialog.Builder builder = new MaterialDialog.Builder( this.getActivity()); builder.title("Invalid directory"); builder.content("Your directory is invalid"); builder.positiveText(android.R.string.ok); builder.show(); } } else if (Constants.PREF_USAGE_OPT_OUT_KEY.equals(key)) { AnalyticsManager.getInstance().setOptOut(prefs.optOutUsageStatistics().get()); } } private void setDownloadFolderSummary(@Nullable String newValue) { Preference pref = findPreference(Constants.CONTENT_DOWNLOAD_FOLDER_KEY); if (newValue == null || newValue.length() == 0) { pref.setSummary(getResources().getString(R.string.pref_content_download_summ)); } else { pref.setSummary(getResources().getString(R.string.pref_content_download_summ_short) + " " + newValue); } } private void setUpdateIntervalSummary(String newValue) { ListPreference updateInterval = (ListPreference) findPreference(Constants.UPDATE_INTERVAL_KEY); // Set summary to be the user-description for the selected value int index = updateInterval.findIndexOfValue(newValue); if (index >= 0 && index < updateInterval.getEntries().length) updateInterval.setSummary(updateInterval.getEntries()[index]); } private void setAuthorSortSummary(String newValue) { ListPreference authorsSortType = (ListPreference) findPreference(Constants.AUTHOR_SORT_TYPE_KEY); int sortType = Integer.parseInt(newValue); authorsSortType.setSummary(authorsSortType.getEntries()[sortType]); } } }