package in.ceeq.home.backup; import in.ceeq.commons.Utils; import java.io.IOException; import java.io.StringWriter; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.provider.UserDictionary; import android.util.Log; import android.util.Xml; public class DictionaryManager implements DataManager{ private static final String APP_ID = UserDictionary.Words.APP_ID, FREQUENCY = UserDictionary.Words.FREQUENCY, WORD = UserDictionary.Words.WORD, LOCALE = UserDictionary.Words.LOCALE, LOCALE_TAG = "locale", FREQUENCY_TAG = "frequency", APPID_TAG = "appid", WORD_TEXT_TAG = "word", WORD_TAG = "words", DICTIONARY_TAG = "dictionary", TOTAL_WORDS_TAG = "total"; private final Uri URI = UserDictionary.Words.CONTENT_URI; private String[] mProjection = { UserDictionary.Words.WORD, UserDictionary.Words.LOCALE, UserDictionary.Words.FREQUENCY, UserDictionary.Words.APP_ID }; private ContentResolver resolver; private XmlSerializer serializer; private StringWriter writer; public DictionaryManager(Context context){ resolver = context.getContentResolver(); serializer = Xml.newSerializer(); writer = new StringWriter(); } public String read() { Cursor cs = resolver.query(URI, mProjection, null, null, null); try { if (cs.moveToFirst()) { serializer.setOutput(writer); serializer.startDocument("UTF-8", true); serializer.startTag("", DICTIONARY_TAG); serializer.startTag("", TOTAL_WORDS_TAG); serializer.text(cs.getCount() + ""); serializer.endTag("", TOTAL_WORDS_TAG); while (cs.moveToNext()) { serializer.startTag("", WORD_TAG); serializer.startTag("", APPID_TAG); serializer .text(cs.getString(cs.getColumnIndex(APP_ID))); serializer.endTag("", APPID_TAG); serializer.startTag("", WORD_TEXT_TAG); serializer.text(cs.getString(cs.getColumnIndex(WORD))); serializer.endTag("", WORD_TEXT_TAG); serializer.startTag("", FREQUENCY_TAG); serializer.text(cs.getString(cs .getColumnIndex(FREQUENCY))); serializer.endTag("", FREQUENCY_TAG); serializer.startTag("", LOCALE_TAG); serializer .text(cs.getString(cs.getColumnIndex(LOCALE))); serializer.endTag("", LOCALE_TAG); serializer.endTag("", WORD_TAG); } serializer.endTag("", DICTIONARY_TAG); serializer.endDocument(); } } catch (IOException e) { e.printStackTrace(); } finally { cs.close(); } return writer.toString(); } public void write(XmlPullParser parser) throws XmlPullParserException, IOException { ContentValues word = null; int totalWords = 0, eventType = parser.getEventType(); String tagName = ""; Log.w("Developer", "Restoring dictionary ..."); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: Log.w("Developer", "Reading backup file..."); break; case XmlPullParser.START_TAG: tagName = parser.getName(); if (tagName.equals(WORD_TAG)) { word = new ContentValues(); } else if (tagName.equals(TOTAL_WORDS_TAG)) { totalWords = Integer.parseInt(Utils .readTag(parser, TOTAL_WORDS_TAG)); } else if (tagName.equals(APPID_TAG)) { word.put(APP_ID, Utils.readTag(parser, APPID_TAG)); } else if (tagName.equals(WORD_TEXT_TAG)) { word.put(WORD, Utils.readTag(parser, WORD_TEXT_TAG)); } else if (tagName.equals(FREQUENCY_TAG)) { word.put(FREQUENCY, Utils.readTag(parser, FREQUENCY_TAG)); } else if (tagName.equals(LOCALE_TAG)) { word.put(LOCALE, Utils.readTag(parser, LOCALE_TAG)); } break; case XmlPullParser.END_TAG: tagName = parser.getName(); if (tagName.equals(WORD_TAG)) { try { resolver.insert(URI, word); } catch (Exception e) { e.printStackTrace(); } } break; } eventType = parser.next(); } Log.w("Developer", "File reading complete..."); Log.w("Developer", "Dictionary restore successfull..."); Log.w("Developer", "Total " + totalWords + " words restored."); } }