OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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.chromoting; | 5 package org.chromium.chromoting; |
6 | 6 |
7 import android.annotation.SuppressLint; | 7 import android.annotation.SuppressLint; |
8 import android.app.ProgressDialog; | 8 import android.app.ProgressDialog; |
9 import android.content.DialogInterface; | 9 import android.content.DialogInterface; |
10 import android.content.Intent; | 10 import android.content.Intent; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
101 private OAuthTokenConsumer mHostConnectingConsumer; | 101 private OAuthTokenConsumer mHostConnectingConsumer; |
102 | 102 |
103 private OAuthTokenConsumer mHostListRetrievingConsumer; | 103 private OAuthTokenConsumer mHostListRetrievingConsumer; |
104 | 104 |
105 private OAuthTokenConsumer mHostDeletingConsumer; | 105 private OAuthTokenConsumer mHostDeletingConsumer; |
106 | 106 |
107 private DrawerLayout mDrawerLayout; | 107 private DrawerLayout mDrawerLayout; |
108 | 108 |
109 private ActionBarDrawerToggle mDrawerToggle; | 109 private ActionBarDrawerToggle mDrawerToggle; |
110 | 110 |
111 /** | |
112 * Task to be run after the navigation drawer is closed. Can be null. This i s used to run | |
113 * Help/Feedback tasks which require a screenshot with the drawer closed. | |
114 */ | |
115 private Runnable mPendingDrawerCloseTask; | |
116 | |
111 private AccountSwitcher mAccountSwitcher; | 117 private AccountSwitcher mAccountSwitcher; |
112 | 118 |
113 /** The currently-connected Client, if any. */ | 119 /** The currently-connected Client, if any. */ |
114 private Client mClient; | 120 private Client mClient; |
115 | 121 |
116 /** Shows a warning explaining that a Google account is required, then close s the activity. */ | 122 /** Shows a warning explaining that a Google account is required, then close s the activity. */ |
117 private void showNoAccountsDialog() { | 123 private void showNoAccountsDialog() { |
118 AlertDialog.Builder builder = new AlertDialog.Builder(this); | 124 AlertDialog.Builder builder = new AlertDialog.Builder(this); |
119 builder.setMessage(R.string.noaccounts_message); | 125 builder.setMessage(R.string.noaccounts_message); |
120 builder.setPositiveButton(R.string.noaccounts_add_account, | 126 builder.setPositiveButton(R.string.noaccounts_add_account, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
160 * Shows the appropriate view for the host list and hides the loading indica tor. Shows either | 166 * Shows the appropriate view for the host list and hides the loading indica tor. Shows either |
161 * the host list chooser or the host list empty view, depending on whether m Hosts contains any | 167 * the host list chooser or the host list empty view, depending on whether m Hosts contains any |
162 * hosts. | 168 * hosts. |
163 */ | 169 */ |
164 private void updateHostListView() { | 170 private void updateHostListView() { |
165 mHostListView.setVisibility(mHosts.length == 0 ? View.GONE : View.VISIBL E); | 171 mHostListView.setVisibility(mHosts.length == 0 ? View.GONE : View.VISIBL E); |
166 mEmptyView.setVisibility(mHosts.length == 0 ? View.VISIBLE : View.GONE); | 172 mEmptyView.setVisibility(mHosts.length == 0 ? View.VISIBLE : View.GONE); |
167 mProgressView.setVisibility(View.GONE); | 173 mProgressView.setVisibility(View.GONE); |
168 } | 174 } |
169 | 175 |
176 private void runPendingDrawerCloseTask() { | |
177 // Avoid potential recursion problems by null-ing the task first. | |
178 Runnable task = mPendingDrawerCloseTask; | |
Yuwei
2016/10/04 23:41:14
Optionally you can have a queue of pending tasks r
Lambros
2016/10/05 00:03:15
Acknowledged. No need for a queue just yet.
| |
179 mPendingDrawerCloseTask = null; | |
180 if (task != null) { | |
181 task.run(); | |
182 } | |
183 } | |
184 | |
185 private void closeDrawerThenRun(Runnable task) { | |
Yuwei
2016/10/04 23:41:14
Instead of having extra launch* methods here, coul
Lambros
2016/10/05 00:03:15
If I'm not mistaken, this would mean doubly-nested
Yuwei
2016/10/05 00:27:02
Yep. Callback hell :) Though it can be simplified
| |
186 mPendingDrawerCloseTask = task; | |
187 if (mDrawerLayout.isDrawerOpen(Gravity.START)) { | |
188 mDrawerLayout.closeDrawer(Gravity.START); | |
189 } else { | |
190 runPendingDrawerCloseTask(); | |
191 } | |
192 } | |
193 | |
194 /** Closes any navigation drawer, then shows the Help screen. */ | |
195 public void launchHelp(final HelpContext helpContext) { | |
196 closeDrawerThenRun(new Runnable() { | |
197 @Override | |
198 public void run() { | |
199 HelpSingleton.getInstance().launchHelp(Chromoting.this, helpCont ext); | |
200 } | |
201 }); | |
202 } | |
203 | |
204 /** Closes any navigation drawer, then shows the Feedback screen. */ | |
205 public void launchFeedback() { | |
206 closeDrawerThenRun(new Runnable() { | |
207 @Override | |
208 public void run() { | |
209 HelpSingleton.getInstance().launchFeedback(Chromoting.this); | |
210 } | |
211 }); | |
212 } | |
213 | |
170 /** | 214 /** |
171 * Called when the activity is first created. Loads the native library and r equests an | 215 * Called when the activity is first created. Loads the native library and r equests an |
172 * authentication token from the system. | 216 * authentication token from the system. |
173 */ | 217 */ |
174 @Override | 218 @Override |
175 public void onCreate(Bundle savedInstanceState) { | 219 public void onCreate(Bundle savedInstanceState) { |
176 super.onCreate(savedInstanceState); | 220 super.onCreate(savedInstanceState); |
177 setContentView(R.layout.main); | 221 setContentView(R.layout.main); |
178 | 222 |
179 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); | 223 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); |
(...skipping 13 matching lines...) Expand all Loading... | |
193 onHostClicked(position); | 237 onHostClicked(position); |
194 } | 238 } |
195 }); | 239 }); |
196 | 240 |
197 mProgressView = findViewById(R.id.hostList_progress); | 241 mProgressView = findViewById(R.id.hostList_progress); |
198 | 242 |
199 findViewById(R.id.host_setup_link_android).setOnClickListener(this); | 243 findViewById(R.id.host_setup_link_android).setOnClickListener(this); |
200 | 244 |
201 mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); | 245 mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); |
202 mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, | 246 mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, |
203 R.string.open_navigation_drawer, R.string.close_navigation_drawe r); | 247 R.string.open_navigation_drawer, R.string.close_navigation_drawe r) { |
248 @Override | |
249 public void onDrawerClosed(View drawerView) { | |
250 super.onDrawerClosed(drawerView); | |
251 runPendingDrawerCloseTask(); | |
252 } | |
253 }; | |
204 mDrawerLayout.addDrawerListener(mDrawerToggle); | 254 mDrawerLayout.addDrawerListener(mDrawerToggle); |
205 | 255 |
206 // Disable the hamburger icon animation. This is more complex than it ou ght to be. | 256 // Disable the hamburger icon animation. This is more complex than it ou ght to be. |
207 // The animation can be customized by tweaking some style parameters - s ee | 257 // The animation can be customized by tweaking some style parameters - s ee |
208 // http://developer.android.com/reference/android/support/v7/appcompat/R .styleable.html#DrawerArrowToggle . | 258 // http://developer.android.com/reference/android/support/v7/appcompat/R .styleable.html#DrawerArrowToggle . |
209 // But these can't disable the animation completely. | 259 // But these can't disable the animation completely. |
210 // The icon can only be changed by disabling the drawer indicator, which has side-effects | 260 // The icon can only be changed by disabling the drawer indicator, which has side-effects |
211 // that must be worked around. It disables the built-in click listener, so this has to be | 261 // that must be worked around. It disables the built-in click listener, so this has to be |
212 // implemented and added. This also requires that the toolbar be passed to the | 262 // implemented and added. This also requires that the toolbar be passed to the |
213 // ActionBarDrawerToggle ctor above (otherwise the listener is ignored a nd warnings are | 263 // ActionBarDrawerToggle ctor above (otherwise the listener is ignored a nd warnings are |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
433 if (id == R.id.actionbar_directoryrefresh) { | 483 if (id == R.id.actionbar_directoryrefresh) { |
434 refreshHostList(); | 484 refreshHostList(); |
435 return true; | 485 return true; |
436 } | 486 } |
437 return super.onOptionsItemSelected(item); | 487 return super.onOptionsItemSelected(item); |
438 } | 488 } |
439 | 489 |
440 /** Called when the user touches hyperlinked text. */ | 490 /** Called when the user touches hyperlinked text. */ |
441 @Override | 491 @Override |
442 public void onClick(View view) { | 492 public void onClick(View view) { |
443 HelpSingleton.getInstance().launchHelp(this, HelpContext.HOST_SETUP); | 493 launchHelp(HelpContext.HOST_SETUP); |
444 } | 494 } |
445 | 495 |
446 private void onDeleteHostClicked(int hostIndex) { | 496 private void onDeleteHostClicked(int hostIndex) { |
447 HostInfo hostInfo = mHosts[hostIndex]; | 497 HostInfo hostInfo = mHosts[hostIndex]; |
448 final String hostId = hostInfo.id; | 498 final String hostId = hostInfo.id; |
449 String message = getString(R.string.confirm_host_delete_android, hostInf o.name); | 499 String message = getString(R.string.confirm_host_delete_android, hostInf o.name); |
450 new AlertDialog.Builder(this) | 500 new AlertDialog.Builder(this) |
451 .setMessage(message) | 501 .setMessage(message) |
452 .setPositiveButton(android.R.string.yes, | 502 .setPositiveButton(android.R.string.yes, |
453 new DialogInterface.OnClickListener() { | 503 new DialogInterface.OnClickListener() { |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
675 // Unreachable, but required by Google Java style and findbugs. | 725 // Unreachable, but required by Google Java style and findbugs. |
676 assert false : "Unreached"; | 726 assert false : "Unreached"; |
677 } | 727 } |
678 | 728 |
679 if (dismissProgress && mProgressIndicator != null) { | 729 if (dismissProgress && mProgressIndicator != null) { |
680 mProgressIndicator.dismiss(); | 730 mProgressIndicator.dismiss(); |
681 mProgressIndicator = null; | 731 mProgressIndicator = null; |
682 } | 732 } |
683 } | 733 } |
684 } | 734 } |
OLD | NEW |