Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hosting widgets in an android launcher

I am making a launcher for android, and I'm stuck at the widget part. I've been searching for about an hour and a half on the internet trying to figure out how can I host widgets in my application, but no luck.

I have went through some stock launchers and ADW launcher codes but both just have miles of code and this is the first time I'm making a launcher.

Could someone please guide me through how can I add widgets into my launcher? Or at least post any links/tutorials? Please explain it since this is my first time.

like image 486
user1446632 Avatar asked Jul 13 '12 15:07

user1446632


People also ask

What is widget host in Android?

App widget host: The AppWidgetHost provides the interaction with the AppWidget service for apps that want to embed app widgets in their UI. An AppWidgetHost must have an ID that is unique within the host's own package. This ID remains persistent across all uses of the host.

Can you make your own widgets on Android?

You can create your own widget with the help of third-party apps. One such app is KWGT Kustom Widget Maker, and for the purpose of this tutorial, we are using it to design a simple event reminder widget that links to the Google Calendar.

Can Android stack widgets?

In Samsung's One UI 4.1, Smart Widgets for Galaxy phones were introduced to make things a little easier. These specialized widgets are stackable and can house several widgets at once.


1 Answers

Try this:

final int APPWIDGET_HOST_ID = 2048;
final int REQUEST_PICK_APPWIDGET = 0;
final int REQUEST_CREATE_APPWIDGET = 5;

AppWidgetManager appWidgetManager;
AppWidgetHost appWidgetHost;

// Let user pick a widget from the list of intalled AppWidgets
public void selectWidget()
{
    int appWidgetId = this.appWidgetHost.allocateAppWidgetId();
    Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
    pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
    addEmptyData(pickIntent);
    startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET);
}

// For some reason you have to add this empty data, else it won't work
public void addEmptyData(Intent pickIntent)
{
    ArrayList<AppWidgetProviderInfo> customInfo = 
        new ArrayList<AppWidgetProviderInfo>();
    pickIntent.putParcelableArrayListExtra(
        AppWidgetManager.EXTRA_CUSTOM_INFO, customInfo);
    ArrayList<Bundle> customExtras = new ArrayList<Bundle>();
    pickIntent.putParcelableArrayListExtra(
        AppWidgetManager.EXTRA_CUSTOM_EXTRAS, customExtras);
};

@Override
protected void onActivityResult(int requestCode, int resultCode, 
                                Intent data) {
    if (resultCode == RESULT_OK ) {
        if (requestCode == REQUEST_PICK_APPWIDGET) {
            configureWidget(data);
        }
        else if (requestCode == REQUEST_CREATE_APPWIDGET) {
            createWidget(data);
        }
    }
    else if (resultCode == RESULT_CANCELED && data != null) {
        int appWidgetId = 
            data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
        if (appWidgetId != -1) {
            appWidgetHost.deleteAppWidgetId(appWidgetId);
        }
    }
}

// Show configuration activity of the widget picked by the user
private void configureWidget(Intent data) {
    Bundle extras = data.getExtras();
    int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
    AppWidgetProviderInfo appWidgetInfo = 
            appWidgetManager.getAppWidgetInfo(appWidgetId);
    if (appWidgetInfo.configure != null) {
        Intent intent = 
            new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
        intent.setComponent(appWidgetInfo.configure);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        startActivityForResult(intent, REQUEST_CREATE_APPWIDGET);
    } else {
        createWidget(data);
    }
}

// Get an instance of the selected widget as a AppWidgetHostView
public void createWidget(Intent data) {
    Bundle extras = data.getExtras();
    int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
    AppWidgetProviderInfo appWidgetInfo = appWidgetManager.getAppWidgetInfo(appWidgetId);

    AppWidgetHostView hostView = appWidgetHost.createView(this, appWidgetId, appWidgetInfo);
    hostView.setAppWidget(appWidgetId, appWidgetInfo);
    // Add  it on the layout you want
    myLayout.addView(hostView);
}

// Call this when you want to remove one from your layout
public void removeWidget(AppWidgetHostView hostView) {
    appWidgetHost.deleteAppWidgetId(hostView.getAppWidgetId());

    // Remove from your layout
    myLayout.removeView(hostView);
}

@Override
protected void onStart() {
    super.onStart();
    appWidgetManager = AppWidgetManager.getInstance(this);
    appWidgetHost = new AppWidgetHost(this, APPWIDGET_HOST_ID);

    // Start listening to pending intents from the widgets
    appWidgetHost.startListening();
}

@Override
protected void onStop() {
    super.onStop();
    appWidgetHost.stopListening();
}

All you've got to do is call the method selectWidget() whenever you want to show a list of AppWidgets installed on the device to pick from.

This code is a bit of a modified version of the stock Android launcher.

EDIT:

To bind widget IDs, i.e. make widgets update and respond to user interaction, refer the solution here: Widgets don't respond when re-added through code

like image 74
Kamran Ahmed Avatar answered Sep 30 '22 22:09

Kamran Ahmed