1e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin/* 2e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin * Copyright (C) 2017 The Android Open Source Project 3e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin * 4e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin * Licensed under the Apache License, Version 2.0 (the "License"); 5e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin * you may not use this file except in compliance with the License. 6e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin * You may obtain a copy of the License at 7e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin * 8e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin * http://www.apache.org/licenses/LICENSE-2.0 9e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin * 10e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin * Unless required by applicable law or agreed to in writing, software 11e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin * distributed under the License is distributed on an "AS IS" BASIS, 12e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin * See the License for the specific language governing permissions and 14e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin * limitations under the License 15e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin */ 16e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin 17e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupinpackage com.android.server.wm; 18e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin 19e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupinimport android.os.RemoteCallbackList; 20e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupinimport android.os.RemoteException; 21e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupinimport android.util.SparseArray; 22e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupinimport android.view.IWallpaperVisibilityListener; 23e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin 24e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin/** 25e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin * Manages and trigger wallpaper visibility listeners. 26e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin */ 27e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupinclass WallpaperVisibilityListeners { 28e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin 29e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin /** 30e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin * A map of displayIds and its listeners. 31e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin */ 32e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin private final SparseArray<RemoteCallbackList<IWallpaperVisibilityListener>> mDisplayListeners = 33e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin new SparseArray<>(); 34e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin 35e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin void registerWallpaperVisibilityListener(IWallpaperVisibilityListener listener, 36e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin int displayId) { 37e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin RemoteCallbackList<IWallpaperVisibilityListener> listeners = 38e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin mDisplayListeners.get(displayId); 39e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin if (listeners == null) { 40e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin listeners = new RemoteCallbackList<>(); 41e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin mDisplayListeners.append(displayId, listeners); 42e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin } 43e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin listeners.register(listener); 44e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin } 45e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin 46e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin void unregisterWallpaperVisibilityListener(IWallpaperVisibilityListener listener, 47e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin int displayId) { 48e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin RemoteCallbackList<IWallpaperVisibilityListener> listeners = 49e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin mDisplayListeners.get(displayId); 50e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin if (listeners == null) { 51e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin return; 52e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin } 53e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin listeners.unregister(listener); 54e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin } 55e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin 56e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin void notifyWallpaperVisibilityChanged(DisplayContent displayContent) { 57e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin final int displayId = displayContent.getDisplayId(); 58e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin final boolean visible = displayContent.mWallpaperController.isWallpaperVisible(); 59e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin RemoteCallbackList<IWallpaperVisibilityListener> displayListeners = 60e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin mDisplayListeners.get(displayId); 61e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin 62e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin // No listeners for this display. 63e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin if (displayListeners == null) { 64e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin return; 65e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin } 66e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin 67e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin int i = displayListeners.beginBroadcast(); 68e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin while (i > 0) { 69e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin i--; 70e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin IWallpaperVisibilityListener listener = displayListeners.getBroadcastItem(i); 71e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin try { 72e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin listener.onWallpaperVisibilityChanged(visible, displayId); 73e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin } catch (RemoteException e) { 74e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin // Nothing to do in here, RemoteCallbackListener will clean it up. 75e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin } 76e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin } 77e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin displayListeners.finishBroadcast(); 78e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin } 79e1571705e6ea8367e7ee93d61104ce27035492dcLucas Dupin} 80