package com.xda.one.ui;
import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;
import com.xda.one.R;
import com.xda.one.api.misc.Consumer;
import com.xda.one.model.misc.ForumType;
import com.xda.one.ui.helper.UrlParseHelper;
import com.xda.one.util.AccountUtils;
import com.xda.one.util.FragmentUtils;
import com.xda.one.util.OneApplication;
import android.app.FragmentManager;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
// Add New Relic Reporting
// import com.newrelic.agent.android.NewRelic;
public class MainActivity extends BaseActivity
implements NavigationDrawerFragment.Callback, SubscribedPagerFragment.Callback,
ThreadFragment.Callback, PostPagerFragment.Callback, SearchFragment.Callback {
private static final String SCREEN_NAME = "XDA-One MainActivity";
private DrawerLayout mDrawerLayout;
private NavigationDrawerFragment mNavigationDrawerFragment;
private Runnable mLoginSuccessfulRunnable;
private ActionBarDrawerToggle mDrawerToggle;
private Toolbar mToolbar;
@Override
public void onCreate(final Bundle bundle) {
// Add New Relic Reporting
/*NewRelic.withApplicationToken(
"AA31aa88f94b9a9db9fba799fdb1112f100438c79f"
).start(getApplication());*/
super.onCreate(bundle);
setContentView(R.layout.main_activity);
// startTracker(SCREEN_NAME);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
mDrawerToggle = new MainActionBarToggle(mToolbar);
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (bundle == null) {
mNavigationDrawerFragment = new NavigationDrawerFragment();
final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.navigation_drawer_frame, mNavigationDrawerFragment).commit();
initialReplaceFragment();
} else {
mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager()
.findFragmentById(R.id.navigation_drawer_frame);
}
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return mDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
}
@Override
protected void onStart() {
super.onStart();
// GoogleAnalytics.getInstance(MainActivity.this).reportActivityStart(this);
}
private void initialReplaceFragment() {
if (Intent.ACTION_VIEW.equals(getIntent().getAction())) {
String url = getIntent().getDataString();
if (url != null) {
parseAndDisplayForumUrl(url, true);
return;
}
}
// Make forum fragment visible
switchCurrentlyDisplayedFragment(ForumPagerFragment.createInstance());
}
@Override
public void parseAndDisplayForumUrl(final String url, final boolean fromExternal) {
final ProgressDialog dialog = new ProgressDialog(this);
dialog.setIndeterminate(true);
dialog.setTitle("Parsing URL");
dialog.setMessage("Parsing URL and getting the page.");
dialog.setCanceledOnTouchOutside(false);
dialog.setCancelable(false);
dialog.show();
final Uri parsed = Uri.parse(url);
UrlParseHelper.parseUrl(this, parsed, new Consumer<Fragment>() {
@Override
public void run(final Fragment fragment) {
dialog.dismiss();
// Fragment can be null if we opened an activity instead of doing this
if (fragment == null && fromExternal) {
switchCurrentlyDisplayedFragment(ForumPagerFragment.createInstance());
} else if (fragment != null) {
switchCurrentlyDisplayedFragment(fragment, !fromExternal, null);
}
}
}, new Runnable() {
@Override
public void run() {
dialog.dismiss();
Toast.makeText(MainActivity.this, R.string.failed_to_get_forum,
Toast.LENGTH_LONG).show();
if (fromExternal) {
switchCurrentlyDisplayedFragment(ForumPagerFragment.createInstance());
}
}
});
}
@Override
protected void onResumeFragments() {
super.onResumeFragments();
if (mLoginSuccessfulRunnable == null) {
return;
}
final Runnable runnable = mLoginSuccessfulRunnable;
mLoginSuccessfulRunnable = null;
if (AccountUtils.getAccount(this) != null) {
runnable.run();
}
}
@Override
public void onBackPressed() {
final Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.content_frame);
// TODO - fix this hack
if (fragment instanceof SearchFragment) {
final SearchFragment searchFragment = (SearchFragment) fragment;
if (searchFragment.onBackPressed()) {
return;
}
} else if (fragment instanceof ForumPagerFragment) {
final ForumPagerFragment pagerFragment = (ForumPagerFragment) fragment;
if (pagerFragment.onBackPressed()) {
return;
}
}
if (!mDrawerLayout.isDrawerOpen(Gravity.START)
&& getSupportFragmentManager().getBackStackEntryCount() == 0) {
mDrawerLayout.openDrawer(Gravity.START);
return;
}
super.onBackPressed();
}
@Override
protected void onStop() {
super.onStop();
// GoogleAnalytics.getInstance(MainActivity.this).reportActivityStop(this);
}
@Override
public void closeNavigationDrawer() {
mDrawerLayout.closeDrawer(Gravity.START);
}
@Override
public void onNavigationItemClicked(final Fragment fragment) {
final Fragment oldFragment = getSupportFragmentManager()
.findFragmentById(R.id.content_frame);
if (oldFragment == null || !oldFragment.getClass().equals(fragment.getClass())) {
switchCurrentlyDisplayedFragment(fragment);
} else if (oldFragment instanceof ForumFragment) {
final ForumFragment currentFragment = (ForumFragment) oldFragment;
final ForumFragment newFragment = (ForumFragment) fragment;
final ForumType newType = (ForumType) newFragment.getArguments()
.getSerializable(ForumFragment.FORUM_TYPE);
if (!currentFragment.getForumType().equals(newType)) {
switchCurrentlyDisplayedFragment(fragment);
}
}
}
private void switchCurrentlyDisplayedFragment(final Fragment fragment) {
switchCurrentlyDisplayedFragment(fragment, false, null);
}
@Override
public void switchCurrentlyDisplayedFragment(final Fragment fragment,
final boolean backStackAndAnimate, final String title) {
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
final FragmentTransaction transaction = FragmentUtils
.getDefaultTransaction(getSupportFragmentManager());
if (backStackAndAnimate) {
transaction.addToBackStack(title);
}
transaction.replace(R.id.content_frame, fragment).commit();
}
@Override
public Toolbar getToolbar() {
return mToolbar;
}
@Override
public void login(final Runnable runnable) {
mLoginSuccessfulRunnable = runnable;
mNavigationDrawerFragment.login();
}
private void startTracker(String screenName) {
final Tracker tracker = getOneApplication()
.getTracker(OneApplication.TrackerName.APP_TRACKER);
tracker.setScreenName(screenName);
tracker.send(new HitBuilders.AppViewBuilder().build());
}
private class MainActionBarToggle extends ActionBarDrawerToggle {
public MainActionBarToggle(final Toolbar toolBar) {
super(MainActivity.this, mDrawerLayout, toolBar, R.string.drawer_open,
R.string.drawer_close);
}
@Override
public void onDrawerOpened(final View drawerView) {
getSupportActionBar().show();
}
@Override
public void onDrawerClosed(final View drawerView) {
}
@Override
public void onDrawerSlide(final View drawerView, final float slideOffset) {
}
}
}