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