Home | History | Annotate | Download | only in calllog
      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.calllog;
     18 
     19 import android.content.ContentValues;
     20 import android.content.ContentUris;
     21 import android.content.Context;
     22 import android.content.Intent;
     23 import android.net.Uri;
     24 import android.provider.CallLog.Calls;
     25 import android.provider.ContactsContract;
     26 import android.telecom.PhoneAccountHandle;
     27 
     28 import com.android.contacts.common.model.Contact;
     29 import com.android.contacts.common.model.ContactLoader;
     30 import com.android.dialer.CallDetailActivity;
     31 import com.android.dialer.DialtactsActivity;
     32 import com.android.dialer.PhoneCallDetails;
     33 import com.android.dialer.util.IntentUtil;
     34 import com.android.dialer.util.TelecomUtil;
     35 
     36 import java.util.ArrayList;
     37 
     38 /**
     39  * Used to create an intent to attach to an action in the call log.
     40  * <p>
     41  * The intent is constructed lazily with the given information.
     42  */
     43 public abstract class IntentProvider {
     44 
     45     private static final String TAG = IntentProvider.class.getSimpleName();
     46 
     47     public abstract Intent getIntent(Context context);
     48 
     49     public static IntentProvider getReturnCallIntentProvider(final String number) {
     50         return getReturnCallIntentProvider(number, null);
     51     }
     52 
     53     public static IntentProvider getReturnCallIntentProvider(final String number,
     54             final PhoneAccountHandle accountHandle) {
     55         return new IntentProvider() {
     56             @Override
     57             public Intent getIntent(Context context) {
     58                 return IntentUtil.getCallIntent(number, accountHandle);
     59             }
     60         };
     61     }
     62 
     63     public static IntentProvider getReturnVideoCallIntentProvider(final String number) {
     64         return getReturnVideoCallIntentProvider(number, null);
     65     }
     66 
     67     public static IntentProvider getReturnVideoCallIntentProvider(final String number,
     68             final PhoneAccountHandle accountHandle) {
     69         return new IntentProvider() {
     70             @Override
     71             public Intent getIntent(Context context) {
     72                 return IntentUtil.getVideoCallIntent(number, accountHandle);
     73             }
     74         };
     75     }
     76 
     77     public static IntentProvider getReturnVoicemailCallIntentProvider() {
     78         return new IntentProvider() {
     79             @Override
     80             public Intent getIntent(Context context) {
     81                 return IntentUtil.getVoicemailIntent();
     82             }
     83         };
     84     }
     85 
     86     public static IntentProvider getSendSmsIntentProvider(final String number) {
     87         return new IntentProvider() {
     88             @Override
     89             public Intent getIntent(Context context) {
     90                 return IntentUtil.getSendSmsIntent(number);
     91             }
     92         };
     93     }
     94 
     95     /**
     96      * Retrieves the call details intent provider for an entry in the call log.
     97      *
     98      * @param id The call ID of the first call in the call group.
     99      * @param extraIds The call ID of the other calls grouped together with the call.
    100      * @param voicemailUri If call log entry is for a voicemail, the voicemail URI.
    101      * @return The call details intent provider.
    102      */
    103     public static IntentProvider getCallDetailIntentProvider(
    104             final long id, final long[] extraIds, final String voicemailUri) {
    105         return new IntentProvider() {
    106             @Override
    107             public Intent getIntent(Context context) {
    108                 Intent intent = new Intent(context, CallDetailActivity.class);
    109                 // Check if the first item is a voicemail.
    110                 if (voicemailUri != null) {
    111                     intent.putExtra(CallDetailActivity.EXTRA_VOICEMAIL_URI,
    112                             Uri.parse(voicemailUri));
    113                 }
    114 
    115                 if (extraIds != null && extraIds.length > 0) {
    116                     intent.putExtra(CallDetailActivity.EXTRA_CALL_LOG_IDS, extraIds);
    117                 } else {
    118                     // If there is a single item, use the direct URI for it.
    119                     intent.setData(ContentUris.withAppendedId(TelecomUtil.getCallLogUri(context),
    120                             id));
    121                 }
    122                 return intent;
    123             }
    124         };
    125     }
    126 
    127     /**
    128      * Retrieves an add contact intent for the given contact and phone call details.
    129      */
    130     public static IntentProvider getAddContactIntentProvider(
    131             final Uri lookupUri,
    132             final CharSequence name,
    133             final CharSequence number,
    134             final int numberType,
    135             final boolean isNewContact) {
    136         return new IntentProvider() {
    137             @Override
    138             public Intent getIntent(Context context) {
    139                 Contact contactToSave = null;
    140 
    141                 if (lookupUri != null) {
    142                     contactToSave = ContactLoader.parseEncodedContactEntity(lookupUri);
    143                 }
    144 
    145                 if (contactToSave != null) {
    146                     // Populate the intent with contact information stored in the lookup URI.
    147                     // Note: This code mirrors code in Contacts/QuickContactsActivity.
    148                     final Intent intent;
    149                     if (isNewContact) {
    150                         intent = IntentUtil.getNewContactIntent();
    151                     } else {
    152                         intent = IntentUtil.getAddToExistingContactIntent();
    153                     }
    154 
    155                     ArrayList<ContentValues> values = contactToSave.getContentValues();
    156                     // Only pre-fill the name field if the provided display name is an nickname
    157                     // or better (e.g. structured name, nickname)
    158                     if (contactToSave.getDisplayNameSource()
    159                             >= ContactsContract.DisplayNameSources.NICKNAME) {
    160                         intent.putExtra(ContactsContract.Intents.Insert.NAME,
    161                                 contactToSave.getDisplayName());
    162                     } else if (contactToSave.getDisplayNameSource()
    163                             == ContactsContract.DisplayNameSources.ORGANIZATION) {
    164                         // This is probably an organization. Instead of copying the organization
    165                         // name into a name entry, copy it into the organization entry. This
    166                         // way we will still consider the contact an organization.
    167                         final ContentValues organization = new ContentValues();
    168                         organization.put(ContactsContract.CommonDataKinds.Organization.COMPANY,
    169                                 contactToSave.getDisplayName());
    170                         organization.put(ContactsContract.Data.MIMETYPE,
    171                                 ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE);
    172                         values.add(organization);
    173                     }
    174 
    175                     // Last time used and times used are aggregated values from the usage stat
    176                     // table. They need to be removed from data values so the SQL table can insert
    177                     // properly
    178                     for (ContentValues value : values) {
    179                         value.remove(ContactsContract.Data.LAST_TIME_USED);
    180                         value.remove(ContactsContract.Data.TIMES_USED);
    181                     }
    182 
    183                     intent.putExtra(ContactsContract.Intents.Insert.DATA, values);
    184 
    185                     return intent;
    186                 } else {
    187                     // If no lookup uri is provided, rely on the available phone number and name.
    188                     if (isNewContact) {
    189                         return IntentUtil.getNewContactIntent(name, number, numberType);
    190                     } else {
    191                         return IntentUtil.getAddToExistingContactIntent(name, number, numberType);
    192                     }
    193                 }
    194             }
    195         };
    196     }
    197 }
    198