Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f6b1569 authored by Brandon Maxwell's avatar Brandon Maxwell
Browse files

Backporting necessary code to place calls on nonOEM devices

Added TelecomManagerCompat with methods necessary to start the InCallUI
without crashing.

Bug=25776171
Change-Id: I851f0252bdce9845e5211338637f16826479bc58
parent b3e1537e
Loading
Loading
Loading
Loading
+85 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2015 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.compat.telecom;

import android.app.Activity;
import android.content.Intent;
import android.support.annotation.Nullable;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;

import com.android.contacts.common.compat.CompatUtils;

/**
 * Compatibility class for {@link android.telecom.TelecomManager}
 */
public class TelecomManagerCompat {

    /**
     * Places a new outgoing call to the provided address using the system telecom service with
     * the specified intent.
     *
     * @param activity {@link Activity} used to start another activity for the given intent
     * @param telecomManager the {@link TelecomManager} used to place a call, if possible
     * @param intent the intent for the call
     * @throws NullPointerException if activity, telecomManager, or intent are null
     */
    public static void placeCall(Activity activity, TelecomManager telecomManager, Intent intent) {
        if (CompatUtils.isMarshmallowCompatible()) {
            telecomManager.placeCall(intent.getData(), intent.getExtras());
            return;
        }
        activity.startActivityForResult(intent, 0);
    }

    /**
     * Return the line 1 phone number for given phone account.
     *
     * @param telecomManager the {@link TelecomManager} to use in the event that
     *    {@link TelecomManager#getLine1Number(PhoneAccountHandle)} is available
     * @param telephonyManager the {@link TelephonyManager} to use if TelecomManager#getLine1Number
     *    is unavailable
     * @param phoneAccountHandle the phoneAccountHandle upon which to check the line one number
     * @return the line one number
     * @throws NullPointerException if telecomManager or telephonyManager are null
     */
    public static String getLine1Number(TelecomManager telecomManager,
            TelephonyManager telephonyManager, @Nullable PhoneAccountHandle phoneAccountHandle) {
        if (CompatUtils.isMarshmallowCompatible()) {
            return telecomManager.getLine1Number(phoneAccountHandle);
        }
        return telephonyManager.getLine1Number();
    }

    /**
     * Return whether a given phone number is the configured voicemail number for a
     * particular phone account.
     *
     * @param telecomManager the {@link TelecomManager} to use
     * @param accountHandle The handle for the account to check the voicemail number against
     * @param number The number to look up.
     * @throws NullPointerException if telecomManager is null
     */
    public static boolean isVoiceMailNumber(TelecomManager telecomManager,
            @Nullable PhoneAccountHandle accountHandle, @Nullable String number) {
        if (CompatUtils.isMarshmallowCompatible()) {
            return telecomManager.isVoiceMailNumber(accountHandle, number);
        }
        return PhoneNumberUtils.isVoiceMailNumber(number);
    }
}
+1 −2
Original line number Diff line number Diff line
@@ -87,8 +87,7 @@ public class DialerUtils {
                    intent.putExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS, extras);
                }

                final boolean hasCallPermission = TelecomUtil.placeCall(context, intent.getData(),
                        intent.getExtras());
                final boolean hasCallPermission = TelecomUtil.placeCall((Activity) context, intent);
                if (!hasCallPermission) {
                    // TODO: Make calling activity show request permission dialog and handle
                    // callback results appropriately.
+7 −5
Original line number Diff line number Diff line
@@ -17,10 +17,11 @@
package com.android.dialer.util;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CallLog.Calls;
import android.support.v4.content.ContextCompat;
import android.telecom.PhoneAccountHandle;
@@ -32,6 +33,7 @@ import android.util.Log;

import com.android.contacts.common.compat.CompatUtils;
import com.android.dialer.compat.DialerCompatUtils;
import com.android.dialer.compat.telecom.TelecomManagerCompat;

import java.util.ArrayList;
import java.util.List;
@@ -153,16 +155,16 @@ public class TelecomUtil {
    /**
     * Tries to place a call using the {@link TelecomManager}.
     *
     * @param context a valid context.
     * @param activity a valid activity.
     * @param address Handle to call.
     * @param extras Bundle of extras to attach to the call intent.
     *
     * @return {@code true} if we successfully attempted to place the call, {@code false} if it
     *         failed due to a permission check.
     */
    public static boolean placeCall(Context context, Uri address, Bundle extras) {
        if (hasCallPhonePermission(context)) {
            getTelecomManager(context).placeCall(address, extras);
    public static boolean placeCall(Activity activity, Intent intent) {
        if (hasCallPhonePermission(activity)) {
            TelecomManagerCompat.placeCall(activity, getTelecomManager(activity), intent);
            return true;
        }
        return false;