/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.goanna.fxa.activities; import java.util.Locale; import org.mozilla.goanna.Locales; import org.mozilla.goanna.R; import org.mozilla.goanna.background.common.log.Logger; import org.mozilla.goanna.background.fxa.FxAccountAgeLockoutHelper; import org.mozilla.goanna.background.fxa.FxAccountUtils; import org.mozilla.goanna.fxa.FirefoxAccounts; import org.mozilla.goanna.fxa.FxAccountConstants; import org.mozilla.goanna.sync.setup.activities.ActivityUtils; import android.accounts.AccountAuthenticatorActivity; import android.content.Intent; import android.os.Bundle; import android.os.SystemClock; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.AnimationSet; import android.view.animation.TranslateAnimation; import android.widget.TextView; /** * Activity which displays sign up/sign in screen to the user. */ public class FxAccountGetStartedActivity extends AccountAuthenticatorActivity { protected static final String LOG_TAG = FxAccountGetStartedActivity.class.getSimpleName(); private static final int CHILD_REQUEST_CODE = 1; /** * {@inheritDoc} */ @Override public void onCreate(Bundle icicle) { Logger.setThreadLogTag(FxAccountConstants.GLOBAL_LOG_TAG); Logger.debug(LOG_TAG, "onCreate(" + icicle + ")"); Locales.initializeLocale(getApplicationContext()); super.onCreate(icicle); setContentView(R.layout.fxaccount_get_started); linkifyOldFirefoxLink(); View button = findViewById(R.id.get_started_button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Bundle extras = null; // startFlow accepts null. if (getIntent() != null) { extras = getIntent().getExtras(); } startFlow(extras); } }); animateIconIn(); } /** * Float the icon up, starting from below and moving up to its final layout * position. Also, fade the icon in. *
* We animate relative to the size of the icon rather than from the bottom of * the containing view for two reasons: first, the distance from bottom could * be large on tablets; two, animating with absolute values requires that * measurement has happened first, which requires a (sometimes buggy) * onPreDrawListener. */ protected void animateIconIn() { final AlphaAnimation a = new AlphaAnimation(0.0f, 1.0f); final TranslateAnimation t = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 2.0f, Animation.RELATIVE_TO_SELF, 0.0f); final AnimationSet animationSet = new AnimationSet(true); animationSet.setDuration(150 * 7); // Straight outta... fxa-content-server. animationSet.addAnimation(a); animationSet.addAnimation(t); final View iconView = findViewById(R.id.icon); iconView.startAnimation(animationSet); } protected void startFlow(Bundle extras) { final Intent intent = new Intent(this, FxAccountCreateAccountActivity.class); // Per http://stackoverflow.com/a/8992365, this triggers a known bug with // the soft keyboard not being shown for the started activity. Why, Android, why? intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); if (extras != null) { intent.putExtras(extras); } startActivityForResult(intent, CHILD_REQUEST_CODE); } @Override public void onResume() { super.onResume(); Intent intent = null; if (FxAccountAgeLockoutHelper.isLockedOut(SystemClock.elapsedRealtime())) { intent = new Intent(this, FxAccountCreateAccountNotAllowedActivity.class); } else if (FirefoxAccounts.firefoxAccountsExist(this)) { intent = new Intent(this, FxAccountStatusActivity.class); } if (intent != null) { this.setAccountAuthenticatorResult(null); setResult(RESULT_CANCELED); // Per http://stackoverflow.com/a/8992365, this triggers a known bug with // the soft keyboard not being shown for the started activity. Why, Android, why? intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); this.startActivity(intent); this.finish(); } // If we've been launched with extras (namely custom server URLs), continue // past go and collect 200 dollars. If we ever get back here (for example, // if the user hits the back button), forget that we had extras entirely, so // that we don't enter a loop. Bundle extras = null; if (getIntent() != null) { extras = getIntent().getExtras(); } if (extras != null && extras.containsKey(FxAccountAbstractSetupActivity.EXTRA_EXTRAS)) { getIntent().replaceExtras(Bundle.EMPTY); startFlow((Bundle) extras.clone()); return; } } /** * We started the CreateAccount activity for a result; this returns it to the * authenticator. */ @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { Logger.debug(LOG_TAG, "onActivityResult: " + requestCode + ", " + resultCode); if (requestCode != CHILD_REQUEST_CODE) { super.onActivityResult(requestCode, resultCode, data); return; } this.setResult(requestCode, data); if (data != null) { this.setAccountAuthenticatorResult(data.getExtras()); // We want to drop ourselves off the back stack if the user successfully // created or signed in to an account. We can easily determine this by // checking for the presence of response data. this.finish(); } } protected void linkifyOldFirefoxLink() { TextView oldFirefox = (TextView) findViewById(R.id.old_firefox); String text = getResources().getString(R.string.fxaccount_getting_started_old_firefox); final String url = FirefoxAccounts.getOldSyncUpgradeURL(getResources(), Locale.getDefault()); FxAccountUtils.pii(LOG_TAG, "Old Firefox url is: " + url); // Don't want to leak locale in particular. ActivityUtils.linkTextView(oldFirefox, text, url); } }