Created
August 3, 2018 17:51
-
-
Save vic797/eb2c864218b7952d50acd29ca8673ffd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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