1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.appwidget; 18 19 import android.annotation.NonNull; 20 import android.annotation.Nullable; 21 import android.appwidget.AppWidgetProviderInfo; 22 import android.content.ComponentName; 23 import android.os.Build; 24 import android.text.TextUtils; 25 import android.util.Slog; 26 import android.util.TypedXmlPullParser; 27 import android.util.TypedXmlSerializer; 28 29 import java.io.IOException; 30 import java.util.Objects; 31 32 /** 33 * @hide 34 */ 35 public class AppWidgetXmlUtil { 36 37 private static final String TAG = "AppWidgetXmlUtil"; 38 39 private static final String ATTR_MIN_WIDTH = "min_width"; 40 private static final String ATTR_MIN_HEIGHT = "min_height"; 41 private static final String ATTR_MIN_RESIZE_WIDTH = "min_resize_width"; 42 private static final String ATTR_MIN_RESIZE_HEIGHT = "min_resize_height"; 43 private static final String ATTR_MAX_RESIZE_WIDTH = "max_resize_width"; 44 private static final String ATTR_MAX_RESIZE_HEIGHT = "max_resize_height"; 45 private static final String ATTR_TARGET_CELL_WIDTH = "target_cell_width"; 46 private static final String ATTR_TARGET_CELL_HEIGHT = "target_cell_height"; 47 private static final String ATTR_UPDATE_PERIOD_MILLIS = "update_period_millis"; 48 private static final String ATTR_INITIAL_LAYOUT = "initial_layout"; 49 private static final String ATTR_INITIAL_KEYGUARD_LAYOUT = "initial_keyguard_layout"; 50 private static final String ATTR_CONFIGURE = "configure"; 51 private static final String ATTR_LABEL = "label"; 52 private static final String ATTR_ICON = "icon"; 53 private static final String ATTR_PREVIEW_IMAGE = "preview_image"; 54 private static final String ATTR_PREVIEW_LAYOUT = "preview_layout"; 55 private static final String ATTR_AUTO_ADVANCED_VIEW_ID = "auto_advance_view_id"; 56 private static final String ATTR_RESIZE_MODE = "resize_mode"; 57 private static final String ATTR_WIDGET_CATEGORY = "widget_category"; 58 private static final String ATTR_WIDGET_FEATURES = "widget_features"; 59 private static final String ATTR_DESCRIPTION_RES = "description_res"; 60 private static final String ATTR_PROVIDER_INHERITANCE = "provider_inheritance"; 61 private static final String ATTR_OS_FINGERPRINT = "os_fingerprint"; 62 63 /** 64 * @hide 65 */ writeAppWidgetProviderInfoLocked(@onNull final TypedXmlSerializer out, @NonNull final AppWidgetProviderInfo info)66 public static void writeAppWidgetProviderInfoLocked(@NonNull final TypedXmlSerializer out, 67 @NonNull final AppWidgetProviderInfo info) throws IOException { 68 Objects.requireNonNull(out); 69 Objects.requireNonNull(info); 70 out.attributeInt(null, ATTR_MIN_WIDTH, info.minWidth); 71 out.attributeInt(null, ATTR_MIN_HEIGHT, info.minHeight); 72 out.attributeInt(null, ATTR_MIN_RESIZE_WIDTH, info.minResizeWidth); 73 out.attributeInt(null, ATTR_MIN_RESIZE_HEIGHT, info.minResizeHeight); 74 out.attributeInt(null, ATTR_MAX_RESIZE_WIDTH, info.maxResizeWidth); 75 out.attributeInt(null, ATTR_MAX_RESIZE_HEIGHT, info.maxResizeHeight); 76 out.attributeInt(null, ATTR_TARGET_CELL_WIDTH, info.targetCellWidth); 77 out.attributeInt(null, ATTR_TARGET_CELL_HEIGHT, info.targetCellHeight); 78 out.attributeInt(null, ATTR_UPDATE_PERIOD_MILLIS, info.updatePeriodMillis); 79 out.attributeInt(null, ATTR_INITIAL_LAYOUT, info.initialLayout); 80 out.attributeInt(null, ATTR_INITIAL_KEYGUARD_LAYOUT, info.initialKeyguardLayout); 81 if (info.configure != null) { 82 out.attribute(null, ATTR_CONFIGURE, info.configure.flattenToShortString()); 83 } 84 if (info.label != null) { 85 out.attribute(null, ATTR_LABEL, info.label); 86 } else if (AppWidgetServiceImpl.DEBUG_PROVIDER_INFO_CACHE) { 87 Slog.e(TAG, "Label is empty in " + info.provider); 88 } 89 out.attributeInt(null, ATTR_ICON, info.icon); 90 out.attributeInt(null, ATTR_PREVIEW_IMAGE, info.previewImage); 91 out.attributeInt(null, ATTR_PREVIEW_LAYOUT, info.previewLayout); 92 out.attributeInt(null, ATTR_AUTO_ADVANCED_VIEW_ID, info.autoAdvanceViewId); 93 out.attributeInt(null, ATTR_RESIZE_MODE, info.resizeMode); 94 out.attributeInt(null, ATTR_WIDGET_CATEGORY, info.widgetCategory); 95 out.attributeInt(null, ATTR_WIDGET_FEATURES, info.widgetFeatures); 96 out.attributeInt(null, ATTR_DESCRIPTION_RES, info.descriptionRes); 97 out.attributeBoolean(null, ATTR_PROVIDER_INHERITANCE, info.isExtendedFromAppWidgetProvider); 98 out.attribute(null, ATTR_OS_FINGERPRINT, Build.FINGERPRINT); 99 } 100 101 /** 102 * @hide 103 */ 104 @Nullable readAppWidgetProviderInfoLocked( @onNull final TypedXmlPullParser parser)105 public static AppWidgetProviderInfo readAppWidgetProviderInfoLocked( 106 @NonNull final TypedXmlPullParser parser) { 107 Objects.requireNonNull(parser); 108 final String fingerprint = parser.getAttributeValue(null, ATTR_OS_FINGERPRINT); 109 if (!Build.FINGERPRINT.equals(fingerprint)) { 110 return null; 111 } 112 final AppWidgetProviderInfo info = new AppWidgetProviderInfo(); 113 info.minWidth = parser.getAttributeInt(null, ATTR_MIN_WIDTH, 0); 114 info.minHeight = parser.getAttributeInt(null, ATTR_MIN_HEIGHT, 0); 115 info.minResizeWidth = parser.getAttributeInt(null, ATTR_MIN_RESIZE_WIDTH, 0); 116 info.minResizeHeight = parser.getAttributeInt(null, ATTR_MIN_RESIZE_HEIGHT, 0); 117 info.maxResizeWidth = parser.getAttributeInt(null, ATTR_MAX_RESIZE_WIDTH, 0); 118 info.maxResizeHeight = parser.getAttributeInt(null, ATTR_MAX_RESIZE_HEIGHT, 0); 119 info.targetCellWidth = parser.getAttributeInt(null, ATTR_TARGET_CELL_WIDTH, 0); 120 info.targetCellHeight = parser.getAttributeInt(null, ATTR_TARGET_CELL_HEIGHT, 0); 121 info.updatePeriodMillis = parser.getAttributeInt(null, ATTR_UPDATE_PERIOD_MILLIS, 0); 122 info.initialLayout = parser.getAttributeInt(null, ATTR_INITIAL_LAYOUT, 0); 123 info.initialKeyguardLayout = parser.getAttributeInt( 124 null, ATTR_INITIAL_KEYGUARD_LAYOUT, 0); 125 final String configure = parser.getAttributeValue(null, ATTR_CONFIGURE); 126 if (!TextUtils.isEmpty(configure)) { 127 info.configure = ComponentName.unflattenFromString(configure); 128 } 129 info.label = parser.getAttributeValue(null, ATTR_LABEL); 130 info.icon = parser.getAttributeInt(null, ATTR_ICON, 0); 131 info.previewImage = parser.getAttributeInt(null, ATTR_PREVIEW_IMAGE, 0); 132 info.previewLayout = parser.getAttributeInt(null, ATTR_PREVIEW_LAYOUT, 0); 133 info.autoAdvanceViewId = parser.getAttributeInt(null, ATTR_AUTO_ADVANCED_VIEW_ID, 0); 134 info.resizeMode = parser.getAttributeInt(null, ATTR_RESIZE_MODE, 0); 135 info.widgetCategory = parser.getAttributeInt(null, ATTR_WIDGET_CATEGORY, 0); 136 info.widgetFeatures = parser.getAttributeInt(null, ATTR_WIDGET_FEATURES, 0); 137 info.descriptionRes = parser.getAttributeInt(null, ATTR_DESCRIPTION_RES, 0); 138 info.isExtendedFromAppWidgetProvider = parser.getAttributeBoolean(null, 139 ATTR_PROVIDER_INHERITANCE, false); 140 return info; 141 } 142 } 143