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

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninView.java

Issue 1840513002: Redesign sign in and sign in confirmation screens for Narnia 2.0 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments Created 4 years, 9 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/signin/AccountSigninView.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninView.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninView.java
index 4cd73c362e7118fb3cd3e6084e4fe2c4cbc85628..9af8eba6efc03946e52380241b6c3a43fd29ef3e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninView.java
@@ -7,26 +7,22 @@ package org.chromium.chrome.browser.signin;
import android.app.FragmentManager;
import android.content.Context;
import android.graphics.Bitmap;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
import android.widget.Button;
+import android.widget.FrameLayout;
import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.Spinner;
+import android.widget.ListView;
import android.widget.TextView;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.R;
-import org.chromium.chrome.browser.firstrun.FirstRunView;
-import org.chromium.chrome.browser.firstrun.ImageCarousel;
-import org.chromium.chrome.browser.firstrun.ImageCarousel.ImageCarouselPositionChangeListener;
import org.chromium.chrome.browser.firstrun.ProfileDataCache;
import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.profiles.ProfileDownloader;
@@ -38,9 +34,13 @@ import org.chromium.sync.signin.AccountManagerHelper;
import org.chromium.ui.text.NoUnderlineClickableSpan;
import org.chromium.ui.text.SpanApplier;
import org.chromium.ui.text.SpanApplier.SpanInfo;
+import org.chromium.ui.widget.ButtonCompat;
import java.util.List;
+// TODO(gogerald): add lanscape mode (http://crbug.com/599139).
+// TODO(gogerald): refactor common part into one place after redesgin all sign in screens.
+
/**
* This view allows the user to select an account to log in to, add an account,
* cancel account selection, etc. Users of this class should
@@ -48,9 +48,8 @@ import java.util.List;
* {@link AccountSigninView#setDelegate(Delegate)} after the view has been inflated.
*/
-public class AccountSigninView extends FirstRunView
- implements ImageCarouselPositionChangeListener, ProfileDownloader.Observer {
-
+public class AccountSigninView
+ extends FrameLayout implements AdapterView.OnItemClickListener, ProfileDownloader.Observer {
/**
* Callbacks for various account selection events.
*/
@@ -92,66 +91,36 @@ public class AccountSigninView extends FirstRunView
public FragmentManager getFragmentManager();
}
- private class SpinnerOnItemSelectedListener implements AdapterView.OnItemSelectedListener {
- @Override
- public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
- String accountName = parent.getItemAtPosition(pos).toString();
- if (accountName.equals(mAddAnotherAccount)) {
- // Don't allow "add account" to remain selected. http://crbug.com/421052
- int oldPosition = mArrayAdapter.getPosition(mAccountName);
- if (oldPosition == -1) oldPosition = 0;
- mSpinner.setSelection(oldPosition, false);
-
- mListener.onNewAccount();
- RecordUserAction.record("Signin_AddAccountToDevice");
- } else {
- mAccountName = accountName;
- if (!mPositionSetProgrammatically) mImageCarousel.scrollTo(pos, false, false);
- mPositionSetProgrammatically = false;
- }
- }
- @Override
- public void onNothingSelected(AdapterView<?> parent) {
- mAccountName = parent.getItemAtPosition(0).toString();
- }
- }
-
- private static final String TAG = "AccountFirstRunView";
-
- private static final int EXPERIMENT_TITLE_VARIANT_MASK = 1;
- private static final int EXPERIMENT_SUMMARY_VARIANT_MASK = 2;
- private static final int EXPERIMENT_LAYOUT_VARIANT_MASK = 4;
- private static final int EXPERIMENT_MAX_VALUE = 7;
+ private static final String TAG = "AccountSigninView";
private static final String SETTINGS_LINK_OPEN = "<LINK1>";
private static final String SETTINGS_LINK_CLOSE = "</LINK1>";
private AccountManagerHelper mAccountManagerHelper;
private List<String> mAccountNames;
- private ArrayAdapter<CharSequence> mArrayAdapter;
- private ImageCarousel mImageCarousel;
+ private View mSigninView;
+ private AccountListAdapter mAccountListAdapter;
+ private ListView mAccountListView;
private Button mPositiveButton;
private Button mNegativeButton;
private TextView mTitle;
private TextView mDescriptionText;
private Listener mListener;
private Delegate mDelegate;
- private Spinner mSpinner;
- private TextView mConfirmAccountEmail;
- private Drawable mSpinnerBackground;
private String mForcedAccountName;
- private String mAccountName;
private String mAddAnotherAccount;
private ProfileDataCache mProfileData;
private boolean mSignedIn;
- private boolean mPositionSetProgrammatically;
- private int mDescriptionTextId;
private int mCancelButtonTextId;
private boolean mIsChildAccount;
- private boolean mHorizontalModeEnabled = true;
- private boolean mDynamicPaddingEnabled = true;
private boolean mShowSettingsSpan = true;
+ private AccountSigninConfirmationView mSigninConfirmationView;
+ private ImageView mSigninAccountImage;
+ private TextView mSigninAccountName;
+ private TextView mSigninAccountEmail;
+ private TextView mSigninChromeSyncDescription;
+
public AccountSigninView(Context context, AttributeSet attrs) {
super(context, attrs);
mAccountManagerHelper = AccountManagerHelper.get(getContext().getApplicationContext());
@@ -162,16 +131,9 @@ public class AccountSigninView extends FirstRunView
* @param profileData ProfileDataCache that will be used to call to retrieve user account info.
*/
public void init(ProfileDataCache profileData) {
- setProfileDataCache(profileData);
- }
-
- /**
- * Sets the profile data cache.
- * @param profileData ProfileDataCache that will be used to call to retrieve user account info.
- */
- public void setProfileDataCache(ProfileDataCache profileData) {
mProfileData = profileData;
mProfileData.setObserver(this);
+ mAccountListAdapter.setProfileDataCache(mProfileData);
updateProfileImages();
}
@@ -179,10 +141,48 @@ public class AccountSigninView extends FirstRunView
protected void onFinishInflate() {
super.onFinishInflate();
- mImageCarousel = (ImageCarousel) findViewById(R.id.image);
- mImageCarousel.setListener(this);
+ mSigninView = (View) findViewById(R.id.signin);
newt (away) 2016/04/01 23:43:11 unnecessary cast
gogerald1 2016/04/12 01:21:13 Done.
+
+ mTitle = (TextView) findViewById(R.id.signin_title);
+
+ mAccountListView = (ListView) findViewById(R.id.signin_account_list);
+ mAccountListView.setOnItemClickListener(this);
+ mAccountListAdapter = new AccountListAdapter(getContext().getApplicationContext());
newt (away) 2016/04/01 23:43:12 Remove "getApplicationContext()". There's no need
gogerald1 2016/04/12 01:21:13 Done.
+ mAccountListView.setAdapter(mAccountListAdapter);
+ mDescriptionText =
newt (away) 2016/04/01 23:43:11 This variable name is vague. What is it? Can you d
gogerald1 2016/04/12 01:21:13 Done.
+ (TextView) LayoutInflater.from(getContext().getApplicationContext())
+ .inflate(R.layout.account_signin_choice_description_view, null, false);
+ mDescriptionText.setOnClickListener(null);
+ mAccountListView.addHeaderView(mDescriptionText);
+
+ // Once the user has touched this ListView, prevent the parent view from handling touch
+ // events. This allows the ListView to behave reasonably when nested inside a ListView.
newt (away) 2016/04/01 23:43:11 ?? Why is a ListView nested inside a ListView? Wha
gogerald1 2016/04/12 01:21:13 Currently, it has been used in recent tabs view wh
newt (away) 2016/04/13 18:13:30 Thanks for explaining. And yes, please remove this
+ mAccountListView.setOnTouchListener(new ListView.OnTouchListener() {
+ @Override
+ public boolean onTouch(View view, MotionEvent event) {
+ int action = event.getAction();
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ view.getParent().requestDisallowInterceptTouchEvent(true);
+ break;
+
+ case MotionEvent.ACTION_UP:
+ view.performClick();
+ view.getParent().requestDisallowInterceptTouchEvent(false);
+ break;
+ default:
+ // Ignore.
+ break;
+ }
+
+ view.onTouchEvent(event);
+ return true;
+ }
+ });
mPositiveButton = (Button) findViewById(R.id.positive_button);
newt (away) 2016/04/01 23:43:12 just cast to ButtonCompat here and change mPositiv
gogerald1 2016/04/12 01:21:13 Done.
+ // Remove drop shadow effect.
+ ((ButtonCompat) mPositiveButton).setRaised(false);
mNegativeButton = (Button) findViewById(R.id.negative_button);
// A workaround for Android support library ignoring padding set in XML. b/20307607
@@ -190,48 +190,51 @@ public class AccountSigninView extends FirstRunView
ApiCompatibilityUtils.setPaddingRelative(mPositiveButton, padding, 0, padding, 0);
ApiCompatibilityUtils.setPaddingRelative(mNegativeButton, padding, 0, padding, 0);
- mTitle = (TextView) findViewById(R.id.title);
- mDescriptionText = (TextView) findViewById(R.id.description);
- // For the spans to be clickable.
- mDescriptionText.setMovementMethod(LinkMovementMethod.getInstance());
- mDescriptionTextId = R.string.signin_account_choice_description;
-
// TODO(peconn): Ensure this is changed to R.string.cancel when used in Settings > Sign In.
mCancelButtonTextId = R.string.no_thanks;
mAddAnotherAccount = getResources().getString(R.string.signin_add_account);
- mConfirmAccountEmail = (TextView) findViewById(R.id.confirm_account_email);
- mSpinner = (Spinner) findViewById(R.id.google_accounts_spinner);
- mSpinnerBackground = mSpinner.getBackground();
- mArrayAdapter = new ArrayAdapter<CharSequence>(getContext().getApplicationContext(),
- R.layout.fre_spinner_text);
-
- mArrayAdapter.setDropDownViewResource(R.layout.fre_spinner_dropdown);
- mSpinner.setAdapter(mArrayAdapter);
- mSpinner.setOnItemSelectedListener(new SpinnerOnItemSelectedListener());
-
- // Only set the spinner's content description right before the accessibility action is going
- // to be performed. Otherwise, the the content description is read when the
- // AccountFirstRunView is created because setting the spinner's adapter causes a
- // TYPE_VIEW_SELECTED event. ViewPager loads the next and previous pages according to
- // it's off-screen page limit, which is one by default, so without this the content
- // description ends up being read when the card before this one shown.
- mSpinner.setAccessibilityDelegate(new AccessibilityDelegate() {
+ mSigninConfirmationView =
+ (AccountSigninConfirmationView) findViewById(R.id.signin_confirmation_layout);
+ mSigninConfirmationView.setObserver(new AccountSigninConfirmationView.Observer() {
@Override
- public boolean performAccessibilityAction(View host, int action, Bundle args) {
- if (mSpinner.getContentDescription() == null) {
- mSpinner.setContentDescription(getResources().getString(
- R.string.accessibility_signin_account_spinner));
+ public void onPersonalizeServiceCheckBoxVisibilityChanged(boolean isVisible) {
+ if (isVisible) {
+ setPositiveButtonActive();
+ } else {
+ setPositiveButtonInActive();
}
- return super.performAccessibilityAction(host, action, args);
}
});
+ mSigninAccountImage = (ImageView) findViewById(R.id.signin_account_image);
+ mSigninAccountName = (TextView) findViewById(R.id.signin_account_name);
+ mSigninAccountEmail = (TextView) findViewById(R.id.signin_account_email);
+ mSigninChromeSyncDescription = (TextView) findViewById(R.id.signin_chrome_sync_description);
+ // For the spans to be clickable.
+ mSigninChromeSyncDescription.setMovementMethod(LinkMovementMethod.getInstance());
+
showSigninPage();
}
@Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ // This assumes that view's layout_width is set to match_parent.
+ assert MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY;
newt (away) 2016/04/01 23:43:11 add a similar assert for the heigh
gogerald1 2016/04/12 01:21:13 Done.
+
+ int width = MeasureSpec.getSize(widthMeasureSpec);
+ int height = MeasureSpec.getSize(heightMeasureSpec);
+
+ // Sets title aspect ratio to be 16:9.
+ if (height > width) {
+ mTitle.setHeight(width * 9 / 16);
+ }
+
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ @Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
updateAccounts();
@@ -250,70 +253,17 @@ public class AccountSigninView extends FirstRunView
}
}
- @Override
- protected boolean isHorizontalModeEnabled() {
- return mHorizontalModeEnabled;
- }
-
- @Override
- protected boolean isDynamicPaddingEnabled() {
- return mDynamicPaddingEnabled;
- }
-
/**
* Changes the visuals slightly for when this view appears in the recent tabs page instead of
- * in first run. For example, the title text is changed as well as the button style.
+ * in first run.
* This is currently used in the Recent Tabs Promo and the bookmarks page.
*/
public void configureForRecentTabsOrBookmarksPage() {
- mHorizontalModeEnabled = false;
- mDynamicPaddingEnabled = false;
mShowSettingsSpan = false;
setBackgroundResource(R.color.ntp_bg);
- mTitle.setText(R.string.sign_in_to_chrome);
-
mCancelButtonTextId = R.string.cancel;
setUpCancelButton();
-
- setPadding(0, 0, 0,
- getResources().getDimensionPixelOffset(R.dimen.sign_in_promo_padding_bottom));
- }
-
- /**
- * Changes the visuals slightly for when this view appears in the settings menu.
- */
- public void configureForSettingsPage() {
- mHorizontalModeEnabled = false;
- }
-
- /**
- * Changes the visuals slightly for when this view is shown in a subsequent run after user adds
- * a Google account to the device.
- */
- public void configureForAddAccountPromo() {
- int experimentGroup = SigninManager.getAndroidSigninPromoExperimentGroup();
- assert experimentGroup >= 0 && experimentGroup <= EXPERIMENT_MAX_VALUE;
-
- if ((experimentGroup & EXPERIMENT_TITLE_VARIANT_MASK) != 0) {
- mTitle.setText(R.string.make_chrome_yours);
- }
-
- mDescriptionTextId = (experimentGroup & EXPERIMENT_SUMMARY_VARIANT_MASK) != 0
- ? R.string.signin_sign_in_to_chrome_summary_variant
- : R.string.sign_in_to_chrome_summary;
-
- if ((experimentGroup & EXPERIMENT_LAYOUT_VARIANT_MASK) != 0) {
- mImageCarousel.setVisibility(GONE);
-
- ImageView illustrationView = new ImageView(getContext());
- illustrationView.setImageResource(R.drawable.signin_promo_illustration);
- illustrationView.setBackgroundColor(ApiCompatibilityUtils.getColor(getResources(),
- R.color.illustration_background_color));
-
- LinearLayout linearLayout = (LinearLayout) findViewById(R.id.fre_main_layout);
- linearLayout.addView(illustrationView, 0);
- }
}
/**
@@ -361,32 +311,25 @@ public class AccountSigninView extends FirstRunView
return false;
}
} else {
- accountToSelect = getIndexOfNewElement(
- oldAccountNames, mAccountNames, mSpinner.getSelectedItemPosition());
+ accountToSelect = getIndexOfNewElement(oldAccountNames, mAccountNames,
+ mAccountListAdapter.getSelectedAccountPosition());
}
- mArrayAdapter.clear();
+ mAccountListAdapter.clear();
+ mAccountListView.setVisibility(View.VISIBLE);
newt (away) 2016/04/01 23:43:12 not needed; the list is already/always visible, ri
gogerald1 2016/04/12 01:21:13 Done.
if (!mAccountNames.isEmpty()) {
- mSpinner.setVisibility(View.VISIBLE);
- mArrayAdapter.addAll(mAccountNames);
- mArrayAdapter.add(mAddAnotherAccount);
+ mAccountListAdapter.addAll(mAccountNames);
+ mAccountListAdapter.add(mAddAnotherAccount);
setUpSigninButton(true);
- mDescriptionText.setText(mDescriptionTextId);
-
} else {
- mSpinner.setVisibility(View.GONE);
- mArrayAdapter.add(mAddAnotherAccount);
setUpSigninButton(false);
- mDescriptionText.setText(R.string.signin_no_account_choice_description);
}
if (mProfileData != null) mProfileData.update();
updateProfileImages();
- mSpinner.setSelection(accountToSelect);
- mAccountName = mArrayAdapter.getItem(accountToSelect).toString();
- mImageCarousel.scrollTo(accountToSelect, false, false);
+ selectAccount(accountToSelect);
return oldAccountNames != null
&& !(oldAccountNames.size() == mAccountNames.size()
@@ -424,34 +367,33 @@ public class AccountSigninView extends FirstRunView
private void updateProfileImages() {
if (mProfileData == null) return;
- int count = mAccountNames.size();
-
- Bitmap[] images;
- if (count == 0) {
- images = new Bitmap[1];
- images[0] = mProfileData.getImage(null);
- } else {
- images = new Bitmap[count];
- for (int i = 0; i < count; ++i) {
- images[i] = mProfileData.getImage(mAccountNames.get(i));
- }
+ int totalChildViews = mAccountListView.getCount();
+ int totalHeaderViews = mAccountListView.getHeaderViewsCount();
+ // Do not update header views and the last (mAddAnotherAccount) view.
+ for (int i = totalHeaderViews; i < totalChildViews - 1; i++) {
+ View accountView = mAccountListView.getChildAt(i);
+ if (accountView == null) continue;
+ ImageView accountImage = (ImageView) accountView.findViewById(R.id.account_image);
+ accountImage.setImageBitmap(
+ mProfileData.getImage(mAccountNames.get(i - totalHeaderViews)));
}
- mImageCarousel.setImages(images);
- updateProfileName();
+ if (mSignedIn) updateSignedInAccountInfo();
}
- private void updateProfileName() {
- if (!mSignedIn) return;
+ private void updateSignedInAccountInfo() {
+ if (mProfileData == null) return;
newt (away) 2016/04/01 23:43:12 Can mProfileData be null here? If not, make this a
gogerald1 2016/04/12 01:21:13 Done.
+ String selectedAccountEmail =
+ mAccountNames.get(mAccountListAdapter.getSelectedAccountPosition());
+ mSigninAccountImage.setImageBitmap(mProfileData.getImage(selectedAccountEmail));
String name = null;
- if (mProfileData != null) {
- if (mIsChildAccount) name = mProfileData.getGivenName(mAccountName);
- if (name == null) name = mProfileData.getFullName(mAccountName);
- }
- if (name == null) name = mAccountName;
+ if (mIsChildAccount) name = mProfileData.getGivenName(selectedAccountEmail);
+ if (name == null) name = mProfileData.getFullName(selectedAccountEmail);
+ if (name == null) name = selectedAccountEmail;
String text = String.format(getResources().getString(R.string.signin_hi_name), name);
- mTitle.setText(text);
+ mSigninAccountName.setText(text);
+ mSigninAccountEmail.setText(selectedAccountEmail);
}
/**
@@ -464,31 +406,24 @@ public class AccountSigninView extends FirstRunView
showConfirmSigninPage();
}
- private void configureSpinner(boolean signinPage) {
- mSpinner.setEnabled(signinPage);
- mSpinner.setVisibility(signinPage ? View.VISIBLE : View.GONE);
- mConfirmAccountEmail.setVisibility(signinPage ? View.GONE : View.VISIBLE);
- mConfirmAccountEmail.setText(mAccountName);
- }
-
private void showSigninPage() {
mSignedIn = false;
- mTitle.setText(R.string.sign_in_to_chrome);
- configureSpinner(true);
- mImageCarousel.setVisibility(VISIBLE);
+ mSigninConfirmationView.setVisibility(View.GONE);
+ mSigninView.setVisibility(View.VISIBLE);
setUpCancelButton();
updateAccounts();
-
- mImageCarousel.setSignedInMode(false);
}
private void showConfirmSigninPage() {
mSignedIn = true;
- updateProfileName();
- configureSpinner(false);
+ updateSignedInAccountInfo();
+
+ mSigninView.setVisibility(View.GONE);
+ mSigninConfirmationView.setVisibility(View.VISIBLE);
+
setUpConfirmButton();
setUpUndoButton();
@@ -496,20 +431,20 @@ public class AccountSigninView extends FirstRunView
NoUnderlineClickableSpan settingsSpan = new NoUnderlineClickableSpan() {
@Override
public void onClick(View widget) {
- mListener.onAccountSelected(mAccountName, true);
+ mListener.onAccountSelected(
+ mAccountNames.get(mAccountListAdapter.getSelectedAccountPosition()),
+ true);
}
};
- mDescriptionText.setText(SpanApplier.applySpans(getSignedInDescription(mIsChildAccount),
- new SpanInfo(SETTINGS_LINK_OPEN, SETTINGS_LINK_CLOSE, settingsSpan)));
+ mSigninChromeSyncDescription.setText(
+ SpanApplier.applySpans(getSignedInDescription(mIsChildAccount),
+ new SpanInfo(SETTINGS_LINK_OPEN, SETTINGS_LINK_CLOSE, settingsSpan)));
} else {
// If we aren't showing the span, get rid of the LINK1 annotations.
- mDescriptionText.setText(getSignedInDescription(mIsChildAccount)
- .replace(SETTINGS_LINK_OPEN, "")
- .replace(SETTINGS_LINK_CLOSE, ""));
+ mSigninChromeSyncDescription.setText(getSignedInDescription(mIsChildAccount)
+ .replace(SETTINGS_LINK_OPEN, "")
+ .replace(SETTINGS_LINK_CLOSE, ""));
}
-
- mImageCarousel.setVisibility(VISIBLE);
- mImageCarousel.setSignedInMode(true);
}
private void showConfirmSigninPageAccountTrackerServiceCheck() {
@@ -534,14 +469,11 @@ public class AccountSigninView extends FirstRunView
}
private void showConfirmSigninPagePreviousAccountCheck() {
- if (SigninInvestigator.investigate(mAccountName)
- == InvestigatedScenario.DIFFERENT_ACCOUNT) {
-
+ String accountName = mAccountNames.get(mAccountListAdapter.getSelectedAccountPosition());
newt (away) 2016/04/01 23:43:12 I think you should make a small method "getSelecte
gogerald1 2016/04/12 01:21:13 Done.
+ if (SigninInvestigator.investigate(accountName) == InvestigatedScenario.DIFFERENT_ACCOUNT) {
ConfirmImportSyncDataDialog.showNewInstance(
- PrefServiceBridge.getInstance().getSyncLastAccountName(),
- mAccountName,
- ImportSyncType.PREVIOUS_DATA_FOUND,
- mDelegate.getFragmentManager(),
+ PrefServiceBridge.getInstance().getSyncLastAccountName(), accountName,
+ ImportSyncType.PREVIOUS_DATA_FOUND, mDelegate.getFragmentManager(),
new ConfirmImportSyncDataDialog.Listener() {
@Override
public void onConfirm() {
@@ -584,6 +516,7 @@ public class AccountSigninView extends FirstRunView
}
});
}
+ setPositiveButtonActive();
}
private void setUpUndoButton() {
@@ -605,7 +538,8 @@ public class AccountSigninView extends FirstRunView
mPositiveButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
- mListener.onAccountSelected(mAccountName, false);
+ mListener.onAccountSelected(
+ mAccountNames.get(mAccountListAdapter.getSelectedAccountPosition()), false);
}
});
}
@@ -643,9 +577,11 @@ public class AccountSigninView extends FirstRunView
public void switchToForcedAccountMode(String forcedAccountName) {
mForcedAccountName = forcedAccountName;
updateAccounts();
- assert TextUtils.equals(mAccountName, mForcedAccountName);
+ assert TextUtils.equals(mAccountNames.get(mAccountListAdapter.getSelectedAccountPosition()),
+ mForcedAccountName);
switchToSignedMode();
- assert TextUtils.equals(mAccountName, mForcedAccountName);
+ assert TextUtils.equals(mAccountNames.get(mAccountListAdapter.getSelectedAccountPosition()),
+ mForcedAccountName);
}
/**
@@ -662,9 +598,60 @@ public class AccountSigninView extends FirstRunView
return mForcedAccountName != null;
}
+ /**
+ * Overrides AdapterView.OnItemClickListener.
newt (away) 2016/04/01 23:43:12 fix indentation, or just use "// Overrides Adapter
gogerald1 2016/04/12 01:21:13 Done.
+ */
@Override
- public void onPositionChanged(int i) {
- mPositionSetProgrammatically = true;
- mSpinner.setSelection(i);
+ public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
+ TextView accountNameView = (TextView) view.findViewById(R.id.account_name);
+ if (mAddAnotherAccount.equalsIgnoreCase(accountNameView.getText().toString())) {
newt (away) 2016/04/01 23:43:12 use the position or id, not the text, to determine
gogerald1 2016/04/12 01:21:13 Done.
+ mListener.onNewAccount();
+ RecordUserAction.record("Signin_AddAccountToDevice");
+ } else {
+ selectAccount(position - mAccountListView.getHeaderViewsCount());
+ }
+ }
+
+ private void selectAccount(int position) {
+ int oldPosition = mAccountListAdapter.getSelectedAccountPosition();
+ if (oldPosition == position) return;
+
+ int oldPositionInViews = oldPosition + mAccountListView.getHeaderViewsCount();
+ View preSelectedAccount = mAccountListView.getChildAt(
+ oldPositionInViews - mAccountListView.getFirstVisiblePosition());
+ // If the previously selected account view is not visible (preSelectedAccount == null), let
+ // it be updated by AccountListAdapter when necessary.
+ if (preSelectedAccount != null) {
+ preSelectedAccount.findViewById(R.id.account_selection_mark).setVisibility(View.GONE);
newt (away) 2016/04/01 23:43:12 No no, this is the wrong way to update items in a
gogerald1 2016/04/12 01:21:13 Done, the reason to update accounts in this way is
newt (away) 2016/04/13 18:13:30 You know what they say about premature optimizatio
+ }
+
+ mAccountListAdapter.setSelectedAccountPosition(position);
+ int newPositionInViews = position + mAccountListView.getHeaderViewsCount();
+ if (mAccountListView.getLastVisiblePosition() < newPositionInViews) {
+ mAccountListView.smoothScrollToPosition(newPositionInViews);
+ }
+ mAccountListView.getChildAt(newPositionInViews - mAccountListView.getFirstVisiblePosition())
+ .findViewById(R.id.account_selection_mark)
+ .setVisibility(View.VISIBLE);
+ }
+
+ private void setPositiveButtonActive() {
newt (away) 2016/04/01 23:43:12 I'd call this "setPositiveButtonEnabled()", to reu
gogerald1 2016/04/12 01:21:13 Done.
+ ((ButtonCompat) mPositiveButton)
newt (away) 2016/04/01 23:43:11 change the type of mPositiveButton to ButtonCompat
gogerald1 2016/04/12 01:21:13 Done.
+ .setButtonColor(
+ ApiCompatibilityUtils.getColor(getResources(), R.color.light_active_color));
+ mPositiveButton.setTextColor(
+ ApiCompatibilityUtils.getColor(getResources(), R.color.signin_head_background));
+ mPositiveButton.setAlpha(1f);
+ mPositiveButton.setEnabled(true);
+ }
+
+ private void setPositiveButtonInActive() {
newt (away) 2016/04/01 23:43:11 likewise, setPositiveButtonDisabled()
gogerald1 2016/04/12 01:21:13 Done.
+ ((ButtonCompat) mPositiveButton)
+ .setButtonColor(ApiCompatibilityUtils.getColor(
+ getResources(), R.color.signin_button_disabled_color));
+ mPositiveButton.setTextColor(
+ ApiCompatibilityUtils.getColor(getResources(), R.color.fre_text_color));
+ mPositiveButton.setAlpha(0.26f);
+ mPositiveButton.setEnabled(false);
}
}

Powered by Google App Engine
This is Rietveld 408576698