| /* |
| * 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); |
| } |
| } |