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.os.AsyncTask;
10 import android.preference.PreferenceManager;
11 import android.util.Log;
13 import jp.sourceforge.gokigen.memoma.R;
14 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
15 import jp.sourceforge.gokigen.memoma.holders.PositionObject;
18 * データをファイルに保存するとき用 アクセスラッパ (非同期処理を実行)
20 public class MeMoMaFileImportCsvProcess extends AsyncTask<MeMoMaObjectHolder, Integer, String> implements MeMoMaFileSavingProcess.ISavingStatusHolder, MeMoMaFileSavingProcess.IResultReceiver
22 private final String TAG = toString();
23 private final Context context;
24 private IResultReceiver receiver = null;
26 private String targetFileName = null;
27 private String fileSavedResult = "";
28 private ProgressDialog importingDialog = null;
30 private String backgroundUri = null;
31 private String userCheckboxString = null;
36 public MeMoMaFileImportCsvProcess(Context context, IResultReceiver resultReceiver, String fileName)
38 this.context = context;
39 receiver = resultReceiver;
40 targetFileName = fileName;
42 // プログレスダイアログ(「データインポート中...」)を表示する。
43 importingDialog = new ProgressDialog(context);
44 importingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
45 importingDialog.setMessage(context.getString(R.string.dataImporting));
46 importingDialog.setIndeterminate(true);
47 importingDialog.setCancelable(false);
48 importingDialog.show();
50 // 設定読み出し用...あらかじめ、UIスレッドで読みだしておく。
51 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
52 backgroundUri = preferences.getString("backgroundUri","");
53 userCheckboxString = preferences.getString("userCheckboxString","");
60 protected void onPreExecute()
67 private String readRecord(BufferedReader buf )
69 String oneRecord = null;
72 String oneLine = buf.readLine();
73 while (oneLine != null)
75 oneRecord = (oneRecord == null) ? oneLine : oneRecord + oneLine;
76 if (oneRecord.indexOf(",;!<_$") > 0)
78 // レコード末尾が見つかったので break する。
82 oneLine = buf.readLine();
88 Log.v(TAG, "CSV:readRecord() ex : " + ex.toString());
97 private void parseRecord(String dataLine, MeMoMaObjectHolder objectHolder)
100 int userCheckIndexTrue = 0;
101 int userCheckIndexFalse = 0;
105 boolean userChecked = false;
108 detailIndex = dataLine.indexOf("\",\"");
111 Log.v(TAG, "parseRecord() : label wrong : " + dataLine);
114 label = dataLine.substring(1, detailIndex);
115 userCheckIndexTrue = dataLine.indexOf("\",True,", detailIndex);
116 userCheckIndexFalse = dataLine.indexOf("\",False,", detailIndex);
117 if (userCheckIndexFalse > detailIndex)
120 detail = dataLine.substring(detailIndex + 3, userCheckIndexFalse);
122 nextIndex = userCheckIndexFalse + 8; // 8は、 ",False, を足した数
124 else if (userCheckIndexTrue > detailIndex)
127 detail = dataLine.substring(detailIndex + 3, userCheckIndexTrue);
129 nextIndex = userCheckIndexTrue + 7; // 7は、 ",True, を足した数
131 else // if ((userCheckIndexTrue <= detailIndex)&&(userCheckIndexFalse <= detailIndex))
133 Log.v(TAG, "parseRecord() : detail wrong : " + dataLine);
138 String[] datas = (dataLine.substring(nextIndex)).split(",");
139 if (datas.length < 6)
141 Log.v(TAG, "parseRecord() : data size wrong : " + datas.length);
144 int drawStyle = Integer.parseInt(datas[0]);
145 String paintStyle = datas[1];
146 float centerX = Float.parseFloat(datas[2]);
147 float centerY = Float.parseFloat(datas[3]);
148 float width = Float.parseFloat(datas[4]);
149 float height = Float.parseFloat(datas[5]);
151 float left = centerX - (width / 2.0f);
152 float top = centerY - (height / 2.0f);
155 PositionObject pos = objectHolder.createPosition(left, top, drawStyle);
158 Log.v(TAG, "parseRecord() : object create failure.");
161 pos.setRectRight(left + width);
162 pos.setRectBottom(top + height);
164 pos.setDetail(detail);
165 pos.setPaintStyle(paintStyle);
166 pos.setUserChecked(userChecked);
167 Log.v(TAG, "OBJECT CREATED: " + label + "(" + left + "," + top + ") [" +drawStyle + "]");
171 Log.v(TAG, "parseRecord() " + ex.toString());
178 * (CSV形式の)データを読み込んで格納する。
180 private String importFromCsvFile(String fileName, MeMoMaObjectHolder objectHolder)
182 String resultMessage = "";
185 Log.v(TAG, "CSV(import)>> " + fileName);
186 BufferedReader buf = new BufferedReader(new FileReader(fileName));
187 String dataLine = readRecord(buf);
188 while (dataLine != null)
190 if (!dataLine.startsWith(";"))
193 parseRecord(dataLine, objectHolder);
196 dataLine = readRecord(buf);
201 resultMessage = " ERR(import) " + e.getMessage();
202 Log.v(TAG, resultMessage);
205 return (resultMessage);
210 * (バックグラウンドで実行する(このメソッドは、UIスレッドと別のところで実行する))
214 protected String doInBackground(MeMoMaObjectHolder... datas)
216 // ファイル名の設定 ... (拡張子なし)
217 String fileName = context.getFilesDir() + "/exported/" + targetFileName;
220 String result = importFromCsvFile(fileName, datas[0]);
223 MeMoMaFileSavingEngine savingEngine = new MeMoMaFileSavingEngine(context, backgroundUri, userCheckboxString);
224 String message = savingEngine.saveObjects(datas[0]);
228 return (result + " " + message);
235 protected void onProgressUpdate(Integer... values)
245 protected void onPostExecute(String result)
249 if (receiver != null)
251 receiver.onImportedResult(result + " " + fileSavedResult);
253 fileSavedResult = "";
257 Log.v(TAG, "MeMoMaFileImportCsvProcess::onPostExecute() : " + ex.getMessage());
260 importingDialog.dismiss();
265 public void onSavedResult(boolean isError, String detail)
267 fileSavedResult = detail;
270 public void setSavingStatus(boolean isSaving)
275 public boolean getSavingStatus()
281 * 結果報告用のインタフェース(積極的に使う予定はないけど...)
283 public interface IResultReceiver
286 void onImportedResult(String fileName);