Chromium Code Reviews| 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); |
| +} |