Android App Static Shortcut with Navigation Library
T

1

10

My app has one static shortcut, and I'm using the navigation architecture component.

I'm using the following implementation but it does not work on Android 9.

In my MainActivity:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    setupToolbar()
    setupNavigationDrawer()

    checkPermissions()

    if (intent.action == MoneyBook.SHORTCUT_ACTION_ADD_BOOKENTRY) {
        findNavController(R.id.nav_host_fragment).popBackStack(R.id.action_entriesFragment_to_newBookEntryFragment, false)
    }
}

shortcuts.xml:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <shortcut
        android:enabled="true"
        android:icon="@drawable/ic_shortcut_addbookentry"
        android:shortcutId="shortcut_addbookentry"
        android:shortcutLongLabel="@string/shortcut_addbookentry_label_short"
        android:shortcutShortLabel="@string/shortcut_addbookentry_label_short">

        <intent
            android:action="at.guger.moneybook.action.ADD_BOOKENTRY"
            android:targetClass="at.guger.moneybook.activity.MainActivity"
            android:targetPackage="at.guger.moneybook.dev" />
    </shortcut>
</shortcuts>

When debugging the app, I noticed that the findNavController(...) method is called, but nothing happens on the screen.

Further, I do not override onStart(...) or onResume(...).

Is there any given way to implement app shortcuts with navigation component or am I doing something terribly wrong here?

Trask answered 8/2, 2019 at 20:23 Comment(1)
What do you expect to happen? popBackStack() goes back - do you mean to call navigate() instead?Joy
J
21

Navigation does not support deep linking by intent.action alone. However, you can add an android:data element to your <intent> element and then add a implicit deep link to your navigation graph. By doing this, you won't have to write any specific code for handling the Intent.

For example, change your shortcuts.xml to add the android:data attribute:

<intent
        android:action="at.guger.moneybook.action.ADD_BOOKENTRY"
        android:targetClass="at.guger.moneybook.activity.MainActivity"
        android:targetPackage="at.guger.moneybook.dev"
        android:data="moneybook://add_book_entry" />

and in your navigation graph XML file, add a <deepLink> element for the same URL:

<fragment
  android:id="@+id/add_book_entry_fragment"
  android:name=".AddBookEntryFragment">
  <deepLink app:uri="moneybook://add_book_entry" />
</fragment>
Joy answered 8/2, 2019 at 21:35 Comment(1)
Thank you, that's absolutely the cleanest solution!Trask

© 2022 - 2024 — McMap. All rights reserved.