blob: d0d56dc6bb368c479b7d790f7b1911b728d26b7d [file] [log] [blame]
package org.wordpress.android.ui.accounts.login;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import org.wordpress.android.R;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.models.Account;
import org.wordpress.android.models.AccountHelper;
import org.wordpress.android.ui.accounts.SignInActivity;
public class MagicLinkSignInActivity extends SignInActivity
implements MagicLinkRequestFragment.OnMagicLinkFragmentInteraction,
MagicLinkSignInFragment.OnMagicLinkRequestInteraction, MagicLinkSentFragment.OnMagicLinkSentInteraction {
public static final String MAGIC_LOGIN = "magic-login";
public static final String TOKEN_PARAMETER = "token";
private ProgressDialog mProgressDialog;
@Override
protected void onResume() {
super.onResume();
if (hasMagicLinkLoginIntent()) {
AnalyticsTracker.track(AnalyticsTracker.Stat.LOGIN_MAGIC_LINK_OPENED);
attemptLoginWithToken(getIntent().getData());
}
}
@Override
protected void onPause() {
super.onPause();
cancelProgressDialog();
}
@Override
public MagicLinkSignInFragment getSignInFragment() {
MagicLinkSignInFragment signInFragment =
(MagicLinkSignInFragment) getSupportFragmentManager().findFragmentByTag(MagicLinkSignInFragment.TAG);
if (signInFragment == null) {
return new MagicLinkSignInFragment();
} else {
return signInFragment;
}
}
@Override
public void onMagicLinkSent() {
MagicLinkSentFragment magicLinkSentFragment = new MagicLinkSentFragment();
slideInFragment(magicLinkSentFragment);
}
@Override
public void onEnterPasswordRequested() {
AnalyticsTracker.track(AnalyticsTracker.Stat.LOGIN_MAGIC_LINK_EXITED);
getSignInFragment().setShouldShowPassword(true);
popBackStackToSignInFragment();
}
@Override
public void onMagicLinkRequestSuccess(String email) {
saveEmailToAccount(email);
MagicLinkRequestFragment magicLinkRequestFragment = MagicLinkRequestFragment.newInstance(email);
slideInFragment(magicLinkRequestFragment);
}
@Override
protected void addSignInFragment() {
MagicLinkSignInFragment signInFragment = new MagicLinkSignInFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, signInFragment, MagicLinkSignInFragment.TAG);
fragmentTransaction.commit();
}
private void cancelProgressDialog() {
if (mProgressDialog != null && mProgressDialog.isShowing()) {
mProgressDialog.cancel();
}
}
private boolean hasMagicLinkLoginIntent() {
String action = getIntent().getAction();
Uri uri = getIntent().getData();
return Intent.ACTION_VIEW.equals(action) && uri != null && uri.getHost().contains(MAGIC_LOGIN);
}
private void attemptLoginWithToken(Uri uri) {
getSignInFragment().setToken(uri.getQueryParameter(TOKEN_PARAMETER));
MagicLinkSignInFragment magicLinkSignInFragment = getSignInFragment();
slideInFragment(magicLinkSignInFragment, false);
mProgressDialog = ProgressDialog
.show(this, "", getString(R.string.logging_in), true, true, new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
getSignInFragment().setToken("");
}
});
mProgressDialog.show();
}
private void saveEmailToAccount(String email) {
Account account = AccountHelper.getDefaultAccount();
account.setUserName(email);
account.save();
}
private void popBackStackToSignInFragment() {
FragmentManager fragmentManager = getSupportFragmentManager();
while (fragmentManager.getBackStackEntryCount() > 1) {
fragmentManager.popBackStackImmediate();
}
getSupportFragmentManager().popBackStack();
}
private void slideInFragment(Fragment fragment) {
slideInFragment(fragment, true);
}
private void slideInFragment(Fragment fragment, boolean shouldAddToBackStack) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.activity_slide_in_from_right, R.anim.activity_slide_out_to_left,
R.anim.activity_slide_in_from_left, R.anim.activity_slide_out_to_right);
fragmentTransaction.replace(R.id.fragment_container, fragment);
if (shouldAddToBackStack) {
fragmentTransaction.addToBackStack(null);
}
fragmentTransaction.commitAllowingStateLoss();
}
}