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

Commit 6848f72a authored by Santos Cordon's avatar Santos Cordon
Browse files

Adding ITelecommService definition for Telecomm.

Until telecomm code moves into a system service, we need a way for
other apps to call into it for call-related functionality.

Initial implementation only has silenceRinger.
This is to be implemented by the telecomm code and used by
TelephonyManager (until we have a TelecommManager).

Change-Id: I9180797451dcb2e9029b20bed47f5d5cb8cddb9f
parent b82bbf61
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -323,6 +323,7 @@ LOCAL_SRC_FILES += \
	telecomm/java/com/android/internal/telecomm/ICallServiceSelectorAdapter.aidl \
	telecomm/java/com/android/internal/telecomm/IInCallAdapter.aidl \
	telecomm/java/com/android/internal/telecomm/IInCallService.aidl \
	telecomm/java/com/android/internal/telecomm/ITelecommService.aidl \
	telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl \
	telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl \
	telephony/java/com/android/internal/telephony/ITelephony.aidl \
+76 −100
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ import android.os.Vibrator;
import android.provider.Settings;
import android.service.dreams.DreamService;
import android.service.dreams.IDreamManager;
import android.telephony.TelephonyManager;
import android.util.DisplayMetrics;
import android.util.EventLog;
import android.util.Log;
@@ -1930,9 +1931,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                ServiceManager.checkService(DreamService.DREAM_SERVICE));
    }

    static ITelephony getTelephonyService() {
        return ITelephony.Stub.asInterface(
                ServiceManager.checkService(Context.TELEPHONY_SERVICE));
    TelephonyManager getTelephonyService() {
        return (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
    }

    static IAudioService getAudioService() {
@@ -2015,15 +2015,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                // If an incoming call is ringing, HOME is totally disabled.
                // (The user is already on the InCallScreen at this point,
                // and his ONLY options are to answer or reject the call.)
                try {
                    ITelephony telephonyService = getTelephonyService();
                    if (telephonyService != null && telephonyService.isRinging()) {
                TelephonyManager telephonyManager = getTelephonyService();
                if (telephonyManager != null && telephonyManager.isRinging()) {
                    Log.i(TAG, "Ignoring HOME; there's a ringing incoming call.");
                    return -1;
                }
                } catch (RemoteException ex) {
                    Log.w(TAG, "RemoteException from getPhoneInterface()", ex);
                }

                // Delay handling home if a double-tap is possible.
                if (mDoubleTapOnHomeBehavior != DOUBLE_TAP_HOME_NOTHING) {
@@ -3940,10 +3936,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                    }
                }
                if (down) {
                    ITelephony telephonyService = getTelephonyService();
                    if (telephonyService != null) {
                        try {
                            if (telephonyService.isRinging()) {
                    TelephonyManager telephonyManager = getTelephonyService();
                    if (telephonyManager != null) {
                        if (telephonyManager.isRinging()) {
                            // If an incoming call is ringing, either VOLUME key means
                            // "silence ringer".  We handle these keys here, rather than
                            // in the InCallScreen, to make sure we'll respond to them
@@ -3955,23 +3950,20 @@ public class PhoneWindowManager implements WindowManagerPolicy {

                            // Silence the ringer.  (It's safe to call this
                            // even if the ringer has already been silenced.)
                                telephonyService.silenceRinger();
                            telephonyManager.silenceRinger();

                            // And *don't* pass this key thru to the current activity
                            // (which is probably the InCallScreen.)
                            result &= ~ACTION_PASS_TO_USER;
                            break;
                        }
                            if (telephonyService.isOffhook()
                        if (telephonyManager.isOffhook()
                                && (result & ACTION_PASS_TO_USER) == 0) {
                            // If we are in call but we decided not to pass the key to
                            // the application, handle the volume change here.
                            handleVolumeKey(AudioManager.STREAM_VOICE_CALL, keyCode);
                            break;
                        }
                        } catch (RemoteException ex) {
                            Log.w(TAG, "ITelephony threw RemoteException", ex);
                        }
                    }

                    if (isMusicActive() && (result & ACTION_PASS_TO_USER) == 0) {
@@ -3987,14 +3979,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            case KeyEvent.KEYCODE_ENDCALL: {
                result &= ~ACTION_PASS_TO_USER;
                if (down) {
                    ITelephony telephonyService = getTelephonyService();
                    TelephonyManager telephonyManager = getTelephonyService();
                    boolean hungUp = false;
                    if (telephonyService != null) {
                        try {
                            hungUp = telephonyService.endCall();
                        } catch (RemoteException ex) {
                            Log.w(TAG, "ITelephony threw RemoteException", ex);
                        }
                    if (telephonyManager != null) {
                        hungUp = telephonyManager.endCall();
                    }
                    interceptPowerKeyDown(!interactive || hungUp);
                } else {
@@ -4030,23 +4018,19 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                        interceptScreenshotChord();
                    }

                    ITelephony telephonyService = getTelephonyService();
                    TelephonyManager telephonyManager = getTelephonyService();
                    boolean hungUp = false;
                    if (telephonyService != null) {
                        try {
                            if (telephonyService.isRinging()) {
                    if (telephonyManager != null) {
                        if (telephonyManager.isRinging()) {
                            // Pressing Power while there's a ringing incoming
                            // call should silence the ringer.
                                telephonyService.silenceRinger();
                            telephonyManager.silenceRinger();
                        } else if ((mIncallPowerBehavior
                                & Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_HANGUP) != 0
                                    && telephonyService.isOffhook() && interactive) {
                                && telephonyManager.isOffhook() && interactive) {
                            // Otherwise, if "Power button ends call" is enabled,
                            // the Power button will hang up any current active call.
                                hungUp = telephonyService.endCall();
                            }
                        } catch (RemoteException ex) {
                            Log.w(TAG, "ITelephony threw RemoteException", ex);
                            hungUp = telephonyManager.endCall();
                        }
                    }
                    interceptPowerKeyDown(!interactive || hungUp
@@ -4079,17 +4063,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            case KeyEvent.KEYCODE_MEDIA_PAUSE:
            case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
                if (down) {
                    ITelephony telephonyService = getTelephonyService();
                    if (telephonyService != null) {
                        try {
                            if (!telephonyService.isIdle()) {
                    TelephonyManager telephonyManager = getTelephonyService();
                    if (telephonyManager != null) {
                        if (!telephonyManager.isIdle()) {
                            // Suppress PLAY/PAUSE toggle when phone is ringing or in-call
                            // to avoid music playback.
                            break;
                        }
                        } catch (RemoteException ex) {
                            Log.w(TAG, "ITelephony threw RemoteException", ex);
                        }
                    }
                }
            case KeyEvent.KEYCODE_HEADSETHOOK:
@@ -4118,21 +4098,17 @@ public class PhoneWindowManager implements WindowManagerPolicy {

            case KeyEvent.KEYCODE_CALL: {
                if (down) {
                    ITelephony telephonyService = getTelephonyService();
                    if (telephonyService != null) {
                        try {
                            if (telephonyService.isRinging()) {
                    TelephonyManager telephonyManager = getTelephonyService();
                    if (telephonyManager != null) {
                        if (telephonyManager.isRinging()) {
                            Log.i(TAG, "interceptKeyBeforeQueueing:"
                                  + " CALL key-down while ringing: Answer the call!");
                                telephonyService.answerRingingCall();
                            telephonyManager.answerRingingCall();

                            // And *don't* pass this key thru to the current activity
                            // (which is presumably the InCallScreen.)
                            result &= ~ACTION_PASS_TO_USER;
                        }
                        } catch (RemoteException ex) {
                            Log.w(TAG, "ITelephony threw RemoteException", ex);
                        }
                    }
                }
                break;
+34 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 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.internal.telecomm;

/**
 * Interface used to interact with Telecomm. Mostly this is used by TelephonyManager for passing
 * commands that were previously handled by ITelephony.
 * {@hide}
 */
oneway interface ITelecommService {

    /**
     * Silence the ringer if an incoming call is currently ringing.
     * (If vibrating, stop the vibrator also.)
     *
     * It's safe to call this if the ringer has already been silenced, or
     * even if there's no incoming call.  (If so, this method will do nothing.)
     */
    void silenceRinger();
}
+9 −2
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.os.SystemProperties;
import android.telephony.Rlog;
import android.util.Log;

import com.android.internal.telecomm.ITelecommService;
import com.android.internal.telephony.IPhoneSubInfo;
import com.android.internal.telephony.ITelephony;
import com.android.internal.telephony.ITelephonyListener;
@@ -66,6 +67,8 @@ import java.util.regex.Pattern;
public class TelephonyManager {
    private static final String TAG = "TelephonyManager";

    private static final String TELECOMM_SERVICE_NAME = "telecomm";

    private static ITelephonyRegistry sRegistry;

    /**
@@ -1537,6 +1540,10 @@ public class TelephonyManager {
        return ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
    }

    private ITelecommService getTelecommService() {
        return ITelecommService.Stub.asInterface(ServiceManager.getService(TELECOMM_SERVICE_NAME));
    }

    //
    //
    // PhoneStateListener
@@ -2017,9 +2024,9 @@ public class TelephonyManager {
    @PrivateApi
    public void silenceRinger() {
        try {
            getITelephony().silenceRinger();
            getTelecommService().silenceRinger();
        } catch (RemoteException e) {
            Log.e(TAG, "Error calling ITelephony#silenceRinger", e);
            Log.e(TAG, "Error calling ITelecommService#silenceRinger", e);
        }
    }