1 package jp.sourceforge.gokigen.memoma;
4 import java.io.FileReader;
6 import org.xmlpull.v1.XmlPullParser;
8 import android.content.Context;
9 import android.content.SharedPreferences;
10 import android.os.AsyncTask;
11 import android.preference.PreferenceManager;
12 import android.util.Log;
13 import android.util.Xml;
16 * データをファイルに保存するとき用 アクセスラッパ (非同期処理を実行)
19 * MeMoMaObjectHolder : 実行時に渡すクラス(Param)
20 * Integer : 途中経過を伝えるクラス(Progress)
21 * String : 処理結果を伝えるクラス(Result)
26 public class MeMoMaFileLoadingProcess extends AsyncTask<MeMoMaObjectHolder, Integer, String>
28 private Context parent = null;
29 private IResultReceiver receiver = null;
30 private ExternalStorageFileUtility fileUtility = null;
32 private MeMoMaObjectHolder.PositionObject position = null;
33 private MeMoMaConnectLineHolder.ObjectConnector line = null;
35 private String backgroundUri = "";
36 private String userCheckboxString = "";
41 public MeMoMaFileLoadingProcess(Context context, ExternalStorageFileUtility utility, IResultReceiver resultReceiver)
44 receiver = resultReceiver;
45 fileUtility = utility;
53 protected void onPreExecute()
58 private void parseStartTag(String name, XmlPullParser parser, MeMoMaObjectHolder objectHolder)
62 //Log.v(Main.APP_IDENTIFIER, "parseStartTag() name = " + name);
63 if ((name.equalsIgnoreCase("top"))&&(position != null))
65 position.rect.top = Float.parseFloat(parser.nextText());
67 else if ((name.equalsIgnoreCase("bottom"))&&(position != null))
69 position.rect.bottom = Float.parseFloat(parser.nextText());
71 else if ((name.equalsIgnoreCase("left"))&&(position != null))
73 position.rect.left = Float.parseFloat(parser.nextText());
75 else if ((name.equalsIgnoreCase("right"))&&(position != null))
77 position.rect.right = Float.parseFloat(parser.nextText());
79 else if ((name.equalsIgnoreCase("drawStyle"))&&(position != null))
81 position.drawStyle = Integer.parseInt(parser.nextText());
83 else if ((name.equalsIgnoreCase("icon"))&&(position != null))
85 position.icon = Integer.parseInt(parser.nextText());
87 else if ((name.equalsIgnoreCase("label"))&&(position != null))
89 position.label = parser.nextText();
91 else if ((name.equalsIgnoreCase("detail"))&&(position != null))
93 position.detail = parser.nextText();
96 else if ((name.equalsIgnoreCase("backgroundUri"))&&(position != null))
98 position.backgroundUri = parser.nextText();
100 else if ((name.equalsIgnoreCase("otherInfoUri"))&&(position != null))
102 position.otherInfoUri = parser.nextText();
104 else if ((name.equalsIgnoreCase("objectStatus"))&&(position != null))
106 position.objectStatus = parser.nextText();
109 else if ((name.equalsIgnoreCase("userChecked"))&&(position != null))
111 String parseData = parser.nextText();
112 position.userChecked =(parseData.equalsIgnoreCase("true")) ? true : false;
114 else if ((name.equalsIgnoreCase("labelColor"))&&(position != null))
116 position.labelColor = Integer.parseInt(parser.nextText());
118 else if ((name.equalsIgnoreCase("objectColor"))&&(position != null))
120 position.objectColor = Integer.parseInt(parser.nextText());
122 else if ((name.equalsIgnoreCase("paintStyle"))&&(position != null))
124 position.paintStyle = parser.nextText();
126 else if ((name.equalsIgnoreCase("strokeWidth"))&&(position != null))
128 position.strokeWidth = Float.parseFloat(parser.nextText());
130 else if ((name.equalsIgnoreCase("fontSize"))&&(position != null))
132 position.fontSize = Float.parseFloat(parser.nextText());
134 else if ((name.equalsIgnoreCase("fromObjectKey"))&&(line != null))
136 line.fromObjectKey = Integer.parseInt(parser.nextText());
138 else if ((name.equalsIgnoreCase("toObjectKey"))&&(line != null))
140 line.toObjectKey = Integer.parseInt(parser.nextText());
142 else if ((name.equalsIgnoreCase("lineStyle"))&&(line != null))
144 line.lineStyle = Integer.parseInt(parser.nextText());
146 else if ((name.equalsIgnoreCase("lineShape"))&&(line != null))
148 line.lineShape = Integer.parseInt(parser.nextText());
150 else if ((name.equalsIgnoreCase("lineThickness"))&&(line != null))
152 line.lineThickness = Integer.parseInt(parser.nextText());
155 else if ((name.equalsIgnoreCase("fromShape"))&&(line != null))
157 line.fromShape = Integer.parseInt(parser.nextText());
159 else if ((name.equalsIgnoreCase("toShape"))&&(line != null))
161 line.toShape = Integer.parseInt(parser.nextText());
163 else if ((name.equalsIgnoreCase("fromString"))&&(line != null))
165 line.fromString = parser.nextText();
167 else if ((name.equalsIgnoreCase("toString"))&&(line != null))
169 line.toString = parser.nextText();
172 else if ((name.equalsIgnoreCase("title"))&&(objectHolder != null))
174 objectHolder.setDataTitle(parser.nextText());
176 else if ((name.equalsIgnoreCase("background"))&&(objectHolder != null))
178 objectHolder.setBackground(parser.nextText());
180 else if ((name.equalsIgnoreCase("backgroundUri"))&&(objectHolder != null))
182 backgroundUri = parser.nextText();
184 else if ((name.equalsIgnoreCase("userCheckboxString"))&&(objectHolder != null))
186 userCheckboxString = parser.nextText();
188 else if ((name.equalsIgnoreCase("objserial"))&&(objectHolder != null))
190 objectHolder.setSerialNumber(Integer.parseInt(parser.nextText()));
191 //Log.v(Main.APP_IDENTIFIER, "objSerial : " + objectHolder.getSerialNumber());
193 else if ((name.equalsIgnoreCase("lineserial"))&&(objectHolder != null))
195 objectHolder.getConnectLineHolder().setSerialNumber(Integer.parseInt(parser.nextText()));
196 //Log.v(Main.APP_IDENTIFIER, "lineSerial : " + objectHolder.getSerialNumber());
198 else if (name.equalsIgnoreCase("object"))
200 int key = Integer.parseInt(parser.getAttributeValue(Main.APP_NAMESPACE, "key"));
201 //Log.v(Main.APP_IDENTIFIER, "create object, key :" + key);
203 position = objectHolder.createPosition(key);
205 else if (name.equalsIgnoreCase("line"))
207 int key = Integer.parseInt(parser.getAttributeValue(Main.APP_NAMESPACE, "key"));
208 //Log.v(Main.APP_IDENTIFIER, "create line, key :" + key);
210 line = objectHolder.getConnectLineHolder().createLine(key);
215 Log.v(Main.APP_IDENTIFIER, "ERR>parseStartTag() name:" + name + " " + e.toString());
219 private void parseEndTag(String name, XmlPullParser parser, MeMoMaObjectHolder objectHolder)
223 if (name.equalsIgnoreCase("object"))
225 //Log.v(Main.APP_IDENTIFIER, "parseEndTag() : OBJECT");
226 //objectHolder.dumpPositionObject(position);
228 // 領域サイズがおかしい場合には、オブジェクトサイズを補正する (ふつーありえないはずなんだけど...)
229 if ((position.rect.left > position.rect.right)||(position.rect.top > position.rect.bottom))
231 Log.v(Main.APP_IDENTIFIER, "RECT IS ILLEGAL. : [" + position.rect.left + "," + position.rect.top + "-[" + position.rect.right + "," + position.rect.bottom + "]");
232 position.rect.right = position.rect.left + MeMoMaObjectHolder.OBJECTSIZE_DEFAULT_X;
233 position.rect.bottom = position.rect.top + MeMoMaObjectHolder.OBJECTSIZE_DEFAULT_Y;
237 else if (name.equalsIgnoreCase("line"))
239 //Log.v(Main.APP_IDENTIFIER, "parseEndTag() : LINE");
240 //objectHolder.getConnectLineHolder().dumpConnectLine(line);
245 Log.v(Main.APP_IDENTIFIER, "ERR>parseEndTag() name:" + name + " " + e.toString());
253 * @param objectHolder
256 private String restoreToXmlFile(String fileName, MeMoMaObjectHolder objectHolder)
258 String resultMessage = "";
259 XmlPullParser parser = Xml.newPullParser();
261 if (objectHolder == null)
263 return ("ERR>objectHolder is null.");
268 File inputFile = new File(fileName);
269 if (inputFile.exists() == false)
271 // ファイルがなかったときには、「ファイルなし」と報告する。
272 resultMessage = "ERR>File not found.";
273 return (resultMessage);
276 FileReader reader = new FileReader(inputFile);
277 parser.setInput(reader);
279 int eventType = parser.getEventType();
280 boolean done = false;
282 // オブジェクトとラインをすべてクリアする
283 objectHolder.removeAllPositions();
284 MeMoMaConnectLineHolder lineHolder = objectHolder.getConnectLineHolder();
285 if (lineHolder == null)
287 return ("ERR>lineHolder is null.");
289 lineHolder.removeAllLines();
291 while ((eventType != XmlPullParser.END_DOCUMENT)&&(done != true))
295 case XmlPullParser.START_DOCUMENT:
298 case XmlPullParser.START_TAG:
299 parseStartTag(parser.getName(), parser, objectHolder);
302 case XmlPullParser.END_TAG:
303 parseEndTag(parser.getName(), parser, objectHolder);
310 eventType = parser.next();
316 resultMessage = " ERR>" + e.toString();
317 Log.v(Main.APP_IDENTIFIER, resultMessage);
320 return (resultMessage);
325 * (バックグラウンドで実行する(このメソッドは、UIスレッドと別のところで実行する))
329 protected String doInBackground(MeMoMaObjectHolder... datas)
331 // ファイル名の設定 ... (拡張子あり...保存時とは違う)
332 String fileName = fileUtility.getGokigenDirectory() + "/" + datas[0].getDataTitle() + ".xml";
335 String result = restoreToXmlFile(fileName, datas[0]);
337 //何か必要な場合、 非同期処理をここで実効
338 if (receiver != null)
340 receiver.onLoadingProcess();
351 protected void onProgressUpdate(Integer... values)
361 protected void onPostExecute(String result)
365 if (result.isEmpty() == true)
367 // エラーが発生していない場合には、読みだしたデータをPreferenceに設定登録...
368 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
369 SharedPreferences.Editor editor = preferences.edit();
370 editor.putString("backgroundUri", backgroundUri);
371 editor.putString("userCheckboxString", userCheckboxString);
375 if (receiver != null)
377 receiver.onLoadedResult(result);
382 Log.v(Main.APP_IDENTIFIER, "MeMoMaFileSavingProcess::onPostExecute() : " + ex.toString());
388 * 結果報告用のインタフェース(積極的に使う予定はないけど...)
393 public interface IResultReceiver
396 public abstract void onLoadingProcess();
399 public abstract void onLoadedResult(String detail);