OSDN Git Service

https://osdn.net/cvs/view/gokigen/MeMoMa/ から コピーしてくる。(+API27でビルドできるよう、少し調整。)
[gokigen/MeMoMa.git] / app / src / main / java / jp / sourceforge / gokigen / memoma / fileio / MeMoMaFileExportCsvProcess.java
1 package jp.sourceforge.gokigen.memoma.fileio;
2
3 import java.io.File;
4 import java.io.FileWriter;
5 import java.text.SimpleDateFormat;
6 import java.util.Calendar;
7 import java.util.Enumeration;
8
9 import android.app.ProgressDialog;
10 import android.content.Context;
11 import android.os.AsyncTask;
12 import android.util.Log;
13
14 import jp.sourceforge.gokigen.memoma.Main;
15 import jp.sourceforge.gokigen.memoma.R;
16 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
17
18 /**
19  *  データをファイルに保存するとき用 アクセスラッパ (非同期処理を実行)
20  *  
21  *  AsyncTask
22  *    MeMoMaObjectHolder : 実行時に渡すクラス(Param)
23  *    Integer    : 途中経過を伝えるクラス(Progress)
24  *    String     : 処理結果を伝えるクラス(Result)
25  *    
26  * @author MRSa
27  *
28  */
29 public class MeMoMaFileExportCsvProcess extends AsyncTask<MeMoMaObjectHolder, Integer, String>
30 {       
31         private IResultReceiver receiver = null;
32         private ExternalStorageFileUtility fileUtility = null;
33         private String exportedFileName = null;
34
35         ProgressDialog savingDialog = null;
36         
37         /**
38          *   コンストラクタ
39          */
40     public MeMoMaFileExportCsvProcess(Context context, ExternalStorageFileUtility utility,  IResultReceiver resultReceiver)
41     {
42         receiver = resultReceiver;
43         fileUtility = utility;
44
45         //  プログレスダイアログ(「保存中...」)を表示する。
46         savingDialog = new ProgressDialog(context);
47         savingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
48         savingDialog.setMessage(context.getString(R.string.dataSaving));
49         savingDialog.setIndeterminate(true);
50         savingDialog.setCancelable(false);
51         savingDialog.show();
52         
53         /** ファイルをバックアップするディレクトリを作成する **/
54         File dir = new File(fileUtility.getGokigenDirectory() + "/exported");
55         dir.mkdir();
56
57     }
58         
59     /**
60      *  非同期処理実施前の前処理
61      * 
62      */
63     @Override
64     protected void onPreExecute()
65     {
66     }
67     
68     /**
69      *    データを(CSV形式で)保管する。
70      * 
71      * @param fileName
72      * @param objectHolder
73      * @return
74      */
75     private String exportToCsvFile(String fileName, MeMoMaObjectHolder objectHolder)
76     {
77         String resultMessage = "";
78         try
79         {
80                 // エクスポートするファイル名を決定する
81             Calendar calendar = Calendar.getInstance();
82             SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");
83             exportedFileName = fileName + "_" + outFormat.format(calendar.getTime()) + ".csv";
84                 FileWriter writer = new FileWriter(new File(exportedFileName));         
85             
86                 //  データのタイトルを出力
87                 String str = "";
88                 str = "; label,detail,userChecked,shape,style,centerX,centerY,width,height,;!<_$ (';!<_$' is a record Separator)\r\n";
89             writer.write(str);
90                 
91                 // オブジェクトの出力 (保持しているものをすべて表示する)
92                 Enumeration<Integer> keys = objectHolder.getObjectKeys();
93             while (keys.hasMoreElements())
94             {
95                 Integer key = keys.nextElement();
96                 MeMoMaObjectHolder.PositionObject pos = objectHolder.getPosition(key);
97
98                 // TODO:  絞り込み条件がある場合には、その条件に従ってしぼり込む必要あり。
99
100                 str = "";
101                 str = str + "\"" + pos.label + "\"";
102                 str = str + ",\"" + pos.detail + "\"";
103                 if (pos.userChecked == true)
104                 {
105                         str = str + ",True";
106                 }
107                 else
108                 {
109                         str = str + ",False";
110                 }
111                 str = str + "," + pos.drawStyle;   // オブジェクトの形状
112                 str = str + "," + pos.paintStyle;   // オブジェクトの塗りつぶし状態
113                 str = str + "," + (Math.round(pos.rect.centerX() * 100.0f) / 100.0f);
114                 str = str + "," + (Math.round(pos.rect.centerY() * 100.0f) / 100.0f);
115                 str = str + "," + (Math.round(pos.rect.width() * 100.0f) / 100.0f);
116                 str = str + "," + (Math.round(pos.rect.height() * 100.0f) / 100.0f);
117                 str = str + ",;!<_$\r\n";
118                 writer.write(str);
119             }
120             writer.flush();
121             writer.close();
122         }
123         catch (Exception e)
124         {
125                 resultMessage = " ERR>" + e.toString();
126             Log.v(Main.APP_IDENTIFIER, resultMessage);
127             e.printStackTrace();
128         } 
129         return (resultMessage);
130     }
131
132     /**
133      *  非同期処理
134      *  (バックグラウンドで実行する(このメソッドは、UIスレッドと別のところで実行する))
135      * 
136      */
137     @Override
138     protected String doInBackground(MeMoMaObjectHolder... datas)
139     {           
140         // ファイル名の設定 ... (拡張子なし)
141         String fileName = fileUtility.getGokigenDirectory() + "/exported/" + datas[0].getDataTitle();
142
143         // データを保管する
144         String result = exportToCsvFile(fileName, datas[0]);
145
146         System.gc();
147
148                 return (result);
149     }
150
151     /**
152      *  非同期処理の進捗状況の更新
153      * 
154      */
155         @Override
156         protected void onProgressUpdate(Integer... values)
157         {
158         // 今回は何もしない
159         }
160
161     /**
162      *  非同期処理の後処理
163      *  (結果を応答する)
164      */
165     @Override
166     protected void onPostExecute(String result)
167     {
168         try
169         {
170             if (receiver != null)
171             {
172                 receiver.onExportedResult(exportedFileName, result);
173             }
174         }
175         catch (Exception ex)
176         {
177                 Log.v(Main.APP_IDENTIFIER, "MeMoMaFileExportCsvProcess::onPostExecute() : " + ex.toString());
178         }
179         // プログレスダイアログを消す
180         savingDialog.dismiss();
181
182         return;
183     }     
184     
185     /**
186      *    結果報告用のインタフェース(積極的に使う予定はないけど...)
187      *    
188      * @author MRSa
189      *
190      */
191     public interface IResultReceiver
192     {
193         /**  保存結果の報告 **/
194         public abstract void onExportedResult(String exportedFileName, String detail);
195     }
196 }