No `tray__authority` anymore!

Stefan M.
2 min readMay 5, 2017

--

As you probably know I’m a contributor (and member 😉) of Tray. Tray is a SharedPreferences replacement with benefits. The main reason to develop it was the ability to use a simple store mechanism working in multiprocess environments. But it brings also the benefit of a way easier API than the default SharedPreferences. No Editor, no commit() or apply().

Anyway. This is not about the gorgeous API or the ability of separating settings via TrayPreferences. This is about the setup of Tray.

The process of setup Tray was a little bit weird. You have to declare a resValue called tray__authority in your module build.gradle like this:

resValue "string", "tray__authority", "${applicationId}.tray"

Because we use a ContentProvider underneath we need a unique authority for it. And this snipped will inject the given resValue to the ContentProvider as authority.

As you can see on that example above we do recommend a authority based on your applicationId plus the suffix .tray. We recommend it but it is not mandatory to use it like that. You can also choose any @StringRes you want.

To simplify the process one contributor came up with the idea to set the authority automatically. Which leads, obviously, to a much more simpler process of including the library.

Et voilà. With the next version (will be probably 0.12.0) we will automatically use ${applicationId}.tray as the default authority. No tray__authority anymore!

The downside of that change is — if you update Tray to the specific version — you have to adjust it a little bit. But trust me it is not that much to do 🙂.

There a two use cases. The first one is that you have set the tray__authority like we recommend. The second one is that you have set a custom authority.

If you have set the old authority to the new default value (${applicationId}.tray) the update is simple. Just remove the resValue config in your build.gradle. Simple, isn’t it?

But if you have set a custom authority — which means if you have something like this:

resValue "string", "tray__authority", "a.custom.tray.authority"

you have to override the TrayContentProvider in your AndroidManifest.
To use your custom authority just put the following code into your <application> tag:

<provider
android:name="net.grandcentrix.tray.provider.TrayContentProvider"
android:authorities="a.custom.tray.authority"
android:exported="false"
tools:replace="android:authorities" />

That’s it. Our ContentProvider uses now the custom authority instead of the default one.

But there is one more config to mention: productFlavors.
If you have a custom authority for Tray in a specific flavor in your build.gradle it will not work either. You have to — like changing the AndroidManifest in your main sourceSet — change (or create) the AndroidManifest in your flavor sourceSet.

Lets’ give me an example.
If you have the following flavor:

productFlavors {
dev {
// resValue "string", "tray__autho... // Don't use it anymore!
}
}

you have to create a (or edit) the manifest in

projectName/app/src/dev/AndroidManifest.xml

That’s all for now. If you have any question with the migration or general feedback don’t shy to reach us at GitHub. We are very welcome to new contributors and improvements.

--

--