OSDN Git Service

CSV形式でエクスポートする部分を追加。
authorMRSa <mrsa@myad.jp>
Sun, 30 Apr 2023 15:20:10 +0000 (00:20 +0900)
committerMRSa <mrsa@myad.jp>
Sun, 30 Apr 2023 15:20:10 +0000 (00:20 +0900)
app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaDataInOutManager.java
app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaFileExportCsvProcess.java
app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaFileLoadingProcess.java
app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaFileSavingEngine.java
app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaFileSavingProcess.java

index 984af2a..9750c98 100644 (file)
@@ -245,7 +245,7 @@ public class MeMoMaDataInOutManager implements MeMoMaFileSavingProcess.ISavingSt
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
         SharedPreferences.Editor editor = preferences.edit();
         editor.putString("MeMoMaInfo", data);
-        editor.apply();
+               editor.apply();
 
                // 選択したアイテムをロードする!
                loadFileWithName(data);
index 47fa5ff..181377a 100644 (file)
@@ -1,42 +1,42 @@
 package jp.sourceforge.gokigen.memoma.io;
 
+import static jp.sourceforge.gokigen.memoma.Main.APP_NAMESPACE;
+
 import java.io.File;
-import java.io.FileWriter;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Enumeration;
 import java.util.Locale;
 
 import android.app.ProgressDialog;
+import android.content.ContentResolver;
+import android.content.ContentValues;
 import android.content.Context;
 import android.graphics.RectF;
+import android.net.Uri;
 import android.os.AsyncTask;
+import android.os.Build;
+import android.os.Environment;
+import android.provider.MediaStore;
 import android.util.Log;
 
-import jp.sourceforge.gokigen.memoma.Main;
 import jp.sourceforge.gokigen.memoma.R;
 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
 import jp.sourceforge.gokigen.memoma.holders.PositionObject;
 
 /**
  *  データをファイルに保存するとき用 アクセスラッパ (非同期処理を実行)
- *
- *  AsyncTask
- *    MeMoMaObjectHolder : 実行時に渡すクラス(Param)
- *    Integer    : 途中経過を伝えるクラス(Progress)
- *    String     : 処理結果を伝えるクラス(Result)
- *
- * @author MRSa
- *
  */
 public class MeMoMaFileExportCsvProcess extends AsyncTask<MeMoMaObjectHolder, Integer, String>
 {
     private final String TAG = toString();
     private final Context context;
-    private IResultReceiver receiver;
+    private final IResultReceiver receiver;
     private String exportedFileName = null;
 
-    private ProgressDialog savingDialog;
+    private final ProgressDialog savingDialog;
 
     /**
      *   コンストラクタ
@@ -54,12 +54,7 @@ public class MeMoMaFileExportCsvProcess extends AsyncTask<MeMoMaObjectHolder, In
         savingDialog.setCancelable(false);
         savingDialog.show();
 
-        // ファイルをバックアップするディレクトリを作成する
-        File dir = new File(context.getFilesDir() + "/exported");
-        if (!dir.mkdir())
-        {
-            Log.v(toString(), "mkDir() fail. : " + dir.getAbsolutePath());
-        }
+
     }
 
     /**
@@ -69,22 +64,55 @@ public class MeMoMaFileExportCsvProcess extends AsyncTask<MeMoMaObjectHolder, In
     @Override
     protected void onPreExecute()
     {
+
     }
 
     /**
      *    データを(CSV形式で)保管する。
      *
      */
-    private String exportToCsvFile(String fileName, MeMoMaObjectHolder objectHolder)
+    private String exportToCsvFile(String baseName, MeMoMaObjectHolder objectHolder)
     {
         String resultMessage = "";
         try
         {
+            String outputDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath() + "/" + APP_NAMESPACE + "/";
+            ContentResolver resolver = context.getContentResolver();
+
             // エクスポートするファイル名を決定する
             Calendar calendar = Calendar.getInstance();
-            SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.US);
-            exportedFileName = fileName + "_" + outFormat.format(calendar.getTime()) + ".csv";
-            FileWriter writer = new FileWriter(new File(exportedFileName));
+            SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMdd_HHmmss_", Locale.US);
+            exportedFileName =  outFormat.format(calendar.getTime()) + baseName + ".csv";
+
+            Uri extStorageUri;
+            ContentValues values = new ContentValues();
+            values.put(MediaStore.Downloads.TITLE, exportedFileName);
+            values.put(MediaStore.Downloads.DISPLAY_NAME, exportedFileName);
+            values.put(MediaStore.Downloads.MIME_TYPE, "text/csv"); // text/plain or text/csv
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
+            {
+                values.put(MediaStore.Downloads.RELATIVE_PATH, "Download/" + APP_NAMESPACE);
+                values.put(MediaStore.Downloads.IS_PENDING, true);
+                extStorageUri = MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
+            }
+            else
+            {
+                File path = new File(outputDir);
+                values.put(MediaStore.Downloads.DATA, path.getAbsolutePath() + File.separator + exportedFileName);
+                extStorageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
+            }
+            Log.v(TAG, "---------- " + exportedFileName + " " + values);
+
+            Uri documentUri = resolver.insert(extStorageUri, values);
+
+            if (documentUri == null)
+            {
+                resultMessage = "documentUri is NULL.";
+                return (resultMessage);
+            }
+
+            OutputStream outputStream = resolver.openOutputStream(documentUri, "wa");
+            OutputStreamWriter writer = new OutputStreamWriter(outputStream);
 
             //  データのタイトルを出力
             String str = "; label,detail,userChecked,shape,style,centerX,centerY,width,height,;!<_$ (';!<_$' is a record Separator)\r\n";
@@ -122,10 +150,16 @@ public class MeMoMaFileExportCsvProcess extends AsyncTask<MeMoMaObjectHolder, In
             }
             writer.flush();
             writer.close();
+
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
+            {
+                values.put(MediaStore.Downloads.IS_PENDING, false);
+                resolver.update(documentUri, values, null, null);
+            }
         }
         catch (Exception e)
         {
-            resultMessage = " ERR>" + e.toString();
+            resultMessage = " ERR " + e.getMessage();
             Log.v(TAG, resultMessage);
             e.printStackTrace();
         }
