blob: 0c3222dab5abba0ae477d605a8826db7b98ae856 [file] [log] [blame]
/*
* Copyright (C) 2021 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.builtin.content.pm;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.UserIdInt;
import android.app.ActivityThread;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.ComponentInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.RemoteException;
import android.text.TextUtils;
/**
* Helper class for {@code PackageManager}.
*
* @hide
*/
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public final class PackageManagerHelper {
/**
* Read only property which contains semicolon (;) separated list of RRO packages.
*
* <p>
* RRO packages would be enabled if they are overlaying {@code CarServiceUpdatable}.
* {@code CarServiceUpdatable} can have different package names and this property may include
* all RROs to cover different {@code CarServiceUpdatable} package names but only those
* overriding the current {@code CarServiceUpdatable} package name will be selected.
*/
public static final String PROPERTY_CAR_SERVICE_OVERLAY_PACKAGES =
"ro.android.car.service.overlay.packages";
private PackageManagerHelper() {
throw new UnsupportedOperationException("provides only static methods");
}
/**
* Gets the name of the {@code SystemUI} package.
* @param context
* @return
*/
@NonNull
public static String getSystemUiPackageName(@NonNull Context context) {
// TODO(157082995): This information can be taken from
// PackageManageInternalImpl.getSystemUiServiceComponent()
String flattenName = context.getResources()
.getString(com.android.internal.R.string.config_systemUIServiceComponent);
if (TextUtils.isEmpty(flattenName)) {
throw new IllegalStateException("No "
+ "com.android.internal.R.string.config_systemUIServiceComponent resource");
}
try {
ComponentName componentName = ComponentName.unflattenFromString(flattenName);
return componentName.getPackageName();
} catch (RuntimeException e) {
throw new IllegalStateException("Invalid component name defined by "
+ "com.android.internal.R.string.config_systemUIServiceComponent resource: "
+ flattenName);
}
}
/** Check {@link PackageManager#getPackageInfoAsUser(String, int, int)}. */
public static PackageInfo getPackageInfoAsUser(@NonNull PackageManager pm,
@NonNull String packageName, int packageInfoFlags,
@UserIdInt int userId) throws PackageManager.NameNotFoundException {
return pm.getPackageInfoAsUser(packageName, packageInfoFlags, userId);
}
/** Check {@link PackageManager#getPackageUidAsUser(String, int)}. */
public static int getPackageUidAsUser(@NonNull PackageManager pm, @NonNull String packageName,
@UserIdInt int userId) throws PackageManager.NameNotFoundException {
return pm.getPackageUidAsUser(packageName, userId);
}
/** Check {@link PackageManager#getNamesForUids(int[])}. */
@Nullable
public static String[] getNamesForUids(@NonNull PackageManager pm, int[] uids) {
return pm.getNamesForUids(uids);
}
/** Check {@link PackageManager#getApplicationEnabledSetting(String)}. */
public static int getApplicationEnabledSettingForUser(@NonNull String packageName,
@UserIdInt int userId) throws RemoteException {
IPackageManager pm = ActivityThread.getPackageManager();
return pm.getApplicationEnabledSetting(packageName, userId);
}
/** Check {@link PackageManager#setApplicationEnabledSetting(String, int, int)}. */
public static void setApplicationEnabledSettingForUser(@NonNull String packageName,
@PackageManager.EnabledState int newState, @PackageManager.EnabledFlags int flags,
@UserIdInt int userId, @NonNull String callingPackage) throws RemoteException {
IPackageManager pm = ActivityThread.getPackageManager();
pm.setApplicationEnabledSetting(packageName, newState, flags, userId, callingPackage);
}
/** Tells if the passed app is OEM app or not. */
public static boolean isOemApp(@NonNull ApplicationInfo appInfo) {
return (appInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_OEM) != 0;
}
/** Tells if the passed app is ODM app or not. */
public static boolean isOdmApp(@NonNull ApplicationInfo appInfo) {
return (appInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_ODM) != 0;
}
/** Tells if the passed app is vendor app or not. */
public static boolean isVendorApp(@NonNull ApplicationInfo appInfo) {
return (appInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_VENDOR) != 0;
}
/** Tells if the passed app is system app or not. */
public static boolean isSystemApp(@NonNull ApplicationInfo appInfo) {
return (appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}
/** Tells if the passed app is updated system app or not. */
public static boolean isUpdatedSystemApp(@NonNull ApplicationInfo appInfo) {
return (appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
}
/** Tells if the passed app is product app or not. */
public static boolean isProductApp(@NonNull ApplicationInfo appInfo) {
return (appInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_PRODUCT) != 0;
}
/** Tells if the passed app is system ext vendor app or not. */
public static boolean isSystemExtApp(@NonNull ApplicationInfo appInfo) {
return (appInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_SYSTEM_EXT) != 0;
}
/** Check {@link ComponentInfo#getComponentName()}. */
public static ComponentName getComponentName(ComponentInfo info) {
return info.getComponentName();
}
}