Tuesday, 24 May 2016

Showing Badge or count in Android app icon


                        Here I am going to explain how to set badge or count in Android app icon

                      Android without custom launchers and touch interfaces does not allow changing of the application icon, because it is sealed in the .apk tightly once the program is compiled. There is no way to change it to a 'drawable' programmatically using standard APIs.So the below code works only in Samsung,Htc,Sony etc.

                             


Step 1)BadgeUtils.java


import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;

import java.util.List;

public class BadgeUtils {


    public static void setBadge(Context context, int count) {
        setBadgeSamsung(context, count);
        setBadgeSony(context, count);

    }

    public static void clearBadge(Context context) {
        setBadgeSamsung(context, 0);
        clearBadgeSony(context);
    }


    private static void setBadgeSamsung(Context context, int count) {
        String launcherClassName = getLauncherClassName(context);
        if (launcherClassName == null) {
            return;
        }
     Intent intent = new                                                                                                  Intent("android.intent.action.BADGE_COUNT_UPDATE");
     intent.putExtra("badge_count", count);
     intent.putExtra("badge_count_package_name", context.getPackageName());
     intent.putExtra("badge_count_class_name", launcherClassName);
     context.sendBroadcast(intent);
    }

    private static void setBadgeSony(Context context, int count) {
        String launcherClassName = getLauncherClassName(context);
        if (launcherClassName == null) {
            return;
        }

        Intent intent = new Intent();
        intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
        intent.putExtra("com.sonyericsson.home.intent.extra.badge
               .ACTIVITY_NAME"launcherClassName);
        intent.putExtra("com.sonyericsson.home.intent.extra.badge
               .SHOW_MESSAGE", true);
        intent.putExtra("com.sonyericsson.home.intent.extra.badge
               .MESSAGE", String.valueOf(count));
        intent.putExtra("com.sonyericsson.home.intent.extra.badge
               .PACKAGE_NAME"   , context.getPackageName());
                    

        context.sendBroadcast(intent);
    }


    private static void clearBadgeSony(Context context) {
        String launcherClassName = getLauncherClassName(context);
        if (launcherClassName == null) {
            return;
        }

        Intent intent = new Intent();
        intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
        intent.putExtra("com.sonyericsson.home.intent.extra.badge
                 .ACTIVITY_NAME" , launcherClassName);
        intent.putExtra("com.sonyericsson.home.intent.extra.badge
                 .SHOW_MESSAGE", false);
        intent.putExtra("com.sonyericsson.home.intent.extra.badge
                 .MESSAGE", String.valueOf(0));
        intent.putExtra("com.sonyericsson.home.intent.extra.badge
                 .PACKAGE_NAME", context.getPackageName());

        context.sendBroadcast(intent);
    }

    private static String getLauncherClassName(Context context)
    {

        PackageManager pm = context.getPackageManager();

        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);

        List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
        for (ResolveInfo resolveInfo : resolveInfos) {
        String pkgName resolveInfo.activityInfo.applicationInfo.packageName;
            if (pkgName.equalsIgnoreCase(context.getPackageName()))
            {
                String className = resolveInfo.activityInfo.name;
                return className;
            }
        }
        return null;
    }
}

Step 2)MainActivity.java

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;



public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final EditText numInput = (EditText) findViewById(R.id.numInput);

        Button button = (Button) findViewById(R.id.btnSetBadge);
        button.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                int badgeCount = 0;
                try {
                    badgeCount = Integer.parseInt(numInput.getText().toString());
                }
                 catch (NumberFormatException e)
                {
                 Toast.makeText(getApplicationContext(), "Error input",                                                                             Toast.LENGTH_SHORT).show();
                }

                 BadgeUtils.setBadge(MainActivity.this, badgeCount);


            }
        });

        Button removeBadgeBtn = (Button) findViewById(R.id.btnRemoveBadge);
        removeBadgeBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                BadgeUtils.clearBadge(MainActivity.this);
           }
        });
 }
}

Happy Coding :)