package com.seafile.seadroid2.account.ui; import android.accounts.Account; import android.accounts.AccountManager; import android.content.ContentResolver; import android.content.Intent; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import com.seafile.seadroid2.R; import com.seafile.seadroid2.account.Authenticator; import com.seafile.seadroid2.cameraupload.CameraUploadManager; import com.seafile.seadroid2.ui.BaseAuthenticatorActivity; /** * The Authenticator activity. * * Called by the Authenticator and in charge of identifing the user. * * It sends back to the Authenticator the result. */ public class SeafileAuthenticatorActivity extends BaseAuthenticatorActivity { public static final int SEACLOUD_CC = 0; public static final int SHIBBOLETH_LOGIN = 1; public static final int OTHER_SERVER = 2; public final static String ARG_ACCOUNT_TYPE = "ACCOUNT_TYPE"; public final static String ARG_ACCOUNT_NAME = "ACCOUNT_NAME"; public final static String ARG_SERVER_URI = "SERVER_URI"; public final static String ARG_EDIT_OLD_ACCOUNT_NAME = "EDIT_OLD_ACCOUNT"; public final static String ARG_EMAIL = "EMAIL"; public final static String ARG_SHIB = "SHIB"; public final static String ARG_IS_EDITING = "isEdited"; private static final int REQ_SIGNUP = 1; private final String DEBUG_TAG = this.getClass().getSimpleName(); private AccountManager mAccountManager; /** * Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { Log.d(DEBUG_TAG, "onCreate"); super.onCreate(savedInstanceState); setContentView(R.layout.account_create_type_select); String[] array = getResources().getStringArray(R.array.choose_server_array); ArrayAdapter<String> listAdapter = new ArrayAdapter<>(this, R.layout.list_item_authenticator, array); ListView listView = (ListView)findViewById(R.id.account_create_list); listView.setAdapter(listAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent; switch ((int) id) { case SEACLOUD_CC: intent = new Intent(SeafileAuthenticatorActivity.this, AccountDetailActivity.class); intent.putExtras(getIntent()); intent.putExtra(SeafileAuthenticatorActivity.ARG_SERVER_URI, getString(R.string.server_url_seacloud)); startActivityForResult(intent, SeafileAuthenticatorActivity.REQ_SIGNUP); break; case SHIBBOLETH_LOGIN: intent = new Intent(SeafileAuthenticatorActivity.this, ShibbolethActivity.class); intent.putExtras(getIntent()); startActivityForResult(intent, SeafileAuthenticatorActivity.REQ_SIGNUP); break; case OTHER_SERVER: intent = new Intent(SeafileAuthenticatorActivity.this, AccountDetailActivity.class); intent.putExtras(getIntent()); startActivityForResult(intent, SeafileAuthenticatorActivity.REQ_SIGNUP); break; default: return; } } }); mAccountManager = AccountManager.get(getBaseContext()); if (getIntent().getBooleanExtra(ARG_SHIB, false)) { Intent intent = new Intent(this, ShibbolethAuthorizeActivity.class); android.accounts.Account account = new android.accounts.Account(getIntent().getStringExtra(SeafileAuthenticatorActivity.ARG_ACCOUNT_NAME), com.seafile.seadroid2.account.Account.ACCOUNT_TYPE); intent.putExtra(ShibbolethActivity.SHIBBOLETH_SERVER_URL, mAccountManager.getUserData(account, Authenticator.KEY_SERVER_URI)); intent.putExtras(getIntent().getExtras()); startActivityForResult(intent, SeafileAuthenticatorActivity.REQ_SIGNUP); } else if (getIntent().getBooleanExtra(ARG_IS_EDITING, false)) { Intent intent = new Intent(this, AccountDetailActivity.class); intent.putExtras(getIntent().getExtras()); startActivityForResult(intent, SeafileAuthenticatorActivity.REQ_SIGNUP); } Toolbar toolbar = getActionBarToolbar(); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setTitle(R.string.choose_server); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { navigateUpOrBack(SeafileAuthenticatorActivity.this, null); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(DEBUG_TAG, "onActivityResult"); // The sign up activity returned that the user has successfully created an account if (requestCode == REQ_SIGNUP && resultCode == RESULT_OK) { finishLogin(data); } else { finish(); } } private void finishLogin(Intent intent) { Log.d(DEBUG_TAG, "finishLogin"); String newAccountName = intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); final Account newAccount = new Account(newAccountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE)); String authtoken = intent.getStringExtra(AccountManager.KEY_AUTHTOKEN); String serveruri = intent.getStringExtra(ARG_SERVER_URI); String email = intent.getStringExtra(ARG_EMAIL); boolean shib = intent.getBooleanExtra(ARG_SHIB, false); int cameraIsSyncable = 0; boolean cameraSyncAutomatically = true; if (intent.getBooleanExtra(ARG_IS_EDITING, false)) { String oldAccountName = intent.getStringExtra(ARG_EDIT_OLD_ACCOUNT_NAME); final Account oldAccount = new Account(oldAccountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE)); // serverUri and mail stay the same. so just update the token and exit if (oldAccount.equals(newAccount)) { mAccountManager.setAuthToken(newAccount, Authenticator.AUTHTOKEN_TYPE, authtoken); Bundle result = new Bundle(); result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true); result.putString(AccountManager.KEY_ACCOUNT_NAME, newAccountName); setAccountAuthenticatorResult(result); setResult(RESULT_OK, intent); finish(); return; } Log.d(DEBUG_TAG, "removing old account " + oldAccountName); cameraIsSyncable = ContentResolver.getIsSyncable(oldAccount, CameraUploadManager.AUTHORITY); cameraSyncAutomatically = ContentResolver.getSyncAutomatically(oldAccount, CameraUploadManager.AUTHORITY); mAccountManager.removeAccount(oldAccount, null, null); } Log.d(DEBUG_TAG, "adding new account "+newAccountName); mAccountManager.addAccountExplicitly(newAccount, null, null); mAccountManager.setAuthToken(newAccount, Authenticator.AUTHTOKEN_TYPE, authtoken); mAccountManager.setUserData(newAccount, Authenticator.KEY_SERVER_URI, serveruri); mAccountManager.setUserData(newAccount, Authenticator.KEY_EMAIL, email); if (shib) { mAccountManager.setUserData(newAccount, Authenticator.KEY_SHIB, "shib"); } // set sync settings ContentResolver.setIsSyncable(newAccount, CameraUploadManager.AUTHORITY, cameraIsSyncable); ContentResolver.setSyncAutomatically(newAccount, CameraUploadManager.AUTHORITY, cameraSyncAutomatically); Bundle result = new Bundle(); result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true); result.putString(AccountManager.KEY_ACCOUNT_NAME, newAccountName); setAccountAuthenticatorResult(result); setResult(RESULT_OK, intent); finish(); } }