1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/* 2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2014 The Android Open Source Project 3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License. 6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at 7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and 14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License 15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.incallui.call; 18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.NonNull; 20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.Nullable; 21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.Collections; 22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.Objects; 23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.Set; 24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.concurrent.ConcurrentHashMap; 25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 26d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian/** Class used to notify interested parties of incoming video related events. */ 27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class InCallVideoCallCallbackNotifier { 28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** Singleton instance of this class. */ 30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static InCallVideoCallCallbackNotifier sInstance = new InCallVideoCallCallbackNotifier(); 31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is load factor before 34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * resizing, 1 means we only expect a single thread to access the map so make only a single shard 35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final Set<SurfaceChangeListener> mSurfaceChangeListeners = 37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Collections.newSetFromMap(new ConcurrentHashMap<SurfaceChangeListener, Boolean>(8, 0.9f, 1)); 38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 3910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian /** Private constructor. Instance should only be acquired through getRunningInstance(). */ 40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private InCallVideoCallCallbackNotifier() {} 41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** Static singleton accessor method. */ 43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static InCallVideoCallCallbackNotifier getInstance() { 44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return sInstance; 45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Adds a new {@link SurfaceChangeListener}. 49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param listener The listener. 51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void addSurfaceChangeListener(@NonNull SurfaceChangeListener listener) { 53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Objects.requireNonNull(listener); 54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mSurfaceChangeListeners.add(listener); 55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Remove a {@link SurfaceChangeListener}. 59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param listener The listener. 61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void removeSurfaceChangeListener(@Nullable SurfaceChangeListener listener) { 63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (listener != null) { 64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mSurfaceChangeListeners.remove(listener); 65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Inform listeners of a change to peer dimensions. 70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param call The call. 72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param width New peer width. 73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param height New peer height. 74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void peerDimensionsChanged(DialerCall call, int width, int height) { 76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian for (SurfaceChangeListener listener : mSurfaceChangeListeners) { 77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian listener.onUpdatePeerDimensions(call, width, height); 78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Inform listeners of a change to camera dimensions. 83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param call The call. 85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param width The new camera video width. 86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param height The new camera video height. 87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void cameraDimensionsChanged(DialerCall call, int width, int height) { 89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian for (SurfaceChangeListener listener : mSurfaceChangeListeners) { 90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian listener.onCameraDimensionsChange(call, width, height); 91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Listener interface for any class that wants to be notified of changes to the video surfaces. 96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public interface SurfaceChangeListener { 98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Called when the peer video feed changes dimensions. This can occur when the peer rotates 101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * their device, changing the aspect ratio of the video signal. 102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param call The call which experienced a peer video 104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian void onUpdatePeerDimensions(DialerCall call, int width, int height); 106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Called when the local camera changes dimensions. This occurs when a change in camera occurs. 109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param call The call which experienced the camera dimension change. 111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param width The new camera video width. 112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param height The new camera video height. 113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian void onCameraDimensionsChange(DialerCall call, int width, int height); 115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian} 117