1c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project/*
2c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project *
4c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * you may not use this file except in compliance with the License.
6c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * You may obtain a copy of the License at
7c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project *
8c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project *
10c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * See the License for the specific language governing permissions and
14c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * limitations under the License.
15c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */
16c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
17c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectpackage com.android.tests.appwidgethost;
18c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
19c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.app.Activity;
20c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.content.ComponentName;
21c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.content.Context;
22c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.content.Intent;
23c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.content.SharedPreferences;
24c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.appwidget.AppWidgetHost;
25c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.appwidget.AppWidgetHostView;
26c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.appwidget.AppWidgetProviderInfo;
27c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.appwidget.AppWidgetManager;
28c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.os.Bundle;
29c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.util.Log;
30c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.view.ContextMenu;
31c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.view.MenuItem;
32c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.view.View;
33c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.widget.LinearLayout;
34c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
35c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectpublic class AppWidgetHostActivity extends Activity
36c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project{
37c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    static final String TAG = "AppWidgetHostActivity";
38c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
39c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    static final int DISCOVER_APPWIDGET_REQUEST = 1;
40c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    static final int CONFIGURE_APPWIDGET_REQUEST = 2;
41c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    static final int HOST_ID = 1234;
42c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
43c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    static final String PENDING_APPWIDGET_ID = "pending_appwidget";
44c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
45c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    AppWidgetManager mAppWidgetManager;
46c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    AppWidgetContainerView mAppWidgetContainer;
47c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
48c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public AppWidgetHostActivity() {
49c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
50c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
51c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    @Override
52c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public void onCreate(Bundle icicle) {
53c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        super.onCreate(icicle);
542c1a63fe9926839dd2cdfe865e749f83c26bf3caJoe Onorato        mAppWidgetManager = AppWidgetManager.getInstance(this);
552c1a63fe9926839dd2cdfe865e749f83c26bf3caJoe Onorato
56c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        setContentView(R.layout.appwidget_host);
57c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
582c1a63fe9926839dd2cdfe865e749f83c26bf3caJoe Onorato        mHost = new AppWidgetHost(this, HOST_ID) {
592c1a63fe9926839dd2cdfe865e749f83c26bf3caJoe Onorato                protected AppWidgetHostView onCreateView(Context context, int appWidgetId, AppWidgetProviderInfo appWidget) {
602c1a63fe9926839dd2cdfe865e749f83c26bf3caJoe Onorato                    return new MyAppWidgetView(appWidgetId);
612c1a63fe9926839dd2cdfe865e749f83c26bf3caJoe Onorato                }
622c1a63fe9926839dd2cdfe865e749f83c26bf3caJoe Onorato            };
632c1a63fe9926839dd2cdfe865e749f83c26bf3caJoe Onorato
642c1a63fe9926839dd2cdfe865e749f83c26bf3caJoe Onorato
65c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        findViewById(R.id.add_appwidget).setOnClickListener(mOnClickListener);
66c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        mAppWidgetContainer = (AppWidgetContainerView)findViewById(R.id.appwidget_container);
67c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
68c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (false) {
69c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            if (false) {
70c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                mHost.deleteHost();
71c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            } else {
72c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                AppWidgetHost.deleteAllHosts();
73c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            }
74c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
75c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
76c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
77c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    View.OnClickListener mOnClickListener = new View.OnClickListener() {
78c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        public void onClick(View v) {
79c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            discoverAppWidget(DISCOVER_APPWIDGET_REQUEST);
80c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
81c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    };
82c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
83c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    void discoverAppWidget(int requestCode) {
84c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
85c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mHost.allocateAppWidgetId());
86c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        startActivityForResult(intent, requestCode);
87c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
88c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
89c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    void configureAppWidget(int requestCode, int appWidgetId, ComponentName configure) {
90c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
91c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        intent.setComponent(configure);
92c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
93c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        SharedPreferences.Editor prefs = getPreferences(0).edit();
94c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        prefs.putInt(PENDING_APPWIDGET_ID, appWidgetId);
95c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        prefs.commit();
96c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        startActivityForResult(intent, requestCode);
97c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
98c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
99c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    void handleAppWidgetPickResult(int resultCode, Intent intent) {
100c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        // BEGIN_INCLUDE(getExtra_EXTRA_APPWIDGET_ID)
101c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        Bundle extras = intent.getExtras();
102c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
103c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        // END_INCLUDE(getExtra_EXTRA_APPWIDGET_ID)
104c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (resultCode == RESULT_OK) {
105c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
106c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
107c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            if (appWidget.configure != null) {
108c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                // configure the AppWidget if we should
109c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                configureAppWidget(CONFIGURE_APPWIDGET_REQUEST, appWidgetId, appWidget.configure);
110c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            } else {
111c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                // just add it as is
112c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                addAppWidgetView(appWidgetId, appWidget);
113c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            }
114c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        } else {
115c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            mHost.deleteAppWidgetId(appWidgetId);
116c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
117c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
118c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
119c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    void handleAppWidgetConfigureResult(int resultCode, Intent data) {
120c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        int appWidgetId = getPreferences(0).getInt(PENDING_APPWIDGET_ID, -1);
121c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        Log.d(TAG, "resultCode=" + resultCode + " appWidgetId=" + appWidgetId);
122c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (appWidgetId < 0) {
123c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            Log.w(TAG, "was no preference for PENDING_APPWIDGET_ID");
124c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            return;
125c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
126c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (resultCode == RESULT_OK) {
127c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
128c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            addAppWidgetView(appWidgetId, appWidget);
129c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        } else {
130c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            mHost.deleteAppWidgetId(appWidgetId);
131c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
132c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
133c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
134c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    void addAppWidgetView(int appWidgetId, AppWidgetProviderInfo appWidget) {
135c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        // Inflate the AppWidget's RemoteViews
136c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        AppWidgetHostView view = mHost.createView(this, appWidgetId, appWidget);
137c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
138c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        // Add it to the list
139c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
140980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                LinearLayout.LayoutParams.MATCH_PARENT,
141c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                LinearLayout.LayoutParams.WRAP_CONTENT);
142c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        mAppWidgetContainer.addView(view, layoutParams);
143c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
144c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        registerForContextMenu(view);
145c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
146c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
147c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
148c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        switch (requestCode) {
149c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        case DISCOVER_APPWIDGET_REQUEST:
150c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            handleAppWidgetPickResult(resultCode, data);
151c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            break;
152c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        case CONFIGURE_APPWIDGET_REQUEST:
153c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            handleAppWidgetConfigureResult(resultCode, data);
154c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
155c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
156c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
157c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    protected void onStart() {
158c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        super.onStart();
159c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        mHost.startListening();
160c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
161c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
162c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    protected void onStop() {
163c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        super.onStop();
164c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        mHost.stopListening();
165c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
166c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
167c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public void onCreateContextMenu(ContextMenu menu, View v,
168c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            ContextMenu.ContextMenuInfo menuInfo) {
169c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        menu.add(ContextMenu.NONE, R.string.delete_appwidget, ContextMenu.NONE,
170c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                R.string.delete_appwidget);
171c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
172c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
173c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
174c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        MyAppWidgetView view = (MyAppWidgetView)item.getMenuInfo();
175c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        switch (item.getItemId()) {
176c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        case R.string.delete_appwidget:
177c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            Log.d(TAG, "delete! " + view.appWidgetId);
178c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            mAppWidgetContainer.removeView(view);
179c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            mHost.deleteAppWidgetId(view.appWidgetId);
180c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            break;
181c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
182c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
183c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        return true;
184c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
185c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
186c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    class MyAppWidgetView extends AppWidgetHostView implements ContextMenu.ContextMenuInfo {
187c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        int appWidgetId;
188c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
189c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        MyAppWidgetView(int appWidgetId) {
190c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            super(AppWidgetHostActivity.this);
191c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            this.appWidgetId = appWidgetId;
192c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
193c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
194c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        public ContextMenu.ContextMenuInfo getContextMenuInfo() {
195c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            return this;
196c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
197c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
198c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
1992c1a63fe9926839dd2cdfe865e749f83c26bf3caJoe Onorato    AppWidgetHost mHost;
200c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project}
201c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
202c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
203