From f153bf42918a16e010f0d756c8ee6434440dc3ea Mon Sep 17 00:00:00 2001 From: Nancy Chen Date: Wed, 6 May 2015 19:29:56 -0700 Subject: Mark voicemails as old after they are read. Currently when voicemails are marked as read, they are not also marked as old ("new" set to 0). This means that when the phone is restarted, the voicemails come back in the notifications bar even if they have been read. Also ensure the voicemail notification is dismissed when the "play" button is pressed. Currently the voicemail is marked as old, but the notifications are not immediately updated so there's no instant feedback. I split the markNewVoicemailsAsOld method from CallLogQueryHandler out into a separate handler (VoicemailQueryHandler) because the markNewVoicemailsAsOld method did not share any notable logic with CallLogQueryHandler and would otherwise require creating two extra constructors. Bug: 20117483 Change-Id: I0f475e1a1489f1b45c8654f5ca882ccd857466e8 --- src/com/android/dialer/CallDetailActivity.java | 4 ++ .../calllog/CallLogNotificationsService.java | 7 ++- .../dialer/calllog/CallLogQueryHandler.java | 30 ++-------- .../dialer/calllog/VoicemailQueryHandler.java | 69 ++++++++++++++++++++++ 4 files changed, 82 insertions(+), 28 deletions(-) create mode 100644 src/com/android/dialer/calllog/VoicemailQueryHandler.java (limited to 'src') diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java index dbcfa64af..7a23944a0 100644 --- a/src/com/android/dialer/CallDetailActivity.java +++ b/src/com/android/dialer/CallDetailActivity.java @@ -55,6 +55,7 @@ import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest; import com.android.contacts.common.GeoUtil; import com.android.contacts.common.CallUtil; import com.android.dialer.calllog.CallDetailHistoryAdapter; +import com.android.dialer.calllog.CallLogNotificationsService; import com.android.dialer.calllog.CallTypeHelper; import com.android.dialer.calllog.ContactInfo; import com.android.dialer.calllog.ContactInfoHelper; @@ -280,6 +281,9 @@ public class CallDetailActivity extends Activity implements ProximitySensorAware values.put(Voicemails.IS_READ, true); getContentResolver().update(voicemailUri, values, Voicemails.IS_READ + " = 0", null); + Intent intent = new Intent(getBaseContext(), CallLogNotificationsService.class); + intent.setAction(CallLogNotificationsService.ACTION_MARK_NEW_VOICEMAILS_AS_OLD); + getBaseContext().startService(intent); return null; } }); diff --git a/src/com/android/dialer/calllog/CallLogNotificationsService.java b/src/com/android/dialer/calllog/CallLogNotificationsService.java index ccd933542..2e0e50258 100644 --- a/src/com/android/dialer/calllog/CallLogNotificationsService.java +++ b/src/com/android/dialer/calllog/CallLogNotificationsService.java @@ -56,7 +56,7 @@ public class CallLogNotificationsService extends IntentService { */ public static final String EXTRA_NEW_VOICEMAIL_URI = "NEW_VOICEMAIL_URI"; - private CallLogQueryHandler mCallLogQueryHandler; + private VoicemailQueryHandler mVoicemailQueryHandler; public CallLogNotificationsService() { super("CallLogNotificationsService"); @@ -65,7 +65,7 @@ public class CallLogNotificationsService extends IntentService { @Override public void onCreate() { super.onCreate(); - mCallLogQueryHandler = new CallLogQueryHandler(getContentResolver(), null /*listener*/); + mVoicemailQueryHandler = new VoicemailQueryHandler(this, getContentResolver()); } @Override @@ -74,8 +74,9 @@ public class CallLogNotificationsService extends IntentService { Log.d(TAG, "onHandleIntent: could not handle null intent"); return; } + if (ACTION_MARK_NEW_VOICEMAILS_AS_OLD.equals(intent.getAction())) { - mCallLogQueryHandler.markNewVoicemailsAsOld(); + mVoicemailQueryHandler.markNewVoicemailsAsOld(); } else if (ACTION_UPDATE_NOTIFICATIONS.equals(intent.getAction())) { Uri voicemailUri = (Uri) intent.getParcelableExtra(EXTRA_NEW_VOICEMAIL_URI); DefaultVoicemailNotifier.getInstance(this).updateNotification(voicemailUri); diff --git a/src/com/android/dialer/calllog/CallLogQueryHandler.java b/src/com/android/dialer/calllog/CallLogQueryHandler.java index 761c8e08c..7eb5f8a0b 100644 --- a/src/com/android/dialer/calllog/CallLogQueryHandler.java +++ b/src/com/android/dialer/calllog/CallLogQueryHandler.java @@ -20,8 +20,6 @@ import android.content.AsyncQueryHandler; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; -import android.database.MatrixCursor; -import android.database.MergeCursor; import android.database.sqlite.SQLiteDatabaseCorruptException; import android.database.sqlite.SQLiteDiskIOException; import android.database.sqlite.SQLiteException; @@ -35,7 +33,6 @@ import android.provider.VoicemailContract.Status; import android.provider.VoicemailContract.Voicemails; import android.util.Log; -import com.android.common.io.MoreCloseables; import com.android.contacts.common.database.NoNullCursorAsyncQueryHandler; import com.android.dialer.voicemail.VoicemailStatusHelperImpl; @@ -55,12 +52,10 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler { private static final int QUERY_CALLLOG_TOKEN = 54; /** The token for the query to mark all missed calls as old after seeing the call log. */ private static final int UPDATE_MARK_AS_OLD_TOKEN = 55; - /** The token for the query to mark all new voicemails as old. */ - private static final int UPDATE_MARK_VOICEMAILS_AS_OLD_TOKEN = 56; /** The token for the query to mark all missed calls as read after seeing the call log. */ - private static final int UPDATE_MARK_MISSED_CALL_AS_READ_TOKEN = 57; + private static final int UPDATE_MARK_MISSED_CALL_AS_READ_TOKEN = 56; /** The token for the query to fetch voicemail status messages. */ - private static final int QUERY_VOICEMAIL_STATUS_TOKEN = 58; + private static final int QUERY_VOICEMAIL_STATUS_TOKEN = 57; private final int mLogLimit; @@ -195,22 +190,6 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler { values, where.toString(), null); } - /** Updates all new voicemails to mark them as old. */ - public void markNewVoicemailsAsOld() { - // Mark all "new" voicemails as not new anymore. - StringBuilder where = new StringBuilder(); - where.append(Calls.NEW); - where.append(" = 1 AND "); - where.append(Calls.TYPE); - where.append(" = ?"); - - ContentValues values = new ContentValues(1); - values.put(Calls.NEW, "0"); - - startUpdate(UPDATE_MARK_VOICEMAILS_AS_OLD_TOKEN, null, Calls.CONTENT_URI_WITH_VOICEMAIL, - values, where.toString(), new String[]{ Integer.toString(Calls.VOICEMAIL_TYPE) }); - } - /** Updates all missed calls to mark them as read. */ public void markMissedCallsAsRead() { // Mark all "new" calls as not new anymore. @@ -227,7 +206,8 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler { } @Override - protected synchronized void onNotNullableQueryComplete(int token, Object cookie, Cursor cursor) { + protected synchronized void onNotNullableQueryComplete(int token, Object cookie, + Cursor cursor) { if (cursor == null) { return; } @@ -274,7 +254,7 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler { void onVoicemailStatusFetched(Cursor statusCursor); /** - * Called when {@link CallLogQueryHandler#fetchCalls(int)}complete. + * Called when {@link CallLogQueryHandler#fetchCalls(int)} complete. * Returns true if takes ownership of cursor. */ boolean onCallsFetched(Cursor combinedCursor); diff --git a/src/com/android/dialer/calllog/VoicemailQueryHandler.java b/src/com/android/dialer/calllog/VoicemailQueryHandler.java new file mode 100644 index 000000000..26f9bd172 --- /dev/null +++ b/src/com/android/dialer/calllog/VoicemailQueryHandler.java @@ -0,0 +1,69 @@ +/* + * 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.content.AsyncQueryHandler; +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.provider.CallLog.Calls; +import android.util.Log; + +/** + * Handles asynchronous queries to the call log for voicemail. + */ +public class VoicemailQueryHandler extends AsyncQueryHandler { + private static final String TAG = "VoicemailQueryHandler"; + + /** The token for the query to mark all new voicemails as old. */ + private static final int UPDATE_MARK_VOICEMAILS_AS_OLD_TOKEN = 50; + private Context mContext; + + public VoicemailQueryHandler(Context context, ContentResolver contentResolver) { + super(contentResolver); + mContext = context; + } + + /** Updates all new voicemails to mark them as old. */ + public void markNewVoicemailsAsOld() { + // Mark all "new" voicemails as not new anymore. + StringBuilder where = new StringBuilder(); + where.append(Calls.NEW); + where.append(" = 1 AND "); + where.append(Calls.TYPE); + where.append(" = ?"); + + ContentValues values = new ContentValues(1); + values.put(Calls.NEW, "0"); + + startUpdate(UPDATE_MARK_VOICEMAILS_AS_OLD_TOKEN, null, Calls.CONTENT_URI_WITH_VOICEMAIL, + values, where.toString(), new String[]{ Integer.toString(Calls.VOICEMAIL_TYPE) }); + } + + @Override + protected void onUpdateComplete(int token, Object cookie, int result) { + if (token == UPDATE_MARK_VOICEMAILS_AS_OLD_TOKEN) { + if (mContext != null) { + Intent serviceIntent = new Intent(mContext, CallLogNotificationsService.class); + serviceIntent.setAction(CallLogNotificationsService.ACTION_UPDATE_NOTIFICATIONS); + mContext.startService(serviceIntent); + } else { + Log.w(TAG, "Unknown update completed: ignoring: " + token); + } + } + } +} -- cgit v1.2.3