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.ScaleUtil;
48 public class EverFolderActivity extends BaseActivity {
49 private enum ScreenStatus {
50 Normal, AddNode, DeleteNode, RenameNode
53 private LinearLayout msgLayout;
54 private LinearLayout msgButtonLayout;
55 private Button msgOkButton;
56 private Button msgCancelButton;
57 private EditText msgEditText;
59 private IconFrameLayout layout;
60 private TextView confirmMsg;
61 private IconScrollView scrollView;
62 private LinearLayout buttonLayout;
63 private Button leftButton;
64 private Button rightButton;
65 // private Button addButton;
66 // private Button deleteButton;
68 private ScreenStatus status;
69 private NodeComparator nodeComparator = new NodeComparator();
70 private BitmapCacheFactory bitmapFactory = BitmapCacheFactory.getInstance();
71 private Node top = null;
72 private int indent = 0;
73 private int bmpPaddingLeft;
76 private boolean lock = false;
77 private boolean isInit = true;
79 private BroadcastReceiver receiver = new BroadcastReceiver() {
81 public void onReceive(Context context, Intent intent) {
82 String action = intent.getAction();
84 if (action.compareTo(Constant.ACTION_UPDATE) == 0) {
85 LockDao lockDao = (LockDao) LockDao.getInstance();
86 lock = lockDao.lock(EverFolderActivity.this,
87 Constant.LOCK_UPDATE_NOTE);
97 public void onCreate(Bundle savedInstanceState) {
98 super.onCreate(savedInstanceState);
99 setContentView(R.layout.main);
102 IntentFilter intentFilter = new IntentFilter();
103 intentFilter.addAction(Constant.ACTION_UPDATE);
104 registerReceiver(receiver, intentFilter);
106 scrollView = (IconScrollView) findViewById(R.id.scrollView);
107 layout = (IconFrameLayout) findViewById(R.id.frameLayout);
108 layout.setActivity(this);
109 layout.setScrollView(scrollView);
111 buttonLayout = (LinearLayout) findViewById(R.id.mainButtonLayout);
112 leftButton = (Button) findViewById(R.id.leftButton);
113 rightButton = (Button) findViewById(R.id.rightButton);
114 // addButton = (Button) findViewById(R.id.addButton);
115 // deleteButton = (Button) findViewById(R.id.deleteButton);
117 msgLayout = (LinearLayout) findViewById(R.id.mainMsgLayout);
118 confirmMsg = (TextView) findViewById(R.id.mainConfirmMsg);
119 msgEditText = (EditText) findViewById(R.id.mainMsgEditText);
120 msgButtonLayout = (LinearLayout) findViewById(R.id.mainMsgButtonLayout);
121 msgOkButton = (Button) findViewById(R.id.mainMsgOkButton);
122 msgCancelButton = (Button) findViewById(R.id.mainMsgCancelButton);
124 leftButton.setOnClickListener(new OnClickListener() {
126 public void onClick(View v) {
130 rightButton.setOnClickListener(new OnClickListener() {
132 public void onClick(View v) {
133 rightButtonOnClick();
136 // addButton.setOnClickListener(new OnClickListener() {
138 // public void onClick(View v) {
139 // addButtonOnClick();
142 // deleteButton.setOnClickListener(new OnClickListener() {
144 // public void onClick(View v) {
145 // deleteButtonOnClick();
149 msgEditText.addTextChangedListener(new TextWatcher() {
150 public void afterTextChanged(Editable s) {
151 if (status != ScreenStatus.DeleteNode) {
152 String text = s.toString();
153 msgOkButton.setEnabled(text.length() > 0);
155 msgOkButton.setEnabled(true);
159 public void beforeTextChanged(CharSequence s, int start,
160 int count, int after) {
164 public void onTextChanged(CharSequence s, int start,
165 int before, int count) {
170 msgOkButton.setOnClickListener(new OnClickListener() {
172 public void onClick(View v) {
173 msgOkButtonOnClick(v);
176 msgCancelButton.setOnClickListener(new OnClickListener() {
178 public void onClick(View v) {
183 ScaleUtil scaleUtil = ScaleUtil.getInstance();
184 scaleUtil.init(this);
186 bitmapFactory.init(this);
187 Node node = new DirNode(null, null);
189 bmp = bitmapFactory.get(node.getStatusIconId());
190 bmpPaddingLeft = bmp.getWidth();
191 bmp = bitmapFactory.get(node.getIconId());
192 bmpWidth = bmp.getWidth();
194 float fSize = 48 * (1 / 2.0f);
195 leftButton.setTextSize(fSize);
196 rightButton.setTextSize(fSize);
197 } catch (Exception e) {
204 public boolean onCreateOptionsMenu(Menu menu) {
205 boolean ret = super.onCreateOptionsMenu(menu);
208 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "カット");
209 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "ペースト");
210 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "追加");
211 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "削除");
212 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "リネーム");
213 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "設定");
218 public boolean onMenuOpened(int featureId, Menu menu) {
219 boolean ret = super.onMenuOpened(featureId, menu);
228 boolean cutButtonFlag = false;
229 boolean pastButtonFlag = false;
230 boolean addButtonFlag = false;
231 boolean deleteButtonFlag = false;
232 boolean renameButtonFlag = false;
233 boolean confButtonFlag = true;
235 if (status == ScreenStatus.Normal) {
236 LabelIconView target = layout.getSelectedTarget();
237 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
240 if (target != null) {
241 id = target.getNodeId();
242 node = dao.searchById(id);
245 if (isDirNode(target, node, false) || isFileNode(node)) {
246 cutButtonFlag = true;
248 if (isDirNode(target, node, true) && isCut()) {
249 pastButtonFlag = true;
251 if (isDirNode(target, node, true)) {
252 addButtonFlag = true;
254 if (isDirNode(target, node, false) && !isNoteBook(node)
255 && CommonUtil.isNull(node.getChildrenString())) {
256 deleteButtonFlag = true;
258 if (isDirNode(target, node, false) && !isNoteBook(node)) {
259 renameButtonFlag = true;
264 item = menu.getItem(index++);
265 item.setVisible(cutButtonFlag);
266 item = menu.getItem(index++);
267 item.setVisible(pastButtonFlag);
268 item = menu.getItem(index++);
269 item.setVisible(addButtonFlag);
270 item = menu.getItem(index++);
271 item.setVisible(deleteButtonFlag);
272 item = menu.getItem(index++);
273 item.setVisible(renameButtonFlag);
274 item = menu.getItem(index++);
275 item.setVisible(confButtonFlag);
280 private boolean isFileNode(Node node) {
281 if (node == null || !(node instanceof FileNode)) {
287 private boolean isDirNode(LabelIconView target, Node node,
288 boolean containRoot) {
289 if (target == null) {
295 if (!containRoot && (node instanceof RootNode)) {
298 if (!(node instanceof DirNode)) {
304 private boolean isNoteBook(Node node) {
308 if (CommonUtil.isNull(node.getGuid())) {
314 private boolean isCut() {
315 LabelIconView srcTarget = layout.getCutTarget();
316 if (srcTarget == null) {
323 public boolean onOptionsItemSelected(MenuItem item) {
326 switch (item.getItemId()) {
345 intent = new Intent(this, (Class<?>) SettingActivity.class);
346 startActivityForResult(intent, 0);
351 } catch (Exception e) {
354 return super.onOptionsItemSelected(item);
357 private void dummy() {
358 NodeDaoImpl dao = (NodeDaoImpl) NodeCacheDao.getInstance();
359 List<Node> list = dao.search();
360 for (Node node : list) {
361 System.out.println(node.toString());
365 private void dummy2() {
366 LockDao dao = (LockDao) LockDao.getInstance();
370 b = dao.lock(this, "key");
371 b = dao.lock(this, "key");
372 dao.unlock(new Object(), "key");
373 b = dao.lock(this, "key");
374 dao.unlock(this, "key");
375 b = dao.lock(this, "key");
376 b = dao.lock(this, "key");
377 b = dao.lock(this, "key");
379 } catch (Exception e) {
385 private void selectMenuAdd() {
386 setStatus(ScreenStatus.AddNode);
389 private void selectMenuDelete() {
390 setStatus(ScreenStatus.DeleteNode);
393 private void selectMenuRename() {
394 LabelIconView target = layout.getSelectedTarget();
395 if (target == null) {
399 long id = target.getNodeId();
400 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
401 Node node = dao.searchById(id);
403 String text = node.getName();
404 msgEditText.setText(text);
405 setStatus(ScreenStatus.RenameNode);
409 private void selectMenuCut() {
410 LabelIconView target = layout.getSelectedTarget();
411 if (target == null) {
415 layout.setCutTarget(target);
419 private void selectMenuPast() {
420 LabelIconView srcTarget = layout.getCutTarget();
421 if (srcTarget == null) {
425 LabelIconView dstTarget = layout.getSelectedTarget();
426 if (dstTarget == null) {
430 layout.setCutTarget(null);
432 long srcId = srcTarget.getNodeId();
433 long dstId = dstTarget.getNodeId();
434 execute(srcId, dstId);
437 private void updateList() {
438 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
439 top = dao.searchRoot();
443 layout.removeAllViews();
448 private void updateList(Node parent) {
451 // List<Node> list = parent.getChildren();
452 // for (Node node : list){
453 // updateList(node, x);
455 updateList(parent, 0);
456 layout.setMinimumHeight(viewY);
458 scrollView.invalidate();
460 // layout.invalidate();
462 // this.runOnUiThread(new Runnable() {
464 // public void run() {
465 // // ビューを再描画し,UI上で画像変更を反映
466 // scrollView.invalidate();
471 private void updateList(Node node, int depth) {
472 int N = (int) (bmpWidth * 0.6);
473 int M = (int) (bmpWidth * 1.2);
474 int x = N * (depth - indent);
476 if (depth - indent >= 0
477 && !(depth - indent == 0 && node instanceof FileNode)) {
478 LabelIconView view = new LabelIconView(this);
482 int id = node.getStatusIconId();
485 bmp1 = bitmapFactory.get(node.getStatusIconId());
490 Bitmap bmp2 = bitmapFactory.get(node.getIconId());
491 createIconImageView(view, bmp1, bmp2, node.getName(), x, viewY);
492 // LabelIconView s = view.getStatusImageView();
494 // s.setNodeId(node.getId());
496 view.setNodeId(node.getId());
500 if (node.getStatus() != Node.Status.OPEN) {
503 List<Long> idList = node.getChildren();
504 if (idList == null) {
508 List<Node> list = new ArrayList<Node>();
509 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
510 for (Long id : idList) {
511 Node n = dao.searchById(id);
516 if (n instanceof DirNode){
517 DirNode d = (DirNode)n;
518 if (isNoteBook(d) && !d.isSelected()){
524 Collections.sort(list, nodeComparator);
525 for (Node n : list) {
526 updateList(n, depth + 1);
530 private void createIconImageView(LabelIconView v, Bitmap bmp1, Bitmap bmp2,
531 String text, int x, int y) {
532 v.init(x, y, bmp1, bmp2, text);
534 android.view.WindowManager.LayoutParams params = new WindowManager.LayoutParams();
535 params.gravity = Gravity.TOP | Gravity.LEFT;
536 params.height = WindowManager.LayoutParams.WRAP_CONTENT;
537 params.width = WindowManager.LayoutParams.WRAP_CONTENT;
538 params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
539 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
540 | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
541 | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
542 params.format = PixelFormat.TRANSLUCENT;
543 params.windowAnimations = 0;
546 v.setLayoutParams(params);
548 // LabelIconView siv = v.getStatusImageView();
549 // if (siv != null) {
550 // layout.addView(siv, false);
554 v.layout(x, y, x + v.getWidth(), y + v.getHeight());
558 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
561 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
569 protected void onStart() {
574 protected void onResume() {
577 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
580 Intent intent = new Intent(this,
581 (Class<?>) SettingActivity.class);
582 startActivityForResult(intent, 0);
591 LockDao lockDao = (LockDao) LockDao.getInstance();
592 lock = lockDao.lock(this, Constant.LOCK_UPDATE_NOTE);
595 status = ScreenStatus.Normal;
600 layout.removeAllViews();
610 protected void onPause() {
611 // ロック未取得でも解除する(ゴミ掃除)
612 LockDao lockDao = (LockDao) LockDao.getInstance();
613 lockDao.unlock(this, Constant.LOCK_UPDATE_NOTE);
619 private void leftButtonOnClick() {
620 moveButtonOnClick(-1);
624 private void rightButtonOnClick() {
625 moveButtonOnClick(1);
629 private void moveButtonOnClick(int dx) {
646 // private void addButtonOnClick() {
647 // setStatus(ScreenStatus.AddNode);
650 // private void deleteButtonOnClick() {
651 // FolderUtil util = FolderUtil.getInstance();
652 // LabelIconView target = layout.getSelectedTarget();
653 // long id = target.getNodeId();
654 // NodeDao dao = (NodeDao) NodeDao.getInstance();
655 // Node node = dao.searchById(id);
656 // if (node != null) {
657 // util.deleteNode(node);
658 // // TODO 三角マークも消さないといけないのでは
659 // layout.removeView(target);
665 private void msgOkButtonOnClick(View v) {
666 FolderUtil util = FolderUtil.getInstance();
667 LabelIconView target = layout.getSelectedTarget();
668 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
670 if (status == ScreenStatus.AddNode) {
671 long id = target.getNodeId();
672 Node parent = dao.searchById(id);
673 if (parent != null) {
674 String text = msgEditText.getText().toString();
675 DirNode node = new DirNode(text, null);
676 util.addDirNode(parent, node);
678 layout.setCutTarget(null, false);
679 } else if (status == ScreenStatus.DeleteNode) {
680 long id = target.getNodeId();
681 Node node = dao.searchById(id);
683 util.deleteNode(node);
684 layout.removeView(target);
686 layout.setCutTarget(null, false);
687 } else if (status == ScreenStatus.RenameNode) {
688 long id = target.getNodeId();
689 Node node = dao.searchById(id);
691 String text = msgEditText.getText().toString();
693 dao.updateName(node, text);
695 layout.setCutTarget(null, false);
700 layout.clearTarget();
702 setStatus(ScreenStatus.Normal);
705 private void msgCancelOnClick(View v) {
708 setStatus(ScreenStatus.Normal);
711 private void closeIME(View v){
712 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
713 imm.hideSoftInputFromWindow(v.getWindowToken(),0);
716 public void execute(long srcId, long dstId) {
720 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
729 Node src = dao.searchById(srcId);
731 if (srcId == dstId) {
734 dst = dao.searchById(dstId);
737 if (dstId == src.getParent()) {
741 if (!isFileNode(src) && !isMovable(srcId, dstId)) {
746 Node sp = dao.searchById(src.getParent());
751 if (src.getParent() == dst.getParent()) {
754 dp = dao.searchById(dst.getParent());
761 // sp.remove(src.getId());
762 SQLiteDatabase db = DatabaseHelper.getInstance()
763 .getSQLiteDatabase();
764 db.beginTransaction();
766 dao.removeChildrenIdNT(sp, src.getId());
767 if (dst instanceof DirNode) {
768 // dst.add(src.getId());
769 dao.updateParentNT(src, dst.getId());
770 dao.addChildrenIdNT(dst, src.getId());
771 } else if (dst instanceof FileNode) {
772 // dp.add(src.getId());
773 dao.updateParentNT(src, dp.getId());
774 dao.addChildrenIdNT(dp, src.getId());
777 db.setTransactionSuccessful();
786 private boolean isMovable(long srcId, long dstId) {
787 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
790 if (srcId == dstId) {
793 Node node = dao.searchById(dstId);
798 if (!(node instanceof DirNode)) {
801 dstId = node.getParent();
806 public void execute(long id) {
807 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
809 Node node = dao.searchById(id);
814 Status status = node.getStatus();
816 dao.updateStatus(node, status);
818 // removeAllNodeView();
822 public void executeView(long id) {
823 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
825 Node node = dao.searchById(id);
826 if (!isFileNode(node)) {
829 String guid = node.getGuid();
831 EvernoteIntentUtil util = EvernoteIntentUtil.getInstance();
832 util.viewNote(this, guid);
835 public void targetSelectedChanged(boolean status) {
839 public void removeAllNodeView() {
840 layout.removeAllViews();
843 private void setStatus() {
847 private void setStatus(ScreenStatus status) {
849 if (this.status != status) {
850 this.status = status;
854 msgLayout.setVisibility(View.VISIBLE);
855 confirmMsg.setText(getString(R.string.mainUpdateMsg));
856 msgEditText.setVisibility(View.GONE);
857 msgButtonLayout.setVisibility(View.GONE);
858 status = ScreenStatus.Normal;
862 if (status == ScreenStatus.Normal) {
863 msgLayout.setVisibility(View.GONE);
864 // mainMsgEditText.setText("");
866 boolean leftButtonFlag = true;
867 boolean rightButtonFlag = true;
868 // boolean addButtonFlag = true;
869 // boolean deleteButtonFlag = true;
872 leftButtonFlag = false;
875 // LabelIconView target = layout.getSelectedTarget();
876 // NodeDao dao = (NodeDao) NodeDao.getInstance();
879 // if (target != null) {
880 // id = target.getNodeId();
881 // node = dao.searchById(id);
883 // if (target == null || node == null || !(node instanceof
886 // addButtonFlag = false;
888 // if (target == null || (node != null && node instanceof
891 // deleteButtonFlag = false;
893 layout.setElabledTouchEvent(true);
895 leftButton.setEnabled(leftButtonFlag);
896 rightButton.setEnabled(rightButtonFlag);
897 // addButton.setEnabled(addButtonFlag);
898 // deleteButton.setEnabled(deleteButtonFlag);
899 } else if (status == ScreenStatus.AddNode) {
900 msgLayout.setVisibility(View.VISIBLE);
901 msgEditText.setVisibility(View.VISIBLE);
902 msgButtonLayout.setVisibility(View.VISIBLE);
903 confirmMsg.setText(getString(R.string.mainAddMsg));
904 msgEditText.setText("");
906 layout.setElabledTouchEvent(false);
908 leftButton.setEnabled(false);
909 rightButton.setEnabled(false);
910 } else if (status == ScreenStatus.DeleteNode) {
911 msgLayout.setVisibility(View.VISIBLE);
912 msgEditText.setVisibility(View.GONE);
913 msgButtonLayout.setVisibility(View.VISIBLE);
914 confirmMsg.setText(getString(R.string.mainDeleteMsg));
916 layout.setElabledTouchEvent(false);
918 leftButton.setEnabled(false);
919 rightButton.setEnabled(false);
920 } else if (status == ScreenStatus.RenameNode) {
921 msgLayout.setVisibility(View.VISIBLE);
922 msgEditText.setVisibility(View.VISIBLE);
923 msgButtonLayout.setVisibility(View.VISIBLE);
924 confirmMsg.setText(getString(R.string.mainRenameMsg));
926 layout.setElabledTouchEvent(false);
928 leftButton.setEnabled(false);
929 rightButton.setEnabled(false);
931 } catch (Throwable e) {