3 import java.util.ArrayList;
4 import java.util.Collections;
7 import android.content.BroadcastReceiver;
8 import android.content.Context;
9 import android.content.Intent;
10 import android.content.IntentFilter;
11 import android.database.sqlite.SQLiteDatabase;
12 import android.graphics.Bitmap;
13 import android.graphics.PixelFormat;
14 import android.os.Bundle;
15 import android.text.Editable;
16 import android.text.TextWatcher;
17 import android.view.Gravity;
18 import android.view.Menu;
19 import android.view.MenuItem;
20 import android.view.View;
21 import android.view.View.OnClickListener;
22 import android.view.WindowManager;
23 import android.view.inputmethod.InputMethodManager;
24 import android.widget.Button;
25 import android.widget.EditText;
26 import android.widget.LinearLayout;
27 import android.widget.TextView;
29 import com.yuji.ef.common.CommonUtil;
30 import com.yuji.ef.common.Constant;
31 import com.yuji.ef.dao.DatabaseHelper;
32 import com.yuji.ef.dao.DirNode;
33 import com.yuji.ef.dao.FileNode;
34 import com.yuji.ef.dao.LockDao;
35 import com.yuji.ef.dao.Node;
36 import com.yuji.ef.dao.Node.Status;
37 import com.yuji.ef.dao.NodeCacheDao;
38 import com.yuji.ef.dao.NodeComparator;
39 import com.yuji.ef.dao.NodeDao;
40 import com.yuji.ef.dao.NodeDaoImpl;
41 import com.yuji.ef.dao.RootNode;
42 import com.yuji.ef.utility.BaseActivity;
43 import com.yuji.ef.utility.BitmapCacheFactory;
44 import com.yuji.ef.utility.EvernoteIntentUtil;
45 import com.yuji.ef.utility.FolderUtil;
46 import com.yuji.ef.utility.LockHandler;
47 import com.yuji.ef.utility.LockListener;
48 import com.yuji.ef.utility.ScaleUtil;
50 public class EverFolderActivity extends BaseActivity implements LockListener {
51 private enum ScreenStatus {
52 Normal, AddNode, DeleteNode, RenameNode
55 private LinearLayout msgLayout;
56 private LinearLayout msgButtonLayout;
57 private Button msgOkButton;
58 private Button msgCancelButton;
59 private EditText msgEditText;
61 private IconFrameLayout layout;
62 private TextView confirmMsg;
63 private IconScrollView scrollView;
64 private LinearLayout buttonLayout;
65 private Button leftButton;
66 private Button rightButton;
67 // private Button addButton;
68 // private Button deleteButton;
70 private ScreenStatus status;
71 private NodeComparator nodeComparator = new NodeComparator();
72 private BitmapCacheFactory bitmapFactory = BitmapCacheFactory.getInstance();
73 private Node top = null;
74 private int indent = 0;
75 private int bmpPaddingLeft;
78 private boolean lock = false;
79 private boolean isInit = true;
80 private boolean isInCycle = false;
81 private boolean isResult = false;
83 private BroadcastReceiver receiver = new BroadcastReceiver() {
85 public void onReceive(Context context, Intent intent) {
86 String action = intent.getAction();
88 if (action.compareTo(Constant.ACTION_UPDATE) == 0) {
89 if (isInCycle && !lock) {
90 LockDao lockDao = (LockDao) LockDao.getInstance();
91 lock = lockDao.lock(EverFolderActivity.this,
92 Constant.LOCK_UPDATE_NOTE);
95 // ほんとは、setStatus()に入れたい
96 layout.setVisibility(View.VISIBLE);
105 public void onCreate(Bundle savedInstanceState) {
106 super.onCreate(savedInstanceState);
107 setContentView(R.layout.main);
110 IntentFilter intentFilter = new IntentFilter();
111 intentFilter.addAction(Constant.ACTION_UPDATE);
112 registerReceiver(receiver, intentFilter);
114 scrollView = (IconScrollView) findViewById(R.id.scrollView);
115 layout = (IconFrameLayout) findViewById(R.id.frameLayout);
116 layout.setActivity(this);
117 layout.setScrollView(scrollView);
119 buttonLayout = (LinearLayout) findViewById(R.id.mainButtonLayout);
120 leftButton = (Button) findViewById(R.id.leftButton);
121 rightButton = (Button) findViewById(R.id.rightButton);
122 // addButton = (Button) findViewById(R.id.addButton);
123 // deleteButton = (Button) findViewById(R.id.deleteButton);
125 msgLayout = (LinearLayout) findViewById(R.id.mainMsgLayout);
126 confirmMsg = (TextView) findViewById(R.id.mainConfirmMsg);
127 msgEditText = (EditText) findViewById(R.id.mainMsgEditText);
128 msgButtonLayout = (LinearLayout) findViewById(R.id.mainMsgButtonLayout);
129 msgOkButton = (Button) findViewById(R.id.mainMsgOkButton);
130 msgCancelButton = (Button) findViewById(R.id.mainMsgCancelButton);
132 leftButton.setOnClickListener(new OnClickListener() {
134 public void onClick(View v) {
138 rightButton.setOnClickListener(new OnClickListener() {
140 public void onClick(View v) {
141 rightButtonOnClick();
144 // addButton.setOnClickListener(new OnClickListener() {
146 // public void onClick(View v) {
147 // addButtonOnClick();
150 // deleteButton.setOnClickListener(new OnClickListener() {
152 // public void onClick(View v) {
153 // deleteButtonOnClick();
157 msgEditText.addTextChangedListener(new TextWatcher() {
158 public void afterTextChanged(Editable s) {
159 if (status != ScreenStatus.DeleteNode) {
160 String text = s.toString();
161 msgOkButton.setEnabled(text.length() > 0);
163 msgOkButton.setEnabled(true);
167 public void beforeTextChanged(CharSequence s, int start,
168 int count, int after) {
172 public void onTextChanged(CharSequence s, int start,
173 int before, int count) {
178 msgOkButton.setOnClickListener(new OnClickListener() {
180 public void onClick(View v) {
181 msgOkButtonOnClick(v);
184 msgCancelButton.setOnClickListener(new OnClickListener() {
186 public void onClick(View v) {
191 ScaleUtil scaleUtil = ScaleUtil.getInstance();
192 scaleUtil.init(this);
194 bitmapFactory.init(this);
195 Node node = new DirNode(null, null);
197 bmp = bitmapFactory.get(node.getStatusIconId());
198 bmpPaddingLeft = bmp.getWidth();
199 bmp = bitmapFactory.get(node.getIconId());
200 bmpWidth = bmp.getWidth();
202 float fSize = 48 * (1 / 2.0f);
203 leftButton.setTextSize(fSize);
204 rightButton.setTextSize(fSize);
205 } catch (Exception e) {
212 public boolean onCreateOptionsMenu(Menu menu) {
213 boolean ret = super.onCreateOptionsMenu(menu);
216 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "カット");
217 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "ペースト");
218 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "追加");
219 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "削除");
220 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "リネーム");
221 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "設定");
226 public boolean onMenuOpened(int featureId, Menu menu) {
227 boolean ret = super.onMenuOpened(featureId, menu);
236 boolean cutButtonFlag = false;
237 boolean pastButtonFlag = false;
238 boolean addButtonFlag = false;
239 boolean deleteButtonFlag = false;
240 boolean renameButtonFlag = false;
241 boolean confButtonFlag = true;
243 if (status == ScreenStatus.Normal) {
244 LabelIconView target = layout.getSelectedTarget();
245 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
248 if (target != null) {
249 id = target.getNodeId();
250 node = dao.searchById(id);
253 if (isDirNode(target, node, false) || isFileNode(node)) {
254 cutButtonFlag = true;
256 if (isDirNode(target, node, true) && isCut()) {
257 pastButtonFlag = true;
259 if (isDirNode(target, node, true)) {
260 addButtonFlag = true;
262 if (isDirNode(target, node, false) && !isNoteBook(node)
263 && CommonUtil.isNull(node.getChildrenString())) {
264 deleteButtonFlag = true;
266 if (isDirNode(target, node, false) && !isNoteBook(node)) {
267 renameButtonFlag = true;
272 item = menu.getItem(index++);
273 item.setVisible(cutButtonFlag);
274 item = menu.getItem(index++);
275 item.setVisible(pastButtonFlag);
276 item = menu.getItem(index++);
277 item.setVisible(addButtonFlag);
278 item = menu.getItem(index++);
279 item.setVisible(deleteButtonFlag);
280 item = menu.getItem(index++);
281 item.setVisible(renameButtonFlag);
282 item = menu.getItem(index++);
283 item.setVisible(confButtonFlag);
288 private boolean isFileNode(Node node) {
289 if (node == null || !(node instanceof FileNode)) {
295 private boolean isDirNode(LabelIconView target, Node node,
296 boolean containRoot) {
297 if (target == null) {
303 if (!containRoot && (node instanceof RootNode)) {
306 if (!(node instanceof DirNode)) {
312 private boolean isNoteBook(Node node) {
316 if (CommonUtil.isNull(node.getGuid())) {
322 private boolean isCut() {
323 LabelIconView srcTarget = layout.getCutTarget();
324 if (srcTarget == null) {
331 public boolean onOptionsItemSelected(MenuItem item) {
334 switch (item.getItemId()) {
353 intent = new Intent(this, (Class<?>) SettingActivity.class);
354 startActivityForResult(intent, 0);
359 } catch (Exception e) {
362 return super.onOptionsItemSelected(item);
365 private void dummy() {
366 NodeDaoImpl dao = (NodeDaoImpl) NodeCacheDao.getInstance();
367 List<Node> list = dao.search();
368 for (Node node : list) {
369 System.out.println(node.toString());
373 private void dummy2() {
374 LockDao dao = (LockDao) LockDao.getInstance();
378 b = dao.lock(this, "key");
379 b = dao.lock(this, "key");
380 b = dao.lock(new Object(), "key");
381 dao.unlock(this, "key");
382 b = dao.lock(new Object(), "key");
383 b = dao.lock(this, "key");
384 b = dao.lock(this, "key");
385 b = dao.lock(this, "key");
386 dao.unlock(new Object(), "key");
388 } catch (Exception e) {
394 private void selectMenuAdd() {
395 setStatus(ScreenStatus.AddNode);
398 private void selectMenuDelete() {
399 setStatus(ScreenStatus.DeleteNode);
402 private void selectMenuRename() {
403 LabelIconView target = layout.getSelectedTarget();
404 if (target == null) {
408 long id = target.getNodeId();
409 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
410 Node node = dao.searchById(id);
412 String text = node.getName();
413 msgEditText.setText(text);
414 setStatus(ScreenStatus.RenameNode);
418 private void selectMenuCut() {
419 LabelIconView target = layout.getSelectedTarget();
420 if (target == null) {
424 layout.setCutTarget(target);
428 private void selectMenuPast() {
429 LabelIconView srcTarget = layout.getCutTarget();
430 if (srcTarget == null) {
434 LabelIconView dstTarget = layout.getSelectedTarget();
435 if (dstTarget == null) {
439 layout.setCutTarget(null);
441 long srcId = srcTarget.getNodeId();
442 long dstId = dstTarget.getNodeId();
443 execute(srcId, dstId);
446 private void updateList() {
447 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
448 top = dao.searchRoot();
455 private void updateList(Node parent) {
458 scrollView.setVisibility(View.GONE);
459 layout.removeAllViews();
460 updateList(parent, 0);
461 layout.setMinimumHeight(viewY);
462 scrollView.setVisibility(View.VISIBLE);
465 scrollView.invalidate();
468 private void updateList(Node node, int depth) {
469 int N = (int) (bmpWidth * 0.6);
470 int M = (int) (bmpWidth * 1.2);
471 int x = N * (depth - indent);
473 if (depth - indent >= 0
474 && !(depth - indent == 0 && node instanceof FileNode)) {
475 LabelIconView view = new LabelIconView(this);
479 int id = node.getStatusIconId();
482 bmp1 = bitmapFactory.get(node.getStatusIconId());
487 Bitmap bmp2 = bitmapFactory.get(node.getIconId());
488 createIconImageView(view, bmp1, bmp2, node.getName(), x, viewY);
489 // LabelIconView s = view.getStatusImageView();
491 // s.setNodeId(node.getId());
493 view.setNodeId(node.getId());
497 if (node.getStatus() != Node.Status.OPEN) {
500 List<Long> idList = node.getChildren();
501 if (idList == null) {
505 List<Node> list = new ArrayList<Node>();
506 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
507 for (Long id : idList) {
508 Node n = dao.searchById(id);
513 if (n instanceof DirNode) {
514 DirNode d = (DirNode) n;
515 if (isNoteBook(d) && !d.isSelected()) {
521 Collections.sort(list, nodeComparator);
522 for (Node n : list) {
523 updateList(n, depth + 1);
527 private void createIconImageView(LabelIconView v, Bitmap bmp1, Bitmap bmp2,
528 String text, int x, int y) {
529 v.init(x, y, bmp1, bmp2, text);
531 android.view.WindowManager.LayoutParams params = new WindowManager.LayoutParams();
532 params.gravity = Gravity.TOP | Gravity.LEFT;
533 params.height = WindowManager.LayoutParams.WRAP_CONTENT;
534 params.width = WindowManager.LayoutParams.WRAP_CONTENT;
535 params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
536 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
537 | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
538 | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
539 params.format = PixelFormat.TRANSLUCENT;
540 params.windowAnimations = 0;
543 v.setLayoutParams(params);
545 // LabelIconView siv = v.getStatusImageView();
546 // if (siv != null) {
547 // layout.addView(siv, false);
551 v.layout(x, y, x + v.getWidth(), y + v.getHeight());
555 public void sendLockResult(boolean b) {
556 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
568 Intent intent = new Intent(this,
569 (Class<?>) SettingActivity.class);
570 startActivityForResult(intent, 0);
580 LockDao lockDao = (LockDao) LockDao.getInstance();
581 lock = lockDao.lock(this, Constant.LOCK_UPDATE_NOTE);
583 status = ScreenStatus.Normal;
586 layout.setVisibility(View.VISIBLE);
589 layout.removeAllViews();
603 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
604 // TODO sendLockResult()、「lock解除」のため、とりあえずコメント
605 // NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
606 // if (dao.isEmpty()) {
614 protected void onStart() {
619 protected void onResume() {
623 LockHandler handler = new LockHandler();
624 handler.lock(this, Constant.LOCK_UPDATE_NOTE);
628 layout.setVisibility(View.INVISIBLE);
636 // NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
637 // if (dao.isEmpty()) {
639 // Intent intent = new Intent(this,
640 // (Class<?>) SettingActivity.class);
641 // startActivityForResult(intent, 0);
650 // LockDao lockDao = (LockDao) LockDao.getInstance();
651 // lock = lockDao.lock(this, Constant.LOCK_UPDATE_NOTE);
654 // status = ScreenStatus.Normal;
659 // layout.removeAllViews();
669 protected void onPause() {
670 // ロック未取得でも解除する(ゴミ掃除)
671 LockDao lockDao = (LockDao) LockDao.getInstance();
672 lockDao.unlock(this, Constant.LOCK_UPDATE_NOTE);
679 private void leftButtonOnClick() {
680 moveButtonOnClick(-1);
684 private void rightButtonOnClick() {
685 moveButtonOnClick(1);
689 private void moveButtonOnClick(int dx) {
706 // private void addButtonOnClick() {
707 // setStatus(ScreenStatus.AddNode);
710 // private void deleteButtonOnClick() {
711 // FolderUtil util = FolderUtil.getInstance();
712 // LabelIconView target = layout.getSelectedTarget();
713 // long id = target.getNodeId();
714 // NodeDao dao = (NodeDao) NodeDao.getInstance();
715 // Node node = dao.searchById(id);
716 // if (node != null) {
717 // util.deleteNode(node);
718 // // TODO 三角マークも消さないといけないのでは
719 // layout.removeView(target);
725 private void msgOkButtonOnClick(View v) {
726 FolderUtil util = FolderUtil.getInstance();
727 LabelIconView target = layout.getSelectedTarget();
728 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
730 if (status == ScreenStatus.AddNode) {
731 long id = target.getNodeId();
732 Node parent = dao.searchById(id);
733 if (parent != null) {
734 String text = msgEditText.getText().toString();
735 DirNode node = new DirNode(text, null);
736 util.addDirNode(parent, node);
738 layout.setCutTarget(null, false);
739 } else if (status == ScreenStatus.DeleteNode) {
740 long id = target.getNodeId();
741 Node node = dao.searchById(id);
743 util.deleteNode(node);
744 layout.removeView(target);
746 layout.setCutTarget(null, false);
747 } else if (status == ScreenStatus.RenameNode) {
748 long id = target.getNodeId();
749 Node node = dao.searchById(id);
751 String text = msgEditText.getText().toString();
753 dao.updateName(node, text);
755 layout.setCutTarget(null, false);
760 layout.clearTarget();
762 setStatus(ScreenStatus.Normal);
765 private void msgCancelOnClick(View v) {
768 setStatus(ScreenStatus.Normal);
771 private void closeIME(View v) {
772 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
773 imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
776 public void execute(long srcId, long dstId) {
780 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
789 Node src = dao.searchById(srcId);
791 if (srcId == dstId) {
794 dst = dao.searchById(dstId);
797 if (dstId == src.getParent()) {
801 if (!isFileNode(src) && !isMovable(srcId, dstId)) {
806 Node sp = dao.searchById(src.getParent());
811 if (src.getParent() == dst.getParent()) {
814 dp = dao.searchById(dst.getParent());
821 // sp.remove(src.getId());
822 SQLiteDatabase db = DatabaseHelper.getInstance()
823 .getSQLiteDatabase();
824 db.beginTransaction();
826 dao.removeChildrenIdNT(sp, src.getId());
827 if (dst instanceof DirNode) {
828 // dst.add(src.getId());
829 dao.updateParentNT(src, dst.getId());
830 dao.addChildrenIdNT(dst, src.getId());
831 } else if (dst instanceof FileNode) {
832 // dp.add(src.getId());
833 dao.updateParentNT(src, dp.getId());
834 dao.addChildrenIdNT(dp, src.getId());
837 db.setTransactionSuccessful();
846 private boolean isMovable(long srcId, long dstId) {
847 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
850 if (srcId == dstId) {
853 Node node = dao.searchById(dstId);
858 if (!(node instanceof DirNode)) {
861 dstId = node.getParent();
866 public void execute(long id) {
867 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
869 Node node = dao.searchById(id);
874 Status status = node.getStatus();
876 dao.updateStatus(node, status);
878 // removeAllNodeView();
882 public void executeView(long id) {
883 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
885 Node node = dao.searchById(id);
886 if (!isFileNode(node)) {
889 String guid = node.getGuid();
891 EvernoteIntentUtil util = EvernoteIntentUtil.getInstance();
892 util.viewNote(this, guid);
895 public void targetSelectedChanged(boolean status) {
899 public void removeAllNodeView() {
900 layout.removeAllViews();
903 private void setStatus() {
907 private void setStatus(ScreenStatus status) {
909 if (this.status != status) {
910 this.status = status;
914 msgLayout.setVisibility(View.VISIBLE);
915 confirmMsg.setText(getString(R.string.mainUpdateMsg));
916 msgEditText.setVisibility(View.GONE);
917 msgButtonLayout.setVisibility(View.GONE);
919 leftButton.setEnabled(false);
920 rightButton.setEnabled(false);
922 status = ScreenStatus.Normal;
926 if (status == ScreenStatus.Normal) {
927 msgLayout.setVisibility(View.GONE);
928 // mainMsgEditText.setText("");
930 boolean leftButtonFlag = true;
931 boolean rightButtonFlag = true;
932 // boolean addButtonFlag = true;
933 // boolean deleteButtonFlag = true;
936 leftButtonFlag = false;
939 // LabelIconView target = layout.getSelectedTarget();
940 // NodeDao dao = (NodeDao) NodeDao.getInstance();
943 // if (target != null) {
944 // id = target.getNodeId();
945 // node = dao.searchById(id);
947 // if (target == null || node == null || !(node instanceof
950 // addButtonFlag = false;
952 // if (target == null || (node != null && node instanceof
955 // deleteButtonFlag = false;
957 layout.setElabledTouchEvent(true);
959 leftButton.setEnabled(leftButtonFlag);
960 rightButton.setEnabled(rightButtonFlag);
961 // addButton.setEnabled(addButtonFlag);
962 // deleteButton.setEnabled(deleteButtonFlag);
963 } else if (status == ScreenStatus.AddNode) {
964 msgLayout.setVisibility(View.VISIBLE);
965 msgEditText.setVisibility(View.VISIBLE);
966 msgButtonLayout.setVisibility(View.VISIBLE);
967 confirmMsg.setText(getString(R.string.mainAddMsg));
968 msgEditText.setText("");
970 layout.setElabledTouchEvent(false);
972 leftButton.setEnabled(false);
973 rightButton.setEnabled(false);
974 } else if (status == ScreenStatus.DeleteNode) {
975 msgLayout.setVisibility(View.VISIBLE);
976 msgEditText.setVisibility(View.GONE);
977 msgButtonLayout.setVisibility(View.VISIBLE);
978 confirmMsg.setText(getString(R.string.mainDeleteMsg));
980 layout.setElabledTouchEvent(false);
982 leftButton.setEnabled(false);
983 rightButton.setEnabled(false);
984 } else if (status == ScreenStatus.RenameNode) {
985 msgLayout.setVisibility(View.VISIBLE);
986 msgEditText.setVisibility(View.VISIBLE);
987 msgButtonLayout.setVisibility(View.VISIBLE);
988 confirmMsg.setText(getString(R.string.mainRenameMsg));
990 layout.setElabledTouchEvent(false);
992 leftButton.setEnabled(false);
993 rightButton.setEnabled(false);
995 } catch (Throwable e) {