/* * Copyright 2013 Dmitry Monakhov. * * 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 monakhv.android.samlib; import android.accounts.Account; import android.accounts.AccountManager; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; import android.preference.*; import android.support.v4.app.NavUtils; import android.util.Log; import android.view.MenuItem; import com.google.android.gms.auth.GoogleAuthUtil; import com.google.android.gms.common.AccountPicker; import java.util.Arrays; import java.util.List; import monakhv.android.samlib.data.SettingsHelper; import monakhv.samlib.db.TagController; import monakhv.samlib.db.entity.SamLibConfig; import monakhv.samlib.db.entity.Tag; /** * @author monakhv */ public class SamlibPreferencesFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener, Preference.OnPreferenceChangeListener { private static final String DEBUG_TAG = "SamlibPreferencesA"; private static final int REQ_AUTH = 11; private final String[] autoSummaryFields = {"pref_key_update_Period", "pref_key_proxy_host", "pref_key_proxy_port", "pref_key_proxy_user", "pref_key_update_autoload_limit", "pref_key_book_lifetime", "pref_key_author_order", "pref_key_book_order", "pref_key_file_format", "pref_key_theme", "pref_key_mirror", "pref_key_directory", "pref_key_update_tag"}; private List<String> autoSumKeys; private RingtonePreference ringtonePref; Preference googlePrefs; private EditTextPreference storageDir; private MyBaseAbstractFragment.DaggerCaller mCallbacks; /** * Called when the activity is first created. * * @param icicle Bundle */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); mCallbacks.getSettingsHelper().getDataDirectoryPath();//just to make sure that preference is loaded getPreferenceManager().setSharedPreferencesName( SettingsHelper.PREFS_NAME); addPreferencesFromResource(R.xml.prefs); autoSumKeys = Arrays.asList(autoSummaryFields); ringtonePref = (RingtonePreference) findPreference(getString(R.string.pref_key_notification_ringtone)); googlePrefs = findPreference(getString(R.string.pref_key_google_account)); storageDir = (EditTextPreference) findPreference(getString(R.string.pref_key_directory)); // storageDir.setOnPreferenceChangeListener( new Preference.OnPreferenceChangeListener() { // @Override // public boolean onPreferenceChange(Preference preference, Object newValue) { // return helper.isDirectoryWritable ((String )newValue); // } // }); googlePrefs.setSummary(mCallbacks.getSettingsHelper().getGoogleAccount()); googlePrefs.setOnPreferenceClickListener(preference -> { String email = mCallbacks.getSettingsHelper().getGoogleAccount(); Account curAccount = (email == null) ? null : new Account(email, GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE); Intent intent = AccountPicker.newChooseAccountIntent(curAccount, null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, false, null, null, null, null); startActivityForResult(intent, REQ_AUTH); return true; }); ListPreference updateTagPref = (ListPreference) findPreference(getString(R.string.pref_key_update_tag)); TagController tagCtl = mCallbacks.getAuthorController().getTagController(); List<Tag> tags = tagCtl.getAll(); CharSequence[] entries = new CharSequence[1 + tags.size()]; CharSequence[] entryValues = new CharSequence[1 + tags.size()]; entryValues[0] = Integer.toString(SamLibConfig.TAG_AUTHOR_ALL); entries[0] = getActivity().getString(R.string.pref_update_all_title); int i = 1; for (Tag tag : tags) { entryValues[i] = Integer.toString(tag.getId()); entries[i] = tag.getName(); ++i; } updateTagPref.setEntries(entries); updateTagPref.setEntryValues(entryValues); updateTagPref.setValue(mCallbacks.getSettingsHelper().getUpdateTag()); } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (!(activity instanceof MyBaseAbstractFragment.DaggerCaller)) { throw new IllegalStateException( "Activity must implement fragment's callbacks."); } mCallbacks = (MyBaseAbstractFragment.DaggerCaller) activity; } @Override public void onActivityResult(int requestCode, int resultCode, Intent it) { super.onActivityResult(requestCode, resultCode, it); if (it == null) { return; } switch (requestCode) { case REQ_AUTH: mCallbacks.getSettingsHelper().setGoogleAccount(it.getStringExtra(AccountManager.KEY_ACCOUNT_NAME)); googlePrefs.setSummary(mCallbacks.getSettingsHelper().getGoogleAccount()); break; } } public void makeResume() { super.onResume(); mCallbacks.getSettingsHelper().registerListener(); getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); Log.d(DEBUG_TAG, "onResume"); for (String key : autoSumKeys) { updateSummary(key); } // A patch to overcome OnSharedPreferenceChange not being called by RingtonePreference bug ringtonePref.setOnPreferenceChangeListener(this); updateRingtoneSummary(ringtonePref, mCallbacks.getSettingsHelper().getNotificationRingToneURI()); storageDir.setOnPreferenceChangeListener(this); applyGoogleProxyDependencies(); } public void makePause() { super.onPause(); mCallbacks.getSettingsHelper().updateService(); mCallbacks.getSettingsHelper().unRegisterListener(); //if http instance already exist make sure we have right proxy settings final SamlibApplication samlibApplication = (SamlibApplication) getActivity().getApplication(); samlibApplication.getApplicationComponent().getHttpClientController().setProxyData(mCallbacks.getSettingsHelper().getProxy()); Log.d(DEBUG_TAG, "onPause"); getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); } private void updateSummary(String key) { if (key.equals(getString(R.string.pref_key_directory))) { EditTextPreference pr = (EditTextPreference) getPreferenceScreen().findPreference(key); pr.setSummary(mCallbacks.getSettingsHelper().getDataDirectoryPath()); return; } if (autoSumKeys.contains(key)) { Preference pr = getPreferenceScreen().findPreference(key); if (pr instanceof ListPreference) { final ListPreference currentPreference = (ListPreference) pr; currentPreference.setSummary(currentPreference.getEntry()); } else if (pr instanceof EditTextPreference) { final EditTextPreference currentPreference = (EditTextPreference) pr; currentPreference.setSummary(currentPreference.getText()); } } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(getActivity()); return true; } return super.onOptionsItemSelected(item); } public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { updateSummary(key); if (key.equals(getString(R.string.pref_key_theme))) { AlertDialog.Builder adb = new AlertDialog.Builder(getActivity()); adb.setTitle(R.string.Attention); String msg = getString(R.string.change_theme_alert); adb.setMessage(msg); adb.setIcon(android.R.drawable.ic_dialog_alert); adb.setPositiveButton(R.string.Yes, changeThemeListener); adb.setNegativeButton(R.string.No, changeThemeListener); adb.create(); adb.show(); } if (key.equals(getString(R.string.pref_key_use_google_proxy_flag))) { applyGoogleProxyDependencies(); } } private void applyGoogleProxyDependencies() { CheckBoxPreference cbp1 = (CheckBoxPreference) getPreferenceScreen().findPreference(getString(R.string.pref_key_use_google_proxy_flag)); boolean status = !cbp1.isChecked(); final String[] keys = {getString(R.string.pref_key_proxy_host), getString(R.string.pref_key_proxy_port), getString(R.string.pref_key_proxy_user), getString(R.string.pref_key_proxy_password)}; for (String k : keys) { EditTextPreference etp = (EditTextPreference) getPreferenceScreen().findPreference(k); etp.setEnabled(status); } } private final DialogInterface.OnClickListener changeThemeListener = (dialog, which) -> { switch (which) { case Dialog.BUTTON_POSITIVE: // moveTaskToBack(true); Intent intent = new Intent(); getActivity(); getActivity().setResult(Activity.RESULT_OK, intent); getActivity().finish(); break; case Dialog.BUTTON_NEGATIVE: break; } }; public boolean onPreferenceChange(Preference preference, Object newValue) { Log.d(DEBUG_TAG, "onPreferenceChange: " + preference.getKey()); if (preference.getKey().equals(getString(R.string.pref_key_directory))) { Log.d(DEBUG_TAG, "DIR - new " + newValue); Log.d(DEBUG_TAG, "DIR - old " + mCallbacks.getSettingsHelper().getDataDirectoryPath()); return mCallbacks.getSettingsHelper().isDirectoryWritable((String) newValue); } if (preference.getKey().equalsIgnoreCase(getString(R.string.pref_key_notification_ringtone))) { Log.d(DEBUG_TAG, "new ringtone: " + newValue); updateRingtoneSummary((RingtonePreference) preference, Uri.parse((String) newValue)); } return true; } private void updateRingtoneSummary(RingtonePreference preference, Uri ringtoneUri) { Ringtone ringtone = RingtoneManager.getRingtone(getActivity(), ringtoneUri); if (ringtone != null) { preference.setSummary(ringtone.getTitle(getActivity())); } else { preference.setSummary(getString(R.string.pref_no_sound)); } } }