package com.example.GihyoTest;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.evernote.client.android.EvernoteSession;
import com.evernote.client.android.EvernoteUtil;
import com.evernote.client.android.OnClientCallback;
import com.evernote.client.conn.mobile.FileData;
import com.evernote.edam.type.Note;
import com.evernote.edam.type.Notebook;
import com.evernote.edam.type.Resource;
import com.evernote.edam.type.ResourceAttributes;
import com.evernote.thrift.transport.TTransportException;
import java.io.*;
import java.util.List;
public class SimpleNoteFragment extends Fragment implements ListNotebookDialogFragment.OnNotebookSelectedListener{
// Evernoteのセッション保持用変数
private EvernoteSession mEvernoteSession;
// レイアウト変数
private EditText mTitle, mContent;
private Button mSelectButton, mAttachButton, mSaveButton;
private ProgressDialogFragment mDialogFragment;
// ユーザが選択したNotebookのGuid格納用変数
private String[] guids;
private String guid;
private static final String LOGTAG = "SimpleNoteFragment";
// ギャラリーからの結果取得用
private String mFilename, mFilePath, mMimeType;
private static final int REQUEST_GALLERY = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View mView = inflater.inflate(R.layout.fragment_simplenote, container, false);
mTitle = (EditText) mView.findViewById(R.id.edit_title);
mContent = (EditText) mView.findViewById(R.id.edit_content);
mSelectButton = (Button) mView.findViewById(R.id.button_select);
mAttachButton = (Button) mView.findViewById(R.id.button_attach);
mSaveButton = (Button) mView.findViewById(R.id.button_save);
return mView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Sesssionオブジェクトのインスタンス生成/取得
mEvernoteSession = EvernoteSession.getInstance(getActivity(),
MainActivity.CONSUMER_KEY, MainActivity.CONSUMER_SECRET, MainActivity.EVERNOTE_SERVICE);
// 「ノートブックの選択」ボタンを押下時の処理
mSelectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
// ノートブック一覧の取得
mEvernoteSession.getClientFactory().createNoteStoreClient().listNotebooks(new OnClientCallback<List<Notebook>>() {
@Override
public void onSuccess(final List<Notebook> notebooks) {
CharSequence[] names = new CharSequence[notebooks.size()];
guids = new String[notebooks.size()];
// 選択ダイアログの表示用にノートブックの名前,
// 最終的にノートを作成するために, 選択されたノートブックを指定するためにノートブックのguidを保持
for(int i = 0; i < notebooks.size(); i++){
Notebook notebook = notebooks.get(i);
names[i] = notebook.getName();
guids[i] = notebook.getGuid();
}
// ノートブックの名前を渡してノートブック選択ダイアログ(フラグメント)を開く
Bundle args = new Bundle();
args.putCharSequenceArray("names", names);
FragmentManager fm = getFragmentManager();
ListNotebookDialogFragment mDialog = new ListNotebookDialogFragment();
mDialog.setArguments(args);
mDialog.setTargetFragment(getFragmentManager().findFragmentByTag("SimpleNote"), 0);
mDialog.show(fm, "listnotebooks");
}
@Override
public void onException(Exception exception) {
Log.e(LOGTAG, "Error listing notebooks", exception);
Toast.makeText(getActivity(), R.string.error_listing_notebooks, Toast.LENGTH_LONG).show();
}
});
} catch (TTransportException exception) {
Log.e(LOGTAG, "Error creating notestore", exception);
Toast.makeText(getActivity(), R.string.error_creating_notestore, Toast.LENGTH_LONG).show();
}
}
});
// 「画像を選択」した際にはギャラリーにインテントを飛ばす
mAttachButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_PICK);
startActivityForResult(intent, REQUEST_GALLERY);
}
});
// ノート保存時の処理
mSaveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String title = mTitle.getText().toString();
String content = mContent.getText().toString();
if (TextUtils.isEmpty(title) || TextUtils.isEmpty(content)) {
Toast.makeText(getActivity(), R.string.error_empty_content, Toast.LENGTH_LONG).show();
} else {
Note note = new Note();
note.setTitle(title);
if(content.contains("\n")) {
String[] contents = content.split("\n");
content = "";
for(int i = 0; i < contents.length; i++) {
if(contents[i].equals("")){
contents[i] = "<br />";
}
contents[i] = "<div>" + contents[i] + "</div>";
content += contents[i];
}
}
content = EvernoteUtil.NOTE_PREFIX + content;
// ユーザがnotebookを選択していた場合はguidも加える
if(guid != null) {
note.setNotebookGuid(guid);
}
// ユーザが画像を選択していた場合は画像も加える
if(mFilePath != null) {
try {
// 画像のハッシュデータを取得
InputStream in = new BufferedInputStream(new FileInputStream(mFilePath));
FileData data = new FileData(EvernoteUtil.hash(in), new File(mFilePath));
in.close();
// リソースの作成、ノートへの追加
Resource resource = new Resource();
resource.setData(data);
resource.setMime(mMimeType);
ResourceAttributes attributes = new ResourceAttributes();
attributes.setFileName(mFilename);
resource.setAttributes(attributes);
note.addToResources(resource);
content = content + "<br/>" + EvernoteUtil.createEnMediaTag(resource);
} catch (IOException exception){
Log.e(LOGTAG, "Error attaching an image", exception);
Toast.makeText(getActivity(), R.string.error_attaching_image, Toast.LENGTH_LONG).show();
}
}
content = content + EvernoteUtil.NOTE_SUFFIX;
note.setContent(content);
mDialogFragment = ProgressDialogFragment.newInstance();
mDialogFragment.show(getActivity().getFragmentManager(), "progress");
// ノート作成の処理
try {
mEvernoteSession.getClientFactory().createNoteStoreClient().createNote(note, new OnClientCallback<Note>() {
@Override
public void onSuccess(Note data) {
Toast.makeText(getActivity(), R.string.note_saved, Toast.LENGTH_LONG).show();
mDialogFragment.getDialog().dismiss();
}
@Override
public void onException(Exception exception) {
Log.e(LOGTAG, "Error saving note", exception);
Toast.makeText(getActivity(), R.string.error_saving_note, Toast.LENGTH_LONG).show();
mDialogFragment.getDialog().dismiss();
}
});
} catch (TTransportException exception) {
Log.e(LOGTAG, "Error creating notestore", exception);
Toast.makeText(getActivity(), R.string.error_creating_notestore, Toast.LENGTH_LONG).show();
mDialogFragment.getDialog().dismiss();
}
}
}
});
}
// ギャラリーへのインテントの戻り値を受け取る。
// ギャラリーで選択されたファイルのパス、MimeType、ファイル名を保存
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == REQUEST_GALLERY && resultCode == getActivity().RESULT_OK) {
try {
// データ情報を取得
Cursor c = getActivity().getContentResolver().query(data.getData(), null, null, null, null);
c.moveToFirst();
mFilename = c.getString(c.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME));
mMimeType = c.getString(c.getColumnIndex(MediaStore.MediaColumns.MIME_TYPE));
mFilePath = c.getString(c.getColumnIndex(MediaStore.MediaColumns.DATA));
// ファイル名をボタンに表示
mAttachButton.setText(mFilename);
} catch (Exception exception) {
Log.e(LOGTAG, "Error retrieving image source", exception);
}
}
}
// ノートブックが選択された事を検知するリスナー
@Override
public void onNotebookSelected(int position) {
if(guids != null) {
guid = guids[position];
}
}
}