Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1652)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/infobar/AccountChooserInfoBar.java

Issue 861103002: Credentials chooser UI for Android. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review, please Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
+}

Powered by Google App Engine
This is Rietveld 408576698