1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.messaging.ui.appsettings;
18 
19 import android.app.FragmentTransaction;
20 import android.content.Intent;
21 import android.content.SharedPreferences;
22 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
23 import android.media.Ringtone;
24 import android.media.RingtoneManager;
25 import android.net.Uri;
26 import android.os.Bundle;
27 import android.preference.Preference;
28 import android.preference.PreferenceFragment;
29 import android.preference.PreferenceScreen;
30 import android.preference.RingtonePreference;
31 import android.preference.TwoStatePreference;
32 import android.provider.Settings;
33 import androidx.core.app.NavUtils;
34 import android.text.TextUtils;
35 import android.view.Menu;
36 import android.view.MenuItem;
37 
38 import com.android.messaging.R;
39 import com.android.messaging.ui.BugleActionBarActivity;
40 import com.android.messaging.ui.LicenseActivity;
41 import com.android.messaging.ui.UIIntents;
42 import com.android.messaging.util.BuglePrefs;
43 import com.android.messaging.util.DebugUtils;
44 import com.android.messaging.util.OsUtil;
45 import com.android.messaging.util.PhoneUtils;
46 
47 public class ApplicationSettingsActivity extends BugleActionBarActivity {
48     @Override
onCreate(final Bundle savedInstanceState)49     protected void onCreate(final Bundle savedInstanceState) {
50         super.onCreate(savedInstanceState);
51 
52         getSupportActionBar().setDisplayHomeAsUpEnabled(true);
53         final boolean topLevel = getIntent().getBooleanExtra(
54                 UIIntents.UI_INTENT_EXTRA_TOP_LEVEL_SETTINGS, false);
55         if (topLevel) {
56             getSupportActionBar().setTitle(getString(R.string.settings_activity_title));
57         }
58 
59         FragmentTransaction ft = getFragmentManager().beginTransaction();
60         ft.replace(android.R.id.content, new ApplicationSettingsFragment());
61         ft.commit();
62     }
63 
64     @Override
onCreateOptionsMenu(Menu menu)65     public boolean onCreateOptionsMenu(Menu menu) {
66         if (super.onCreateOptionsMenu(menu)) {
67             return true;
68         }
69         getMenuInflater().inflate(R.menu.settings_menu, menu);
70         return true;
71     }
72 
73     @Override
onOptionsItemSelected(final MenuItem item)74     public boolean onOptionsItemSelected(final MenuItem item) {
75         switch (item.getItemId()) {
76         case android.R.id.home:
77             NavUtils.navigateUpFromSameTask(this);
78             return true;
79         case R.id.action_license:
80             final Intent intent = new Intent(this, LicenseActivity.class);
81             startActivity(intent);
82             return true;
83         }
84         return super.onOptionsItemSelected(item);
85     }
86 
87     public static class ApplicationSettingsFragment extends PreferenceFragment implements
88             OnSharedPreferenceChangeListener {
89 
90         private String mNotificationsEnabledPreferenceKey;
91         private TwoStatePreference mNotificationsEnabledPreference;
92         private String mRingtonePreferenceKey;
93         private RingtonePreference mRingtonePreference;
94         private Preference mVibratePreference;
95         private String mSmsDisabledPrefKey;
96         private Preference mSmsDisabledPreference;
97         private String mSmsEnabledPrefKey;
98         private Preference mSmsEnabledPreference;
99         private boolean mIsSmsPreferenceClicked;
100 
ApplicationSettingsFragment()101         public ApplicationSettingsFragment() {
102             // Required empty constructor
103         }
104 
105         @Override
onCreate(final Bundle savedInstanceState)106         public void onCreate(final Bundle savedInstanceState) {
107             super.onCreate(savedInstanceState);
108 
109             getPreferenceManager().setSharedPreferencesName(BuglePrefs.SHARED_PREFERENCES_NAME);
110             addPreferencesFromResource(R.xml.preferences_application);
111 
112             mNotificationsEnabledPreferenceKey =
113                     getString(R.string.notifications_enabled_pref_key);
114             mNotificationsEnabledPreference = (TwoStatePreference) findPreference(
115                     mNotificationsEnabledPreferenceKey);
116             mRingtonePreferenceKey = getString(R.string.notification_sound_pref_key);
117             mRingtonePreference = (RingtonePreference) findPreference(mRingtonePreferenceKey);
118             mVibratePreference = findPreference(
119                     getString(R.string.notification_vibration_pref_key));
120             mSmsDisabledPrefKey = getString(R.string.sms_disabled_pref_key);
121             mSmsDisabledPreference = findPreference(mSmsDisabledPrefKey);
122             mSmsEnabledPrefKey = getString(R.string.sms_enabled_pref_key);
123             mSmsEnabledPreference = findPreference(mSmsEnabledPrefKey);
124             mIsSmsPreferenceClicked = false;
125 
126             final SharedPreferences prefs = getPreferenceScreen().getSharedPreferences();
127             updateSoundSummary(prefs);
128 
129             if (!DebugUtils.isDebugEnabled()) {
130                 final Preference debugCategory = findPreference(getString(
131                         R.string.debug_pref_key));
132                 getPreferenceScreen().removePreference(debugCategory);
133             }
134 
135             final PreferenceScreen advancedScreen = (PreferenceScreen) findPreference(
136                     getString(R.string.advanced_pref_key));
137             final boolean topLevel = getActivity().getIntent().getBooleanExtra(
138                     UIIntents.UI_INTENT_EXTRA_TOP_LEVEL_SETTINGS, false);
139             if (topLevel) {
140                 advancedScreen.setIntent(UIIntents.get()
141                         .getAdvancedSettingsIntent(getPreferenceScreen().getContext()));
142             } else {
143                 // Hide the Advanced settings screen if this is not top-level; these are shown at
144                 // the parent SettingsActivity.
145                 getPreferenceScreen().removePreference(advancedScreen);
146             }
147         }
148 
149         @Override
onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)150         public boolean onPreferenceTreeClick (PreferenceScreen preferenceScreen,
151                 Preference preference) {
152             if (preference.getKey() ==  mSmsDisabledPrefKey ||
153                     preference.getKey() == mSmsEnabledPrefKey) {
154                 mIsSmsPreferenceClicked = true;
155             }
156             return super.onPreferenceTreeClick(preferenceScreen, preference);
157         }
158 
updateSoundSummary(final SharedPreferences sharedPreferences)159         private void updateSoundSummary(final SharedPreferences sharedPreferences) {
160             // The silent ringtone just returns an empty string
161             String ringtoneName = mRingtonePreference.getContext().getString(
162                     R.string.silent_ringtone);
163 
164             String ringtoneString = sharedPreferences.getString(mRingtonePreferenceKey, null);
165 
166             // Bootstrap the default setting in the preferences so that we have a valid selection
167             // in the dialog the first time that the user opens it.
168             if (ringtoneString == null) {
169                 ringtoneString = Settings.System.DEFAULT_NOTIFICATION_URI.toString();
170                 final SharedPreferences.Editor editor = sharedPreferences.edit();
171                 editor.putString(mRingtonePreferenceKey, ringtoneString);
172                 editor.apply();
173             }
174 
175             if (!TextUtils.isEmpty(ringtoneString)) {
176                 final Uri ringtoneUri = Uri.parse(ringtoneString);
177                 final Ringtone tone = RingtoneManager.getRingtone(mRingtonePreference.getContext(),
178                         ringtoneUri);
179 
180                 if (tone != null) {
181                     ringtoneName = tone.getTitle(mRingtonePreference.getContext());
182                 }
183             }
184 
185             mRingtonePreference.setSummary(ringtoneName);
186         }
187 
updateSmsEnabledPreferences()188         private void updateSmsEnabledPreferences() {
189             if (!OsUtil.isAtLeastKLP()) {
190                 getPreferenceScreen().removePreference(mSmsDisabledPreference);
191                 getPreferenceScreen().removePreference(mSmsEnabledPreference);
192             } else {
193                 final String defaultSmsAppLabel = getString(R.string.default_sms_app,
194                         PhoneUtils.getDefault().getDefaultSmsAppLabel());
195                 boolean isSmsEnabledBeforeState;
196                 boolean isSmsEnabledCurrentState;
197                 if (PhoneUtils.getDefault().isDefaultSmsApp()) {
198                     if (getPreferenceScreen().findPreference(mSmsEnabledPrefKey) == null) {
199                         getPreferenceScreen().addPreference(mSmsEnabledPreference);
200                         isSmsEnabledBeforeState = false;
201                     } else {
202                         isSmsEnabledBeforeState = true;
203                     }
204                     isSmsEnabledCurrentState = true;
205                     getPreferenceScreen().removePreference(mSmsDisabledPreference);
206                     mSmsEnabledPreference.setSummary(defaultSmsAppLabel);
207                 } else {
208                     if (getPreferenceScreen().findPreference(mSmsDisabledPrefKey) == null) {
209                         getPreferenceScreen().addPreference(mSmsDisabledPreference);
210                         isSmsEnabledBeforeState = true;
211                     } else {
212                         isSmsEnabledBeforeState = false;
213                     }
214                     isSmsEnabledCurrentState = false;
215                     getPreferenceScreen().removePreference(mSmsEnabledPreference);
216                     mSmsDisabledPreference.setSummary(defaultSmsAppLabel);
217                 }
218                 updateNotificationsPreferences();
219             }
220             mIsSmsPreferenceClicked = false;
221         }
222 
updateNotificationsPreferences()223         private void updateNotificationsPreferences() {
224             final boolean canNotify = !OsUtil.isAtLeastKLP()
225                     || PhoneUtils.getDefault().isDefaultSmsApp();
226             mNotificationsEnabledPreference.setEnabled(canNotify);
227         }
228 
229         @Override
onStart()230         public void onStart() {
231             super.onStart();
232             // We do this on start rather than on resume because the sound picker is in a
233             // separate activity.
234             getPreferenceScreen().getSharedPreferences()
235                     .registerOnSharedPreferenceChangeListener(this);
236         }
237 
238         @Override
onResume()239         public void onResume() {
240             super.onResume();
241             updateSmsEnabledPreferences();
242             updateNotificationsPreferences();
243         }
244 
245         @Override
onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key)246         public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences,
247                 final String key) {
248             if (key.equals(mNotificationsEnabledPreferenceKey)) {
249                 updateNotificationsPreferences();
250             } else if (key.equals(mRingtonePreferenceKey)) {
251                 updateSoundSummary(sharedPreferences);
252             }
253         }
254 
255         @Override
onStop()256         public void onStop() {
257             super.onStop();
258             getPreferenceScreen().getSharedPreferences()
259                     .unregisterOnSharedPreferenceChangeListener(this);
260         }
261     }
262 }
263