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