1f85fc967655be97202b8c47596083dd18f950718Jason Monk/*
2f85fc967655be97202b8c47596083dd18f950718Jason Monk * Copyright (C) 2017 The Android Open Source Project
3f85fc967655be97202b8c47596083dd18f950718Jason Monk *
4f85fc967655be97202b8c47596083dd18f950718Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5f85fc967655be97202b8c47596083dd18f950718Jason Monk * except in compliance with the License. You may obtain a copy of the License at
6f85fc967655be97202b8c47596083dd18f950718Jason Monk *
7f85fc967655be97202b8c47596083dd18f950718Jason Monk *      http://www.apache.org/licenses/LICENSE-2.0
8f85fc967655be97202b8c47596083dd18f950718Jason Monk *
9f85fc967655be97202b8c47596083dd18f950718Jason Monk * Unless required by applicable law or agreed to in writing, software distributed under the
10f85fc967655be97202b8c47596083dd18f950718Jason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11f85fc967655be97202b8c47596083dd18f950718Jason Monk * KIND, either express or implied. See the License for the specific language governing
12f85fc967655be97202b8c47596083dd18f950718Jason Monk * permissions and limitations under the License.
13f85fc967655be97202b8c47596083dd18f950718Jason Monk */
14f85fc967655be97202b8c47596083dd18f950718Jason Monk
15f85fc967655be97202b8c47596083dd18f950718Jason Monkpackage com.android.systemui;
16f85fc967655be97202b8c47596083dd18f950718Jason Monk
173b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monkimport android.os.IBinder;
18f85fc967655be97202b8c47596083dd18f950718Jason Monkimport android.os.RemoteException;
19f85fc967655be97202b8c47596083dd18f950718Jason Monkimport android.util.Log;
20f85fc967655be97202b8c47596083dd18f950718Jason Monkimport android.view.IDockedStackListener;
21f85fc967655be97202b8c47596083dd18f950718Jason Monkimport android.view.WindowManagerGlobal;
22f85fc967655be97202b8c47596083dd18f950718Jason Monk
233b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monkimport java.lang.ref.WeakReference;
243b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monkimport java.util.ArrayList;
25f85fc967655be97202b8c47596083dd18f950718Jason Monkimport java.util.function.Consumer;
26f85fc967655be97202b8c47596083dd18f950718Jason Monk
27f85fc967655be97202b8c47596083dd18f950718Jason Monk/**
28f85fc967655be97202b8c47596083dd18f950718Jason Monk * Utility wrapper to listen for whether or not a docked stack exists, to be
29f85fc967655be97202b8c47596083dd18f950718Jason Monk * used for things like the different overview icon in that mode.
30f85fc967655be97202b8c47596083dd18f950718Jason Monk */
313b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monkpublic class DockedStackExistsListener {
32f85fc967655be97202b8c47596083dd18f950718Jason Monk
33f85fc967655be97202b8c47596083dd18f950718Jason Monk    private static final String TAG = "DockedStackExistsListener";
34f85fc967655be97202b8c47596083dd18f950718Jason Monk
353b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk    private static ArrayList<WeakReference<Consumer<Boolean>>> sCallbacks = new ArrayList<>();
36aa74bf857f190d6ae12fe90eba9f62ffb04d9e40Jason Monk    private static boolean mLastExists;
37f85fc967655be97202b8c47596083dd18f950718Jason Monk
383b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk    static {
393b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk        try {
403b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk            WindowManagerGlobal.getWindowManagerService().registerDockedStackListener(
413b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                    new IDockedStackListener.Stub() {
423b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                        @Override
433b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                        public void onDividerVisibilityChanged(boolean b) throws RemoteException {
44f85fc967655be97202b8c47596083dd18f950718Jason Monk
453b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                        }
46f85fc967655be97202b8c47596083dd18f950718Jason Monk
473b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                        @Override
483b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                        public void onDockedStackExistsChanged(boolean exists)
493b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                                throws RemoteException {
503b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                            DockedStackExistsListener.onDockedStackExistsChanged(exists);
513b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                        }
52f85fc967655be97202b8c47596083dd18f950718Jason Monk
533b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                        @Override
543b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                        public void onDockedStackMinimizedChanged(boolean b, long l, boolean b1)
553b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                                throws RemoteException {
563b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk
573b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                        }
583b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk
593b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                        @Override
603b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                        public void onAdjustedForImeChanged(boolean b, long l)
613b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                                throws RemoteException {
623b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk
633b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                        }
643b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk
653b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                        @Override
663b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                        public void onDockSideChanged(int i) throws RemoteException {
67f85fc967655be97202b8c47596083dd18f950718Jason Monk
683b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                        }
693b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk                    });
703b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk        } catch (RemoteException e) {
713b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk            Log.e(TAG, "Failed registering docked stack exists listener", e);
723b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk        }
73f85fc967655be97202b8c47596083dd18f950718Jason Monk    }
74f85fc967655be97202b8c47596083dd18f950718Jason Monk
753b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk
763b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk    private static void onDockedStackExistsChanged(boolean exists) {
77aa74bf857f190d6ae12fe90eba9f62ffb04d9e40Jason Monk        mLastExists = exists;
783b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk        synchronized (sCallbacks) {
7932e3bb502dc1091e03a76743f17632f73bed0178Jason Monk            sCallbacks.removeIf(wf -> {
8032e3bb502dc1091e03a76743f17632f73bed0178Jason Monk                Consumer<Boolean> l = wf.get();
8132e3bb502dc1091e03a76743f17632f73bed0178Jason Monk                if (l != null) l.accept(exists);
8232e3bb502dc1091e03a76743f17632f73bed0178Jason Monk                return l == null;
8332e3bb502dc1091e03a76743f17632f73bed0178Jason Monk            });
843b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk        }
85f85fc967655be97202b8c47596083dd18f950718Jason Monk    }
86f85fc967655be97202b8c47596083dd18f950718Jason Monk
87f85fc967655be97202b8c47596083dd18f950718Jason Monk    public static void register(Consumer<Boolean> callback) {
88aa74bf857f190d6ae12fe90eba9f62ffb04d9e40Jason Monk        callback.accept(mLastExists);
893b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk        synchronized (sCallbacks) {
903b9357f3b9d6f2dae175ad1b92116e17b6df1493Jason Monk            sCallbacks.add(new WeakReference<>(callback));
91f85fc967655be97202b8c47596083dd18f950718Jason Monk        }
92f85fc967655be97202b8c47596083dd18f950718Jason Monk    }
93f85fc967655be97202b8c47596083dd18f950718Jason Monk}
94