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

android开发

开发平台:

C/C++

  1. /*
  2.  * Copyright (C) 2007-2008 Esmertec AG.
  3.  * Copyright (C) 2007-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.IImConnection;
  19. import com.android.im.R;
  20. import com.android.im.engine.ImErrorInfo;
  21. import com.android.im.engine.Presence;
  22. import com.google.android.collect.Lists;
  23. import android.app.Activity;
  24. import android.app.AlertDialog;
  25. import android.content.Context;
  26. import android.content.DialogInterface;
  27. import android.graphics.drawable.Drawable;
  28. import android.os.RemoteException;
  29. import android.provider.Im;
  30. import android.text.TextUtils;
  31. import android.util.AttributeSet;
  32. import android.view.KeyEvent;
  33. import android.view.View;
  34. import android.view.ViewGroup;
  35. import android.widget.EditText;
  36. import android.widget.ImageButton;
  37. import android.widget.LinearLayout;
  38. import java.util.List;
  39. public class UserPresenceView extends LinearLayout {
  40.     private ImageButton mStatusDialogButton;
  41.     // views of the popup window
  42.     EditText mStatusEditor;
  43.     private final SimpleAlertHandler mHandler;
  44.     private IImConnection mConn;
  45.     private long mProviderId;
  46.     Presence mPresence;
  47.     private String mLastStatusEditText;
  48.     final List<StatusItem> mStatusItems = Lists.newArrayList();
  49.     public UserPresenceView(Context context, AttributeSet attrs) {
  50.         super(context, attrs);
  51.         mHandler = new SimpleAlertHandler((Activity)context);
  52.     }
  53.     @Override
  54.     protected void onFinishInflate() {
  55.         super.onFinishInflate();
  56.         mStatusDialogButton = (ImageButton)findViewById(R.id.statusDropDownButton);
  57.         mStatusEditor = (EditText)findViewById(R.id.statusEdit);
  58.         mStatusDialogButton.setOnClickListener(new OnClickListener() {
  59.             public void onClick(View v) {
  60.                 showStatusListDialog();
  61.             }
  62.         });
  63.         mStatusEditor.setOnKeyListener(new OnKeyListener() {
  64.             public boolean onKey(View v, int keyCode, KeyEvent event) {
  65.                 if (KeyEvent.ACTION_DOWN == event.getAction()) {
  66.                     switch (keyCode) {
  67.                         case KeyEvent.KEYCODE_DPAD_CENTER:
  68.                         case KeyEvent.KEYCODE_ENTER:
  69.                             updateStatusText();
  70.                             return true;
  71.                     }
  72.                 }
  73.                 return false;
  74.             }
  75.         });
  76.         mStatusEditor.setOnFocusChangeListener(new View.OnFocusChangeListener(){
  77.             public void onFocusChange(View v, boolean hasFocus) {
  78.                 if (!hasFocus) {
  79.                     updateStatusText();
  80.                 }
  81.             }
  82.         });
  83.     }
  84.     private void showStatusListDialog() {
  85.         if (mConn == null) {
  86.             return;
  87.         }
  88.         AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
  89.         builder.setAdapter(getStatusAdapter(),
  90.                 new DialogInterface.OnClickListener() {
  91.                     public void onClick(DialogInterface dialog, int which) {
  92.                         StatusItem item = mStatusItems.get(which);
  93.                         int oldStatus = mPresence.getStatus();
  94.                         if (item.getStatus() != oldStatus) {
  95.                             updatePresence(item.getStatus(), item.getText().toString());
  96.                         }
  97.                     }
  98.                 });
  99.         builder.show();
  100.     }
  101.     private StatusIconAdapter getStatusAdapter() {
  102.         try {
  103.             mStatusItems.clear();
  104.             int[] supportedStatus = mConn.getSupportedPresenceStatus();
  105.             for (int i = 0; i < supportedStatus.length; i++) {
  106.                 int s = PresenceUtils.convertStatus(supportedStatus[i]);
  107.                 if (s == Im.Presence.OFFLINE) {
  108.                     s = Im.Presence.INVISIBLE;
  109.                 }
  110.                 ImApp app = ImApp.getApplication((Activity)mContext);
  111.                 BrandingResources brandingRes = app.getBrandingResource(mProviderId);
  112.                 Drawable icon = brandingRes.getDrawable(PresenceUtils.getStatusIconId(s));
  113.                 String text = brandingRes.getString(PresenceUtils.getStatusStringRes(s));
  114.                 mStatusItems.add(new StatusItem(supportedStatus[i], icon, text));
  115.             }
  116.         } catch (RemoteException e) {
  117.             mHandler.showServiceErrorAlert();
  118.         }
  119.         return new StatusIconAdapter(mContext, mStatusItems);
  120.     }
  121.     void updateStatusText() {
  122.         String newStatusText = mStatusEditor.getText().toString();
  123.         if (TextUtils.isEmpty(newStatusText)) {
  124.             newStatusText = "";
  125.         }
  126.         if (!newStatusText.equals(mLastStatusEditText)) {
  127.             updatePresence(-1, newStatusText);
  128.         }
  129.     }
  130.     public void setConnection(IImConnection conn) {
  131.         mConn = conn;
  132.         try {
  133.             mPresence = conn.getUserPresence();
  134.             mProviderId = conn.getProviderId();
  135.         } catch (RemoteException e) {
  136.             mHandler.showServiceErrorAlert();
  137.         }
  138.         if (mPresence == null) {
  139.             mPresence = new Presence();
  140.         }
  141.         updateView();
  142.     }
  143.     private void updateView() {
  144.         ImApp app = ImApp.getApplication((Activity)mContext);
  145.         BrandingResources brandingRes = app.getBrandingResource(mProviderId);
  146.         int status = PresenceUtils.convertStatus(mPresence.getStatus());
  147.         mStatusDialogButton.setImageDrawable(brandingRes.getDrawable(
  148.                 PresenceUtils.getStatusIconId(status)));
  149.         String statusText = mPresence.getStatusText();
  150.         if (TextUtils.isEmpty(statusText)) {
  151.             statusText = brandingRes.getString(PresenceUtils.getStatusStringRes(status));
  152.         }
  153.         mStatusEditor.setText(statusText);
  154.         mLastStatusEditText = statusText;
  155.         // Disable the user to edit the custom status text because
  156.         // the AIM and MSN server don't support it now.
  157.         ProviderDef provider = app.getProvider(mProviderId);
  158.         String providerName = provider == null ? null : provider.mName;
  159.         if (Im.ProviderNames.AIM.equals(providerName)
  160.                 || Im.ProviderNames.MSN.equals(providerName)) {
  161.             mStatusEditor.setFocusable(false);
  162.         }
  163.     }
  164.     void updatePresence(int status, String statusText) {
  165.         if (mPresence == null) {
  166.             // We haven't get the connection yet. Don't allow to update presence now.
  167.             return;
  168.         }
  169.         Presence newPresence = new Presence(mPresence);
  170.         if (status != -1) {
  171.             newPresence.setStatus(status);
  172.         }
  173.         newPresence.setStatusText(statusText);
  174.         try {
  175.             int res = mConn.updateUserPresence(newPresence);
  176.             if (res != ImErrorInfo.NO_ERROR) {
  177.                 mHandler.showAlert(R.string.error,
  178.                         ErrorResUtils.getErrorRes(getResources(), res));
  179.             } else {
  180.                 mPresence = newPresence;
  181.                 updateView();
  182.             }
  183.         } catch (RemoteException e) {
  184.             mHandler.showServiceErrorAlert();
  185.         }
  186.     }
  187.     private static class StatusItem implements ImageListAdapter.ImageListItem {
  188.         private final int mStatus;
  189.         private final Drawable mIcon;
  190.         private final String   mText;
  191.         public StatusItem(int status, Drawable icon, String text) {
  192.             mStatus = status;
  193.             mIcon = icon;
  194.             mText = text;
  195.         }
  196.         public Drawable getDrawable() {
  197.             return mIcon;
  198.         }
  199.         public CharSequence getText() {
  200.             return mText;
  201.         }
  202.         public int getStatus() {
  203.             return mStatus;
  204.         }
  205.     }
  206.     private static class StatusIconAdapter extends ImageListAdapter {
  207.         public StatusIconAdapter(Context context, List<StatusItem> data) {
  208.             super(context, data);
  209.         }
  210.         @Override
  211.         public long getItemId(int position) {
  212.             StatusItem item = (StatusItem)getItem(position);
  213.             return item.getStatus();
  214.         }
  215.         @Override
  216.         public View getView(int position, View convertView, ViewGroup parent) {
  217.             View view = super.getView(position, convertView, parent);
  218.             return view;
  219.         }
  220.     }
  221. }