package com.halzhang.android.apps.startupnews.ui;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.customtabs.CustomTabsIntent;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import com.halzhang.android.apps.startupnews.MyApplication;
import com.halzhang.android.apps.startupnews.R;
import com.halzhang.android.apps.startupnews.SnApiComponent;
import com.halzhang.android.apps.startupnews.analytics.Tracker;
import com.halzhang.android.apps.startupnews.presenter.CommentsListPresenter;
import com.halzhang.android.apps.startupnews.presenter.CommentsListPresenterModule;
import com.halzhang.android.apps.startupnews.presenter.DaggerMainComponent;
import com.halzhang.android.apps.startupnews.presenter.MainActivityContract;
import com.halzhang.android.apps.startupnews.presenter.MainActivityPresenter;
import com.halzhang.android.apps.startupnews.presenter.MainActivityPresenterModule;
import com.halzhang.android.apps.startupnews.ui.fragment.CommentsListFragment;
import com.halzhang.android.apps.startupnews.ui.fragment.NewsListFragment;
import com.halzhang.android.apps.startupnews.ui.fragment.NewsListFragment.OnNewsSelectedListener;
import com.halzhang.android.apps.startupnews.ui.phone.BrowseActivity;
import com.halzhang.android.apps.startupnews.ui.tablet.BrowseFragment;
import com.halzhang.android.apps.startupnews.ui.tablet.DiscussFragment;
import com.halzhang.android.apps.startupnews.ui.tablet.DiscussFragment.OnMenuSelectedListener;
import com.halzhang.android.apps.startupnews.utils.ActivityUtils;
import com.halzhang.android.apps.startupnews.utils.AppUtils;
import com.halzhang.android.apps.startupnews.utils.CustomTabsActivityHelper;
import com.halzhang.android.common.CDLog;
import com.halzhang.android.common.CDToast;
import com.halzhang.android.startupnews.data.entity.SNNew;
import com.halzhang.android.startupnews.data.entity.Status;
import com.halzhang.android.startupnews.data.utils.SessionManager;
import javax.inject.Inject;
/**
* 主页
*
* @author Hal
*/
public class MainActivity extends BaseFragmentActivity implements OnNewsSelectedListener, OnMenuSelectedListener, MainActivityContract.View {
private static final String LOG_TAG = MainActivity.class.getSimpleName();
private static final String TAG_NEWS = "tag_news";
private static final String TAG_NEWEST = "tag_newest";
private static final String TAG_COMMENT = "tag_comment";
private static final String TAG_BROWSE = "tag_browse";
private static final String TAG_DISCUSS = "tag_discuss";
private Intent mFeedbackEmailIntent;
private SNNew mSnNew;
private CustomTabsActivityHelper mHelper;
private NewsListFragment mHotNewsListFragment;
private NewsListFragment mNewsListFragment;
private CommentsListFragment mCommentsListFragment;
@Inject
CommentsListPresenter mCommentsListPresenter;
@Inject
MainActivityPresenter mMainActivityPresenter;
@Inject
SessionManager mSessionManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
CDLog.i(LOG_TAG, "MainActivity create!");
super.onCreate(savedInstanceState);
if (isFinishing()) {
return;
}
setContentView(R.layout.activity_main);
setupViews();
mFeedbackEmailIntent = createEmailIntent();
mHelper = new CustomTabsActivityHelper();
SnApiComponent snApiComponent = ((MyApplication) getApplication()).getSnApiComponent();
DaggerMainComponent.builder().snApiComponent(snApiComponent)
.commentsListPresenterModule(new CommentsListPresenterModule(mCommentsListFragment))
.mainActivityPresenterModule(new MainActivityPresenterModule(this))
.build().inject(this);
}
@Override
protected void onStart() {
super.onStart();
mHelper.bindService(this);
}
@Override
protected void onStop() {
super.onStop();
mHelper.unBindService(this);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
}
private void setupViews() {
mHotNewsListFragment = NewsListFragment.newInstance(getString(R.string.host, "/news"));
mNewsListFragment = NewsListFragment.newInstance(getString(R.string.host, "/newest"));
mCommentsListFragment = CommentsListFragment.newInstance();
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final ActionBar ab = getSupportActionBar();
if (ab != null) {
ab.setDisplayHomeAsUpEnabled(false);
}
ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
if (viewPager != null) {
SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(sectionsPagerAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
}
private Intent createEmailIntent() {
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{
"ghanguo@gmail.com"
});
StringBuilder builder = new StringBuilder();
builder.append(getString(R.string.app_name)).append(" v")
.append(AppUtils.getVersionName(getApplicationContext()))
.append(getString(R.string.feedback));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, builder.toString());
emailIntent.setType("message/rfc822");
return emailIntent;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.removeItem(R.id.menu_login);
menu.removeItem(R.id.menu_logout);
if (mSessionManager.isValid()) {
menu.add(Menu.NONE, R.id.menu_logout, Menu.NONE, R.string.menu_logout);
} else {
menu.add(Menu.NONE, R.id.menu_login, Menu.NONE, R.string.menu_login);
}
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_settings:
Tracker.getInstance().sendEvent("ui_action", "options_item_selected",
"mainactivity_menu_settings", 0L);
startActivity(new Intent(this, AboutActivity.class));
return true;
case R.id.menu_feedback:
Tracker.getInstance().sendEvent("ui_action", "options_item_selected",
"mainactivity_menu_feedback", 0L);
if (ActivityUtils.isIntentAvailable(getApplicationContext(), mFeedbackEmailIntent)) {
startActivity(mFeedbackEmailIntent);
} else {
Toast.makeText(getApplicationContext(), R.string.error_noemailapp,
Toast.LENGTH_LONG).show();
}
return true;
case R.id.menu_login: {
Tracker.getInstance().sendEvent("ui_action", "options_item_selected",
"mainactivity_menu_login", 0L);
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
}
return true;
case R.id.menu_logout:
Tracker.getInstance().sendEvent("ui_action", "options_item_selected",
"mainactivity_menu_logout", 0L);
mSessionManager.clear();
CDToast.showToast(this, R.string.tip_logout_success);
mMainActivityPresenter.logout();
return true;
case R.id.menu_show_comment:
showDiscussFragment();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void showDiscussFragment() {
showDiscussFragment(mSnNew, null);
}
private void showDiscussFragment(SNNew snNew, String discussUrl) {
Bundle args = new Bundle();
if (snNew != null) {
args.putParcelable(DiscussActivity.ARG_SNNEW, snNew);
args.putString(DiscussActivity.ARG_DISCUSS_URL, mSnNew.getDiscussURL());
} else {
args.putString(DiscussActivity.ARG_DISCUSS_URL, discussUrl);
}
DiscussFragment fragment = new DiscussFragment();
fragment.setArguments(args);
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left)
.replace(R.id.fragment_container, fragment, TAG_DISCUSS).commit();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
@Override
public void onLogoutResult(boolean result) {
CDToast.showToast(getApplicationContext(), result ? R.string.tip_logout_success
: R.string.tip_logout_failure);
}
@Override
public void onUpVoteFailure(Throwable e) {
Tracker.getInstance().sendException("up vote error!", e, false);
CDToast.showToast(this, getString(R.string.tip_vote_failure));
}
@Override
public void onUpVoteSuccess(Status status) {
switch (status.code) {
case Status.CODE_COOKIE_VALID:
startActivity(new Intent(this, LoginActivity.class));
CDToast.showToast(this, R.string.tip_cookie_invalid);
break;
case Status.CODE_REPEAT:
CDToast.showToast(this, getString(R.string.tip_vote_duplicate));
break;
case Status.CODE_SUCCESS:
CDToast.showToast(this, R.string.tip_vote_success);
break;
default:
break;
}
}
/* no-op */
@Override
public void setPresenter(MainActivityContract.Presenter presenter) {
}
@Override
public boolean isActive() {
return !isFinishing();
}
private class SectionsPagerAdapter extends FragmentPagerAdapter {
private String[] titles;
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
titles = getResources().getStringArray(R.array.section_titles);
}
@Override
public Fragment getItem(int arg0) {
switch (arg0) {
case 0:
return mHotNewsListFragment;
case 1:
return mNewsListFragment;
case 2:
return mCommentsListFragment;
default:
throw new IllegalArgumentException();
}
}
@Override
public int getCount() {
return titles.length;
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
}
@Override
public void onNewsSelected(int position, final SNNew snNew) {
mSnNew = snNew;
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(mHelper.getSession());
//设置 toolbar 颜色
builder.setToolbarColor(0XFF33B5E5);
CustomTabsIntent customTabsIntent = builder.build();
mHelper.launchUrl(this, snNew.getUrl(), customTabsIntent, new CustomTabsActivityHelper.OnCustomTabsInvalidListener() {
@Override
public void onInvalid(String url) {
ActivityUtils.openArticle(MainActivity.this, snNew);
}
});
}
private void showBrowseFragment(SNNew snNew) {
BrowseFragment browseFragment = (BrowseFragment) getSupportFragmentManager()
.findFragmentByTag(TAG_BROWSE);
if (browseFragment != null) {
browseFragment.setTitle(snNew.getTitle());
browseFragment.load(snNew.getUrl());
} else {
BrowseFragment fragment = new BrowseFragment();
Bundle bundle = new Bundle();
bundle.putString(BrowseActivity.EXTRA_URL, snNew.getUrl());
bundle.putString(BrowseActivity.EXTRA_TITLE, snNew.getTitle());
fragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right)
.replace(R.id.fragment_container, fragment, TAG_BROWSE).commit();
}
}
@Override
public void onShowArticleSelected(SNNew snNew) {
mSnNew = snNew;
showBrowseFragment(snNew);
}
@Override
public void onUpVoteSelected(String postId) {
mMainActivityPresenter.upVote(postId);
}
}