Android Open Source - opensudoku File Export Task






From Project

Back to project page opensudoku.

License

The source code is released under:

GNU General Public License

If you think the Android project opensudoku listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package org.moire.opensudoku.gui.exporting;
//  w w w .j ava2 s.c  o  m
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

import org.xmlpull.v1.XmlSerializer;

import android.content.Context;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Handler;
import android.util.Log;
import android.util.Xml;
import org.moire.opensudoku.db.SudokuColumns;
import org.moire.opensudoku.db.SudokuDatabase;
import org.moire.opensudoku.utils.Const;

/**
 * Must be created on GUI thread.
 *
 * @author romario
 */
public class FileExportTask extends AsyncTask<FileExportTaskParams, Integer, Void> {

  private Context mContext;
  private Handler mGuiHandler;

  private OnExportFinishedListener mOnExportFinishedListener;

  public FileExportTask(Context context) {
    mContext = context;
    mGuiHandler = new Handler();
  }

  public OnExportFinishedListener getOnExportFinishedListener() {
    return mOnExportFinishedListener;
  }

  public void setOnExportFinishedListener(OnExportFinishedListener listener) {
    mOnExportFinishedListener = listener;
  }

  @Override
  protected Void doInBackground(FileExportTaskParams... params) {
    for (FileExportTaskParams par : params) {
      final FileExportTaskResult res = saveToFile(par);

      mGuiHandler.post(new Runnable() {

        @Override
        public void run() {
          if (mOnExportFinishedListener != null) {
            mOnExportFinishedListener.onExportFinished(res);
          }

        }
      });
    }

    return null;
  }

  private FileExportTaskResult saveToFile(FileExportTaskParams par) {
    if (par.folderID == null && par.sudokuID == null) {
      throw new IllegalArgumentException("Exactly one of folderID and sudokuID must be set.");
    } else if (par.folderID != null && par.sudokuID != null) {
      throw new IllegalArgumentException("Exactly one of folderID and sudokuID must be set.");
    }

    if (par.file == null) {
      throw new IllegalArgumentException("Filename must be set.");
    }

    long start = System.currentTimeMillis();

    FileExportTaskResult result = new FileExportTaskResult();
    result.successful = false;

    SudokuDatabase database = null;
    Cursor cursor = null;
    Writer writer = null;
    try {
      // create dir if it does not exists already
      File dir = new File(par.file.getParent());
      if (!dir.exists()) {
        dir.mkdirs();
      }

      result.file = par.file;

      database = new SudokuDatabase(mContext);

      boolean generateFolders = true;
      if (par.folderID != null) {
        cursor = database.exportFolder(par.folderID);
        generateFolders = true;
      } else {
        cursor = database.exportFolder(par.sudokuID);
        generateFolders = false;
      }

      XmlSerializer serializer = Xml.newSerializer();
      writer = new BufferedWriter(new FileWriter(result.file, false));
      serializer.setOutput(writer);
      serializer.startDocument("UTF-8", true);
      serializer.startTag("", "opensudoku");
      serializer.attribute("", "version", "2");

      long currentFolderId = -1;
      while (cursor.moveToNext()) {
        if (generateFolders && currentFolderId != cursor.getLong(cursor.getColumnIndex("folder_id"))) {
          // next folder
          if (currentFolderId != -1) {
            serializer.endTag("", "folder");
          }
          currentFolderId = cursor.getLong(cursor.getColumnIndex("folder_id"));
          serializer.startTag("", "folder");
          attribute(serializer, "name", cursor, "folder_name");
          attribute(serializer, "created", cursor, "folder_created");
        }

        String data = cursor.getString(cursor.getColumnIndex(SudokuColumns.DATA));
        if (data != null) {
          serializer.startTag("", "game");
          attribute(serializer, "created", cursor, SudokuColumns.CREATED);
          attribute(serializer, "state", cursor, SudokuColumns.STATE);
          attribute(serializer, "time", cursor, SudokuColumns.TIME);
          attribute(serializer, "last_played", cursor, SudokuColumns.LAST_PLAYED);
          attribute(serializer, "data", cursor, SudokuColumns.DATA);
          attribute(serializer, "note", cursor, SudokuColumns.PUZZLE_NOTE);
          serializer.endTag("", "game");
        }
      }
      if (generateFolders && currentFolderId != -1) {
        serializer.endTag("", "folder");
      }

      serializer.endTag("", "opensudoku");
    } catch (IOException e) {
      Log.e(Const.TAG, "Error while exporting file.", e);
      result.successful = false;
      return result;
    } finally {
      if (cursor != null) cursor.close();
      if (database != null) database.close();
      if (writer != null) {
        try {
          writer.close();
        } catch (IOException e) {
          Log.e(Const.TAG, "Error while exporting file.", e);
          result.successful = false;
          return result;
        }
      }

    }

    long end = System.currentTimeMillis();

    Log.i(Const.TAG, String.format("Exported in %f seconds.",
        (end - start) / 1000f));

    result.successful = true;
    return result;
  }

