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        mAppWidgetManager = AppWidgetManager.getInstance(this);
50c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
51c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
52c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    @Override
53c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public void onCreate(Bundle icicle) {
54c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        super.onCreate(icicle);
55c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        setContentView(R.layout.appwidget_host);
56c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
57c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        findViewById(R.id.add_appwidget).setOnClickListener(mOnClickListener);
58c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        mAppWidgetContainer = (AppWidgetContainerView)findViewById(R.id.appwidget_container);
59c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
60c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (false) {
61c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            if (false) {
62c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                mHost.deleteHost();
63c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            } else {
64c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                AppWidgetHost.deleteAllHosts();
65c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            }
66c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
67c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
68c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
69c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    View.OnClickListener mOnClickListener = new View.OnClickListener() {
70c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        public void onClick(View v) {
71c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            discoverAppWidget(DISCOVER_APPWIDGET_REQUEST);
72c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
73c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    };
74c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
75c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    void discoverAppWidget(int requestCode) {
76c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
77c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mHost.allocateAppWidgetId());
78c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        startActivityForResult(intent, requestCode);
79c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
80c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
81c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    void configureAppWidget(int requestCode, int appWidgetId, ComponentName configure) {
82c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
83c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        intent.setComponent(configure);
84c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
85c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        SharedPreferences.Editor prefs = getPreferences(0).edit();
86c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        prefs.putInt(PENDING_APPWIDGET_ID, appWidgetId);
87c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        prefs.commit();
88c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        startActivityForResult(intent, requestCode);
89c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
90c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
91c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    void handleAppWidgetPickResult(int resultCode, Intent intent) {
92c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        // BEGIN_INCLUDE(getExtra_EXTRA_APPWIDGET_ID)
93c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        Bundle extras = intent.getExtras();
94c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
95c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        // END_INCLUDE(getExtra_EXTRA_APPWIDGET_ID)
96c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (resultCode == RESULT_OK) {
97c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
98c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
99c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            if (appWidget.configure != null) {
100c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                // configure the AppWidget if we should
101c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                configureAppWidget(CONFIGURE_APPWIDGET_REQUEST, appWidgetId, appWidget.configure);
102c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            } else {
103c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                // just add it as is
104c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                addAppWidgetView(appWidgetId, appWidget);
105c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            }
106c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        } else {
107c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            mHost.deleteAppWidgetId(appWidgetId);
108c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
109c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
110c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
111c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    void handleAppWidgetConfigureResult(int resultCode, Intent data) {
112c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        int appWidgetId = getPreferences(0).getInt(PENDING_APPWIDGET_ID, -1);
113c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        Log.d(TAG, "resultCode=" + resultCode + " appWidgetId=" + appWidgetId);
114c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (appWidgetId < 0) {
115c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            Log.w(TAG, "was no preference for PENDING_APPWIDGET_ID");
116c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            return;
117c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
118c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (resultCode == RESULT_OK) {
119c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
120c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            addAppWidgetView(appWidgetId, appWidget);
121c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        } else {
122c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            mHost.deleteAppWidgetId(appWidgetId);
123c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
124c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
125c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
126c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    void addAppWidgetView(int appWidgetId, AppWidgetProviderInfo appWidget) {
127c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        // Inflate the AppWidget's RemoteViews
128c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        AppWidgetHostView view = mHost.createView(this, appWidgetId, appWidget);
129c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
130c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        // Add it to the list
131c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
132980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                LinearLayout.LayoutParams.MATCH_PARENT,
133c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                LinearLayout.LayoutParams.WRAP_CONTENT);
134c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        mAppWidgetContainer.addView(view, layoutParams);
135c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
136c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        registerForContextMenu(view);
137c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
138c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
139c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
140c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        switch (requestCode) {
141c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        case DISCOVER_APPWIDGET_REQUEST:
142c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            handleAppWidgetPickResult(resultCode, data);
143c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            break;
144c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        case CONFIGURE_APPWIDGET_REQUEST:
145c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            handleAppWidgetConfigureResult(resultCode, data);
146c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
147c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
148c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
149c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    protected void onStart() {
150c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        super.onStart();
151c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        mHost.startListening();
152c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
153c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
154c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    protected void onStop() {
155c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        super.onStop();
156c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        mHost.stopListening();
157c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
158c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
159c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public void onCreateContextMenu(ContextMenu menu, View v,
160c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            ContextMenu.ContextMenuInfo menuInfo) {
161c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        menu.add(ContextMenu.NONE, R.string.delete_appwidget, ContextMenu.NONE,
162c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                R.string.delete_appwidget);
163c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
164c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
165c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
166c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        MyAppWidgetView view = (MyAppWidgetView)item.getMenuInfo();
167c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        switch (item.getItemId()) {
168c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        case R.string.delete_appwidget:
169c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            Log.d(TAG, "delete! " + view.appWidgetId);
170c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            mAppWidgetContainer.removeView(view);
171c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            mHost.deleteAppWidgetId(view.appWidgetId);
172c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            break;
173c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
174c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
175c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        return true;
176c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
177c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
178c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    class MyAppWidgetView extends AppWidgetHostView implements ContextMenu.ContextMenuInfo {
179c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        int appWidgetId;
180c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
181c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        MyAppWidgetView(int appWidgetId) {
182c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            super(AppWidgetHostActivity.this);
183c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            this.appWidgetId = appWidgetId;
184c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
185c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
186c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        public ContextMenu.ContextMenuInfo getContextMenuInfo() {
187c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            return this;
188c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
189c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
190c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
191c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    AppWidgetHost mHost = new AppWidgetHost(this, HOST_ID) {
192c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        protected AppWidgetHostView onCreateView(Context context, int appWidgetId, AppWidgetProviderInfo appWidget) {
193c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            return new MyAppWidgetView(appWidgetId);
194c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
195c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    };
196c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project}
197c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
198c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project
199