blob: 134a83fc0f977500cfce94ea585b7b35f6c52ae5 [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.IChatSession;
import com.android.im.IChatSessionManager;
import com.android.im.IImConnection;
import com.android.im.engine.ImConnection;
import com.android.im.provider.Imps;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.RemoteException;
import android.text.TextUtils;
import android.util.Log;
import java.util.Iterator;
import java.util.Set;
public class ImUrlActivity extends Activity {
private static final String[] ACCOUNT_PROJECTION = {
Imps.Account._ID,
Imps.Account.PASSWORD,
};
private static final int ACCOUNT_ID_COLUMN = 0;
private static final int ACCOUNT_PW_COLUMN = 1;
private String mProviderName;
private String mToAddress;
private ImApp mApp;
private IImConnection mConn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
if (Intent.ACTION_SENDTO.equals(intent.getAction())) {
if (!resolveIntent(intent)) {
finish();
return;
}
if (TextUtils.isEmpty(mToAddress)) {
Log.w(ImApp.LOG_TAG, "<ImUrlActivity>Invalid to address:" + mToAddress);
finish();
return;
}
mApp = ImApp.getApplication(this);
mApp.callWhenServiceConnected(new Handler(), new Runnable(){
public void run() {
handleIntent();
}});
} else {
finish();
}
}
void handleIntent() {
ContentResolver cr = getContentResolver();
long providerId = Imps.Provider.getProviderIdForName(cr, mProviderName);
long accountId;
mConn= mApp.getConnection(providerId);
if (mConn == null) {
Cursor c = DatabaseUtils.queryAccountsForProvider(cr, ACCOUNT_PROJECTION, providerId);
if (c == null) {
addAccount(providerId);
} else {
accountId = c.getLong(ACCOUNT_ID_COLUMN);
if (c.isNull(ACCOUNT_PW_COLUMN)) {
editAccount(accountId);
} else {
signInAccount(accountId);
}
}
} else {
try {
int state = mConn.getState();
accountId = mConn.getAccountId();
if (state < ImConnection.LOGGED_IN) {
signInAccount(accountId);
} else if (state == ImConnection.LOGGED_IN || state == ImConnection.SUSPENDED) {
if (!isValidToAddress()) {
showContactList(accountId);
} else {
openChat(providerId, accountId);
}
}
} catch (RemoteException e) {
// Ouch! Service died! We'll just disappear.
Log.w("ImUrlActivity", "Connection disappeared!");
}
}
finish();
}
private void addAccount(long providerId) {
Intent intent = new Intent(this, AccountActivity.class);
intent.setAction(Intent.ACTION_INSERT);
intent.setData(ContentUris.withAppendedId(Imps.Provider.CONTENT_URI, providerId));
intent.putExtra(ImApp.EXTRA_INTENT_SEND_TO_USER, mToAddress);
startActivity(intent);
}
private void editAccount(long accountId) {
Uri accountUri = ContentUris.withAppendedId(Imps.Account.CONTENT_URI, accountId);
Intent intent = new Intent(this, AccountActivity.class);
intent.setAction(Intent.ACTION_EDIT);
intent.setData(accountUri);
intent.putExtra(ImApp.EXTRA_INTENT_SEND_TO_USER, mToAddress);
startActivity(intent);
}
private void signInAccount(long accountId) {
Uri accountUri = ContentUris.withAppendedId(Imps.Account.CONTENT_URI, accountId);
Intent intent = new Intent(this, SigningInActivity.class);
intent.setData(accountUri);
intent.putExtra(ImApp.EXTRA_INTENT_SEND_TO_USER, mToAddress);
startActivity(intent);
}
private void showContactList(long accountId) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Imps.Contacts.CONTENT_URI);
intent.addCategory(ImApp.IMPS_CATEGORY);
intent.putExtra("accountId", accountId);
startActivity(intent);
}
private void openChat(long provider, long account) {
try {
IChatSessionManager manager = mConn.getChatSessionManager();
IChatSession session = manager.getChatSession(mToAddress);
if(session == null) {
session = manager.createChatSession(mToAddress);
}
Uri data = ContentUris.withAppendedId(Imps.Chats.CONTENT_URI, session.getId());
Intent i = new Intent(Intent.ACTION_VIEW, data);
i.putExtra("from", mToAddress);
i.putExtra("providerId", provider);
i.putExtra("accountId", account);
i.addCategory(ImApp.IMPS_CATEGORY);
startActivity(i);
} catch (RemoteException e) {
// Ouch! Service died! We'll just disappear.
Log.w("ImUrlActivity", "Connection disappeared!");
}
}
private boolean resolveIntent(Intent intent) {
Uri data = intent.getData();
String host = data.getHost();
if (Log.isLoggable(ImApp.LOG_TAG, Log.DEBUG)) {
log("resolveIntent: host=" + host);
}
if (TextUtils.isEmpty(host)) {
Set<String> categories = intent.getCategories();
if (categories != null) {
Iterator<String> iter = categories.iterator();
if (iter.hasNext()) {
String category = iter.next();
String providerName = getProviderNameForCategory(category);
mProviderName = findMatchingProvider(providerName);
if (mProviderName == null) {
Log.w(ImApp.LOG_TAG,
"resolveIntent: IM provider "+ category + " not supported");
return false;
}
}
}
mToAddress = data.getSchemeSpecificPart();
} else {
mProviderName = findMatchingProvider(host);
if (mProviderName == null) {
Log.w(ImApp.LOG_TAG, "resolveIntent: IM provider "+ host + " not supported");
return false;
}
String path = data.getPath();
if (Log.isLoggable(ImApp.LOG_TAG, Log.DEBUG)) log("resolveIntent: path=" + path);
if (!TextUtils.isEmpty(path)) {
int index;
if ((index = path.indexOf('/')) != -1) {
mToAddress = path.substring(index+1);
}
}
}
if (Log.isLoggable(ImApp.LOG_TAG, Log.DEBUG)) {
log("resolveIntent: provider=" + mProviderName + ", to=" + mToAddress);
}
return true;
}
private String getProviderNameForCategory(String providerCategory) {
if (providerCategory != null) {
if (providerCategory.equalsIgnoreCase("com.android.im.category.AIM")) {
return Imps.ProviderNames.AIM;
} else if (providerCategory.equalsIgnoreCase("com.android.im.category.MSN")) {
return Imps.ProviderNames.MSN;
} else if (providerCategory.equalsIgnoreCase("com.android.im.category.YAHOO")) {
return Imps.ProviderNames.YAHOO;
}
}
return null;
}
private String findMatchingProvider(String provider) {
if (TextUtils.isEmpty(provider)) {
return null;
}
if (Imps.ProviderNames.AIM.equalsIgnoreCase(provider)) {
return Imps.ProviderNames.AIM;
}
if (Imps.ProviderNames.MSN.equalsIgnoreCase(provider)) {
return Imps.ProviderNames.MSN;
}
if (Imps.ProviderNames.YAHOO.equalsIgnoreCase(provider)) {
return Imps.ProviderNames.YAHOO;
}
return null;
}
private boolean isValidToAddress() {
if (TextUtils.isEmpty(mToAddress)) {
return false;
}
if (mToAddress.indexOf('/') != -1) {
return false;
}
return true;
}
private static void log(String msg) {
Log.d(ImApp.LOG_TAG, "<ImUrlActivity> " + msg);
}
}