/* * Copyright (C) 2008 Esmertec AG. Copyright (C) 2008 The Android Open Source * Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.awesomeapp.messenger.ui; import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.RemoteException; import android.provider.BaseColumns; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.google.zxing.integration.android.IntentIntegrator; import org.awesomeapp.messenger.ImApp; import org.awesomeapp.messenger.crypto.IOtrChatSession; import org.awesomeapp.messenger.crypto.otr.OtrAndroidKeyManagerImpl; import org.awesomeapp.messenger.model.ImConnection; import org.awesomeapp.messenger.plugin.xmpp.XmppConnection; import org.awesomeapp.messenger.provider.Imps; import org.awesomeapp.messenger.service.IImConnection; import org.awesomeapp.messenger.service.ImServiceConstants; import org.awesomeapp.messenger.ui.legacy.ImPluginHelper; import org.awesomeapp.messenger.ui.legacy.ProviderDef; import org.awesomeapp.messenger.ui.legacy.SignInHelper; import org.awesomeapp.messenger.ui.legacy.SignoutActivity; import org.awesomeapp.messenger.util.LogCleaner; import org.awesomeapp.messenger.util.XmppUriHelper; import java.util.HashMap; import java.util.Locale; import im.zom.messenger.R; public class AccountActivity extends BaseActivity { public static final String TAG = "AccountActivity"; private static final String ACCOUNT_URI_KEY = "accountUri"; private long mProviderId = 0; private long mAccountId = 0; static final int REQUEST_SIGN_IN = RESULT_FIRST_USER + 1; private static final String[] ACCOUNT_PROJECTION = { Imps.Account._ID, Imps.Account.PROVIDER, Imps.Account.USERNAME, Imps.Account.PASSWORD, Imps.Account.KEEP_SIGNED_IN, Imps.Account.LAST_LOGIN_STATE }; private static final int ACCOUNT_PROVIDER_COLUMN = 1; private static final int ACCOUNT_USERNAME_COLUMN = 2; private static final int ACCOUNT_PASSWORD_COLUMN = 3; public final static String DEFAULT_SERVER_GOOGLE = "talk.l.google.com"; public final static String DEFAULT_SERVER_FACEBOOK = "chat.facebook.com"; public final static String DEFAULT_SERVER_JABBERORG = "hermes2.jabber.org"; public final static String DEFAULT_SERVER_DUKGO = "dukgo.com"; public final static String ONION_JABBERCCC = "okj7xc6j2szr2y75.onion"; public final static String ONION_CALYX = "ijeeynrc6x2uy5ob.onion"; private static final String USERNAME_VALIDATOR = "[^a-z0-9\\.\\-_\\+]"; // private static final int ACCOUNT_KEEP_SIGNED_IN_COLUMN = 4; // private static final int ACCOUNT_LAST_LOGIN_STATE = 5; Uri mAccountUri; EditText mEditUserAccount; EditText mEditPass; EditText mEditPassConfirm; // CheckBox mRememberPass; // CheckBox mUseTor; // Button mBtnSignIn; // Button mBtnQrDisplay; AutoCompleteTextView mSpinnerDomains; Button mBtnAdvanced; TextView mTxtFingerprint; //Imps.ProviderSettings.QueryMap settings; boolean isEdit = false; boolean isSignedIn = false; String mUserName = ""; String mDomain = ""; int mPort = 0; private String mOriginalUserAccount = ""; IOtrChatSession mOtrChatSession; private SignInHelper mSignInHelper; private boolean mIsNewAccount = false; private AsyncTask<Void, Void, String> mCreateAccountTask = null; @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); Intent i = getIntent(); mApp = (ImApp)getApplication(); String action = i.getAction(); if (i.hasExtra("isSignedIn")) isSignedIn = i.getBooleanExtra("isSignedIn", false); final ProviderDef provider; mSignInHelper = new SignInHelper(this,null); SignInHelper.SignInListener signInListener = new SignInHelper.SignInListener() { @Override public void connectedToService() { } @Override public void stateChanged(int state, long accountId) { if (state == ImConnection.LOGGED_IN) { // mSignInHelper.goToAccount(accountId); // finish(); isSignedIn = true; } else { isSignedIn = false; } } }; mSignInHelper.setSignInListener(signInListener); ContentResolver cr = getContentResolver(); Uri uri = i.getData(); // check if there is account information and direct accordingly if (Intent.ACTION_INSERT_OR_EDIT.equals(action)) { if ((uri == null) || !Imps.Account.CONTENT_ITEM_TYPE.equals(cr.getType(uri))) { action = Intent.ACTION_INSERT; } else { action = Intent.ACTION_EDIT; } } if (Intent.ACTION_INSERT.equals(action) && uri.getScheme().equals("ima")) { ImPluginHelper helper = ImPluginHelper.getInstance(this); String authority = uri.getAuthority(); String[] userpass_host = authority.split("@"); String[] user_pass = userpass_host[0].split(":"); mUserName = user_pass[0].toLowerCase(Locale.getDefault()); String pass = user_pass[1]; mDomain = userpass_host[1].toLowerCase(Locale.getDefault()); mPort = 0; final boolean regWithTor = i.getBooleanExtra("useTor", false); Cursor cursor = openAccountByUsernameAndDomain(cr); boolean exists = cursor.moveToFirst(); long accountId; if (exists) { accountId = cursor.getLong(0); mAccountUri = ContentUris.withAppendedId(Imps.Account.CONTENT_URI, accountId); pass = cursor.getString(ACCOUNT_PASSWORD_COLUMN); setAccountKeepSignedIn(true); mSignInHelper.activateAccount(mProviderId, accountId); mSignInHelper.signIn(pass, mProviderId, accountId, true); setResult(RESULT_OK); cursor.close(); finish(); return; } else { mProviderId = helper.createAdditionalProvider(helper.getProviderNames().get(0)); //xmpp FIXME accountId = ImApp.insertOrUpdateAccount(cr, mProviderId, mAccountId,mUserName, mUserName, pass); mAccountUri = ContentUris.withAppendedId(Imps.Account.CONTENT_URI, accountId); mSignInHelper.activateAccount(mProviderId, accountId); createNewAccount(mUserName, pass, accountId, regWithTor); cursor.close(); return; } } else if (Intent.ACTION_INSERT.equals(action)) { setupUIPre(); mOriginalUserAccount = ""; // TODO once we implement multiple IM protocols mProviderId = ContentUris.parseId(uri); provider = mApp.getProvider(mProviderId); if (provider != null) { setTitle(getResources().getString(R.string.add_account, provider.mFullName)); } else { finish(); } } else if (Intent.ACTION_EDIT.equals(action)) { setupUIPre(); if ((uri == null) || !Imps.Account.CONTENT_ITEM_TYPE.equals(cr.getType(uri))) { LogCleaner.warn(ImApp.LOG_TAG, "<AccountActivity>Bad data"); return; } isEdit = true; Cursor cursor = cr.query(uri, ACCOUNT_PROJECTION, null, null, null); if (cursor == null) { finish(); return; } if (!cursor.moveToFirst()) { cursor.close(); finish(); return; } setTitle(R.string.sign_in); mAccountId = cursor.getLong(cursor.getColumnIndexOrThrow(BaseColumns._ID)); mProviderId = cursor.getLong(ACCOUNT_PROVIDER_COLUMN); provider = mApp.getProvider(mProviderId); Cursor pCursor = cr.query(Imps.ProviderSettings.CONTENT_URI,new String[] {Imps.ProviderSettings.NAME, Imps.ProviderSettings.VALUE},Imps.ProviderSettings.PROVIDER + "=?",new String[] { Long.toString(mProviderId)},null); Imps.ProviderSettings.QueryMap settings = new Imps.ProviderSettings.QueryMap( pCursor, cr, mProviderId, false /* don't keep updated */, null /* no handler */); try { mOriginalUserAccount = cursor.getString(ACCOUNT_USERNAME_COLUMN) + "@" + settings.getDomain(); mEditUserAccount.setText(mOriginalUserAccount); mEditPass.setText(cursor.getString(ACCOUNT_PASSWORD_COLUMN)); //mRememberPass.setChecked(!cursor.isNull(ACCOUNT_PASSWORD_COLUMN)); //mUseTor.setChecked(settings.getUseTor()); mPort = settings.getPort(); } finally { settings.close(); cursor.close(); } } else { LogCleaner.warn(ImApp.LOG_TAG, "<AccountActivity> unknown intent action " + action); finish(); return; } setupUIPost(); } private void setupUIPre () { ((ImApp)getApplication()).setAppTheme(this); setContentView(R.layout.account_activity); getSupportActionBar().setHomeButtonEnabled(true); mIsNewAccount = getIntent().getBooleanExtra("register", false); mEditUserAccount = (EditText) findViewById(R.id.edtName); mEditUserAccount.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { checkUserChanged(); } }); mEditPass = (EditText) findViewById(R.id.edtPass); mEditPassConfirm = (EditText) findViewById(R.id.edtPassConfirm); mSpinnerDomains = (AutoCompleteTextView) findViewById(R.id.spinnerDomains); if (mIsNewAccount) { mEditPassConfirm.setVisibility(View.VISIBLE); mSpinnerDomains.setVisibility(View.VISIBLE); mEditUserAccount.setHint(R.string.account_setup_new_username); /* ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, getResources().getStringArray(R.array.account_domains)); mSpinnerDomains.setAdapter(adapter); */ } //mRememberPass = (CheckBox) findViewById(R.id.rememberPassword); //mUseTor = (CheckBox) findViewById(R.id.useTor); // mBtnSignIn = (Button) findViewById(R.id.btnSignIn); // if (mIsNewAccount) // mBtnSignIn.setText(R.string.btn_create_new_account); mBtnAdvanced = (Button) findViewById(R.id.btnAdvanced); /** mRememberPass.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { updateWidgetState(); } });*/ } private void setupUIPost () { Intent i = getIntent(); mEditUserAccount.addTextChangedListener(mTextWatcher); mEditPass.addTextChangedListener(mTextWatcher); /** mBtnAdvanced.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showAdvanced(); } });*/ /** mBtnSignIn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { checkUserChanged(); final String pass = mEditPass.getText().toString(); final String passConf = mEditPassConfirm.getText().toString(); final boolean rememberPass =true;// mRememberPass.isChecked(); final boolean isActive = false; // TODO(miron) does this ever need to be true? ContentResolver cr = getContentResolver(); final boolean useTor = false;// mUseTor.isChecked(); if (mIsNewAccount) { mDomain = mSpinnerDomains.getText().toString(); String fullUser = mEditUserAccount.getText().toString(); if (fullUser.indexOf("@")==-1) fullUser += '@' + mDomain; if (!parseAccount(fullUser)) { mEditUserAccount.selectAll(); mEditUserAccount.requestFocus(); return; } ImPluginHelper helper = ImPluginHelper.getInstance(AccountActivity.this); mProviderId = helper.createAdditionalProvider(helper.getProviderNames().get(0)); //xmpp FIXME } else { if (!parseAccount(mEditUserAccount.getText().toString())) { mEditUserAccount.selectAll(); mEditUserAccount.requestFocus(); return; } else { settingsForDomain(mDomain,mPort);//apply final settings } } mAccountId = ImApp.insertOrUpdateAccount(cr, mProviderId, mAccountId, mUserName, mUserName, rememberPass ? pass : null); mAccountUri = ContentUris.withAppendedId(Imps.Account.CONTENT_URI, mAccountId); //if remember pass is true, set the "keep signed in" property to true if (mIsNewAccount) { if (pass.equals(passConf)) { setAccountKeepSignedIn(rememberPass); createNewAccount(mUserName, pass, mAccountId, useTor); } else { Toast.makeText(AccountActivity.this, getString(R.string.error_account_password_mismatch), Toast.LENGTH_SHORT).show(); } } else { if (isSignedIn) {((MainActivity)getActivity()).showGroupChatDialog(); signOut(); isSignedIn = false; } else { setAccountKeepSignedIn(rememberPass); boolean hasKey = checkForKey (mUserName + '@' + mDomain); mSignInHelper.signIn(pass, mProviderId, mAccountId, isActive); isSignedIn = true; setResult(RESULT_OK); finish(); } updateWidgetState(); } } });*/ /** mUseTor.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { updateUseTor(isChecked); } });*/ updateWidgetState(); if (i.hasExtra("title")) { String title = i.getExtras().getString("title"); setTitle(title); } if (i.hasExtra("newuser")) { String newuser = i.getExtras().getString("newuser"); mEditUserAccount.setText(newuser); parseAccount(newuser); settingsForDomain(mDomain,mPort); } if (i.hasExtra("newpass")) { mEditPass.setText(i.getExtras().getString("newpass")); mEditPass.setVisibility(View.GONE); // mRememberPass.setChecked(true);((MainActivity)getActivity()).showGroupChatDialog(); // mRememberPass.setVisibility(View.GONE); } if (i.getBooleanExtra("hideTor", false)) { // mUseTor.setVisibility(View.GONE); } } private boolean checkForKey (String userid) { try { OtrAndroidKeyManagerImpl otrKeyMan = OtrAndroidKeyManagerImpl.getInstance(AccountActivity.this); String fp = otrKeyMan.getLocalFingerprint(userid); if (fp == null) { otrKeyMan.generateLocalKeyPair(userid); fp = otrKeyMan.getLocalFingerprint(userid); return true; } else return true; } catch (Exception e) { Log.e(ImApp.LOG_TAG,"error checking for key",e); return false; } } private Cursor openAccountByUsernameAndDomain(ContentResolver cr) { String clauses = Imps.Account.USERNAME + " = ? AND " + Imps.ProviderSettings.VALUE + " = ?"; String args[] = new String[2]; args[0] = mUserName; args[1] = mDomain; String[] projection = { Imps.Account._ID }; Cursor cursor = cr.query(Imps.Account.BY_DOMAIN_URI, projection, clauses, args, null); return cursor; } @Override protected void onDestroy() { if (mCreateAccountTask != null && (!mCreateAccountTask.isCancelled())) { mCreateAccountTask.cancel(true); } if (mSignInHelper != null) mSignInHelper.stop(); super.onDestroy(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK)) { checkUserChanged(); } return super.onKeyDown(keyCode, event); } private void updateUseTor(boolean useTor) { checkUserChanged(); // OrbotHelper orbotHelper = new OrbotHelper(this); ContentResolver cr = getContentResolver(); Cursor pCursor = cr.query(Imps.ProviderSettings.CONTENT_URI, new String[]{Imps.ProviderSettings.NAME, Imps.ProviderSettings.VALUE}, Imps.ProviderSettings.PROVIDER + "=?", new String[]{Long.toString(mProviderId)}, null); Imps.ProviderSettings.QueryMap settings = new Imps.ProviderSettings.QueryMap( pCursor, cr, mProviderId, false /* don't keep updated */, null /* no handler */); if (useTor) { //Toast.makeText(this, "Orbot app is not installed. Please install from Google Play or from https://guardianproject.info/releases", Toast.LENGTH_LONG).show(); // orbotHelper.promptToInstall(this); // mUseTor.setChecked(false); settings.setUseTor(false); } else { settings.setUseTor(useTor); } settingsForDomain(settings.getDomain(),settings.getPort(),settings); settings.close(); } /* private void getOTRKeyInfo() { if (mApp != null && FFF != null) { try { otrKeyManager = mApp.getRemoteImService().getOtrKeyManager(mOriginalUserAccount); if (otrKeyManager == null) { mTxtFingerprint = ((TextView) findViewById(R.id.txtFingerprint)); String localFingerprint = otrKeyManager.getLocalFingerprint(); if (localFingerprint != null) { ((TextView) findViewById(R.id.lblFingerprint)).setVisibility(View.VISIBLE); mTxtFingerprint.setText(processFingerprint(localFingerprint)); } else { ((TextView) findViewById(R.id.lblFingerprint)).setVisibility(View.GONE); mTxtFingerprint.setText(""); } } else { //don't need to notify people if there is nothing to show here // Toast.makeText(this, "OTR is not initialized yet", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { Log.e(ImApp.LOG_TAG, "error on create", e); } } }*/ private void checkUserChanged() { if (mEditUserAccount != null) { String username = mEditUserAccount.getText().toString().trim().toLowerCase(); if ((!username.equals(mOriginalUserAccount)) && parseAccount(username)) { //Log.i(TAG, "Username changed: " + mOriginalUserAccount + " != " + username); settingsForDomain(mDomain, mPort); mOriginalUserAccount = username; } } } boolean parseAccount(String userField) { boolean isGood = true; String[] splitAt = userField.trim().split("@"); mUserName = splitAt[0].toLowerCase(Locale.ENGLISH).replaceAll(USERNAME_VALIDATOR, ""); mDomain = ""; if (splitAt.length > 1) { mDomain = splitAt[1].toLowerCase(Locale.ENGLISH); } return isGood; } /* * If we know the direct XMPP server for a domain, we should turn off DNS lookup * because it is slow, error prone, and a way to leak information from third parties */ void settingsForDomain(String domain,int port) { ContentResolver cr = getContentResolver(); Cursor pCursor = cr.query(Imps.ProviderSettings.CONTENT_URI,new String[] {Imps.ProviderSettings.NAME, Imps.ProviderSettings.VALUE},Imps.ProviderSettings.PROVIDER + "=?",new String[] { Long.toString(mProviderId)},null); Imps.ProviderSettings.QueryMap settings = new Imps.ProviderSettings.QueryMap( pCursor, cr, mProviderId, false /* don't keep updated */, null /* no handler */); settingsForDomain(domain, port, settings); settings.close(); } private void settingsForDomain(String domain, int port, Imps.ProviderSettings.QueryMap settings) { settings.setRequireTls(true); settings.setTlsCertVerify(true); settings.setAllowPlainAuth(false); settings.setPort(port); settings.setDomain(domain); settings.setPort(port); //if use Tor, turn off DNS resolution, and set Server manually from Domain if (settings.getUseTor()) { settings.setDoDnsSrv(false); //if Tor is off, and the user has not provided any values here, set to the @domain if (settings.getServer() == null || settings.getServer().length() == 0) settings.setServer(domain); } else if (settings.getServer() == null || settings.getServer().length() == 0) { //if Tor is off, and the user has not provided any values here, then reset to nothing settings.setDoDnsSrv(true); settings.setServer(""); } settings.requery(); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mAccountUri = savedInstanceState.getParcelable(ACCOUNT_URI_KEY); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(ACCOUNT_URI_KEY, mAccountUri); } void signOutUsingActivity() { Intent intent = new Intent(AccountActivity.this, SignoutActivity.class); intent.setData(mAccountUri); startActivity(intent); } private Handler mHandler = new Handler(); private ImApp mApp = null; void signOut() { //if you are signing out, then we will deactive "auto" sign in ContentValues values = new ContentValues(); values.put(Imps.AccountColumns.KEEP_SIGNED_IN, 0); getContentResolver().update(mAccountUri, values, null, null); mApp = (ImApp)getApplication(); mApp.callWhenServiceConnected(mHandler, new Runnable() { @Override public void run() { signOut(mProviderId, mAccountId); } }); } void signOut(long providerId, long accountId) { try { IImConnection conn = mApp.getConnection(providerId, accountId); if (conn != null) { conn.logout(); } else { // Normally, we can always get the connection when user chose to // sign out. However, if the application crash unexpectedly, the // status will never be updated. Clear the status in this case // to make it recoverable from the crash. ContentValues values = new ContentValues(2); values.put(Imps.AccountStatusColumns.PRESENCE_STATUS, Imps.CommonPresenceColumns.OFFLINE); values.put(Imps.AccountStatusColumns.CONNECTION_STATUS, Imps.ConnectionStatus.OFFLINE); String where = Imps.AccountStatusColumns.ACCOUNT + "=?"; getContentResolver().update(Imps.AccountStatus.CONTENT_URI, values, where, new String[] { Long.toString(accountId) }); } } catch (RemoteException ex) { Log.e(ImApp.LOG_TAG, "signout: caught ", ex); } finally { // Toast.makeText(this, // getString(R.string.signed_out_prompt, this.mEditUserAccount.getText()), // Toast.LENGTH_SHORT).show(); isSignedIn = false; //mBtnSignIn.setText(getString(R.string.sign_in)); //mBtnSignIn.setBackgroundResource(R.drawable.btn_green); } } void createNewaccount (long accountId) { ContentValues values = new ContentValues(2); values.put(Imps.AccountStatusColumns.PRESENCE_STATUS, Imps.CommonPresenceColumns.NEW_ACCOUNT); values.put(Imps.AccountStatusColumns.CONNECTION_STATUS, Imps.ConnectionStatus.OFFLINE); String where = Imps.AccountStatusColumns.ACCOUNT + "=?"; getContentResolver().update(Imps.AccountStatus.CONTENT_URI, values, where, new String[] { Long.toString(accountId) }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == REQUEST_SIGN_IN) { if (resultCode == RESULT_OK) { finish(); } else { // sign in failed, let's show the screen! } } } void updateWidgetState() { boolean goodUsername = mEditUserAccount.getText().length() > 0; boolean goodPassword = mEditPass.getText().length() > 0; boolean hasNameAndPassword = goodUsername && goodPassword; mEditPass.setEnabled(goodUsername); mEditPass.setFocusable(goodUsername); mEditPass.setFocusableInTouchMode(goodUsername); //mRememberPass.setEnabled(hasNameAndPassword); //mRememberPass.setFocusable(hasNameAndPassword); mEditUserAccount.setEnabled(!isSignedIn); mEditPass.setEnabled(!isSignedIn); if (!isSignedIn) { // mBtnSignIn.setEnabled(hasNameAndPassword); // mBtnSignIn.setFocusable(hasNameAndPassword); } else { } } private final TextWatcher mTextWatcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int before, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int after) { updateWidgetState(); } @Override public void afterTextChanged(Editable s) { } }; private void deleteAccount () { //need to delete ((ImApp)getApplication()).deleteAccount(getContentResolver(),mAccountId, mProviderId); finish(); } private void showAdvanced() { checkUserChanged(); Intent intent = new Intent(this, AccountSettingsActivity.class); intent.putExtra(ImServiceConstants.EXTRA_INTENT_PROVIDER_ID, mProviderId); startActivity(intent); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_account_settings, menu); if (isEdit) { //add delete menu option } return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; /* case R.id.menu_account_delete: deleteAccount(); return true; */ } return super.onOptionsItemSelected(item); } public void createNewAccount (final String usernameNew, final String passwordNew, final long newAccountId, final boolean useTor) { if (mCreateAccountTask != null && (!mCreateAccountTask.isCancelled())) { mCreateAccountTask.cancel(true); } mCreateAccountTask = new AsyncTask<Void, Void, String>() { private ProgressDialog dialog; @Override protected void onPreExecute() { dialog = new ProgressDialog(AccountActivity.this); dialog.setCancelable(true); dialog.setMessage(getString(R.string.registering_new_account_)); dialog.show(); } @Override protected String doInBackground(Void... params) { ContentResolver cr = getContentResolver(); Cursor pCursor = cr.query(Imps.ProviderSettings.CONTENT_URI,new String[] {Imps.ProviderSettings.NAME, Imps.ProviderSettings.VALUE},Imps.ProviderSettings.PROVIDER + "=?",new String[] { Long.toString(mProviderId)},null); Imps.ProviderSettings.QueryMap settings = new Imps.ProviderSettings.QueryMap( pCursor, cr, mProviderId, false /* don't keep updated */, null /* no handler */); try { settings.setUseTor(useTor); settingsForDomain(mDomain, mPort, settings); HashMap<String,String> aParams = new HashMap<String,String>(); XmppConnection xmppConn = new XmppConnection(AccountActivity.this); xmppConn.initUser(mProviderId, newAccountId); xmppConn.registerAccount(settings, usernameNew, passwordNew, aParams); // settings closed in registerAccount } catch (Exception e) { LogCleaner.error(ImApp.LOG_TAG, "error registering new account", e); return e.getLocalizedMessage(); } finally { settings.close(); } return null; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); try { if (dialog != null && dialog.isShowing()) { dialog.dismiss(); dialog = null; } } catch ( java.lang.IllegalArgumentException iae) { //dialog may not be attached to window if Activity was closed } if (result != null) { Toast.makeText(AccountActivity.this, "error creating account: " + result, Toast.LENGTH_LONG).show(); //AccountActivity.this.setResult(Activity.RESULT_CANCELED); //AccountActivity.this.finish(); } else { mSignInHelper.activateAccount(mProviderId, newAccountId); mSignInHelper.signIn(passwordNew, mProviderId, newAccountId, true); AccountActivity.this.setResult(Activity.RESULT_OK); AccountActivity.this.finish(); } } }.execute(); } public void showQR () { String localFingerprint = OtrAndroidKeyManagerImpl.getInstance(this).getLocalFingerprint(mOriginalUserAccount); String uri = XmppUriHelper.getUri(mOriginalUserAccount, localFingerprint); new IntentIntegrator(this).shareText(uri); } private void setAccountKeepSignedIn(final boolean rememberPass) { ContentValues values = new ContentValues(); values.put(Imps.AccountColumns.KEEP_SIGNED_IN, rememberPass ? 1 : 0); getContentResolver().update(mAccountUri, values, null, null); } }