1d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung/*
2d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung * Copyright (C) 2014 The Android Open Source Project
3d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung *
4d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung * Licensed under the Apache License, Version 2.0 (the "License");
5d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung * you may not use this file except in compliance with the License.
6d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung * You may obtain a copy of the License at
7d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung *
8d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung *      http://www.apache.org/licenses/LICENSE-2.0
9d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung *
10d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung * Unless required by applicable law or agreed to in writing, software
11d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung * distributed under the License is distributed on an "AS IS" BASIS,
12d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung * See the License for the specific language governing permissions and
14d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung * limitations under the License.
15d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung */
16d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
17d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chungpackage com.android.systemui.recents;
18d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
19d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chungimport android.appwidget.AppWidgetHost;
20d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chungimport android.appwidget.AppWidgetProviderInfo;
21d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chungimport android.content.Context;
22ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.SystemServicesProxy;
23f1fbd77cf057e43926f9a0347692611386d09f40Winson Chungimport com.android.systemui.recents.model.RecentsTaskLoader;
24d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
25d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung/** Our special app widget host for the Search widget */
26d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chungpublic class RecentsAppWidgetHost extends AppWidgetHost {
27d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
28d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /* Callbacks to notify when an app package changes */
29d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    interface RecentsAppWidgetHostCallbacks {
30d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        public void refreshSearchWidget();
31d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    }
32d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
33d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    Context mContext;
34d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    RecentsAppWidgetHostCallbacks mCb;
35d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    RecentsConfiguration mConfig;
3685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    boolean mIsListening;
37d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
38d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    public RecentsAppWidgetHost(Context context, int hostId) {
39d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        super(context, hostId);
40d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        mContext = context;
41d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        mConfig = RecentsConfiguration.getInstance();
42d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    }
43d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
44d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    public void startListening(RecentsAppWidgetHostCallbacks cb) {
45d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        mCb = cb;
46740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung        if (!mIsListening) {
47740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung            mIsListening = true;
48740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung            super.startListening();
49740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung        }
50d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    }
51d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
52d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    @Override
53d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    public void stopListening() {
54740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung        if (mIsListening) {
55740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung            super.stopListening();
56740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung        }
57d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        // Ensure that we release any references to the callbacks
58d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        mCb = null;
59d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        mContext = null;
6085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        mIsListening = false;
6185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    }
6285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung
63d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    @Override
64d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    protected void onProviderChanged(int appWidgetId, AppWidgetProviderInfo appWidgetInfo) {
65d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        if (mCb == null) return;
66d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
67d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
68d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        if (appWidgetId > -1 && appWidgetId == mConfig.searchBarAppWidgetId) {
69d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            // The search provider may have changed, so just delete the old widget and bind it again
70d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            ssp.unbindSearchAppWidget(this, appWidgetId);
71d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            // Update the search widget
72d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            mConfig.updateSearchBarAppWidgetId(mContext, -1);
73d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            mCb.refreshSearchWidget();
74d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        }
75d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    }
76d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung}
77