Index: chrome/android/java/src/org/chromium/chrome/browser/infobar/AccountChooserInfoBar.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/AccountChooserInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/AccountChooserInfoBar.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1fc2d805d5f4a6b3c8f67e3ece9e1be31957de73 |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/AccountChooserInfoBar.java |
@@ -0,0 +1,196 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.chrome.browser.infobar; |
+ |
+import android.view.LayoutInflater; |
+import android.view.MenuItem; |
+import android.view.View; |
+import android.view.View.OnClickListener; |
+import android.view.ViewGroup; |
+import android.widget.Button; |
+import android.widget.ImageView; |
+import android.widget.LinearLayout; |
+import android.widget.PopupMenu; |
+import android.widget.PopupMenu.OnMenuItemClickListener; |
+import android.widget.TextView; |
+ |
+import org.chromium.base.CalledByNative; |
+import org.chromium.chrome.R; |
+import org.chromium.chrome.browser.ResourceId; |
+import org.chromium.chrome.browser.preferences.PreferencesLauncher; |
+ |
+/** |
+ * An infobar which allows user to choose credentials. |
+ * Provides JNI methods for the infobar which allows user to choose account in |
+ * Google Smart Lock. |
+ */ |
+public class AccountChooserInfoBar extends InfoBar implements OnMenuItemClickListener { |
+ private enum CredentialType { |
+ EMPTY(0), |
+ LOCAL(1), |
+ FEDERATED(2); |
+ |
+ private final int mType; |
+ private CredentialType(int type) { |
+ mType = type; |
+ }; |
+ |
+ public int getValue() { |
+ return mType; |
+ } |
+ } |
+ |
+ private final String[] mUsernames; |
+ |
+ /** |
+ * Creates and shows the infobar wich allows user to choose credentials for login. |
+ * @param nativeInfoBar Pointer to the native infobar. |
+ * @param enumeratedIconId Enum ID corresponding to the icon that the infobar will show. |
+ * @param usernames Usernames to display in the infobar. |
+ */ |
+ @CalledByNative |
+ private static InfoBar show(long nativeInfoBar, int enumeratedIconId, String[] usernames) { |
+ return new AccountChooserInfoBar( |
+ nativeInfoBar, ResourceId.mapToDrawableId(enumeratedIconId), usernames); |
+ } |
+ |
+ /** |
+ * Creates and shows the infobar which allows user to choose credentials. |
+ * @param nativeInfoBar Pointer to the native infobar. |
+ * @param iconDrawableId Drawable ID corresponding to the icon that the infobar will show. |
+ * @param usernames list of usernames to display in infobar. |
+ */ |
+ public AccountChooserInfoBar(long nativeInfoBar, int iconDrawableId, String[] usernames) { |
+ super(null /* Infobar Listener */, iconDrawableId, null /* bitmap*/, |
+ null /* message to show */); |
+ setNativeInfoBar(nativeInfoBar); |
+ mUsernames = usernames; |
+ } |
+ |
+ /** Called when the user selects a contextual menu item */ |
+ @Override |
+ public boolean onMenuItemClick(MenuItem item) { |
+ if (item.getItemId() == R.id.settings) { |
+ PreferencesLauncher.launchSettingsPage(getContext(), null); |
+ return true; |
+ } |
+ // TODO(melandory): Learn more should open link to help center |
+ // article which is not ready yet. |
+ return false; |
+ } |
+ |
+ /** |
+ * Called when the close button is clicked. Notifies the native infobar, which closes the |
+ * infobar. |
+ */ |
+ @Override |
+ public void onCloseButtonClicked() { |
+ nativeOnCloseButtonClicked(mNativeInfoBarPtr); |
+ } |
+ |
+ /** |
+ * Used to specify button layout and custom content. Makes infobar display list of |
+ * credentials |
+ * @param layout Handles user interface for the infobar. |
+ */ |
+ @Override |
+ public void createContent(InfoBarLayout layout) { |
+ layout.setMessage(getContext().getString(R.string.account_chooser_infobar_title)); |
+ layout.setCustomContent(createAccountsView(), createCustomButtonsView()); |
+ } |
+ |
+ private ViewGroup createAccountsView() { |
+ ViewGroup accountsView = |
+ (ViewGroup) LayoutInflater.from(getContext()) |
+ .inflate(R.layout.account_chooser_infobar_items, null, false); |
+ // TODO(melandory): use ListView to represent credentials and make them scrollable. |
newt (away)
2015/02/17 21:49:08
Please go ahead and turn this into a ListView as p
melandory
2015/02/18 21:15:34
Implemented this using ListView.
But why do you t
newt (away)
2015/02/18 22:26:02
This has to be scrollable because some people have
|
+ LinearLayout credentialsTable = |
+ (LinearLayout) accountsView.findViewById(R.id.account_chooser_layout); |
+ int credentialIndex = 0; |
+ for (String username : mUsernames) { |
+ LinearLayout row = makeAccountRow(username, credentialIndex); |
+ credentialsTable.addView(row); |
+ ++credentialIndex; |
+ } |
+ // TODO(melandory): Restrict height to 2.5 elements in case length of usernames is more |
+ // than 2 elements. |
+ return accountsView; |
+ } |
+ |
+ /** |
+ * Represents row in account chooser infobar, usual row has avatar, username and full name. |
+ * @param username username to diplay. |
+ * @param credentialIndex index of this row which will be back to native code in case user |
+ * clicks on that row. |
+ */ |
+ private LinearLayout makeAccountRow(String username, int credentialIndex) { |
+ LinearLayout row = (LinearLayout) LayoutInflater.from(getContext()) |
+ .inflate(R.layout.account_chooser_infobar_item, null, false); |
+ ViewGroup.LayoutParams row_params = row.getLayoutParams(); |
+ TextView usernameView = (TextView) row.findViewById(R.id.username); |
+ usernameView.setText(username); |
+ TextView displayName = (TextView) row.findViewById(R.id.display_name); |
+ // TODO(melandory): View should show the full name. Temporarily the view shows |
+ // username. |
+ displayName.setText(username); |
+ // TODO(melandory): View should show proper avatar. Temporarily the view shows |
+ // blue man icon. |
+ ImageView avatar = (ImageView) row.findViewById(R.id.profile_image); |
+ avatar.setImageResource(R.drawable.account_management_no_picture); |
+ final Integer currentCredentialIndex = credentialIndex; |
newt (away)
2015/02/17 21:49:08
Use int instead of Integer throughout this file. Y
melandory
2015/02/18 21:15:34
Done.
|
+ row.setOnClickListener(new View.OnClickListener() { |
+ @Override |
+ public void onClick(View view) { |
+ passCredentialsToNative(currentCredentialIndex); |
+ } |
+ }); |
+ return row; |
+ } |
+ |
+ /** |
+ * For the Account Chooser infobar different, than InfobarLayout has, appearance of button |
+ * is required. |
+ */ |
+ private ViewGroup createCustomButtonsView() { |
+ ViewGroup buttonsRow = |
+ (ViewGroup) LayoutInflater.from(getContext()) |
+ .inflate(R.layout.account_chooser_infobar_buttonbar, null, false); |
+ Button moreButton = (Button) buttonsRow.findViewById(R.id.account_chooser_more); |
+ // TODO(melandory): Looks like spinner in mocks. |
+ moreButton.setOnClickListener(new OnClickListener() { |
+ @Override |
+ public void onClick(View view) { |
+ showMorePopup(view); |
+ } |
+ }); |
+ |
+ Button noThanks = (Button) buttonsRow.findViewById(R.id.account_chooser_no_thanks); |
+ noThanks.setOnClickListener(new OnClickListener() { |
+ @Override |
+ public void onClick(View view) { |
+ onCloseButtonClicked(); |
+ } |
+ }); |
+ return buttonsRow; |
+ } |
+ |
+ private void passCredentialsToNative(Integer credentialIndex) { |
+ // TODO(melandory): Adding federated login support should change this |
+ // code. |
+ nativeOnCredentialClicked( |
+ mNativeInfoBarPtr, credentialIndex, CredentialType.LOCAL.getValue()); |
+ } |
+ |
+ /** Pops up menu with two items: Setting and Learn More when user clicks more button*/ |
+ private void showMorePopup(View v) { |
+ PopupMenu popup = new PopupMenu(getContext(), v); |
+ popup.setOnMenuItemClickListener(this); |
+ popup.inflate(R.menu.account_chooser_infobar_more_menu_popup); |
+ popup.show(); |
+ } |
+ |
+ private native void nativeOnCredentialClicked( |
+ long nativeAccountChooserInfoBar, int credentialId, int credentialType); |
+} |