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