diff --git a/surespot/src/main/java/com/twofours/surespot/backup/ImportIdentityActivity.java b/tmp/I3.java index 59d7759..039ec79 100644 --- a/surespot/src/main/java/com/twofours/surespot/backup/ImportIdentityActivity.java +++ b/tmp/I3.java @@ -32,15 +32,15 @@ import android.widget.ViewSwitcher; import com.actionbarsherlock.app.SherlockActivity; import com.actionbarsherlock.view.MenuItem; -import com.google.android.gms.auth.GoogleAuthUtil; -import com.google.android.gms.common.AccountPicker; -import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecoverableAuthIOException; -import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.util.DateTime; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.model.ChildList; -import com.google.api.services.drive.model.ChildReference; -import com.google.api.services.drive.model.FileList; + + + + + + + + + import com.twofours.surespot.R; import com.twofours.surespot.activities.MainActivity; import com.twofours.surespot.common.FileUtils; @@ -59,11 +59,11 @@ public class ImportIdentityActivity extends SherlockActivity { private TextView mAccountNameDisplay; private boolean mShowingLocal; - private DriveHelper mDriveHelper; + private ListView mDriveListview; private SingleProgressDialog mSpd; private SingleProgressDialog mSpdLoadIdentities; - public static final String[] ACCOUNT_TYPE = new String[] { GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE }; + public static final String[] ACCOUNT_TYPE = new String[] { "dummy" }; private static final String ACTION_DRIVE_OPEN = "com.google.android.apps.drive.DRIVE_OPEN"; private static final String EXTRA_FILE_ID = "resourceId"; private String mFileId; @@ -81,778 +81,33 @@ public class ImportIdentityActivity extends SherlockActivity { Utils.configureActionBar(this, getString(R.string.identity), getString(R.string.restore), true); Intent intent = getIntent(); - - Utils.logIntent(TAG, intent); - mSignup = intent.getBooleanExtra("signup", false); - mSpdLoadIdentities = new SingleProgressDialog(ImportIdentityActivity.this, getString(R.string.progress_loading_identities), 0); - - final String action = intent.getAction(); - - // Make sure the Action is DRIVE_OPEN. - if (ACTION_DRIVE_OPEN.equals(action)) { - // Get the Drive file ID. - mFileId = intent.getStringExtra(EXTRA_FILE_ID); - mMode = MODE_DRIVE; - } - else { - mMode = MODE_NORMAL; - - } - - mDriveHelper = new DriveHelper(getApplicationContext(), mMode == MODE_NORMAL); - - Account account = mDriveHelper.getDriveAccount(); - mAccountNameDisplay = (TextView) findViewById(R.id.restoreDriveAccount); - mAccountNameDisplay.setText(account == null ? getString(R.string.no_google_account_selected) : account.name); - - Button chooseAccountButton = (Button) findViewById(R.id.bSelectDriveAccount); - chooseAccountButton.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - chooseAccount(true); - } - }); - - mDriveListview = (ListView) findViewById(R.id.lvDriveIdentities); - mDriveListview.setEmptyView(findViewById(R.id.no_drive_identities)); - - mDriveListview.setOnItemClickListener(new OnItemClickListener() { - - @Override - public void onItemClick(AdapterView parent, View view, final int position, long id) { - if (IdentityController.getIdentityCount(ImportIdentityActivity.this) >= SurespotConstants.MAX_IDENTITIES) { - Utils.makeLongToast(ImportIdentityActivity.this, getString(R.string.login_max_identities_reached, SurespotConstants.MAX_IDENTITIES)); - return; - } - - @SuppressWarnings("unchecked") - final Map map = (Map) mDriveAdapter.getItem(position); - - final String user = map.get("name"); - - // make sure file we're going to save to is writable - // before we - // start - if (!IdentityController.ensureIdentityFile(ImportIdentityActivity.this, user, true)) { - Utils.makeToast(ImportIdentityActivity.this, getString(R.string.could_not_restore_identity_name, user)); - if (mMode == MODE_DRIVE) { - finish(); - } - return; - } - - mDialog = UIUtils.passwordDialog(ImportIdentityActivity.this, getString(R.string.restore_identity, user), - getString(R.string.enter_password_for, user), new IAsyncCallback() { - @Override - public void handleResponse(final String password) { - if (!TextUtils.isEmpty(password)) { - if (mSpd == null) { - mSpd = new SingleProgressDialog(ImportIdentityActivity.this, getString(R.string.progress_restoring_identity), 0); - } - mSpd.show(); - - final String url = map.get("url"); - - new AsyncTask() { - - @Override - protected Void doInBackground(Void... params) { - byte[] identityBytes = mDriveHelper.getFileContent(url); - identityBytes = FileUtils.gunzipIfNecessary(identityBytes); - - IdentityController.importIdentityBytes(ImportIdentityActivity.this, user, password, identityBytes, - new IAsyncCallback() { - - @Override - public void handleResponse(final IdentityOperationResult response) { - Utils.clearIntent(getIntent()); - ImportIdentityActivity.this.runOnUiThread(new Runnable() { - - @Override - public void run() { - mSpd.hide(); - Utils.makeLongToast(ImportIdentityActivity.this, response.getResultText()); - - if (response.getResultSuccess()) { - // if - // launched - // from - // signup - // and - // successful - // import, - // go - // to - // login - // screen - if (mSignup || mMode == MODE_DRIVE) { - IdentityController.logout(); - - Intent intent = new Intent(ImportIdentityActivity.this, MainActivity.class); - intent.putExtra(SurespotConstants.ExtraNames.MESSAGE_TO, user); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(intent); - finish(); - } - } - - } - }); - - } - - }); - return null; - } - - }.execute(); - - } - else { - Utils.makeToast(ImportIdentityActivity.this, getString(R.string.no_identity_imported)); - } - } - }); - - } - - }); - - mSwitcher = (ViewSwitcher) findViewById(R.id.restoreViewSwitcher); - RadioButton rbRestoreLocal = (RadioButton) findViewById(R.id.rbRestoreLocal); - RadioButton rbRestoreDrive = (RadioButton) findViewById(R.id.rbRestoreDrive); - if (mMode == MODE_NORMAL) { - - rbRestoreLocal.setTag("local"); - rbRestoreLocal.setChecked(true); - mShowingLocal = true; - - rbRestoreDrive.setTag("drive"); - - OnClickListener rbClickListener = new OnClickListener() { - - @Override - public void onClick(View view) { - // Is the button now checked? - boolean checked = ((RadioButton) view).isChecked(); - - if (checked) { - if (view.getTag().equals("drive")) { - if (mShowingLocal) { - - mDriveListview.setAdapter(null); - mSwitcher.showNext(); - mShowingLocal = false; - - if (mMode == MODE_NORMAL) { - if (mDriveHelper.getDriveAccount() != null) { - Drive drive = mDriveHelper.getDriveService(); - if (drive != null) { - mSpdLoadIdentities.show(); - new AsyncTask() { - @Override - protected Void doInBackground(Void... params) { - populateDriveIdentities(true); - - return null; - } - - }.execute(); - } - } - else { - chooseAccount(false); - } - } - - } - } - else { - if (!mShowingLocal) { - mSwitcher.showPrevious(); - mShowingLocal = true; - } - } - - } - } - }; - - rbRestoreDrive.setOnClickListener(rbClickListener); - rbRestoreLocal.setOnClickListener(rbClickListener); - setupLocal(); - - } - else { - rbRestoreLocal.setVisibility(View.GONE); - rbRestoreDrive.setChecked(true); - mSwitcher.showNext(); - mShowingLocal = false; - - new AsyncTask() { - - @Override - protected Void doInBackground(Void... params) { - restoreExternal(true); - return null; - } - }.execute(); - - } - } private void setupLocal() { - - ListView lvIdentities = (ListView) findViewById(R.id.lvLocalIdentities); - lvIdentities.setEmptyView(findViewById(R.id.no_local_identities)); - - List> items = new ArrayList>(); - - // query the filesystem for identities - final File exportDir = FileUtils.getIdentityExportDir(); - File[] files = IdentityController.getExportIdentityFiles(this, exportDir.getPath()); - - TextView tvLocalLocation = (TextView) findViewById(R.id.restoreLocalLocation); - - if (files != null) { - TreeMap sortedFiles = new TreeMap(new Comparator() { - public int compare(Long o1, Long o2) { - return o2.compareTo(o1); - } - }); - - for (File file : files) { - sortedFiles.put(file.lastModified(), file); - } - - for (File file : sortedFiles.values()) { - long lastModTime = file.lastModified(); - String date = DateFormat.getDateFormat(this).format(lastModTime) + " " + DateFormat.getTimeFormat(this).format(lastModTime); - - HashMap map = new HashMap(); - map.put("name", IdentityController.getIdentityNameFromFile(file)); - map.put("date", date); - items.add(map); - } - } - - final SimpleAdapter adapter = new SimpleAdapter(this, items, R.layout.identity_item, new String[] { "name", "date" }, new int[] { - R.id.identityBackupName, R.id.identityBackupDate }); - tvLocalLocation.setText(exportDir.toString()); - lvIdentities.setVisibility(View.VISIBLE); - - lvIdentities.setAdapter(adapter); - lvIdentities.setOnItemClickListener(new OnItemClickListener() { - - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - if (IdentityController.getIdentityCount(ImportIdentityActivity.this) >= SurespotConstants.MAX_IDENTITIES) { - Utils.makeLongToast(ImportIdentityActivity.this, getString(R.string.login_max_identities_reached, SurespotConstants.MAX_IDENTITIES)); - return; - } - - @SuppressWarnings("unchecked") - Map map = (Map) adapter.getItem(position); - - final String user = map.get("name"); - - // make sure file we're going to save to is writable before we - // start - if (!IdentityController.ensureIdentityFile(ImportIdentityActivity.this, user, true)) { - Utils.makeToast(ImportIdentityActivity.this, getString(R.string.could_not_import_identity)); - if (mMode == MODE_DRIVE) { - finish(); - } - return; - } - - UIUtils.passwordDialog(ImportIdentityActivity.this, getString(R.string.restore_identity, user), getString(R.string.enter_password_for, user), - new IAsyncCallback() { - @Override - public void handleResponse(String result) { - if (!TextUtils.isEmpty(result)) { - IdentityController.importIdentity(ImportIdentityActivity.this, exportDir, user, result, - new IAsyncCallback() { - - @Override - public void handleResponse(IdentityOperationResult response) { - - Utils.makeLongToast(ImportIdentityActivity.this, response.getResultText()); - - if (response.getResultSuccess()) { - // if launched - // from - // signup and - // successful - // import, go to - // login - // screen - if (mSignup) { - IdentityController.logout(); - - Intent intent = new Intent(ImportIdentityActivity.this, MainActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(intent); - } - - } - - } - }); - } - else { - Utils.makeToast(ImportIdentityActivity.this, getString(R.string.no_identity_imported)); - } - - } - }); - - } - - }); - } private void restoreExternal(boolean firstTime) { - if (!firstTime) { - - this.runOnUiThread(new Runnable() { - - @Override - public void run() { - Utils.makeToast(ImportIdentityActivity.this, getString(R.string.could_not_import_identity)); - finish(); - return; - } - }); - } - - if (mDriveHelper.getDriveAccount() == null) { - chooseAccount(false); - return; - } - - List> items = new ArrayList>(); - try { - com.google.api.services.drive.model.File file = mDriveHelper.getDriveService().files().get(mFileId).execute(); - - if (!file.getLabels().getTrashed()) { - - DateTime lastModTime = file.getModifiedDate(); - - String date = DateFormat.getDateFormat(this).format(lastModTime.getValue()) + " " - + DateFormat.getTimeFormat(this).format(lastModTime.getValue()); - HashMap map = new HashMap(); - String name = IdentityController.getIdentityNameFromFilename(file.getTitle()); - map.put("name", name); - map.put("date", date); - map.put("url", file.getDownloadUrl()); - items.add(map); - } - else { - SurespotLog.w(TAG, "could not retrieve identity from google drive"); - this.runOnUiThread(new Runnable() { - - @Override - public void run() { - Utils.makeToast(ImportIdentityActivity.this, getString(R.string.could_not_import_identity)); - } - }); - finish(); - - return; - } - - } - catch (UserRecoverableAuthIOException e) { - try { - startActivityForResult(e.getIntent(), SurespotConstants.IntentRequestCodes.REQUEST_GOOGLE_AUTH); - } - catch (NullPointerException npe) { - } - return; - - } - catch (GoogleJsonResponseException e) { - SurespotLog.w(TAG, e, "could not retrieve identity from google drive"); - - // if they're restoring from drive, selecting different account in - // surespot will cause 404 - if (e.getStatusCode() == 404 && mMode == MODE_DRIVE) { - this.runOnUiThread(new Runnable() { - - @Override - public void run() { - Utils.makeLongToast(ImportIdentityActivity.this, getString(R.string.could_not_import_identity_drive_404)); - } - }); - - } - } - catch (IOException e) { - SurespotLog.w(TAG, e, "could not retrieve identity from google drive"); - - this.runOnUiThread(new Runnable() { - - @Override - public void run() { - Utils.makeToast(ImportIdentityActivity.this, getString(R.string.could_not_import_identity)); - } - }); - - finish(); - return; - - } - catch (SecurityException e) { - SurespotLog.w(TAG, e, "createDriveIdentityDirectory"); - // when key is revoked on server this happens...should return - // userrecoverable it seems - // was trying to figure out how to test this - // seems like the only way around this is to remove and re-add - // android account: - // http://stackoverflow.com/questions/5805657/revoke-account-permission-for-an-app - this.runOnUiThread(new Runnable() { - - @Override - public void run() { - Utils.makeLongToast(ImportIdentityActivity.this, getString(R.string.re_add_google_account)); - - } - }); - - finish(); - return; - } - - SurespotLog.v(TAG, "loaded %d identities from google drive", items.size()); - - mDriveAdapter = new SimpleAdapter(this, items, R.layout.identity_item, new String[] { "name", "date" }, new int[] { R.id.identityBackupName, - R.id.identityBackupDate }); - - this.runOnUiThread(new Runnable() { - - @Override - public void run() { - - mDriveListview.setAdapter(mDriveAdapter); - - } - }); - } private void populateDriveIdentities(boolean firstAttempt) { - - String identityDirId = ensureDriveIdentityDirectory(); - if (identityDirId == null) { - if (!firstAttempt) { - - this.runOnUiThread(new Runnable() { - - @Override - public void run() { - Utils.makeToast(ImportIdentityActivity.this, getString(R.string.could_not_list_identities_from_google_drive)); - } - }); - } - return; - } - - List> items = new ArrayList>(); - try { - // query the drive for identities - ChildList fileList = getIdentityFiles(identityDirId); - if (fileList == null) { - SurespotLog.v(TAG, "no identity backup files found on google drive"); - this.runOnUiThread(new Runnable() { - - @Override - public void run() { - mSpdLoadIdentities.hide(); - } - }); - return; - - } - - List refs = fileList.getItems(); - - if (refs.size() == 0) { - SurespotLog.v(TAG, "no identity backup files found on google drive"); - this.runOnUiThread(new Runnable() { - - @Override - public void run() { - mSpdLoadIdentities.hide(); - } - }); - return; - } - - if (refs.size() > 0) { - TreeMap sortedFiles = new TreeMap( - new Comparator() { - public int compare(Long o1, Long o2) { - return o2.compareTo(o1); - } - }); - for (ChildReference ref : refs) { - com.google.api.services.drive.model.File file = mDriveHelper.getDriveService().files().get(ref.getId()).execute(); - - if (!file.getLabels().getTrashed()) { - DateTime lastModTime = file.getModifiedDate(); - sortedFiles.put(lastModTime.getValue(), file); - } - } - - for (com.google.api.services.drive.model.File file : sortedFiles.values()) { - DateTime lastModTime = file.getModifiedDate(); - String date = DateFormat.getDateFormat(this).format(lastModTime.getValue()) + " " - + DateFormat.getTimeFormat(this).format(lastModTime.getValue()); - HashMap map = new HashMap(); - String name = IdentityController.getIdentityNameFromFilename(file.getTitle()); - map.put("name", name); - map.put("date", date); - map.put("url", file.getDownloadUrl()); - items.add(map); - } - - } - } - catch (UserRecoverableAuthIOException e) { - try { - startActivityForResult(e.getIntent(), SurespotConstants.IntentRequestCodes.REQUEST_GOOGLE_AUTH); - } - catch (NullPointerException npe) { - } - return; - } - catch (IOException e) { - SurespotLog.w(TAG, e, "could not retrieve identities from google drive"); - this.runOnUiThread(new Runnable() { - - @Override - public void run() { - Utils.makeToast(ImportIdentityActivity.this, getString(R.string.could_not_list_identities_from_google_drive)); - } - }); - - return; - - } - catch (SecurityException e) { - SurespotLog.w(TAG, e, "createDriveIdentityDirectory"); - // when key is revoked on server this happens...should return - // userrecoverable it seems - // was trying to figure out how to test this - // seems like the only way around this is to remove and re-add - // android account: - // http://stackoverflow.com/questions/5805657/revoke-account-permission-for-an-app - this.runOnUiThread(new Runnable() { - - @Override - public void run() { - Utils.makeLongToast(ImportIdentityActivity.this, getString(R.string.re_add_google_account)); - - } - }); - - return; - } - - SurespotLog.v(TAG, "loaded %d identities from google drive", items.size()); - - mDriveAdapter = new SimpleAdapter(this, items, R.layout.identity_item, new String[] { "name", "date" }, new int[] { R.id.identityBackupName, - R.id.identityBackupDate }); - - this.runOnUiThread(new Runnable() { - - @Override - public void run() { - - mSpdLoadIdentities.hide(); - mDriveListview.setAdapter(mDriveAdapter); - - } - }); - } +/* private ChildList getIdentityFiles(String identityDirId) { ChildList identityFileList = null; - try { - identityFileList = mDriveHelper.getDriveService().children().list(identityDirId).execute(); - } - catch (IOException e) { - SurespotLog.w(TAG, e, "getIdentityFiles"); - } return identityFileList; } - +*/ public String ensureDriveIdentityDirectory() { String identityDirId = null; - try { - // see if identities directory exists - - FileList identityDir = mDriveHelper.getDriveService().files().list() - .setQ("title = '" + SurespotConstants.DRIVE_IDENTITY_FOLDER + "' and trashed = false").execute(); - List items = identityDir.getItems(); - - if (items.size() > 0) { - for (com.google.api.services.drive.model.File file : items) { - if (!file.getLabels().getTrashed()) { - SurespotLog.d(TAG, "identity folder already exists"); - identityDirId = file.getId(); - break; - } - } - } - if (identityDirId == null) { - com.google.api.services.drive.model.File file = new com.google.api.services.drive.model.File(); - file.setTitle(SurespotConstants.DRIVE_IDENTITY_FOLDER); - file.setMimeType(SurespotConstants.MimeTypes.DRIVE_FOLDER); - - com.google.api.services.drive.model.File insertedFile = mDriveHelper.getDriveService().files().insert(file).execute(); - - identityDirId = insertedFile.getId(); - - } - - } - catch (UserRecoverableAuthIOException e) { - SurespotLog.w(TAG, e, "createDriveIdentityDirectory"); - //try { - startActivityForResult(e.getIntent(), SurespotConstants.IntentRequestCodes.REQUEST_GOOGLE_AUTH); -// } -// catch (NullPointerException npe) { -// return null; -// } - } - catch (IOException e) { - SurespotLog.w(TAG, e, "createDriveIdentityDirectory"); - } - catch (SecurityException e) { - SurespotLog.e(TAG, e, "createDriveIdentityDirectory"); - // when key is revoked on server this happens...should return - // userrecoverable it seems - // was trying to figure out how to test this - // seems like the only way around this is to remove and re-add - // android account: - // http://stackoverflow.com/questions/5805657/revoke-account-permission-for-an-app - this.runOnUiThread(new Runnable() { - - @Override - public void run() { - Utils.makeLongToast(ImportIdentityActivity.this, getString(R.string.re_add_google_account)); - - } - }); - - } - return identityDirId; } // //////// DRIVE public void onActivityResult(int requestCode, int resultCode, Intent data) { - switch (requestCode) { - case SurespotConstants.IntentRequestCodes.CHOOSE_GOOGLE_ACCOUNT: - - if (resultCode == Activity.RESULT_OK && data != null) { - - SurespotLog.w("Preferences", "SELECTED ACCOUNT WITH EXTRA: %s", data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME)); - Bundle b = data.getExtras(); - - String accountName = b.getString(AccountManager.KEY_ACCOUNT_NAME); - - SurespotLog.d("Preferences", "Selected account: " + accountName); - if (accountName != null && accountName.length() > 0) { - - mDriveHelper.setDriveAccount(accountName); - mAccountNameDisplay.setText(accountName); - if (mDriveListview != null) { - mDriveListview.setAdapter(null); - } - if (mMode == MODE_NORMAL) { - mSpdLoadIdentities.show(); - } - new AsyncTask() { - @Override - protected Void doInBackground(Void... params) { - if (mMode == MODE_NORMAL) { - populateDriveIdentities(true); - } - else { - restoreExternal(true); - } - return null; - } - - }.execute(); - } - } - break; - - case SurespotConstants.IntentRequestCodes.REQUEST_GOOGLE_AUTH: - if (resultCode == Activity.RESULT_OK) { - SurespotLog.v(TAG, "onActivityResult OK"); - if (mMode == MODE_NORMAL) { - mSpdLoadIdentities.show(); - } - new AsyncTask() { - - @Override - protected Boolean doInBackground(Void... params) { - Drive drive = mDriveHelper.getDriveService(); - if (drive != null) { - if (mMode == MODE_NORMAL) { - populateDriveIdentities(false); - - } - else { - restoreExternal(false); - } - return true; - } - - return false; - - } - - protected void onPostExecute(Boolean result) { - if (!result) { - mSpdLoadIdentities.hide(); - } - }; - }.execute(); - - } - else { - SurespotLog.v(TAG, "onActivityResult not OK"); - mSpdLoadIdentities.hide(); - } - } } private void chooseAccount(boolean ask) { - String descriptionText = null; - if (mMode == MODE_DRIVE) { - descriptionText = getString(R.string.pick_same_drive_account); - } - - Intent accountPickerIntent = AccountPicker.newChooseAccountIntent(null, null, ACCOUNT_TYPE, ask || mMode == MODE_DRIVE, descriptionText, null, null, - null); - try { - startActivityForResult(accountPickerIntent, SurespotConstants.IntentRequestCodes.CHOOSE_GOOGLE_ACCOUNT); - } - catch (ActivityNotFoundException e) { - Utils.makeToast(ImportIdentityActivity.this, getString(R.string.device_does_not_support_google_drive)); - SurespotLog.i(TAG, e, "chooseAccount"); - } - } @Override