| /* |
| * Copyright (C) 2020 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.content.pm.parsing.component; |
| |
| import android.annotation.NonNull; |
| import android.annotation.Nullable; |
| import android.content.pm.PackageManager; |
| import android.content.pm.parsing.ParsingPackage; |
| import android.content.pm.parsing.ParsingUtils; |
| import android.content.res.Resources; |
| import android.content.res.TypedArray; |
| import android.content.res.XmlResourceParser; |
| import android.os.Bundle; |
| import android.text.TextUtils; |
| import android.util.TypedValue; |
| |
| import com.android.internal.annotations.VisibleForTesting; |
| import android.content.pm.parsing.ParsingPackageUtils; |
| import android.content.pm.parsing.result.ParseInput; |
| import android.content.pm.parsing.result.ParseResult; |
| |
| /** @hide */ |
| class ParsedComponentUtils { |
| |
| private static final String TAG = ParsingPackageUtils.TAG; |
| |
| @NonNull |
| @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) |
| static <Component extends ParsedComponent> ParseResult<Component> parseComponent( |
| Component component, String tag, ParsingPackage pkg, TypedArray array, |
| boolean useRoundIcon, ParseInput input, int bannerAttr, |
| @Nullable Integer descriptionAttr, int iconAttr, int labelAttr, int logoAttr, |
| int nameAttr, int roundIconAttr) { |
| String name = array.getNonConfigurationString(nameAttr, 0); |
| if (TextUtils.isEmpty(name)) { |
| return input.error(tag + " does not specify android:name"); |
| } |
| |
| String packageName = pkg.getPackageName(); |
| String className = ParsingUtils.buildClassName(packageName, name); |
| if (PackageManager.APP_DETAILS_ACTIVITY_CLASS_NAME.equals(className)) { |
| return input.error(tag + " invalid android:name"); |
| } |
| |
| //noinspection ConstantConditions; null check done above with isEmpty |
| component.setName(className); |
| component.setPackageName(packageName); |
| |
| if (useRoundIcon) { |
| component.icon = array.getResourceId(roundIconAttr, 0); |
| } |
| |
| if (component.icon == 0) { |
| component.icon = array.getResourceId(iconAttr, 0); |
| } |
| |
| component.logo = array.getResourceId(logoAttr, 0); |
| component.banner = array.getResourceId(bannerAttr, 0); |
| |
| if (descriptionAttr != null) { |
| component.descriptionRes = array.getResourceId(descriptionAttr, 0); |
| } |
| |
| TypedValue v = array.peekValue(labelAttr); |
| if (v != null) { |
| component.labelRes = v.resourceId; |
| if (v.resourceId == 0) { |
| component.nonLocalizedLabel = v.coerceToString(); |
| } |
| } |
| |
| return input.success(component); |
| } |
| |
| static ParseResult<Bundle> addMetaData(ParsedComponent component, ParsingPackage pkg, |
| Resources resources, XmlResourceParser parser, ParseInput input) { |
| ParseResult<Bundle> result = ParsingPackageUtils.parseMetaData(pkg, resources, |
| parser, component.metaData, input); |
| if (result.isError()) { |
| return input.error(result); |
| } |
| Bundle bundle = result.getResult(); |
| component.metaData = bundle; |
| return input.success(bundle); |
| } |
| } |