Home | History | Annotate | Download | only in pm
      1 /*
      2  * Copyright (C) 2015 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.car.content.pm;
     18 
     19 import android.annotation.IntDef;
     20 import android.annotation.SystemApi;
     21 import android.car.CarApiUtil;
     22 import android.car.CarManagerBase;
     23 import android.car.CarNotConnectedException;
     24 import android.content.ComponentName;
     25 import android.content.Context;
     26 import android.os.IBinder;
     27 import android.os.Looper;
     28 import android.os.RemoteException;
     29 
     30 import java.lang.annotation.Retention;
     31 import java.lang.annotation.RetentionPolicy;
     32 
     33 /**
     34  * Provides car specific API related with package management.
     35  */
     36 public final class CarPackageManager implements CarManagerBase {
     37 
     38     /**
     39      * Flag for {@link #setAppBlockingPolicy(String, CarAppBlockingPolicy, int)}. When this
     40      * flag is set, the call will be blocked until policy is set to system. This can take time
     41      * and the flag cannot be used in main thread.
     42      * @hide
     43      */
     44     @SystemApi
     45     public static final int FLAG_SET_POLICY_WAIT_FOR_CHANGE = 0x1;
     46     /**
     47      * Flag for {@link #setAppBlockingPolicy(String, CarAppBlockingPolicy, int)}. When this
     48      * flag is set, passed policy is added to existing policy set from the current package.
     49      * If none of {@link #FLAG_SET_POLICY_ADD} or {@link #FLAG_SET_POLICY_REMOVE} is set, existing
     50      * policy is replaced. Note that policy per each package is always replaced and will not be
     51      * added.
     52      * @hide
     53      */
     54     @SystemApi
     55     public static final int FLAG_SET_POLICY_ADD = 0x2;
     56     /**
     57      * Flag for {@link #setAppBlockingPolicy(String, CarAppBlockingPolicy, int)}. When this
     58      * flag is set, passed policy is removed from existing policy set from the current package.
     59      * If none of {@link #FLAG_SET_POLICY_ADD} or {@link #FLAG_SET_POLICY_REMOVE} is set, existing
     60      * policy is replaced.
     61      * @hide
     62      */
     63     @SystemApi
     64     public static final int FLAG_SET_POLICY_REMOVE = 0x4;
     65 
     66     /** @hide */
     67     @IntDef(flag = true,
     68             value = {FLAG_SET_POLICY_WAIT_FOR_CHANGE, FLAG_SET_POLICY_ADD, FLAG_SET_POLICY_REMOVE})
     69     @Retention(RetentionPolicy.SOURCE)
     70     public @interface SetPolicyFlags {}
     71 
     72     private final ICarPackageManager mService;
     73     private final Context mContext;
     74 
     75     /** @hide */
     76     public CarPackageManager(IBinder service, Context context) {
     77         mService = ICarPackageManager.Stub.asInterface(service);
     78         mContext = context;
     79     }
     80 
     81     /** @hide */
     82     @Override
     83     public void onCarDisconnected() {
     84         // nothing to do
     85     }
     86 
     87     /**
     88      * Set Application blocking policy for system app. {@link #FLAG_SET_POLICY_ADD} or
     89      * {@link #FLAG_SET_POLICY_REMOVE} flag allows adding or removing from already set policy. When
     90      * none of these flags are set, it will completely replace existing policy for each package
     91      * specified.
     92      * When {@link #FLAG_SET_POLICY_WAIT_FOR_CHANGE} flag is set, this call will be blocked
     93      * until the policy is set to system and become effective. Otherwise, the call will start
     94      * changing the policy but it will be completed asynchronously and the call will return
     95      * without waiting for system level policy change.
     96      *
     97      * @param packageName Package name of the client. If wrong package name is passed, exception
     98      *        will be thrown. This name is used to update the policy.
     99      * @param policy
    100      * @param flags
    101      * @throws SecurityException if caller has no permission.
    102      * @throws IllegalArgumentException For wrong or invalid arguments.
    103      * @throws IllegalStateException If {@link #FLAG_SET_POLICY_WAIT_FOR_CHANGE} is set while
    104      *         called from main thread.
    105      * @hide
    106      */
    107     @SystemApi
    108     public void setAppBlockingPolicy(String packageName, CarAppBlockingPolicy policy,
    109             @SetPolicyFlags int flags) throws CarNotConnectedException, SecurityException,
    110             IllegalArgumentException {
    111         if ((flags & FLAG_SET_POLICY_WAIT_FOR_CHANGE) != 0 &&
    112                 Looper.getMainLooper().isCurrentThread()) {
    113             throw new IllegalStateException(
    114                     "FLAG_SET_POLICY_WAIT_FOR_CHANGE cannot be used in main thread");
    115         }
    116         try {
    117             mService.setAppBlockingPolicy(packageName, policy, flags);
    118         } catch (IllegalStateException e) {
    119             CarApiUtil.checkCarNotConnectedExceptionFromCarService(e);
    120         } catch (RemoteException e) {
    121             //ignore as CarApi will handle disconnection anyway.
    122         }
    123     }
    124 
    125     /**
    126      * Check if finishing Activity will lead into safe Activity (=allowed Activity) to be shown.
    127      * This can be used by unsafe activity blocking Activity to check if finishing itself can
    128      * lead into being launched again due to unsafe activity shown. Note that checking this does not
    129      * guarantee that blocking will not be done as driving state can change after this call is made.
    130      *
    131      * @param activityName
    132      * @return true if there is a safe Activity (or car is stopped) in the back of task stack
    133      *         so that finishing the Activity will not trigger another Activity blocking. If
    134      *         the given Activity is not in foreground, then it will return true as well as
    135      *         finishing the Activity will not make any difference.
    136      *
    137      * @hide
    138      */
    139     @SystemApi
    140     public boolean isActivityBackedBySafeActivity(ComponentName activityName)
    141             throws CarNotConnectedException {
    142         try {
    143             return mService.isActivityBackedBySafeActivity(activityName);
    144         } catch (IllegalStateException e) {
    145             CarApiUtil.checkCarNotConnectedExceptionFromCarService(e);
    146         } catch (RemoteException e) {
    147             //ignore as CarApi will handle disconnection anyway.
    148         }
    149         return true;
    150     }
    151 
    152     /**
    153      * Check if given activity is allowed while driving.
    154      * @param packageName
    155      * @param className
    156      * @return
    157      */
    158     public boolean isActivityAllowedWhileDriving(String packageName, String className)
    159             throws CarNotConnectedException {
    160         try {
    161             return mService.isActivityAllowedWhileDriving(packageName, className);
    162         } catch (IllegalStateException e) {
    163             CarApiUtil.checkCarNotConnectedExceptionFromCarService(e);
    164         } catch (RemoteException e) {
    165             //ignore as CarApi will handle disconnection anyway.
    166         }
    167         return false;
    168     }
    169 
    170     /**
    171      * Check if given service is allowed while driving.
    172      * @param packageName
    173      * @param className
    174      * @return
    175      */
    176     public boolean isServiceAllowedWhileDriving(String packageName, String className)
    177             throws CarNotConnectedException {
    178         try {
    179             return mService.isServiceAllowedWhileDriving(packageName, className);
    180         } catch (IllegalStateException e) {
    181             CarApiUtil.checkCarNotConnectedExceptionFromCarService(e);
    182         } catch (RemoteException e) {
    183             //ignore as CarApi will handle disconnection anyway.
    184         }
    185         return false;
    186     }
    187 }
    188