Skip to content

Instantly share code, notes, and snippets.

@vic797
Created August 3, 2018 17:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vic797/eb2c864218b7952d50acd29ca8673ffd to your computer and use it in GitHub Desktop.
Save vic797/eb2c864218b7952d50acd29ca8673ffd to your computer and use it in GitHub Desktop.
import android.app.Activity;
import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
import android.content.Intent;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.FrameLayout;
public class WidgetView {
private static final int HOST_ID = 128;
private static final int REQUEST_PICK_CODE = 256;
private static final int REQUEST_CREATE_CODE = 512;
private AppWidgetHost widgetHost;
private AppWidgetManager widgetManager;
private Activity activity;
private ViewGroup container;
private int widgetId = -1;
/**
* Constructor
* @param activity activity que iniciara los Intents
* @param container contenedor para el Widget
*/
public WidgetView(Activity activity, ViewGroup container) {
this.activity = activity;
this.container = container;
widgetManager = AppWidgetManager.getInstance(activity);
widgetHost = new AppWidgetHost(activity, HOST_ID);
}
/**
* El {@link AppWidgetHost} debe escuchar los cambios en el widget
* @see AppWidgetHost#startListening()
*/
public void startListening() {
if (widgetHost != null)
widgetHost.startListening();
}
/**
* El {@link AppWidgetHost} debe dejar de escuchar los cambios en el widget
* @see AppWidgetHost#stopListening() ()
*/
public void stopListening() {
if (widgetHost != null)
widgetHost.stopListening();
}
/**
* Inicia el {@link Intent} que crea el widget
*/
public void createWidget() {
widgetId = widgetHost.allocateAppWidgetId();
Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
activity.startActivityForResult(pickIntent, REQUEST_PICK_CODE);
}
/**
* Elimina el widget de la layout y libera la ID
*/
public void destroyWidget() {
container.removeAllViews();
if (widgetId != -1) {
widgetHost.deleteAppWidgetId(widgetId);
}
}
/**
* Capturar el resultado de los Intents
* @see Activity#onActivityResult(int, int, Intent) ¡
*/
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_CANCELED) {
int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
if (appWidgetId != -1) {
widgetHost.deleteAppWidgetId(appWidgetId);
}
} else if (resultCode == Activity.RESULT_OK) {
if (requestCode == REQUEST_PICK_CODE) {
configureWidget(data);
} else if (requestCode == REQUEST_CREATE_CODE) {
addWidget(data);
}
}
}
/**
* Agrega el widget a la layout
* @param data resultado con la información del widget
*/
private void addWidget(Intent data) {
int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
AppWidgetProviderInfo appWidgetInfo = widgetManager.getAppWidgetInfo(appWidgetId);
if (appWidgetInfo == null) {
container.removeAllViews();
return;
}
AppWidgetHostView hostView = widgetHost.createView(activity, appWidgetId, appWidgetInfo);
hostView.setMinimumHeight(appWidgetInfo.minHeight);
hostView.setAppWidget(appWidgetId, appWidgetInfo);
hostView.updateAppWidgetSize(null, appWidgetInfo.minWidth, appWidgetInfo.minHeight, appWidgetInfo.minWidth, appWidgetInfo.minHeight);
container.addView(hostView, getLayoutParams(appWidgetInfo.minWidth, appWidgetInfo.minHeight));
}
/**
* Configura el widget si es necesario
* @param data informacion del widget
*/
private void configureWidget(Intent data) {
int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
AppWidgetProviderInfo appWidget = widgetManager.getAppWidgetInfo(appWidgetId);
if (appWidget.configure != null) {
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
intent.setComponent(appWidget.configure);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
activity.startActivityForResult(intent, REQUEST_CREATE_CODE);
} else {
onActivityResult(REQUEST_CREATE_CODE, Activity.RESULT_OK, data);
}
}
private ViewGroup.LayoutParams getLayoutParams(int w, int h) {
if (container instanceof FrameLayout) {
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(w, h);
params.gravity = Gravity.CENTER;
return params;
}
return new ViewGroup.LayoutParams(w, h);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment