1d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian/* 2d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian * Copyright (C) 2017 The Android Open Source Project 3d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian * 4d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian * you may not use this file except in compliance with the License. 6d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian * You may obtain a copy of the License at 7d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian * 8d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian * 10d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian * See the License for the specific language governing permissions and 14d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian * limitations under the License 15d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian */ 16d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 17d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanianpackage com.android.incallui.videotech.lightbringer; 18d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 19d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanianimport android.content.Context; 202f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport android.os.Build; 21d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanianimport android.support.annotation.NonNull; 222f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport android.support.annotation.Nullable; 23d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanianimport android.telecom.Call; 242f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport com.android.contacts.common.compat.telecom.TelecomManagerCompat; 25d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanianimport com.android.dialer.common.Assert; 262f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport com.android.dialer.configprovider.ConfigProviderBindings; 27d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanianimport com.android.dialer.lightbringer.Lightbringer; 28d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanianimport com.android.dialer.lightbringer.LightbringerListener; 29d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanianimport com.android.incallui.video.protocol.VideoCallScreen; 30d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanianimport com.android.incallui.video.protocol.VideoCallScreenDelegate; 31d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanianimport com.android.incallui.videotech.VideoTech; 32d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanianimport com.android.incallui.videotech.utils.SessionModificationState; 33d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 34d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanianpublic class LightbringerTech implements VideoTech, LightbringerListener { 35d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian private final Lightbringer lightbringer; 36d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian private final VideoTechListener listener; 372f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian private final Call call; 38d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian private final String callingNumber; 39d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian private int callState = Call.STATE_NEW; 40d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 41d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public LightbringerTech( 42d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @NonNull Lightbringer lightbringer, 43d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @NonNull VideoTechListener listener, 442f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian @NonNull Call call, 45d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @NonNull String callingNumber) { 46d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian this.lightbringer = Assert.isNotNull(lightbringer); 47d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian this.listener = Assert.isNotNull(listener); 482f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian this.call = Assert.isNotNull(call); 49d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian this.callingNumber = Assert.isNotNull(callingNumber); 50d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 51d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian lightbringer.registerListener(this); 52d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 53d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 54d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 55d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public boolean isAvailable(Context context) { 562f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O 572f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian && ConfigProviderBindings.get(context).getBoolean("enable_lightbringer_video_upgrade", true) 582f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian && callState == Call.STATE_ACTIVE 592f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian && lightbringer.supportsUpgrade(context, callingNumber) 602f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian && TelecomManagerCompat.supportsHandover(); 61d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 62d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 63d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 64d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public boolean isTransmittingOrReceiving() { 65d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian return false; 66d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 67d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 68d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 69d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public boolean isSelfManagedCamera() { 70d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian return false; 71d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 72d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 73d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 74d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public boolean shouldUseSurfaceView() { 75d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian return false; 76d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 77d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 78d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 79d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public VideoCallScreenDelegate createVideoCallScreenDelegate( 80d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian Context context, VideoCallScreen videoCallScreen) { 81d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian throw Assert.createUnsupportedOperationFailException(); 82d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 83d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 84d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 85d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public void onCallStateChanged(Context context, int newState) { 86d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian if (newState == Call.STATE_DISCONNECTING) { 87d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian lightbringer.unregisterListener(this); 88d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 89d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 90d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian callState = newState; 91d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 92d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 93d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 9410ae593a59aa50963e1d3159747da2d65ca79bedEric Erfanian public void onRemovedFromCallList() { 9510ae593a59aa50963e1d3159747da2d65ca79bedEric Erfanian lightbringer.unregisterListener(this); 9610ae593a59aa50963e1d3159747da2d65ca79bedEric Erfanian } 972f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian 982f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian @Override 99d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public int getSessionModificationState() { 100d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian return SessionModificationState.NO_REQUEST; 101d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 102d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 103d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 104d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public void upgradeToVideo() { 1052f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian lightbringer.requestUpgrade(call); 106d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 107d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 108d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 109d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public void acceptVideoRequest() { 110d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian throw Assert.createUnsupportedOperationFailException(); 111d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 112d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 113d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 114d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public void acceptVideoRequestAsAudio() { 115d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian throw Assert.createUnsupportedOperationFailException(); 116d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 117d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 118d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 119d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public void declineVideoRequest() { 120d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian throw Assert.createUnsupportedOperationFailException(); 121d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 122d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 123d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 124d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public boolean isTransmitting() { 125d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian return false; 126d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 127d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 128d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 129d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public void stopTransmission() { 130d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian throw Assert.createUnsupportedOperationFailException(); 131d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 132d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 133d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 134d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public void resumeTransmission() { 135d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian throw Assert.createUnsupportedOperationFailException(); 136d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 137d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 138d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 1392f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian public void pause() {} 140d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 141d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 1422f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian public void unpause() {} 143d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 144d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 1452f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian public void setCamera(@Nullable String cameraId) { 146d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian throw Assert.createUnsupportedOperationFailException(); 147d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 148d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 149d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 150d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public void setDeviceOrientation(int rotation) { 151d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian throw Assert.createUnsupportedOperationFailException(); 152d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 153d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian 154d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian @Override 155d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian public void onLightbringerStateChanged() { 156d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian listener.onVideoTechStateChanged(); 157d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian } 158d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian} 159