package com.buddycloud;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.view.KeyEvent;
import android.view.Window;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.buddycloud.fragments.ChannelStreamFragment;
import com.buddycloud.fragments.ContentFragment;
import com.buddycloud.fragments.GenericChannelsFragment;
import com.buddycloud.fragments.SearchChannelsFragment;
import com.buddycloud.fragments.SlidingFragmentActivity;
import com.buddycloud.fragments.SubscribedChannelsFragment;
import com.buddycloud.log.Logger;
import com.buddycloud.model.SyncModel;
import com.buddycloud.notifications.GCMEvent;
import com.buddycloud.notifications.GCMIntentService;
import com.buddycloud.notifications.GCMUtils;
import com.buddycloud.preferences.Preferences;
import com.buddycloud.utils.ActionbarUtil;
import com.buddycloud.utils.Backstack;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.OnClosedListener;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.OnOpenedListener;
public class MainActivity extends SlidingFragmentActivity {
private static final String TAG = MainActivity.class.getName();
private String myJid;
private Backstack backStack;
private ChannelStreamFragment channelStreamFrag;
private SubscribedChannelsFragment subscribedFrag;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
ActionbarUtil.showActionBar(this, getString(R.string.app_name), true);
setSlidingActionBarEnabled(false);
setBehindContentView(R.layout.menu_frame);
setContentView(R.layout.content_frame);
this.backStack = new Backstack(this);
if (savedInstanceState != null) {
channelStreamFrag = (ChannelStreamFragment) getSupportFragmentManager().getFragment(
savedInstanceState, "mContent");
}
// Check if the welcome screen visible for login.
// Otherwise, show the main screen.
if (shouldLogin()) {
Intent welcomeActivity = new Intent();
welcomeActivity.setClass(getApplicationContext(), WelcomeActivity.class);
startActivityForResult(welcomeActivity, WelcomeActivity.REQUEST_CODE);
} else {
startActivity();
}
}
// You need to do the Play Services APK check here too.
@Override
protected void onResume() {
super.onResume();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (channelStreamFrag != null) {
getSupportFragmentManager().putFragment(outState, "mContent", channelStreamFrag);
}
}
private boolean shouldLogin() {
return Preferences.getPreference(this, Preferences.MY_CHANNEL_JID) == null ||
Preferences.getPreference(this, Preferences.PASSWORD) == null ||
Preferences.getPreference(this, Preferences.API_ADDRESS) == null;
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
onBackPressed();
return false;
}
return true;
}
@Override
public void onBackPressed() {
if (getSlidingMenu().isMenuShowing()) {
finish();
} else {
if (!backStack.pop()) {
getSlidingMenu().showMenu();
}
}
}
private ContentFragment getCurrentFragment() {
if (getSlidingMenu().isMenuShowing()) {
return subscribedFrag;
}
return channelStreamFrag;
}
public ChannelStreamFragment getChannelStreamFrag() {
return channelStreamFrag;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == WelcomeActivity.REQUEST_CODE) {
if (resultCode == WelcomeActivity.RESULT_CODE_OK) {
startActivity();
} else {
finish();
}
} else if (requestCode == SearchActivity.REQUEST_CODE) {
if (data != null) {
String channelJid = data.getStringExtra(GenericChannelsFragment.CHANNEL);
String filter = data.getStringExtra(SearchChannelsFragment.FILTER);
showChannelFragment(channelJid);
backStack.pushSearch(filter);
} else {
backStack.pop();
}
} else if (requestCode == GenericChannelActivity.REQUEST_CODE) {
if (data != null) {
final String channelJid = data.getStringExtra(GenericChannelsFragment.CHANNEL);
showChannelFragment(channelJid);
backStack.pushGeneric(data.getBundleExtra(GenericChannelsFragment.INPUT_ARGS));
} else {
backStack.pop();
}
} else if (requestCode == PostNewTopicActivity.REQUEST_CODE) {
if (resultCode == PostNewTopicActivity.NEW_POST_CREATED_RESULT) {
channelStreamFrag.synchPostStream();
}
else if (data != null) {
final String channelJid = data.getStringExtra(GenericChannelsFragment.CHANNEL);
showChannelFragment(channelJid);
backStack.pushGeneric(data.getBundleExtra(GenericChannelsFragment.INPUT_ARGS));
}
else {
backStack.pop();
}
}
}
@Override
public void onAttachedToWindow() {
Uri data = getIntent().getData();
String scheme = getIntent().getScheme();
String channelJid = null;
if (data != null && scheme != null && scheme.equals(Preferences.BUDDYCLOUD_SCHEME)) {
channelJid = data.getSchemeSpecificPart();
}
if (channelJid == null) {
channelJid = getIntent().getStringExtra(GenericChannelsFragment.CHANNEL);
}
if (channelJid == null) {
showChannelFragment(myJid, false, false);
showMenu();
} else {
showChannelFragment(channelJid);
}
String event = getIntent().getStringExtra(GCMIntentService.GCM_NOTIFICATION_EVENT);
if (event != null) {
GCMEvent gcmEvent = GCMEvent.valueOf(event);
process(gcmEvent);
}
super.onAttachedToWindow();
}
private void startActivity() {
this.myJid = (String) Preferences.getPreference(this, Preferences.MY_CHANNEL_JID);
registerInGCM();
addMenuFragment();
customizeMenu();
}
private void process(GCMEvent event) {
switch (event) {
case POST_AFTER_MY_POST:
case POST_ON_SUBSCRIBED_CHANNEL:
case POST_ON_MY_CHANNEL:
case MENTION:
GCMUtils.clearGCMAuthors(this);
default:
break;
}
}
private void registerInGCM() {
try {
GCMUtils.issueGCMRegistration(this);
} catch (Exception e) {
Logger.error(TAG, "Failed to register in GCM.", e);
}
}
public Backstack getBackStack() {
return backStack;
}
public ChannelStreamFragment showChannelFragment(String channelJid) {
return showChannelFragment(channelJid, false, true);
}
public ChannelStreamFragment showChannelFragment(String channelJid,
boolean pushPreviousToBackstack, boolean clearCounters) {
if (!pushPreviousToBackstack && channelStreamFrag != null) {
String previousChannel = channelStreamFrag.getArguments().getString(
GenericChannelsFragment.CHANNEL);
if (previousChannel != null) {
getBackStack().pushChannel(previousChannel);
}
}
this.channelStreamFrag = new ChannelStreamFragment();
Bundle args = new Bundle();
args.putString(GenericChannelsFragment.CHANNEL, channelJid);
channelStreamFrag.setArguments(args);
if (clearCounters) {
SyncModel.getInstance().visitChannel(this, channelJid);
}
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.content_frame, channelStreamFrag)
.commitAllowingStateLoss();
if (getSlidingMenu().isMenuShowing()) {
getSlidingMenu().showContent();
} else {
fragmentChanged();
}
return channelStreamFrag;
}
private void customizeMenu() {
SlidingMenu sm = getSlidingMenu();
sm.setShadowWidthRes(R.dimen.shadow_width);
sm.setShadowDrawable(R.drawable.shadow);
sm.setBehindOffsetRes(R.dimen.slidingmenu_offset);
sm.setFadeDegree(0.15f);
sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
sm.setOnOpenedListener(new OnOpenedListener() {
@Override
public void onOpened() {
fragmentChanged();
}
});
sm.setOnClosedListener(new OnClosedListener() {
@Override
public void onClosed() {
fragmentChanged();
}
});
}
private void addMenuFragment() {
this.subscribedFrag = new SubscribedChannelsFragment();
FragmentTransaction t = this.getSupportFragmentManager().beginTransaction();
t.replace(R.id.menu_frame, subscribedFrag);
t.commitAllowingStateLoss();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
ContentFragment currentFragment = getCurrentFragment();
if (currentFragment != null) {
currentFragment.createOptions(menu);
}
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
if (item.getItemId() == android.R.id.home) {
showMenu();
return true;
}
return getCurrentFragment().menuItemSelected(featureId, item);
}
private void fragmentChanged() {
getCurrentFragment().attached(this);
supportInvalidateOptionsMenu();
}
}