index bb9bc0f..f8cdf86 100644 (file)
@@ -21,7 +21,6 @@ import jp.sourceforge.gokigen.memoma.holders.PositionObject;
 
 /**
  *  データをファイルに保存するとき用 アクセスラッパ (非同期処理を実行)
- *  
  *  AsyncTask
  *    MeMoMaObjectHolder : 実行時に渡すクラス(Param)
  *    Integer    : 途中経過を伝えるクラス(Progress)
@@ -34,7 +33,7 @@ public class MeMoMaFileLoadingProcess extends AsyncTask<MeMoMaObjectHolder, Inte
 {
     private final String TAG = toString();
        private final Context parent;
-       private IResultReceiver receiver;
+       private final IResultReceiver receiver;
 
         private PositionObject position = null;
         private ObjectConnector line = null;
@@ -323,9 +322,9 @@ public class MeMoMaFileLoadingProcess extends AsyncTask<MeMoMaObjectHolder, Inte
         }
         catch (Exception e)
         {
-                resultMessage = " ERR>" + e.getMessage();
+             resultMessage = " ERR " + e.getMessage();
              Log.v(TAG, resultMessage);
-                e.printStackTrace();
+             e.printStackTrace();
         }
        return (resultMessage);
     }
@@ -333,7 +332,6 @@ public class MeMoMaFileLoadingProcess extends AsyncTask<MeMoMaObjectHolder, Inte
     /**
      *  非同期処理
      *  (バックグラウンドで実行する(このメソッドは、UIスレッドと別のところで実行する))
-     * 
      */
     @Override
     protected String doInBackground(MeMoMaObjectHolder... datas)
@@ -349,9 +347,8 @@ public class MeMoMaFileLoadingProcess extends AsyncTask<MeMoMaObjectHolder, Inte
         {
                receiver.onLoadingProcess();
         }
