1 package jp.sourceforge.gokigen.memoma.io;
3 import java.text.SimpleDateFormat;
4 import java.util.Calendar;
5 import java.util.Locale;
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;
13 import androidx.appcompat.app.ActionBar;
14 import androidx.appcompat.app.AppCompatActivity;
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;
22 public class MeMoMaDataInOutManager implements MeMoMaFileSavingProcess.ISavingStatusHolder, MeMoMaFileSavingProcess.IResultReceiver, MeMoMaFileLoadingProcess.IResultReceiver, ActionBar.OnNavigationListener, ObjectLayoutCaptureExporter.ICaptureLayoutExporter
24 private final String TAG = toString();
25 private final AppCompatActivity parent;
26 private MeMoMaObjectHolder objectHolder = null;
28 private MeMoMaDataFileHolder dataFileHolder = null;
30 private boolean isSaving = false;
31 private boolean isShareExportedData = false;
37 public MeMoMaDataInOutManager(AppCompatActivity activity)
46 public void prepare(MeMoMaObjectHolder objectHolder, ActionBar bar, String fileName)
48 this.objectHolder = objectHolder;
51 dataFileHolder = new MeMoMaDataFileHolder(parent, android.R.layout.simple_spinner_dropdown_item, ".xml");
52 int index = dataFileHolder.updateFileList(fileName);
57 prepareActionBar(bar);
65 if ((bar != null)&&(index >= 0))
67 bar.setSelectedNavigationItem(index); // 実験...
72 * データファイル一覧を更新し、アクションバーに反映させる
75 public void updateFileList(String titleName, ActionBar bar)
77 if (dataFileHolder != null)
80 int index = dataFileHolder.updateFileList(titleName);
82 // タイトルをオブジェクトフォルダに記憶させる
83 objectHolder.setDataTitle(titleName);
86 if ((bar != null)&&(index >= 0))
88 bar.setSelectedNavigationItem(index); // 実験...
94 * データの保存を行う (同名のファイルが存在していた場合、 *.BAKにリネーム(上書き)してから保存する)
96 public void saveFile(String dataTitle, boolean forceOverwrite)
98 if (objectHolder == null)
100 Log.e(TAG, "ERR>MeMoMaDataInOutManager::saveFile() : " + dataTitle);
104 // タイトルをオブジェクトフォルダに記憶させる
105 objectHolder.setDataTitle(dataTitle);
106 Log.v(TAG, "MeMoMaDataInOutManager::saveFile() : " + dataTitle);
109 String message = saveFileSynchronous();
110 onSavedResult((message.length() != 0), message);
116 public String getDataFileFullPath(String dataTitle, String extension)
118 return (parent.getFilesDir() + "/" + dataTitle + extension);
122 public void setSavingStatus(boolean isSaving)
124 this.isSaving = isSaving;
128 public boolean getSavingStatus()
136 public void onSavedResult(boolean isError, String detail)
139 String outputMessage = parent.getString(R.string.save_data) + " " + objectHolder.getDataTitle() + " " + detail;
142 Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
144 Log.v(TAG, outputMessage);
146 // ファイルリスト更新 ... (ここでやっちゃあ、AsyncTaskにしている意味ないなあ...)
147 dataFileHolder.updateFileList(objectHolder.getDataTitle());
153 public void onLoadedResult(boolean isError, String detail)
156 String outputMessage = parent.getString(R.string.load_data) + " " + objectHolder.getDataTitle() + " " + detail;
159 Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
161 Log.v(TAG, outputMessage);
164 final GokigenSurfaceView surfaceview = parent.findViewById(R.id.GraphicView);
165 surfaceview.doDraw();
169 * ファイルをロードする途中のバックグラウンド処理...
172 public void onLoadingProcess()
180 public void loadFile(String dataTitle)
182 loadFileWithName(dataTitle);
189 private void loadFileWithName(String dataTitle)
191 if (objectHolder == null)
193 Log.e(TAG, "ERR>MeMoMaDataInOutManager::loadFile() : " + dataTitle);
197 // タイトルをオブジェクトフォルダに記憶させる
198 objectHolder.setDataTitle(dataTitle);
199 Log.v(TAG, "MeMoMaDataInOutManager::loadFile() : " + dataTitle);
201 // AsyncTaskを使ってデータを読み込む
202 MeMoMaFileLoadingProcess asyncTask = new MeMoMaFileLoadingProcess(parent, this);
203 asyncTask.execute(objectHolder);
209 private void prepareActionBar(ActionBar bar)
212 bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); // リストを入れる
213 bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); // タイトルの表示をマスクする
214 bar.setListNavigationCallbacks(dataFileHolder, this);
225 private String saveFileSynchronous()
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));
239 public boolean onNavigationItemSelected(int itemPosition, long itemId)
241 String data = dataFileHolder.getItem(itemPosition);
242 Log.v(TAG, "onNavigationItemSelected(" + itemPosition + "," + itemId + ") : " + data);
244 // 同期型で現在のファイルを保存する。。。
245 String message = saveFileSynchronous();
246 onSavedResult((message.length() != 0), message);
248 // 選択したファイル名をタイトルに反映し、またPreferenceにも記憶する
249 parent.setTitle(data);
250 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
251 SharedPreferences.Editor editor = preferences.edit();
252 editor.putString("MeMoMaInfo", data);
256 loadFileWithName(data);
264 public void doScreenCapture(String title, MeMoMaObjectHolder holder, MeMoMaCanvasDrawer drawer, boolean isShare)
266 isShareExportedData = isShare;
268 // AsyncTaskを使ってデータをエクスポートする
269 ObjectLayoutCaptureExporter asyncTask = new ObjectLayoutCaptureExporter(parent, holder, drawer, this);
270 asyncTask.execute(title);
276 public void onCaptureLayoutExportedResult(Uri exportedUri, String detail, int id)
278 Log.v(TAG, "MeMoMaDataInOutManager::onCaptureExportedResult() '" + objectHolder.getDataTitle() +"' : " + detail);
282 String outputMessage = parent.getString(R.string.capture_data) + " " + objectHolder.getDataTitle() + " " + detail;
283 if ((exportedUri == null)&&(isShareExportedData))
286 isShareExportedData = false;
287 outputMessage = parent.getString(R.string.exported_picture_not_shared) + " : " + objectHolder.getDataTitle() + " " + detail;
289 Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
290 if (isShareExportedData)
292 // ギャラリーに受信したファイルを登録し、エクスポートしたファイルを共有する
293 shareContent(exportedUri, id);
300 isShareExportedData = false;
306 private void shareContent(Uri imageName, int id)
312 Calendar calendar = Calendar.getInstance();
313 SimpleDateFormat outFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US);
314 String date = outFormat.format(calendar.getTime());
317 String title = parent.getString(R.string.app_name) + " | "+ objectHolder.getDataTitle() + " | " + date;
320 message = message + "Name : " + objectHolder.getDataTitle() + "\n";
321 message = message + "exported : " + date + "\n";
322 message = message + "number of objects : " + objectHolder.getCount() + "\n";
324 // Share Intentを発行する。
325 SharedIntentInvoker.shareContent(parent, id, title, message, imageName, "image/png");
329 ex.printStackTrace();