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

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.service;
  18. import java.util.HashMap;
  19. import android.app.Notification;
  20. import android.app.NotificationManager;
  21. import android.app.PendingIntent;
  22. import android.content.ContentUris;
  23. import android.content.Context;
  24. import android.content.Intent;
  25. import android.net.Uri;
  26. import android.os.Handler;
  27. import android.provider.Im;
  28. import android.text.TextUtils;
  29. import android.util.Log;
  30. import com.android.im.R;
  31. import com.android.im.app.ContactListActivity;
  32. public class StatusBarNotifier {
  33.     private static final boolean DBG = true;
  34.     static final long[] VIBRATE_PATTERN = new long[] {0, 250, 250, 250};
  35.     private Context mContext;
  36.     private NotificationManager mNotificationManager;
  37.     private HashMap<Long, Im.ProviderSettings.QueryMap> mSettings;
  38.     private Handler mHandler;
  39.     private HashMap<Long, NotificationInfo> mNotificationInfos;
  40.     public StatusBarNotifier(Context context) {
  41.         mContext = context;
  42.         mNotificationManager = (NotificationManager) context.getSystemService(
  43.                 Context.NOTIFICATION_SERVICE);
  44.         mSettings = new HashMap<Long, Im.ProviderSettings.QueryMap>();
  45.         mHandler = new Handler();
  46.         mNotificationInfos = new HashMap<Long, NotificationInfo>();
  47.     }
  48.     public void onServiceStop() {
  49.         for(Im.ProviderSettings.QueryMap queryMap : mSettings.values()) {
  50.             queryMap.close();
  51.         }
  52.     }
  53.     public void notifyChat(long providerId, long accountId, long chatId,
  54.             String username, String nickname, String msg) {
  55.         if (!isNotificationEnabled(providerId)) {
  56.             if (DBG) log("notification for chat " + username + " is not enabled");
  57.             return;
  58.         }
  59.         String title = nickname;
  60.         String snippet = nickname + ": " + msg;
  61.         Intent intent = new Intent(Intent.ACTION_VIEW,
  62.                 ContentUris.withAppendedId(Im.Chats.CONTENT_URI, chatId));
  63.         notify(username, title, snippet, msg, providerId, accountId, intent);
  64.     }
  65.     public void notifySubscriptionRequest(long providerId, long accountId,
  66.             long contactId, String username, String nickname) {
  67.         if (!isNotificationEnabled(providerId)) {
  68.             if (DBG) log("notification for subscription request " + username + " is not enabled");
  69.             return;
  70.         }
  71.         String title = nickname;
  72.         String message = mContext.getString(R.string.subscription_notify_text, nickname);
  73.         Intent intent = new Intent(ImServiceConstants.ACTION_MANAGE_SUBSCRIPTION,
  74.                 ContentUris.withAppendedId(Im.Contacts.CONTENT_URI, contactId));
  75.         intent.putExtra(ImServiceConstants.EXTRA_INTENT_PROVIDER_ID, providerId);
  76.         intent.putExtra(ImServiceConstants.EXTRA_INTENT_FROM_ADDRESS, username);
  77.         notify(username, title, message, message, providerId, accountId, intent);
  78.     }
  79.     public void notifyGroupInvitation(long providerId, long accountId,
  80.             long invitationId, String username) {
  81.         Intent intent = new Intent(Intent.ACTION_VIEW,
  82.                 ContentUris.withAppendedId(Im.Invitation.CONTENT_URI, invitationId));
  83.         String title = mContext.getString(R.string.notify_groupchat_label);
  84.         String message = mContext.getString(
  85.                 R.string.group_chat_invite_notify_text, username);
  86.         notify(username, title, message, message, providerId, accountId, intent);
  87.     }
  88.     public void dismissNotifications(long providerId) {
  89.         synchronized (mNotificationInfos) {
  90.             NotificationInfo info = mNotificationInfos.get(providerId);
  91.             if (info != null) {
  92.                 mNotificationManager.cancel(info.computeNotificationId());
  93.                 mNotificationInfos.remove(providerId);
  94.             }
  95.         }
  96.     }
  97.     public void dismissChatNotification(long providerId, String username) {
  98.         NotificationInfo info;
  99.         boolean removed;
  100.         synchronized (mNotificationInfos) {
  101.             info = mNotificationInfos.get(providerId);
  102.             if (info == null) {
  103.                 return;
  104.             }
  105.             removed = info.removeItem(username);
  106.         }
  107.         if (removed) {
  108.             if (info.getMessage() == null) {
  109.                 if (DBG) log("dismissChatNotification: removed notification for " + providerId);
  110.                 mNotificationManager.cancel(info.computeNotificationId());
  111.             } else {
  112.                 if (DBG) {
  113.                     log("cancelNotify: new notification" +
  114.                             " mTitle=" + info.getTitle() +
  115.                             " mMessage=" + info.getMessage() +
  116.                             " mIntent=" + info.getIntent());
  117.                 }
  118.                 mNotificationManager.notify(info.computeNotificationId(),
  119.                         info.createNotification(""));
  120.             }
  121.         }
  122.     }
  123.     private Im.ProviderSettings.QueryMap getProviderSettings(long providerId) {
  124.         Im.ProviderSettings.QueryMap res = mSettings.get(providerId);
  125.         if (res == null) {
  126.             res = new Im.ProviderSettings.QueryMap(mContext.getContentResolver(),
  127.                     providerId, true, mHandler);
  128.             mSettings.put(providerId, res);
  129.         }
  130.         return res;
  131.     }
  132.     private boolean isNotificationEnabled(long providerId) {
  133.         Im.ProviderSettings.QueryMap settings = getProviderSettings(providerId);
  134.         return settings.getEnableNotification();
  135.     }
  136.     private void notify(String sender, String title, String tickerText, String message,
  137.             long providerId, long accountId, Intent intent) {
  138.         NotificationInfo info;
  139.         synchronized (mNotificationInfos) {
  140.             info = mNotificationInfos.get(providerId);
  141.             if (info == null) {
  142.                 info = new NotificationInfo(providerId, accountId);
  143.                 mNotificationInfos.put(providerId, info);
  144.             }
  145.             info.addItem(sender, title, message, intent);
  146.         }
  147.         mNotificationManager.notify(info.computeNotificationId(),
  148.                 info.createNotification(tickerText));
  149.     }
  150.     private void setRinger(long providerId, Notification notification) {
  151.         Im.ProviderSettings.QueryMap settings = getProviderSettings(providerId);
  152.         String ringtoneUri = settings.getRingtoneURI();
  153.         boolean vibrate = settings.getVibrate();
  154.         notification.sound = TextUtils.isEmpty(ringtoneUri) ? null : Uri.parse(ringtoneUri);
  155.         if (DBG) log("setRinger: notification.sound = " + notification.sound);
  156.         if (vibrate) {
  157.             notification.defaults |= Notification.DEFAULT_VIBRATE;
  158.             if (DBG) log("setRinger: defaults |= vibrate");
  159.         }
  160.     }
  161.     class NotificationInfo {
  162.         class Item {
  163.             String mTitle;
  164.             String mMessage;
  165.             Intent mIntent;
  166.             public Item(String title, String message, Intent intent) {
  167.                 mTitle = title;
  168.                 mMessage = message;
  169.                 mIntent = intent;
  170.             }
  171.         }
  172.         private HashMap<String, Item> mItems;
  173.         private long mProviderId;
  174.         private long mAccountId;
  175.         public NotificationInfo(long providerId, long accountId) {
  176.             mProviderId = providerId;
  177.             mAccountId = accountId;
  178.             mItems = new HashMap<String, Item>();
  179.         }
  180.         public int computeNotificationId() {
  181.             return (int)mProviderId;
  182.         }
  183.         public synchronized void addItem(String sender, String title, String message, Intent intent) {
  184.             Item item = mItems.get(sender);
  185.             if (item == null) {
  186.                 item = new Item(title, message, intent);
  187.                 mItems.put(sender, item);
  188.             } else {
  189.                 item.mTitle = title;
  190.                 item.mMessage = message;
  191.                 item.mIntent = intent;
  192.             }
  193.         }
  194.         public synchronized boolean removeItem(String sender) {
  195.             Item item =  mItems.remove(sender);
  196.             if (item != null) {
  197.                 return true;
  198.             }
  199.             return false;
  200.         }
  201.         public Notification createNotification(String tickerText) {
  202.             Notification notification = new Notification(
  203.                     android.R.drawable.stat_notify_chat,
  204.                     tickerText, System.currentTimeMillis());
  205.             Intent intent = getIntent();
  206.             notification.setLatestEventInfo(mContext, getTitle(), getMessage(),
  207.                     PendingIntent.getActivity(mContext, 0, intent, 0));
  208.             notification.flags |= Notification.FLAG_AUTO_CANCEL;
  209.             setRinger(mProviderId, notification);
  210.             return notification;
  211.         }
  212.         private Intent getDefaultIntent() {
  213.             Intent intent = new Intent(Intent.ACTION_VIEW);
  214.             intent.setType(Im.Contacts.CONTENT_TYPE);
  215.             intent.setClass(mContext, ContactListActivity.class);
  216.             intent.putExtra(ImServiceConstants.EXTRA_INTENT_ACCOUNT_ID, mAccountId);
  217.             return intent;
  218.         }
  219.         public String getTitle() {
  220.             int count = mItems.size();
  221.             if (count == 0) {
  222.                 return null;
  223.             } else if (count == 1) {
  224.                 Item item = mItems.values().iterator().next();
  225.                 return item.mTitle;
  226.             } else {
  227.                 return mContext.getString(R.string.newMessages_label,
  228.                         Im.Provider.getProviderNameForId(mContext.getContentResolver(), mProviderId));
  229.             }
  230.         }
  231.         public String getMessage() {
  232.             int count = mItems.size();
  233.             if (count == 0) {
  234.                 return null;
  235.             } else if (count == 1) {
  236.                 Item item = mItems.values().iterator().next();
  237.                 return item.mMessage;
  238.             } else {
  239.                 return mContext.getString(R.string.num_unread_chats, count);
  240.             }
  241.         }
  242.         public Intent getIntent() {
  243.             int count = mItems.size();
  244.             if (count == 1) {
  245.             Item item = mItems.values().iterator().next();
  246.                 return item.mIntent;
  247.             } else {
  248.                 return getDefaultIntent();
  249.             }
  250.         }
  251.     }
  252.     private static void log(String msg) {
  253.         Log.d(RemoteImService.TAG, "[StatusBarNotify] " + msg);
  254.     }
  255. }