/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.tests.appwidgethost;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetProviderInfo;
import android.appwidget.AppWidgetManager;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.LinearLayout;
public class AppWidgetHostActivity extends Activity
{
static final String TAG = "AppWidgetHostActivity";
static final int DISCOVER_APPWIDGET_REQUEST = 1;
static final int CONFIGURE_APPWIDGET_REQUEST = 2;
static final int HOST_ID = 1234;
static final String PENDING_APPWIDGET_ID = "pending_appwidget";
AppWidgetManager mAppWidgetManager;
AppWidgetContainerView mAppWidgetContainer;
public AppWidgetHostActivity() {
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
mAppWidgetManager = AppWidgetManager.getInstance(this);
setContentView(R.layout.appwidget_host);
mHost = new AppWidgetHost(this, HOST_ID) {
protected AppWidgetHostView onCreateView(Context context, int appWidgetId, AppWidgetProviderInfo appWidget) {
return new MyAppWidgetView(appWidgetId);
}
};
findViewById(R.id.add_appwidget).setOnClickListener(mOnClickListener);
mAppWidgetContainer = (AppWidgetContainerView)findViewById(R.id.appwidget_container);
if (false) {
if (false) {
mHost.deleteHost();
} else {
AppWidgetHost.deleteAllHosts();
}
}
}
View.OnClickListener mOnClickListener = new View.OnClickListener() {
public void onClick(View v) {
discoverAppWidget(DISCOVER_APPWIDGET_REQUEST);
}
};
void discoverAppWidget(int requestCode) {
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mHost.allocateAppWidgetId());
startActivityForResult(intent, requestCode);
}
void configureAppWidget(int requestCode, int appWidgetId, ComponentName configure) {
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
intent.setComponent(configure);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
SharedPreferences.Editor prefs = getPreferences(0).edit();
prefs.putInt(PENDING_APPWIDGET_ID, appWidgetId);
prefs.commit();
startActivityForResult(intent, requestCode);
}
void handleAppWidgetPickResult(int resultCode, Intent intent) {
// BEGIN_INCLUDE(getExtra_EXTRA_APPWIDGET_ID)
Bundle extras = intent.getExtras();
int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
// END_INCLUDE(getExtra_EXTRA_APPWIDGET_ID)
if (resultCode == RESULT_OK) {
AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
if (appWidget.configure != null) {
// configure the AppWidget if we should
configureAppWidget(CONFIGURE_APPWIDGET_REQUEST, appWidgetId, appWidget.configure);
} else {
// just add it as is
addAppWidgetView(appWidgetId, appWidget);
}
} else {
mHost.deleteAppWidgetId(appWidgetId);
}
}
void handleAppWidgetConfigureResult(int resultCode, Intent data) {
int appWidgetId = getPreferences(0).getInt(PENDING_APPWIDGET_ID, -1);
Log.d(TAG, "resultCode=" + resultCode + " appWidgetId=" + appWidgetId);
if (appWidgetId < 0) {
Log.w(TAG, "was no preference for PENDING_APPWIDGET_ID");
return;
}
if (resultCode == RESULT_OK) {
AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
addAppWidgetView(appWidgetId, appWidget);
} else {
mHost.deleteAppWidgetId(appWidgetId);
}
}
void addAppWidgetView(int appWidgetId, AppWidgetProviderInfo appWidget) {
// Inflate the AppWidget's RemoteViews
AppWidgetHostView view = mHost.createView(this, appWidgetId, appWidget);
// Add it to the list
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
mAppWidgetContainer.addView(view, layoutParams);
registerForContextMenu(view);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case DISCOVER_APPWIDGET_REQUEST:
handleAppWidgetPickResult(resultCode, data);
break;
case CONFIGURE_APPWIDGET_REQUEST:
handleAppWidgetConfigureResult(resultCode, data);
}
}
protected void onStart() {
super.onStart();
mHost.startListening();
}
protected void onStop() {
super.onStop();
mHost.stopListening();
}
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
menu.add(ContextMenu.NONE, R.string.delete_appwidget, ContextMenu.NONE,
R.string.delete_appwidget);
}
public boolean onContextItemSelected(MenuItem item) {
MyAppWidgetView view = (MyAppWidgetView)item.getMenuInfo();
switch (item.getItemId()) {
case R.string.delete_appwidget:
Log.d(TAG, "delete! " + view.appWidgetId);
mAppWidgetContainer.removeView(view);
mHost.deleteAppWidgetId(view.appWidgetId);
break;
}
return true;
}
class MyAppWidgetView extends AppWidgetHostView implements ContextMenu.ContextMenuInfo {
int appWidgetId;
MyAppWidgetView(int appWidgetId) {
super(AppWidgetHostActivity.this);
this.appWidgetId = appWidgetId;
}
public ContextMenu.ContextMenuInfo getContextMenuInfo() {
return this;
}
}
AppWidgetHost mHost;
}