blob: 1cdbfc7a279483b131fb776a8ff454f00d531611 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.car.content.pm;
import android.annotation.IntDef;
import android.annotation.SystemApi;
import android.car.CarApiUtil;
import android.car.CarManagerBase;
import android.car.CarNotConnectedException;
import android.content.Context;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* Provides car specific API related with package management.
*/
public class CarPackageManager implements CarManagerBase {
/**
* Flag for {@link #setAppBlockingPolicy(String, CarAppBlockingPolicy, int)}. When this
* flag is set, the call will be blocked until policy is set to system. This can take time
* and the flag cannot be used in main thread.
* @hide
*/
@SystemApi
public static final int FLAG_SET_POLICY_WAIT_FOR_CHANGE = 0x1;
/**
* Flag for {@link #setAppBlockingPolicy(String, CarAppBlockingPolicy, int)}. When this
* flag is set, passed policy is added to existing policy set from the current package.
* If none of {@link #FLAG_SET_POLICY_ADD} or {@link #FLAG_SET_POLICY_REMOVE} is set, existing
* policy is replaced. Note that policy per each package is always replaced and will not be
* added.
* @hide
*/
@SystemApi
public static final int FLAG_SET_POLICY_ADD = 0x2;
/**
* Flag for {@link #setAppBlockingPolicy(String, CarAppBlockingPolicy, int)}. When this
* flag is set, passed policy is removed from existing policy set from the current package.
* If none of {@link #FLAG_SET_POLICY_ADD} or {@link #FLAG_SET_POLICY_REMOVE} is set, existing
* policy is replaced.
* @hide
*/
@SystemApi
public static final int FLAG_SET_POLICY_REMOVE = 0x4;
/** @hide */
@IntDef(flag = true,
value = {FLAG_SET_POLICY_WAIT_FOR_CHANGE, FLAG_SET_POLICY_ADD, FLAG_SET_POLICY_REMOVE})
@Retention(RetentionPolicy.SOURCE)
public @interface SetPolicyFlags {}
private final ICarPackageManager mService;
private final Context mContext;
/** @hide */
public CarPackageManager(IBinder service, Context context) {
mService = ICarPackageManager.Stub.asInterface(service);
mContext = context;
}
/** @hide */
@Override
public void onCarDisconnected() {
// nothing to do
}
/**
* Set Application blocking policy for system app. {@link #FLAG_SET_POLICY_ADD} or
* {@link #FLAG_SET_POLICY_REMOVE} flag allows adding or removing from already set policy. When
* none of these flags are set, it will completely replace existing policy for each package
* specified.
* When {@link #FLAG_SET_POLICY_WAIT_FOR_CHANGE} flag is set, this call will be blocked
* until the policy is set to system and become effective. Otherwise, the call will start
* changing the policy but it will be completed asynchronously and the call will return
* without waiting for system level policy change.
*
* @param packageName Package name of the client. If wrong package name is passed, exception
* will be thrown. This name is used to update the policy.
* @param policy
* @param flags
* @throws SecurityException if caller has no permission.
* @throws IllegalArgumentException For wrong or invalid arguments.
* @throws IllegalStateException If {@link #FLAG_SET_POLICY_WAIT_FOR_CHANGE} is set while
* called from main thread.
* @hide
*/
@SystemApi
public void setAppBlockingPolicy(String packageName, CarAppBlockingPolicy policy,
@SetPolicyFlags int flags) throws CarNotConnectedException, SecurityException,
IllegalArgumentException {
if ((flags & FLAG_SET_POLICY_WAIT_FOR_CHANGE) != 0 &&
Looper.getMainLooper().isCurrentThread()) {
throw new IllegalStateException(
"FLAG_SET_POLICY_WAIT_FOR_CHANGE cannot be used in main thread");
}
try {
mService.setAppBlockingPolicy(packageName, policy, flags);
} catch (IllegalStateException e) {
CarApiUtil.checkCarNotConnectedExceptionFromCarService(e);
} catch (RemoteException e) {
//ignore as CarApi will handle disconnection anyway.
}
}
/**
* Check if given activity is allowed while driving.
* @param packageName
* @param className
* @return
*/
public boolean isActivityAllowedWhileDriving(String packageName, String className)
throws CarNotConnectedException{
try {
return mService.isActivityAllowedWhileDriving(packageName, className);
} catch (IllegalStateException e) {
CarApiUtil.checkCarNotConnectedExceptionFromCarService(e);
} catch (RemoteException e) {
//ignore as CarApi will handle disconnection anyway.
}
return false;
}
/**
* Check if given service is allowed while driving.
* @param packageName
* @param className
* @return
*/
public boolean isServiceAllowedWhileDriving(String packageName, String className)
throws CarNotConnectedException {
try {
return mService.isServiceAllowedWhileDriving(packageName, className);
} catch (IllegalStateException e) {
CarApiUtil.checkCarNotConnectedExceptionFromCarService(e);
} catch (RemoteException e) {
//ignore as CarApi will handle disconnection anyway.
}
return false;
}
}