I wanna create an Android application, and I want to dynamically and automatically update the app icon similarly to how the calendar icon updates on a user's homescreen.
The calendar changes its icon for each day showing day of month's number. There is also an Alarm clock app which changes its icon setting the current time, in other words, changing every minute.
That isn't a widget, but a real app icon. Then it must have a way to do so. How can I do it in my app?
Whatever your home screen is has special hooks for whatever your calendar app is and whatever your alarm clock app is. In general, apps cannot update their icons.
What do you mean by hooks?
For example, Samsung can ship a Samsung calendar app on Samsung devices. Samsung's home screen on those same Samsung devices can have special rules for rendering an icon for Samsung's calendar app, rules that involve showing the day of the month. This is because Samsung wrote the home screen. If you install a third-party home screen, it may not do the same thing. After all, I can write a home screen in an hour or so, and I feel quite confident that I don't have to do anything special for Samsung's calendar app.
There's nothing stopping Samsung from exposing some sort of API to allow developers to hook into Samsung's home screen and notify it about this sort of thing. Whether Samsung intends for third parties to use that API, or whether it is somebody hacking into how Samsung does it for their own apps, I can't say.
(BTW, I am citing Samsung here as a possible example -- I don't know that they actually have this sort of feature, and if so on which devices they have it)
I seem to recall that somebody has a GitHub project that tries to wrap the proprietary APIs of various home screens. IIRC, some supported capabilities included either replacing the app icon or adding a badge (e.g., unread message count). However:
Only a small percentage of devices will support those proprietary APIs
Undocumented and unsupported APIs, discovered through reverse-engineering apps, are subject to change and may break in unexpected ways
I am quite certain that there is nothing in the Android SDK that supports dynamic app icons. The only thing that I know of, that people have tried, is using <activity-alias> to have N different "activities", all pointing to the same implementation, but having different icons. Using PackageManager and setComponentEnabledSetting(), the app disables the old launcher alias and enables a different one, in hopes that home screens will pick up on this and show the new icon. A few do. Others only would find out about the change on a reboot.
To flip the problem around, I can write a home screen. Perhaps I want to offer some way for apps to change their icons on the fly, even though there are no standards for it. Perhaps I don't. Perhaps I do not intend to use icons at all, as my home screen is optimized for the visually impaired, and so it is using text-to-speech and hardware key input. It's my home screen implementation, and I can do what I want.
Indeed even in the app drawer in Android O, the Clock app icon shows the current time and the Calendar app icon shows the current day-of-month.
This article explains:
Chris Lacy, the developer behind the well-known Action Launcher, has uncovered something in the APK file of the Clock app that comes in Android O: the manifest.xml mentions hours, minutes, and seconds as layers with default values, and the icon has separate images for the background and different elements.
That logically lead him to deduce that starting with Android O, the Clock app's icon will be animated to show the current time. That will happen both when the Clock is placed as a shortcut on the homescreen and when it's inside the app drawer.
It sounds like the Pixel launcher selects different icon image layer resources depending on time and date.
I'm a launcher developer.
I did nothing related to dynamic icon hooks. I just get the activities' icons by the standard way provided by Android API.
And I found that my launcher do show the current time in the Clock app icon and the current date in the Calendar icon.
The device is a Nubia X which runs Android 8.
The operating system should have done something with the two apps and changed their icons dynamically without the launcher beings aware of it.
These two apps are developed by the device manufacturer. You should not be able to do the same thing in a normal way as a third party developer.
you can define multiple activity-alias in your manifest file for each icon
<activity-alias
android:name="OneLauncherAlias"
android:enabled="true"
android:icon="#drawable/one"
android:label="One"
android:targetActivity=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
Enable and disable the activity-alias based on your requirement.
packageManager.setComponentEnabledSetting(ComponentName(this#MainActivity, com.misles.dynamiclaunchericon.OneLauncherAlias::class.java), PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP)
packageManager.setComponentEnabledSetting(ComponentName(this#MainActivity, com.misles.dynamiclaunchericon.TwoLauncherAlias::class.java), PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP)
for details refer this article
https://medium.com/#simonmisles/dynamic-launcher-icon-and-name-for-android-e40bf0561715
I have the same question but the answer provided here does not aswer it.
I have Google Pixel 2 with raw Android Ore 8.1 on the board and there are two apps that are changing over time: Calendar and Clock. The hands on the clock of Clock app show current time and the number on the Calendar icon correspond to today date of month.
So taking into account that it is default launcher probably there is some API to do similar thing.
For instance it might be the planetary app that reflects planets' positions on the icon. Or memory cleaner that shows percentage of used memory...
The launcher handles the dynamic calendar by accessing an icon for each day from the calendar app. For example, with Google Calendar, a Launcher developer may do the following:
Resources res = activity.getPackageManager()
.getResourcesForApplication("com.google.android.calendar");
int resId = res.getIdentifier("logo_calendar_01_regular", "drawable"
, "com.google.android.calendar");
Drawable icon = res.getDrawable(resId);
This would access the calendar icon for Day 1 of the month. To access any other day, "logo_calendar_01_regular" would be changed for the current day. For example, day 7 would be "logo_calendar_07_regular". Also Google calendar has two styles, "logo_calendar_01_regular" and "logo_calendar_01_round".
Also Icon themes contain separate icons for each date as well.
Adding more context here to #commonsware's answer.
Did a bit more digging on how google does it with their calendar and clock app.
They seem to have special cases in the launcher code as seen here:
https://cs.android.com/android/platform/superproject/+/master:packages/apps/Launcher3/src/com/android/launcher3/icons/IconProvider.java;l=54;drc=337c81f6646e8d8351604ee2e1dd1884bc7d0452
and here:
https://cs.android.com/android/platform/superproject/+/master:packages/apps/Launcher3/src/com/android/launcher3/icons/IconProvider.java;l=74;drc=337c81f6646e8d8351604ee2e1dd1884bc7d0452
So only workaround at this time to do this is to have multiple
activity aliases with different icons and then switch between those aliases.
http://blog.jakelee.co.uk/programmatically-changing-app-icon/
Related
I want to use the square version of my launcher icon but somehow android keeps forcing use the rounded version.
I read forcing square app icon and although the explanation makes sense it is not true:
in this screenshot you can see that most of icons are rounded but you have
contacts, widget preview and terminal emulator
And before someone say "they are special apps" terminal emulator is a shit app i downloaded from play store... In my cellphone 80% of apps are rounded but instagram, booking and some others are square...
how to force android use my square launcher?
There is a solution for this which i have tried and its works for me.
What we have to do is take the app icon and keep in res -> drawable.
App icon should be in all formats:-
mdpi
, hdpi
, xhdpi
, xxhdpi
, xxxhdpi
with same name for example-
ic_app_icon.png(mdpi)
ic_app_icon.png(hdpi)
ic_app_icon.png(xhdpi)
ic_app_icon.png(xxhdpi)
ic_app_icon.png(xxxhdpi)
Then in Android Menifest file do this change
android:roundIcon="#drawable/ic_app_icon"
by this we can get app icon square.
First, please understand that there are hundreds of different launcher implementations in use across the ~10,000 Android device models and ~2 billion Android devices. How a launcher chooses to represent your activity is up to the developer of the launcher. For example, there is no requirement for the launcher to use any icon at all (e.g., a launcher optimized for screen readers and visually impaired users). A launcher that does use some sort of graphical element might use your icon or not, and if if it does use your icon, it might modify it (crop it to a shape, apply a color filter, cause it to spin, whatever).
Your screenshot appears to be of the Android emulator. In that case, temporarily, you can set your targetSdkVersion to be 25 or lower, and that particular launcher will not attempt to adapt your launcher icon.
However, please bear in mind that you will not be able to ship your app on the Play Store with that low of a targetSdkVersion starting in a few months. So, if the Play Store is your planned distribution channel, you will need to get used to Android's adaptive icon system and deal with the fact that the shape of your icon will be changed on most Android 8.0+ devices.
I'm developping a notification App, I want to know if there is a way to dynamically set the Application icon when I recive a new Notification like happen in Whatsapp, with the circled number on the top of the icon,
thanks :)
There is no such feature available in android OS itself. The notification badge and dynamic icon like in weather and calendar apps purely depends on the launcher app you are using. For example, Samsung can ship a Samsung calendar app on Samsung devices. Samsung's home screen on those same Samsung devices can have special rules for rendering an icon for Samsung's calendar app, rules that involve showing the day of the month. This is because Samsung wrote the home screen.
Hope you understand the scenario.
Is it possible to Display Information on the lock screen from an Android application.
I came across a few Apps which allow you to display Email and Calendar information on the screen but could not find which API to use for achieving the same.
Android 4.2 supports app widgets on the lockscreen.
according to the app you've mentioned (which has very poor description and quite low rating) , i suspect they disable the keyguard (the default lock screen) each time they get the event of power off (or on) .
maybe the activity that they are using has a transparent background and is above the normal lock screen .
there are many similar apps , such as "widget Locker" ,"magic Locker" and "quick Launch" , all do about the same thing to replace the keyguard . most of them also have the ability to replace the launcher (but will still show the launcher of the user, of course) , for smoother experience .
does the screenshot belong to the app you've mentioned , or to something you wish to achieve ?
You can learn how it can be done if you look at the sources of open source project contact owner that adds a message to the lock screen, too.
I need a screen control (possibly but not mandatory an app widget) that will seat
on Android's homescreen and will always be visible to the user - even when he scrolls the homescreen to the next page.
Please help me if any body have done this before.
I think the only way you will be able to do this is if you implement your own Launcher.
The functionality that you're looking for, being able to place a static widget on every screen of the launcher regardless of how many screens they have, isn't currently available in Android, nor any of the launcher apps out there (Go launcher, ADW, Launcher pro etc) nor any of the versions of Android which have been rewritten by the phone manufacturers (HTC's Sense, Samsungs Touch Wiz etc)
It's a big job to write a Launcher yourself, but the stock Android Launcher code is available to play about with from https://android.googlesource.com.
I run my applcation in Motorola,HTC devices and each group of devices my application dialog box,Text box appearance is different.Why this will happend?Is device to device any specific theme applied on my application?Iam n't used any custom theme for my application.
how to persist my application look and feel in all devices.I know little bit, by using our own theme we can persist.but, I don't have time to develope my own theme.I want to take the source of one device default theme and utilise that one in my application.So that I think i can see the application same in all devices.how to get the theme from one device,if my above sentence correct?
You are right every manufacturer applies some styling to their user interface.
There are some places where this is fine for example dialog boxes should look the same in every application on the device. If a dialog box would look completely different then all the other dialogs this would confuse the user.
Some things are annoying for example the motorola motoblur phones use a black background image for spinners and normal andoroid phones use a grey one.
Have a look at my question regarding this problem. It is a solution for a small part of your problem but maybe it shows you how to search for the other images and themes that you need to copy.