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

📄 statusbarnotifier.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.service;import java.util.HashMap;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.ContentUris;import android.content.Context;import android.content.Intent;import android.net.Uri;import android.os.Handler;import android.provider.Im;import android.text.TextUtils;import android.util.Log;import com.android.im.R;import com.android.im.app.ContactListActivity;public class StatusBarNotifier {    private static final boolean DBG = true;    static final long[] VIBRATE_PATTERN = new long[] {0, 250, 250, 250};    private Context mContext;    private NotificationManager mNotificationManager;    private HashMap<Long, Im.ProviderSettings.QueryMap> mSettings;    private Handler mHandler;    private HashMap<Long, NotificationInfo> mNotificationInfos;    public StatusBarNotifier(Context context) {        mContext = context;        mNotificationManager = (NotificationManager) context.getSystemService(                Context.NOTIFICATION_SERVICE);        mSettings = new HashMap<Long, Im.ProviderSettings.QueryMap>();        mHandler = new Handler();        mNotificationInfos = new HashMap<Long, NotificationInfo>();    }    public void onServiceStop() {        for(Im.ProviderSettings.QueryMap queryMap : mSettings.values()) {            queryMap.close();        }    }    public void notifyChat(long providerId, long accountId, long chatId,            String username, String nickname, String msg) {        if (!isNotificationEnabled(providerId)) {            if (DBG) log("notification for chat " + username + " is not enabled");            return;        }        String title = nickname;        String snippet = nickname + ": " + msg;        Intent intent = new Intent(Intent.ACTION_VIEW,                ContentUris.withAppendedId(Im.Chats.CONTENT_URI, chatId));        notify(username, title, snippet, msg, providerId, accountId, intent);    }    public void notifySubscriptionRequest(long providerId, long accountId,            long contactId, String username, String nickname) {        if (!isNotificationEnabled(providerId)) {            if (DBG) log("notification for subscription request " + username + " is not enabled");            return;        }        String title = nickname;        String message = mContext.getString(R.string.subscription_notify_text, nickname);        Intent intent = new Intent(ImServiceConstants.ACTION_MANAGE_SUBSCRIPTION,                ContentUris.withAppendedId(Im.Contacts.CONTENT_URI, contactId));        intent.putExtra(ImServiceConstants.EXTRA_INTENT_PROVIDER_ID, providerId);        intent.putExtra(ImServiceConstants.EXTRA_INTENT_FROM_ADDRESS, username);        notify(username, title, message, message, providerId, accountId, intent);    }    public void notifyGroupInvitation(long providerId, long accountId,            long invitationId, String username) {        Intent intent = new Intent(Intent.ACTION_VIEW,                ContentUris.withAppendedId(Im.Invitation.CONTENT_URI, invitationId));        String title = mContext.getString(R.string.notify_groupchat_label);        String message = mContext.getString(                R.string.group_chat_invite_notify_text, username);        notify(username, title, message, message, providerId, accountId, intent);    }    public void dismissNotifications(long providerId) {        synchronized (mNotificationInfos) {            NotificationInfo info = mNotificationInfos.get(providerId);            if (info != null) {                mNotificationManager.cancel(info.computeNotificationId());                mNotificationInfos.remove(providerId);            }        }    }    public void dismissChatNotification(long providerId, String username) {        NotificationInfo info;        boolean removed;        synchronized (mNotificationInfos) {            info = mNotificationInfos.get(providerId);            if (info == null) {                return;            }            removed = info.removeItem(username);        }        if (removed) {            if (info.getMessage() == null) {                if (DBG) log("dismissChatNotification: removed notification for " + providerId);                mNotificationManager.cancel(info.computeNotificationId());            } else {                if (DBG) {                    log("cancelNotify: new notification" +                            " mTitle=" + info.getTitle() +                            " mMessage=" + info.getMessage() +                            " mIntent=" + info.getIntent());                }                mNotificationManager.notify(info.computeNotificationId(),                        info.createNotification(""));            }        }    }    private Im.ProviderSettings.QueryMap getProviderSettings(long providerId) {        Im.ProviderSettings.QueryMap res = mSettings.get(providerId);        if (res == null) {            res = new Im.ProviderSettings.QueryMap(mContext.getContentResolver(),                    providerId, true, mHandler);            mSettings.put(providerId, res);        }        return res;    }    private boolean isNotificationEnabled(long providerId) {        Im.ProviderSettings.QueryMap settings = getProviderSettings(providerId);        return settings.getEnableNotification();    }    private void notify(String sender, String title, String tickerText, String message,            long providerId, long accountId, Intent intent) {        NotificationInfo info;        synchronized (mNotificationInfos) {            info = mNotificationInfos.get(providerId);            if (info == null) {                info = new NotificationInfo(providerId, accountId);                mNotificationInfos.put(providerId, info);            }            info.addItem(sender, title, message, intent);        }        mNotificationManager.notify(info.computeNotificationId(),                info.createNotification(tickerText));    }    private void setRinger(long providerId, Notification notification) {        Im.ProviderSettings.QueryMap settings = getProviderSettings(providerId);        String ringtoneUri = settings.getRingtoneURI();        boolean vibrate = settings.getVibrate();        notification.sound = TextUtils.isEmpty(ringtoneUri) ? null : Uri.parse(ringtoneUri);        if (DBG) log("setRinger: notification.sound = " + notification.sound);        if (vibrate) {            notification.defaults |= Notification.DEFAULT_VIBRATE;            if (DBG) log("setRinger: defaults |= vibrate");        }    }    class NotificationInfo {        class Item {            String mTitle;            String mMessage;            Intent mIntent;            public Item(String title, String message, Intent intent) {                mTitle = title;                mMessage = message;                mIntent = intent;            }        }        private HashMap<String, Item> mItems;        private long mProviderId;        private long mAccountId;        public NotificationInfo(long providerId, long accountId) {            mProviderId = providerId;            mAccountId = accountId;            mItems = new HashMap<String, Item>();        }        public int computeNotificationId() {            return (int)mProviderId;        }        public synchronized void addItem(String sender, String title, String message, Intent intent) {            Item item = mItems.get(sender);            if (item == null) {                item = new Item(title, message, intent);                mItems.put(sender, item);            } else {                item.mTitle = title;                item.mMessage = message;                item.mIntent = intent;            }        }        public synchronized boolean removeItem(String sender) {            Item item =  mItems.remove(sender);            if (item != null) {                return true;            }            return false;        }        public Notification createNotification(String tickerText) {            Notification notification = new Notification(                    android.R.drawable.stat_notify_chat,                    tickerText, System.currentTimeMillis());            Intent intent = getIntent();            notification.setLatestEventInfo(mContext, getTitle(), getMessage(),                    PendingIntent.getActivity(mContext, 0, intent, 0));            notification.flags |= Notification.FLAG_AUTO_CANCEL;            setRinger(mProviderId, notification);            return notification;        }        private Intent getDefaultIntent() {            Intent intent = new Intent(Intent.ACTION_VIEW);            intent.setType(Im.Contacts.CONTENT_TYPE);            intent.setClass(mContext, ContactListActivity.class);            intent.putExtra(ImServiceConstants.EXTRA_INTENT_ACCOUNT_ID, mAccountId);            return intent;        }        public String getTitle() {            int count = mItems.size();            if (count == 0) {                return null;            } else if (count == 1) {                Item item = mItems.values().iterator().next();                return item.mTitle;            } else {                return mContext.getString(R.string.newMessages_label,                        Im.Provider.getProviderNameForId(mContext.getContentResolver(), mProviderId));            }        }        public String getMessage() {            int count = mItems.size();            if (count == 0) {                return null;            } else if (count == 1) {                Item item = mItems.values().iterator().next();                return item.mMessage;            } else {                return mContext.getString(R.string.num_unread_chats, count);            }        }        public Intent getIntent() {            int count = mItems.size();            if (count == 1) {            Item item = mItems.values().iterator().next();                return item.mIntent;            } else {                return getDefaultIntent();            }        }    }    private static void log(String msg) {        Log.d(RemoteImService.TAG, "[StatusBarNotify] " + msg);    }}

⌨️ 快捷键说明

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