package com.ouwenjie.note.activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.widget.LinearLayout;
import com.ouwenjie.note.NoteApplication;
import com.ouwenjie.note.R;
import com.ouwenjie.note.activity.account.LoginActivity;
import com.ouwenjie.note.activity.account.UserCenterActivity;
import com.ouwenjie.note.db.NoteDatabaseHelper;
import com.ouwenjie.note.fragment.ContentFragment;
import com.ouwenjie.note.helper.BmobHelper;
import com.ouwenjie.note.helper.MyActivityManager;
import com.ouwenjie.note.helper.TencentSDKHelper;
import com.ouwenjie.note.model.BaseNote;
import com.ouwenjie.note.model.JideUser;
import com.ouwenjie.note.utils.LogUtils;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.UiError;
import com.umeng.analytics.MobclickAgent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;
import io.codetail.animation.SupportAnimator;
import io.codetail.animation.ViewAnimationUtils;
import yalantis.com.sidemenu.interfaces.Resourceble;
import yalantis.com.sidemenu.interfaces.ScreenShotable;
import yalantis.com.sidemenu.model.SlideMenuItem;
import yalantis.com.sidemenu.util.ViewAnimator;
public class MainActivity extends ActionBarActivity implements ViewAnimator.ViewAnimatorListener {
public static final String CLOSE = "Close";
public static final String MAIN = "记得";
public static final String RECORD = "记事";
// public static final String LIST = "清单"; // 暂时未开发
public static final String REMIND = "提醒";
public static final String ARCHIVE = "已归档";
public static final String RECYCLE = "回收站";
public static final String ACCOUNT = "账号";
public static final String SETTINGS = "设置";
private DrawerLayout drawerLayout; // 整个布局框架
private ActionBarDrawerToggle drawerToggle;
private List<SlideMenuItem> menuItemList = new ArrayList<>(); // 左侧 Menu 列表
private ViewAnimator viewAnimator; // 页面切换动画
private LinearLayout leftlayout; // 左侧 Menu
private TreeSet<BaseNote> noteSet = new TreeSet<>(); //笔记集合
private NoteDatabaseHelper databaseHelper;
private ContentFragment contentFragment;
private ContentFragment recordFragment;
private ContentFragment listFragment; // 未开发
private ContentFragment remindFragment;
private ContentFragment archiveFragment;
private ContentFragment recycleFragment;
private TencentSDKHelper tencentSDKHelper;
private JideUser mUser;
private NoteApplication application;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyActivityManager.getInstance().addActivity(this);
application = NoteApplication.getNoteApplication(this);
databaseHelper = new NoteDatabaseHelper();
BmobHelper.initBmob(this);
tencentSDKHelper = TencentSDKHelper.getInstance(this.getApplicationContext());
checkQQLogState();
updateNoteSet();
CreateActivity();
}
/**
* 初始化页面
*/
private void CreateActivity() {
recordFragment = ContentFragment.newInstance(ContentFragment.RECORD);
getSupportFragmentManager().beginTransaction()
.replace(R.id.content_frame,recordFragment)
.commit();
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerLayout.setScrimColor(Color.TRANSPARENT);
leftlayout = (LinearLayout) findViewById(R.id.left_drawer);
leftlayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
drawerLayout.closeDrawers();
}
});
setToolBar();
setTitle(RECORD);
createMenuList();
viewAnimator = new ViewAnimator<>(MainActivity.this, menuItemList, recordFragment, drawerLayout, this);
}
@Override
protected void onResume() {
super.onResume();
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);// 淡化status bar 和 navigation bar
MobclickAgent.onResume(this);
if(JideUser.getLoginStatusChanged(this.getApplicationContext())) { // 当为true 时说明登录状态已被改变
LogUtils.e("MainActivity == ","onResume() == LoginStatusChanged");
// 根据登录状态显示相应的NOTE SET
if (application.isVisitor()) {
removeUserNote();
} else {
// TODO 更新CloudNote 到本地
}
JideUser.setLoginStatusChanged(this.getApplicationContext(),false);
}
}
// 获取游客的NOTE SET,清除用户的NOTE
private void removeUserNote() {
updateNoteSet();
for (BaseNote note : noteSet) {
LogUtils.e("RemoveUserNote ==","userId="+note.getUserid());
if (!note.getUserid().equals("0")) {
databaseHelper.delete(note);
}
}
updateNoteSet();
notificationDataChangedToFragment();
}
private void checkQQLogState() {
mUser = application.getUser();
// 获取QQ登录授权有限期,没有则是-1
long expireTime = mUser.getExpireTime(this.getApplicationContext());
LogUtils.e("checkQQLogState ==","ExpireTime="+expireTime);
if(System.currentTimeMillis() > expireTime) { // 如果已经过期,或者没有登录
mUser.removeAllAuth(getApplicationContext()); // 清除所有授权信息
application.setVisitor(true); // 游客状态
removeUserNote();
}else{
// TODO 从云端获取该账号的NOTE SET
String token = mUser.getAccess_token(getApplicationContext());
String expires = mUser.getExpires_in(getApplicationContext());
String openId = mUser.getOpenid(getApplicationContext());
tencentSDKHelper.getTencent().setAccessToken(token,expires);
tencentSDKHelper.getTencent().setOpenId(openId);
tencentSDKHelper.login(this, new IUiListener() {
@Override
public void onComplete(Object o) {}
@Override
public void onError(UiError uiError) {
mUser.removeAllAuth(getApplicationContext());
NoteApplication.getNoteApplication(MainActivity.this).setVisitor(true);
}
@Override
public void onCancel() {}
});
}
}
@Override
protected void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
MyActivityManager.getInstance().finishActivity(this.getClass());
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case BaseNote.REQ_NEW_NOTE:
if(resultCode == RESULT_OK) { // 用户新建了一个记录,重新拿一遍数据库,将最新添加的记录传递到Fragment,更新列表。
updateNoteSet();
Iterator<BaseNote> iterator = noteSet.iterator();
recordFragment.getAdapter().addItem(iterator.next(),0);
}
LogUtils.e("noteList Size == "+noteSet.size()+"");
break;
case BaseNote.REQ_NOTE_IN_ARCHIVE:
if(resultCode == RESULT_OK) { // 用户新建了一个记录,重新拿一遍数据库,将最新添加的记录传递到Fragment,更新列表。
updateNoteSet();
Iterator<BaseNote> iterator = noteSet.iterator();
archiveFragment.getAdapter().addItem(iterator.next(),0);
}
LogUtils.e("noteList Size == "+noteSet.size()+"");
break;
case BaseNote.REQ_NEW_NOTE_WITH_ALARM:
if(resultCode == RESULT_OK) { // 用户新建了一个记录,重新拿一遍数据库,将最新添加的记录传递到Fragment,更新列表。
updateNoteSet();
Iterator<BaseNote> iterator = noteSet.iterator();
BaseNote note = iterator.next();
if(note.getAlarmState()==BaseNote.NOTE_ALARM_STATE_VALID) {
remindFragment.getAdapter().addItem(note, 0);
}
}
LogUtils.e("noteList Size == "+noteSet.size()+"");
break;
}
}
/**
* 通知当前fragment 更新Adapter
*/
private void notificationDataChangedToFragment() {
switch (getTitle().toString()){
case RECORD:
LogUtils.e("notificationDataChangedToFragment == "+" RECORD ");
recordFragment.clearNoteList();
recordFragment.initRecyclerView();
break;
// case LIST:
// break;
case REMIND:
remindFragment.clearNoteList();
remindFragment.initRecyclerView();
break;
case ARCHIVE:
archiveFragment.clearNoteList();
archiveFragment.initRecyclerView();
break;
case RECYCLE:
recycleFragment.clearNoteList();
recycleFragment.initRecyclerView();
break;
default:
break;
}
}
private void updateNoteSet() {
noteSet = databaseHelper.getAll();
}
public TreeSet<BaseNote> getNoteSet() {
return noteSet;
}
public void setNoteSet(TreeSet<BaseNote> noteSet) {
this.noteSet = noteSet;
}
private void setToolBar() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Drawer 的监听
drawerToggle = new ActionBarDrawerToggle(
MainActivity.this, /* host Activity */
drawerLayout, /* DrawerLayout object */
toolbar, /* nav drawer icon to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description */
R.string.drawer_close /* "close drawer" description */
) {
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
leftlayout.removeAllViews();
leftlayout.invalidate();
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, slideOffset);
if (slideOffset > 0.6 && leftlayout.getChildCount() == 0)
viewAnimator.showMenuContent();
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
}
};
drawerLayout.setDrawerListener(drawerToggle);
}
/**
* 创建侧滑菜单的列表
*/
private void createMenuList() {
SlideMenuItem menuItem0 = new SlideMenuItem(CLOSE, R.drawable.icn_close);
menuItemList.add(menuItem0);
SlideMenuItem menuItem1 = new SlideMenuItem(RECORD, R.drawable.icon_cn_record_104);
menuItemList.add(menuItem1);
// SlideMenuItem menuItem2 = new SlideMenuItem(LIST, R.drawable.icon_cn_list_104);
// menuItemList.add(menuItem2);
SlideMenuItem menuItem3 = new SlideMenuItem(REMIND, R.drawable.icon_cn_remind_104);
menuItemList.add(menuItem3);
SlideMenuItem menuItem4 = new SlideMenuItem(ARCHIVE,R.drawable.icon_cn_archive_104);
menuItemList.add(menuItem4);
SlideMenuItem menuItem5 = new SlideMenuItem(RECYCLE,R.drawable.icon_cn_recycle_104);
menuItemList.add(menuItem5);
SlideMenuItem menuItem6 = new SlideMenuItem(ACCOUNT,R.drawable.icon_cn_account_104);
menuItemList.add(menuItem6);
SlideMenuItem menuItem7 = new SlideMenuItem(SETTINGS, R.drawable.icon_cn_settings_104);
menuItemList.add(menuItem7);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
//该方法会自动和actionBar关联, 将开关的图片显示在了action上,如果不设置,也可以有抽屉的效果,不过是默认的图标
drawerToggle.syncState();
}
/**
* 设置改变时
* @param newConfig
*/
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
/**
* 创建Menu按键的菜单
* @param menu
* @return
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
final SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setQueryHint("搜索笔记内容");
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
LogUtils.e("onQueryTextSubmit == " + query);
queryNote(query);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
LogUtils.e("onQueryTextChange == " + newText);
if (newText.equals("")) {
resumeNote();
}
return false;
}
});
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) { // 先交给 ActionBarDrawerToggle 处理
return true;
}
switch (item.getItemId()) {
case R.id.action_search:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/**
* 根据条件搜索Note
* @param query
*/
private void queryNote(String query) {
switch (getTitle().toString()){
case RECORD:
recordFragment.getAdapter().searchNotes(query);
break;
// case LIST:
// break;
case REMIND:
remindFragment.getAdapter().searchNotes(query);
break;
case ARCHIVE:
archiveFragment.getAdapter().searchNotes(query);
break;
case RECYCLE:
recycleFragment.getAdapter().searchNotes(query);
break;
default:
break;
}
}
/**
* 去除搜索结果,恢复原本列表
*/
private void resumeNote(){
switch (getTitle().toString()){
case RECORD:
recordFragment.getAdapter().removeAllItem();
recordFragment.initRecyclerView();
break;
// case LIST:
// break;
case REMIND:
remindFragment.getAdapter().removeAllItem();
remindFragment.initRecyclerView();
break;
case ARCHIVE:
archiveFragment.getAdapter().removeAllItem();
archiveFragment.initRecyclerView();
break;
case RECYCLE:
recycleFragment.getAdapter().removeAllItem();
recycleFragment.initRecyclerView();
break;
default:
break;
}
}
/**
* 切换Fragment
* @param screenShotable
* 一个实现了 ScreenShotable 接口的 Fragment 对象
* @param topPosition
* @return
*/
private ScreenShotable replaceFragment(Resourceble slideMenuItem,ScreenShotable screenShotable, int topPosition) {
View view = findViewById(R.id.content_frame);
int finalRadius = Math.max(view.getWidth(), view.getHeight());
SupportAnimator animator = ViewAnimationUtils.createCircularReveal(view, 0, topPosition, 0, finalRadius);
animator.setInterpolator(new AccelerateInterpolator());
animator.setDuration(ViewAnimator.CIRCULAR_REVEAL_ANIMATION_DURATION);
findViewById(R.id.content_overlay).setBackgroundDrawable(new BitmapDrawable(getResources(), screenShotable.getBitmap()));
animator.start();
switch (slideMenuItem.getName()){
case RECORD:
recordFragment = ContentFragment.newInstance(ContentFragment.RECORD);
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, recordFragment).commit();
return recordFragment;
// case LIST:
// listFragment = ListFragment.newInstance();
// getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, listFragment).commit();
// return listFragment;
case REMIND:
remindFragment = ContentFragment.newInstance(ContentFragment.REMIND);
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, remindFragment).commit();
return remindFragment;
case ARCHIVE:
archiveFragment = ContentFragment.newInstance(ContentFragment.ARCHIVE);
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame,archiveFragment).commit();
return archiveFragment;
case RECYCLE:
recycleFragment = ContentFragment.newInstance(ContentFragment.RECYCLE);
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame,recycleFragment).commit();
return recycleFragment;
default:
break;
}
return recordFragment;
}
/**
* implements ViewAnimator.ViewAnimatorListener 所需实现的4个方法
*/
/**
* @param slideMenuItem
* @param screenShotable
* @param position
* @return
*/
@Override
public ScreenShotable onSwitch(Resourceble slideMenuItem, ScreenShotable screenShotable, int position) {
switch (slideMenuItem.getName()) {
case CLOSE:
return screenShotable;
default:
if(slideMenuItem.getName().equals(SETTINGS)){
startActivity(new Intent(MainActivity.this, SettingsActivity.class));
return screenShotable;
}else if(slideMenuItem.getName().equals(ACCOUNT)){
if(application.isVisitor()) {
startActivity(new Intent(MainActivity.this, LoginActivity.class));
}else{
startActivity(new Intent(MainActivity.this, UserCenterActivity.class));
}
return screenShotable;
}else {
setTitle(slideMenuItem.getName());
return replaceFragment(slideMenuItem, screenShotable, position);
}
}
}
@Override
public void disableHomeButton() {
getSupportActionBar().setHomeButtonEnabled(false);
}
@Override
public void enableHomeButton() {
getSupportActionBar().setHomeButtonEnabled(true);
drawerLayout.closeDrawers();
}
@Override
public void addViewToContainer(View view) {
leftlayout.addView(view);
}
}