blob: eeefe70c35375f269aa9a3c628327a323aeec7db [file] [log] [blame]
/*
* 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.ContentProviderOperation;
import android.content.ContentValues;
import android.content.Context;
import android.content.OperationApplicationException;
import android.os.RemoteException;
import android.provider.CallLog;
import android.provider.CallLog.Calls;
import android.support.annotation.NonNull;
import android.support.annotation.WorkerThread;
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 call log entries. */
public final class CallLogPopulator {
// Phone numbers from https://www.google.com/about/company/facts/locations/
private static final CallEntry.Builder[] SIMPLE_CALL_LOG = {
CallEntry.builder().setType(Calls.MISSED_TYPE).setNumber("+1-302-6365454"),
CallEntry.builder()
.setType(Calls.MISSED_TYPE)
.setNumber("")
.setPresentation(Calls.PRESENTATION_UNKNOWN),
CallEntry.builder().setType(Calls.REJECTED_TYPE).setNumber("+1-302-6365454"),
CallEntry.builder().setType(Calls.INCOMING_TYPE).setNumber("+1-302-6365454"),
CallEntry.builder()
.setType(Calls.MISSED_TYPE)
.setNumber("1234")
.setPresentation(Calls.PRESENTATION_RESTRICTED),
CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("+1-302-6365454"),
CallEntry.builder().setType(Calls.BLOCKED_TYPE).setNumber("+1-302-6365454"),
CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("(425) 739-5600"),
CallEntry.builder().setType(Calls.ANSWERED_EXTERNALLY_TYPE).setNumber("(425) 739-5600"),
CallEntry.builder().setType(Calls.MISSED_TYPE).setNumber("+1 (425) 739-5600"),
CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("739-5600"),
CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("711"),
CallEntry.builder().setType(Calls.INCOMING_TYPE).setNumber("711"),
CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("(425) 739-5600"),
CallEntry.builder().setType(Calls.MISSED_TYPE).setNumber("+44 (0) 20 7031 3000"),
CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("+1-650-2530000"),
CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("+1 303-245-0086;123,456"),
CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("+1 303-245-0086"),
CallEntry.builder().setType(Calls.INCOMING_TYPE).setNumber("+1-650-2530000"),
CallEntry.builder().setType(Calls.MISSED_TYPE).setNumber("650-2530000"),
CallEntry.builder().setType(Calls.REJECTED_TYPE).setNumber("2530000"),
CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("+1 404-487-9000"),
CallEntry.builder().setType(Calls.INCOMING_TYPE).setNumber("+61 2 9374 4001"),
CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("+33 (0)1 42 68 53 00"),
CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("972-74-746-6245"),
CallEntry.builder().setType(Calls.INCOMING_TYPE).setNumber("+971 4 4509500"),
CallEntry.builder().setType(Calls.INCOMING_TYPE).setNumber("+971 4 4509500"),
CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("55-31-2128-6800"),
CallEntry.builder().setType(Calls.MISSED_TYPE).setNumber("611"),
CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("*86 512-343-5283"),
};
@WorkerThread
public static void populateCallLog(@NonNull Context context, boolean isWithoutMissedCalls) {
populateCallLog(context, isWithoutMissedCalls, false);
}
@WorkerThread
public static void populateCallLog(@NonNull Context context) {
populateCallLog(context, false);
}
@WorkerThread
public static void populateCallLog(
@NonNull Context context, boolean isWithoutMissedCalls, boolean fastMode) {
Assert.isWorkerThread();
ArrayList<ContentProviderOperation> operations = new ArrayList<>();
// Do this 4 times to make the call log 4 times bigger.
long timeMillis = System.currentTimeMillis();
List<CallEntry.Builder> callLogs = new ArrayList<>();
if (fastMode) {
callLogs.add(SIMPLE_CALL_LOG[0]);
} else {
callLogs = Arrays.asList(SIMPLE_CALL_LOG);
}
for (int i = 0; i < 4; i++) {
for (CallEntry.Builder builder : callLogs) {
CallEntry callEntry = builder.setTimeMillis(timeMillis).build();
if (isWithoutMissedCalls && builder.build().getType() == Calls.MISSED_TYPE) {
continue;
}
operations.add(
ContentProviderOperation.newInsert(Calls.CONTENT_URI)
.withValues(callEntry.getAsContentValues())
.withYieldAllowed(true)
.build());
timeMillis -= TimeUnit.HOURS.toMillis(1);
}
}
try {
context.getContentResolver().applyBatch(CallLog.AUTHORITY, operations);
} catch (RemoteException | OperationApplicationException e) {
Assert.fail("error adding call entries: " + e);
}
}
@WorkerThread
public static void populateCallLogWithoutMissed(@NonNull Context context) {
populateCallLog(context, true);
}
@WorkerThread
public static void deleteAllCallLog(@NonNull Context context) {
Assert.isWorkerThread();
try {
context
.getContentResolver()
.applyBatch(
CallLog.AUTHORITY,
new ArrayList<>(
Arrays.asList(ContentProviderOperation.newDelete(Calls.CONTENT_URI).build())));
} catch (RemoteException | OperationApplicationException e) {
Assert.fail("failed to delete call log: " + e);
}
}
@AutoValue
abstract static class CallEntry {
@NonNull
abstract String getNumber();
abstract int getType();
abstract int getPresentation();
abstract long getTimeMillis();
static Builder builder() {
return new AutoValue_CallLogPopulator_CallEntry.Builder()
.setPresentation(Calls.PRESENTATION_ALLOWED);
}
ContentValues getAsContentValues() {
ContentValues values = new ContentValues();
values.put(Calls.TYPE, getType());
values.put(Calls.NUMBER, getNumber());
values.put(Calls.NUMBER_PRESENTATION, getPresentation());
values.put(Calls.DATE, getTimeMillis());
return values;
}
@AutoValue.Builder
abstract static class Builder {
abstract Builder setNumber(@NonNull String number);
abstract Builder setType(int type);
abstract Builder setPresentation(int presentation);
abstract Builder setTimeMillis(long timeMillis);
abstract CallEntry build();
}
}
private CallLogPopulator() {}
}