package com.ouwenjie.note.fragment;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.afollestad.materialdialogs.MaterialDialog;
import com.gc.materialdesign.views.ButtonFloat;
import com.ouwenjie.note.R;
import com.ouwenjie.note.activity.EditNoteActivity;
import com.ouwenjie.note.activity.MainActivity;
import com.ouwenjie.note.adapter.BaseNoteAdapter;
import com.ouwenjie.note.db.NoteDatabaseHelper;
import com.ouwenjie.note.model.BaseNote;
import com.ouwenjie.note.utils.LogUtils;
import com.umeng.analytics.MobclickAgent;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;
import jp.wasabeef.recyclerview.animators.SlideInLeftAnimator;
import yalantis.com.sidemenu.interfaces.ScreenShotable;
/**
* Create at 2015年2月26日17:52:09 By ouwenjie
*/
public class ContentFragment extends Fragment implements View.OnClickListener ,ScreenShotable,
BaseNoteAdapter.OnItemClickListener, BaseNoteAdapter.OnItemLongClickListener {
public static final String KEY_CONTENT_TYPE = "Content_Type";
public static final String RECORD = "Record";
public static final String REMIND = "Remind";
public static final String ARCHIVE = "Archive";
public static final String RECYCLE = "Recycle";
public String Content_Type = "";
// 切换动画 所需的两个成员
private View containerView;
private Bitmap bitmap;
private Activity activity;
private RecyclerView recyclerView;
private BaseNoteAdapter adapter;
private RecyclerView.LayoutManager layoutManager;
private ButtonFloat fab;
private List<BaseNote> noteList = new ArrayList<>();
private NoteDatabaseHelper dbHelper = new NoteDatabaseHelper();
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
* @return A new instance of fragment MemoFragment.
*/
// TODO: Rename and change types and number of parameters
public static ContentFragment newInstance(String type) {
ContentFragment fragment = new ContentFragment();
Bundle bundle = new Bundle();
bundle.putString(KEY_CONTENT_TYPE,type);
fragment.setArguments(bundle);
return fragment;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.activity = activity;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
this.containerView = view.findViewById(R.id.container);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
Content_Type = getArguments().getString(KEY_CONTENT_TYPE);
}
}
@Override
public void onResume() {
super.onResume();
umengPageStart();
switchFabState();
}
@Override
public void onPause() {
super.onPause();
umengPageEnd();
}
private void umengPageStart() {
switch (Content_Type){
case RECORD:
MobclickAgent.onPageStart("RecordFragment"); //统计页面
break;
case REMIND:
MobclickAgent.onPageStart("RemindFragment"); //统计页面
break;
case ARCHIVE:
MobclickAgent.onPageStart("ArchiveFragment"); //统计页面
break;
case RECYCLE:
MobclickAgent.onPageStart("RecycleFragment"); //统计页面
break;
default:
break;
}
}
private void umengPageEnd() {
switch (Content_Type){
case RECORD:
MobclickAgent.onPageEnd("RecordFragment"); //统计页面
break;
case REMIND:
MobclickAgent.onPageEnd("RemindFragment"); //统计页面
break;
case ARCHIVE:
MobclickAgent.onPageEnd("ArchiveFragment"); //统计页面
break;
case RECYCLE:
MobclickAgent.onPageEnd("RecycleFragment"); //统计页面
break;
default:
break;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_content, container, false);
fab = (ButtonFloat) view.findViewById(R.id.new_edit_fab);
fab.setOnClickListener(this);
recyclerView = (RecyclerView) view.findViewById(R.id.content_recyclerview);
initRecyclerView();
LogUtils.e("onCreateView");
return view;
}
private void switchFabState() {
switch (Content_Type){
case RECORD:
fab.setVisibility(View.VISIBLE);
break;
case REMIND:
fab.setVisibility(View.VISIBLE);
break;
case ARCHIVE:
fab.setVisibility(View.GONE);
break;
case RECYCLE:
fab.setVisibility(View.GONE);
break;
default:
break;
}
}
public void clearNoteList(){
noteList.clear();
}
public void initRecyclerView() {
layoutManager = new GridLayoutManager(activity,2);
recyclerView.setLayoutManager(layoutManager);
adapter = new BaseNoteAdapter(activity,myDataset());
adapter.setOnItemClickListener(this);
adapter.setOnItemLongClickListener(this);
recyclerView.setAdapter(adapter);
recyclerView.setItemAnimator(new SlideInLeftAnimator());
recyclerView.getItemAnimator().setAddDuration(300);
recyclerView.getItemAnimator().setRemoveDuration(300);
recyclerView.getItemAnimator().setMoveDuration(300);
recyclerView.getItemAnimator().setChangeDuration(300);
}
public List<BaseNote> myDataset() {
TreeSet<BaseNote> allNote = ((MainActivity) activity).getNoteSet();
switch (Content_Type){
case RECORD:
for (BaseNote anNote : allNote) {
if ((anNote.getNoteType() == BaseNote.NOTE_TYPE_RECORD || anNote.getNoteType() == BaseNote.NOTE_TYPE_REMIND)
&& (anNote.getNoteState()==BaseNote.NOTE_STATE_VALID)) {
noteList.add(anNote);
}
}
break;
case REMIND:
for (BaseNote anNote : allNote) {
// 获取当前状态为‘有效的’ 和 ‘提醒有效期的’的note
if (anNote.getAlarmState() == BaseNote.NOTE_ALARM_STATE_VALID && (anNote.getNoteState()==BaseNote.NOTE_STATE_VALID)) {
noteList.add(anNote);
}
}
break;
case ARCHIVE:
for (BaseNote anNote : allNote) {
if (anNote.getNoteState()==BaseNote.NOTE_STATE_INVALID) {
noteList.add(anNote);
}
}
break;
case RECYCLE:
for (BaseNote anNote : allNote) {
// 获取删除状态的NOTE
if (anNote.getNoteState()==BaseNote.NOTE_STATE_DELETE) {
noteList.add(anNote);
}
}
break;
default:
break;
}
return noteList;
}
public BaseNoteAdapter getAdapter() {
return adapter;
}
public void setAdapter(BaseNoteAdapter adapter) {
this.adapter = adapter;
}
/**
* 菜单栏转换栏目时的动画效果所需的方法之一
*/
@Override
public void takeScreenShot() {
Thread thread = new Thread() {
@Override
public void run() {
Bitmap bitmap = Bitmap.createBitmap(containerView.getWidth(),
containerView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
containerView.draw(canvas);
ContentFragment.this.bitmap = bitmap;
}
};
thread.start();
}
@Override
public Bitmap getBitmap() {
return bitmap;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.new_edit_fab:
createNewNote();
break;
default:
break;
}
}
private void createNewNote() {
Intent intent = new Intent(activity, EditNoteActivity.class);
intent.putExtra(BaseNote.KEY_DB_ID, -1);
if(Content_Type.equals(RECORD)) {
intent.putExtra(BaseNote.KEY_NOTE_TYPE, BaseNote.NOTE_TYPE_RECORD);
activity.startActivityForResult(intent, BaseNote.REQ_NEW_NOTE);
}else if(Content_Type.equals(REMIND)){
intent.putExtra(BaseNote.KEY_NOTE_TYPE, BaseNote.NOTE_TYPE_REMIND);
activity.startActivityForResult(intent, BaseNote.REQ_NEW_NOTE_WITH_ALARM); // 新建一个‘提醒’类型的NOTE
}else{
}
}
// 当列表中的Item 被点击事,返回一个noteList 的 数据库的id
@Override
public void onItemClick(String dbID ) {
BaseNote note = dbHelper.get(Long.valueOf(dbID));
if(note != null) {
Intent editIntent = new Intent(activity, EditNoteActivity.class);
long dbId = dbHelper.getId(note);
editIntent.putExtra(BaseNote.KEY_DB_ID, dbId);
adapter.removeItem(note);
switch (Content_Type) {
case RECORD:
activity.startActivityForResult(editIntent, BaseNote.REQ_NEW_NOTE);
break;
case REMIND:
activity.startActivityForResult(editIntent, BaseNote.REQ_NEW_NOTE_WITH_ALARM);
break;
case ARCHIVE:
activity.startActivityForResult(editIntent, BaseNote.REQ_NOTE_IN_ARCHIVE);
break;
default:
break;
}
}
}
@Override
public void onItemLongClick(final String dbID) {
switch(Content_Type){
case RECORD:
showRecordNoteDialog(dbID);
break;
case REMIND:
showRemindNoteDialog(dbID);
break;
case ARCHIVE:
showArchiveNoteDialog(dbID);
break;
case RECYCLE:
showRecycleNoteDialog(dbID);
break;
default:
break;
}
}
private void showRecordNoteDialog(final String dbID) {
MaterialDialog dialog = new MaterialDialog.Builder(activity)
.title("归档或删除?")
.positiveText("归档")
.negativeText("删除")
.neutralText("取消")
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
dialog.dismiss();
BaseNote note = dbHelper.get(Long.valueOf(dbID));
note.setNoteState(BaseNote.NOTE_STATE_INVALID); // 归档,NOTE状态为 INVALID,进入归档,并从当前列表中除去
dbHelper.sava(note);
// note.save();
adapter.removeItem(note);
// Note 从 列表和数据库中删除后,需要更新 Application 和 Activity 中保存的 NoteSet ,避免再次显示。
refreshData();
}
@Override
public void onNegative(MaterialDialog dialog) {
dialog.dismiss();
BaseNote note = dbHelper.get(Long.valueOf(dbID));
note.setNoteState(BaseNote.NOTE_STATE_DELETE);// 删除,NOTE 状态为 DELETE,进入回收站
dbHelper.sava(note);
// note.save();
adapter.removeItem(note);
// Note 从 列表和数据库中删除后,需要更新 Application 和 Activity 中保存的 NoteSet ,避免再次显示。
refreshData();
}
@Override
public void onNeutral(MaterialDialog dialog){
dialog.dismiss();
}
}).build();
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
private void showRemindNoteDialog(final String dbID){
MaterialDialog dialog = new MaterialDialog.Builder(activity)
.title("归档或删除?")
.positiveText("归档")
.negativeText("删除")
.neutralText("取消")
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
dialog.dismiss();
BaseNote note = dbHelper.get(Long.valueOf(dbID));
note.setNoteState(BaseNote.NOTE_STATE_INVALID);
dbHelper.sava(note);
// note.save();
adapter.removeItem(note);
// Note 从 列表和数据库中删除后,需要更新 Application 和 Activity 中保存的 NoteSet ,避免再次显示。
refreshData();
}
@Override
public void onNegative(MaterialDialog dialog) {
dialog.dismiss();
BaseNote note = dbHelper.get(Long.valueOf(dbID));
note.setNoteState(BaseNote.NOTE_STATE_DELETE);
dbHelper.sava(note);
// note.save();
// note.delete();
adapter.removeItem(note);
// Note 从 列表和数据库中删除后,需要更新 Application 和 Activity 中保存的 NoteSet ,避免再次显示。
refreshData();
}
@Override
public void onNeutral(MaterialDialog dialog){
dialog.dismiss();
}
}).build();
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
private void showArchiveNoteDialog(final String dbID){
MaterialDialog dialog = new MaterialDialog.Builder(activity)
.title("恢复或删除?")
.positiveText("恢复")
.negativeText("删除")
.neutralText("取消")
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
dialog.dismiss();
BaseNote note = dbHelper.get(Long.valueOf(dbID));
note.setNoteState(BaseNote.NOTE_STATE_VALID); // 将归档的NOTE 恢复为 正常状态
dbHelper.sava(note);
// note.save();
adapter.removeItem(note);
// Note 从 列表和数据库中删除后,需要更新 Application 和 Activity 中保存的 NoteSet ,避免再次显示。
refreshData();
}
@Override
public void onNegative(MaterialDialog dialog) {
dialog.dismiss();
BaseNote note = dbHelper.get(Long.valueOf(dbID));
note.setNoteState(BaseNote.NOTE_STATE_DELETE);
dbHelper.sava(note);
// note.save();
adapter.removeItem(note);
// Note 从 列表和数据库中删除后,需要更新 Application 和 Activity 中保存的 NoteSet ,避免再次显示。
refreshData();
}
@Override
public void onNeutral(MaterialDialog dialog){
dialog.dismiss();
}
}).build();
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
private void showRecycleNoteDialog(final String dbID){
MaterialDialog dialog = new MaterialDialog.Builder(activity)
.title("恢复或清除?")
.positiveText("恢复")
.negativeText("清除")
.neutralText("取消")
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
dialog.dismiss();
BaseNote note = dbHelper.get(Long.valueOf(dbID));
note.setNoteState(BaseNote.NOTE_STATE_VALID); // 恢复NOTE 为正常状态
note.save();
adapter.removeItem(note);
// Note 从 列表和数据库中删除后,需要更新 Application 和 Activity 中保存的 NoteSet ,避免再次显示。
refreshData();
}
@Override
public void onNegative(MaterialDialog dialog) {
dialog.dismiss();
BaseNote note = dbHelper.get(Long.valueOf(dbID));
// note.setNoteState(BaseNote.NOTE_STATE_DELETE);
// note.save();
note.delete(); // 将NOTE 从数据库中彻底删除
adapter.removeItem(note);
// Note 从 列表和数据库中删除后,需要更新 Application 和 Activity 中保存的 NoteSet ,避免再次显示。
refreshData();
}
@Override
public void onNeutral(MaterialDialog dialog){
dialog.dismiss();
}
}).build();
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
private void refreshData() {
((MainActivity) activity).setNoteSet(new NoteDatabaseHelper().getAll());
}
}