⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 userpresenceview.java

📁 Android平台上即时通讯聊天工具源代码。 支持手机聊天。
💻 JAVA
字号:
/* * Copyright (C) 2007-2008 Esmertec AG. * Copyright (C) 2007-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.IImConnection;import com.android.im.R;import com.android.im.engine.ImErrorInfo;import com.android.im.engine.Presence;import com.google.android.collect.Lists;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.graphics.drawable.Drawable;import android.os.RemoteException;import android.provider.Im;import android.text.TextUtils;import android.util.AttributeSet;import android.view.KeyEvent;import android.view.View;import android.view.ViewGroup;import android.widget.EditText;import android.widget.ImageButton;import android.widget.LinearLayout;import java.util.List;public class UserPresenceView extends LinearLayout {    private ImageButton mStatusDialogButton;    // views of the popup window    EditText mStatusEditor;    private final SimpleAlertHandler mHandler;    private IImConnection mConn;    private long mProviderId;    Presence mPresence;    private String mLastStatusEditText;    final List<StatusItem> mStatusItems = Lists.newArrayList();    public UserPresenceView(Context context, AttributeSet attrs) {        super(context, attrs);        mHandler = new SimpleAlertHandler((Activity)context);    }    @Override    protected void onFinishInflate() {        super.onFinishInflate();        mStatusDialogButton = (ImageButton)findViewById(R.id.statusDropDownButton);        mStatusEditor = (EditText)findViewById(R.id.statusEdit);        mStatusDialogButton.setOnClickListener(new OnClickListener() {            public void onClick(View v) {                showStatusListDialog();            }        });        mStatusEditor.setOnKeyListener(new OnKeyListener() {            public boolean onKey(View v, int keyCode, KeyEvent event) {                if (KeyEvent.ACTION_DOWN == event.getAction()) {                    switch (keyCode) {                        case KeyEvent.KEYCODE_DPAD_CENTER:                        case KeyEvent.KEYCODE_ENTER:                            updateStatusText();                            return true;                    }                }                return false;            }        });        mStatusEditor.setOnFocusChangeListener(new View.OnFocusChangeListener(){            public void onFocusChange(View v, boolean hasFocus) {                if (!hasFocus) {                    updateStatusText();                }            }        });    }    private void showStatusListDialog() {        if (mConn == null) {            return;        }        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);        builder.setAdapter(getStatusAdapter(),                new DialogInterface.OnClickListener() {                    public void onClick(DialogInterface dialog, int which) {                        StatusItem item = mStatusItems.get(which);                        int oldStatus = mPresence.getStatus();                        if (item.getStatus() != oldStatus) {                            updatePresence(item.getStatus(), item.getText().toString());                        }                    }                });        builder.show();    }    private StatusIconAdapter getStatusAdapter() {        try {            mStatusItems.clear();            int[] supportedStatus = mConn.getSupportedPresenceStatus();            for (int i = 0; i < supportedStatus.length; i++) {                int s = PresenceUtils.convertStatus(supportedStatus[i]);                if (s == Im.Presence.OFFLINE) {                    s = Im.Presence.INVISIBLE;                }                ImApp app = ImApp.getApplication((Activity)mContext);                BrandingResources brandingRes = app.getBrandingResource(mProviderId);                Drawable icon = brandingRes.getDrawable(PresenceUtils.getStatusIconId(s));                String text = brandingRes.getString(PresenceUtils.getStatusStringRes(s));                mStatusItems.add(new StatusItem(supportedStatus[i], icon, text));            }        } catch (RemoteException e) {            mHandler.showServiceErrorAlert();        }        return new StatusIconAdapter(mContext, mStatusItems);    }    void updateStatusText() {        String newStatusText = mStatusEditor.getText().toString();        if (TextUtils.isEmpty(newStatusText)) {            newStatusText = "";        }        if (!newStatusText.equals(mLastStatusEditText)) {            updatePresence(-1, newStatusText);        }    }    public void setConnection(IImConnection conn) {        mConn = conn;        try {            mPresence = conn.getUserPresence();            mProviderId = conn.getProviderId();        } catch (RemoteException e) {            mHandler.showServiceErrorAlert();        }        if (mPresence == null) {            mPresence = new Presence();        }        updateView();    }    private void updateView() {        ImApp app = ImApp.getApplication((Activity)mContext);        BrandingResources brandingRes = app.getBrandingResource(mProviderId);        int status = PresenceUtils.convertStatus(mPresence.getStatus());        mStatusDialogButton.setImageDrawable(brandingRes.getDrawable(                PresenceUtils.getStatusIconId(status)));        String statusText = mPresence.getStatusText();        if (TextUtils.isEmpty(statusText)) {            statusText = brandingRes.getString(PresenceUtils.getStatusStringRes(status));        }        mStatusEditor.setText(statusText);        mLastStatusEditText = statusText;        // Disable the user to edit the custom status text because        // the AIM and MSN server don't support it now.        ProviderDef provider = app.getProvider(mProviderId);        String providerName = provider == null ? null : provider.mName;        if (Im.ProviderNames.AIM.equals(providerName)                || Im.ProviderNames.MSN.equals(providerName)) {            mStatusEditor.setFocusable(false);        }    }    void updatePresence(int status, String statusText) {        if (mPresence == null) {            // We haven't get the connection yet. Don't allow to update presence now.            return;        }        Presence newPresence = new Presence(mPresence);        if (status != -1) {            newPresence.setStatus(status);        }        newPresence.setStatusText(statusText);        try {            int res = mConn.updateUserPresence(newPresence);            if (res != ImErrorInfo.NO_ERROR) {                mHandler.showAlert(R.string.error,                        ErrorResUtils.getErrorRes(getResources(), res));            } else {                mPresence = newPresence;                updateView();            }        } catch (RemoteException e) {            mHandler.showServiceErrorAlert();        }    }    private static class StatusItem implements ImageListAdapter.ImageListItem {        private final int mStatus;        private final Drawable mIcon;        private final String   mText;        public StatusItem(int status, Drawable icon, String text) {            mStatus = status;            mIcon = icon;            mText = text;        }        public Drawable getDrawable() {            return mIcon;        }        public CharSequence getText() {            return mText;        }        public int getStatus() {            return mStatus;        }    }    private static class StatusIconAdapter extends ImageListAdapter {        public StatusIconAdapter(Context context, List<StatusItem> data) {            super(context, data);        }        @Override        public long getItemId(int position) {            StatusItem item = (StatusItem)getItem(position);            return item.getStatus();        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            View view = super.getView(position, convertView, parent);            return view;        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -