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