• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
17 package com.android.dialer.app.calllog;
18 
19 import android.content.ContentValues;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.net.Uri;
23 import android.provider.ContactsContract;
24 import android.telecom.PhoneAccountHandle;
25 import com.android.contacts.common.model.Contact;
26 import com.android.contacts.common.model.ContactLoader;
27 import com.android.dialer.callcomposer.CallComposerContact;
28 import com.android.dialer.calldetails.CallDetailsActivity;
29 import com.android.dialer.calldetails.CallDetailsEntries;
30 import com.android.dialer.callintent.CallInitiationType;
31 import com.android.dialer.callintent.CallIntentBuilder;
32 import com.android.dialer.lightbringer.LightbringerComponent;
33 import com.android.dialer.util.CallUtil;
34 import com.android.dialer.util.IntentUtil;
35 import 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  */
42 public abstract class IntentProvider {
43 
44   private static final String TAG = IntentProvider.class.getSimpleName();
45 
getReturnCallIntentProvider(final String number)46   public static IntentProvider getReturnCallIntentProvider(final String number) {
47     return getReturnCallIntentProvider(number, null);
48   }
49 
getReturnCallIntentProvider( final String number, final PhoneAccountHandle accountHandle)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 
79   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 
88   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    *
110    * @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.
112    * @return The call details intent provider.
113    */
114   public static IntentProvider getCallDetailIntentProvider(
115       CallDetailsEntries callDetailsEntries, CallComposerContact contact) {
116     return new IntentProvider() {
117       @Override
118       public Intent getIntent(Context context) {
119         return CallDetailsActivity.newInstance(context, callDetailsEntries, contact);
120       }
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 }
196