/* * Copyright (C) 2011 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.dialer.calllog; import android.app.IntentService; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.util.Log; import com.android.contacts.common.util.PermissionsUtil; import com.android.dialer.util.TelecomUtil; /** * Provides operations for managing call-related notifications. *

* It handles the following actions: *

*/ public class CallLogNotificationsService extends IntentService { private static final String TAG = "CallLogNotificationsService"; /** Action to mark all the new voicemails as old. */ public static final String ACTION_MARK_NEW_VOICEMAILS_AS_OLD = "com.android.dialer.calllog.ACTION_MARK_NEW_VOICEMAILS_AS_OLD"; /** * Action to update voicemail notifications. *

* May include an optional extra {@link #EXTRA_NEW_VOICEMAIL_URI}. */ public static final String ACTION_UPDATE_VOICEMAIL_NOTIFICATIONS = "com.android.dialer.calllog.UPDATE_VOICEMAIL_NOTIFICATIONS"; /** * Extra to included with {@link #ACTION_UPDATE_VOICEMAIL_NOTIFICATIONS} to identify the new * voicemail that triggered an update. *

* It must be a {@link Uri}. */ public static final String EXTRA_NEW_VOICEMAIL_URI = "NEW_VOICEMAIL_URI"; /** * Action to update the missed call notifications. *

* Includes optional extras {@link #EXTRA_MISSED_CALL_NUMBER} and * {@link #EXTRA_MISSED_CALL_COUNT}. */ public static final String ACTION_UPDATE_MISSED_CALL_NOTIFICATIONS = "com.android.dialer.calllog.UPDATE_MISSED_CALL_NOTIFICATIONS"; /** Action to mark all the new missed calls as old. */ public static final String ACTION_MARK_NEW_MISSED_CALLS_AS_OLD = "com.android.dialer.calllog.ACTION_MARK_NEW_MISSED_CALLS_AS_OLD"; /** Action to call back a missed call. */ public static final String ACTION_CALL_BACK_FROM_MISSED_CALL_NOTIFICATION = "com.android.dialer.calllog.CALL_BACK_FROM_MISSED_CALL_NOTIFICATION"; public static final String ACTION_SEND_SMS_FROM_MISSED_CALL_NOTIFICATION = "com.android.dialer.calllog.SEND_SMS_FROM_MISSED_CALL_NOTIFICATION"; /** * Extra to be included with {@link #ACTION_UPDATE_MISSED_CALL_NOTIFICATIONS}, * {@link #ACTION_SEND_SMS_FROM_MISSED_CALL_NOTIFICATION} and * {@link #ACTION_CALL_BACK_FROM_MISSED_CALL_NOTIFICATION} to identify the number to display, * call or text back. *

* It must be a {@link String}. */ public static final String EXTRA_MISSED_CALL_NUMBER = "MISSED_CALL_NUMBER"; /** * Extra to be included with {@link #ACTION_UPDATE_MISSED_CALL_NOTIFICATIONS} to represent the * number of missed calls. *

* It must be a {@link Integer} */ public static final String EXTRA_MISSED_CALL_COUNT = "MISSED_CALL_COUNT"; public static final int UNKNOWN_MISSED_CALL_COUNT = -1; private VoicemailQueryHandler mVoicemailQueryHandler; public CallLogNotificationsService() { super("CallLogNotificationsService"); } @Override protected void onHandleIntent(Intent intent) { if (intent == null) { Log.d(TAG, "onHandleIntent: could not handle null intent"); return; } if (!PermissionsUtil.hasPermission(this, android.Manifest.permission.READ_CALL_LOG)) { return; } String action = intent.getAction(); switch (action) { case ACTION_MARK_NEW_VOICEMAILS_AS_OLD: if (mVoicemailQueryHandler == null) { mVoicemailQueryHandler = new VoicemailQueryHandler(this, getContentResolver()); } mVoicemailQueryHandler.markNewVoicemailsAsOld(); break; case ACTION_UPDATE_VOICEMAIL_NOTIFICATIONS: Uri voicemailUri = (Uri) intent.getParcelableExtra(EXTRA_NEW_VOICEMAIL_URI); DefaultVoicemailNotifier.getInstance(this).updateNotification(voicemailUri); break; case ACTION_UPDATE_MISSED_CALL_NOTIFICATIONS: int count = intent.getIntExtra(EXTRA_MISSED_CALL_COUNT, UNKNOWN_MISSED_CALL_COUNT); String number = intent.getStringExtra(EXTRA_MISSED_CALL_NUMBER); MissedCallNotifier.getInstance(this).updateMissedCallNotification(count, number); break; case ACTION_MARK_NEW_MISSED_CALLS_AS_OLD: CallLogNotificationsHelper.removeMissedCallNotifications(this); break; case ACTION_CALL_BACK_FROM_MISSED_CALL_NOTIFICATION: MissedCallNotifier.getInstance(this).callBackFromMissedCall( intent.getStringExtra(EXTRA_MISSED_CALL_NUMBER)); break; case ACTION_SEND_SMS_FROM_MISSED_CALL_NOTIFICATION: MissedCallNotifier.getInstance(this).sendSmsFromMissedCall( intent.getStringExtra(EXTRA_MISSED_CALL_NUMBER)); break; default: Log.d(TAG, "onHandleIntent: could not handle: " + intent); break; } } /** * Updates notifications for any new voicemails. * * @param context a valid context. * @param voicemailUri The uri pointing to the voicemail to update the notification for. If * {@code null}, then notifications for all new voicemails will be updated. */ public static void updateVoicemailNotifications(Context context, Uri voicemailUri) { if (TelecomUtil.hasReadWriteVoicemailPermissions(context)) { Intent serviceIntent = new Intent(context, CallLogNotificationsService.class); serviceIntent.setAction( CallLogNotificationsService.ACTION_UPDATE_VOICEMAIL_NOTIFICATIONS); // If voicemailUri is null, then notifications for all voicemails will be updated. if (voicemailUri != null) { serviceIntent.putExtra( CallLogNotificationsService.EXTRA_NEW_VOICEMAIL_URI, voicemailUri); } context.startService(serviceIntent); } } /** * Updates notifications for any new missed calls. * * @param context A valid context. * @param count The number of new missed calls. * @param number The phone number of the newest missed call. */ public static void updateMissedCallNotifications(Context context, int count, String number) { Intent serviceIntent = new Intent(context, CallLogNotificationsService.class); serviceIntent.setAction( CallLogNotificationsService.ACTION_UPDATE_MISSED_CALL_NOTIFICATIONS); serviceIntent.putExtra(EXTRA_MISSED_CALL_COUNT, count); serviceIntent.putExtra(EXTRA_MISSED_CALL_NUMBER, number); context.startService(serviceIntent); } }