1 /* 2 * Copyright (C) 2006 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.os; 18 19 import android.compat.annotation.UnsupportedAppUsage; 20 21 /** 22 * Native implementation of the service manager. Most clients will only 23 * care about asInterface(). 24 * 25 * @hide 26 */ 27 public final class ServiceManagerNative { ServiceManagerNative()28 private ServiceManagerNative() {} 29 30 /** 31 * Cast a Binder object into a service manager interface, generating 32 * a proxy if needed. 33 * 34 * TODO: delete this method and have clients use 35 * IServiceManager.Stub.asInterface instead 36 */ 37 @UnsupportedAppUsage asInterface(IBinder obj)38 public static IServiceManager asInterface(IBinder obj) { 39 if (obj == null) { 40 return null; 41 } 42 43 // ServiceManager is never local 44 return new ServiceManagerProxy(obj); 45 } 46 } 47 48 // This class should be deleted and replaced with IServiceManager.Stub whenever 49 // mRemote is no longer used 50 class ServiceManagerProxy implements IServiceManager { ServiceManagerProxy(IBinder remote)51 public ServiceManagerProxy(IBinder remote) { 52 mRemote = remote; 53 mServiceManager = IServiceManager.Stub.asInterface(remote); 54 } 55 asBinder()56 public IBinder asBinder() { 57 return mRemote; 58 } 59 60 @UnsupportedAppUsage getService(String name)61 public IBinder getService(String name) throws RemoteException { 62 // Same as checkService (old versions of servicemanager had both methods). 63 return mServiceManager.checkService(name); 64 } 65 checkService(String name)66 public IBinder checkService(String name) throws RemoteException { 67 return mServiceManager.checkService(name); 68 } 69 addService(String name, IBinder service, boolean allowIsolated, int dumpPriority)70 public void addService(String name, IBinder service, boolean allowIsolated, int dumpPriority) 71 throws RemoteException { 72 mServiceManager.addService(name, service, allowIsolated, dumpPriority); 73 } 74 listServices(int dumpPriority)75 public String[] listServices(int dumpPriority) throws RemoteException { 76 return mServiceManager.listServices(dumpPriority); 77 } 78 registerForNotifications(String name, IServiceCallback cb)79 public void registerForNotifications(String name, IServiceCallback cb) 80 throws RemoteException { 81 throw new RemoteException(); 82 } 83 unregisterForNotifications(String name, IServiceCallback cb)84 public void unregisterForNotifications(String name, IServiceCallback cb) 85 throws RemoteException { 86 throw new RemoteException(); 87 } 88 isDeclared(String name)89 public boolean isDeclared(String name) throws RemoteException { 90 throw new RemoteException(); 91 } 92 registerClientCallback(String name, IBinder service, IClientCallback cb)93 public void registerClientCallback(String name, IBinder service, IClientCallback cb) 94 throws RemoteException { 95 throw new RemoteException(); 96 } 97 tryUnregisterService(String name, IBinder service)98 public void tryUnregisterService(String name, IBinder service) throws RemoteException { 99 throw new RemoteException(); 100 } 101 102 /** 103 * Same as mServiceManager but used by apps. 104 * 105 * Once this can be removed, ServiceManagerProxy should be removed entirely. 106 */ 107 @UnsupportedAppUsage 108 private IBinder mRemote; 109 110 private IServiceManager mServiceManager; 111 } 112