| /* |
| * Copyright (C) 2017 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.databasepopulator; |
| |
| import android.content.ComponentName; |
| import android.content.ContentValues; |
| import android.content.Context; |
| import android.os.Build.VERSION; |
| import android.os.Build.VERSION_CODES; |
| import android.provider.VoicemailContract.Status; |
| import android.provider.VoicemailContract.Voicemails; |
| import android.support.annotation.NonNull; |
| import android.support.annotation.VisibleForTesting; |
| import android.support.annotation.WorkerThread; |
| import android.telecom.PhoneAccountHandle; |
| import com.android.dialer.common.Assert; |
| import com.google.auto.value.AutoValue; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| import java.util.concurrent.TimeUnit; |
| |
| /** Populates the device database with voicemail entries. */ |
| public final class VoicemailPopulator { |
| private static final String ACCOUNT_ID = "ACCOUNT_ID"; |
| private static String componentName = ""; |
| private static final Voicemail.Builder[] SIMPLE_VOICEMAILS = { |
| // Long transcription with an embedded phone number. |
| Voicemail.builder() |
| .setPhoneNumber("+1-302-6365454") |
| .setTranscription( |
| "Hi, this is a very long voicemail. Please call me back at 650 253 0000. " |
| + "I hope you listen to all of it. This is very important. " |
| + "Hi, this is a very long voicemail. " |
| + "I hope you listen to all of it. It's very important.") |
| .setPhoneAccountComponentName(componentName) |
| .setDurationSeconds(10) |
| .setIsRead(false), |
| // RTL transcription. |
| Voicemail.builder() |
| .setPhoneNumber("+1-302-6365454") |
| .setTranscription("هزاران دوست کم اند و یک دشمن زیاد") |
| .setDurationSeconds(60) |
| .setPhoneAccountComponentName(componentName) |
| .setIsRead(true), |
| // Empty number. |
| Voicemail.builder() |
| .setPhoneNumber("") |
| .setTranscription("") |
| .setDurationSeconds(60) |
| .setPhoneAccountComponentName(componentName) |
| .setIsRead(true), |
| // No duration. |
| Voicemail.builder() |
| .setPhoneNumber("+1-302-6365454") |
| .setTranscription("") |
| .setDurationSeconds(0) |
| .setPhoneAccountComponentName(componentName) |
| .setIsRead(true), |
| }; |
| |
| @WorkerThread |
| public static void populateVoicemail(@NonNull Context context, boolean fastMode) { |
| Assert.isWorkerThread(); |
| enableVoicemail(context); |
| List<Voicemail.Builder> voicemails = new ArrayList<>(); |
| if (fastMode) { |
| voicemails.add(SIMPLE_VOICEMAILS[0]); |
| } else { |
| voicemails = Arrays.asList(SIMPLE_VOICEMAILS); |
| } |
| // Do this 4 times to make the voicemail database 4 times bigger. |
| long timeMillis = System.currentTimeMillis(); |
| for (int i = 0; i < 4; i++) { |
| for (Voicemail.Builder builder : voicemails) { |
| Voicemail voicemail = builder.setTimeMillis(timeMillis).build(); |
| context |
| .getContentResolver() |
| .insert( |
| Voicemails.buildSourceUri(context.getPackageName()), |
| voicemail.getAsContentValues(context)); |
| timeMillis -= TimeUnit.HOURS.toMillis(2); |
| } |
| } |
| } |
| |
| @WorkerThread |
| public static void populateVoicemail(@NonNull Context context) { |
| populateVoicemail(context, false); |
| } |
| |
| @WorkerThread |
| public static void deleteAllVoicemail(@NonNull Context context) { |
| Assert.isWorkerThread(); |
| context |
| .getContentResolver() |
| .delete(Voicemails.buildSourceUri(context.getPackageName()), null, null); |
| } |
| |
| @VisibleForTesting |
| public static void enableVoicemail(@NonNull Context context) { |
| PhoneAccountHandle handle = |
| new PhoneAccountHandle(new ComponentName(context, VoicemailPopulator.class), ACCOUNT_ID); |
| componentName = handle.getComponentName().toString(); |
| ContentValues values = new ContentValues(); |
| values.put(Status.SOURCE_PACKAGE, handle.getComponentName().getPackageName()); |
| if (VERSION.SDK_INT >= VERSION_CODES.N_MR1) { |
| values.put(Status.SOURCE_TYPE, "vvm_type_vvm3"); // mark populated voice mail as vvm3 |
| } |
| values.put(Status.PHONE_ACCOUNT_COMPONENT_NAME, handle.getComponentName().flattenToString()); |
| values.put(Status.PHONE_ACCOUNT_ID, handle.getId()); |
| values.put(Status.CONFIGURATION_STATE, Status.CONFIGURATION_STATE_OK); |
| values.put(Status.DATA_CHANNEL_STATE, Status.DATA_CHANNEL_STATE_OK); |
| values.put(Status.NOTIFICATION_CHANNEL_STATE, Status.NOTIFICATION_CHANNEL_STATE_OK); |
| context.getContentResolver().insert(Status.buildSourceUri(context.getPackageName()), values); |
| } |
| |
| /** Data for a single voicemail entry. */ |
| @AutoValue |
| public abstract static class Voicemail { |
| @NonNull |
| public abstract String getPhoneNumber(); |
| |
| @NonNull |
| public abstract String getTranscription(); |
| |
| public abstract long getDurationSeconds(); |
| |
| public abstract long getTimeMillis(); |
| |
| public abstract boolean getIsRead(); |
| |
| public abstract String getPhoneAccountComponentName(); |
| |
| public static Builder builder() { |
| return new AutoValue_VoicemailPopulator_Voicemail.Builder(); |
| } |
| |
| public ContentValues getAsContentValues(Context context) { |
| ContentValues values = new ContentValues(); |
| values.put(Voicemails.DATE, getTimeMillis()); |
| values.put(Voicemails.NUMBER, getPhoneNumber()); |
| values.put(Voicemails.DURATION, getDurationSeconds()); |
| values.put(Voicemails.SOURCE_PACKAGE, context.getPackageName()); |
| values.put(Voicemails.IS_READ, getIsRead() ? 1 : 0); |
| values.put(Voicemails.TRANSCRIPTION, getTranscription()); |
| values.put(Voicemails.PHONE_ACCOUNT_COMPONENT_NAME, getPhoneAccountComponentName()); |
| return values; |
| } |
| |
| /** Builder for a single voicemail entry. */ |
| @AutoValue.Builder |
| public abstract static class Builder { |
| public abstract Builder setPhoneNumber(@NonNull String phoneNumber); |
| |
| public abstract Builder setTranscription(@NonNull String transcription); |
| |
| public abstract Builder setDurationSeconds(long durationSeconds); |
| |
| public abstract Builder setTimeMillis(long timeMillis); |
| |
| public abstract Builder setIsRead(boolean isRead); |
| |
| public abstract Builder setPhoneAccountComponentName(String phoneAccountComponentName); |
| |
| public abstract Voicemail build(); |
| } |
| } |
| |
| private VoicemailPopulator() {} |
| } |