package jianshu.io.app;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import net.tsz.afinal.FinalBitmap;
import java.util.Calendar;
import jianshu.io.app.dialog.NotReadyFragment;
import jianshu.io.app.fragment.CardFragment;
import jianshu.io.app.fragment.HotPagerFragment;
import jianshu.io.app.fragment.TimeStreamFragment;
import jianshu.io.app.model.JianshuSession;
import jianshu.io.app.model.StatePool;
import jianshu.io.app.model.UserInfo;
import jianshu.io.app.model.UserInfoManager;
import jianshu.io.app.model.datapool.HomePageDataPool;
import jianshu.io.app.widget.AfinalRoundedImageView;
public class MainActivity extends ActionBarActivity
implements AdapterView.OnItemClickListener,
UserInfoManager.UserInfoManagerListener, JianshuSession.JianshuSessionListener, TimeStreamFragment.OnFragmentInteractionListener{
private static final int LOGIN_FROM_START = 0;
private static final int LOGIN_FROM_BUTTON = 1;
LinearLayout mMenus;
DrawerLayout mDrawerLayout;
View mDrawerContianer;
View mUserView;
AfinalRoundedImageView userAvatar;
TextView userName;
TextView userIntroduce;
View userLoginView;
Button loginBtn;
private CharSequence mTitle;
private CharSequence mDrawerTitle;
private ActionBarDrawerToggle mDrawerToggle;
private String[] mTitles;
private FinalBitmap finalBitmap;
private Handler handler;
private boolean backFromLogin;
private View selectedView;
private int mPosition;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initAlarm();
Object[] state = StatePool.getInstance().getState("main");
if (state != null) {
mPosition = (Integer) state[0];
}
initViews();
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
mTitles = getResources().getStringArray(R.array.drawer_titles);
mTitle = mDrawerTitle = getTitle();
initDrawer();
this.finalBitmap = FinalBitmap.create(this);
this.handler = new Handler();
this.loginBtn.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
startActivityForResult(intent, LOGIN_FROM_BUTTON);
MainActivity.this.overridePendingTransition(R.anim.slide_in_left, 0);
}
});
UserInfoManager.getsInstance().setListener(this);
setUiAccordingIfLogin();
}
private void initAlarm() {
Intent intent = JianshuIntentService.getStartAt7Intent(this);
boolean isAlarmSet = (PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_NO_CREATE) != null);
if (!isAlarmSet) {
//马上刷新
startService(intent);
PendingIntent pendingInent = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 7);
calendar.set(Calendar.MINUTE, 0);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingInent);
}
}
private void initViews() {
mMenus = (LinearLayout) findViewById(R.id.left_drawer);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerContianer = findViewById(R.id.drawer_container);
mUserView = findViewById(R.id.user);
userAvatar = (AfinalRoundedImageView) findViewById(R.id.userAvatar);
userName = (TextView) findViewById(R.id.userName);
userIntroduce = (TextView) findViewById(R.id.userIntroduce);
userLoginView = findViewById(R.id.user_login);
loginBtn = (Button) findViewById(R.id.login_btn);
}
@Override
protected void onResume() {
super.onResume();
JianshuSession.getsInstance().addListener(this);
}
@Override
protected void onPause() {
super.onPause();
JianshuSession.getsInstance().removeListener(this);
StatePool.getInstance().putState("main", new Object[]{mPosition});
}
@Override
protected void onResumeFragments() {
super.onResumeFragments();
if (this.backFromLogin) {
this.backFromLogin = false;
setUiAccordingIfLogin();
}
}
private void setUiAccordingIfLogin() {
selectItem(mPosition);
JianshuSession.getsInstance().validate();
if (JianshuSession.getsInstance().isUserLogin()) {
showUserInfo(UserInfoManager.getsInstance().getUserInfo());
selectItem(mPosition);
} else {
onLoginRequired();
}
}
private void initDrawer() {
int count = mMenus.getChildCount();
for (int i = 0; i < count; i++) {
View view = mMenus.getChildAt(i);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = 0;
switch (v.getId()) {
case R.id.home:
position = 0;
break;
case R.id.hot:
position = 1;
break;
case R.id.timeline:
position = 2;
break;
default:
break;
}
selectItem(position);
}
});
}
mDrawerToggle = new ActionBarDrawerToggle(
this, /* host Activity */
mDrawerLayout, /* DrawerLayout object */
R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description for accessibility */
R.string.drawer_close /* "close drawer" description for accessibility */
) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
backFromLogin = true;
}
private void showUserInfo(final UserInfo userInfo) {
final MainActivity that = MainActivity.this;
this.handler.post(new Runnable() {
@Override
public void run() {
if (userInfo != null) {
that.userLoginView.setVisibility(View.GONE);
that.finalBitmap.display(that.userAvatar, userInfo.getAvatarUrl());
that.userName.setText(userInfo.getName());
that.userIntroduce.setText(userInfo.getIntroduce());
that.mUserView.setVisibility(View.VISIBLE);
} else {
that.userLoginView.setVisibility(View.VISIBLE);
that.mUserView.setVisibility(View.GONE);
}
}
});
}
private void selectItem(int position) {
mPosition = position;
View v = mMenus.getChildAt(position);
if (this.selectedView == v) {
return;
}
if (this.selectedView != null) {
this.selectedView.setSelected(false);
}
v.setSelected(true);
this.selectedView = v;
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = getRelatedFragment(position);
if (fragment instanceof DialogFragment) {
((DialogFragment) fragment).show(fragmentManager, "not ready");
} else {
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment, "home").commit();
}
setTitle(mTitles[position]);
mDrawerLayout.closeDrawer(mDrawerContianer);
}
private Fragment getRelatedFragment(int position) {
Fragment fragment;
switch (position) {
case 0:
fragment = CardFragment.newInstance(HomePageDataPool.HOME_PAGE_URL);
break;
case 1:
fragment = HotPagerFragment.newInstance();
break;
case 2:
fragment = TimeStreamFragment.newInstance();
break;
default:
fragment = NotReadyFragment.newInstance();
}
return fragment;
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// MenuInflater inflater = getMenuInflater();
// inflater.inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// If the nav drawer is open, hide action items related to the content view
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerContianer);
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this.
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@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);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
@Override
public void onUserInfoChanged(UserInfo userInfo) {
showUserInfo(userInfo);
}
@Override
public void onLogin() {
}
@Override
public void onLogout() {
Intent intent = new Intent(this, LoginActivity.class);
startActivityForResult(intent, LOGIN_FROM_START);
MainActivity.this.overridePendingTransition(R.anim.slide_in_left, 0);
}
@Override
public void onLoginRequired() {
Intent intent = new Intent(this, LoginActivity.class);
startActivityForResult(intent, LOGIN_FROM_START);
MainActivity.this.overridePendingTransition(R.anim.slide_in_left, 0);
}
}