1 package jp.sourceforge.gokigen.memoma.io;
3 import java.io.BufferedReader;
4 import java.io.FileReader;
6 import android.app.ProgressDialog;
7 import android.content.Context;
8 import android.content.SharedPreferences;
9 import android.net.Uri;
10 import android.os.AsyncTask;
11 import android.preference.PreferenceManager;
12 import android.util.Log;
14 import jp.sourceforge.gokigen.memoma.Main;
15 import jp.sourceforge.gokigen.memoma.R;
16 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
17 import jp.sourceforge.gokigen.memoma.holders.PositionObject;
20 * データをファイルに保存するとき用 アクセスラッパ (非同期処理を実行)
23 * MeMoMaObjectHolder : 実行時に渡すクラス(Param)
24 * Integer : 途中経過を伝えるクラス(Progress)
25 * String : 処理結果を伝えるクラス(Result)
30 public class MeMoMaFileImportCsvProcess extends AsyncTask<MeMoMaObjectHolder, Integer, String> implements MeMoMaFileSavingProcess.ISavingStatusHolder, MeMoMaFileSavingProcess.IResultReceiver
32 private final String TAG = toString();
33 private final Context context;
34 private IResultReceiver receiver = null;
36 private String targetFileName = null;
37 private String fileSavedResult = "";
38 private ProgressDialog importingDialog = null;
40 private String backgroundUri = null;
41 private String userCheckboxString = null;
46 public MeMoMaFileImportCsvProcess(Context context, IResultReceiver resultReceiver, String fileName)
48 this.context = context;
49 receiver = resultReceiver;
50 targetFileName = fileName;
52 // プログレスダイアログ(「データインポート中...」)を表示する。
53 importingDialog = new ProgressDialog(context);
54 importingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
55 importingDialog.setMessage(context.getString(R.string.dataImporting));
56 importingDialog.setIndeterminate(true);
57 importingDialog.setCancelable(false);
58 importingDialog.show();
60 // 設定読み出し用...あらかじめ、UIスレッドで読みだしておく。
61 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
62 backgroundUri = preferences.getString("backgroundUri","");
63 userCheckboxString = preferences.getString("userCheckboxString","");
71 protected void onPreExecute()
81 private String readRecord(BufferedReader buf )
83 String oneRecord = null;
86 String oneLine = buf.readLine();
87 while (oneLine != null)
89 oneRecord = (oneRecord == null) ? oneLine : oneRecord + oneLine;
90 if (oneRecord.indexOf(",;!<_$") > 0)
92 // レコード末尾が見つかったので break する。
96 oneLine = buf.readLine();
102 Log.v(TAG, "CSV:readRecord() ex : " + ex.toString());
114 private void parseRecord(String dataLine, MeMoMaObjectHolder objectHolder)
117 int userCheckIndexTrue = 0;
118 int userCheckIndexFalse = 0;
122 boolean userChecked = false;
125 detailIndex = dataLine.indexOf("\",\"");
128 Log.v(TAG, "parseRecord() : label wrong : " + dataLine);
131 label = dataLine.substring(1, detailIndex);
132 userCheckIndexTrue = dataLine.indexOf("\",True,", detailIndex);
133 userCheckIndexFalse = dataLine.indexOf("\",False,", detailIndex);
134 if (userCheckIndexFalse > detailIndex)
137 detail = dataLine.substring(detailIndex + 3, userCheckIndexFalse);
139 nextIndex = userCheckIndexFalse + 8; // 8は、 ",False, を足した数
141 else if (userCheckIndexTrue > detailIndex)
144 detail = dataLine.substring(detailIndex + 3, userCheckIndexTrue);
146 nextIndex = userCheckIndexTrue + 7; // 7は、 ",True, を足した数
148 else // if ((userCheckIndexTrue <= detailIndex)&&(userCheckIndexFalse <= detailIndex))
150 Log.v(TAG, "parseRecord() : detail wrong : " + dataLine);
155 String[] datas = (dataLine.substring(nextIndex)).split(",");
156 if (datas.length < 6)
158 Log.v(TAG, "parseRecord() : data size wrong : " + datas.length);
161 int drawStyle = Integer.parseInt(datas[0]);
162 String paintStyle = datas[1];
163 float centerX = Float.parseFloat(datas[2]);
164 float centerY = Float.parseFloat(datas[3]);
165 float width = Float.parseFloat(datas[4]);
166 float height = Float.parseFloat(datas[5]);
168 float left = centerX - (width / 2.0f);
169 float top = centerY - (height / 2.0f);
172 PositionObject pos = objectHolder.createPosition(left, top, drawStyle);
175 Log.v(TAG, "parseRecord() : object create failure.");
178 pos.setRectRight(left + width);
179 pos.setRectBottom(top + height);
181 pos.setDetail(detail);
182 pos.setPaintStyle(paintStyle);
183 pos.setUserChecked(userChecked);
184 Log.v(TAG, "OBJECT CREATED: " + label + "(" + left + "," + top + ") [" +drawStyle + "]");
188 Log.v(TAG, "parseRecord() " + ex.toString());
195 * (CSV形式の)データを読み込んで格納する。
198 * @param objectHolder
201 private String importFromCsvFile(String fileName, MeMoMaObjectHolder objectHolder)
203 String resultMessage = "";
206 Log.v(TAG, "CSV(import)>> " + fileName);
207 BufferedReader buf = new BufferedReader(new FileReader(fileName));
208 String dataLine = readRecord(buf);
209 while (dataLine != null)
211 if (dataLine.startsWith(";") != true)
214 parseRecord(dataLine, objectHolder);
217 dataLine = readRecord(buf);
222 resultMessage = " ERR(import)>" + e.toString();
223 Log.v(TAG, resultMessage);
226 return (resultMessage);
231 * (バックグラウンドで実行する(このメソッドは、UIスレッドと別のところで実行する))
235 protected String doInBackground(MeMoMaObjectHolder... datas)
237 // ファイル名の設定 ... (拡張子なし)
238 String fileName = context.getFilesDir() + "/exported/" + targetFileName;
241 String result = importFromCsvFile(fileName, datas[0]);
244 MeMoMaFileSavingEngine savingEngine = new MeMoMaFileSavingEngine(context, backgroundUri, userCheckboxString);
245 String message = savingEngine.saveObjects(datas[0]);
249 return (result + " " + message);
257 protected void onProgressUpdate(Integer... values)
267 protected void onPostExecute(String result)
271 if (receiver != null)
273 receiver.onImportedResult(result + " " + fileSavedResult);
275 fileSavedResult = "";
279 Log.v(TAG, "MeMoMaFileImportCsvProcess::onPostExecute() : " + ex.toString());
282 importingDialog.dismiss();
287 public void onSavedResult(String detail)
289 fileSavedResult = detail;
292 public void setSavingStatus(boolean isSaving)
297 public boolean getSavingStatus()
303 * 結果報告用のインタフェース(積極的に使う予定はないけど...)
308 public interface IResultReceiver
311 void onImportedResult(String fileName);