155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz/* 255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * Copyright (C) 2017 The Android Open Source Project 355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * 455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * Licensed under the Apache License, Version 2.0 (the "License"); 555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * you may not use this file except in compliance with the License. 655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * You may obtain a copy of the License at 755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * 855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * http://www.apache.org/licenses/LICENSE-2.0 955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * 1055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * Unless required by applicable law or agreed to in writing, software 1155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * distributed under the License is distributed on an "AS IS" BASIS, 1255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * See the License for the specific language governing permissions and 1455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * limitations under the License. 1555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz */ 1655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 1755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzpackage com.android.frameworks.coretests.binderproxycountingtestapp; 1855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 1955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.app.Service; 2055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.content.BroadcastReceiver; 2155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.content.ComponentName; 2255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.content.Context; 2355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.content.Intent; 2455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.content.IntentFilter; 2555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.content.ServiceConnection; 2655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.os.IBinder; 2755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.os.RemoteException; 2855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.util.Log; 2955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 3055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport com.android.frameworks.coretests.aidl.IBinderProxyCountingService; 3155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport com.android.frameworks.coretests.aidl.IBpcTestAppCmdService; 3255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport com.android.frameworks.coretests.aidl.ITestRemoteCallback; 3355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 3455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport java.util.ArrayList; 3555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport java.util.concurrent.CountDownLatch; 3655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport java.util.concurrent.TimeUnit; 3755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 3855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzpublic class BpcTestAppCmdService extends Service { 3955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz private static final String TAG = BpcTestAppCmdService.class.getSimpleName(); 4055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 4155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz private static final String TEST_SERVICE_PKG = 4255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz "com.android.frameworks.coretests.binderproxycountingtestservice"; 4355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz private static final String TEST_SERVICE_CLASS = 4455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz TEST_SERVICE_PKG + ".BinderProxyCountingService"; 4555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz private static final int BIND_SERVICE_TIMEOUT_SEC = 5; 4655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 4755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz private static ServiceConnection mServiceConnection; 4855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz private static IBinderProxyCountingService mBpcService; 4955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 5055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz private IBpcTestAppCmdService.Stub mBinder = new IBpcTestAppCmdService.Stub() { 5155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 5255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz private ArrayList<BroadcastReceiver> mBrList = new ArrayList(); 5355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz private ArrayList<ITestRemoteCallback> mTrcList = new ArrayList(); 5455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 5555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 5655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public void createSystemBinders(int count) { 5755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz int i = 0; 5855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz while (i++ < count) { 5955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz BroadcastReceiver br = new BroadcastReceiver() { 6055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 6155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public void onReceive(Context context, Intent intent) { 6255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 6355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 6455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz }; 6555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz IntentFilter filt = new IntentFilter(Intent.ACTION_POWER_DISCONNECTED); 6655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz synchronized (mBrList) { 6755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz mBrList.add(br); 6855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 6955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz registerReceiver(br, filt); 7055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 7155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 7255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 7355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 7455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public void releaseSystemBinders(int count) { 7555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz int i = 0; 7655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz while (i++ < count) { 7755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz BroadcastReceiver br; 7855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz synchronized (mBrList) { 7955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz br = mBrList.remove(0); 8055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 8155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz unregisterReceiver(br); 8255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 8355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 8455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 8555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 8655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public void createTestBinders(int count) { 8755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz int i = 0; 8855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz while (i++ < count) { 8955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz ITestRemoteCallback cb = new ITestRemoteCallback.Stub() {}; 9055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz synchronized (mTrcList) { 9155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz mTrcList.add(cb); 9255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 9355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz try { 9455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz mBpcService.registerCallback(cb); 9555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } catch (RemoteException e) { 9655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz Log.e(TAG, "RemoteException caught! " + e); 9755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 9855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 9955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 10055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 10155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 10255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public void releaseTestBinders(int count) { 10355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz int i = 0; 10455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz while (i++ < count) { 10555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 10655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz ITestRemoteCallback cb; 10755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz synchronized (mTrcList) { 10855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz cb = mTrcList.remove(0); 10955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 11055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz try { 11155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz mBpcService.unregisterCallback(cb); 11255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } catch (RemoteException e) { 11355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz Log.e(TAG, "RemoteException caught! " + e); 11455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 11555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 11655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 11755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 11855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 11955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public void releaseAllBinders() { 12055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz synchronized (mBrList) { 12155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz while (mBrList.size() > 0) { 12255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz unregisterReceiver(mBrList.remove(0)); 12355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 12455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 12555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz synchronized (mTrcList) { 12655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz while (mTrcList.size() > 0) { 12755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz try { 12855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz mBpcService.unregisterCallback(mTrcList.remove(0)); 12955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } catch (RemoteException e) { 13055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz Log.e(TAG, "RemoteException caught! " + e); 13155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 13255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 13355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 13455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 13555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 13655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 13755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public String bindToTestService() { 13855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz try { 13955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz final CountDownLatch bindLatch = new CountDownLatch(1); 14055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz mServiceConnection = new ServiceConnection() { 14155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 14255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public void onServiceConnected(ComponentName name, IBinder service) { 14355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz Log.i(TAG, "Service connected"); 14455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz mBpcService = IBinderProxyCountingService.Stub.asInterface(service); 14555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz bindLatch.countDown(); 14655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 14755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 14855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 14955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public void onServiceDisconnected(ComponentName name) { 15055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz Log.i(TAG, "Service disconnected"); 15155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 15255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz }; 15355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz final Intent intent = new Intent() 15455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz .setComponent(new ComponentName(TEST_SERVICE_PKG, TEST_SERVICE_CLASS)); 15555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz bindService(intent, mServiceConnection, 15655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz Context.BIND_AUTO_CREATE 15755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz | Context.BIND_ALLOW_OOM_MANAGEMENT 15855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz | Context.BIND_NOT_FOREGROUND); 15955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz if (!bindLatch.await(BIND_SERVICE_TIMEOUT_SEC, TimeUnit.SECONDS)) { 16055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz throw new RuntimeException("Failed to bind to " + TEST_SERVICE_CLASS); 16155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 16255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } catch (Exception e) { 16355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz unbindFromTestService(); 16455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz Log.e(TAG, e.toString()); 16555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz return e.toString(); 16655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 16755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz return null; 16855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 16955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 17055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 17155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public void unbindFromTestService() { 17255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz if (mBpcService != null) { 17355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz unbindService(mServiceConnection); 17455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 17555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 17655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz }; 17755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz 17855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz @Override 17955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz public IBinder onBind(Intent intent) { 18055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz return mBinder; 18155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz } 18255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz}