package com.mozu.mozuandroidinstoreassistant.app;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Build;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.TextView;
import com.mozu.api.contracts.tenant.Site;
import com.mozu.api.contracts.tenant.Tenant;
import com.mozu.api.security.Scope;
import com.mozu.mozuandroidinstoreassistant.app.fragments.SetDefaultFragment;
import com.mozu.mozuandroidinstoreassistant.app.fragments.SetDefaultFragmentListener;
import com.mozu.mozuandroidinstoreassistant.app.fragments.SiteFragment;
import com.mozu.mozuandroidinstoreassistant.app.fragments.SiteSelectionFragmentListener;
import com.mozu.mozuandroidinstoreassistant.app.fragments.TenantFragment;
import com.mozu.mozuandroidinstoreassistant.app.fragments.TenantSelectionFragmentListener;
import com.mozu.mozuandroidinstoreassistant.app.models.authentication.UserAuthenticationStateMachine;
import com.mozu.mozuandroidinstoreassistant.app.models.authentication.UserAuthenticationStateMachineProducer;
import com.mozu.mozuandroidinstoreassistant.app.tasks.RetrieveTenantAsyncTask;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
public class ChooseTenantAndSiteActivity extends Activity implements TenantResourceAsyncListener, TenantSelectionFragmentListener, SiteSelectionFragmentListener, SetDefaultFragmentListener, Observer {
public static final String LAUNCH_FROM_SETTINGS = "launchfromSettings";
private static final String TENANT_FRAGMENT_TAG = "tenants";
private static final String SITE_FRAGMENT_TAG = "sites";
private static final String SET_DEFAULT_FRAGMENT_TAG = "set_default_tag";
private static final int EMAIL_NAVIGATION_REQUEST = 10034;
private TenantFragment mTenantFragment;
private SiteFragment mSiteFragment;
private SetDefaultFragment mSetDefaultFragment;
private UserAuthenticationStateMachine mUserAuthStateMachine;
private boolean mTenantOrSiteNotChosenAuto = false;
private boolean isLaunchedFromSettings = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!getResources().getBoolean(R.bool.allow_portrait)) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
setContentView(R.layout.activity_choose_tenant_and_site);
isLaunchedFromSettings = getIntent().getBooleanExtra(LAUNCH_FROM_SETTINGS,false);
mUserAuthStateMachine = UserAuthenticationStateMachineProducer.getInstance(getApplicationContext());
mUserAuthStateMachine.addObserver(this);
if (mUserAuthStateMachine.getTenantId() != null && mUserAuthStateMachine.getSiteId() != null) {
showTenantChooser();
} else {
updateAuthTicketToDefaults();
}
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == EMAIL_NAVIGATION_REQUEST){
showTenantChooser();
}else {
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
protected void onDestroy() {
mUserAuthStateMachine.deleteObserver(this);
super.onDestroy();
}
@Override
public void tenantWasChosen(Scope chosenScope) {
mUserAuthStateMachine.getAuthProfile().setActiveScope(chosenScope);
mUserAuthStateMachine.updateScope(chosenScope);
//hide tenant dialog
if (mTenantFragment != null) {
mTenantFragment.dismiss();
}
}
private void updateAuthTicketToDefaults() {
if (mUserAuthStateMachine.getCurrentUsersPreferences().getDefaultTenantId() == null || mUserAuthStateMachine.getCurrentUsersPreferences().getDefaultTenantId().equalsIgnoreCase("") || mUserAuthStateMachine.getCurrentUsersPreferences().getDefaultTenantId().equalsIgnoreCase("null")) {
showTenantChooser();
return;
}
Scope scope = new Scope();
scope.setId(Integer.getInteger(mUserAuthStateMachine.getCurrentUsersPreferences().getDefaultTenantId()));
mUserAuthStateMachine.getAuthProfile().setActiveScope(scope);
mUserAuthStateMachine.updateScope(scope);
}
void showTenantChooser() {
//only show tenant chooser if there is more than one tenant
if (mUserAuthStateMachine.getAuthProfile().getAuthorizedScopes().size() == 1) {
tenantWasChosen(mUserAuthStateMachine.getAuthProfile().getAuthorizedScopes().get(0));
return;
}
mTenantOrSiteNotChosenAuto = true;
FragmentManager fragmentManger = getFragmentManager();
mTenantFragment = (TenantFragment) fragmentManger.findFragmentByTag(TENANT_FRAGMENT_TAG);
if (mTenantFragment == null) {
List<Scope> tenants = mUserAuthStateMachine.getAuthProfile().getAuthorizedScopes();
if (tenants == null || tenants.isEmpty()) {
showNoTenantsError();
return;
}
Collections.sort(tenants, new ScopeComparator());
mTenantFragment = new TenantFragment();
mTenantFragment.setTenants(tenants);
mTenantFragment.setStyle(DialogFragment.STYLE_NORMAL, R.style.DialogMozu);
mTenantFragment.show(getFragmentManager(), TENANT_FRAGMENT_TAG);
}
}
private void showNoTenantsError() {
AlertDialog.Builder noTenantsAlertBuilder = new AlertDialog.Builder(this);
noTenantsAlertBuilder.setTitle(R.string.no_tenants_alert);
noTenantsAlertBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
UserAuthenticationStateMachineProducer.getInstance(getApplicationContext()).getCurrentUserAuthState().signOutUser();
startActivity(new Intent(ChooseTenantAndSiteActivity.this, LoginActivity.class));
finish();
}
});
noTenantsAlertBuilder.create().show();
}
private void showSiteChooser(List<Site> sites) {
//if only one site then dont show site chooser
if (sites.size() == 1) {
siteWasChosen(sites.get(0));
return;
}
mTenantOrSiteNotChosenAuto = true;
FragmentManager fragmentManger = getFragmentManager();
mSiteFragment = (SiteFragment) fragmentManger.findFragmentByTag(SITE_FRAGMENT_TAG);
if (mSiteFragment == null) {
mSiteFragment = new SiteFragment();
Collections.sort(sites, new SiteComparator());
mSiteFragment.setSites(sites);
mSiteFragment.setStyle(DialogFragment.STYLE_NORMAL, R.style.DialogMozu);
mSiteFragment.show(getFragmentManager(), SITE_FRAGMENT_TAG);
}
}
@Override
public void update(Observable observable, Object data) {
if (observable instanceof UserAuthenticationStateMachine) {
UserAuthenticationStateMachine stateMachine = (UserAuthenticationStateMachine) observable;
if (!stateMachine.getCurrentUserAuthState().isAuthenticatedState() && stateMachine.getCurrentUserAuthState().isErrorState()) {
startActivity(new Intent(this, LoginActivity.class));
finish();
}
if (stateMachine.getCurrentUserAuthState().isAuthenticatedState() && stateMachine.getCurrentUserAuthState().isTenantSelectedState()) {
new RetrieveTenantAsyncTask(this, stateMachine.getAuthProfile().getActiveScope(), this).execute();
}
}
}
@Override
public void retrievedTenant(Tenant tenant) {
if (tenant == null) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(getString(R.string.tenant_unavailable_for_account));
builder.setPositiveButton(R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
showTenantChooser();
}
});
builder.setNegativeButton(R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("message/rfc822");
intent.putExtra(Intent.EXTRA_EMAIL, getResources().getStringArray(R.array.register_email_address));
intent.putExtra(Intent.EXTRA_CC, new String[]{getCurrentUserEmail()});
intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.register_email_subject));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
StringBuilder str = new StringBuilder();
str.append(getString(R.string.register_email_body) + "\n\n\n");
str.append(getString(R.string.register_email_label)).append(getCurrentUserEmail()).append("\n");
str.append(getString(R.string.register_tenant_label)).append(getCurrentTenant()).append("\n");
str.append(getString(R.string.register_device_model)).append(Build.MODEL).append("\n");
str.append(getString(R.string.register_devices_os_label)).append(Build.VERSION.SDK_INT).append("\n");
intent.putExtra(Intent.EXTRA_TEXT, str.toString());
startActivityForResult(Intent.createChooser(intent, getString(R.string.register)), EMAIL_NAVIGATION_REQUEST);
}
});
AlertDialog dialog = builder.show();
TextView messageText = (TextView) dialog.findViewById(android.R.id.message);
messageText.setGravity(Gravity.CENTER);
dialog.show();
return;
}
showSiteChooser(tenant.getSites());
}
private String getCurrentUserEmail() {
return mUserAuthStateMachine.getAuthProfile().getUserProfile().getEmailAddress();
}
private String getCurrentTenant() {
return String.valueOf(mUserAuthStateMachine.getTenantId());
}
@Override
public void siteWasChosen(Site chosenSite) {
mUserAuthStateMachine.setCurrentSiteId(chosenSite);
if (mSiteFragment != null) {
mSiteFragment.dismiss();
}
showAskToSetDefaultDialog();
}
@Override
public void siteNotChosenButExited() {
showTenantChooser();
}
private void showAskToSetDefaultDialog() {
if (isLaunchedFromSettings) {
mUserAuthStateMachine.persistSiteTenantId();
Intent mainIntent = new Intent(this, MainActivity.class);
mainIntent.putExtra(MainActivity.LAUNCH_SETTINGS, true);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(mainIntent);
finish();
return;
}
if (!mTenantOrSiteNotChosenAuto) {
startActivity(new Intent(this, MainActivity.class));
finish();
return;
}
FragmentManager fragmentManger = getFragmentManager();
mSetDefaultFragment = (SetDefaultFragment) fragmentManger.findFragmentByTag(SET_DEFAULT_FRAGMENT_TAG);
if (mSetDefaultFragment == null) {
mSetDefaultFragment = new SetDefaultFragment();
mSetDefaultFragment.setStyle(DialogFragment.STYLE_NORMAL, R.style.DialogMozu);
mSetDefaultFragment.show(getFragmentManager(), SET_DEFAULT_FRAGMENT_TAG);
}
}
@Override
public void setChosenTenantSiteAsDefault() {
mUserAuthStateMachine.persistSiteTenantId();
startActivity(new Intent(this, MainActivity.class));
finish();
}
@Override
public void doNotSetDefault() {
startActivity(new Intent(this, MainActivity.class));
finish();
}
private class ScopeComparator implements Comparator<Scope> {
@Override
public int compare(Scope lhs, Scope rhs) {
return lhs.getName().compareTo(rhs.getName());
}
@Override
public boolean equals(Object object) {
return false;
}
}
private class SiteComparator implements Comparator<Site> {
@Override
public int compare(Site lhs, Site rhs) {
return lhs.getName().compareTo(rhs.getName());
}
@Override
public boolean equals(Object object) {
return false;
}
}
}