14aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park/* 24aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * Copyright (C) 2015 The Android Open Source Project 34aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * 44aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * Licensed under the Apache License, Version 2.0 (the "License"); 54aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * you may not use this file except in compliance with the License. 64aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * You may obtain a copy of the License at 74aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * 84aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * http://www.apache.org/licenses/LICENSE-2.0 94aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * 104aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * Unless required by applicable law or agreed to in writing, software 114aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * distributed under the License is distributed on an "AS IS" BASIS, 124aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * See the License for the specific language governing permissions and 144aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * limitations under the License. 154aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park */ 16e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkpackage android.car.content.pm; 174aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park 18e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.annotation.SystemApi; 194aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Parkimport android.app.Service; 204aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Parkimport android.content.Intent; 214aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Parkimport android.os.Handler; 224aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Parkimport android.os.IBinder; 234aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Parkimport android.os.Looper; 244aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Parkimport android.os.RemoteException; 254aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Parkimport android.util.Log; 264aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park 274aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park/** 284aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * Service to be implemented by Service which wants to control app blocking policy. 29e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park * App should require android.car.permission.CONTROL_APP_BLOCKING to launch Service 304aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * implementation. Additionally the APK should have the permission to be launched by Car Service. 314aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * The implementing service should declare {@link #SERVICE_INTERFACE} in its intent filter as 324aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * action. 33280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv * @hide 344aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park */ 35e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park@SystemApi 364aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Parkpublic abstract class CarAppBlockingPolicyService extends Service { 374aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park 384aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park private static final String TAG = CarAppBlockingPolicyService.class.getSimpleName(); 394aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park 404aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park public static final String SERVICE_INTERFACE = 41e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park "android.car.content.pm.CarAppBlockingPolicyService"; 424aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park 434aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park private final ICarAppBlockingPoicyImpl mBinder = new ICarAppBlockingPoicyImpl(); 444aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park private Handler mHandler; 454aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park 464aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park /** 474aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * Return the app blocking policy. This is called from binder thread. 484aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park * @return 494aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park */ 504aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park protected abstract CarAppBlockingPolicy getAppBlockingPolicy(); 514aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park 524aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park @Override 534aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park public int onStartCommand(Intent intent, int flags, int startId) { 544aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park return START_STICKY; 554aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park } 564aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park 574aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park @Override 584aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park public IBinder onBind(Intent intent) { 594aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park Log.i(TAG, "onBind"); 604aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park return mBinder; 614aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park } 624aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park 634aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park @Override 644aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park public boolean onUnbind(Intent intent) { 654aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park Log.i(TAG, "onUnbind"); 664aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park stopSelf(); 674aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park return false; 684aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park } 694aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park 704aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park 714aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park private class ICarAppBlockingPoicyImpl extends ICarAppBlockingPolicy.Stub { 724aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park 734aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park @Override 744aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park public void setAppBlockingPolicySetter(ICarAppBlockingPolicySetter setter) { 754aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park Log.i(TAG, "setAppBlockingPolicySetter will set policy"); 764aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park CarAppBlockingPolicy policy = CarAppBlockingPolicyService.this.getAppBlockingPolicy(); 774aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park try { 784aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park setter.setAppBlockingPolicy(policy); 794aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park } catch (RemoteException e) { 804aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park // if car service crashed, it will retry later. 814aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park } 824aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park } 834aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park } 844aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park} 85