• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 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.launcher3;
18 
19 import android.appwidget.AppWidgetHostView;
20 import android.content.ComponentName;
21 import android.content.ContentValues;
22 import android.content.Context;
23 import android.content.Intent;
24 
25 import com.android.launcher3.compat.UserHandleCompat;
26 
27 /**
28  * Represents a widget (either instantiated or about to be) in the Launcher.
29  */
30 public class LauncherAppWidgetInfo extends ItemInfo {
31 
32     public static final int RESTORE_COMPLETED = 0;
33 
34     /**
35      * This is set during the package backup creation.
36      */
37     public static final int FLAG_ID_NOT_VALID = 1;
38 
39     /**
40      * Indicates that the provider is not available yet.
41      */
42     public static final int FLAG_PROVIDER_NOT_READY = 2;
43 
44     /**
45      * Indicates that the widget UI is not yet ready, and user needs to set it up again.
46      */
47     public static final int FLAG_UI_NOT_READY = 4;
48 
49     /**
50      * Indicates that the widget restore has started.
51      */
52     public static final int FLAG_RESTORE_STARTED = 8;
53 
54     /**
55      * Indicates that the widget has been allocated an Id. The id is still not valid, as it has
56      * not been bound yet.
57      */
58     public static final int FLAG_ID_ALLOCATED = 16;
59 
60     /**
61      * Indicates that the widget does not need to show config activity, even if it has a
62      * configuration screen. It can also optionally have some extras which are sent during bind.
63      */
64     public static final int FLAG_DIRECT_CONFIG = 32;
65 
66     /**
67      * Indicates that the widget hasn't been instantiated yet.
68      */
69     static final int NO_ID = -1;
70 
71     /**
72      * Indicates that this is a locally defined widget and hence has no system allocated id.
73      */
74     static final int CUSTOM_WIDGET_ID = -100;
75 
76     /**
77      * Identifier for this widget when talking with
78      * {@link android.appwidget.AppWidgetManager} for updates.
79      */
80     int appWidgetId = NO_ID;
81 
82     public ComponentName providerName;
83 
84     /**
85      * Indicates the restore status of the widget.
86      */
87     int restoreStatus;
88 
89     /**
90      * Indicates the installation progress of the widget provider
91      */
92     int installProgress = -1;
93 
94     /**
95      * Optional extras sent during widget bind. See {@link #FLAG_DIRECT_CONFIG}.
96      */
97     public Intent bindOptions;
98 
99     private boolean mHasNotifiedInitialWidgetSizeChanged;
100 
LauncherAppWidgetInfo(int appWidgetId, ComponentName providerName)101     LauncherAppWidgetInfo(int appWidgetId, ComponentName providerName) {
102         if (appWidgetId == CUSTOM_WIDGET_ID) {
103             itemType = LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET;
104         } else {
105             itemType = LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET;
106         }
107 
108         this.appWidgetId = appWidgetId;
109         this.providerName = providerName;
110 
111         // Since the widget isn't instantiated yet, we don't know these values. Set them to -1
112         // to indicate that they should be calculated based on the layout and minWidth/minHeight
113         spanX = -1;
114         spanY = -1;
115         // We only support app widgets on current user.
116         user = UserHandleCompat.myUserHandle();
117         restoreStatus = RESTORE_COMPLETED;
118     }
119 
isCustomWidget()120     public boolean isCustomWidget() {
121         return appWidgetId == CUSTOM_WIDGET_ID;
122     }
123 
124     @Override
onAddToDatabase(Context context, ContentValues values)125     void onAddToDatabase(Context context, ContentValues values) {
126         super.onAddToDatabase(context, values);
127         values.put(LauncherSettings.Favorites.APPWIDGET_ID, appWidgetId);
128         values.put(LauncherSettings.Favorites.APPWIDGET_PROVIDER, providerName.flattenToString());
129         values.put(LauncherSettings.Favorites.RESTORED, restoreStatus);
130         values.put(LauncherSettings.Favorites.INTENT,
131                 bindOptions == null ? null : bindOptions.toUri(0));
132     }
133 
134     /**
135      * When we bind the widget, we should notify the widget that the size has changed if we have not
136      * done so already (only really for default workspace widgets).
137      */
onBindAppWidget(Launcher launcher, AppWidgetHostView hostView)138     void onBindAppWidget(Launcher launcher, AppWidgetHostView hostView) {
139         if (!mHasNotifiedInitialWidgetSizeChanged) {
140             AppWidgetResizeFrame.updateWidgetSizeRanges(hostView, launcher, spanX, spanY);
141             mHasNotifiedInitialWidgetSizeChanged = true;
142         }
143     }
144 
145     @Override
dumpProperties()146     protected String dumpProperties() {
147         return super.dumpProperties() + " appWidgetId=" + appWidgetId;
148     }
149 
isWidgetIdAllocated()150     public final boolean isWidgetIdAllocated() {
151         return (restoreStatus & FLAG_ID_NOT_VALID) == 0 ||
152                 (restoreStatus & FLAG_ID_ALLOCATED) == FLAG_ID_ALLOCATED;
153     }
154 
hasRestoreFlag(int flag)155     public final boolean hasRestoreFlag(int flag) {
156         return (restoreStatus & flag) == flag;
157     }
158 }
159