ImUrlActivity.java
上传用户:szyujian
上传日期:2016-09-20
资源大小:320k
文件大小:6k
源码类别:

android开发

开发平台:

C/C++

  1. /*
  2.  * Copyright (C) 2008 Esmertec AG.
  3.  * Copyright (C) 2008 The Android Open Source Project
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *      http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package com.android.im.app;
  18. import com.android.im.IChatSession;
  19. import com.android.im.IChatSessionManager;
  20. import com.android.im.IImConnection;
  21. import com.android.im.engine.ImConnection;
  22. import android.app.Activity;
  23. import android.content.ContentResolver;
  24. import android.content.ContentUris;
  25. import android.content.Intent;
  26. import android.database.Cursor;
  27. import android.net.Uri;
  28. import android.os.Bundle;
  29. import android.os.Handler;
  30. import android.os.RemoteException;
  31. import android.provider.Im;
  32. import android.text.TextUtils;
  33. import android.util.Log;
  34. import java.util.Iterator;
  35. import java.util.Set;
  36. public class ImUrlActivity extends Activity {
  37.     private static final String[] ACCOUNT_PROJECTION = {
  38.         Im.Account._ID,
  39.         Im.Account.PASSWORD,
  40.     };
  41.     private static final int ACCOUNT_ID_COLUMN = 0;
  42.     private static final int ACCOUNT_PW_COLUMN = 1;
  43.     private String mProviderCategory;
  44.     private String mToAddress;
  45.     private ImApp mApp;
  46.     private IImConnection mConn;
  47.     @Override
  48.     protected void onCreate(Bundle savedInstanceState) {
  49.         super.onCreate(savedInstanceState);
  50.         Intent intent = getIntent();
  51.         if (Intent.ACTION_SENDTO.equals(intent.getAction())) {
  52.             resolveIntent(intent);
  53.             if (!isProviderSupported()) {
  54.                 Log.w(ImApp.LOG_TAG, "<ImUrlActivity>Unsuppported provider:" + mProviderCategory);
  55.                 finish();
  56.                 return;
  57.             }
  58.             if (TextUtils.isEmpty(mToAddress)) {
  59.                 Log.w(ImApp.LOG_TAG, "<ImUrlActivity>Invalid to address:" + mToAddress);
  60.                 finish();
  61.                 return;
  62.             }
  63.             mApp = ImApp.getApplication(this);
  64.             mApp.callWhenServiceConnected(new Handler(), new Runnable(){
  65.                 public void run() {
  66.                     handleIntent();
  67.                 }});
  68.         } else {
  69.             finish();
  70.         }
  71.     }
  72.     void handleIntent() {
  73.         ContentResolver cr = getContentResolver();
  74.         String providername = Im.Provider.getProviderNameForCategory(mProviderCategory);
  75.         long providerId = Im.Provider.getProviderIdForName(cr, providername);
  76.         mConn= mApp.getConnection(providerId);
  77.         if (mConn == null) {
  78.             Cursor c = DatabaseUtils.queryAccountsForProvider(cr, ACCOUNT_PROJECTION, providerId);
  79.             if (c == null) {
  80.                 addAccount(providerId);
  81.             } else {
  82.                 long accountId = c.getLong(ACCOUNT_ID_COLUMN);
  83.                 if (c.isNull(ACCOUNT_PW_COLUMN)) {
  84.                     editAccount(accountId);
  85.                 } else {
  86.                     signInAccount(accountId);
  87.                 }
  88.             }
  89.         } else {
  90.             try {
  91.                 int state = mConn.getState();
  92.                 if (state < ImConnection.LOGGED_IN) {
  93.                     signInAccount(mConn.getAccountId());
  94.                 } else if (state == ImConnection.LOGGED_IN
  95.                         || state == ImConnection.SUSPENDED) {
  96.                     openChat();
  97.                 }
  98.             } catch (RemoteException e) {
  99.                 // Ouch!  Service died!  We'll just disappear.
  100.                 Log.w("ImUrlActivity", "Connection disappeared!");
  101.             }
  102.         }
  103.         finish();
  104.     }
  105.     private void addAccount(long providerId) {
  106.         Intent  intent = new Intent(this, AccountActivity.class);
  107.         intent.setAction(Intent.ACTION_INSERT);
  108.         intent.setData(ContentUris.withAppendedId(Im.Provider.CONTENT_URI, providerId));
  109.         intent.putExtra(ImApp.EXTRA_INTENT_SEND_TO_USER, mToAddress);
  110.         startActivity(intent);
  111.     }
  112.     private void editAccount(long accountId) {
  113.         Uri accountUri = ContentUris.withAppendedId(Im.Account.CONTENT_URI, accountId);
  114.         Intent intent = new Intent(this, AccountActivity.class);
  115.         intent.setAction(Intent.ACTION_EDIT);
  116.         intent.setData(accountUri);
  117.         intent.putExtra(ImApp.EXTRA_INTENT_SEND_TO_USER, mToAddress);
  118.         startActivity(intent);
  119.     }
  120.     private void signInAccount(long accountId) {
  121.         Uri accountUri = ContentUris.withAppendedId(Im.Account.CONTENT_URI, accountId);
  122.         Intent intent = new Intent(this, SigningInActivity.class);
  123.         intent.setData(accountUri);
  124.         intent.putExtra(ImApp.EXTRA_INTENT_SEND_TO_USER, mToAddress);
  125.         startActivity(intent);
  126.     }
  127.     private void openChat() {
  128.         try {
  129.             IChatSessionManager manager = mConn.getChatSessionManager();
  130.             IChatSession session = manager.getChatSession(mToAddress);
  131.             if(session == null) {
  132.                 session = manager.createChatSession(mToAddress);
  133.             }
  134.             Uri data = ContentUris.withAppendedId(Im.Chats.CONTENT_URI,
  135.                     session.getId());
  136.             Intent i = new Intent(Intent.ACTION_VIEW, data);
  137.             startActivity(i);
  138.         } catch (RemoteException e) {
  139.             // Ouch!  Service died!  We'll just disappear.
  140.             Log.w("ImUrlActivity", "Connection disappeared!");
  141.         }
  142.     }
  143.     private void resolveIntent(Intent intent) {
  144.         Set<String> categories = intent.getCategories();
  145.         if (categories != null) {
  146.             Iterator<String> iter = categories.iterator();
  147.             if (iter.hasNext()) {
  148.                 mProviderCategory = iter.next();
  149.             }
  150.         }
  151.         Uri data = intent.getData();
  152.         mToAddress = data.getSchemeSpecificPart();
  153.         if (Log.isLoggable(ImApp.LOG_TAG, Log.DEBUG)) {
  154.             log ("mProviderCategory=" + mProviderCategory + ", mToAddress=" + mToAddress);
  155.         }
  156.     }
  157.     private boolean isProviderSupported() {
  158.         return Im.ProviderCategories.AIM.equals(mProviderCategory)
  159.                 || Im.ProviderCategories.MSN.equals(mProviderCategory)
  160.                 || Im.ProviderCategories.YAHOO.equals(mProviderCategory);
  161.     }
  162.     private static void log(String msg) {
  163.         Log.d(ImApp.LOG_TAG, "<ImUrlActivity> " + msg);
  164.     }
  165. }