-
-               System.gc();
-               return (result);
+        System.gc();
+        return (result);
     }
     /**
      *  非同期処理の進捗状況の更新
index e2ccafa..5221b71 100644 (file)
@@ -18,16 +18,13 @@ import jp.sourceforge.gokigen.memoma.holders.PositionObject;
 
 /**
  *  データをファイルに保存するエンジン部分
- *  
- * @author MRSa
- *
  */
 public class MeMoMaFileSavingEngine
 {
     private final String TAG = toString();
     private final Context context;
-       private String backgroundUri = null;
-       private String userCheckboxString = null;    
+       private final String backgroundUri;
+       private final String userCheckboxString;
        
        /**
         *   コンストラクタ
@@ -36,70 +33,12 @@ public class MeMoMaFileSavingEngine
     {
         this.context = context;
 
-       // ファイルをバックアップするディレクトリを作成する
-       File dir = new File(context.getFilesDir() + "/backup");
-       dir.mkdir();
-
        //  設定データ読み出し用...。
        backgroundUri = bgUri;
        userCheckboxString = checkBoxLabel;
     }
 
     /**
-     *   ファイルが存在したとき、リネームする
-     *
-     */
-    private boolean renameFile(String targetFileName, String newFileName)
-    {
-       boolean ret = true;
-               File targetFile = new File(targetFileName);
-               if (targetFile.exists())
-               {
-                       // ファイルが存在した、、、ファイル名を1世代古いものに変更する
-                       ret = targetFile.renameTo(new File(newFileName));
-               }
-               return (ret);
-    }
-    
-    /**
-     *    保管データを複数世代保管する。
-     * 
-     *
-     */
-    private void backupFiles(String dirName, String backupFileName)
-    {
-       //  データをバックアップする。(上書き予定のファイルがあれば、それをコピーする)
-        boolean result = true;
-        try
-        {
-               String  fileName = dirName +  "backup/" + backupFileName;
-               File backFile = new File(fileName + ".xml.bak5");
-               if (backFile.exists())
-               {
-                       // ファイルが存在した、、、削除する
-                       backFile.delete();
-               }
-               backFile = null;
-               renameFile((fileName + ".xml.bak4"), (fileName + ".xml.bak5"));
-               renameFile((fileName + ".xml.bak3"), (fileName + ".xml.bak4"));
-               renameFile((fileName + ".xml.bak2"), (fileName + ".xml.bak3"));
-               renameFile((fileName + ".xml.bak1"), (fileName + ".xml.bak2"));
-               renameFile((fileName + ".xml.bak"), (fileName + ".xml.bak1"));
-               renameFile((dirName + backupFileName + ".xml"), (fileName + ".xml.bak"));
-        }
-        catch (Exception ex)
-        {
-               // 何か例外が発生した場合にはエラーと認識する。
-               result = false;
-        }
-               if (!result)
-               {
-            // バックアップファイルのコピー失敗をログに記述する
-            Log.v(TAG, "rename failure : " + dirName +  backupFileName + ".xml");
-               }
-    }
-    
-    /**
      *    データを(XML形式で)保管する。
      *
      */
@@ -280,10 +219,10 @@ public class MeMoMaFileSavingEngine
         }
         catch (Exception e)
         {
-               resultMessage = " " + e.getMessage();
-            Log.v(TAG, e.getMessage());
+            resultMessage = " " + e.getMessage();
+            Log.v(TAG, resultMessage);
             e.printStackTrace();
-        } 
+        }
         return (resultMessage);
     }
 
@@ -293,7 +232,7 @@ public class MeMoMaFileSavingEngine
     public String saveObjects(MeMoMaObjectHolder objectHolder)
     {
                // データタイトルがない場合...保存処理は行わない。
-       if (objectHolder.getDataTitle().length() <= 0)
+       if (objectHolder.getDataTitle().length() == 0)
         {
                Log.v(TAG, "MeMoMaFileSavingEngine::saveObjects() : specified file name is illegal, save aborted. : " + objectHolder.getDataTitle() );
 
@@ -306,13 +245,7 @@ public class MeMoMaFileSavingEngine
             return("Data is empty, not saved.");
         }
 
-       //// バックアップを保存する
-       //backupFiles(context.getFilesDir() + "/" , objectHolder.getDataTitle());
-       
-        // ファイル名の設定 ... (拡張子なし)
-       String fileName = context.getFilesDir() + "/" + objectHolder.getDataTitle();
-
-       // データを保管する
-        return (storeToXmlFile(fileName, objectHolder));
+       // データを保管する (ファイル名の設定は、拡張子なし
+        return (storeToXmlFile(context.getFilesDir() + "/" + objectHolder.getDataTitle(), objectHolder));
     }
 }
