MessageView.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 java.text.DateFormat;
  19. import java.text.SimpleDateFormat;
  20. import java.util.Date;
  21. import android.content.Context;
  22. import android.content.res.Resources;
  23. import android.graphics.Typeface;
  24. import android.provider.Im;
  25. import android.text.Spannable;
  26. import android.text.SpannableString;
  27. import android.text.SpannableStringBuilder;
  28. import android.text.style.ForegroundColorSpan;
  29. import android.text.style.RelativeSizeSpan;
  30. import android.text.style.StyleSpan;
  31. import android.text.style.URLSpan;
  32. import android.util.AttributeSet;
  33. import android.widget.LinearLayout;
  34. import android.widget.TextView;
  35. import com.android.im.R;
  36. public class MessageView extends LinearLayout {
  37.     private TextView mMessage;
  38.     private Resources mResources;
  39.     public MessageView(Context context, AttributeSet attrs) {
  40.         super(context, attrs);
  41.     }
  42.     @Override
  43.     protected void onFinishInflate() {
  44.         super.onFinishInflate();
  45.         mMessage = (TextView) findViewById(R.id.message);
  46.         mResources = getResources();
  47.     }
  48.     public URLSpan[] getMessageLinks() {
  49.         return mMessage.getUrls();
  50.     }
  51.     public void bindIncomingMessage(String contact, String body, Date date,
  52.             Markup smileyRes, boolean scrolling) {
  53.         CharSequence message =  formatMessage(contact, body, date, smileyRes, scrolling);
  54.         mMessage.setText(message);
  55.         mMessage.setTextColor(mResources.getColor(R.color.chat_msg));
  56.     }
  57.     public void bindOutgoingMessage(String body, Date date, Markup smileyRes, boolean scrolling) {
  58.         String contact = mResources.getString(R.string.me);
  59.         CharSequence message = formatMessage(contact, body, date, smileyRes, scrolling);
  60.         mMessage.setText(message);
  61.         mMessage.setTextColor(mResources.getColor(R.color.chat_msg));
  62.     }
  63.     public void bindPresenceMessage(String contact, int type, boolean isGroupChat,
  64.             boolean scrolling) {
  65.         CharSequence message = formatPresenceUpdates(contact, type, isGroupChat, scrolling);
  66.         mMessage.setText(message);
  67.         mMessage.setTextColor(mResources.getColor(R.color.chat_msg_presence));
  68.     }
  69.     public void bindErrorMessage(int errCode) {
  70.         mMessage.setText(R.string.msg_sent_failed);
  71.         mMessage.setTextColor(mResources.getColor(R.color.error));
  72.     }
  73.     private CharSequence formatMessage(String contact, String body,
  74.             Date date, Markup smileyRes, boolean scrolling) {
  75.         if (body.indexOf('r') != -1) {
  76.             // first convert rn pair to n, then single r to n.
  77.             // here we can't use HideReturnsTransformationMethod because
  78.             // it does only 1 to 1 transformation and is unable to handle
  79.             // the "rn" case.
  80.             body = body.replace("rn", "n").replace('r', 'n');
  81.         }
  82.         SpannableStringBuilder buf = new SpannableStringBuilder(contact);
  83.         buf.append(": ");
  84.         if (scrolling) {
  85.             buf.append(body);
  86.         } else {
  87.             buf.setSpan(ChatView.STYLE_BOLD, 0, buf.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
  88.             buf.append(smileyRes.markup(body));
  89.             if (date != null) {
  90.                 appendTimeStamp(buf, date);
  91.             }
  92.         }
  93.         return buf;
  94.     }
  95.     private void appendTimeStamp(SpannableStringBuilder buf, Date date) {
  96.         DateFormat format = new SimpleDateFormat(mResources.getString(R.string.time_stamp));
  97.         String dateStr = format.format(date);
  98.         SpannableString spanText = new SpannableString(dateStr);
  99.         int len = spanText.length();
  100.         spanText.setSpan(new StyleSpan(Typeface.ITALIC),
  101.                 0, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  102.         spanText.setSpan(new RelativeSizeSpan(0.8f),
  103.                 0, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  104.         spanText.setSpan(new ForegroundColorSpan(
  105.                 mResources.getColor(android.R.color.darker_gray)),
  106.                 0, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  107.         buf.append('n');
  108.         buf.append(spanText);
  109.     }
  110.     private CharSequence formatPresenceUpdates(String contact, int type,
  111.             boolean isGroupChat, boolean scrolling) {
  112.         String body;
  113.         switch (type) {
  114.             case Im.MessageType.PRESENCE_AVAILABLE:
  115.                 body = mResources.getString(isGroupChat ? R.string.contact_joined
  116.                         : R.string.contact_online, contact);
  117.                 break;
  118.             case Im.MessageType.PRESENCE_AWAY:
  119.                 body = mResources.getString(R.string.contact_away, contact);
  120.                 break;
  121.             case Im.MessageType.PRESENCE_DND:
  122.                 body = mResources.getString(R.string.contact_busy, contact);
  123.                 break;
  124.             case Im.MessageType.PRESENCE_UNAVAILABLE:
  125.                 body = mResources.getString(isGroupChat ? R.string.contact_left
  126.                         : R.string.contact_offline, contact);
  127.                 break;
  128.             default:
  129.                 return null;
  130.         }
  131.         if (scrolling) {
  132.             return body;
  133.         } else {
  134.             SpannableString spanText = new SpannableString(body);
  135.             int len = spanText.length();
  136.             spanText.setSpan(new StyleSpan(Typeface.ITALIC),
  137.                     0, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  138.             spanText.setSpan(new RelativeSizeSpan((float)0.8),
  139.                     0, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  140.             return spanText;
  141.         }
  142.     }
  143. }