/*
* Copyright (c) 2012 Socialize Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.socialize.ui;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView;
import com.socialize.Socialize;
import com.socialize.SocializeService;
import com.socialize.android.ioc.IOCContainer;
import com.socialize.api.SocializeSession;
import com.socialize.api.event.EventSystem;
import com.socialize.concurrent.ManagedAsyncTask;
import com.socialize.error.SocializeErrorHandler;
import com.socialize.error.SocializeException;
import com.socialize.launcher.*;
import com.socialize.listener.SocializeAuthListener;
import com.socialize.log.SocializeLogger;
import com.socialize.util.StringUtils;
/**
* Generic launcher activity.
* @author Jason Polites
*/
public class SocializeLaunchActivity extends Activity {
public static final String LAUNCH_ACTION = "socialize.launch.action";
public static final String LAUNCH_TASK = "socialize.launch.task";
protected IOCContainer container;
protected Launcher launcher;
protected SocializeLogger logger;
protected SocializeErrorHandler errorHandler;
protected Intent originalIntent;
protected EventSystem eventSystem;
@Override
protected void onNewIntent(Intent intent) {
originalIntent = intent;
super.onNewIntent(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
superOnCreate(savedInstanceState);
originalIntent = getIntent();
setupLayout();
new Initializer().execute();
}
protected void setupLayout() {
RelativeLayout layout = new RelativeLayout(this);
layout.setBackgroundColor(Color.BLACK);
LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
TextView text = new TextView(this);
text.setText("Loading...");
text.setTextColor(Color.WHITE);
LayoutParams text_params = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
text_params.addRule(RelativeLayout.CENTER_IN_PARENT);
text.setLayoutParams(text_params);
layout.addView(text);
layout.setLayoutParams(params);
setContentView(layout);
}
protected void doInit() {
initSocialize();
container = getContainer();
logger = container.getBean("logger");
errorHandler = container.getBean("socializeUIErrorHandler");
eventSystem = container.getBean("eventSystem");
}
protected void doAuthenticate() {
// Authenticate the user
getSocialize().authenticate(this, getAuthListener(container));
}
protected SocializeAuthListener getAuthListener(final IOCContainer container) {
return new SocializeAuthListener() {
@Override
public void onError(SocializeException error) {
handleError(error);
}
@Override
public void onAuthFail(SocializeException error) {
handleError(error);
}
@Override
public void onCancel() {
finish();
}
@Override
public void onAuthSuccess(SocializeSession session) {
Bundle extras = getIntent().getExtras();
if(extras != null) {
String action = extras.getString(LAUNCH_ACTION);
String task = extras.getString(LAUNCH_TASK);
if(!StringUtils.isEmpty(task)) {
if(logger != null && logger.isDebugEnabled()) {
logger.debug("Looking for launch task [" +
task +
"]");
}
LaunchTask launchTask = container.getBean(task);
if(launchTask != null) {
try {
if(logger != null && logger.isDebugEnabled()) {
logger.debug("Executing launch task [" +
launchTask.getClass() +
"]");
}
launchTask.execute(SocializeLaunchActivity.this, extras);
}
catch (Throwable e) {
if(logger != null) {
logger.warn("Failed to execute launch task [" +
launchTask.getClass().getName() +
"]", e);
}
else {
SocializeLogger.e(e.getMessage(), e);
}
}
}
else {
if(logger != null) {
logger.error("Launch task [" +
launchTask +
"] specified by no corresponding bean found in the container.");
}
}
}
if(!StringUtils.isEmpty(action)) {
LaunchManager launchManager = container.getBean("launchManager");
if(launchManager != null) {
launcher = launchManager.getLaucher(action);
if(launcher != null) {
if(launcher.isAsync()) {
new AsyncLauncher(SocializeLaunchActivity.this, launcher, extras, new LaunchListener() {
@Override
public void onError(Exception error) {
handleError(error);
}
@Override
public void onAfterLaunch(boolean launched) {
if(!launched || launcher.shouldFinish(SocializeLaunchActivity.this)) {
finish();
}
}
}).execute();
}
else {
boolean launched = launcher.launch(SocializeLaunchActivity.this, extras);
if(!launched || launcher.shouldFinish(SocializeLaunchActivity.this)) {
finish();
}
}
}
else {
finish();
}
}
else {
finish();
}
}
else {
finish();
}
}
else {
finish();
}
}
};
}
protected void handleError(Exception error) {
SocializeLogger.e(error.getMessage(), error);
if(errorHandler != null) {
errorHandler.handleError(SocializeLaunchActivity.this, error);
}
finish();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(launcher != null) {
launcher.onResult(this, requestCode, resultCode, data, originalIntent);
}
finish();
}
protected void superOnCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
protected IOCContainer getContainer() {
return ActivityIOCProvider.getInstance().getContainer();
}
protected void initSocialize() {
getSocialize().init(this);
}
protected SocializeService getSocialize() {
return Socialize.getSocialize();
}
protected class Initializer extends ManagedAsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
doInit();
return null;
}
@Override
protected void onPostExecuteManaged(Void result) {
doAuthenticate();
}
}
}