OSDN Git Service

e6fcca776bf8f2ad148dc4b8c1959793616e5595
[gokigen/MeMoMa.git] / app / src / main / java / jp / sourceforge / gokigen / memoma / extension / ExtensionActivityListener.java
1 package jp.sourceforge.gokigen.memoma.extension;
2
3 import static jp.sourceforge.gokigen.memoma.Main.APP_NAMESPACE;
4
5 import java.io.File;
6 import java.text.SimpleDateFormat;
7 import java.util.ArrayList;
8 import java.util.Calendar;
9 import java.util.Enumeration;
10 import java.util.List;
11 import java.util.Locale;
12
13 import android.app.Activity;
14 import android.content.Intent;
15 import android.content.SharedPreferences;
16 import android.net.Uri;
17 import android.os.Build;
18 import android.os.Environment;
19 import android.preference.PreferenceManager;
20 import android.provider.DocumentsContract;
21 import android.util.Log;
22 import android.view.Menu;
23 import android.view.MenuItem;
24 import android.view.View;
25 import android.view.View.OnClickListener;
26 import android.widget.ImageButton;
27 import android.widget.ListAdapter;
28 import android.widget.ListView;
29 import android.widget.Toast;
30
31 import androidx.appcompat.app.ActionBar;
32 import androidx.appcompat.app.AlertDialog;
33 import androidx.appcompat.app.AppCompatActivity;
34
35 import jp.sourceforge.gokigen.memoma.holders.PositionObject;
36 import jp.sourceforge.gokigen.memoma.dialogs.FileSelectionDialog;
37 import jp.sourceforge.gokigen.memoma.io.MeMoMaFileExportCsvProcess;
38 import jp.sourceforge.gokigen.memoma.io.MeMoMaFileImportCsvProcess;
39 import jp.sourceforge.gokigen.memoma.io.MeMoMaFileLoadingProcess;
40 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
41 import jp.sourceforge.gokigen.memoma.R;
42 import jp.sourceforge.gokigen.memoma.io.MeMoMaFileSavingEngine;
43 import jp.sourceforge.gokigen.memoma.io.SharedIntentInvoker;
44 import jp.sourceforge.gokigen.memoma.listitem.SymbolListArrayAdapter;
45 import jp.sourceforge.gokigen.memoma.listitem.SymbolListArrayItem;
46
47 /**
48  *    リスト形式で表示・エクスポート
49  */
50 public class ExtensionActivityListener  implements OnClickListener, MeMoMaFileLoadingProcess.IResultReceiver, MeMoMaFileExportCsvProcess.IResultReceiver, FileSelectionDialog.IResultReceiver, MeMoMaFileImportCsvProcess.IResultReceiver
51 {
52     private final String TAG = toString();
53     private static final int PICK_CSV_FILE = 2020;
54     private static final int PICK_XML_FILE = 2030;
55
56     private final int MENU_ID_EXPORT= (Menu.FIRST + 1);
57     private final int MENU_ID_EXPORT_XML = (Menu.FIRST + 2);
58     private final int MENU_ID_SHARE = (Menu.FIRST + 3);
59     private final int MENU_ID_IMPORT = (Menu.FIRST + 4);
60     private final int MENU_ID_IMPORT_XML = (Menu.FIRST + 5);
61     private final int MENU_ID_DELETE = (Menu.FIRST + 6);
62
63         private final MeMoMaObjectHolder objectHolder;
64         //private FileSelectionDialog fileSelectionDialog = null;
65         private boolean isShareExportedData = false;
66         private List<SymbolListArrayItem> listItems = null;
67     private final AppCompatActivity parent;  // 親分
68
69         /**
70      *  コンストラクタ
71      */
72         ExtensionActivityListener(AppCompatActivity argument)
73     {
74         parent = argument;
75         objectHolder = new MeMoMaObjectHolder(parent);
76     }
77     /**
78      *  起動時にデータを準備する
79      */
80     public void prepareExtraDatas(Intent myIntent)
81     {
82         try
83         {
84             String dataTitle = myIntent.getStringExtra(ExtensionActivity.MEMOMA_EXTENSION_DATA_TITLE);
85
86             SharedPreferences preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(parent);
87             String prefTitleString = preferences.getString("content_data_title", "");
88             if (prefTitleString.length() > 0)
89             {
90                 // Preferenceに タイトル名が記録されていたら、上書きする
91                 dataTitle = prefTitleString;
92             }
93             // Intentで拾ったデータを読み出す (初期化データ)
94             objectHolder.setDataTitle(dataTitle);
95         }
96         catch (Exception ex)
97         {
98             Log.v(TAG, "Exception :" + ex.getMessage());
99         }
100     }
101
102     private void setPreferenceString(String title)
103     {
104         try
105         {
106             SharedPreferences preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(parent);
107             SharedPreferences.Editor editor = preferences.edit();
108             editor.putString("content_data_title", title);
109             editor.apply();
110         }
111         catch (Exception e)
112         {
113             e.printStackTrace();
114         }
115     }
116
117
118     /**
119      *  がっつりこのクラスにイベントリスナを接続する
120      */
121     public void prepareListener()
122     {
123         // フィルタ設定ボタン
124         final ImageButton filterButton = parent.findViewById(R.id.SetFilterButton);
125         filterButton.setOnClickListener(this);
126     }
127
128     /**
129      *  終了準備
130      */
131     public void finishListener()
132     {
133         //setPreferenceString("");
134     }
135
136     /**
137      *  スタート準備
138      */
139     public void prepareToStart()
140     {
141         try
142         {
143             Log.v(TAG, "ExtensionActivityListener::prepareToStart() : "  + objectHolder.getDataTitle());
144
145             //  アクションバーを表示する
146             ActionBar bar = parent.getSupportActionBar();
147             if (bar != null)
148             {
149                 bar.setIcon(R.drawable.icon1);
150                 bar.setTitle(objectHolder.getDataTitle());
151                 bar.show();
152             }
153
154             // ファイルをロードする!
155             // (AsyncTaskを使ってデータを読み込む)
156             MeMoMaFileLoadingProcess asyncTask = new MeMoMaFileLoadingProcess(parent, this);
157             asyncTask.execute(objectHolder);
158         }
159         catch (Exception e)
160         {
161             e.printStackTrace();
162         }
163     }
164
165     /**
166      *    詳細データを表示する。
167      */
168     private void showDetailData(String first, String second, String third)
169     {
170         Log.v(TAG, "SELECTED: " + first + " " + second + " " + third);
171     }
172
173     /**
174      *  終了準備
175      */
176     public void shutdown()
177     {
178         //setPreferenceString("");
179     }
180
181     private void imporObjectFromCsv(final Uri uri)
182     {
183         try
184         {
185             // Perform operations on the document using its URI.
186             Thread thread = new Thread(() -> {
187                 ExtensionCsvImport importer = new ExtensionCsvImport(parent, objectHolder, uri);
188                 importer.importFromCsvFile();
189
190                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
191                 String backgroundUri = preferences.getString("backgroundUri","");
192                 String userCheckboxString = preferences.getString("userCheckboxString","");
193
194                 // データの保管メイン
195                 MeMoMaFileSavingEngine savingEngine = new MeMoMaFileSavingEngine(parent, backgroundUri, userCheckboxString);
196                 String result = savingEngine.saveObjects(objectHolder);
197                 parent.runOnUiThread(() -> {
198                     try
199                     {
200                         onImportedResult(result);
201                     }
202                     catch (Exception e)
203                     {
204                         e.printStackTrace();
205                     }
206                 });
207             });
208             thread.start();
209         }
210         catch (Exception e)
211         {
212             e.printStackTrace();
213         }
214     }
215
216     private void importDataFromXml(final Uri uri)
217     {
218         try
219         {
220             // Perform operations on the document using its URI.
221             Thread thread = new Thread(() -> {
222                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
223                 String backgroundUri = preferences.getString("backgroundUri","");
224                 String userCheckboxString = preferences.getString("userCheckboxString","");
225
226                 // データの保管を実施する (現状)
227                 MeMoMaFileSavingEngine savingEngine = new MeMoMaFileSavingEngine(parent, backgroundUri, userCheckboxString);
228                 String result0 = savingEngine.saveObjects(objectHolder);
229                 Log.v(TAG, "Saved : " + result0);
230
231                 //
232                 ExtensionXmlImport importer = new ExtensionXmlImport(parent, objectHolder, uri);
233                 String result1 = importer.importFromXmlFile();
234
235                 // データの保管を実施する (新規)
236                 MeMoMaFileSavingEngine savingEngine2 = new MeMoMaFileSavingEngine(parent, backgroundUri, userCheckboxString);
237                 String result = savingEngine2.saveObjects(objectHolder) + " " + result1;
238                 Log.v(TAG, "=== Data Saved : " + objectHolder.getDataTitle() + " " + result + " " + result1);
239                 parent.runOnUiThread(() -> {
240                     try
241                     {
242                         // 読み込んだファイル名をタイトルに設定する
243                         parent.setTitle(objectHolder.getDataTitle());
244
245                         // タイトルバーの更新...
246                         ActionBar bar = parent.getSupportActionBar();
247                         if (bar != null)
248                         {
249                             bar.setIcon(R.drawable.icon1);
250                             bar.setTitle(objectHolder.getDataTitle());
251                             bar.show();
252                         }
253                         onImportedResultXml(result);
254                     }
255                     catch (Exception e)
256                     {
257                         e.printStackTrace();
258                     }
259                 });
260             });
261             thread.start();
262         }
263         catch (Exception e)
264         {
265             e.printStackTrace();
266         }
267     }
268
269     /**
270      *  他画面から戻ってきたとき...
271      */
272     public void onActivityResult(int requestCode, int resultCode, Intent resultData)
273     {
274         try
275         {
276             if (resultCode == Activity.RESULT_OK)
277             {
278                 if (resultData != null)
279                 {
280                     Uri uri = resultData.getData();
281                     if (requestCode == PICK_CSV_FILE)
282                     {
283                         imporObjectFromCsv(uri);
284                     }
285                     else if (requestCode == PICK_XML_FILE)
286                     {
287                         importDataFromXml(uri);
288                     }
289                     else
290                     {
291                         Log.v(TAG, "========== rc: " + requestCode + " rs: " + resultCode + " uri: "  + uri.toString());
292                     }
293                 }
294             }
295         }
296         catch (Exception e)
297         {
298             e.printStackTrace();
299         }
300         // Log.v(TAG, "rc: " + requestCode + " rs: " + resultCode + " it: "  + resultData.getDataString());
301     }
302
303     /**
304      *   クリックされたときの処理
305      */
306     public void onClick(View v)
307     {
308         int id = v.getId();
309         if (id == R.id.SetFilterButton)
310         {
311                  // フィルタ設定ボタンが押された!
312             Log.v(TAG, "Selected Filter");
313         }
314     }
315
316     /**
317      *   メニューへのアイテム追加
318      *
319      */
320     public Menu onCreateOptionsMenu(Menu menu)
321     {
322         try
323         {
324             MenuItem menuItem = menu.add(Menu.NONE, MENU_ID_SHARE, Menu.NONE, parent.getString(R.string.export_csv));
325             menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
326             menuItem.setIcon(android.R.drawable.ic_menu_share);
327
328             menuItem = menu.add(Menu.NONE, MENU_ID_EXPORT, Menu.NONE, parent.getString(R.string.shareContent));
329             menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
330             menuItem.setIcon(android.R.drawable.ic_menu_save);
331
332             menuItem = menu.add(Menu.NONE, MENU_ID_IMPORT, Menu.NONE, parent.getString(R.string.import_csv));
333             menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
334             menuItem.setIcon(android.R.drawable.ic_menu_edit);
335
336             menuItem = menu.add(Menu.NONE, MENU_ID_EXPORT_XML, Menu.NONE, parent.getString(R.string.export_xml));
337             menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
338             menuItem.setIcon(android.R.drawable.ic_menu_send);
339
340             menuItem = menu.add(Menu.NONE, MENU_ID_IMPORT_XML, Menu.NONE, parent.getString(R.string.import_xml));
341             menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
342             menuItem.setIcon(android.R.drawable.ic_menu_add);
343
344             menuItem = menu.add(Menu.NONE, MENU_ID_DELETE, Menu.NONE, parent.getString(R.string.delete_content));
345             menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
346             menuItem.setIcon(android.R.drawable.ic_menu_delete);
347
348         }
349         catch (Exception e)
350         {
351             e.printStackTrace();
352         }
353         return (menu);
354     }
355     
356     /**
357      *   メニュー表示前の処理
358      *
359      */
360     public void onPrepareOptionsMenu(Menu menu)
361     {
362         try
363         {
364             menu.findItem(MENU_ID_SHARE).setVisible(true);
365             menu.findItem(MENU_ID_EXPORT).setVisible(true);
366             menu.findItem(MENU_ID_EXPORT_XML).setVisible(true);
367             menu.findItem(MENU_ID_IMPORT).setVisible(true);
368             menu.findItem(MENU_ID_IMPORT_XML).setVisible(true);
369             menu.findItem(MENU_ID_DELETE).setVisible(true);
370         }
371         catch (Exception e)
372         {
373             e.printStackTrace();
374         }
375     }
376
377     /**
378      *   メニューのアイテムが選択されたときの処理
379      *
380      */
381     public boolean onOptionsItemSelected(MenuItem item)
382     {
383         boolean result;
384         switch (item.getItemId())
385         {
386             case MENU_ID_EXPORT -> {
387                 // 表示中データのエクスポート
388                 export_as_csv(false);
389                 result = true;
390             }
391             case MENU_ID_EXPORT_XML -> {
392                 // 表示中データのエクスポート
393                 export_as_xml();
394                 result = true;
395             }
396             case MENU_ID_SHARE -> {
397                 export_as_csv(true);
398                 result = true;
399             }
400             case MENU_ID_IMPORT -> {
401                 // データのインポート
402                 importObjectFromCsv();
403                 result = true;
404             }
405             case MENU_ID_IMPORT_XML -> {
406                 // データのインポート(XML形式)
407                 importObjectFromXml();
408                 result = true;
409             }
410             case MENU_ID_DELETE -> {
411                 // データの削除
412                 deleteContent();
413                 result = true;
414             }
415             default -> result = false;
416         }
417         return (result);
418     }
419
420     /**
421      *   XML形式でデータをインポートする
422      */
423     private void importObjectFromXml()
424     {
425         try
426         {
427             // ファイル選択のダイアログを取得する
428             if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT)
429             {
430                 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
431                 intent.addCategory(Intent.CATEGORY_OPENABLE);
432                 intent.setType("text/*");
433                 intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
434                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
435                 {
436                     String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath() + "/" + APP_NAMESPACE + "/";
437                     intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, path);
438                 }
439                 parent.startActivityForResult(intent, PICK_XML_FILE);
440             }
441             else
442             {
443                 // 旧バージョンの Android での処理... (File Picker ってあったっけ?)
444
445
446             }
447         }
448         catch (Exception e)
449         {
450             e.printStackTrace();
451         }
452     }
453
454     /**
455      *   データを削除する
456      */
457     private void deleteContent()
458     {
459         try
460         {
461             //  データの一覧を取得する
462             FileSelectionDialog dialog = new FileSelectionDialog(parent, parent.getString(R.string.delete_content), ".xml", fileName -> {
463                 // fileNameのファイルを削除する...
464                 Thread thread = new Thread(() -> {
465                     // ファイル削除の実処理
466                     String targetFile = parent.getFilesDir() + "/" + fileName;
467                     if (!(new File(targetFile).delete()))
468                     {
469                         Log.v(TAG, "Content Delete Failure : " + fileName);
470                     }
471                 });
472                 try
473                 {
474                     // 削除実処理の実行
475                     thread.start();
476                     parent.runOnUiThread(() -> {
477                         String outputMessage = parent.getString(R.string.delete_content) + " " + fileName;
478
479                         Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
480                     });
481                 }
482                 catch (Exception e)
483                 {
484                     e.printStackTrace();
485                 }
486             });
487             dialog.prepare();
488             dialog.getDialog().show();
489         }
490         catch (Exception e)
491         {
492             e.printStackTrace();
493         }
494     }
495
496
497     /**
498      *   CSV形式でデータをインポートする
499      */
500     private void importObjectFromCsv()
501     {
502         // ファイル選択のダイアログを取得する
503         if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT)
504         {
505             Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
506             intent.addCategory(Intent.CATEGORY_OPENABLE);
507             intent.setType("text/*");
508             intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
509             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
510             {
511                 String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath() + "/" + APP_NAMESPACE + "/";
512                 intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, path);
513             }
514             parent.startActivityForResult(intent, PICK_CSV_FILE);
515         }
516         else
517         {
518             // 旧バージョンの Android での処理... (File Picker ってあったっけ?)
519
520
521         }
522     }
523
524     /**
525      *   データをCSV形式で出力する
526      */
527     private void export_as_csv(boolean isShare)
528     {
529         isShareExportedData = isShare;
530
531         // AsyncTaskを使ってデータをエクスポートする
532         MeMoMaFileExportCsvProcess asyncTask = new MeMoMaFileExportCsvProcess(parent, this);
533         asyncTask.execute(objectHolder);
534     }
535
536     /**
537      *   データをXML形式で出力する
538      */
539     private void export_as_xml()
540     {
541         try
542         {
543             Thread thread = new Thread(() -> {
544                 try
545                 {
546                     SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
547                     String backgroundUri = preferences.getString("backgroundUri", "");
548                     String userCheckboxString = preferences.getString("userCheckboxString", "");
549                     ExtensionXmlExport exporter = new ExtensionXmlExport(parent, objectHolder, backgroundUri, userCheckboxString);
550                     final String result = exporter.exportToXmlFile();
551                     parent.runOnUiThread(() -> {
552                         try
553                         {
554                             onExportedResultXml(result);
555                         }
556                         catch (Exception e)
557                         {
558                             e.printStackTrace();
559                         }
560                     });
561                 }
562                 catch (Exception ee)
563                 {
564                     ee.printStackTrace();
565                 }
566             });
567             thread.start();
568         }
569         catch (Exception e)
570         {
571             e.printStackTrace();
572         }
573     }
574
575     /**
576      *    ファイルをロードする途中のバックグラウンド処理...
577      * 
578      */
579         public void onLoadingProcess()
580         {
581                 try
582                 {
583                 // リストに表示するアイテムを生成する
584                 listItems = null;
585                 listItems = new ArrayList<>();
586
587                 // TODO: 何らかの法則に従って並べ替えをする。
588
589                 Enumeration<Integer> keys = objectHolder.getObjectKeys();
590                 while (keys.hasMoreElements())
591                 {
592                     Integer key = keys.nextElement();
593                     PositionObject pos = objectHolder.getPosition(key);
594
595                     // アイコンの決定
596                     int objectStyleIcon = MeMoMaObjectHolder .getObjectDrawStyleIcon(pos.getDrawStyle());
597                     
598                     // ユーザチェックの有無表示
599                     int userCheckedIcon = (pos.getUserChecked()) ? R.drawable.btn_checked : R.drawable.btn_notchecked;
600
601                     // TODO: アイテム選択時の情報エリアは(ArrayItem側には)用意しているが未使用。
602                     SymbolListArrayItem listItem = new SymbolListArrayItem(userCheckedIcon, pos.getLabel(), pos.getDetail(), "", objectStyleIcon);
603
604                     listItems.add(listItem);
605                 }
606             }
607         catch (Exception ex)
608             {
609                 // 例外発生...ログを吐く
610                 Log.v(TAG, "ExtensionActivityListener::onLoadingProcess() : " + ex.getMessage());
611             ex.printStackTrace();
612             }   
613         }
614
615     /**
616      *    ファイルのロード結果を受け取る
617      * 
618      */
619     public void onLoadedResult(boolean isError, String detail)
620     {
621                 Log.v(TAG, "ExtensionActivityListener::onLoadedResult() '"  + objectHolder.getDataTitle() +"' : " + detail);
622
623                 // 読み込んだファイル名をタイトルに設定する
624                 parent.setTitle(objectHolder.getDataTitle());
625                 
626                 // オブジェクト一覧を表示する
627                 updateObjectList();
628                 
629                 // 読み込みしたことを伝達する
630                 //String outputMessage = parent.getString(R.string.load_data) + " " + objectHolder.getDataTitle() + " " + detail;
631         //Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();     
632     }
633
634     /**
635      *    ファイルのエクスポート結果を受け取る
636      * 
637      */
638     public void onExportedResult(Uri documentUri, String detail)
639     {
640         Log.v(TAG, "ExtensionActivityListener::onExportedResult() '"  + objectHolder.getDataTitle() +"' : " + detail);
641
642         // エクスポートしたことを伝達する
643         String outputMessage = parent.getString(R.string.export_csv) + " " + objectHolder.getDataTitle() + " " + detail;
644         if ((documentUri == null)&&(isShareExportedData))
645         {
646             // エクスポートはできない
647             isShareExportedData = false;
648             outputMessage = parent.getString(R.string.exported_data_not_shared) + " : " + objectHolder.getDataTitle() + " " + detail;
649         }
650         Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
651
652         if (isShareExportedData)
653         {
654             // エクスポートしたファイルを共有する
655             shareContent(documentUri);
656         }
657         isShareExportedData = false;
658     }
659     
660     /**
661      *    オブジェクト一覧を更新する
662      */
663     private void updateObjectList()
664     {
665         try
666         {
667                 // リストアダプターを生成し、設定する
668             ListView listView = parent.findViewById(R.id.ExtensionView);
669             ListAdapter adapter = new SymbolListArrayAdapter(parent,  R.layout.listarrayitems, listItems);
670             listView.setAdapter(adapter);
671
672             // アイテムを選択したときの処理
673             listView.setOnItemClickListener((parentView, view, position, id) -> {
674                 ListView listView1 = (ListView) parentView;
675                 SymbolListArrayItem item = (SymbolListArrayItem) listView1.getItemAtPosition(position);
676
677                 /// リストが選択されたときの処理...データを開く
678                 showDetailData(item.getTextResource1st(), item.getTextResource2nd(), item.getTextResource3rd());
679             });
680             System.gc();   // いらない(参照が切れた)クラスを消したい
681         }
682         catch (Exception ex)
683         {
684                 // 何もしない。
685         }
686     }
687     
688     /**
689      *    エクスポートしたファイルを共有する
690      */
691     private void shareContent(Uri documentUri)
692     {
693         String message = "";
694         try
695         {
696                 // 現在の時刻を取得する
697             Calendar calendar = Calendar.getInstance();
698                 SimpleDateFormat outFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US);
699             String date =  outFormat.format(calendar.getTime());
700
701             // メールタイトル
702             String title = parent.getString(R.string.app_name) + " | "+ objectHolder.getDataTitle() + " | " + date;
703
704             // メールの本文を構築する
705             message = message + "Name : " + objectHolder.getDataTitle() + "\n";
706             message = message + "exported : " + date + "\n";
707             message = message + "number of objects : " + objectHolder.getCount() + "\n";
708
709             // Share Intentを発行する。
710             SharedIntentInvoker.shareContent(parent, MENU_ID_SHARE, title, message, documentUri, "text/plain");
711         }
712         catch (Exception ex)
713         {
714             Log.v(TAG, "shareContent (fileName : " + objectHolder.getDataTitle() + ")");
715             ex.printStackTrace();
716         }
717     }
718     
719     /**
720      *   ファイルが選択された!
721      * 
722      */
723     public void selectedFileName(String fileName)
724     {
725         // CSVファイルからオブジェクトをロードするクラスを呼び出す。
726         Log.v(TAG, "ExtensionActivityListener::selectedFileName() : " + fileName);
727         MeMoMaFileImportCsvProcess asyncTask = new MeMoMaFileImportCsvProcess(parent, this, fileName);
728         asyncTask.execute(objectHolder);
729     }
730
731     /**
732      *    インポート結果の受信
733      *
734      */
735     public void onImportedResult(String detail)
736     {
737                 Log.v(TAG, "ExtensionActivityListener::onImportedResult() '"  + objectHolder.getDataTitle() +"' : " + detail);
738
739                 // インポートしたことを伝達する
740                 String outputMessage = parent.getString(R.string.import_csv) + " " + objectHolder.getDataTitle() + " " + detail;
741         Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
742
743         // 一覧のリストを作りなおす
744         onLoadingProcess();
745         updateObjectList();
746     }
747
748     private void onImportedResultXml(String detail)
749     {
750         String title = objectHolder.getDataTitle();
751         Log.v(TAG, "ExtensionActivityListener::onImportedResultXml() '"  + title + "' : " + detail);
752
753         // インポート時の注意事項ダイアログを表示する
754         parent.runOnUiThread(() -> {
755             //  ダイアログで情報を表示する。
756             new AlertDialog.Builder(parent)
757                     .setIcon(android.R.drawable.ic_dialog_alert)
758                     .setTitle(parent.getString(R.string.import_xml) + " (" + objectHolder.getDataTitle() + ")")
759                     .setMessage(parent.getString(R.string.import_xml_information))
760                     .setPositiveButton(parent.getString(R.string.confirmYes), null)
761                     .show();
762
763             // インポートしたことを伝達する
764             String outputMessage = parent.getString(R.string.import_xml) + " " + objectHolder.getDataTitle() + " " + detail;
765             Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
766         });
767
768         // タイトルを更新
769         setPreferenceString(title);
770
771         // 一覧のリストを作りなおす
772         onLoadingProcess();
773         updateObjectList();
774     }
775     private void onExportedResultXml(String detail)
776     {
777         Log.v(TAG, "ExtensionActivityListener::onExportedResultXml() '"  + objectHolder.getDataTitle() +"' : " + detail);
778
779         // エクスポートしたことを伝達する
780         String outputMessage = parent.getString(R.string.export_xml) + " " + objectHolder.getDataTitle() + " " + detail;
781         Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
782     }
783
784 }