content: package com.u17od.upm;
  
  import android.app.ProgressDialog;
  import android.content.SharedPreferences;
  import android.os.AsyncTask;
  import android.util.Log;
  
  import com.u17od.upm.database.AccountInformation;
  import com.u17od.upm.transport.HTTPTransport;
  import com.u17od.upm.transport.TransportException;
  
  /**
   * Activity used when syncing a database over HTTP. Syncing over HTTP doesn't
   * require any user interaction so this activity is transparent. The reason we
   * use it is so we can make use of the methods on it's parent class,
   * SyncDatabaseActivity.
   */
  public class SyncDatabaseViaHttpActivity extends SyncDatabaseActivity {
  
      @Override
      protected void onResume() {
          super.onResume();
          downloadDatabase();
      }
  
      @Override
      protected void downloadDatabase() {
          new RetrieveRemoteDatabaseFromHTTP().execute();
      }
  
      @Override
      protected void uploadDatabase() {
          new UploadDatabase().execute();
      }
  
      private class RetrieveRemoteDatabaseFromHTTP extends AsyncTask<Void, Void, Integer> {
  
          private static final int PROBLEM_DOWNLOADING_DB = 1;
          private static final int NO_REMOTE_DB = 2;
  
          private ProgressDialog progressDialog;
  
          @Override
          protected void onPreExecute() {
              progressDialog = ProgressDialog.show(SyncDatabaseViaHttpActivity.this, "", getString(R.string.syncing_database));
          }
  
          @Override
          protected Integer doInBackground(Void... params) {
              int errorCode = 0;
  
              String remoteURL = getPasswordDatabase().getDbOptions().getRemoteLocation();
              if (remoteURL.trim().equals("")) {
                  errorCode = NO_REMOTE_DB;
              } else {
                  String remoteFileName = Utilities.getDatabaseFileName(SyncDatabaseViaHttpActivity.this);
                  String remoteURLUsername = null, remoteURLPassword = null;
                  String accountWithAuthDetails = getPasswordDatabase().getDbOptions().getAuthDBEntry();
                  if (accountWithAuthDetails != null && accountWithAuthDetails.length() > 0) {
                      AccountInformation account = getPasswordDatabase().getAccount(accountWithAuthDetails);
                      remoteURLUsername = new String(account.getUserId());
                      remoteURLPassword = new String(account.getPassword());
                  }
  
                  try {
                      SharedPreferences settings = getSharedPreferences(Prefs.PREFS_NAME, 0);
                      String trustedHostname = settings.getString(Prefs.PREF_TRUSTED_HOSTNAME, "");
  
                      HTTPTransport transport = new HTTPTransport(getFileStreamPath(
                              FullAccountList.CERT_FILE_NAME), trustedHostname,
                              getApplicationContext().getFilesDir());
                      downloadedDatabaseFile = transport.getRemoteFile(remoteURL, remoteFileName, remoteURLUsername, remoteURLPassword);
                  } catch (TransportException e) {
                      Log.e("DownloadRemoteDatabase", "Problem downloading database", e);
                      errorCode = PROBLEM_DOWNLOADING_DB;
                  }
              }
  
              return errorCode;
          }
  
          @Override
          protected void onPostExecute(Integer result) {
              progressDialog.dismiss();
  
              switch (result) {
                  case 0:
                      decryptDatabase();
                      break;
                  case PROBLEM_DOWNLOADING_DB:
                      UIUtilities.showToast(SyncDatabaseViaHttpActivity.this,
                              R.string.problem_downloading_db);
                      finish();
                      break;
                  case NO_REMOTE_DB:
                      UIUtilities.showToast(SyncDatabaseViaHttpActivity.this,
                              R.string.no_remote_db);
                      finish();
                      break;
              }
          }
  
      }
  
      private class UploadDatabase extends AsyncTask<Void, Void, Integer> {
  
          private static final int UPLOAD_OK = 0;
          private static final int UPLOAD_ERROR = 1;
  
          private ProgressDialog progressDialog;
  
          @Override
          protected void onPreExecute() {
              progressDialog = ProgressDialog.show(SyncDatabaseViaHttpActivity.this, "", getString(R.string.uploading_database));
          }
  
          @Override
          protected Integer doInBackground(Void... params) {
              int result = UPLOAD_OK;
  
              String remoteURL = getPasswordDatabase().getDbOptions().getRemoteLocation();
              String remoteURLUsername = null, remoteURLPassword = null;
              String accountWithAuthDetails = getPasswordDatabase().getDbOptions().getAuthDBEntry();
              if (accountWithAuthDetails != null && accountWithAuthDetails.length() > 0) {
                  AccountInformation account = getPasswordDatabase().getAccount(accountWithAuthDetails);
                  remoteURLUsername = new String(account.getUserId());
                  remoteURLPassword = new String(account.getPassword());
              }
  
              SharedPreferences settings = getSharedPreferences(Prefs.PREFS_NAME, 0);
              String trustedHostname = settings.getString(Prefs.PREF_TRUSTED_HOSTNAME, "");
  
              HTTPTransport transport = new HTTPTransport(getFileStreamPath(
                      FullAccountList.CERT_FILE_NAME), trustedHostname,
                      getApplicationContext().getFilesDir());
              String fileName = getPasswordDatabase().getDatabaseFile().getName();
              try {
                  transport.delete(remoteURL, fileName, remoteURLUsername, remoteURLPassword);
                  transport.put(remoteURL, getPasswordDatabase().getDatabaseFile(), remoteURLUsername, remoteURLPassword);
              } catch (TransportException e) {
                  Log.e("FullAccountList", e.getMessage(), e);
                  result = UPLOAD_ERROR;
              }
  
              return result;
          }
  
          @Override
          protected void onPostExecute(Integer result) {
              progressDialog.dismiss();
              if (result == UPLOAD_OK) {
                  UIUtilities.showToast(SyncDatabaseViaHttpActivity.this, R.string.db_sync_complete);
              } else {
                  UIUtilities.showToast(SyncDatabaseViaHttpActivity.this, R.string.problem_uploading);
              }
              finish();
          }
  
      }
  
  }
  