1 package jp.sourceforge.gokigen.memoma.fileio;
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.os.AsyncTask;
10 import android.preference.PreferenceManager;
11 import android.util.Log;
13 import jp.sourceforge.gokigen.memoma.Main;
14 import jp.sourceforge.gokigen.memoma.R;
15 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
18 * データをファイルに保存するとき用 アクセスラッパ (非同期処理を実行)
21 * MeMoMaObjectHolder : 実行時に渡すクラス(Param)
22 * Integer : 途中経過を伝えるクラス(Progress)
23 * String : 処理結果を伝えるクラス(Result)
28 public class MeMoMaFileImportCsvProcess extends AsyncTask<MeMoMaObjectHolder, Integer, String> implements MeMoMaFileSavingProcess.ISavingStatusHolder, MeMoMaFileSavingProcess.IResultReceiver
30 private Context parent = null;
31 private IResultReceiver receiver = null;
32 private ExternalStorageFileUtility fileUtility = null;
33 private String targetFileName = null;
34 private String fileSavedResult = "";
35 private ProgressDialog importingDialog = null;
37 private String backgroundUri = null;
38 private String userCheckboxString = null;
43 public MeMoMaFileImportCsvProcess(Context context, ExternalStorageFileUtility utility, IResultReceiver resultReceiver, String fileName)
46 receiver = resultReceiver;
47 fileUtility = utility;
48 targetFileName = fileName;
50 // プログレスダイアログ(「データインポート中...」)を表示する。
51 importingDialog = new ProgressDialog(context);
52 importingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
53 importingDialog.setMessage(context.getString(R.string.dataImporting));
54 importingDialog.setIndeterminate(true);
55 importingDialog.setCancelable(false);
56 importingDialog.show();
58 // 設定読み出し用...あらかじめ、UIスレッドで読みだしておく。
59 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
60 backgroundUri = preferences.getString("backgroundUri","");
61 userCheckboxString = preferences.getString("userCheckboxString","");
69 protected void onPreExecute()
79 private String readRecord(BufferedReader buf )
81 String oneRecord = null;
84 String oneLine = buf.readLine();
85 while (oneLine != null)
87 oneRecord = (oneRecord == null) ? oneLine : oneRecord + oneLine;
88 if (oneRecord.indexOf(",;!<_$") > 0)
90 // レコード末尾が見つかったので break する。
94 oneLine = buf.readLine();
100 Log.v(Main.APP_IDENTIFIER, "CSV:readRecord() ex : " + ex.toString());
112 private void parseRecord(String dataLine, MeMoMaObjectHolder objectHolder)
115 int userCheckIndexTrue = 0;
116 int userCheckIndexFalse = 0;
120 boolean userChecked = false;
123 detailIndex = dataLine.indexOf("\",\"");
126 Log.v(Main.APP_IDENTIFIER, "parseRecord() : label wrong : " + dataLine);
129 label = dataLine.substring(1, detailIndex);
130 userCheckIndexTrue = dataLine.indexOf("\",True,", detailIndex);
131 userCheckIndexFalse = dataLine.indexOf("\",False,", detailIndex);
132 if (userCheckIndexFalse > detailIndex)
135 detail = dataLine.substring(detailIndex + 3, userCheckIndexFalse);
137 nextIndex = userCheckIndexFalse + 8; // 8は、 ",False, を足した数
139 else if (userCheckIndexTrue > detailIndex)
142 detail = dataLine.substring(detailIndex + 3, userCheckIndexTrue);
144 nextIndex = userCheckIndexTrue + 7; // 7は、 ",True, を足した数
146 else // if ((userCheckIndexTrue <= detailIndex)&&(userCheckIndexFalse <= detailIndex))
148 Log.v(Main.APP_IDENTIFIER, "parseRecord() : detail wrong : " + dataLine);
153 String[] datas = (dataLine.substring(nextIndex)).split(",");
154 if (datas.length < 6)
156 Log.v(Main.APP_IDENTIFIER, "parseRecord() : data size wrong : " + datas.length);
159 int drawStyle = Integer.parseInt(datas[0]);
160 String paintStyle = datas[1];
161 float centerX = Float.parseFloat(datas[2]);
162 float centerY = Float.parseFloat(datas[3]);
163 float width = Float.parseFloat(datas[4]);
164 float height = Float.parseFloat(datas[5]);
166 float left = centerX - (width / 2.0f);
167 float top = centerY - (height / 2.0f);
170 MeMoMaObjectHolder.PositionObject pos = objectHolder.createPosition(left, top, drawStyle);
173 Log.v(Main.APP_IDENTIFIER, "parseRecord() : object create failure.");
176 pos.rect.right = left + width;
177 pos.rect.bottom = top + height;
180 pos.paintStyle = paintStyle;
181 pos.userChecked = userChecked;
182 Log.v(Main.APP_IDENTIFIER, "OBJECT CREATED: " + label + "(" + left + "," + top + ") [" +drawStyle + "]");
186 Log.v(Main.APP_IDENTIFIER, "parseRecord() " + ex.toString());
193 * (CSV形式の)データを読み込んで格納する。
196 * @param objectHolder
199 private String importFromCsvFile(String fileName, MeMoMaObjectHolder objectHolder)
201 String resultMessage = "";
204 Log.v(Main.APP_IDENTIFIER, "CSV(import)>> " + fileName);
205 BufferedReader buf = new BufferedReader(new FileReader(fileName));
206 String dataLine = readRecord(buf);
207 while (dataLine != null)
209 if (dataLine.startsWith(";") != true)
212 parseRecord(dataLine, objectHolder);
215 dataLine = readRecord(buf);
220 resultMessage = " ERR(import)>" + e.toString();
221 Log.v(Main.APP_IDENTIFIER, resultMessage);
224 return (resultMessage);
229 * (バックグラウンドで実行する(このメソッドは、UIスレッドと別のところで実行する))
233 protected String doInBackground(MeMoMaObjectHolder... datas)
235 // ファイル名の設定 ... (拡張子なし)
236 String fileName = fileUtility.getGokigenDirectory() + "/exported/" + targetFileName;
239 String result = importFromCsvFile(fileName, datas[0]);
242 MeMoMaFileSavingEngine savingEngine = new MeMoMaFileSavingEngine(fileUtility, backgroundUri, userCheckboxString);
243 String message = savingEngine.saveObjects(datas[0]);
247 return (result + " " + message);
255 protected void onProgressUpdate(Integer... values)
265 protected void onPostExecute(String result)
269 if (receiver != null)
271 receiver.onImportedResult(result + " " + fileSavedResult);
273 fileSavedResult = "";
277 Log.v(Main.APP_IDENTIFIER, "MeMoMaFileImportCsvProcess::onPostExecute() : " + ex.toString());
280 importingDialog.dismiss();
285 public void onSavedResult(String detail)
287 fileSavedResult = detail;
290 public void setSavingStatus(boolean isSaving)
295 public boolean getSavingStatus()
301 * 結果報告用のインタフェース(積極的に使う予定はないけど...)
306 public interface IResultReceiver
309 public abstract void onImportedResult(String detail);