blob: c6b9b1a166b64e53a479f2fca23728728691aa53 [file] [log] [blame]
/*
* Copyright (C) 2022 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 com.android.server.pm.pkg.component;
import static com.android.server.pm.pkg.parsing.ParsingUtils.NOT_SET;
import android.annotation.NonNull;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.Property;
import android.content.pm.parsing.result.ParseInput;
import android.content.pm.parsing.result.ParseResult;
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 com.android.server.pm.pkg.parsing.ParsingPackage;
import com.android.server.pm.pkg.parsing.ParsingPackageUtils;
import com.android.server.pm.pkg.parsing.ParsingUtils;
/** @hide */
class ParsedComponentUtils {
@NonNull
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
static <Component extends ParsedComponentImpl> ParseResult<Component> parseComponent(
Component component, String tag, ParsingPackage pkg, TypedArray array,
boolean useRoundIcon, ParseInput input, int bannerAttr, int 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)
.setPackageName(packageName);
int roundIconVal = useRoundIcon ? array.getResourceId(roundIconAttr, 0) : 0;
if (roundIconVal != 0) {
component.setIcon(roundIconVal)
.setNonLocalizedLabel(null);
} else {
int iconVal = array.getResourceId(iconAttr, 0);
if (iconVal != 0) {
component.setIcon(iconVal);
component.setNonLocalizedLabel(null);
}
}
int logoVal = array.getResourceId(logoAttr, 0);
if (logoVal != 0) {
component.setLogo(logoVal);
}
int bannerVal = array.getResourceId(bannerAttr, 0);
if (bannerVal != 0) {
component.setBanner(bannerVal);
}
if (descriptionAttr != NOT_SET) {
component.setDescriptionRes(array.getResourceId(descriptionAttr, 0));
}
TypedValue v = array.peekValue(labelAttr);
if (v != null) {
component.setLabelRes(v.resourceId);
if (v.resourceId == 0) {
component.setNonLocalizedLabel(v.coerceToString());
}
}
return input.success(component);
}
static ParseResult<Bundle> addMetaData(ParsedComponentImpl component, ParsingPackage pkg,
Resources resources, XmlResourceParser parser, ParseInput input) {
ParseResult<Property> result = ParsingPackageUtils.parseMetaData(pkg, component,
resources, parser, "<meta-data>", input);
if (result.isError()) {
return input.error(result);
}
final Property property = result.getResult();
if (property != null) {
component.setMetaData(property.toBundle(component.getMetaData()));
}
return input.success(component.getMetaData());
}
static ParseResult<Property> addProperty(ParsedComponentImpl component, ParsingPackage pkg,
Resources resources, XmlResourceParser parser, ParseInput input) {
ParseResult<Property> result = ParsingPackageUtils.parseMetaData(pkg, component,
resources, parser, "<property>", input);
if (result.isError()) {
return input.error(result);
}
final Property property = result.getResult();
if (property != null) {
component.addProperty(property);
}
return input.success(property);
}
}