1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/* 2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2011 The Android Open Source Project 3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License. 6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at 7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and 14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License. 15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.dialer.app.calllog; 17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.AsyncQueryHandler; 19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.ContentResolver; 20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.ContentValues; 21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.Context; 22d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.net.Uri; 23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.CallLog.Calls; 249050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanianimport android.support.annotation.MainThread; 252f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport android.support.annotation.NonNull; 26d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.support.annotation.Nullable; 272f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport android.support.annotation.WorkerThread; 289050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanianimport com.android.dialer.common.Assert; 292f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport com.android.dialer.common.LogUtil; 302f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport com.android.dialer.common.concurrent.ThreadUtil; 31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** Handles asynchronous queries to the call log for voicemail. */ 33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class VoicemailQueryHandler extends AsyncQueryHandler { 34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** The token for the query to mark all new voicemails as old. */ 36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static final int UPDATE_MARK_VOICEMAILS_AS_OLD_TOKEN = 50; 37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 389050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian @MainThread 392f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian private VoicemailQueryHandler(ContentResolver contentResolver) { 40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian super(contentResolver); 419050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian Assert.isMainThread(); 422f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian } 432f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian 442f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian @WorkerThread 452f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian public static void markAllNewVoicemailsAsRead(final @NonNull Context context) { 462f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian ThreadUtil.postOnUiThread( 472f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian () -> { 482f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian new VoicemailQueryHandler(context.getContentResolver()).markNewVoicemailsAsOld(null); 492f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian }); 502f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian } 512f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian 522f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian @WorkerThread 532f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian public static void markSingleNewVoicemailAsRead( 542f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian final @NonNull Context context, final Uri voicemailUri) { 552f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian if (voicemailUri == null) { 562f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian LogUtil.e("VoicemailQueryHandler.markSingleNewVoicemailAsRead", "voicemail URI is null"); 572f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian return; 582f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian } 592f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian ThreadUtil.postOnUiThread( 602f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian () -> { 612f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian new VoicemailQueryHandler(context.getContentResolver()) 622f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian .markNewVoicemailsAsOld(voicemailUri); 632f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian }); 64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** Updates all new voicemails to mark them as old. */ 672f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian private void markNewVoicemailsAsOld(@Nullable Uri voicemailUri) { 68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // Mark all "new" voicemails as not new anymore. 69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian StringBuilder where = new StringBuilder(); 70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian where.append(Calls.NEW); 71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian where.append(" = 1 AND "); 72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian where.append(Calls.TYPE); 73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian where.append(" = ?"); 74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 75d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (voicemailUri != null) { 76d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian where.append(" AND ").append(Calls.VOICEMAIL_URI).append(" = ?"); 77d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 78d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ContentValues values = new ContentValues(1); 80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian values.put(Calls.NEW, "0"); 81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian startUpdate( 83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian UPDATE_MARK_VOICEMAILS_AS_OLD_TOKEN, 84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian null, 85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Calls.CONTENT_URI_WITH_VOICEMAIL, 86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian values, 87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian where.toString(), 88d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian voicemailUri == null 89d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian ? new String[] {Integer.toString(Calls.VOICEMAIL_TYPE)} 90d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian : new String[] {Integer.toString(Calls.VOICEMAIL_TYPE), voicemailUri.toString()}); 91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian} 93