index ab87b04..4038551 100644 (file)
@@ -7,13 +7,11 @@ import android.os.AsyncTask;
 import android.preference.PreferenceManager;
 import android.util.Log;
 
-import jp.sourceforge.gokigen.memoma.Main;
 import jp.sourceforge.gokigen.memoma.R;
 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
 
 /**
  *  データをファイルに保存するとき用 アクセスラッパ (非同期処理を実行)
- *  
  *  AsyncTask
  *    MeMoMaObjectHolder : 実行時に渡すクラス(Param)
  *    Integer    : 途中経過を伝えるクラス(Progress)
@@ -27,13 +25,12 @@ public class MeMoMaFileSavingProcess extends AsyncTask<MeMoMaObjectHolder, Integ
        private final String TAG = toString();
 
        private final Context context;
-       private IResultReceiver receiver = null;
-       //private ExternalStorageFileUtility fileUtility = null;
-       private ISavingStatusHolder statusHolder = null;
+       private final IResultReceiver receiver;
+       private final ISavingStatusHolder statusHolder;
        
-       private String backgroundUri = null;
-       private String userCheckboxString = null;
-       private ProgressDialog savingDialog = null;
+       private final String backgroundUri;
+       private final String userCheckboxString;
+       private final ProgressDialog savingDialog;
        
        /**
         *   コンストラクタ
@@ -75,22 +72,21 @@ public class MeMoMaFileSavingProcess extends AsyncTask<MeMoMaObjectHolder, Integ
     /**
      *  非同期処理
      *  (バックグラウンドで実行する(このメソッドは、UIスレッドと別のところで実行する))
-     * 
      */
     @Override
     protected String doInBackground(MeMoMaObjectHolder... datas)
     {
-       // 保管中状態を設定する
-       statusHolder.setSavingStatus(true);
+               // 保管中状態を設定する
+               statusHolder.setSavingStatus(true);
 
-       // データの保管メイン
-       MeMoMaFileSavingEngine savingEngine = new MeMoMaFileSavingEngine(context, backgroundUri, userCheckboxString);
-       String result = savingEngine.saveObjects(datas[0]);
+               // データの保管メイン
+               MeMoMaFileSavingEngine savingEngine = new MeMoMaFileSavingEngine(context, backgroundUri, userCheckboxString);
+               String result = savingEngine.saveObjects(datas[0]);
 
-        System.gc();
-               
-       // 未保管状態にリセットする
-       statusHolder.setSavingStatus(false);
+               System.gc();
+
+               // 未保管状態にリセットする
+               statusHolder.setSavingStatus(false);
 
                return (result);
     }
@@ -133,29 +129,23 @@ public class MeMoMaFileSavingProcess extends AsyncTask<MeMoMaObjectHolder, Integ
     
     /**
      *    結果報告用のインタフェース(積極的に使う予定はないけど...)
-     *    
-     * @author MRSa
-     *
      */
     public interface IResultReceiver
     {
-        /**  保存結果の報告 **/
-        public abstract void onSavedResult(String detail);
+        // 保存結果の報告
+               void onSavedResult(String detail);
     }
 
     /**
      *     ファイル保存実施状態を記憶するインタフェースクラス
-     *     
-     * @author MRSa
-     *
      */
     public interface ISavingStatusHolder
     {
-       /**  保存中状態を設定する **/
-        public abstract void setSavingStatus(boolean isSaving);
+       // 保存中状態を設定する
+               void setSavingStatus(boolean isSaving);
         
-        /** 保存中状態を取得する **/
-        public abstract boolean getSavingStatus();
+        // 保存中状態を取得する
+               boolean getSavingStatus();
     }
 
 }