1 package jp.sourceforge.gokigen.memoma.extension;
4 import java.text.SimpleDateFormat;
5 import java.util.ArrayList;
6 import java.util.Calendar;
7 import java.util.Enumeration;
9 import java.util.Locale;
11 import android.app.ActionBar;
12 import android.app.Activity;
13 import android.app.Dialog;
14 import android.content.Intent;
15 import android.net.Uri;
16 import androidx.core.content.FileProvider;
17 import android.util.Log;
18 import android.view.Menu;
19 import android.view.MenuItem;
20 import android.view.View;
21 import android.view.View.OnClickListener;
22 import android.widget.AdapterView;
23 import android.widget.ImageButton;
24 import android.widget.ListAdapter;
25 import android.widget.ListView;
26 import android.widget.Toast;
28 import jp.sourceforge.gokigen.memoma.holders.PositionObject;
29 import jp.sourceforge.gokigen.memoma.dialogs.FileSelectionDialog;
30 import jp.sourceforge.gokigen.memoma.Main;
31 import jp.sourceforge.gokigen.memoma.io.MeMoMaFileExportCsvProcess;
32 import jp.sourceforge.gokigen.memoma.io.MeMoMaFileImportCsvProcess;
33 import jp.sourceforge.gokigen.memoma.io.MeMoMaFileLoadingProcess;
34 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
35 import jp.sourceforge.gokigen.memoma.R;
36 import jp.sourceforge.gokigen.memoma.io.SharedIntentInvoker;
37 import jp.sourceforge.gokigen.memoma.listitem.SymbolListArrayAdapter;
38 import jp.sourceforge.gokigen.memoma.listitem.SymbolListArrayItem;
46 public class ExtensionActivityListener implements OnClickListener, MeMoMaFileLoadingProcess.IResultReceiver, MeMoMaFileExportCsvProcess.IResultReceiver, FileSelectionDialog.IResultReceiver, MeMoMaFileImportCsvProcess.IResultReceiver
48 private final String TAG = toString();
49 private final int MENU_ID_EXPORT= (Menu.FIRST + 1);
50 private final int MENU_ID_SHARE = (Menu.FIRST + 2);
51 private final int MENU_ID_IMPORT = (Menu.FIRST + 3);
53 private static final String EXTENSION_DIRECTORY = "/exported";
55 //private ExternalStorageFileUtility fileUtility;
56 private MeMoMaObjectHolder objectHolder;
57 private FileSelectionDialog fileSelectionDialog = null;
59 private boolean isShareExportedData = false;
61 private List<SymbolListArrayItem> listItems = null;
63 private final Activity parent; // 親分
67 * @param argument parent activity
69 ExtensionActivityListener(Activity argument)
72 //fileUtility = new ExternalStorageFileUtility(Main.APP_BASEDIR);
73 objectHolder = new MeMoMaObjectHolder(parent);
78 * @param myIntent intent information
80 public void prepareExtraDatas(Intent myIntent)
84 // Intentで拾ったデータを読み出す (初期化データ)
85 //fullPath = myIntent.getStringExtra(ExtensionActivity.MEMOMA_EXTENSION_DATA_FULLPATH);
86 objectHolder.setDataTitle(myIntent.getStringExtra(ExtensionActivity.MEMOMA_EXTENSION_DATA_TITLE));
88 // Preferenceに記憶されたデータがあればそれを取得する
89 // SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
93 Log.v(TAG, "Exception :" + ex.toString());
98 * がっつりこのクラスにイベントリスナを接続する
101 public void prepareListener()
104 final ImageButton filterButton = parent.findViewById(R.id.SetFilterButton);
105 filterButton.setOnClickListener(this);
112 public void finishListener()
120 public void prepareToStart()
122 Log.v(TAG, "ExtensionActivityListener::prepareToStart() : " + objectHolder.getDataTitle());
125 ActionBar bar = parent.getActionBar();
129 bar.setTitle(objectHolder.getDataTitle());
133 // (AsyncTaskを使ってデータを読み込む)
134 MeMoMaFileLoadingProcess asyncTask = new MeMoMaFileLoadingProcess(parent, this);
135 asyncTask.execute(objectHolder);
142 private void showDetailData(String first, String second, String third)
144 Log.v(TAG, "SELECTED: " + first + " " + second + " " + third);
150 public void shutdown()
160 public void onActivityResult(int requestCode, int resultCode, Intent data)
163 Log.v(TAG, "rc: " + requestCode + " rs: " + resultCode + " it: " + data.getDataString());
169 public void onClick(View v)
172 if (id == R.id.SetFilterButton)
175 Log.v(TAG, "Selected Filter");
184 public boolean onTouch(View v, MotionEvent event)
186 Log.v(Main.APP_IDENTIFIER, " " + v.toString() + " " + event.toString());
187 // int id = v.getId();
188 // int action = event.getAction();
198 public Menu onCreateOptionsMenu(Menu menu)
200 MenuItem menuItem = menu.add(Menu.NONE, MENU_ID_SHARE, Menu.NONE, parent.getString(R.string.export_csv));
201 menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); /* for Android 3.1 */
202 menuItem.setIcon(android.R.drawable.ic_menu_share);
204 menuItem = menu.add(Menu.NONE, MENU_ID_EXPORT, Menu.NONE, parent.getString(R.string.shareContent));
205 menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); /* for Android 3.1 */
206 menuItem.setIcon(android.R.drawable.ic_menu_save);
208 menuItem = menu.add(Menu.NONE, MENU_ID_IMPORT, Menu.NONE, parent.getString(R.string.import_csv));
209 menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); /* for Android 3.1 */
210 menuItem.setIcon(android.R.drawable.ic_menu_edit);
219 public void onPrepareOptionsMenu(Menu menu)
221 menu.findItem(MENU_ID_SHARE).setVisible(true);
222 menu.findItem(MENU_ID_EXPORT).setVisible(true);
223 menu.findItem(MENU_ID_IMPORT).setVisible(true);
227 * メニューのアイテムが選択されたときの処理
230 public boolean onOptionsItemSelected(MenuItem item)
233 switch (item.getItemId())
237 export_as_csv(false);
248 importObjectFromCsv();
264 private void importObjectFromCsv()
267 parent.showDialog(R.id.listdialog);
274 private void export_as_csv(boolean isShare)
276 isShareExportedData = isShare;
278 // AsyncTaskを使ってデータをエクスポートする
279 MeMoMaFileExportCsvProcess asyncTask = new MeMoMaFileExportCsvProcess(parent, this);
280 asyncTask.execute(objectHolder);
287 public Dialog onCreateDialog(int id)
289 if (id == R.id.listdialog)
291 fileSelectionDialog = new FileSelectionDialog(parent, parent.getString(R.string.dialogtitle_selectcsv), ".csv", this);
292 return (fileSelectionDialog.getDialog());
296 if (id == R.id.info_about_gokigen)
298 CreditDialog dialog = new CreditDialog(parent);
299 return (dialog.getDialog());
306 * ファイル選択ダイアログの表示を準備する
309 private void prepareFileSelectionDialog(Dialog dialog)
313 Log.v(TAG, " " + dialog.toString());
314 fileSelectionDialog.prepare();
326 public void onPrepareDialog(int id, Dialog dialog)
328 if (id == R.id.listdialog)
330 // CSVインポートダイアログを準備する
331 prepareFileSelectionDialog(dialog);
336 * ファイルをロードする途中のバックグラウンド処理...
339 public void onLoadingProcess()
345 listItems = new ArrayList<>();
347 // TODO: 何らかの法則に従って並べ替えをする。
349 Enumeration<Integer> keys = objectHolder.getObjectKeys();
350 while (keys.hasMoreElements())
352 Integer key = keys.nextElement();
353 PositionObject pos = objectHolder.getPosition(key);
356 int objectStyleIcon = MeMoMaObjectHolder .getObjectDrawStyleIcon(pos.getDrawStyle());
359 int userCheckedIcon = (pos.getUserChecked()) ? R.drawable.btn_checked : R.drawable.btn_notchecked;
361 // TODO: アイテム選択時の情報エリアは(ArrayItem側には)用意しているが未使用。
362 SymbolListArrayItem listItem = new SymbolListArrayItem(userCheckedIcon, pos.getLabel(), pos.getDetail(), "", objectStyleIcon);
364 listItems.add(listItem);
366 } catch (Exception ex)
369 Log.v(TAG, "ExtensionActivityListener::onLoadingProcess() : " + ex.toString());
377 public void onLoadedResult(String detail)
379 Log.v(TAG, "ExtensionActivityListener::onLoadedResult() '" + objectHolder.getDataTitle() +"' : " + detail);
381 // 読み込んだファイル名をタイトルに設定する
382 parent.setTitle(objectHolder.getDataTitle());
388 //String outputMessage = parent.getString(R.string.load_data) + " " + objectHolder.getDataTitle() + " " + detail;
389 //Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
396 public void onExportedResult(String exportedFileName, String detail)
398 Log.v(TAG, "ExtensionActivityListener::onExportedResult() '" + objectHolder.getDataTitle() +"' : " + detail);
401 String outputMessage = parent.getString(R.string.export_csv) + " " + objectHolder.getDataTitle() + " " + detail;
402 Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
404 if (isShareExportedData)
407 shareContent(exportedFileName);
409 isShareExportedData = false;
415 private void updateObjectList()
420 ListView listView = parent.findViewById(R.id.ExtensionView);
421 ListAdapter adapter = new SymbolListArrayAdapter(parent, R.layout.listarrayitems, listItems);
422 listView.setAdapter(adapter);
425 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
427 public void onItemClick(AdapterView<?> parentView, View view, int position, long id)
429 ListView listView = (ListView) parentView;
430 SymbolListArrayItem item = (SymbolListArrayItem) listView.getItemAtPosition(position);
432 /// リストが選択されたときの処理...データを開く
433 showDetailData(item.getTextResource1st(), item.getTextResource2nd(), item.getTextResource3rd());
436 System.gc(); // いらない(参照が切れた)クラスを消したい
449 private void shareContent(String fileName)
455 Calendar calendar = Calendar.getInstance();
456 SimpleDateFormat outFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US);
457 String date = outFormat.format(calendar.getTime());
460 String title = parent.getString(R.string.app_name) + " | "+ objectHolder.getDataTitle() + " | " + date;
463 message = message + "Name : " + objectHolder.getDataTitle() + "\n";
464 message = message + "exported : " + date + "\n";
465 message = message + "number of objects : " + objectHolder.getCount() + "\n";
467 // Share Intentを発行する。
468 Uri fileURI = FileProvider.getUriForFile(parent,"jp.sourceforge.gokigen.memoma.fileprovider", new File(fileName));
469 SharedIntentInvoker.shareContent(parent, MENU_ID_SHARE, title, message, fileURI, "text/plain");
473 Log.v(TAG, "shareContent (fileName : " + fileName + ")");
474 ex.printStackTrace();
482 public void selectedFileName(String fileName)
484 // CSVファイルからオブジェクトをロードするクラスを呼び出す。
485 Log.v(TAG, "ExtensionActivityListener::selectedFileName() : " + fileName);
486 MeMoMaFileImportCsvProcess asyncTask = new MeMoMaFileImportCsvProcess(parent, this, fileName);
487 asyncTask.execute(objectHolder);
494 public void onImportedResult(String detail)
496 Log.v(TAG, "ExtensionActivityListener::onImportedResult() '" + objectHolder.getDataTitle() +"' : " + detail);
499 String outputMessage = parent.getString(R.string.import_csv) + " " + objectHolder.getDataTitle() + " " + detail;
500 Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();