LauncherAppWidgetInfo.java revision 1edab71d010f3efdde212b96aa1a44ab7a5b4ee5
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
17package com.android.launcher3;
18
19import android.appwidget.AppWidgetHostView;
20import android.content.ComponentName;
21import android.content.ContentValues;
22import android.content.Context;
23import android.content.Intent;
24
25import com.android.launcher3.compat.UserHandleCompat;
26
27/**
28 * Represents a widget (either instantiated or about to be) in the Launcher.
29 */
30public 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
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
120    public boolean isCustomWidget() {
121        return appWidgetId == CUSTOM_WIDGET_ID;
122    }
123
124    @Override
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     */
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
146    protected String dumpProperties() {
147        return super.dumpProperties() + " appWidgetId=" + appWidgetId;
148    }
149
150    public final boolean isWidgetIdAllocated() {
151        return (restoreStatus & FLAG_ID_NOT_VALID) == 0 ||
152                (restoreStatus & FLAG_ID_ALLOCATED) == FLAG_ID_ALLOCATED;
153    }
154
155    public final boolean hasRestoreFlag(int flag) {
156        return (restoreStatus & flag) == flag;
157    }
158}
159