OSDN Git Service

188c9079cab32c0f6b60941cec164c4a6ccd724b
[gokigen/MeMoMa.git] / app / src / main / java / jp / sourceforge / gokigen / memoma / MeMoMaFileLoadingProcess.java
1 package jp.sourceforge.gokigen.memoma;
2
3 import java.io.File;
4 import java.io.FileReader;
5
6 import org.xmlpull.v1.XmlPullParser;
7
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;
14
15 /**
16  *  データをファイルに保存するとき用 アクセスラッパ (非同期処理を実行)
17  *  
18  *  AsyncTask
19  *    MeMoMaObjectHolder : 実行時に渡すクラス(Param)
20  *    Integer    : 途中経過を伝えるクラス(Progress)
21  *    String     : 処理結果を伝えるクラス(Result)
22  *    
23  * @author MRSa
24  *
25  */
26 public class MeMoMaFileLoadingProcess extends AsyncTask<MeMoMaObjectHolder, Integer, String>
27 {
28         private Context parent = null;
29         private IResultReceiver receiver = null;
30         private ExternalStorageFileUtility fileUtility = null;
31
32          private MeMoMaObjectHolder.PositionObject position = null;
33          private MeMoMaConnectLineHolder.ObjectConnector line = null;
34
35          private String backgroundUri = "";
36      private String userCheckboxString = "";
37         
38         /**
39          *   コンストラクタ
40          */
41     public MeMoMaFileLoadingProcess(Context context, ExternalStorageFileUtility utility, IResultReceiver resultReceiver)
42     {
43         parent = context;
44         receiver = resultReceiver;
45         fileUtility = utility;
46     }
47
48     /**
49      *  非同期処理実施前の前処理
50      * 
51      */
52     @Override
53     protected void onPreExecute()
54     {
55          // 今回は何もしない
56     }
57
58     private void parseStartTag(String name, XmlPullParser parser, MeMoMaObjectHolder objectHolder)
59     {
60         try
61         {
62                 //Log.v(Main.APP_IDENTIFIER, "parseStartTag() name = " + name);
63             if ((name.equalsIgnoreCase("top"))&&(position != null))
64             {
65                 position.rect.top = Float.parseFloat(parser.nextText());
66             }
67             else if ((name.equalsIgnoreCase("bottom"))&&(position != null))
68             {
69                 position.rect.bottom = Float.parseFloat(parser.nextText());             
70             }
71             else if ((name.equalsIgnoreCase("left"))&&(position != null))
72             {
73                 position.rect.left = Float.parseFloat(parser.nextText());               
74             }
75             else if ((name.equalsIgnoreCase("right"))&&(position != null))
76             {
77                 position.rect.right = Float.parseFloat(parser.nextText());              
78             }
79             else if ((name.equalsIgnoreCase("drawStyle"))&&(position != null))
80             {
81                 position.drawStyle = Integer.parseInt(parser.nextText());
82             }
83             else if ((name.equalsIgnoreCase("icon"))&&(position != null))
84             {
85                 position.icon = Integer.parseInt(parser.nextText());                    
86             }
87             else if ((name.equalsIgnoreCase("label"))&&(position != null))
88             {
89                 position.label = parser.nextText();
90             }
91             else if ((name.equalsIgnoreCase("detail"))&&(position != null))
92             {
93                 position.detail = parser.nextText();                    
94             }
95 /**
96             else if ((name.equalsIgnoreCase("backgroundUri"))&&(position != null))
97             {
98                 position.backgroundUri = parser.nextText();                             
99             }
100             else if ((name.equalsIgnoreCase("otherInfoUri"))&&(position != null))
101             {
102                 position.otherInfoUri = parser.nextText();                              
103             }
104             else if ((name.equalsIgnoreCase("objectStatus"))&&(position != null))
105             {
106                 position.objectStatus = parser.nextText();              
107             }
108 **/
109             else if ((name.equalsIgnoreCase("userChecked"))&&(position != null))
110             {
111                 String parseData = parser.nextText();
112                 position.userChecked =(parseData.equalsIgnoreCase("true")) ? true : false;
113             }
114             else if ((name.equalsIgnoreCase("labelColor"))&&(position != null))
115             {
116                 position.labelColor = Integer.parseInt(parser.nextText());              
117             }
118             else if ((name.equalsIgnoreCase("objectColor"))&&(position != null))
119             {
120                 position.objectColor = Integer.parseInt(parser.nextText());             
121             }
122             else if ((name.equalsIgnoreCase("paintStyle"))&&(position != null))
123             {
124                 position.paintStyle = parser.nextText();
125             }
126             else if ((name.equalsIgnoreCase("strokeWidth"))&&(position != null))
127             {
128                 position.strokeWidth = Float.parseFloat(parser.nextText());             
129             }
130             else if ((name.equalsIgnoreCase("fontSize"))&&(position != null))
131             {
132                 position.fontSize = Float.parseFloat(parser.nextText());                
133             }
134             else if ((name.equalsIgnoreCase("fromObjectKey"))&&(line != null))
135             {
136                 line.fromObjectKey = Integer.parseInt(parser.nextText());               
137             }
138             else if ((name.equalsIgnoreCase("toObjectKey"))&&(line != null))
139             {
140                 line.toObjectKey = Integer.parseInt(parser.nextText());                 
141             }
142             else if ((name.equalsIgnoreCase("lineStyle"))&&(line != null))
143             {
144                 line.lineStyle = Integer.parseInt(parser.nextText());                   
145             }
146             else if ((name.equalsIgnoreCase("lineShape"))&&(line != null))
147             {
148                 line.lineShape = Integer.parseInt(parser.nextText());                   
149             }
150             else if ((name.equalsIgnoreCase("lineThickness"))&&(line != null))
151             {
152                 line.lineThickness = Integer.parseInt(parser.nextText());               
153             }
154 /**
155             else if ((name.equalsIgnoreCase("fromShape"))&&(line != null))
156             {
157                 line.fromShape = Integer.parseInt(parser.nextText());                   
158             }
159             else if ((name.equalsIgnoreCase("toShape"))&&(line != null))
160             {
161                 line.toShape = Integer.parseInt(parser.nextText());             
162             }
163             else if ((name.equalsIgnoreCase("fromString"))&&(line != null))
164             {
165                 line.fromString = parser.nextText();                    
166             }
167             else if ((name.equalsIgnoreCase("toString"))&&(line != null))
168             {
169                 line.toString = parser.nextText();              
170             }
171 **/
172             else if ((name.equalsIgnoreCase("title"))&&(objectHolder != null))
173             {
174                 objectHolder.setDataTitle(parser.nextText());
175             }
176             else if ((name.equalsIgnoreCase("background"))&&(objectHolder != null))
177             {
178                 objectHolder.setBackground(parser.nextText());
179             }
180             else if ((name.equalsIgnoreCase("backgroundUri"))&&(objectHolder != null))
181             {
182                 backgroundUri = parser.nextText();
183             }
184             else if ((name.equalsIgnoreCase("userCheckboxString"))&&(objectHolder != null))
185             {
186                 userCheckboxString = parser.nextText();
187             }
188             else if ((name.equalsIgnoreCase("objserial"))&&(objectHolder != null))
189             {
190                 objectHolder.setSerialNumber(Integer.parseInt(parser.nextText()));
191                 //Log.v(Main.APP_IDENTIFIER, "objSerial : " + objectHolder.getSerialNumber());
192             }
193             else if ((name.equalsIgnoreCase("lineserial"))&&(objectHolder != null))
194             {
195                 objectHolder.getConnectLineHolder().setSerialNumber(Integer.parseInt(parser.nextText()));               
196                 //Log.v(Main.APP_IDENTIFIER, "lineSerial : " + objectHolder.getSerialNumber());
197             }
198             else if (name.equalsIgnoreCase("object"))
199             {
200                 int key = Integer.parseInt(parser.getAttributeValue(Main.APP_NAMESPACE, "key"));
201                 //Log.v(Main.APP_IDENTIFIER, "create object, key :" + key);
202                 position = null;
203                 position = objectHolder.createPosition(key);
204             }
205             else if (name.equalsIgnoreCase("line"))
206             {
207                 int key = Integer.parseInt(parser.getAttributeValue(Main.APP_NAMESPACE, "key"));
208                 //Log.v(Main.APP_IDENTIFIER, "create line, key :" + key);
209                 line = null;
210                 line = objectHolder.getConnectLineHolder().createLine(key);             
211             }
212         }
213         catch (Exception e)
214         {
215             Log.v(Main.APP_IDENTIFIER, "ERR>parseStartTag() name:" + name + " " + e.toString());
216         }
217     }
218     
219     private void parseEndTag(String name, XmlPullParser parser, MeMoMaObjectHolder objectHolder)
220     {
221         try
222         {
223             if (name.equalsIgnoreCase("object"))
224             {
225                 //Log.v(Main.APP_IDENTIFIER, "parseEndTag() : OBJECT");
226                 //objectHolder.dumpPositionObject(position);
227
228                 // 領域サイズがおかしい場合には、オブジェクトサイズを補正する (ふつーありえないはずなんだけど...)
229                 if ((position.rect.left > position.rect.right)||(position.rect.top > position.rect.bottom))
230                 {
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;
234                 }
235                 
236             }
237             else if (name.equalsIgnoreCase("line"))
238             {
239                 //Log.v(Main.APP_IDENTIFIER, "parseEndTag() : LINE");       
240                 //objectHolder.getConnectLineHolder().dumpConnectLine(line);
241             }
242         }
243         catch (Exception e)
244         {
245             Log.v(Main.APP_IDENTIFIER, "ERR>parseEndTag() name:" + name + " " + e.toString());
246         }
247     }
248     
249     /**
250      *    (XML形式の)データを読みだす。
251      * 
252      * @param fileName
253      * @param objectHolder
254      * @return
255      */
256     private String restoreToXmlFile(String fileName, MeMoMaObjectHolder objectHolder)
257     {
258         String resultMessage = "";
259          XmlPullParser parser = Xml.newPullParser();
260          
261          if (objectHolder == null)
262          {
263                  return ("ERR>objectHolder is null.");
264          }
265          
266          try
267          {
268                  File inputFile = new File(fileName);
269                  if (inputFile.exists() == false)
270                  {
271                          // ファイルがなかったときには、「ファイルなし」と報告する。
272                          resultMessage = "ERR>File not found.";
273                          return (resultMessage);
274                  }
275                  // ファイルの読み込み
276                  FileReader reader = new FileReader(inputFile);
277                  parser.setInput(reader);
278
279                  int eventType = parser.getEventType();
280              boolean done = false;
281
282              // オブジェクトとラインをすべてクリアする
283              objectHolder.removeAllPositions();
284              MeMoMaConnectLineHolder lineHolder = objectHolder.getConnectLineHolder();
285              if (lineHolder == null)
286              {
287                          return ("ERR>lineHolder is null.");                     
288              }
289              lineHolder.removeAllLines();
290              
291              while ((eventType != XmlPullParser.END_DOCUMENT)&&(done != true))
292              {
293                  switch (eventType)
294                  {
295                      case XmlPullParser.START_DOCUMENT:
296                          break;
297
298                      case XmlPullParser.START_TAG:
299                          parseStartTag(parser.getName(), parser, objectHolder);
300                          break;
301
302                      case XmlPullParser.END_TAG:
303                          parseEndTag(parser.getName(), parser, objectHolder);
304                          break;
305
306                      default:
307                          // 省略...
308                          break;
309                  }
310                  eventType = parser.next();
311              }
312              reader.close();
313          }
314          catch (Exception e)
315          {
316                  resultMessage = " ERR>" + e.toString();
317              Log.v(Main.APP_IDENTIFIER, resultMessage);
318                  e.printStackTrace();
319          }
320         return (resultMessage);
321     }
322
323     /**
324      *  非同期処理
325      *  (バックグラウンドで実行する(このメソッドは、UIスレッドと別のところで実行する))
326      * 
327      */
328     @Override
329     protected String doInBackground(MeMoMaObjectHolder... datas)
330     {
331         // ファイル名の設定 ... (拡張子あり...保存時とは違う)
332         String fileName = fileUtility.getGokigenDirectory() + "/" + datas[0].getDataTitle() + ".xml";
333         
334         // データを読みだす。
335         String result = restoreToXmlFile(fileName, datas[0]);
336
337         //何か必要な場合、 非同期処理をここで実効
338         if (receiver != null)
339         {
340                 receiver.onLoadingProcess();
341         }
342
343                 System.gc();
344                 return (result);
345     }
346     /**
347      *  非同期処理の進捗状況の更新
348      * 
349      */
350         @Override
351         protected void onProgressUpdate(Integer... values)
352         {
353         // 今回は何もしない
354         }
355
356     /**
357      *  非同期処理の後処理
358      *  (結果を応答する)
359      */
360     @Override
361     protected void onPostExecute(String result)
362     {
363         try
364         {
365                 if (result.isEmpty() == true)
366                 {
367                 //  エラーが発生していない場合には、読みだしたデータをPreferenceに設定登録...
368                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
369                 SharedPreferences.Editor editor = preferences.edit();
370                 editor.putString("backgroundUri", backgroundUri);
371                 editor.putString("userCheckboxString", userCheckboxString);
372                 editor.commit();
373                 }
374
375             if (receiver != null)
376             {
377                 receiver.onLoadedResult(result);
378             }
379         }
380         catch (Exception ex)
381         {
382                 Log.v(Main.APP_IDENTIFIER, "MeMoMaFileSavingProcess::onPostExecute() : " + ex.toString());
383         }
384         return;
385     }     
386         
387     /**
388      *    結果報告用のインタフェース(積極的に使う予定はないけど...)
389      *    
390      * @author MRSa
391      *
392      */
393     public interface IResultReceiver
394     {
395         /**   処理中の処理   **/
396         public abstract void onLoadingProcess();
397         
398         /**  保存結果の報告 **/
399         public abstract void onLoadedResult(String detail);
400     }
401 }