From 409f371488d2ed97101dfb0e42852e89a19147db Mon Sep 17 00:00:00 2001 From: David Su Date: Thu, 24 Oct 2019 11:18:41 -0700 Subject: [PATCH] Removed references to Manager AIDL from constructors Converted constructors of Wifi Managers to not reference their AIDL interfaces since they are @hide and cannot be referenced by the platform. Bug: 140299412 Test: atest FrameworksWifiApiTests Change-Id: If43ce6916ddee5357cdcc8cd27d5620a67d21165 --- api/system-current.txt | 4 + .../android/app/SystemServiceRegistry.java | 72 +---------- wifi/java/android/net/wifi/RttManager.java | 2 +- .../net/wifi/WifiFrameworkInitializer.java | 119 ++++++++++++++++++ wifi/java/android/net/wifi/WifiManager.java | 8 +- wifi/java/android/net/wifi/WifiScanner.java | 7 +- .../net/wifi/aware/WifiAwareManager.java | 2 +- .../android/net/wifi/rtt/WifiRttManager.java | 2 +- 8 files changed, 138 insertions(+), 78 deletions(-) create mode 100644 wifi/java/android/net/wifi/WifiFrameworkInitializer.java diff --git a/api/system-current.txt b/api/system-current.txt index f74b74318180c..7fa155fd517a0 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4853,6 +4853,10 @@ package android.net.wifi { field @Deprecated public static final int WPA2_PSK = 4; // 0x4 } + public class WifiFrameworkInitializer { + method public static void registerServiceWrappers(); + } + public class WifiInfo implements android.os.Parcelable { method @Nullable public String getAppPackageName(); method public double getRxSuccessRate(); diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 5effa1b998133..0bfd2c6f5f706 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -116,16 +116,7 @@ import android.net.lowpan.ILowpanManager; import android.net.lowpan.LowpanManager; import android.net.nsd.INsdManager; import android.net.nsd.NsdManager; -import android.net.wifi.IWifiScanner; -import android.net.wifi.RttManager; -import android.net.wifi.WifiManager; -import android.net.wifi.WifiScanner; -import android.net.wifi.aware.IWifiAwareManager; -import android.net.wifi.aware.WifiAwareManager; -import android.net.wifi.p2p.IWifiP2pManager; -import android.net.wifi.p2p.WifiP2pManager; -import android.net.wifi.rtt.IWifiRttManager; -import android.net.wifi.rtt.WifiRttManager; +import android.net.wifi.WifiFrameworkInitializer; import android.nfc.NfcManager; import android.os.BatteryManager; import android.os.BatteryStats; @@ -691,66 +682,6 @@ public final class SystemServiceRegistry { ConnectivityThread.getInstanceLooper()); }}); - registerService(Context.WIFI_SERVICE, WifiManager.class, - new CachedServiceFetcher() { - @Override - public WifiManager createService(ContextImpl ctx) { - return new WifiManager(ctx.getOuterContext(), - ConnectivityThread.getInstanceLooper()); - }}); - - registerService(Context.WIFI_P2P_SERVICE, WifiP2pManager.class, - new StaticServiceFetcher() { - @Override - public WifiP2pManager createService() throws ServiceNotFoundException { - IBinder b = ServiceManager.getServiceOrThrow(Context.WIFI_P2P_SERVICE); - IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b); - return new WifiP2pManager(service); - }}); - - registerService(Context.WIFI_AWARE_SERVICE, WifiAwareManager.class, - new CachedServiceFetcher() { - @Override - public WifiAwareManager createService(ContextImpl ctx) throws ServiceNotFoundException { - IBinder b = ServiceManager.getServiceOrThrow(Context.WIFI_AWARE_SERVICE); - IWifiAwareManager service = IWifiAwareManager.Stub.asInterface(b); - if (service == null) { - return null; - } - return new WifiAwareManager(ctx.getOuterContext(), service); - }}); - - registerService(Context.WIFI_SCANNING_SERVICE, WifiScanner.class, - new CachedServiceFetcher() { - @Override - public WifiScanner createService(ContextImpl ctx) throws ServiceNotFoundException { - IBinder b = ServiceManager.getServiceOrThrow(Context.WIFI_SCANNING_SERVICE); - IWifiScanner service = IWifiScanner.Stub.asInterface(b); - return new WifiScanner(ctx.getOuterContext(), service, - ConnectivityThread.getInstanceLooper()); - }}); - - registerService(Context.WIFI_RTT_SERVICE, RttManager.class, - new CachedServiceFetcher() { - @Override - public RttManager createService(ContextImpl ctx) throws ServiceNotFoundException { - IBinder b = ServiceManager.getServiceOrThrow(Context.WIFI_RTT_RANGING_SERVICE); - IWifiRttManager service = IWifiRttManager.Stub.asInterface(b); - return new RttManager(ctx.getOuterContext(), - new WifiRttManager(ctx.getOuterContext(), service)); - }}); - - registerService(Context.WIFI_RTT_RANGING_SERVICE, WifiRttManager.class, - new CachedServiceFetcher() { - @Override - public WifiRttManager createService(ContextImpl ctx) - throws ServiceNotFoundException { - IBinder b = ServiceManager.getServiceOrThrow( - Context.WIFI_RTT_RANGING_SERVICE); - IWifiRttManager service = IWifiRttManager.Stub.asInterface(b); - return new WifiRttManager(ctx.getOuterContext(), service); - }}); - registerService(Context.ETHERNET_SERVICE, EthernetManager.class, new CachedServiceFetcher() { @Override @@ -1265,6 +1196,7 @@ public final class SystemServiceRegistry { BlobStoreManagerFrameworkInitializer.initialize(); TelephonyFrameworkInitializer.registerServiceWrappers(); AppSearchManagerFrameworkInitializer.initialize(); + WifiFrameworkInitializer.registerServiceWrappers(); } finally { // If any of the above code throws, we're in a pretty bad shape and the process // will likely crash, but we'll reset it just in case there's an exception handler... diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java index 6a03c73bc3f98..73c52ab0ab1b2 100644 --- a/wifi/java/android/net/wifi/RttManager.java +++ b/wifi/java/android/net/wifi/RttManager.java @@ -1212,7 +1212,7 @@ public class RttManager { * * @hide */ - public RttManager(Context context, WifiRttManager service) { + public RttManager(@NonNull Context context, @NonNull WifiRttManager service) { mNewService = service; mContext = context; diff --git a/wifi/java/android/net/wifi/WifiFrameworkInitializer.java b/wifi/java/android/net/wifi/WifiFrameworkInitializer.java new file mode 100644 index 0000000000000..775043ae32910 --- /dev/null +++ b/wifi/java/android/net/wifi/WifiFrameworkInitializer.java @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.net.wifi; + +import android.annotation.SystemApi; +import android.app.SystemServiceRegistry; +import android.content.Context; +import android.net.wifi.aware.IWifiAwareManager; +import android.net.wifi.aware.WifiAwareManager; +import android.net.wifi.p2p.IWifiP2pManager; +import android.net.wifi.p2p.WifiP2pManager; +import android.net.wifi.rtt.IWifiRttManager; +import android.net.wifi.rtt.WifiRttManager; +import android.os.HandlerThread; +import android.os.Looper; + +/** + * Class for performing registration for all Wifi services. + * + * @hide + */ +@SystemApi +public class WifiFrameworkInitializer { + + /** + * A class implementing the lazy holder idiom: the unique static instance + * of {@link #INSTANCE} is instantiated in a thread-safe way (guaranteed by + * the language specs) the first time that NoPreloadHolder is referenced in getInstanceLooper(). + * + * This is necessary because we can't spawn a new thread in {@link #registerServiceWrappers()}. + * {@link #registerServiceWrappers()} is called during the Zygote phase, which disallows + * spawning new threads. Naming the class "NoPreloadHolder" ensures that the classloader will + * not preload this class, inadvertently spawning the thread too early. + */ + private static class NoPreloadHolder { + private static final HandlerThread INSTANCE = createInstance(); + + private static HandlerThread createInstance() { + HandlerThread thread = new HandlerThread("WifiManagerThread"); + thread.start(); + return thread; + } + } + + private static Looper getInstanceLooper() { + return NoPreloadHolder.INSTANCE.getLooper(); + } + + private WifiFrameworkInitializer() {} + + /** + * Called by {@link SystemServiceRegistry}'s static initializer and registers all Wifi services + * to {@link Context}, so that {@link Context#getSystemService} can return them. + * + * @throws IllegalStateException if this is called from anywhere besides + * {@link SystemServiceRegistry} + */ + public static void registerServiceWrappers() { + SystemServiceRegistry.registerContextAwareService( + Context.WIFI_SERVICE, + WifiManager.class, + context -> new WifiManager(context, getInstanceLooper()) + ); + SystemServiceRegistry.registerStaticService( + Context.WIFI_P2P_SERVICE, + WifiP2pManager.class, + serviceBinder -> { + IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(serviceBinder); + return new WifiP2pManager(service); + } + ); + SystemServiceRegistry.registerContextAwareService( + Context.WIFI_AWARE_SERVICE, + WifiAwareManager.class, + (context, serviceBinder) -> { + IWifiAwareManager service = IWifiAwareManager.Stub.asInterface(serviceBinder); + return new WifiAwareManager(context, service); + } + ); + SystemServiceRegistry.registerContextAwareService( + Context.WIFI_SCANNING_SERVICE, + WifiScanner.class, + (context, serviceBinder) -> { + IWifiScanner service = IWifiScanner.Stub.asInterface(serviceBinder); + return new WifiScanner(context, service, getInstanceLooper()); + } + ); + SystemServiceRegistry.registerContextAwareService( + Context.WIFI_RTT_SERVICE, + RttManager.class, + (context, serviceBinder) -> { + IWifiRttManager service = IWifiRttManager.Stub.asInterface(serviceBinder); + WifiRttManager wifiRttManager = new WifiRttManager(context, service); + return new RttManager(context, wifiRttManager); + } + ); + SystemServiceRegistry.registerContextAwareService( + Context.WIFI_RTT_RANGING_SERVICE, + WifiRttManager.class, + (context, serviceBinder) -> { + IWifiRttManager service = IWifiRttManager.Stub.asInterface(serviceBinder); + return new WifiRttManager(context, service); + } + ); + } +} diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 6c2a08c14082c..342f043d58010 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -1215,11 +1215,13 @@ public class WifiManager { * Applications will almost always want to use * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve * the standard {@link android.content.Context#WIFI_SERVICE Context.WIFI_SERVICE}. + * * @param context the application context - * @hide - hide this because it takes in a parameter of type IWifiManager, which - * is a system private class. + * @param looper the Looper used to deliver callbacks + * + * @hide */ - public WifiManager(Context context, Looper looper) { + public WifiManager(@NonNull Context context, @NonNull Looper looper) { mContext = context; mLooper = looper; mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion; diff --git a/wifi/java/android/net/wifi/WifiScanner.java b/wifi/java/android/net/wifi/WifiScanner.java index 0d36718f07f1c..771f3b8194984 100644 --- a/wifi/java/android/net/wifi/WifiScanner.java +++ b/wifi/java/android/net/wifi/WifiScanner.java @@ -1291,12 +1291,15 @@ public class WifiScanner { * Applications will almost always want to use * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve * the standard {@link android.content.Context#WIFI_SERVICE Context.WIFI_SERVICE}. + * * @param context the application context - * @param service the Binder interface + * @param service the Binder interface for {@link Context#WIFI_SCANNING_SERVICE} * @param looper the Looper used to deliver callbacks + * * @hide */ - public WifiScanner(Context context, IWifiScanner service, Looper looper) { + public WifiScanner(@NonNull Context context, @NonNull IWifiScanner service, + @NonNull Looper looper) { mContext = context; mService = service; diff --git a/wifi/java/android/net/wifi/aware/WifiAwareManager.java b/wifi/java/android/net/wifi/aware/WifiAwareManager.java index 5aab3470d979d..7b37d652426dd 100644 --- a/wifi/java/android/net/wifi/aware/WifiAwareManager.java +++ b/wifi/java/android/net/wifi/aware/WifiAwareManager.java @@ -158,7 +158,7 @@ public class WifiAwareManager { private final Object mLock = new Object(); // lock access to the following vars /** @hide */ - public WifiAwareManager(Context context, IWifiAwareManager service) { + public WifiAwareManager(@NonNull Context context, @NonNull IWifiAwareManager service) { mContext = context; mService = service; } diff --git a/wifi/java/android/net/wifi/rtt/WifiRttManager.java b/wifi/java/android/net/wifi/rtt/WifiRttManager.java index 770a12096806c..cb0c5d41df906 100644 --- a/wifi/java/android/net/wifi/rtt/WifiRttManager.java +++ b/wifi/java/android/net/wifi/rtt/WifiRttManager.java @@ -77,7 +77,7 @@ public class WifiRttManager { "android.net.wifi.rtt.action.WIFI_RTT_STATE_CHANGED"; /** @hide */ - public WifiRttManager(Context context, IWifiRttManager service) { + public WifiRttManager(@NonNull Context context, @NonNull IWifiRttManager service) { mContext = context; mService = service; }