Commit 4087a4cc authored by Boris Sazonov's avatar Boris Sazonov Committed by Commit Bot

[Unity][Android] Add SigninFragment and SigninFragmentBase skeleton

This CL adds SigninFragmentBase that implements generic screen for
sign-in and unified consent. The view for this fragment will be added by
subsequent CLs. This CL also adds SigninFragment that extends
SigninFragmentBase for SigninActivity.

Bug: 814728
Change-Id: Ie4081150a31f67bb00868f49300414eee05f3f83
Reviewed-on: https://chromium-review.googlesource.com/961201Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Commit-Queue: Boris Sazonov <bsazonov@chromium.org>
Cr-Commit-Position: refs/heads/master@{#543374}
parent da2f4c90
......@@ -70,7 +70,7 @@ public class AccountSigninActivity extends AppCompatActivity
final Intent intent;
if (ChromeFeatureList.isEnabled(ChromeFeatureList.UNIFIED_CONSENT)) {
intent = SigninActivity.createIntent(context, accessPoint, false);
intent = SigninActivity.createIntent(context, accessPoint);
} else {
intent = createIntentForDefaultSigninFlow(context, accessPoint, false);
}
......
......@@ -4,6 +4,8 @@
package org.chromium.chrome.browser.signin;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
......@@ -24,14 +26,11 @@ public class SigninActivity extends AppCompatActivity {
/**
* Creates an {@link Intent} which can be used to start the signin flow.
* @param accessPoint {@link AccessPoint} for starting signin flow. Used in metrics.
* @param isFromPersonalizedPromo Whether the signin activity is started from a personalized
* promo.
*/
public static Intent createIntent(Context context,
@AccountSigninActivity.AccessPoint int accessPoint, boolean isFromPersonalizedPromo) {
public static Intent createIntent(
Context context, @AccountSigninActivity.AccessPoint int accessPoint) {
Intent intent = new Intent(context, SigninActivity.class);
// TODO(https://crbug.com/814728): Call SigninFragment.createArguments.
Bundle fragmentArguments = new Bundle();
Bundle fragmentArguments = SigninFragment.createArguments(accessPoint);
intent.putExtras(fragmentArguments);
return intent;
}
......@@ -52,6 +51,12 @@ public class SigninActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.signin_activity);
// TODO(https://crbug.com/814728): Add SigninFragment.
FragmentManager fragmentManager = getFragmentManager();
Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);
if (fragment == null) {
fragment = new SigninFragment();
fragment.setArguments(getIntent().getExtras());
fragmentManager.beginTransaction().add(R.id.fragment_container, fragment).commit();
}
}
}
// Copyright 2018 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.signin;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.IntDef;
import android.support.annotation.Nullable;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.preferences.PreferencesLauncher;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/** This fragment implements sign-in screen for {@link SigninActivity}. */
public class SigninFragment extends SigninFragmentBase {
private static final String TAG = "SigninFragment";
private static final String ARGUMENT_PERSONALIZED_PROMO_ACTION =
"SigninFragment.PersonalizedPromoAction";
@IntDef({PROMO_ACTION_NONE, PROMO_ACTION_WITH_DEFAULT, PROMO_ACTION_NOT_DEFAULT,
PROMO_ACTION_NEW_ACCOUNT})
@Retention(RetentionPolicy.SOURCE)
public @interface PromoAction {}
public static final int PROMO_ACTION_NONE = 0;
public static final int PROMO_ACTION_WITH_DEFAULT = 1;
public static final int PROMO_ACTION_NOT_DEFAULT = 2;
public static final int PROMO_ACTION_NEW_ACCOUNT = 3;
private @PromoAction int mPromoAction;
/**
* Creates an argument bundle to start signin.
* @param accessPoint The access point for starting signin flow.
*/
public static Bundle createArguments(@SigninAccessPoint int accessPoint) {
return SigninFragmentBase.createArguments(accessPoint);
}
/**
* Creates an argument bundle to start signin from personalized signin promo.
* @param accessPoint The access point for starting signin flow.
* @param promoAction Promo action that was used to start signin. Used for UMA.
*/
public static Bundle createArgumentsFromPersonalizedPromo(
@SigninAccessPoint int accessPoint, @PromoAction int promoAction) {
Bundle result = SigninFragmentBase.createArguments(accessPoint);
result.putInt(ARGUMENT_PERSONALIZED_PROMO_ACTION, promoAction);
return result;
}
// Every fragment must have a public default constructor.
public SigninFragment() {}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPromoAction =
getSigninArguments().getInt(ARGUMENT_PERSONALIZED_PROMO_ACTION, PROMO_ACTION_NONE);
SigninManager.logSigninStartAccessPoint(getSigninAccessPoint());
recordSigninStartedHistogramAccountInfo();
recordSigninStartedUserAction();
}
@Override
protected Bundle getSigninArguments() {
return getArguments();
}
@Override
protected void onSigninRefused() {
getActivity().finish();
}
@Override
protected void onSigninAccepted(
String accountName, boolean isDefaultAccount, boolean settingsClicked) {
if (PrefServiceBridge.getInstance().getSyncLastAccountName() != null) {
AccountSigninActivity.recordSwitchAccountSourceHistogram(
AccountSigninActivity.SwitchAccountSource.SIGNOUT_SIGNIN);
}
SigninManager.get().signIn(accountName, getActivity(), new SigninManager.SignInCallback() {
@Override
public void onSignInComplete() {
if (settingsClicked) {
Intent intent = PreferencesLauncher.createIntentForSettingsPage(
getActivity(), AccountManagementFragment.class.getName());
startActivity(intent);
}
recordSigninCompletedHistogramAccountInfo();
getActivity().finish();
}
@Override
public void onSignInAborted() {}
});
}
private void recordSigninCompletedHistogramAccountInfo() {
final String histogram;
switch (mPromoAction) {
case PROMO_ACTION_NONE:
return;
case PROMO_ACTION_WITH_DEFAULT:
histogram = "Signin.SigninCompletedAccessPoint.WithDefault";
break;
case PROMO_ACTION_NOT_DEFAULT:
histogram = "Signin.SigninCompletedAccessPoint.NotDefault";
break;
case PROMO_ACTION_NEW_ACCOUNT:
histogram = "Signin.SigninCompletedAccessPoint.NewAccount";
break;
default:
assert false : "Unexpected signin flow type!";
return;
}
RecordHistogram.recordEnumeratedHistogram(
histogram, getSigninAccessPoint(), SigninAccessPoint.MAX);
}
private void recordSigninStartedHistogramAccountInfo() {
final String histogram;
switch (mPromoAction) {
case PROMO_ACTION_NONE:
return;
case PROMO_ACTION_WITH_DEFAULT:
histogram = "Signin.SigninStartedAccessPoint.WithDefault";
break;
case PROMO_ACTION_NOT_DEFAULT:
histogram = "Signin.SigninStartedAccessPoint.NotDefault";
break;
case PROMO_ACTION_NEW_ACCOUNT:
histogram = "Signin.SigninStartedAccessPoint.NewAccount";
break;
default:
assert false : "Unexpected signin flow type!";
return;
}
RecordHistogram.recordEnumeratedHistogram(
histogram, getSigninAccessPoint(), SigninAccessPoint.MAX);
}
private void recordSigninStartedUserAction() {
switch (getSigninAccessPoint()) {
case SigninAccessPoint.AUTOFILL_DROPDOWN:
RecordUserAction.record("Signin_Signin_FromAutofillDropdown");
break;
case SigninAccessPoint.BOOKMARK_MANAGER:
RecordUserAction.record("Signin_Signin_FromBookmarkManager");
break;
case SigninAccessPoint.RECENT_TABS:
RecordUserAction.record("Signin_Signin_FromRecentTabs");
break;
case SigninAccessPoint.SETTINGS:
RecordUserAction.record("Signin_Signin_FromSettings");
break;
case SigninAccessPoint.SIGNIN_PROMO:
RecordUserAction.record("Signin_Signin_FromSigninPromo");
break;
case SigninAccessPoint.NTP_CONTENT_SUGGESTIONS:
RecordUserAction.record("Signin_Signin_FromNTPContentSuggestions");
break;
default:
assert false : "Invalid access point.";
}
}
}
// Copyright 2018 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.signin;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import org.chromium.chrome.R;
/**
* This fragment implements sign-in screen with account picker and descriptions of signin-related
* features. Configuration for this fragment is provided by overriding {@link #getSigninArguments}
* derived classes.
*/
public abstract class SigninFragmentBase extends Fragment {
private static final String TAG = "SigninFragmentBase";
private static final String ARGUMENT_ACCESS_POINT = "SigninFragmentBase.AccessPoint";
private @SigninAccessPoint int mSigninAccessPoint;
private @StringRes int mCancelButtonTextId = R.string.cancel;
/**
* Creates an argument bundle to start AccountSigninView from the account selection page.
* @param accessPoint The access point for starting signin flow.
*/
protected static Bundle createArguments(@SigninAccessPoint int accessPoint) {
Bundle result = new Bundle();
result.putInt(ARGUMENT_ACCESS_POINT, accessPoint);
return result;
}
/**
* This method should return arguments Bundle that contains arguments created by
* {@link #createArguments} and related methods.
*/
protected abstract Bundle getSigninArguments();
/** The sign-in was refused. */
protected abstract void onSigninRefused();
/**
* The sign-in was accepted.
* @param accountName The name of the account
* @param isDefaultAccount Whether selected account is a default one (first of all accounts)
* @param settingsClicked Whether the user requested to see their sync settings
*/
protected abstract void onSigninAccepted(
String accountName, boolean isDefaultAccount, boolean settingsClicked);
/** Returns the access point that initiated the sign-in flow. */
protected @SigninAccessPoint int getSigninAccessPoint() {
return mSigninAccessPoint;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle arguments = getSigninArguments();
initAccessPoint(arguments.getInt(ARGUMENT_ACCESS_POINT, -1));
}
private void initAccessPoint(@SigninAccessPoint int accessPoint) {
assert accessPoint == SigninAccessPoint.AUTOFILL_DROPDOWN
|| accessPoint == SigninAccessPoint.BOOKMARK_MANAGER
|| accessPoint == SigninAccessPoint.NTP_CONTENT_SUGGESTIONS
|| accessPoint == SigninAccessPoint.RECENT_TABS
|| accessPoint == SigninAccessPoint.SETTINGS
|| accessPoint == SigninAccessPoint.SIGNIN_PROMO
|| accessPoint
== SigninAccessPoint.START_PAGE : "invalid access point: " + accessPoint;
mSigninAccessPoint = accessPoint;
if (accessPoint == SigninAccessPoint.START_PAGE
|| accessPoint == SigninAccessPoint.SIGNIN_PROMO) {
mCancelButtonTextId = R.string.no_thanks;
}
}
}
......@@ -1113,6 +1113,8 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/signin/ProfileDataCache.java",
"java/src/org/chromium/chrome/browser/signin/SignOutDialogFragment.java",
"java/src/org/chromium/chrome/browser/signin/SigninActivity.java",
"java/src/org/chromium/chrome/browser/signin/SigninFragment.java",
"java/src/org/chromium/chrome/browser/signin/SigninFragmentBase.java",
"java/src/org/chromium/chrome/browser/signin/SigninHelper.java",
"java/src/org/chromium/chrome/browser/signin/SigninInvestigator.java",
"java/src/org/chromium/chrome/browser/signin/SigninManager.java",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment