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