1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.support.car; 18 19 import java.util.HashMap; 20 import java.util.Map; 21 22 /** 23 * Implementation of {@link CarAppFocusManager} for embedded. 24 * @hide 25 */ 26 public class CarAppFocusManagerEmbedded extends CarAppFocusManager { 27 28 private final android.car.CarAppFocusManager mManager; 29 30 private final Map<OnAppFocusChangedListener, OnAppFocusChangedListenerProxy> 31 mChangeListeners = new HashMap<>(); 32 private final Map<OnAppFocusOwnershipCallback, OnAppFocusOwnershipCallbackProxy> 33 mOwnershipCallbacks = new HashMap<>(); 34 35 /** 36 * @hide 37 */ 38 CarAppFocusManagerEmbedded(Object manager) { 39 mManager = (android.car.CarAppFocusManager) manager; 40 } 41 42 @Override 43 public void addFocusListener(OnAppFocusChangedListener listener, int appType) 44 throws CarNotConnectedException { 45 if (listener == null) { 46 throw new IllegalArgumentException("null listener"); 47 } 48 OnAppFocusChangedListenerProxy proxy; 49 synchronized (this) { 50 proxy = mChangeListeners.get(listener); 51 if (proxy == null) { 52 proxy = new OnAppFocusChangedListenerProxy(this, listener); 53 mChangeListeners.put(listener, proxy); 54 } 55 } 56 try { 57 mManager.addFocusListener(proxy, appType); 58 } catch (android.car.CarNotConnectedException e) { 59 throw new CarNotConnectedException(e); 60 } 61 } 62 63 @Override 64 public void removeFocusListener(OnAppFocusChangedListener listener, int appType) { 65 OnAppFocusChangedListenerProxy proxy; 66 synchronized (this) { 67 proxy = mChangeListeners.get(listener); 68 if (proxy == null) { 69 return; 70 } 71 } 72 mManager.removeFocusListener(proxy, appType); 73 } 74 75 @Override 76 public void removeFocusListener(OnAppFocusChangedListener listener) { 77 OnAppFocusChangedListenerProxy proxy; 78 synchronized (this) { 79 proxy = mChangeListeners.remove(listener); 80 if (proxy == null) { 81 return; 82 } 83 } 84 mManager.removeFocusListener(proxy); 85 } 86 87 @Override 88 public boolean isOwningFocus(int appType, OnAppFocusOwnershipCallback listener) 89 throws CarNotConnectedException { 90 OnAppFocusOwnershipCallbackProxy proxy; 91 synchronized (this) { 92 proxy = mOwnershipCallbacks.get(listener); 93 if (proxy == null) { 94 return false; 95 } 96 } 97 try { 98 return mManager.isOwningFocus(proxy, appType); 99 } catch (android.car.CarNotConnectedException e) { 100 throw new CarNotConnectedException(e); 101 } 102 } 103 104 @Override 105 public int requestAppFocus(int appType, OnAppFocusOwnershipCallback ownershipCallback) 106 throws IllegalStateException, SecurityException, CarNotConnectedException { 107 if (ownershipCallback == null) { 108 throw new IllegalArgumentException("null listener"); 109 } 110 OnAppFocusOwnershipCallbackProxy proxy; 111 synchronized (this) { 112 proxy = mOwnershipCallbacks.get(ownershipCallback); 113 if (proxy == null) { 114 proxy = new OnAppFocusOwnershipCallbackProxy(this, ownershipCallback); 115 mOwnershipCallbacks.put(ownershipCallback, proxy); 116 } 117 } 118 try { 119 return mManager.requestAppFocus(appType, proxy); 120 } catch (android.car.CarNotConnectedException e) { 121 throw new CarNotConnectedException(e); 122 } 123 } 124 125 @Override 126 public void abandonAppFocus(OnAppFocusOwnershipCallback ownershipCallback, int appType) { 127 if (ownershipCallback == null) { 128 throw new IllegalArgumentException("null listener"); 129 } 130 OnAppFocusOwnershipCallbackProxy proxy; 131 synchronized (this) { 132 proxy = mOwnershipCallbacks.get(ownershipCallback); 133 if (proxy == null) { 134 return; 135 } 136 } 137 mManager.abandonAppFocus(proxy, appType); 138 } 139 140 @Override 141 public void abandonAppFocus(OnAppFocusOwnershipCallback ownershipCallback) { 142 if (ownershipCallback == null) { 143 throw new IllegalArgumentException("null listener"); 144 } 145 OnAppFocusOwnershipCallbackProxy proxy; 146 synchronized (this) { 147 proxy = mOwnershipCallbacks.get(ownershipCallback); 148 if (proxy == null) { 149 return; 150 } 151 } 152 mManager.abandonAppFocus(proxy); 153 } 154 155 @Override 156 public void onCarDisconnected() { 157 // nothing to do 158 } 159 160 private static class OnAppFocusChangedListenerProxy 161 implements android.car.CarAppFocusManager.OnAppFocusChangedListener { 162 163 private final OnAppFocusChangedListener mListener; 164 private final CarAppFocusManager mManager; 165 166 OnAppFocusChangedListenerProxy(CarAppFocusManager manager, 167 OnAppFocusChangedListener listener) { 168 mManager = manager; 169 mListener = listener; 170 } 171 172 @Override 173 public void onAppFocusChanged(int appType, boolean active) { 174 mListener.onAppFocusChanged(mManager, appType, active); 175 } 176 } 177 178 private static class OnAppFocusOwnershipCallbackProxy 179 implements android.car.CarAppFocusManager.OnAppFocusOwnershipCallback { 180 181 private final OnAppFocusOwnershipCallback mListener; 182 private final CarAppFocusManager mManager; 183 184 185 OnAppFocusOwnershipCallbackProxy(CarAppFocusManager manager, 186 OnAppFocusOwnershipCallback listener) { 187 mListener = listener; 188 mManager = manager; 189 } 190 191 @Override 192 public void onAppFocusOwnershipLost(int focusType) { 193 mListener.onAppFocusOwnershipLost(mManager, focusType); 194 } 195 196 @Override 197 public void onAppFocusOwnershipGranted(int focusType) { 198 mListener.onAppFocusOwnershipGranted(mManager, focusType); 199 } 200 } 201 } 202