Search code examples
androidandroid-launcherandroid-icons

android 10" xhdpi tablet launcher icon size


I have an app that creates shortcuts. it generates the shortcut icon dynamically, so I need to know the correct launcher icon size.

To handle this, I created dimens.xml in values-ldpi/mdpi/hdpi/xhdpi/xxhdpi and defined my icon size to be 36/48/72/96/144px respectively.

This scheme works, except on 10", xhdpi tablets (like the nexus 10). it appears these tablets use a launcher icon size of 144px (xxhdpi) despite have an xhdpi screen.

Is there a way to correctly detect the launcher icon size that takes into account 10" xhdpi tablets? Or is there a better scheme for getting my icons sized correctly? Or perhaps is there a way to differentiate this case from the simple xhdpi case?


Solution

  • To get the launcher icon size, simply call ActivityManager.getLauncherLargeIconSize() as suggested by CommonsWare above. One slight hiccup is that this is only available on API 11+. In that case, fall back to using DisplayMetrics. This will of course fail if there was a 10" XHDPI device that ran android 2, which is extremely unlikely (since X*HDPI didn't exist at the time of Android 2). Here's the utility method I wrote,

    @SuppressLint("NewApi")
    private int getLauncherIconSize() {
        int size = 48;
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            ActivityManager mgr = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
            size = mgr.getLauncherLargeIconSize();
        } else {
            DisplayMetrics metrics = new DisplayMetrics();
            activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
            switch (metrics.densityDpi) {
            case DisplayMetrics.DENSITY_LOW:
                size = 36;
                break;
            case DisplayMetrics.DENSITY_MEDIUM:
                size = 48;
                break;
            case DisplayMetrics.DENSITY_HIGH:
                size = 72;
                break;
            case DisplayMetrics.DENSITY_XHIGH:
                size = 96;
                break;
            case DisplayMetrics.DENSITY_XXHIGH:
                size = 144;
                break;
            }
        }
    
        return size;
    }