blob: 3ea1bcbbbcd9990e987611a66d22a2cce99089e3 [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.appwidget;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.appwidget.AppWidgetProviderInfo;
import android.content.ComponentName;
import android.os.Build;
import android.text.TextUtils;
import android.util.Slog;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import java.io.IOException;
import java.util.Objects;
/**
* @hide
*/
public class AppWidgetXmlUtil {
private static final String TAG = "AppWidgetXmlUtil";
private static final String ATTR_MIN_WIDTH = "min_width";
private static final String ATTR_MIN_HEIGHT = "min_height";
private static final String ATTR_MIN_RESIZE_WIDTH = "min_resize_width";
private static final String ATTR_MIN_RESIZE_HEIGHT = "min_resize_height";
private static final String ATTR_MAX_RESIZE_WIDTH = "max_resize_width";
private static final String ATTR_MAX_RESIZE_HEIGHT = "max_resize_height";
private static final String ATTR_TARGET_CELL_WIDTH = "target_cell_width";
private static final String ATTR_TARGET_CELL_HEIGHT = "target_cell_height";
private static final String ATTR_UPDATE_PERIOD_MILLIS = "update_period_millis";
private static final String ATTR_INITIAL_LAYOUT = "initial_layout";
private static final String ATTR_INITIAL_KEYGUARD_LAYOUT = "initial_keyguard_layout";
private static final String ATTR_CONFIGURE = "configure";
private static final String ATTR_LABEL = "label";
private static final String ATTR_ICON = "icon";
private static final String ATTR_PREVIEW_IMAGE = "preview_image";
private static final String ATTR_PREVIEW_LAYOUT = "preview_layout";
private static final String ATTR_AUTO_ADVANCED_VIEW_ID = "auto_advance_view_id";
private static final String ATTR_RESIZE_MODE = "resize_mode";
private static final String ATTR_WIDGET_CATEGORY = "widget_category";
private static final String ATTR_WIDGET_FEATURES = "widget_features";
private static final String ATTR_DESCRIPTION_RES = "description_res";
private static final String ATTR_PROVIDER_INHERITANCE = "provider_inheritance";
private static final String ATTR_OS_FINGERPRINT = "os_fingerprint";
/**
* @hide
*/
public static void writeAppWidgetProviderInfoLocked(@NonNull final TypedXmlSerializer out,
@NonNull final AppWidgetProviderInfo info) throws IOException {
Objects.requireNonNull(out);
Objects.requireNonNull(info);
out.attributeInt(null, ATTR_MIN_WIDTH, info.minWidth);
out.attributeInt(null, ATTR_MIN_HEIGHT, info.minHeight);
out.attributeInt(null, ATTR_MIN_RESIZE_WIDTH, info.minResizeWidth);
out.attributeInt(null, ATTR_MIN_RESIZE_HEIGHT, info.minResizeHeight);
out.attributeInt(null, ATTR_MAX_RESIZE_WIDTH, info.maxResizeWidth);
out.attributeInt(null, ATTR_MAX_RESIZE_HEIGHT, info.maxResizeHeight);
out.attributeInt(null, ATTR_TARGET_CELL_WIDTH, info.targetCellWidth);
out.attributeInt(null, ATTR_TARGET_CELL_HEIGHT, info.targetCellHeight);
out.attributeInt(null, ATTR_UPDATE_PERIOD_MILLIS, info.updatePeriodMillis);
out.attributeInt(null, ATTR_INITIAL_LAYOUT, info.initialLayout);
out.attributeInt(null, ATTR_INITIAL_KEYGUARD_LAYOUT, info.initialKeyguardLayout);
if (info.configure != null) {
out.attribute(null, ATTR_CONFIGURE, info.configure.flattenToShortString());
}
if (info.label != null) {
out.attribute(null, ATTR_LABEL, info.label);
} else if (AppWidgetServiceImpl.DEBUG_PROVIDER_INFO_CACHE) {
Slog.e(TAG, "Label is empty in " + info.provider);
}
out.attributeInt(null, ATTR_ICON, info.icon);
out.attributeInt(null, ATTR_PREVIEW_IMAGE, info.previewImage);
out.attributeInt(null, ATTR_PREVIEW_LAYOUT, info.previewLayout);
out.attributeInt(null, ATTR_AUTO_ADVANCED_VIEW_ID, info.autoAdvanceViewId);
out.attributeInt(null, ATTR_RESIZE_MODE, info.resizeMode);
out.attributeInt(null, ATTR_WIDGET_CATEGORY, info.widgetCategory);
out.attributeInt(null, ATTR_WIDGET_FEATURES, info.widgetFeatures);
out.attributeInt(null, ATTR_DESCRIPTION_RES, info.descriptionRes);
out.attributeBoolean(null, ATTR_PROVIDER_INHERITANCE, info.isExtendedFromAppWidgetProvider);
out.attribute(null, ATTR_OS_FINGERPRINT, Build.FINGERPRINT);
}
/**
* @hide
*/
@Nullable
public static AppWidgetProviderInfo readAppWidgetProviderInfoLocked(
@NonNull final TypedXmlPullParser parser) {
Objects.requireNonNull(parser);
final String fingerprint = parser.getAttributeValue(null, ATTR_OS_FINGERPRINT);
if (!Build.FINGERPRINT.equals(fingerprint)) {
return null;
}
final AppWidgetProviderInfo info = new AppWidgetProviderInfo();
info.minWidth = parser.getAttributeInt(null, ATTR_MIN_WIDTH, 0);
info.minHeight = parser.getAttributeInt(null, ATTR_MIN_HEIGHT, 0);
info.minResizeWidth = parser.getAttributeInt(null, ATTR_MIN_RESIZE_WIDTH, 0);
info.minResizeWidth = parser.getAttributeInt(null, ATTR_MIN_RESIZE_HEIGHT, 0);
info.maxResizeWidth = parser.getAttributeInt(null, ATTR_MAX_RESIZE_WIDTH, 0);
info.maxResizeHeight = parser.getAttributeInt(null, ATTR_MAX_RESIZE_HEIGHT, 0);
info.targetCellWidth = parser.getAttributeInt(null, ATTR_TARGET_CELL_WIDTH, 0);
info.targetCellHeight = parser.getAttributeInt(null, ATTR_TARGET_CELL_HEIGHT, 0);
info.updatePeriodMillis = parser.getAttributeInt(null, ATTR_UPDATE_PERIOD_MILLIS, 0);
info.initialLayout = parser.getAttributeInt(null, ATTR_INITIAL_LAYOUT, 0);
info.initialKeyguardLayout = parser.getAttributeInt(
null, ATTR_INITIAL_KEYGUARD_LAYOUT, 0);
final String configure = parser.getAttributeValue(null, ATTR_CONFIGURE);
if (!TextUtils.isEmpty(configure)) {
info.configure = ComponentName.unflattenFromString(configure);
}
info.label = parser.getAttributeValue(null, ATTR_LABEL);
info.icon = parser.getAttributeInt(null, ATTR_ICON, 0);
info.previewImage = parser.getAttributeInt(null, ATTR_PREVIEW_IMAGE, 0);
info.previewLayout = parser.getAttributeInt(null, ATTR_PREVIEW_LAYOUT, 0);
info.autoAdvanceViewId = parser.getAttributeInt(null, ATTR_AUTO_ADVANCED_VIEW_ID, 0);
info.resizeMode = parser.getAttributeInt(null, ATTR_RESIZE_MODE, 0);
info.widgetCategory = parser.getAttributeInt(null, ATTR_WIDGET_CATEGORY, 0);
info.widgetFeatures = parser.getAttributeInt(null, ATTR_WIDGET_FEATURES, 0);
info.descriptionRes = parser.getAttributeInt(null, ATTR_DESCRIPTION_RES, 0);
info.isExtendedFromAppWidgetProvider = parser.getAttributeBoolean(null,
ATTR_PROVIDER_INHERITANCE, false);
return info;
}
}