blob: d73f44668701fa85cad64d848c3378b18beca0b9 [file] [log] [blame]
/*
* 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 com.android.im.app;
import com.android.im.R;
import com.android.im.plugin.BrandingResourceIDs;
import com.android.im.provider.Imps;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.text.Editable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.method.LinkMovementMethod;
import android.text.style.URLSpan;
import android.text.util.Linkify;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;
public class AccountActivity extends Activity {
private static final String ACCOUNT_URI_KEY = "accountUri";
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,
};
private static final int ACCOUNT_PROVIDER_COLUMN = 1;
private static final int ACCOUNT_USERNAME_COLUMN = 2;
private static final int ACCOUNT_PASSWORD_COLUMN = 3;
private static final int ACCOUNT_KEEP_SIGNED_IN_COLUMN = 4;
Uri mAccountUri;
EditText mEditName;
EditText mEditPass;
CheckBox mRememberPass;
CheckBox mKeepSignIn;
Button mBtnSignIn;
String mToAddress;
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
getWindow().requestFeature(Window.FEATURE_LEFT_ICON);
setContentView(R.layout.account_activity);
mEditName = (EditText)findViewById(R.id.edtName);
mEditPass = (EditText)findViewById(R.id.edtPass);
mRememberPass = (CheckBox)findViewById(R.id.rememberPassword);
mKeepSignIn = (CheckBox)findViewById(R.id.keepSignIn);
mBtnSignIn = (Button)findViewById(R.id.btnSignIn);
mRememberPass.setOnCheckedChangeListener(new OnCheckedChangeListener(){
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
updateWidgetState();
}
});
ImApp app = ImApp.getApplication(this);
Intent i = getIntent();
String action = i.getAction();
mToAddress = i.getStringExtra(ImApp.EXTRA_INTENT_SEND_TO_USER);
final String origUserName;
final long providerId;
final ProviderDef provider;
if(Intent.ACTION_INSERT.equals(action)) {
origUserName = "";
providerId = ContentUris.parseId(i.getData());
provider = app.getProvider(providerId);
setTitle(getResources().getString(R.string.add_account, provider.mFullName));
} else if(Intent.ACTION_EDIT.equals(action)) {
ContentResolver cr = getContentResolver();
Uri uri = i.getData();
if ((uri == null) || !Imps.Account.CONTENT_ITEM_TYPE.equals(cr.getType(uri))) {
Log.w(ImApp.LOG_TAG, "<AccountActivity>Bad data");
return;
}
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);
providerId = cursor.getLong(ACCOUNT_PROVIDER_COLUMN);
provider = app.getProvider(providerId);
origUserName = cursor.getString(ACCOUNT_USERNAME_COLUMN);
mEditName.setText(origUserName);
mEditPass.setText(cursor.getString(ACCOUNT_PASSWORD_COLUMN));
mRememberPass.setChecked(!cursor.isNull(ACCOUNT_PASSWORD_COLUMN));
boolean keepSignIn = cursor.getInt(ACCOUNT_KEEP_SIGNED_IN_COLUMN) == 1;
mKeepSignIn.setChecked(keepSignIn);
cursor.close();
} else {
Log.w(ImApp.LOG_TAG, "<AccountActivity> unknown intent action " + action);
finish();
return;
}
final BrandingResources brandingRes = app.getBrandingResource(providerId);
mKeepSignIn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
CheckBox keepSignIn = (CheckBox) v;
if ( keepSignIn.isChecked() ) {
String msg = brandingRes.getString(BrandingResourceIDs.STRING_TOAST_CHECK_AUTO_SIGN_IN);
Toast.makeText(AccountActivity.this, msg, Toast.LENGTH_LONG).show();
}
}
});
mRememberPass.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
CheckBox keepSignIn = (CheckBox) v;
if ( keepSignIn.isChecked() ) {
String msg = brandingRes.getString(BrandingResourceIDs.STRING_TOAST_CHECK_SAVE_PASSWORD);
Toast.makeText(AccountActivity.this, msg, Toast.LENGTH_LONG).show();
}
}
});
Drawable logo = brandingRes.getDrawable(BrandingResourceIDs.DRAWABLE_LOGO);
getWindow().setFeatureDrawable(Window.FEATURE_LEFT_ICON, logo);
TextView labelUsername = (TextView)findViewById(R.id.label_username);
labelUsername.setText(brandingRes.getString(BrandingResourceIDs.STRING_LABEL_USERNAME));
mEditName.addTextChangedListener(mTextWatcher);
mEditPass.addTextChangedListener(mTextWatcher);
mBtnSignIn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String username = mEditName.getText().toString();
final String pass = mEditPass.getText().toString();
final boolean rememberPass = mRememberPass.isChecked();
ContentResolver cr = getContentResolver();
long accountId = ImApp.insertOrUpdateAccount(cr, providerId, username,
rememberPass ? pass : null);
mAccountUri = ContentUris.withAppendedId(Imps.Account.CONTENT_URI, accountId);
if (!origUserName.equals(username) && shouldShowTermOfUse(brandingRes)) {
comfirmTermsOfUse(brandingRes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
signIn(rememberPass, pass);
}
});
} else {
signIn(rememberPass, pass);
}
}
void signIn(boolean rememberPass, String pass) {
Intent intent = new Intent(AccountActivity.this, SigningInActivity.class);
intent.setData(mAccountUri);
if (!rememberPass) {
intent.putExtra(ImApp.EXTRA_INTENT_PASSWORD, pass);
}
if (mToAddress != null) {
intent.putExtra(ImApp.EXTRA_INTENT_SEND_TO_USER, mToAddress);
}
startActivityForResult(intent, REQUEST_SIGN_IN);
}
});
// Make link for signing up.
String text = brandingRes.getString(BrandingResourceIDs.STRING_LABEL_SIGN_UP);
SpannableStringBuilder builder = new SpannableStringBuilder(text);
builder.setSpan(new URLSpan(provider.mSignUpUrl), 0, builder.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView signUp = (TextView)findViewById(R.id.signUp);
signUp.setText(builder);
signUp.setMovementMethod(LinkMovementMethod.getInstance());
updateWidgetState();
}
void comfirmTermsOfUse(BrandingResources res, DialogInterface.OnClickListener accept) {
SpannableString message = new SpannableString(
res.getString(BrandingResourceIDs.STRING_TOU_MESSAGE));
Linkify.addLinks(message, Linkify.ALL);
new AlertDialog.Builder(this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle(res.getString(BrandingResourceIDs.STRING_TOU_TITLE))
.setMessage(message)
.setPositiveButton(res.getString(BrandingResourceIDs.STRING_TOU_DECLINE), null)
.setNegativeButton(res.getString(BrandingResourceIDs.STRING_TOU_ACCEPT), accept)
.show();
}
boolean shouldShowTermOfUse(BrandingResources res) {
return !TextUtils.isEmpty(res.getString(BrandingResourceIDs.STRING_TOU_MESSAGE));
}
@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);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == REQUEST_SIGN_IN) {
if (resultCode == RESULT_OK) {
boolean keepSignIn = mKeepSignIn.isChecked();
updateKeepSignedIn(keepSignIn);
finish();
} else {
// sign in failed, disable keep sign in, clear the password.
mKeepSignIn.setChecked(false);
updateKeepSignedIn(false);
mEditPass.setText("");
ContentValues values = new ContentValues();
values.put(Imps.Account.PASSWORD, (String) null);
getContentResolver().update(mAccountUri, values, null, null);
}
}
}
void updateKeepSignedIn(boolean keepSignIn) {
ContentValues values = new ContentValues();
values.put(Imps.Account.KEEP_SIGNED_IN, keepSignIn ? 1 : 0);
getContentResolver().update(mAccountUri, values, null, null);
}
void updateWidgetState() {
boolean goodUsername = mEditName.getText().length() > 0;
boolean goodPassword = mEditPass.getText().length() > 0;
boolean hasNameAndPassword = goodUsername && goodPassword;
mEditPass.setEnabled(goodUsername);
mEditPass.setFocusable(goodUsername);
mEditPass.setFocusableInTouchMode(goodUsername);
// enable keep sign in only when remember password is checked.
boolean rememberPass = mRememberPass.isChecked();
if (rememberPass && !hasNameAndPassword) {
mRememberPass.setChecked(false);
rememberPass = false;
}
mRememberPass.setEnabled(hasNameAndPassword);
mRememberPass.setFocusable(hasNameAndPassword);
if (!rememberPass) {
mKeepSignIn.setChecked(false);
}
mKeepSignIn.setEnabled(rememberPass);
mKeepSignIn.setFocusable(rememberPass);
mBtnSignIn.setEnabled(hasNameAndPassword);
mBtnSignIn.setFocusable(hasNameAndPassword);
}
private final TextWatcher mTextWatcher = new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int before, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int after) {
updateWidgetState();
}
public void afterTextChanged(Editable s) {
}
};
}