  private void attribute(XmlSerializer serializer, String attributeName, Cursor cursor, String columnName) throws IllegalArgumentException, IllegalStateException, IOException {
    String value = cursor.getString(cursor.getColumnIndex(columnName));
    if (value != null) {
      serializer.attribute("", attributeName, value);
    }
  }

  public interface OnExportFinishedListener {
    /**
     * Occurs when export is finished.
     *
     * @param importSuccessful Indicates whether export was successful.
     * @param folderId         Contains id of imported folder, or -1 if multiple folders were imported.
     */
    void onExportFinished(FileExportTaskResult result);
  }

}




Java Source Code List

org.moire.opensudoku.db.DatabaseHelper.java
org.moire.opensudoku.db.FolderColumns.java
org.moire.opensudoku.db.SudokuColumns.java
org.moire.opensudoku.db.SudokuDatabase.java
org.moire.opensudoku.db.SudokuImportParams.java
org.moire.opensudoku.db.SudokuInvalidFormatException.java
org.moire.opensudoku.game.CellCollection.java
org.moire.opensudoku.game.CellGroup.java
org.moire.opensudoku.game.CellNote.java
org.moire.opensudoku.game.Cell.java
org.moire.opensudoku.game.FolderInfo.java
org.moire.opensudoku.game.SudokuGame.java
org.moire.opensudoku.game.command.AbstractCellCommand.java
org.moire.opensudoku.game.command.AbstractCommand.java
org.moire.opensudoku.game.command.ClearAllNotesCommand.java
org.moire.opensudoku.game.command.CommandStack.java
org.moire.opensudoku.game.command.EditCellNoteCommand.java
org.moire.opensudoku.game.command.FillInNotesCommand.java
org.moire.opensudoku.game.command.SetCellValueCommand.java
org.moire.opensudoku.gui.Changelog.java
org.moire.opensudoku.gui.FileImportActivity.java
org.moire.opensudoku.gui.FileListActivity.java
org.moire.opensudoku.gui.FolderDetailLoader.java
org.moire.opensudoku.gui.FolderListActivity.java
org.moire.opensudoku.gui.GameSettingsActivity.java
org.moire.opensudoku.gui.GameTimeFormat.java
org.moire.opensudoku.gui.HintsQueue.java
org.moire.opensudoku.gui.ImportSudokuActivity.java
org.moire.opensudoku.gui.SeekBarPreference.java
org.moire.opensudoku.gui.SudokuBoardView.java
org.moire.opensudoku.gui.SudokuEditActivity.java
org.moire.opensudoku.gui.SudokuExportActivity.java
org.moire.opensudoku.gui.SudokuImportActivity.java
org.moire.opensudoku.gui.SudokuListActivity.java
org.moire.opensudoku.gui.SudokuListFilter.java
org.moire.opensudoku.gui.SudokuPlayActivity.java
org.moire.opensudoku.gui.Timer.java
org.moire.opensudoku.gui.exporting.FileExportTaskParams.java
org.moire.opensudoku.gui.exporting.FileExportTaskResult.java
org.moire.opensudoku.gui.exporting.FileExportTask.java
org.moire.opensudoku.gui.importing.AbstractImportTask.java
org.moire.opensudoku.gui.importing.ExtrasImportTask.java
org.moire.opensudoku.gui.importing.OpenSudokuImportTask.java
org.moire.opensudoku.gui.importing.SdmImportTask.java
org.moire.opensudoku.gui.inputmethod.IMControlPanelStatePersister.java
org.moire.opensudoku.gui.inputmethod.IMControlPanel.java
org.moire.opensudoku.gui.inputmethod.IMNumpad.java
org.moire.opensudoku.gui.inputmethod.IMPopupDialog.java
org.moire.opensudoku.gui.inputmethod.IMPopup.java
org.moire.opensudoku.gui.inputmethod.IMSingleNumber.java
org.moire.opensudoku.gui.inputmethod.InputMethod.java
org.moire.opensudoku.utils.AndroidUtils.java
org.moire.opensudoku.utils.Const.java
org.moire.opensudoku.utils.StringUtils.java