package com.telerik.app.activities;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentSender;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
import com.facebook.Session;
import com.facebook.SessionState;
import com.google.android.gms.auth.GoogleAuthUtil;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient;
import com.google.android.gms.common.Scopes;
import com.google.android.gms.plus.PlusClient;
import com.microsoft.live.LiveAuthClient;
import com.microsoft.live.LiveAuthException;
import com.microsoft.live.LiveAuthListener;
import com.microsoft.live.LiveConnectClient;
import com.microsoft.live.LiveConnectSession;
import com.microsoft.live.LiveStatus;
import com.telerik.app.utils.AccountChooser;
import com.telerik.app.R;
import com.telerik.app.tasks.GoogleLoginTask;
import com.telerik.app.tasks.LoginRequestResultCallbackAction;
import com.telerik.everlive.sdk.core.EverliveApp;
import java.net.URISyntaxException;
import java.util.Arrays;
import eqatec.analytics.monitor.AnalyticsMonitorFactory;
import eqatec.analytics.monitor.IAnalyticsMonitor;
import eqatec.analytics.monitor.Version;
import com.telerik.app.model.BaseViewModel;
public class LoginActivity extends Activity implements View.OnClickListener,
GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener {
private EditText username;
private EditText password;
private ProgressDialog connectionProgressDialog;
//region Google+
public static final int REQUEST_CODE_RESOLVE_ERR = 9000;
private PlusClient mPlusClient;
private ConnectionResult mConnectionResult;
//endregion
//region LiveID
private LiveAuthClient auth;
private LiveConnectClient client;
//endregion
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
getActionBar().hide();
this.checkAppSettings(getIntent().getAction() != null);
connectionProgressDialog = new ProgressDialog(this);
connectionProgressDialog.setMessage("Logging in ...");
this.username = (EditText) findViewById(R.id.l_userName);
this.password = (EditText) findViewById(R.id.l_password);
findViewById(R.id.l_login).setOnClickListener(this);
findViewById(R.id.l_createNewUser).setOnClickListener(this);
findViewById(R.id.l_googleLogin).setOnClickListener(this);
findViewById(R.id.l_ADFSLogin).setOnClickListener(this);
}
private IAnalyticsMonitor initializeAnalyticsService(String analytics_app_id) {
Version version = new Version("1.2.3");
IAnalyticsMonitor monitor = null;
try {
monitor = AnalyticsMonitorFactory.createMonitor(this, analytics_app_id, version);
monitor.start();
} catch (URISyntaxException e) {
e.printStackTrace();
}
return monitor;
}
private void checkAppSettings(boolean showMessage) {
StringBuilder sb = new StringBuilder();
String EOL = "\r\n";
String telerik_app_id = getString(R.string.telerik_app_id);
if (telerik_app_id != null && telerik_app_id.equals("your Telerik App ID")) {
sb.append("Telerik App ID is not set." + EOL);
} else {
BaseViewModel.EverliveAPP = new EverliveApp(telerik_app_id);
}
String facebook_app_id = getString(R.string.facebook_app_id);
if (facebook_app_id != null && facebook_app_id.equals("your facebook app id")) {
// Log.i(getString(R.string.app_name), "Facebook App ID is not set. You cannot use Facebook login.");
sb.append("Facebook App ID is not set. You cannot use Facebook login." + EOL);
setImageButtonEnabled(this, false, (ImageButton) findViewById(R.id.l_facebookLogin), R.drawable.icon_facebook);
} else {
findViewById(R.id.l_facebookLogin).setOnClickListener(this);
}
String live_id_client_id = getString(R.string.live_id_client_id);
if (live_id_client_id != null && live_id_client_id.equals("your live id client id")) {
sb.append("LiveID Client ID is not set. You cannot use LiveID login." + EOL);
setImageButtonEnabled(this, false, (ImageButton) findViewById(R.id.l_liveIDLogin), R.drawable.icon_liveid);
} else {
findViewById(R.id.l_liveIDLogin).setOnClickListener(this);
}
String analytics_app_id = getString(R.string.analytics_app_id);
if (analytics_app_id != null && analytics_app_id.equals("your Analytics Services app id")) {
sb.append("Analytics Services product key is not set. You cannot use Analytics Services." + EOL);
} else {
IAnalyticsMonitor monitor = initializeAnalyticsService(analytics_app_id);
BaseViewModel.getInstance().setMonitor(monitor);
}
if (showMessage && sb.length() > 0) {
this.showAlertMessage(this, sb.toString().substring(0, sb.length() - 2), null);
}
}
private AccountManager mAccountManager;
private String[] getAccountNames() {
mAccountManager = AccountManager.get(this);
Account[] accounts = mAccountManager.getAccountsByType(
GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);
String[] names = new String[accounts.length];
for (int i = 0; i < names.length; i++) {
names[i] = accounts[i].name;
}
return names;
}
public static void setImageButtonEnabled(Context ctxt, boolean enabled, ImageButton item,
int iconResId) {
item.setEnabled(enabled);
Drawable originalIcon = ctxt.getResources().getDrawable(iconResId);
Drawable icon = enabled ? originalIcon : convertDrawableToGrayScale(originalIcon);
item.setImageDrawable(icon);
if (!enabled) {
item.setBackgroundColor(Color.argb(255, 47, 93, 128));
}
}
public static Drawable convertDrawableToGrayScale(Drawable drawable) {
if (drawable == null) {
return null;
}
Drawable res = drawable.mutate();
res.setColorFilter(Color.GRAY, PorterDuff.Mode.SRC_IN);
return res;
}
@Override
protected void onDestroy() {
super.onDestroy();
IAnalyticsMonitor monitor = BaseViewModel.getInstance().getMonitor();
if (monitor != null) {
monitor.stop();
}
Session activeSession = Session.getActiveSession();
if (activeSession != null) {
activeSession.closeAndClearTokenInformation();
}
}
public static void showAlertMessage(Context context, String message, DialogInterface.OnClickListener listener) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setMessage(message);
alertDialogBuilder.setTitle(R.string.app_name);
alertDialogBuilder.setPositiveButton("OK", listener);
alertDialogBuilder.setCancelable(true);
alertDialogBuilder.create().show();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.l_login : {
this.onLogin();
break;
}
case R.id.l_createNewUser : {
Intent i = new Intent(this, CreateNewUserActivity.class);
startActivity(i);
break;
}
case R.id.l_facebookLogin : {
this.onFacebookLogin();
break;
}
case R.id.l_googleLogin : {
this.onGoogleLogin();
break;
}
case R.id.l_liveIDLogin : {
this.onLiveIDLogin();
break;
}
case R.id.l_ADFSLogin : {
this.onAdfsLogin();
break;
}
}
}
private void onAdfsLogin() {
connectionProgressDialog.show();
// https is required for ADFS login.
BaseViewModel.EverliveAPP.getConnectionSettings().setUseHttps(true);
BaseViewModel.EverliveAPP.workWith().authentication().
loginWithADFS(this.username.getText().toString(), this.password.getText().toString()).
executeAsync(new LoginRequestResultCallbackAction(this, "ADFS", connectionProgressDialog));
}
public void onLiveIDLogin() {
connectionProgressDialog.show();
String liveAppID = getString(R.string.live_id_client_id);
this.auth = new LiveAuthClient(this, liveAppID);
this.auth.login(this, Arrays.asList(new String[]{"wl.basic"}), new LiveAuthListener() {
public void onAuthComplete(LiveStatus status, LiveConnectSession session, Object userState) {
if (status == LiveStatus.CONNECTED) {
String liveIdAccessToken = session.getAccessToken();
BaseViewModel.EverliveAPP.workWith().
authentication().
loginWithLiveId(liveIdAccessToken).executeAsync(new LoginRequestResultCallbackAction(LoginActivity.this, "LiveID", connectionProgressDialog));
client = new LiveConnectClient(session);
} else {
Toast.makeText(getBaseContext(), "Not Signed in with LiveID!", Toast.LENGTH_LONG).show();
client = null;
}
}
public void onAuthError(LiveAuthException exception, Object userState) {
Toast.makeText(getBaseContext(), "Error signing in: " + exception.getMessage(), Toast.LENGTH_LONG).show();
client = null;
}
});
}
private void onGoogleLogin() {
this.mPlusClient = new PlusClient
.Builder(this, this, this)
.setScopes(Scopes.PLUS_LOGIN + " " + "https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email")
.build();
connectionProgressDialog.show();
this.mPlusClient.connect();
}
private void onFacebookLogin() {
connectionProgressDialog.show();
Session activeSession = Session.getActiveSession();
if (activeSession == null) {
activeSession = new Session(this);
Session.setActiveSession(activeSession);
}
Session.StatusCallback statusCallback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState sessionState, Exception e) {
if (session.isOpened()) {
BaseViewModel.EverliveAPP.workWith().
authentication().
loginWithFacebook(session.getAccessToken()).
executeAsync(new LoginRequestResultCallbackAction(LoginActivity.this, "Facebook", connectionProgressDialog));
}
}
};
if (!activeSession.isOpened() && !activeSession.isClosed()){
activeSession.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
}else{
activeSession.openActiveSession(this, true, statusCallback);
}
}
public void onLogin() {
connectionProgressDialog.show();
BaseViewModel.EverliveAPP.workWith().
authentication().
login(this.username.getText().toString(), this.password.getText().toString()).
executeAsync(new LoginRequestResultCallbackAction(this, "Regular", connectionProgressDialog));
}
public static void startListActivity(Activity activity) {
Intent i = new Intent(activity, ListActivity.class);
activity.startActivity(i);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (Session.getActiveSession() != null) {
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
if (requestCode == REQUEST_CODE_RESOLVE_ERR && resultCode == RESULT_OK) {
mConnectionResult = null;
mPlusClient.connect();
}
}
@Override
public void onConnected(Bundle bundle) {
// final String accountName = mPlusClient.getAccountName();
final String accountName;
final Context context = this.getApplicationContext();
GoogleLoginTask task;
String[] accounts = getAccountNames();
if (accounts.length > 1) {
new AccountChooser(this, accounts, connectionProgressDialog).show();
// accountName = BaseViewModel.getInstance().getSelectedAccount();
// task = new GoogleLoginTask(context, accountName);
// task.execute((Void) null);
} else {
accountName = accounts[0];
task = new GoogleLoginTask(this, accountName, connectionProgressDialog);
task.execute((Void) null);
}
}
@Override
public void onDisconnected() {
Log.d(getString(R.string.app_name), "disconnected");
}
@Override
public void onConnectionFailed(ConnectionResult result) {
if (result.hasResolution()) {
try {
result.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
} catch (IntentSender.SendIntentException e) {
mPlusClient.connect();
}
}
mConnectionResult = result;
}
}