OSDN Git Service

a8a3db987708ecdd9821964dc06109ca921b2522
[gokigen/MeMoMa.git] / app / src / main / java / jp / sourceforge / gokigen / memoma / ExtensionActivityListener.java
1 package jp.sourceforge.gokigen.memoma;
2
3 import java.text.SimpleDateFormat;
4 import java.util.ArrayList;
5 import java.util.Calendar;
6 import java.util.Enumeration;
7 import java.util.List;
8
9 import android.app.Activity;
10 import android.app.Dialog;
11 import android.content.Intent;
12 import android.util.Log;
13 import android.view.Menu;
14 import android.view.MenuItem;
15 import android.view.MotionEvent;
16 import android.view.View;
17 import android.view.View.OnClickListener;
18 import android.widget.AdapterView;
19 import android.widget.ImageButton;
20 import android.widget.ListAdapter;
21 import android.widget.ListView;
22 import android.widget.Toast;
23
24 /**
25  *    リスト形式で表示・エクスポート
26  * 
27  * @author MRSa
28  *
29  */
30 public class ExtensionActivityListener  implements OnClickListener, MeMoMaFileLoadingProcess.IResultReceiver, MeMoMaFileExportCsvProcess.IResultReceiver, FileSelectionDialog.IResultReceiver, MeMoMaFileImportCsvProcess.IResultReceiver
31 {
32     public final int MENU_ID_EXPORT= (Menu.FIRST + 1);
33     public final int MENU_ID_SHARE = (Menu.FIRST + 2);
34     public final int MENU_ID_IMPORT = (Menu.FIRST + 3);
35
36     private final String EXTENSION_DIRECTORY = "/exported";
37     
38     private ExternalStorageFileUtility fileUtility = null;
39         private MeMoMaObjectHolder objectHolder = null;
40         private FileSelectionDialog fileSelectionDialog = null;
41         
42         private boolean isShareExportedData = false;
43
44         private List<SymbolListArrayItem> listItems = null;
45     
46     private Activity parent = null;  // 親分
47         
48         /**
49      *  コンストラクタ
50      * @param argument
51      */
52     public ExtensionActivityListener(Activity argument)
53     {
54         parent = argument;
55         fileUtility = new ExternalStorageFileUtility(Main.APP_BASEDIR);
56         objectHolder = new MeMoMaObjectHolder(parent, new MeMoMaConnectLineHolder());
57     }
58     /**
59      *  起動時にデータを準備する
60      * 
61      * @param myIntent
62      */
63     public void prepareExtraDatas(Intent myIntent)
64     {
65         try
66         {
67             // Intentで拾ったデータを読み出す (初期化データ)
68                 //fullPath = myIntent.getStringExtra(ExtensionActivity.MEMOMA_EXTENSION_DATA_FULLPATH);
69                 objectHolder.setDataTitle(myIntent.getStringExtra(ExtensionActivity.MEMOMA_EXTENSION_DATA_TITLE));
70
71             // Preferenceに記憶されたデータがあればそれを取得する
72             // SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
73          }
74         catch (Exception ex)
75         {
76             Log.v(Main.APP_IDENTIFIER, "Exception :" + ex.toString());
77         }        
78     }
79
80     /**
81      *  がっつりこのクラスにイベントリスナを接続する
82      * 
83      */
84     public void prepareListener()
85     {
86         // フィルタ設定ボタン
87         final ImageButton filterButton = (ImageButton) parent.findViewById(R.id.SetFilterButton);
88         filterButton.setOnClickListener(this);
89
90     }
91
92     /**
93      *  終了準備
94      */
95     public void finishListener()
96     {
97
98     }
99
100     /**
101      *  スタート準備
102      */
103     public void prepareToStart()
104     {
105                 Log.v(Main.APP_IDENTIFIER, "ExtensionActivityListener::prepareToStart() : "  + objectHolder.getDataTitle());
106
107                 // ファイルをロードする!
108                 // (AsyncTaskを使ってデータを読み込む)
109                 MeMoMaFileLoadingProcess asyncTask = new MeMoMaFileLoadingProcess(parent, fileUtility, this);
110         asyncTask.execute(objectHolder);
111     }
112
113     /**
114      *    詳細データを表示する。
115      * 
116      * @param title
117      * @param url
118      */
119     private void showDetailData(String first, String second, String third)
120     {
121         Log.v(Main.APP_IDENTIFIER, "SELECTED: " + first + " " + second + " " + third);
122     }
123
124     /**
125      *  終了準備
126      */
127     public void shutdown()
128     {
129         
130     }
131     
132     /**
133      *  他画面から戻ってきたとき...
134      * @param requestCode
135      * @param resultCode
136      * @param data
137      */
138     public void onActivityResult(int requestCode, int resultCode, Intent data)
139     {
140         // なにもしない...
141     }
142
143     /**
144      *   クリックされたときの処理
145      */
146     public void onClick(View v)
147     {
148         int id = v.getId();
149         if (id == R.id.SetFilterButton)
150         {
151                  // フィルタ設定ボタンが押された!
152         }
153     }
154     
155     /**
156      *   触られたときの処理
157      * 
158      */
159     public boolean onTouch(View v, MotionEvent event)
160     {
161         // int id = v.getId();
162         // int action = event.getAction();
163
164         return (false);
165     }
166
167     /**
168      *   メニューへのアイテム追加
169      * @param menu
170      * @return
171      */
172     public Menu onCreateOptionsMenu(Menu menu)
173     {
174         MenuItem menuItem = menu.add(Menu.NONE, MENU_ID_SHARE, Menu.NONE, parent.getString(R.string.export_csv));
175         menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);   /*  for Android 3.1  */
176         menuItem.setIcon(android.R.drawable.ic_menu_share);
177
178         menuItem = menu.add(Menu.NONE, MENU_ID_EXPORT, Menu.NONE, parent.getString(R.string.shareContent));
179         menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);   /*  for Android 3.1  */
180         menuItem.setIcon(android.R.drawable.ic_menu_save);
181
182         menuItem = menu.add(Menu.NONE, MENU_ID_IMPORT, Menu.NONE, parent.getString(R.string.import_csv));
183         menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);   /*  for Android 3.1  */
184         menuItem.setIcon(android.R.drawable.ic_menu_edit);
185
186         return (menu);
187     }
188     
189     /**
190      *   メニュー表示前の処理
191      * @param menu
192      * @return
193      */
194     public void onPrepareOptionsMenu(Menu menu)
195     {
196         menu.findItem(MENU_ID_SHARE).setVisible(true);
197         menu.findItem(MENU_ID_EXPORT).setVisible(true);
198         menu.findItem(MENU_ID_IMPORT).setVisible(true);
199
200         return;
201     }
202
203     /**
204      *   メニューのアイテムが選択されたときの処理
205      * @param item
206      * @return
207      */
208     public boolean onOptionsItemSelected(MenuItem item)
209     {
210         boolean result = false;
211         switch (item.getItemId())
212         {
213           case MENU_ID_EXPORT:
214             // 表示中データのエクスポート
215                     export_as_csv(false);
216                 result = true;
217                 break;
218
219           case MENU_ID_SHARE:
220                 export_as_csv(true);
221                 result = true;
222                 break;
223
224           case MENU_ID_IMPORT:
225                 // データのインポート
226                 importObjectFromCsv();
227                 result = true;
228                 break;
229
230           default:
231                 result = false;
232                 break;
233         }
234         return (result);
235     }
236
237     /**
238      *   CSV形式でデータをインポートする
239      * 
240      */
241     private void importObjectFromCsv()
242     {
243         // データのインポート
244         parent.showDialog(R.id.listdialog);     
245     }
246
247     /**
248      *   データをCSV形式で出力する
249      * 
250      */
251     private void export_as_csv(boolean isShare)
252     {
253         isShareExportedData = isShare;
254
255         // AsyncTaskを使ってデータをエクスポートする
256         MeMoMaFileExportCsvProcess asyncTask = new MeMoMaFileExportCsvProcess(parent, fileUtility, this);
257         asyncTask.execute(objectHolder);
258     }
259     
260     /**
261      *  ダイアログの生成
262      * 
263      */
264     public Dialog onCreateDialog(int id)
265     {
266         if (id == R.id.listdialog)
267         {
268                 fileSelectionDialog = new FileSelectionDialog(parent, parent.getString(R.string.dialogtitle_selectcsv), fileUtility, ".csv",  this);
269                 return (fileSelectionDialog.getDialog());
270         }
271
272 /**
273         if (id == R.id.info_about_gokigen)
274         {
275                 CreditDialog dialog = new CreditDialog(parent);
276                 return (dialog.getDialog());
277         }
278 **/
279             return (null);
280     }
281
282     /**
283      *    ファイル選択ダイアログの表示を準備する
284      * 
285      */
286     private void prepareFileSelectionDialog(Dialog dialog)
287     {
288         fileSelectionDialog.prepare("", EXTENSION_DIRECTORY);
289     }
290
291     /**
292      *  ダイアログ表示の準備
293      * 
294      */
295     public void onPrepareDialog(int id, Dialog dialog)
296     {
297         if (id == R.id.listdialog)
298         {
299                 // CSVインポートダイアログを準備する
300                 prepareFileSelectionDialog(dialog);
301                 return;
302         }
303     }
304
305     /**
306      *    ファイルをロードする途中のバックグラウンド処理...
307      * 
308      */
309         public void onLoadingProcess()
310         {
311                 try
312                 {
313                 // リストに表示するアイテムを生成する
314                 listItems = null;
315                 listItems = new ArrayList<SymbolListArrayItem>();
316
317                 // TODO: 何らかの法則に従って並べ替えをする。
318
319                 Enumeration<Integer> keys = objectHolder.getObjectKeys();
320                 while (keys.hasMoreElements())
321                 {
322                     Integer key = keys.nextElement();
323                     MeMoMaObjectHolder.PositionObject pos = objectHolder.getPosition(key);
324
325                     // アイコンの決定
326                     int objectStyleIcon = MeMoMaObjectHolder .getObjectDrawStyleIcon(pos.drawStyle);
327                     
328                     // ユーザチェックの有無表示
329                     int userCheckedIcon = (pos.userChecked == true) ? R.drawable.btn_checked : R.drawable.btn_notchecked;
330
331                     // TODO: アイテム選択時の情報エリアは(ArrayItem側には)用意しているが未使用。
332                     SymbolListArrayItem listItem = new SymbolListArrayItem(userCheckedIcon, pos.label, pos.detail, "", objectStyleIcon);
333
334                     listItems.add(listItem);
335                 }
336             } catch (Exception ex)
337             {
338                 // 例外発生...ログを吐く
339                 Log.v(Main.APP_IDENTIFIER, "ExtensionActivityListener::onLoadingProcess() : " + ex.toString());
340             }   
341         }
342
343     /**
344      *    ファイルのロード結果を受け取る
345      * 
346      */
347     public void onLoadedResult(String detail)
348     {
349                 Log.v(Main.APP_IDENTIFIER, "ExtensionActivityListener::onLoadedResult() '"  + objectHolder.getDataTitle() +"' : " + detail);
350
351                 // 読み込んだファイル名をタイトルに設定する
352                 parent.setTitle(objectHolder.getDataTitle());
353                 
354                 // オブジェクト一覧を表示する
355                 updateObjectList();
356                 
357                 // 読み込みしたことを伝達する
358                 //String outputMessage = parent.getString(R.string.load_data) + " " + objectHolder.getDataTitle() + " " + detail;
359         //Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();     
360     }
361
362     /**
363      *    ファイルのエクスポート結果を受け取る
364      * 
365      */
366     public void onExportedResult(String exportedFileName, String detail)
367     {
368                 Log.v(Main.APP_IDENTIFIER, "ExtensionActivityListener::onExportedResult() '"  + objectHolder.getDataTitle() +"' : " + detail);
369
370                 // エクスポートしたことを伝達する
371                 String outputMessage = parent.getString(R.string.export_csv) + " " + objectHolder.getDataTitle() + " " + detail;
372         Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
373         
374         if (isShareExportedData == true)
375         {
376                 // エクスポートしたファイルを共有する
377             shareContent(exportedFileName);
378         }
379         isShareExportedData = false;
380     }
381     
382     /**
383      *    オブジェクト一覧を更新する
384      */
385     private void updateObjectList()
386     {
387         try
388         {
389                 // リストアダプターを生成し、設定する
390             ListView listView = (ListView) parent.findViewById(R.id.ExtensionView);
391             ListAdapter adapter = new SymbolListArrayAdapter(parent,  R.layout.listarrayitems, listItems);
392             listView.setAdapter(adapter);
393
394             // アイテムを選択したときの処理
395             listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
396                 //@Override
397                 public void onItemClick(AdapterView<?> parentView, View view, int position, long id)
398                 {
399                     ListView listView = (ListView) parentView;
400                     SymbolListArrayItem item = (SymbolListArrayItem) listView.getItemAtPosition(position);
401
402                     /// リストが選択されたときの処理...データを開く
403                     showDetailData(item.getTextResource1st(), item.getTextResource2nd(), item.getTextResource3rd());
404                 }
405             });
406             System.gc();   // いらない(参照が切れた)クラスを消したい
407         }
408         catch (Exception ex)
409         {
410                 // 何もしない。
411         }
412     }
413     
414     /**
415      *    エクスポートしたファイルを共有する
416      * 
417      * @param fileName
418      */
419     private void shareContent(String fileName)
420     {
421         String message = "";
422         try
423         {
424                 // 現在の時刻を取得する
425             Calendar calendar = Calendar.getInstance();
426                 SimpleDateFormat outFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
427             String date =  outFormat.format(calendar.getTime());
428
429             // メールタイトル
430             String title = parent.getString(R.string.app_name) + " | "+ objectHolder.getDataTitle() + " | " + date;
431
432             // メールの本文を構築する
433             message = message + "Name : " + objectHolder.getDataTitle() + "\n";
434             message = message + "exported : " + date + "\n";
435             message = message + "number of objects : " + objectHolder.getCount() + "\n";
436
437             // Share Intentを発行する。
438             SharedIntentInvoker.shareContent(parent, MENU_ID_SHARE, title, message,  fileName, "text/plain");
439         }
440         catch (Exception ex)
441         {
442                 
443         }
444     }
445     
446     /**
447      *   ファイルが選択された!
448      * 
449      */
450     public void selectedFileName(String fileName)
451     {
452         // CSVファイルからオブジェクトをロードするクラスを呼び出す。
453         Log.v(Main.APP_IDENTIFIER, "ExtensionActivityListener::selectedFileName() : " + fileName);
454         MeMoMaFileImportCsvProcess asyncTask = new MeMoMaFileImportCsvProcess(parent, fileUtility, this, fileName);
455         asyncTask.execute(objectHolder);
456     }
457
458     /**
459      *    インポート結果の受信
460      * 
461      * @param detail
462      */
463     public void onImportedResult(String detail)
464     {
465                 Log.v(Main.APP_IDENTIFIER, "ExtensionActivityListener::onImportedResult() '"  + objectHolder.getDataTitle() +"' : " + detail);
466
467                 // インポートしたことを伝達する
468                 String outputMessage = parent.getString(R.string.import_csv) + " " + objectHolder.getDataTitle() + " " + detail;
469         Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
470
471         // 一覧のリストを作りなおす
472         onLoadingProcess();
473         updateObjectList();
474     }    
475 }