androidandroid-8.0-oreoandroid-shortcutandroid-shortcutmanager

Android - How to receive shortcut create result


Looking at the code sample here - I find the following comment puzzling:

// ... We assume here that the
// app has implemented a method called createShortcutResultIntent() that
// returns a broadcast intent.

what does it mean the app has implemented ... where is this implementation done?

is it a broadcast receiver? registered to which intent filter?

is this an abstract method? of which class?

and then I see this code sample - which handles a completely different flow (I think) and I'm lost again


Solution

  • You can obtain feedback via catching the broadcast event which you setup while use requestPinShortcut function. At first you need a usual broadcast receiver (in the code below it has name ShortcutReceiver). You can even use existing broadcast receiver and simple add new action which it should catch.
    Lets the action will be "general.intent.action.SHORTCUT_ADDED" and it will be stored in ShortcutReceiver.kInstalledAction constant. In this case in the manifest you should have:

    <receiver android:name=".ShortcutReceiver" >
      <intent-filter>
        <action android:name="general.intent.action.SHORTCUT_ADDED"/>
      </intent-filter>
    </receiver>
    

    After this you can use following code in the activity for create a pinned shortcut (in other places change this on object of Context class):

    ShortcutManager manager = this.getSystemService(ShortcutManager.class);
    Intent targetIntent = new Intent(ShortcutReceiver.kInstalledAction);
    targetIntent.setPackage(this.getPackageName());
    PendingIntent intent = PendingIntent.getBroadcast(this, 0, targetIntent, 0);
    manager.requestPinShortcut(info, intent.getIntentSender());
    

    In this code info is correct object of ShortcutInfo class.
    You can handle the event while catch the broadcast:

    public class ShortcutReceiver extends BroadcastReceiver {
      public static final String kInstalledAction = "general.intent.action.SHORTCUT_ADDED";
    
      @Override
      public void onReceive(Context context, Intent intent) {
        
        if (kInstalledAction.equals(intent.getAction())) {
          // Handle the event after the shortcut has been added 
          Toast.makeText(context, "The shortcut has been added", Toast.LENGTH_LONG).show();
        }
      
      }
    
    }
    

    Please take into account that from my experience the broadcast event happens after the shortcut has been added but sometimes there can be some delays (at about some minutes). But may be there is some dependency on the launcher.

    Update
    As described in other answers on Android 8 catching of implicit intent via broadcast in general doesn't work. So I simple changed the intent to explicit via set package name of the current app. So only our broadcast receiver can catch the intent.