OSDN Git Service

Androidの古いバージョンでの対応を追加。
[gokigen/MeMoMa.git] / app / src / main / java / jp / sourceforge / gokigen / memoma / io / MeMoMaDataInOutManager.java
1 package jp.sourceforge.gokigen.memoma.io;
2
3 import java.text.SimpleDateFormat;
4 import java.util.Calendar;
5 import java.util.Locale;
6
7 import android.net.Uri;
8 import android.content.SharedPreferences;
9 import android.preference.PreferenceManager;
10 import android.util.Log;
11 import android.widget.Toast;
12
13 import androidx.appcompat.app.ActionBar;
14 import androidx.appcompat.app.AppCompatActivity;
15
16 import jp.sourceforge.gokigen.memoma.drawers.GokigenSurfaceView;
17 import jp.sourceforge.gokigen.memoma.R;
18 import jp.sourceforge.gokigen.memoma.drawers.MeMoMaCanvasDrawer;
19 import jp.sourceforge.gokigen.memoma.holders.MeMoMaDataFileHolder;
20 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
21
22 public class MeMoMaDataInOutManager implements MeMoMaFileSavingProcess.ISavingStatusHolder, MeMoMaFileSavingProcess.IResultReceiver, MeMoMaFileLoadingProcess.IResultReceiver,  ActionBar.OnNavigationListener, ObjectLayoutCaptureExporter.ICaptureLayoutExporter
23 {
24         private final String TAG = toString();
25         private final AppCompatActivity parent;
26         private MeMoMaObjectHolder objectHolder = null;
27
28     private MeMoMaDataFileHolder dataFileHolder = null;
29         
30         private boolean isSaving = false;       
31         private boolean isShareExportedData = false;
32         
33         /**
34          *    コンストラクタ
35          * 
36          */
37         public MeMoMaDataInOutManager(AppCompatActivity activity)
38         {
39             parent = activity;
40         }
41
42         /**
43          *
44          *
45          */
46         public void prepare(MeMoMaObjectHolder objectHolder, ActionBar bar, String fileName)
47         {
48         this.objectHolder = objectHolder;
49
50         // データファイルフォルダを更新する
51         dataFileHolder = new MeMoMaDataFileHolder(parent, android.R.layout.simple_spinner_dropdown_item, ".xml");
52         int index = dataFileHolder.updateFileList(fileName);
53
54         try
55                 {
56                         // アクションバーを設定する
57                         prepareActionBar(bar);
58                 }
59                 catch (Exception e)
60                 {
61                         e.printStackTrace();
62                 }
63
64         // タイトルの設定を変更する
65         if ((bar != null)&&(index >= 0))
66         {
67             bar.setSelectedNavigationItem(index);  // 実験...
68         }
69         }
70
71         /**
72          *   データファイル一覧を更新し、アクションバーに反映させる
73          *
74          */
75         public void updateFileList(String titleName, ActionBar bar)
76         {
77                 if (dataFileHolder != null)
78                 {
79                         // データファイル一覧を更新する
80             int index = dataFileHolder.updateFileList(titleName);
81
82             // タイトルをオブジェクトフォルダに記憶させる
83                 objectHolder.setDataTitle(titleName);
84
85                 // タイトルの設定を変更する
86             if ((bar != null)&&(index >= 0))
87             {
88                 bar.setSelectedNavigationItem(index);  // 実験...
89             }
90                 }
91         }
92
93     /**
94      *   データの保存を行う (同名のファイルが存在していた場合、 *.BAKにリネーム(上書き)してから保存する)
95      */
96         public void saveFile(String dataTitle, boolean forceOverwrite)
97         {
98                 if (objectHolder == null)
99                 {
100                         Log.e(TAG, "ERR>MeMoMaDataInOutManager::saveFile() : "  + dataTitle);
101                         return;
102                 }
103
104                 // タイトルをオブジェクトフォルダに記憶させる
105                 objectHolder.setDataTitle(dataTitle);
106                 Log.v(TAG, "MeMoMaDataInOutManager::saveFile() : "  + dataTitle);
107
108                 // 同期型でファイルを保存する。。。
109                 String message = saveFileSynchronous();
110                 onSavedResult((message.length() != 0), message);
111         }
112
113         /**
114          *    データファイルのフルパスを応答する
115          */
116         public String getDataFileFullPath(String dataTitle, String extension)
117         {
118                 return (parent.getFilesDir() + "/" + dataTitle + extension);
119         }
120
121         /**  保存中状態を設定する **/
122     public void setSavingStatus(boolean isSaving)
123     {
124         this.isSaving = isSaving;
125     }
126     
127     /** 保存中状態を取得する **/
128     public boolean getSavingStatus()
129     {
130         return (isSaving);
131     }
132
133         /**
134          *    保存終了時の処理
135          */
136     public  void onSavedResult(boolean isError, String detail)
137     {
138         // 保存したことを伝達する
139                 String outputMessage = parent.getString(R.string.save_data) + " " + objectHolder.getDataTitle() + " " + detail;
140                 if (isError)
141                 {
142                         Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
143                 }
144                 Log.v(TAG, outputMessage);
145
146                 // ファイルリスト更新 ... (ここでやっちゃあ、AsyncTaskにしている意味ないなあ...)
147         dataFileHolder.updateFileList(objectHolder.getDataTitle());
148     }
149
150     /**
151          *    読み込み終了時の処理
152          */
153     public  void onLoadedResult(boolean isError, String detail)
154     {
155         // 読み込みしたことを伝達する
156                 String outputMessage = parent.getString(R.string.load_data) + " " + objectHolder.getDataTitle() + " " + detail;
157                 if (isError)
158                 {
159                         Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
160                 }
161                 Log.v(TAG, outputMessage);
162
163         // 画面を再描画する
164         final GokigenSurfaceView surfaceview = parent.findViewById(R.id.GraphicView);
165         surfaceview.doDraw();
166     }
167
168     /**
169      *    ファイルをロードする途中のバックグラウンド処理...
170      * 
171      */
172         public void onLoadingProcess()
173         {
174         // 何もしない...
175         }
176
177     /**
178      *    ファイルからデータを読み込む。
179      */
180     public void loadFile(String dataTitle)
181     {
182         loadFileWithName(dataTitle);
183     }
184     
185     
186     /**
187      *   ファイルからのデータ読み込み処理
188      */
189         private void loadFileWithName(String dataTitle)
190         {
191                 if (objectHolder == null)
192                 {
193                         Log.e(TAG, "ERR>MeMoMaDataInOutManager::loadFile() : "  + dataTitle);
194                         return;
195                 }
196
197                 // タイトルをオブジェクトフォルダに記憶させる
198                 objectHolder.setDataTitle(dataTitle);
199                 Log.v(TAG, "MeMoMaDataInOutManager::loadFile() : "  + dataTitle);
200
201                 // AsyncTaskを使ってデータを読み込む
202                 MeMoMaFileLoadingProcess asyncTask = new MeMoMaFileLoadingProcess(parent, this);
203         asyncTask.execute(objectHolder);
204         }
205
206         /**
207          *    アクションバーを更新する...
208          */
209         private void prepareActionBar(ActionBar bar)
210         {
211                 try {
212                         bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);  // リストを入れる
213                         bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);   // タイトルの表示をマスクする
214                         bar.setListNavigationCallbacks(dataFileHolder, this);
215                 }
216                 catch (Exception e)
217                 {
218                         e.printStackTrace();
219                 }
220         }
221
222         /**
223          *    ファイルを保存する...同期型で。
224          */
225         private String saveFileSynchronous()
226         {
227                 // 同期型でファイルを保存する。。。
228         SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
229         String backgroundUri = preferences.getString("backgroundUri","");
230         String userCheckboxString = preferences.getString("userCheckboxString","");
231         MeMoMaFileSavingEngine saveEngine = new MeMoMaFileSavingEngine(parent, backgroundUri, userCheckboxString);
232         return (saveEngine.saveObjects(objectHolder));
233         }
234
235         /**
236          * 
237          * 
238          */
239         public boolean onNavigationItemSelected(int itemPosition, long itemId)
240         {
241                 String data = dataFileHolder.getItem(itemPosition);
242                 Log.v(TAG, "onNavigationItemSelected(" + itemPosition + "," + itemId + ") : " + data);
243
244                 // 同期型で現在のファイルを保存する。。。
245                 String message = saveFileSynchronous();
246                 onSavedResult((message.length() != 0), message);
247
248                 // 選択したファイル名をタイトルに反映し、またPreferenceにも記憶する
249                 parent.setTitle(data);
250                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
251                 SharedPreferences.Editor editor = preferences.edit();
252                 editor.putString("MeMoMaInfo", data);
253                 editor.apply();
254
255                 // 選択したアイテムをロードする!
256                 loadFileWithName(data);
257
258                 return (true);
259         }
260
261         /**
262          *    スクリーンキャプチャを実施する
263          */
264         public void doScreenCapture(String title, MeMoMaObjectHolder holder, MeMoMaCanvasDrawer drawer, boolean isShare)
265         {
266                 isShareExportedData = isShare;
267                 
268         // AsyncTaskを使ってデータをエクスポートする
269                 ObjectLayoutCaptureExporter asyncTask = new ObjectLayoutCaptureExporter(parent, holder, drawer, this);
270         asyncTask.execute(title);
271         }
272         
273     /**
274      *    ファイルのエクスポート結果を受け取る
275      */
276         public void onCaptureLayoutExportedResult(Uri exportedUri, String detail, int id)
277         {
278                 Log.v(TAG, "MeMoMaDataInOutManager::onCaptureExportedResult() '"  + objectHolder.getDataTitle() +"' : " + detail);
279                 try
280                 {
281                         // エクスポートしたことを伝達する
282                         String outputMessage = parent.getString(R.string.capture_data) + " " + objectHolder.getDataTitle() + " " + detail;
283                         if ((exportedUri == null)&&(isShareExportedData))
284                         {
285                                 // エクスポートはできない
286                                 isShareExportedData = false;
287                                 outputMessage = parent.getString(R.string.exported_picture_not_shared) + " : " + objectHolder.getDataTitle() + " " + detail;
288                         }
289                         Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
290                         if (isShareExportedData)
291                         {
292                                 // ギャラリーに受信したファイルを登録し、エクスポートしたファイルを共有する
293                                 shareContent(exportedUri, id);
294                         }
295                 }
296                 catch (Exception e)
297                 {
298                         e.printStackTrace();
299                 }
300                 isShareExportedData = false;
301         }
302
303     /**
304      *    エクスポートしたファイルを共有する
305      */
306     private void shareContent(Uri imageName, int id)
307     {
308         String message = "";
309         try
310         {
311                 // 現在の時刻を取得する
312             Calendar calendar = Calendar.getInstance();
313                 SimpleDateFormat outFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US);
314             String date =  outFormat.format(calendar.getTime());
315
316             // メールタイトル
317             String title = parent.getString(R.string.app_name) + " | "+ objectHolder.getDataTitle() + " | " + date;
318
319             // メールの本文を構築する
320             message = message + "Name : " + objectHolder.getDataTitle() + "\n";
321             message = message + "exported : " + date + "\n";
322             message = message + "number of objects : " + objectHolder.getCount() + "\n";
323
324             // Share Intentを発行する。
325             SharedIntentInvoker.shareContent(parent, id, title, message,  imageName, "image/png");
326         }
327         catch (Exception ex)
328         {
329                 ex.printStackTrace();
330         }
331     }
332
333 }