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

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"); you may not
  6.  * use this file except in compliance with the License. You may obtain a copy of
  7.  * 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, WITHOUT
  13.  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  14.  * License for the specific language governing permissions and limitations under
  15.  * the License.
  16.  */
  17. package com.android.im.app;
  18. import com.android.im.IChatSession;
  19. import com.android.im.R;
  20. import com.android.im.app.adapter.ChatListenerAdapter;
  21. import com.android.im.plugin.BrandingResourceIDs;
  22. import com.android.im.service.ImServiceConstants;
  23. import android.app.Activity;
  24. import android.app.AlertDialog;
  25. import android.content.ContentUris;
  26. import android.content.DialogInterface;
  27. import android.content.Intent;
  28. import android.database.Cursor;
  29. import android.graphics.drawable.Drawable;
  30. import android.net.Uri;
  31. import android.os.Bundle;
  32. import android.os.Handler;
  33. import android.os.RemoteException;
  34. import android.provider.Im;
  35. import android.view.Menu;
  36. import android.view.MenuInflater;
  37. import android.view.MenuItem;
  38. import android.view.View;
  39. import android.view.Window;
  40. import android.widget.ImageView;
  41. import android.widget.SimpleAdapter;
  42. import android.widget.Toast;
  43. import java.util.ArrayList;
  44. import java.util.HashMap;
  45. import java.util.List;
  46. import java.util.Map;
  47. public class NewChatActivity extends Activity {
  48.     private static final String[] CHAT_SWITCHER_PROJECTION = {
  49.             Im.Contacts._ID,
  50.             Im.Contacts.PROVIDER,
  51.             Im.Contacts.ACCOUNT,
  52.             Im.Contacts.USERNAME,
  53.             Im.Chats.GROUP_CHAT,
  54.     };
  55.     private static final int CHAT_SWITCHER_ID_COLUMN = 0;
  56.     private static final int REQUEST_PICK_CONTACTS = RESULT_FIRST_USER + 1;
  57.     ImApp mApp;
  58.     ChatView mChatView;
  59.     SimpleAlertHandler mHandler;
  60.     private AlertDialog mSmileyDialog;
  61.     @Override
  62.     protected void onCreate(Bundle icicle) {
  63.         super.onCreate(icicle);
  64.         requestWindowFeature(Window.FEATURE_NO_TITLE);
  65.         setContentView(R.layout.chat_view);
  66.         mChatView = (ChatView) findViewById(R.id.chatView);
  67.         mHandler = mChatView.mHandler;
  68.         final Handler handler = new Handler();
  69.         mApp= ImApp.getApplication(this);
  70.         mApp.callWhenServiceConnected(handler, new Runnable() {
  71.             public void run() {
  72.                 resolveIntent(getIntent());
  73.             }
  74.         });
  75.     }
  76.     @Override
  77.     protected void onResume() {
  78.         super.onResume();
  79.         mChatView.onResume();
  80.     }
  81.     @Override
  82.     protected void onPause() {
  83.         mChatView.onPause();
  84.         super.onPause();
  85.     }
  86.     @Override
  87.     protected void onNewIntent(Intent intent) {
  88.         resolveIntent(intent);
  89.     }
  90.     void resolveIntent(Intent intent) {
  91.         if (ImServiceConstants.ACTION_MANAGE_SUBSCRIPTION.equals(intent.getAction())) {
  92.             long providerId = intent.getLongExtra(ImServiceConstants.EXTRA_INTENT_PROVIDER_ID, -1);
  93.             String from = intent.getStringExtra(ImServiceConstants.EXTRA_INTENT_FROM_ADDRESS);
  94.             if ((providerId == -1) || (from == null)) {
  95.                 finish();
  96.             } else {
  97.                 mChatView.bindSubscription(providerId, from);
  98.             }
  99.         } else {
  100.             Uri data = intent.getData();
  101.             String type = getContentResolver().getType(data);
  102.             if (Im.Chats.CONTENT_ITEM_TYPE.equals(type)) {
  103.                 mChatView.bindChat(ContentUris.parseId(data));
  104.             } else if (Im.Invitation.CONTENT_ITEM_TYPE.equals(type)) {
  105.                 mChatView.bindInvitation(ContentUris.parseId(data));
  106.             }
  107.         }
  108.     }
  109.     @Override
  110.     public boolean onCreateOptionsMenu(Menu menu) {
  111.         MenuInflater inflater = getMenuInflater();
  112.         inflater.inflate(R.menu.chat_screen_menu, menu);
  113.         long providerId = mChatView.getProviderId();
  114.         BrandingResources brandingRes = mApp.getBrandingResource(providerId);
  115.         menu.findItem(R.id.menu_view_friend_list).setTitle(
  116.                 brandingRes.getString(BrandingResourceIDs.STRING_MENU_CONTACT_LIST));
  117.         menu.findItem(R.id.menu_switch_chats).setTitle(
  118.                 brandingRes.getString(BrandingResourceIDs.STRING_MENU_SWITCH_CHATS));
  119.         menu.findItem(R.id.menu_insert_smiley).setTitle(
  120.                 brandingRes.getString(BrandingResourceIDs.STRING_MENU_INSERT_SMILEY));
  121.         menu.findItem(R.id.menu_end_conversation).setTitle(
  122.                 brandingRes.getString(BrandingResourceIDs.STRING_MENU_END_CHAT));
  123.         menu.findItem(R.id.menu_view_profile).setTitle(
  124.                 brandingRes.getString(BrandingResourceIDs.STRING_MENU_VIEW_PROFILE));
  125.         menu.findItem(R.id.menu_block_contact).setTitle(
  126.                 brandingRes.getString(BrandingResourceIDs.STRING_MENU_BLOCK_CONTACT));
  127.         return true;
  128.     }
  129.     @Override
  130.     public boolean onPrepareOptionsMenu(Menu menu) {
  131.         super.onPrepareOptionsMenu(menu);
  132.         //XXX hide the invite menu, group chat is not supported by the server.
  133.         menu.findItem(R.id.menu_invite_contact).setVisible(false);
  134.         //XXX HACK: Yahoo! doesn't allow to block a friend. We can only block a temporary contact.
  135.         ProviderDef provider = mApp.getProvider(mChatView.getProviderId());
  136.         if ((provider != null) && Im.ProviderNames.YAHOO.equals(provider.mName)) {
  137.             if (Im.Contacts.TYPE_TEMPORARY != mChatView.mType) {
  138.                 menu.findItem(R.id.menu_block_contact).setVisible(false);
  139.             }
  140.         }
  141.         return true;
  142.     }
  143.     @Override
  144.     public boolean onOptionsItemSelected(MenuItem item) {
  145.         switch (item.getItemId()) {
  146.             case R.id.menu_view_friend_list:
  147.                 finish();
  148.                 showRosterScreen();
  149.                 return true;
  150.             case R.id.menu_insert_smiley:
  151.                 showSmileyDialog();
  152.                 return true;
  153.             case R.id.menu_end_conversation:
  154.                 mChatView.closeChatSession();
  155.                 return true;
  156.             case R.id.menu_switch_chats:
  157.                 Dashboard.openDashboard(this, mChatView.getAccountId(),
  158.                         mChatView.getUserName());
  159.                 return true;
  160.             case R.id.menu_invite_contact:
  161.                 startContactPicker();
  162.                 return true;
  163.             case R.id.menu_view_profile:
  164.                 mChatView.viewProfile();
  165.                 return true;
  166.             case R.id.menu_block_contact:
  167.                 mChatView.blockContact();
  168.                 return true;
  169.             case R.id.menu_prev_chat:
  170.                 switchChat(-1);
  171.                 return true;
  172.             case R.id.menu_next_chat:
  173.                 switchChat(1);
  174.                 return true;
  175.         }
  176.         return super.onOptionsItemSelected(item);
  177.     }
  178.     private void showRosterScreen() {
  179.         Intent intent = new Intent(Intent.ACTION_VIEW);
  180.         intent.setClass(this, ContactListActivity.class);
  181.         intent.putExtra(ImServiceConstants.EXTRA_INTENT_ACCOUNT_ID, mChatView.getAccountId());
  182.         startActivity(intent);
  183.     }
  184.     private void showSmileyDialog() {
  185.         if (mSmileyDialog == null) {
  186.             long providerId = mChatView.getProviderId();
  187.             final BrandingResources brandingRes = mApp.getBrandingResource(providerId);
  188.             int[] icons = brandingRes.getSmileyIcons();
  189.             String[] names = brandingRes.getStringArray(
  190.                     BrandingResourceIDs.STRING_ARRAY_SMILEY_NAMES);
  191.             final String[] texts = brandingRes.getStringArray(
  192.                     BrandingResourceIDs.STRING_ARRAY_SMILEY_TEXTS);
  193.             final int N = names.length;
  194.             List<Map<String, ?>> entries = new ArrayList<Map<String, ?>>();
  195.             for (int i = 0; i < N; i++) {
  196.                 // We might have different ASCII for the same icon, skip it if
  197.                 // the icon is already added.
  198.                 boolean added = false;
  199.                 for (int j = 0; j < i; j++) {
  200.                     if (icons[i] == icons[j]) {
  201.                         added = true;
  202.                         break;
  203.                     }
  204.                 }
  205.                 if (!added) {
  206.                     HashMap<String, Object> entry = new HashMap<String, Object>();
  207.                     entry. put("icon", icons[i]);
  208.                     entry. put("name", names[i]);
  209.                     entry.put("text", texts[i]);
  210.                     entries.add(entry);
  211.                 }
  212.             }
  213.             final SimpleAdapter a = new SimpleAdapter(
  214.                     this,
  215.                     entries,
  216.                     R.layout.smiley_menu_item,
  217.                     new String[] {"icon", "name", "text"},
  218.                     new int[] {R.id.smiley_icon, R.id.smiley_name, R.id.smiley_text});
  219.             SimpleAdapter.ViewBinder viewBinder = new SimpleAdapter.ViewBinder() {
  220.                 public boolean setViewValue(View view, Object data, String textRepresentation) {
  221.                     if (view instanceof ImageView) {
  222.                         Drawable img = brandingRes.getSmileyIcon((Integer)data);
  223.                         ((ImageView)view).setImageDrawable(img);
  224.                         return true;
  225.                     }
  226.                     return false;
  227.                 }
  228.             };
  229.             a.setViewBinder(viewBinder);
  230.             AlertDialog.Builder b = new AlertDialog.Builder(this);
  231.             b.setTitle(brandingRes.getString(
  232.                     BrandingResourceIDs.STRING_MENU_INSERT_SMILEY));
  233.             b.setCancelable(true);
  234.             b.setAdapter(a, new DialogInterface.OnClickListener() {
  235.                 public final void onClick(DialogInterface dialog, int which) {
  236.                     HashMap<String, Object> item = (HashMap<String, Object>) a.getItem(which);
  237.                     mChatView.insertSmiley((String)item.get("text"));
  238.                 }
  239.             });
  240.             mSmileyDialog = b.create();
  241.         }
  242.         mSmileyDialog.show();
  243.     }
  244.     private void switchChat(int delta) {
  245.         Cursor c = getContentResolver().query(Im.Contacts.CONTENT_URI_CHAT_CONTACTS,
  246.                 CHAT_SWITCHER_PROJECTION, null, null, null);
  247.         if(c == null) {
  248.             return;
  249.         }
  250.         final int N = c.getCount();
  251.         if (N <= 1) {
  252.             c.close();
  253.             return;
  254.         }
  255.         int current = -1;
  256.         // find current position
  257.         for (int i = 0; i < N; i++) {
  258.             c.moveToNext();
  259.             long id = c.getLong(CHAT_SWITCHER_ID_COLUMN);
  260.             if (id == mChatView.getChatId()) {
  261.                 current = i;
  262.             }
  263.         }
  264.         if (current == -1) {
  265.             c.close();
  266.             return;
  267.         }
  268.         int newPosition = (current + delta) % N;
  269.         if (newPosition < 0) {
  270.             newPosition += N;
  271.         }
  272.         c.moveToPosition(newPosition);
  273.         Intent intent;
  274.         long id = c.getLong(CHAT_SWITCHER_ID_COLUMN);
  275.         Uri uri = ContentUris.withAppendedId(Im.Chats.CONTENT_URI, id);
  276.         intent = new Intent(Intent.ACTION_VIEW, uri);
  277.         c.close();
  278.         startActivity(intent);
  279.         finish();
  280.     }
  281.     private void startContactPicker() {
  282.         Uri.Builder builder = Im.Contacts.CONTENT_URI_ONLINE_CONTACTS_BY.buildUpon();
  283.         ContentUris.appendId(builder, mChatView.getProviderId());
  284.         ContentUris.appendId(builder, mChatView.getAccountId());
  285.         Uri data = builder.build();
  286.         try {
  287.             Intent i = new Intent(Intent.ACTION_PICK, data);
  288.             i.putExtra(ContactsPickerActivity.EXTRA_EXCLUDED_CONTACTS,
  289.                     mChatView.getCurrentChatSession().getPariticipants());
  290.             startActivityForResult(i, REQUEST_PICK_CONTACTS);
  291.         } catch (RemoteException e) {
  292.             mHandler.showServiceErrorAlert();
  293.         }
  294.     }
  295.     @Override
  296.     protected void onActivityResult(int requestCode, int resultCode,
  297.             Intent data) {
  298.         if (resultCode == RESULT_OK) {
  299.             if (requestCode == REQUEST_PICK_CONTACTS) {
  300.                 String username = data.getStringExtra(
  301.                         ContactsPickerActivity.EXTRA_RESULT_USERNAME);
  302.                 try {
  303.                     IChatSession chatSession = mChatView.getCurrentChatSession();
  304.                     if (chatSession.isGroupChatSession()) {
  305.                         chatSession.inviteContact(username);
  306.                         showInvitationHasSent(username);
  307.                     } else {
  308.                         chatSession.convertToGroupChat();
  309.                         new ContactInvitor(chatSession, username).start();
  310.                     }
  311.                 } catch (RemoteException e) {
  312.                     mHandler.showServiceErrorAlert();
  313.                 }
  314.             }
  315.         }
  316.     }
  317.     void showInvitationHasSent(String contact) {
  318.         Toast.makeText(NewChatActivity.this,
  319.                 getString(R.string.invitation_sent_prompt, contact),
  320.                 Toast.LENGTH_SHORT).show();
  321.     }
  322.     private class ContactInvitor extends ChatListenerAdapter {
  323.         private final IChatSession mChatSession;
  324.         String mContact;
  325.         public ContactInvitor(IChatSession session, String data) {
  326.             mChatSession = session;
  327.             mContact = data;
  328.         }
  329.         @Override
  330.         public void onConvertedToGroupChat(IChatSession ses) {
  331.             try {
  332.                 final long chatId = mChatSession.getId();
  333.                 mChatSession.inviteContact(mContact);
  334.                 mHandler.post(new Runnable(){
  335.                     public void run() {
  336.                         mChatView.bindChat(chatId);
  337.                         showInvitationHasSent(mContact);
  338.                     }
  339.                 });
  340.                 mChatSession.unregisterChatListener(this);
  341.             } catch (RemoteException e) {
  342.                 mHandler.showServiceErrorAlert();
  343.             }
  344.         }
  345.         public void start() throws RemoteException {
  346.             mChatSession.registerChatListener(this);
  347.         }
  348.     }
  349. }