OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.blimp.core.settings; | 5 package org.chromium.blimp.core.settings; |
6 | 6 |
7 import android.app.Activity; | 7 import android.app.Activity; |
8 import android.content.Context; | 8 import android.content.Context; |
9 import android.content.DialogInterface; | 9 import android.content.DialogInterface; |
10 import android.os.Bundle; | 10 import android.os.Bundle; |
11 import android.preference.ListPreference; | 11 import android.preference.ListPreference; |
12 import android.preference.Preference; | 12 import android.preference.Preference; |
13 import android.preference.PreferenceFragment; | 13 import android.preference.PreferenceFragment; |
14 import android.preference.PreferenceScreen; | 14 import android.preference.PreferenceScreen; |
15 import android.preference.SwitchPreference; | |
15 import android.support.v7.app.AlertDialog; | 16 import android.support.v7.app.AlertDialog; |
16 | 17 |
18 import org.chromium.base.ContextUtils; | |
17 import org.chromium.base.VisibleForTesting; | 19 import org.chromium.base.VisibleForTesting; |
20 import org.chromium.base.annotations.CalledByNative; | |
21 import org.chromium.base.annotations.JNINamespace; | |
18 import org.chromium.blimp.R; | 22 import org.chromium.blimp.R; |
19 import org.chromium.blimp_public.BlimpSettingsCallbacks; | 23 import org.chromium.blimp.core.common.BlimpClientContextInternal; |
24 import org.chromium.blimp_public.BlimpClientContext; | |
25 import org.chromium.components.sync.signin.ChromeSigninController; | |
20 | 26 |
21 /** | 27 /** |
22 * Blimp preferences page in Chrome. | 28 * Blimp preferences page in embedder. |
23 */ | 29 */ |
30 @JNINamespace("blimp::client") | |
24 public class AboutBlimpPreferences extends PreferenceFragment { | 31 public class AboutBlimpPreferences extends PreferenceFragment { |
32 /** | |
33 * If this fragment is waiting for user sign in. | |
34 */ | |
35 @VisibleForTesting | |
36 protected boolean mWaitForSignIn = false; | |
25 | 37 |
26 /** | 38 private static BlimpClientContext sBlimpClientContext; |
27 * Blimp switch preference key, also the key for this PreferenceFragment. | |
28 */ | |
29 public static final String PREF_BLIMP_SWITCH = "blimp_switch"; | |
30 /** | |
31 * Blimp assigner URL preference key. | |
32 */ | |
33 public static final String PREF_ASSIGNER_URL = "blimp_assigner_url"; | |
34 | 39 |
35 private static BlimpSettingsCallbacks sSettingsCallback; | 40 private long mNativeBlimpSettingsAndroid; |
36 | 41 |
37 /** | 42 /** |
38 * Attach the blimp setting preferences to a {@link PreferenceFragment}. | 43 * Attach the blimp setting preferences to a {@link PreferenceFragment}. |
39 * @param fragment The fragment that blimp setting attach to. | 44 * @param fragment The fragment that blimp setting attach to. |
40 */ | 45 */ |
41 public static void addBlimpPreferences(PreferenceFragment fragment) { | 46 public static void addBlimpPreferences(PreferenceFragment fragment) { |
42 PreferenceScreen screen = fragment.getPreferenceScreen(); | 47 PreferenceScreen screen = fragment.getPreferenceScreen(); |
43 | 48 |
44 Preference blimpSetting = new Preference(fragment.getActivity()); | 49 Preference blimpSetting = new Preference(fragment.getActivity()); |
45 blimpSetting.setTitle(R.string.blimp_about_blimp_preferences); | 50 blimpSetting.setTitle(R.string.blimp_about_blimp_preferences); |
46 blimpSetting.setFragment(AboutBlimpPreferences.class.getName()); | 51 blimpSetting.setFragment(AboutBlimpPreferences.class.getName()); |
47 blimpSetting.setKey(AboutBlimpPreferences.PREF_BLIMP_SWITCH); | 52 blimpSetting.setKey(PreferencesUtil.PREF_BLIMP_SWITCH); |
48 | 53 |
49 screen.addPreference(blimpSetting); | 54 screen.addPreference(blimpSetting); |
50 fragment.setPreferenceScreen(screen); | 55 fragment.setPreferenceScreen(screen); |
51 } | 56 } |
52 | 57 |
53 /** | 58 /** |
54 * Register Chrome callback related to Blimp settings. | 59 * Register the {@link BlimpClientContext}. |
55 * @param callback | |
56 */ | 60 */ |
57 public static void registerCallback(BlimpSettingsCallbacks callback) { | 61 public static void setContext(BlimpClientContext blimpContext) { |
58 sSettingsCallback = callback; | 62 sBlimpClientContext = blimpContext; |
59 } | 63 } |
60 | 64 |
61 @Override | 65 @Override |
62 public void onCreate(Bundle savedInstanceState) { | 66 public void onCreate(Bundle savedInstanceState) { |
63 super.onCreate(savedInstanceState); | 67 super.onCreate(savedInstanceState); |
68 initNativeLayer(); | |
64 getActivity().setTitle(R.string.blimp_about_blimp_preferences); | 69 getActivity().setTitle(R.string.blimp_about_blimp_preferences); |
70 updateSettingPage(); | |
71 } | |
72 | |
73 @Override | |
74 public void onResume() { | |
75 super.onResume(); | |
76 updateSettingPage(); | |
77 } | |
78 | |
79 @Override | |
80 public void onDestroy() { | |
81 super.onDestroy(); | |
82 destroyNativeLayer(); | |
83 } | |
84 | |
85 // Reload the items in preferences list. | |
86 private void updateSettingPage() { | |
87 PreferenceScreen screen = getPreferenceScreen(); | |
88 if (screen != null) screen.removeAll(); | |
65 addPreferencesFromResource(R.xml.blimp_preferences); | 89 addPreferencesFromResource(R.xml.blimp_preferences); |
66 | 90 |
67 setupBlimpSwitch(); | 91 setupBlimpSwitch(); |
68 setupAssignerPreferences(); | 92 setupAssignerPreferences(); |
69 } | 93 } |
70 | 94 |
71 /** | 95 /** |
72 * Setup the switch preference for blimp. | 96 * Setup the switch preference for Blimp. |
73 */ | 97 */ |
74 private void setupBlimpSwitch() { | 98 private void setupBlimpSwitch() { |
75 // TODO(xingliu): Use {@link ChromeSwitchPreference} after move this cla ss to Chrome. | 99 // TODO(xingliu): Use {@link ChromeSwitchPreference} after move this cla ss to Chrome. |
76 // http://crbug.com/630675 | 100 // http://crbug.com/630675 |
77 final Preference pref = findPreference(PREF_BLIMP_SWITCH); | 101 final SwitchPreference pref = |
102 (SwitchPreference) findPreference(PreferencesUtil.PREF_BLIMP_SWI TCH); | |
103 | |
104 if (!isSignedIn()) pref.setChecked(false); | |
78 | 105 |
79 pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeList ener() { | 106 pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeList ener() { |
80 @Override | 107 @Override |
81 public boolean onPreferenceChange(Preference preference, Object newV alue) { | 108 public boolean onPreferenceChange(Preference preference, Object newV alue) { |
82 // For blimp client 0.6, if blimp switch changed, show restart d ialog. | 109 return onBlimpSwitchPreferenceChange((boolean) newValue); |
83 // TODO(xingliu): Figure out if we need to close all tabs before restart or reset | |
84 // the settings before restarting. | |
85 showRestartDialog(getActivity(), R.string.blimp_switch_changed_p lease_restart); | |
86 return true; | |
87 } | 110 } |
88 }); | 111 }); |
89 } | 112 } |
90 | 113 |
91 /** | 114 /** |
115 * Handles switch preference change. | |
116 * @param switchValue The new value of the preference. | |
117 * @return If the new value will be persisted. | |
118 */ | |
119 private boolean onBlimpSwitchPreferenceChange(boolean switchValue) { | |
120 if (switchValue) { | |
121 if (isSignedIn()) { | |
122 // If user has signed in and the switch is turned on, start auth entication. | |
123 sBlimpClientContext.connect(); | |
124 } else { | |
125 // If user didn't sign in, show a dialog to let the user sign in . | |
126 showPleaseSignInDialog(); | |
127 return false; | |
128 } | |
129 } | |
130 return true; | |
131 } | |
132 | |
133 /** | |
134 * Show please sign in dialog, it will show AccountSigninView to let user to sign in. | |
David Trainor- moved to gerrit
2016/08/29 05:12:24
Probably don't need "please" in this flow :).
xingliu
2016/08/30 04:47:42
Done.
| |
135 * | |
136 * If the user signed in after clicking the confirm button, turn on the Blim p switch and connect | |
137 * to the engine. | |
138 */ | |
139 private void showPleaseSignInDialog() { | |
140 final Context context = getActivity(); | |
141 new AlertDialog.Builder(context) | |
142 .setTitle(R.string.blimp_sign_in_title) | |
143 .setMessage(R.string.blimp_sign_in_msg) | |
144 .setPositiveButton(R.string.blimp_sign_in_btn, | |
145 new DialogInterface.OnClickListener() { | |
146 @Override | |
147 public void onClick(DialogInterface dialog, int whic h) { | |
148 startUserSignInFlow(); | |
149 } | |
150 }) | |
151 .create() | |
152 .show(); | |
153 } | |
154 | |
155 /** | |
92 * When the user taps on the current assigner, a list of available assigners pops up. | 156 * When the user taps on the current assigner, a list of available assigners pops up. |
93 * User is allowed to change the assigner which is saved to shared preferenc es. | 157 * User is allowed to change the assigner which is saved to shared preferenc es. |
94 * A dialog is displayed which prompts the user to restart the application. | 158 * A dialog is displayed which prompts the user to restart the application. |
95 * | 159 * |
96 * Use {@link PreferencesUtil#getLastUsedAssigner} to retrieve the assigner URL. | 160 * Use {@link PreferencesUtil#getLastUsedAssigner} to retrieve the assigner URL. |
97 */ | 161 */ |
98 private void setupAssignerPreferences() { | 162 private void setupAssignerPreferences() { |
99 final Activity activity = getActivity(); | 163 final Activity activity = getActivity(); |
100 | 164 |
101 final ListPreference listPreference = (ListPreference) findPreference(PR EF_ASSIGNER_URL); | 165 final ListPreference listPreference = |
166 (ListPreference) findPreference(PreferencesUtil.PREF_ASSIGNER_UR L); | |
167 | |
168 // Set to default assigner URL on first time loading this UI. | |
169 if (listPreference.getValue() == null) { | |
170 listPreference.setValue(PreferencesUtil.DEFAULT_ASSIGNER_URL); | |
David Trainor- moved to gerrit
2016/08/29 05:12:24
Can we use getLastUsedAssigner()?
xingliu
2016/08/30 04:47:42
Done. Make sense.
| |
171 } | |
102 listPreference.setSummary(listPreference.getValue()); | 172 listPreference.setSummary(listPreference.getValue()); |
103 | 173 |
104 listPreference.setOnPreferenceChangeListener(new Preference.OnPreference ChangeListener() { | 174 listPreference.setOnPreferenceChangeListener(new Preference.OnPreference ChangeListener() { |
105 @Override | 175 @Override |
106 public boolean onPreferenceChange(Preference preference, Object newV alue) { | 176 public boolean onPreferenceChange(Preference preference, Object newV alue) { |
107 String newAssignmentUrl = (String) newValue; | 177 String newAssignmentUrl = (String) newValue; |
108 listPreference.setSummary(newAssignmentUrl); | 178 listPreference.setSummary(newAssignmentUrl); |
109 showRestartDialog(activity, R.string.blimp_assigner_changed_plea se_restart); | 179 showRestartDialog(activity, R.string.blimp_assigner_changed_plea se_restart); |
110 return true; | 180 return true; |
111 } | 181 } |
112 }); | 182 }); |
113 } | 183 } |
114 | 184 |
115 /** | 185 /** |
116 * Show restart browser dialog. | 186 * Show restart browser dialog. |
117 * @param context The context where we display the restart browser dialog. | 187 * @param context The context where we display the restart browser dialog. |
118 * @param message The message shown to the user. | 188 * @param message The message shown to the user. |
119 */ | 189 */ |
120 private static void showRestartDialog(final Context context, int message) { | 190 private void showRestartDialog(final Context context, int message) { |
121 new AlertDialog.Builder(context) | 191 new AlertDialog.Builder(context) |
122 .setTitle(R.string.blimp_restart_blimp) | 192 .setTitle(R.string.blimp_restart_blimp) |
123 .setMessage(message) | 193 .setMessage(message) |
124 .setPositiveButton(R.string.blimp_restart_now, | 194 .setPositiveButton(R.string.blimp_restart_now, |
125 new DialogInterface.OnClickListener() { | 195 new DialogInterface.OnClickListener() { |
126 @Override | 196 @Override |
127 public void onClick(DialogInterface dialog, int whic h) { | 197 public void onClick(DialogInterface dialog, int whic h) { |
128 restartBrowser(); | 198 restartBrowser(); |
129 } | 199 } |
130 }) | 200 }) |
131 .create() | 201 .create() |
132 .show(); | 202 .show(); |
133 } | 203 } |
134 | 204 |
135 /** | 205 /** |
136 * Restart the browser. | 206 * Restart the browser. |
137 */ | 207 */ |
138 @VisibleForTesting | 208 @VisibleForTesting |
139 protected static void restartBrowser() { | 209 protected void restartBrowser() { |
140 if (sSettingsCallback != null) { | 210 assert sBlimpClientContext != null; |
141 sSettingsCallback.onRestartBrowserRequested(); | 211 BlimpClientContextInternal contextInternal = |
212 (BlimpClientContextInternal) sBlimpClientContext; | |
213 | |
214 contextInternal.getDelegate().restartBrowser(); | |
215 } | |
216 | |
217 /** | |
218 * Start user sign in flow to let the user pick an existing account or creat e new account. | |
219 */ | |
220 private void startUserSignInFlow() { | |
221 mWaitForSignIn = true; | |
222 assert sBlimpClientContext != null; | |
223 BlimpClientContextInternal contextInternal = | |
224 (BlimpClientContextInternal) sBlimpClientContext; | |
225 | |
226 contextInternal.getDelegate().startUserSignInFlow(getActivity()); | |
227 } | |
228 | |
229 private boolean isSignedIn() { | |
230 return ChromeSigninController.get(ContextUtils.getApplicationContext()). isSignedIn(); | |
231 } | |
232 | |
233 @VisibleForTesting | |
234 @CalledByNative | |
235 protected void onSignedOut() { | |
236 // If user signed out, turn off the switch. We also do a sign in state c heck on | |
237 // {@link AboutBlimpPreferences#updateSettingPage()}. | |
238 final SwitchPreference pref = | |
239 (SwitchPreference) findPreference(PreferencesUtil.PREF_BLIMP_SWI TCH); | |
240 pref.setChecked(false); | |
David Trainor- moved to gerrit
2016/08/29 05:12:24
If we were on should we alert the user and shut do
xingliu
2016/08/30 04:47:42
This logic is mostly not get called since the UI i
David Trainor- moved to gerrit
2016/08/30 20:46:29
Acknowledged.
| |
241 } | |
242 | |
243 @VisibleForTesting | |
244 @CalledByNative | |
245 protected void onSignedIn() { | |
246 // If user came back from sign in flow, turn on the switch and connect t o engine. | |
247 // This logic won't trigger the {@link OnPreferenceChangeListener} call. | |
248 if (mWaitForSignIn) { | |
249 final SwitchPreference pref = | |
250 (SwitchPreference) findPreference(PreferencesUtil.PREF_BLIMP _SWITCH); | |
251 pref.setChecked(true); | |
252 | |
253 sBlimpClientContext.connect(); | |
254 mWaitForSignIn = false; | |
142 } | 255 } |
143 } | 256 } |
257 | |
258 @VisibleForTesting | |
259 protected void initNativeLayer() { | |
David Trainor- moved to gerrit
2016/08/29 05:12:24
Maybe call this initializeNative or just initializ
xingliu
2016/08/30 04:47:42
Done.
| |
260 mNativeBlimpSettingsAndroid = nativeInit(); | |
261 assert sBlimpClientContext != null && mNativeBlimpSettingsAndroid != 0; | |
262 | |
263 // Set identity source pointer in native code. | |
264 BlimpClientContextInternal contextInternal = | |
265 (BlimpClientContextInternal) sBlimpClientContext; | |
266 contextInternal.initSettingsPage(mNativeBlimpSettingsAndroid); | |
David Trainor- moved to gerrit
2016/08/29 05:12:24
Just pass this class in and allow the native side
xingliu
2016/08/30 04:47:42
Done. Now, it's similar to other Jni bridges.
| |
267 } | |
268 | |
269 @VisibleForTesting | |
270 protected void destroyNativeLayer() { | |
271 nativeDestroy(mNativeBlimpSettingsAndroid); | |
272 } | |
273 | |
274 private native long nativeInit(); | |
275 private native void nativeDestroy(long nativeBlimpSettingsAndroid); | |
144 } | 276 } |
OLD | NEW |