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