blob: 8b77c3f51949b8e9b71b6d9f08c873097a161407 [file] [log] [blame]
Eric Erfanianccca3152017-02-22 16:32:36 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.dialer.app.calllog;
18
Eric Erfanianccca3152017-02-22 16:32:36 -080019import android.content.ContentValues;
20import android.content.Context;
21import android.content.Intent;
22import android.net.Uri;
23import android.provider.ContactsContract;
24import android.telecom.PhoneAccountHandle;
25import com.android.contacts.common.model.Contact;
26import com.android.contacts.common.model.ContactLoader;
Eric Erfaniand5e47f62017-03-15 14:41:07 -070027import com.android.dialer.callcomposer.nano.CallComposerContact;
28import com.android.dialer.calldetails.CallDetailsActivity;
29import com.android.dialer.calldetails.nano.CallDetailsEntries;
Eric Erfanianccca3152017-02-22 16:32:36 -080030import com.android.dialer.callintent.CallIntentBuilder;
31import com.android.dialer.callintent.nano.CallInitiationType;
Eric Erfaniand8046e52017-04-06 09:41:50 -070032import com.android.dialer.lightbringer.LightbringerComponent;
Eric Erfanianccca3152017-02-22 16:32:36 -080033import com.android.dialer.util.CallUtil;
34import com.android.dialer.util.IntentUtil;
35import java.util.ArrayList;
36
37/**
38 * Used to create an intent to attach to an action in the call log.
39 *
40 * <p>The intent is constructed lazily with the given information.
41 */
42public abstract class IntentProvider {
43
44 private static final String TAG = IntentProvider.class.getSimpleName();
45
46 public static IntentProvider getReturnCallIntentProvider(final String number) {
47 return getReturnCallIntentProvider(number, null);
48 }
49
50 public static IntentProvider getReturnCallIntentProvider(
51 final String number, final PhoneAccountHandle accountHandle) {
52 return new IntentProvider() {
53 @Override
54 public Intent getIntent(Context context) {
55 return new CallIntentBuilder(number, CallInitiationType.Type.CALL_LOG)
56 .setPhoneAccountHandle(accountHandle)
57 .build();
58 }
59 };
60 }
61
62 public static IntentProvider getReturnVideoCallIntentProvider(final String number) {
63 return getReturnVideoCallIntentProvider(number, null);
64 }
65
66 public static IntentProvider getReturnVideoCallIntentProvider(
67 final String number, final PhoneAccountHandle accountHandle) {
68 return new IntentProvider() {
69 @Override
70 public Intent getIntent(Context context) {
71 return new CallIntentBuilder(number, CallInitiationType.Type.CALL_LOG)
72 .setPhoneAccountHandle(accountHandle)
73 .setIsVideoCall(true)
74 .build();
75 }
76 };
77 }
78
Eric Erfaniand8046e52017-04-06 09:41:50 -070079 public static IntentProvider getLightbringerIntentProvider(String number) {
80 return new IntentProvider() {
81 @Override
82 public Intent getIntent(Context context) {
83 return LightbringerComponent.get(context).getLightbringer().getIntent(context, number);
84 }
85 };
86 }
87
Eric Erfanianccca3152017-02-22 16:32:36 -080088 public static IntentProvider getReturnVoicemailCallIntentProvider() {
89 return new IntentProvider() {
90 @Override
91 public Intent getIntent(Context context) {
92 return new CallIntentBuilder(CallUtil.getVoicemailUri(), CallInitiationType.Type.CALL_LOG)
93 .build();
94 }
95 };
96 }
97
98 public static IntentProvider getSendSmsIntentProvider(final String number) {
99 return new IntentProvider() {
100 @Override
101 public Intent getIntent(Context context) {
102 return IntentUtil.getSendSmsIntent(number);
103 }
104 };
105 }
106
107 /**
108 * Retrieves the call details intent provider for an entry in the call log.
109 *
Eric Erfaniand5e47f62017-03-15 14:41:07 -0700110 * @param callDetailsEntries The call details of the other calls grouped together with the call.
111 * @param contact The contact with which this call details intent pertains to.
Eric Erfanianccca3152017-02-22 16:32:36 -0800112 * @return The call details intent provider.
113 */
114 public static IntentProvider getCallDetailIntentProvider(
Eric Erfaniand5e47f62017-03-15 14:41:07 -0700115 CallDetailsEntries callDetailsEntries, CallComposerContact contact) {
Eric Erfanianccca3152017-02-22 16:32:36 -0800116 return new IntentProvider() {
117 @Override
118 public Intent getIntent(Context context) {
Eric Erfaniand5e47f62017-03-15 14:41:07 -0700119 return CallDetailsActivity.newInstance(context, callDetailsEntries, contact);
Eric Erfanianccca3152017-02-22 16:32:36 -0800120 }
121 };
122 }
123
124 /** Retrieves an add contact intent for the given contact and phone call details. */
125 public static IntentProvider getAddContactIntentProvider(
126 final Uri lookupUri,
127 final CharSequence name,
128 final CharSequence number,
129 final int numberType,
130 final boolean isNewContact) {
131 return new IntentProvider() {
132 @Override
133 public Intent getIntent(Context context) {
134 Contact contactToSave = null;
135
136 if (lookupUri != null) {
137 contactToSave = ContactLoader.parseEncodedContactEntity(lookupUri);
138 }
139
140 if (contactToSave != null) {
141 // Populate the intent with contact information stored in the lookup URI.
142 // Note: This code mirrors code in Contacts/QuickContactsActivity.
143 final Intent intent;
144 if (isNewContact) {
145 intent = IntentUtil.getNewContactIntent();
146 } else {
147 intent = IntentUtil.getAddToExistingContactIntent();
148 }
149
150 ArrayList<ContentValues> values = contactToSave.getContentValues();
151 // Only pre-fill the name field if the provided display name is an nickname
152 // or better (e.g. structured name, nickname)
153 if (contactToSave.getDisplayNameSource()
154 >= ContactsContract.DisplayNameSources.NICKNAME) {
155 intent.putExtra(ContactsContract.Intents.Insert.NAME, contactToSave.getDisplayName());
156 } else if (contactToSave.getDisplayNameSource()
157 == ContactsContract.DisplayNameSources.ORGANIZATION) {
158 // This is probably an organization. Instead of copying the organization
159 // name into a name entry, copy it into the organization entry. This
160 // way we will still consider the contact an organization.
161 final ContentValues organization = new ContentValues();
162 organization.put(
163 ContactsContract.CommonDataKinds.Organization.COMPANY,
164 contactToSave.getDisplayName());
165 organization.put(
166 ContactsContract.Data.MIMETYPE,
167 ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE);
168 values.add(organization);
169 }
170
171 // Last time used and times used are aggregated values from the usage stat
172 // table. They need to be removed from data values so the SQL table can insert
173 // properly
174 for (ContentValues value : values) {
175 value.remove(ContactsContract.Data.LAST_TIME_USED);
176 value.remove(ContactsContract.Data.TIMES_USED);
177 }
178
179 intent.putExtra(ContactsContract.Intents.Insert.DATA, values);
180
181 return intent;
182 } else {
183 // If no lookup uri is provided, rely on the available phone number and name.
184 if (isNewContact) {
185 return IntentUtil.getNewContactIntent(name, number, numberType);
186 } else {
187 return IntentUtil.getAddToExistingContactIntent(name, number, numberType);
188 }
189 }
190 }
191 };
192 }
193
194 public abstract Intent getIntent(Context context);
195}