• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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