• 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.Intent;
22 import android.os.Process;
23 
24 import com.android.launcher3.model.PackageItemInfo;
25 import com.android.launcher3.util.ContentWriter;
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     public 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     public 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     public int appWidgetId = NO_ID;
81 
82     public ComponentName providerName;
83 
84     /**
85      * Indicates the restore status of the widget.
86      */
87     public int restoreStatus;
88 
89     /**
90      * Indicates the installation progress of the widget provider
91      */
92     public int installProgress = -1;
93 
94     /**
95      * Optional extras sent during widget bind. See {@link #FLAG_DIRECT_CONFIG}.
96      */
97     public Intent bindOptions;
98 
99     /**
100      * Nonnull for pending widgets. We use this to get the icon and title for the widget.
101      */
102     public PackageItemInfo pendingItemInfo;
103 
104     private boolean mHasNotifiedInitialWidgetSizeChanged;
105 
LauncherAppWidgetInfo(int appWidgetId, ComponentName providerName)106     public LauncherAppWidgetInfo(int appWidgetId, ComponentName providerName) {
107         this.appWidgetId = appWidgetId;
108         this.providerName = providerName;
109 
110         if (isCustomWidget()) {
111             itemType = LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET;
112         } else {
113             itemType = LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET;
114         }
115 
116         // Since the widget isn't instantiated yet, we don't know these values. Set them to -1
117         // to indicate that they should be calculated based on the layout and minWidth/minHeight
118         spanX = -1;
119         spanY = -1;
120         // We only support app widgets on current user.
121         user = Process.myUserHandle();
122         restoreStatus = RESTORE_COMPLETED;
123     }
124 
125     /** Used for testing **/
LauncherAppWidgetInfo()126     public LauncherAppWidgetInfo() {
127         itemType = LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET;
128     }
129 
isCustomWidget()130     public boolean isCustomWidget() {
131         return appWidgetId <= CUSTOM_WIDGET_ID;
132     }
133 
134     @Override
onAddToDatabase(ContentWriter writer)135     public void onAddToDatabase(ContentWriter writer) {
136         super.onAddToDatabase(writer);
137         writer.put(LauncherSettings.Favorites.APPWIDGET_ID, appWidgetId)
138                 .put(LauncherSettings.Favorites.APPWIDGET_PROVIDER, providerName.flattenToString())
139                 .put(LauncherSettings.Favorites.RESTORED, restoreStatus)
140                 .put(LauncherSettings.Favorites.INTENT, bindOptions);
141     }
142 
143     /**
144      * When we bind the widget, we should notify the widget that the size has changed if we have not
145      * done so already (only really for default workspace widgets).
146      */
onBindAppWidget(Launcher launcher, AppWidgetHostView hostView)147     void onBindAppWidget(Launcher launcher, AppWidgetHostView hostView) {
148         if (!mHasNotifiedInitialWidgetSizeChanged) {
149             AppWidgetResizeFrame.updateWidgetSizeRanges(hostView, launcher, spanX, spanY);
150             mHasNotifiedInitialWidgetSizeChanged = true;
151         }
152     }
153 
154     @Override
dumpProperties()155     protected String dumpProperties() {
156         return super.dumpProperties() + " appWidgetId=" + appWidgetId;
157     }
158 
isWidgetIdAllocated()159     public final boolean isWidgetIdAllocated() {
160         return (restoreStatus & FLAG_ID_NOT_VALID) == 0 ||
161                 (restoreStatus & FLAG_ID_ALLOCATED) == FLAG_ID_ALLOCATED;
162     }
163 
hasRestoreFlag(int flag)164     public final boolean hasRestoreFlag(int flag) {
165         return (restoreStatus & flag) == flag;
166     }
167 }
168