[
  {
    "path": ".gitignore",
    "content": ".idea/*\n*.iml\nbuild\n.gradle\nlocal.properties\n**/gradle.properties\n"
  },
  {
    "path": "LICENSE",
    "content": "        Copyright 2014 Leo Lin\n\n        Licensed under the Apache License, Version 2.0 (the \"License\");\n        you may not use this file except in compliance with the License.\n        You may obtain a copy of the License at\n\n            http://www.apache.org/licenses/LICENSE-2.0\n\n        Unless required by applicable law or agreed to in writing, software\n        distributed under the License is distributed on an \"AS IS\" BASIS,\n        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n        See the License for the specific language governing permissions and\n        limitations under the License."
  },
  {
    "path": "README.md",
    "content": "ShortcutBadger: [![Maven Central](https://maven-badges.herokuapp.com/maven-central/me.leolin/ShortcutBadger/badge.svg)](https://maven-badges.herokuapp.com/maven-central/me.leolin/ShortcutBadger)\n===================================\n\nThe ShortcutBadger makes your Android App show the count of unread messages as a badge on your App shortcut!\n\n# Supported launchers:<br/>\n\n<table>\n    <tr>\n        <td width=\"130\">\n            <h3>Sony</h3>\n            <br>\n            <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_sony.png\"/>\n        </td>\n        <td width=\"130\">\n            <h3>Samsung</h3>\n            <br>\n            <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_samsung.png\"/>\n        </td>\n        <td width=\"130\">\n            <h3>LG</h3>\n            <br>\n            <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_lg.png\"/>\n        </td>\n        <td width=\"130\">\n            <h3>HTC</h3>\n            <br>\n            <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_htc.png\"/>\n        </td>\n    </tr>\n    <tr>\n        <td width=\"130\">\n            <h3>Xiaomi</h3>\n            <br>\n            <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_xiaomi.png\"/>\n            <br>\n        </td>\n        <td width=\"130\">\n            <h3>ASUS</h3>\n            <br>\n            <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_asus.png\"/>\n        </td>\n        <td width=\"130\">\n            <h3>ADW</h3>\n            <br>\n            <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_adw.png\"/>\n        </td>\n        <td width=\"130\">\n            <h3>APEX</h3>\n            <br>\n            <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_apex.png\"/>\n        </td>\n    <tr>\n        <td width=\"130\">\n            <h3>NOVA</h3>\n            <br>\n            <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_nova.png\"/>\n        </td>\n        <td width=\"130\">\n            <h3>Huawei</h3>\n            <br>\n            (Not Fully Support)\n            <br>\n            <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_huawei.png\"/>\n            <br>\n            (1.1.7+)\n        </td>\n        <td width=\"130\">\n            <h3>ZUK</h3>\n            <br>\n            <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_zuk.png\"/>\n            <br>\n            (1.1.10+)\n        </td>\n        <td width=\"130\">\n            <h3>OPPO</h3>\n            <br>\n            (Not Fully Support)\n            <br>\n            <img src=\"screenshots/ss_oppo.png?raw=true\"/>\n            <br>\n            (1.1.10+)\n        </td>\n    </tr>\n    <tr>\n        <td width=\"130\">\n            <h3>EverythingMe</h3>\n            <br>\n            <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_evme.png\"/>\n        </td>\n        <td width=\"130\">\n            <h3>ZTE</h3>\n            <br>\n            <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_zte.png\"/>\n            <br>\n            (1.1.17+)\n        </td>\n        <td width=\"260\" colspan=\"2\">\n            <h3>KISS</h3>\n            <br>\n            <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_kiss.png\"/>\n            <br>\n            (1.1.18+)\n        </td>\n    </tr>\n    <tr>\n        <td width=\"130\">\n            <h3>LaunchTime</h3>\n            <br>\n            <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_launchtime.png\"/>\n        </td>\n        <td width=\"260\" colspan=\"2\">\n                    <h3>Yandex Launcher</h3>\n                    <br>\n                    <img src=\"https://raw.github.com/leolin310148/ShortcutBadger/master/screenshots/ss_yandex.png\"/>\n                    <br>\n                    (1.1.23+)\n        </td>\n    </tr>\n</table>\n\n* Nova launcher with TeslaUnread, Apex launcher, ADW Launcher provided by [notz](https://github.com/notz)\n* Solid launcher provided by [MajeurAndroid](https://github.com/MajeurAndroid)\n* KISS Launcher provided by [alexander255](https://github.com/alexander255)\n\n## About Xiaomi devices\nXiaomi devices require extra setup with notifications, please read [wiki](https://github.com/leolin310148/ShortcutBadger/wiki/Xiaomi-Device-Support).\n\n## IsBadgeWorking? \n\nA tool for displaying your device, launcher & android version and testing whether ShortcutBadger\nworks or not may be downloaded from\n\n* Google Play [https://play.google.com/store/apps/details?id=me.leolin.isbadgeworking](https://play.google.com/store/apps/details?id=me.leolin.isbadgeworking)\n* The GitHub repository [https://github.com/leolin310148/IsBadgeWorking.Android/releases](https://github.com/leolin310148/IsBadgeWorking.Android/releases)\n\n\nUSAGE\n===================================\n<br/>1. Add mavenCentral to your build script.\n\n        repositories {\n            mavenCentral()\n        }\n    \n<br/>2. Add dependencies for ShortcutBadger, it's available from maven now.\n        \n        dependencies {\n            implementation \"me.leolin:ShortcutBadger:1.1.22@aar\"\n        }\n\n<br/>3. Add the codes below:\n\n        int badgeCount = 1;\n        ShortcutBadger.applyCount(context, badgeCount); //for 1.1.4+\n        ShortcutBadger.with(getApplicationContext()).count(badgeCount); //for 1.1.3\n        \n<br/>4. If you want to remove the badge\n        \n        ShortcutBadger.removeCount(context); //for 1.1.4+\n        ShortcutBadger.with(getApplicationContext()).remove();  //for 1.1.3\nor\n        \n        ShortcutBadger.applyCount(context, 0); //for 1.1.4+\n        ShortcutBadger.with(getApplicationContext()).count(0); //for 1.1.3\n<br/>\n<br/>\n<br/>\n<br/>\n\n\nDEVELOP BY\n===================================\n[Leo Lin](https://github.com/leolin310148) - leolin310148@gmail.com\n\n\nABOUT Google Play Developer Term Violations\n===================================\nIf you receive a message from Google containing something like this:<br/> \n\n        REASON FOR WARNING: Violation of section 4.4 of the Developer Distribution Agreement.\n        \nplease use version 1.1.0+!\n\n\n\nCHANGE LOG\n==========\n\n1.1.23:\n\n* Added Yandex Launcher support. Fixed issue with incorrect default launcher resolve\n\n1.1.22:\n\n* Improve Oreo support (Thanks to [AlexStarc](https://github.com/AlexStarc))\n\n1.1.20:\n\n* Renamed default broadcast action; added Android Oreo support.\n\n1.1.19:\n\n* Fix multiple home package resolve issue.\n\n1.1.18:\n\n* Add Kill Launcher Support\n\n1.1.17:\n\n* Add ZTE Support\n\n1.1.16:\n\n* Improve Sony Launcher support.\n\n1.1.15:\n\n* Add EverythingLauncher Support.\n\n1.1.14:\n\n* Fix for specific class of Samsung devices: with android 5, but without support of DefaultBadger\n* Remove Xiaomi from Badger and add Notification Support for Xiaomi devices.\n\n1.1.13:\n\n* Fix XiaomiBadger (tested with RedMi Note4)\n\n1.1.12:\n\n* Handling Samsung badger for old devices and new devices.\n* Try to support newer Xiaomi (Not tested.)\n* Try to support Vivo (Not tested.)\n\n1.1.11:\n\n* Add OPPO Launcher Support\n\n1.1.10:\n\n* Add ZUK Launcher Support\n\n1.1.9:\n\n* Add SamsungBadger back for more Samsung devices support.\n\n1.1.8:\n\n* Remove SolidBadger, now solid launcher will use default badger.\n\n1.1.7:\n\n* Add Huawei launcher support.\n\n1.1.6:\n\n* Add support for new Sony Launchers.\n\n1.1.5:\n\n* `applyCount` will return if the Broadcast has been sent successfully.\n\n1.1.4:\n\n* Changed `ShortcutBadger.setBadge(context, badgeCount)` to `ShortcutBadger.applyCount(context, badgeCount);`\n\n1.1.3:\n\n* Deprecate SamsungBadger and LGBadger, those devices can use DefaultBadger.\n\n1.1.2:\n\n* Add support for `com.miui.mihome2`\n\n1.1.1:\n\n* Add DefaultBadger because some launchers use android.intent.action.BADGE_COUNT_UPDATE to update count.\n* Since the ShortcutBadgerException is helpless. So change api to set badge and never have to handle the exception again.\n\n1.1.0:\n\n* Remove Android Launcher support due to Google Play Developer Term Violation since 4.4.\n\n1.0.10:\n\n* Add Asus launcher support.\n\n1.0.9:\n\n* Add Xiaomi launcher support.\n\n\nLICENSE\n===================================\n<br/>\n        \n        Copyright 2014 Leo Lin\n        \n        Licensed under the Apache License, Version 2.0 (the \"License\");\n        you may not use this file except in compliance with the License.\n        You may obtain a copy of the License at\n        \n            http://www.apache.org/licenses/LICENSE-2.0\n        \n        Unless required by applicable law or agreed to in writing, software\n        distributed under the License is distributed on an \"AS IS\" BASIS,\n        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n        See the License for the specific language governing permissions and\n        limitations under the License.\n<br/>\n"
  },
  {
    "path": "SampleApp/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "SampleApp/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 27\n    buildToolsVersion '27.0.3'\n\n    defaultConfig {\n        applicationId \"me.leolin.shortcutbadger.example\"\n        minSdkVersion 16\n        targetSdkVersion 27\n        versionCode 1\n        versionName \"1.0\"\n    }\n\n    lintOptions {\n        abortOnError false\n    }\n\n}\n\n\n\ndependencies {\n//    implementation 'me.leolin:ShortcutBadger:1.0.+@aar'\n    implementation project(':ShortcutBadger')\n}\n"
  },
  {
    "path": "SampleApp/src/androidTest/java/me/leolin/shortcutbadger/example/ApplicationTest.java",
    "content": "package me.leolin.shortcutbadger.example;\n\nimport android.app.Application;\nimport android.test.ApplicationTestCase;\n\n/**\n * <a href=\"http://d.android.com/tools/testing/testing_android.html\">Testing Fundamentals</a>\n */\npublic class ApplicationTest extends ApplicationTestCase<Application> {\n    public ApplicationTest() {\n        super(Application.class);\n    }\n}"
  },
  {
    "path": "SampleApp/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"me.leolin.shortcutbadger.example\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@drawable/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:theme=\"@style/AppTheme\">\n        <activity\n            android:name=\".MainActivity\"\n            android:label=\"@string/app_name\">\n            <intent-filter>\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n\n                <action android:name=\"android.intent.action.MAIN\" />\n            </intent-filter>\n        </activity>\n\n        <service\n            android:name=\".BadgeIntentService\"\n            android:exported=\"false\"></service>\n    </application>\n\n</manifest>"
  },
  {
    "path": "SampleApp/src/main/java/me/leolin/shortcutbadger/example/BadgeIntentService.java",
    "content": "package me.leolin.shortcutbadger.example;\n\nimport android.annotation.TargetApi;\nimport android.app.IntentService;\nimport android.app.Notification;\nimport android.app.NotificationChannel;\nimport android.app.NotificationManager;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Build;\n\nimport me.leolin.shortcutbadger.ShortcutBadger;\n\npublic class BadgeIntentService extends IntentService {\n\n    private static final String NOTIFICATION_CHANNEL = \"me.leolin.shortcutbadger.example\";\n\n    private int notificationId = 0;\n\n    public BadgeIntentService() {\n        super(\"BadgeIntentService\");\n    }\n\n    private NotificationManager mNotificationManager;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);\n    }\n    \n    @Override\n    public void onStart(Intent intent, int startId) {\n        super.onStart(intent, startId);\n    }\n\n    @Override\n    protected void onHandleIntent(Intent intent) {\n        if (intent != null) {\n            int badgeCount = intent.getIntExtra(\"badgeCount\", 0);\n\n            mNotificationManager.cancel(notificationId);\n            notificationId++;\n\n            Notification.Builder builder = new Notification.Builder(getApplicationContext())\n                .setContentTitle(\"\")\n                .setContentText(\"\")\n                .setSmallIcon(R.drawable.ic_launcher);\n\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n                setupNotificationChannel();\n\n                builder.setChannelId(NOTIFICATION_CHANNEL);\n            }\n\n            Notification notification = builder.build();\n            ShortcutBadger.applyNotification(getApplicationContext(), notification, badgeCount);\n            mNotificationManager.notify(notificationId, notification);\n        }\n    }\n\n    @TargetApi(Build.VERSION_CODES.O)\n    private void setupNotificationChannel() {\n        NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL, \"ShortcutBadger Sample\",\n                NotificationManager.IMPORTANCE_DEFAULT);\n\n        mNotificationManager.createNotificationChannel(channel);\n    }\n}\n"
  },
  {
    "path": "SampleApp/src/main/java/me/leolin/shortcutbadger/example/MainActivity.java",
    "content": "package me.leolin.shortcutbadger.example;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.content.pm.PackageManager;\nimport android.content.pm.ResolveInfo;\nimport android.os.Bundle;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.EditText;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport me.leolin.shortcutbadger.ShortcutBadger;\n\n\npublic class MainActivity extends Activity {\n\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        final EditText numInput = findViewById(R.id.numInput);\n\n        Button button = findViewById(R.id.btnSetBadge);\n        button.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                int badgeCount = 0;\n                try {\n                    badgeCount = Integer.parseInt(numInput.getText().toString());\n                } catch (NumberFormatException e) {\n                    Toast.makeText(getApplicationContext(), \"Error input\", Toast.LENGTH_SHORT).show();\n                }\n\n                boolean success = ShortcutBadger.applyCount(MainActivity.this, badgeCount);\n\n                Toast.makeText(getApplicationContext(), \"Set count=\" + badgeCount + \", success=\" + success, Toast.LENGTH_SHORT).show();\n            }\n        });\n\n        Button launchNotification = findViewById(R.id.btnSetBadgeByNotification);\n        launchNotification.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                int badgeCount = 0;\n                try {\n                    badgeCount = Integer.parseInt(numInput.getText().toString());\n                } catch (NumberFormatException e) {\n                    Toast.makeText(getApplicationContext(), \"Error input\", Toast.LENGTH_SHORT).show();\n                }\n\n                finish();\n                startService(\n                    new Intent(MainActivity.this, BadgeIntentService.class).putExtra(\"badgeCount\", badgeCount)\n                );\n            }\n        });\n\n        Button removeBadgeBtn = findViewById(R.id.btnRemoveBadge);\n        removeBadgeBtn.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                boolean success = ShortcutBadger.removeCount(MainActivity.this);\n\n                Toast.makeText(getApplicationContext(), \"success=\" + success, Toast.LENGTH_SHORT).show();\n            }\n        });\n\n\n        //find the home launcher Package\n        Intent intent = new Intent(Intent.ACTION_MAIN);\n        intent.addCategory(Intent.CATEGORY_HOME);\n        String currentHomePackage = \"none\";\n        ResolveInfo resolveInfo = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);\n\n        // in case of duplicate apps (Xiaomi), calling resolveActivity from one will return null\n        if (resolveInfo != null) {\n            currentHomePackage = resolveInfo.activityInfo.packageName;\n        }\n\n        TextView textViewHomePackage = findViewById(R.id.textViewHomePackage);\n        textViewHomePackage.setText(\"launcher:\" + currentHomePackage);\n    }\n\n\n}\n"
  },
  {
    "path": "SampleApp/src/main/res/layout/activity_main.xml",
    "content": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:tools=\"http://schemas.android.com/tools\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\"\n              android:paddingBottom=\"@dimen/activity_vertical_margin\"\n              android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n              android:paddingRight=\"@dimen/activity_horizontal_margin\"\n              android:paddingTop=\"@dimen/activity_vertical_margin\"\n              tools:context=\".MainActivity\">\n\n    <TextView\n        android:id=\"@+id/textViewHomePackage\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"/>\n\n    <EditText\n        android:id=\"@+id/numInput\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:inputType=\"numberDecimal\"\n        />\n\n    <Button\n        android:id=\"@+id/btnSetBadge\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:text=\"Set badge\"/>\n\n    <Button\n        android:id=\"@+id/btnSetBadgeByNotification\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:text=\"Launch Notification\"/>\n\n    <Button\n        android:id=\"@+id/btnRemoveBadge\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:text=\"Remove badge\"/>\n\n\n</LinearLayout>\n"
  },
  {
    "path": "SampleApp/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "SampleApp/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\">ShortcutBadger</string>\n</resources>\n"
  },
  {
    "path": "SampleApp/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"android:Theme.Holo.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n    </style>\n\n</resources>\n"
  },
  {
    "path": "SampleApp/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "ShortcutBadger/.gitignore",
    "content": ".idea/*\n*.iml\nbuild\n.gradle\n"
  },
  {
    "path": "ShortcutBadger/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n\n    compileSdkVersion 27\n    buildToolsVersion '27.0.3'\n\n    defaultConfig {\n        minSdkVersion 14\n        targetSdkVersion 27\n        versionCode 1\n        versionName \"1.0\"\n        consumerProguardFiles 'proguard-rules.pro'\n    }\n\n    lintOptions {\n        abortOnError false\n    }\n\n}\n\n//apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle'\napply from: './mvn-push.gradle'\n"
  },
  {
    "path": "ShortcutBadger/mvn-push.gradle",
    "content": "/*\n * Copyright 2013 Chris Banes\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\napply plugin: 'maven'\napply plugin: 'signing'\n\ndef isReleaseBuild() {\n    return VERSION_NAME.contains(\"SNAPSHOT\") == false\n}\n\ndef getReleaseRepositoryUrl() {\n    return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL\n            : \"https://oss.sonatype.org/service/local/staging/deploy/maven2/\"\n}\n\ndef getSnapshotRepositoryUrl() {\n    return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL\n            : \"https://oss.sonatype.org/content/repositories/snapshots/\"\n}\n\ndef getRepositoryUsername() {\n    return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : \"\"\n}\n\ndef getRepositoryPassword() {\n    return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : \"\"\n}\n\nafterEvaluate { project ->\n    uploadArchives {\n        repositories {\n            mavenDeployer {\n                beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }\n\n                pom.groupId = GROUP\n                pom.artifactId = POM_ARTIFACT_ID\n                pom.version = VERSION_NAME\n\n                repository(url: getReleaseRepositoryUrl()) {\n                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())\n                }\n                snapshotRepository(url: getSnapshotRepositoryUrl()) {\n                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())\n                }\n\n                pom.project {\n                    name POM_NAME\n                    packaging POM_PACKAGING\n                    description POM_DESCRIPTION\n                    url POM_URL\n\n                    scm {\n                        url POM_SCM_URL\n                        connection POM_SCM_CONNECTION\n                        developerConnection POM_SCM_DEV_CONNECTION\n                    }\n\n                    licenses {\n                        license {\n                            name POM_LICENCE_NAME\n                            url POM_LICENCE_URL\n                            distribution POM_LICENCE_DIST\n                        }\n                    }\n\n                    developers {\n                        developer {\n                            id POM_DEVELOPER_ID\n                            name POM_DEVELOPER_NAME\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    signing {\n        required { isReleaseBuild() && gradle.taskGraph.hasTask(\"uploadArchives\") }\n        sign configurations.archives\n    }\n\n    task androidJavadocs(type: Javadoc) {\n        source = android.sourceSets.main.java.srcDirs\n        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))\n    }\n\n    task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {\n        classifier = 'javadoc'\n        from androidJavadocs.destinationDir\n    }\n\n    task androidSourcesJar(type: Jar) {\n        classifier = 'sources'\n        from android.sourceSets.main.java.sourceFiles\n    }\n\n    artifacts {\n        archives androidSourcesJar\n        archives androidJavadocsJar\n    }\n}"
  },
  {
    "path": "ShortcutBadger/proguard-rules.pro",
    "content": "#https://github.com/leolin310148/ShortcutBadger/issues/46\n-keep class me.leolin.shortcutbadger.impl.** { <init>(...); }\n"
  },
  {
    "path": "ShortcutBadger/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"me.leolin.shortcutbadger\"\n    >\n\n    <!--for android-->\n    <!--<uses-permission android:name=\"com.android.launcher.permission.READ_SETTINGS\"/>-->\n    <!--<uses-permission android:name=\"com.android.launcher.permission.WRITE_SETTINGS\"/>-->\n    <!--<uses-permission android:name=\"com.android.launcher.permission.INSTALL_SHORTCUT\" />-->\n    <!--<uses-permission android:name=\"com.android.launcher.permission.UNINSTALL_SHORTCUT\" />-->\n\n\n    <!--for Samsung-->\n    <uses-permission android:name=\"com.sec.android.provider.badge.permission.READ\"/>\n    <uses-permission android:name=\"com.sec.android.provider.badge.permission.WRITE\"/>\n\n    <!--for htc-->\n    <uses-permission android:name=\"com.htc.launcher.permission.READ_SETTINGS\"/>\n    <uses-permission android:name=\"com.htc.launcher.permission.UPDATE_SHORTCUT\"/>\n\n    <!--for sony-->\n    <uses-permission android:name=\"com.sonyericsson.home.permission.BROADCAST_BADGE\"/>\n    <uses-permission android:name=\"com.sonymobile.home.permission.PROVIDER_INSERT_BADGE\"/>\n\n    <!--for apex-->\n    <uses-permission android:name=\"com.anddoes.launcher.permission.UPDATE_COUNT\"/>\n\n    <!--for solid-->\n    <uses-permission android:name=\"com.majeur.launcher.permission.UPDATE_BADGE\"/>\n\n    <!--for huawei-->\n    <uses-permission android:name=\"com.huawei.android.launcher.permission.CHANGE_BADGE\"/>\n    <uses-permission android:name=\"com.huawei.android.launcher.permission.READ_SETTINGS\"/>\n    <uses-permission android:name=\"com.huawei.android.launcher.permission.WRITE_SETTINGS\"/>\n\n    <!--for ZUK-->\n    <uses-permission android:name=\"android.permission.READ_APP_BADGE\"/>\n\n    <!--for OPPO-->\n    <uses-permission android:name=\"com.oppo.launcher.permission.READ_SETTINGS\"/>\n    <uses-permission android:name=\"com.oppo.launcher.permission.WRITE_SETTINGS\"/>\n\n    <!--for EvMe-->\n    <uses-permission android:name=\"me.everything.badger.permission.BADGE_COUNT_READ\"/>\n    <uses-permission android:name=\"me.everything.badger.permission.BADGE_COUNT_WRITE\"/>\n</manifest>\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/Badger.java",
    "content": "package me.leolin.shortcutbadger;\n\nimport android.content.ComponentName;\nimport android.content.Context;\n\nimport java.util.List;\n\npublic interface Badger {\n\n    /**\n     * Called when user attempts to update notification count\n     * @param context Caller context\n     * @param componentName Component containing package and class name of calling application's\n     *                      launcher activity\n     * @param badgeCount Desired notification count\n     * @throws ShortcutBadgeException\n     */\n    void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException;\n\n    /**\n     * Called to let {@link ShortcutBadger} knows which launchers are supported by this badger. It should return a\n     * @return List containing supported launchers package names\n     */\n    List<String> getSupportLaunchers();\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/ShortcutBadgeException.java",
    "content": "package me.leolin.shortcutbadger;\n\npublic class ShortcutBadgeException extends Exception {\n    public ShortcutBadgeException(String message) {\n        super(message);\n    }\n\n    public ShortcutBadgeException(String message, Exception e) {\n        super(message, e);\n    }\n\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/ShortcutBadger.java",
    "content": "package me.leolin.shortcutbadger;\n\nimport android.app.Notification;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.PackageManager;\nimport android.content.pm.ResolveInfo;\nimport android.os.Build;\nimport android.util.Log;\n\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.util.Collections;\nimport java.util.LinkedList;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.impl.AdwHomeBadger;\nimport me.leolin.shortcutbadger.impl.ApexHomeBadger;\nimport me.leolin.shortcutbadger.impl.AsusHomeBadger;\nimport me.leolin.shortcutbadger.impl.DefaultBadger;\nimport me.leolin.shortcutbadger.impl.EverythingMeHomeBadger;\nimport me.leolin.shortcutbadger.impl.HuaweiHomeBadger;\nimport me.leolin.shortcutbadger.impl.NewHtcHomeBadger;\nimport me.leolin.shortcutbadger.impl.NovaHomeBadger;\nimport me.leolin.shortcutbadger.impl.OPPOHomeBader;\nimport me.leolin.shortcutbadger.impl.SamsungHomeBadger;\nimport me.leolin.shortcutbadger.impl.SonyHomeBadger;\nimport me.leolin.shortcutbadger.impl.VivoHomeBadger;\nimport me.leolin.shortcutbadger.impl.YandexLauncherBadger;\nimport me.leolin.shortcutbadger.impl.ZTEHomeBadger;\nimport me.leolin.shortcutbadger.impl.ZukHomeBadger;\n\n\n/**\n * @author Leo Lin\n */\npublic final class ShortcutBadger {\n\n    private static final String LOG_TAG = \"ShortcutBadger\";\n    private static final int SUPPORTED_CHECK_ATTEMPTS = 3;\n\n    private static final List<Class<? extends Badger>> BADGERS = new LinkedList<Class<? extends Badger>>();\n\n    private volatile static Boolean sIsBadgeCounterSupported;\n    private final static Object sCounterSupportedLock = new Object();\n\n    static {\n        BADGERS.add(AdwHomeBadger.class);\n        BADGERS.add(ApexHomeBadger.class);\n        BADGERS.add(DefaultBadger.class);\n        BADGERS.add(NewHtcHomeBadger.class);\n        BADGERS.add(NovaHomeBadger.class);\n        BADGERS.add(SonyHomeBadger.class);\n        BADGERS.add(AsusHomeBadger.class);\n        BADGERS.add(HuaweiHomeBadger.class);\n        BADGERS.add(OPPOHomeBader.class);\n        BADGERS.add(SamsungHomeBadger.class);\n        BADGERS.add(ZukHomeBadger.class);\n        BADGERS.add(VivoHomeBadger.class);\n        BADGERS.add(ZTEHomeBadger.class);\n        BADGERS.add(EverythingMeHomeBadger.class);\n        BADGERS.add(YandexLauncherBadger.class);\n    }\n\n    private static Badger sShortcutBadger;\n    private static ComponentName sComponentName;\n\n    /**\n     * Tries to update the notification count\n     *\n     * @param context    Caller context\n     * @param badgeCount Desired badge count\n     * @return true in case of success, false otherwise\n     */\n    public static boolean applyCount(Context context, int badgeCount) {\n        try {\n            applyCountOrThrow(context, badgeCount);\n            return true;\n        } catch (ShortcutBadgeException e) {\n            if (Log.isLoggable(LOG_TAG, Log.DEBUG)) {\n                Log.d(LOG_TAG, \"Unable to execute badge\", e);\n            }\n            return false;\n        }\n    }\n\n    /**\n     * Tries to update the notification count, throw a {@link ShortcutBadgeException} if it fails\n     *\n     * @param context    Caller context\n     * @param badgeCount Desired badge count\n     */\n    public static void applyCountOrThrow(Context context, int badgeCount) throws ShortcutBadgeException {\n        if (sShortcutBadger == null) {\n            boolean launcherReady = initBadger(context);\n\n            if (!launcherReady)\n                throw new ShortcutBadgeException(\"No default launcher available\");\n        }\n\n        try {\n            sShortcutBadger.executeBadge(context, sComponentName, badgeCount);\n        } catch (Exception e) {\n            throw new ShortcutBadgeException(\"Unable to execute badge\", e);\n        }\n    }\n\n    /**\n     * Tries to remove the notification count\n     *\n     * @param context Caller context\n     * @return true in case of success, false otherwise\n     */\n    public static boolean removeCount(Context context) {\n        return applyCount(context, 0);\n    }\n\n    /**\n     * Tries to remove the notification count, throw a {@link ShortcutBadgeException} if it fails\n     *\n     * @param context Caller context\n     */\n    public static void removeCountOrThrow(Context context) throws ShortcutBadgeException {\n        applyCountOrThrow(context, 0);\n    }\n\n    /**\n     * Whether this platform launcher supports shortcut badges. Doing this check causes the side\n     * effect of resetting the counter if it's supported, so this method should be followed by\n     * a call that actually sets the counter to the desired value, if the counter is supported.\n     */\n    public static boolean isBadgeCounterSupported(Context context) {\n        // Checking outside synchronized block to avoid synchronization in the common case (flag\n        // already set), and improve perf.\n        if (sIsBadgeCounterSupported == null) {\n            synchronized (sCounterSupportedLock) {\n                // Checking again inside synch block to avoid setting the flag twice.\n                if (sIsBadgeCounterSupported == null) {\n                    String lastErrorMessage = null;\n                    for (int i = 0; i < SUPPORTED_CHECK_ATTEMPTS; i++) {\n                        try {\n                            Log.i(LOG_TAG, \"Checking if platform supports badge counters, attempt \"\n                                    + String.format(\"%d/%d.\", i + 1, SUPPORTED_CHECK_ATTEMPTS));\n                            if (initBadger(context)) {\n                                sShortcutBadger.executeBadge(context, sComponentName, 0);\n                                sIsBadgeCounterSupported = true;\n                                Log.i(LOG_TAG, \"Badge counter is supported in this platform.\");\n                                break;\n                            } else {\n                                lastErrorMessage = \"Failed to initialize the badge counter.\";\n                            }\n                        } catch (Exception e) {\n                            // Keep retrying as long as we can. No need to dump the stack trace here\n                            // because this error will be the norm, not exception, for unsupported\n                            // platforms. So we just save the last error message to display later.\n                            lastErrorMessage = e.getMessage();\n                        }\n                    }\n\n                    if (sIsBadgeCounterSupported == null) {\n                        Log.w(LOG_TAG, \"Badge counter seems not supported for this platform: \"\n                                + lastErrorMessage);\n                        sIsBadgeCounterSupported = false;\n                    }\n                }\n            }\n        }\n        return sIsBadgeCounterSupported;\n    }\n\n    /**\n     * @param context      Caller context\n     * @param notification\n     * @param badgeCount\n     */\n    public static void applyNotification(Context context, Notification notification, int badgeCount) {\n        if (Build.MANUFACTURER.equalsIgnoreCase(\"Xiaomi\")) {\n            try {\n                Field field = notification.getClass().getDeclaredField(\"extraNotification\");\n                Object extraNotification = field.get(notification);\n                Method method = extraNotification.getClass().getDeclaredMethod(\"setMessageCount\", int.class);\n                method.invoke(extraNotification, badgeCount);\n            } catch (Exception e) {\n                if (Log.isLoggable(LOG_TAG, Log.DEBUG)) {\n                    Log.d(LOG_TAG, \"Unable to execute badge\", e);\n                }\n            }\n        }\n    }\n\n    // Initialize Badger if a launcher is availalble (eg. set as default on the device)\n    // Returns true if a launcher is available, in this case, the Badger will be set and sShortcutBadger will be non null.\n    private static boolean initBadger(Context context) {\n        Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());\n        if (launchIntent == null) {\n            Log.e(LOG_TAG, \"Unable to find launch intent for package \" + context.getPackageName());\n            return false;\n        }\n\n        sComponentName = launchIntent.getComponent();\n\n        Intent intent = new Intent(Intent.ACTION_MAIN);\n        intent.addCategory(Intent.CATEGORY_HOME);\n        List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);\n\n        //Turns out framework does not guarantee to put DEFAULT Activity on top of the list.\n        ResolveInfo resolveInfoDefault = context.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);\n        validateInfoList(resolveInfoDefault, resolveInfos);\n\n        for (ResolveInfo resolveInfo : resolveInfos) {\n            String currentHomePackage = resolveInfo.activityInfo.packageName;\n\n            for (Class<? extends Badger> badger : BADGERS) {\n                Badger shortcutBadger = null;\n                try {\n                    shortcutBadger = badger.newInstance();\n                } catch (Exception ignored) {\n                }\n                if (shortcutBadger != null && shortcutBadger.getSupportLaunchers().contains(currentHomePackage)) {\n                    if (isLauncherVersionSupported(context, currentHomePackage)) {\n                        sShortcutBadger = shortcutBadger;\n                    }\n                    break;\n                }\n            }\n            if (sShortcutBadger != null) {\n                break;\n            }\n        }\n\n        if (sShortcutBadger == null) {\n            if (Build.MANUFACTURER.equalsIgnoreCase(\"ZUK\"))\n                sShortcutBadger = new ZukHomeBadger();\n            else if (Build.MANUFACTURER.equalsIgnoreCase(\"OPPO\"))\n                sShortcutBadger = new OPPOHomeBader();\n            else if (Build.MANUFACTURER.equalsIgnoreCase(\"VIVO\"))\n                sShortcutBadger = new VivoHomeBadger();\n            else if (Build.MANUFACTURER.equalsIgnoreCase(\"ZTE\"))\n                sShortcutBadger = new ZTEHomeBadger();\n            else\n                sShortcutBadger = new DefaultBadger();\n        }\n\n        return true;\n    }\n\n    /**\n     * Making sure that launcher version that yet doesn't support badges mechanism\n     * is <b>NOT</b> used by <b><i>sShortcutBadger</i></b>.\n     */\n    private static boolean isLauncherVersionSupported(Context context, String currentHomePackage) {\n        if (!YandexLauncherBadger.PACKAGE_NAME.equals(currentHomePackage)) {\n            return true;\n        }\n        return YandexLauncherBadger.isVersionSupported(context);\n    }\n\n    /**\n     * Making sure the default Home activity is on top of the returned list\n     * @param defaultActivity       default Home activity\n     * @param resolveInfos          list of all Home activities in the system\n     */\n    private static void validateInfoList(ResolveInfo defaultActivity, List<ResolveInfo> resolveInfos) {\n        int indexToSwapWith = 0;\n        for (int i = 0, resolveInfosSize = resolveInfos.size(); i < resolveInfosSize; i++) {\n            ResolveInfo resolveInfo = resolveInfos.get(i);\n            String currentActivityName = resolveInfo.activityInfo.packageName;\n            if (currentActivityName.equals(defaultActivity.activityInfo.packageName)) {\n                indexToSwapWith = i;\n            }\n        }\n        Collections.swap(resolveInfos, 0, indexToSwapWith);\n    }\n\n    // Avoid anybody to instantiate this class\n    private ShortcutBadger() {\n\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/AdwHomeBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\nimport me.leolin.shortcutbadger.util.BroadcastHelper;\n\n/**\n * @author Gernot Pansy\n */\npublic class AdwHomeBadger implements Badger {\n\n    public static final String INTENT_UPDATE_COUNTER = \"org.adw.launcher.counter.SEND\";\n    public static final String PACKAGENAME = \"PNAME\";\n    public static final String CLASSNAME = \"CNAME\";\n    public static final String COUNT = \"COUNT\";\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException {\n        Intent intent = new Intent(INTENT_UPDATE_COUNTER);\n        intent.putExtra(PACKAGENAME, componentName.getPackageName());\n        intent.putExtra(CLASSNAME, componentName.getClassName());\n        intent.putExtra(COUNT, badgeCount);\n\n        BroadcastHelper.sendIntentExplicitly(context, intent);\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Arrays.asList(\n                \"org.adw.launcher\",\n                \"org.adwfreak.launcher\"\n        );\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/ApexHomeBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\nimport me.leolin.shortcutbadger.util.BroadcastHelper;\n\n/**\n * @author Gernot Pansy\n */\npublic class ApexHomeBadger implements Badger {\n\n    private static final String INTENT_UPDATE_COUNTER = \"com.anddoes.launcher.COUNTER_CHANGED\";\n    private static final String PACKAGENAME = \"package\";\n    private static final String COUNT = \"count\";\n    private static final String CLASS = \"class\";\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException {\n        Intent intent = new Intent(INTENT_UPDATE_COUNTER);\n        intent.putExtra(PACKAGENAME, componentName.getPackageName());\n        intent.putExtra(COUNT, badgeCount);\n        intent.putExtra(CLASS, componentName.getClassName());\n\n        BroadcastHelper.sendIntentExplicitly(context, intent);\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Arrays.asList(\"com.anddoes.launcher\");\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/AsusHomeBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.annotation.TargetApi;\nimport android.content.AsyncQueryHandler;\nimport android.content.ComponentName;\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.ProviderInfo;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Looper;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\nimport me.leolin.shortcutbadger.util.BroadcastHelper;\n\n/**\n * @author leolin\n */\npublic class AsusHomeBadger implements Badger {\n    private static final String INTENT_ACTION = IntentConstants.DEFAULT_INTENT_ACTION;\n    private static final String INTENT_EXTRA_BADGE_COUNT = \"badge_count\";\n    private static final String INTENT_EXTRA_PACKAGENAME = \"badge_count_package_name\";\n    private static final String INTENT_EXTRA_ACTIVITY_NAME = \"badge_count_class_name\";\n\n    private static final String PROVIDER_CONTENT_URI = \"content://com.android.badge/\"; // FIXME\n    private static final String PROVIDER_COLUMNS_BADGE_COUNT = \"badge_count\"; // FIXME\n    private static final String PROVIDER_COLUMNS_PACKAGE_NAME = \"package_name\"; // FIXME\n    private static final String PROVIDER_COLUMNS_ACTIVITY_NAME = \"activity_name\"; // FIXME\n    private static final String ASUS_LAUNCHER_PROVIDER_NAME = \"com.android.badge\";\n    private final Uri BADGE_CONTENT_URI = Uri.parse(PROVIDER_CONTENT_URI);\n\n    private AsyncQueryHandler mQueryHandler;\n\n    // It seems that Asus handle Sony like badges better than old implementation...\n    private static final String SONY_INTENT_ACTION = \"com.sonyericsson.home.action.UPDATE_BADGE\";\n    private static final String SONY_INTENT_EXTRA_PACKAGE_NAME = \"com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME\";\n    private static final String SONY_INTENT_EXTRA_ACTIVITY_NAME = \"com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME\";\n    private static final String SONY_INTENT_EXTRA_MESSAGE = \"com.sonyericsson.home.intent.extra.badge.MESSAGE\";\n    private static final String SONY_INTENT_EXTRA_SHOW_MESSAGE = \"com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE\";\n\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {\n            // FIXME: It seems that ZenUI (com.asus.launcher) declares a content provider for badges but without documentation it is hard to guess how to add badges with it. Current draft implementation gives \"No yet implemented\" exception.\n//            if (asusBadgeContentProviderExists(context)) {\n//                executeBadgeByContentProvider(context, componentName, badgeCount);\n//            } else {\n                executeBadgeByBroadcast(context, componentName, badgeCount);\n//            }\n        } else {\n            Intent intent = new Intent(INTENT_ACTION);\n            intent.putExtra(INTENT_EXTRA_BADGE_COUNT, badgeCount);\n            intent.putExtra(INTENT_EXTRA_PACKAGENAME, componentName.getPackageName());\n            intent.putExtra(INTENT_EXTRA_ACTIVITY_NAME, componentName.getClassName());\n            intent.putExtra(\"badge_vip_count\", 0);\n\n            BroadcastHelper.sendDefaultIntentExplicitly(context, intent);\n        }\n    }\n\n    private void executeBadgeByBroadcast(Context context, ComponentName componentName, int badgeCount) {\n        Intent intent = new Intent(SONY_INTENT_ACTION);\n        intent.putExtra(SONY_INTENT_EXTRA_PACKAGE_NAME, componentName.getPackageName());\n        intent.putExtra(SONY_INTENT_EXTRA_ACTIVITY_NAME, componentName.getClassName());\n        intent.putExtra(SONY_INTENT_EXTRA_MESSAGE, String.valueOf(badgeCount));\n        intent.putExtra(SONY_INTENT_EXTRA_SHOW_MESSAGE, badgeCount > 0);\n        // FIXME: BroadcastHelper fail to resolve broadcast and then don't broadcast intent while it works.\n//         BroadcastHelper.sendDefaultIntentExplicitly(context, intent);\n        context.sendBroadcast(intent);\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Arrays.asList(\"com.asus.launcher\");\n    }\n\n    /**\n     * Send request to Asus badge content provider to set badge in Sony home launcher.\n     *\n     * @param context       the context to use\n     * @param componentName the componentName to use\n     * @param badgeCount    the badge count\n     */\n    @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n    private void executeBadgeByContentProvider(Context context, ComponentName componentName,\n                                               int badgeCount) {\n        if (badgeCount < 0) {\n            return;\n        }\n\n        final ContentValues contentValues = createContentValues(badgeCount, componentName);\n        if (Looper.myLooper() == Looper.getMainLooper()) {\n            // We're in the main thread. Let's ensure the badge update happens in a background\n            // thread by using an AsyncQueryHandler and an async update.\n            if (mQueryHandler == null) {\n                mQueryHandler = new AsyncQueryHandler(\n                        context.getApplicationContext().getContentResolver()) {\n                };\n            }\n            insertBadgeAsync(contentValues);\n        } else {\n            // Already in a background thread. Let's update the badge synchronously. Otherwise,\n            // if we use the AsyncQueryHandler, this thread may already be dead by the time the\n            // async execution finishes, which will lead to an IllegalStateException.\n            insertBadgeSync(context, contentValues);\n        }\n    }\n\n    /**\n     * Asynchronously inserts the badge counter.\n     *\n     * @param contentValues Content values containing the badge count, package and activity names\n     */\n    private void insertBadgeAsync(final ContentValues contentValues) {\n        mQueryHandler.startInsert(0, null, BADGE_CONTENT_URI, contentValues);\n    }\n\n    /**\n     * Synchronously inserts the badge counter.\n     *\n     * @param context       Caller context\n     * @param contentValues Content values containing the badge count, package and activity names\n     */\n    private void insertBadgeSync(final Context context, final ContentValues contentValues) {\n        context.getApplicationContext().getContentResolver()\n                .insert(BADGE_CONTENT_URI, contentValues);\n    }\n\n    /**\n     * Creates a ContentValues object to be used in the badge counter update. The package and\n     * activity names must correspond to an activity that holds an intent filter with action\n     * \"android.intent.action.MAIN\" and category android.intent.category.LAUNCHER\" in the manifest.\n     * Also, it is not allowed to publish badges on behalf of another client, so the package and\n     * activity names must belong to the process from which the insert is made.\n     * To be able to insert badges, the app must have the PROVIDER_INSERT_BADGE\n     * permission in the manifest file. In case these conditions are not\n     * fulfilled, or any content values are missing, there will be an unhandled\n     * exception on the background thread.\n     *\n     * @param badgeCount    the badge count\n     * @param componentName the component name from which package and class name will be extracted\n     */\n    private ContentValues createContentValues(final int badgeCount,\n                                              final ComponentName componentName) {\n        final ContentValues contentValues = new ContentValues();\n        contentValues.put(PROVIDER_COLUMNS_BADGE_COUNT, badgeCount);\n        contentValues.put(PROVIDER_COLUMNS_PACKAGE_NAME, componentName.getPackageName());\n        contentValues.put(PROVIDER_COLUMNS_ACTIVITY_NAME, componentName.getClassName());\n        return contentValues;\n    }\n\n    /**\n     * Check if the latest Asus badge content provider exists.\n     *\n     * @param context the context to use\n     * @return true if Asus badge content provider exists, otherwise false.\n     */\n    private static boolean asusBadgeContentProviderExists(Context context) {\n        boolean exists = false;\n        ProviderInfo info = context.getPackageManager().resolveContentProvider(ASUS_LAUNCHER_PROVIDER_NAME, 0);\n        if (info != null) {\n            exists = true;\n        }\n        return exists;\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/DefaultBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Build;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\nimport me.leolin.shortcutbadger.util.BroadcastHelper;\n\n/**\n * @author leolin\n */\npublic class DefaultBadger implements Badger {\n    private static final String INTENT_ACTION = IntentConstants.DEFAULT_INTENT_ACTION;\n    private static final String INTENT_EXTRA_BADGE_COUNT = \"badge_count\";\n    private static final String INTENT_EXTRA_PACKAGENAME = \"badge_count_package_name\";\n    private static final String INTENT_EXTRA_ACTIVITY_NAME = \"badge_count_class_name\";\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException {\n        Intent intent = new Intent(INTENT_ACTION);\n        intent.putExtra(INTENT_EXTRA_BADGE_COUNT, badgeCount);\n        intent.putExtra(INTENT_EXTRA_PACKAGENAME, componentName.getPackageName());\n        intent.putExtra(INTENT_EXTRA_ACTIVITY_NAME, componentName.getClassName());\n\n        BroadcastHelper.sendDefaultIntentExplicitly(context, intent);\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Arrays.asList(\n                \"fr.neamar.kiss\",\n                \"com.quaap.launchtime\",\n                \"com.quaap.launchtime_official\"\n        );\n    }\n\n    boolean isSupported(Context context) {\n        Intent intent = new Intent(INTENT_ACTION);\n        return BroadcastHelper.resolveBroadcast(context, intent).size() > 0\n                || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O\n                    && BroadcastHelper.resolveBroadcast(context, new Intent(IntentConstants.DEFAULT_OREO_INTENT_ACTION)).size() > 0);\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/EverythingMeHomeBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.content.ComponentName;\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.net.Uri;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\n\n\n/**\n * @author Radko Roman\n * @since  13.04.17.\n */\npublic class EverythingMeHomeBadger implements Badger {\n\n    private static final String CONTENT_URI = \"content://me.everything.badger/apps\";\n    private static final String COLUMN_PACKAGE_NAME = \"package_name\";\n    private static final String COLUMN_ACTIVITY_NAME = \"activity_name\";\n    private static final String COLUMN_COUNT = \"count\";\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException  {\n        ContentValues contentValues = new ContentValues();\n        contentValues.put(COLUMN_PACKAGE_NAME, componentName.getPackageName());\n        contentValues.put(COLUMN_ACTIVITY_NAME, componentName.getClassName());\n        contentValues.put(COLUMN_COUNT, badgeCount);\n        context.getContentResolver().insert(Uri.parse(CONTENT_URI), contentValues);\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Arrays.asList(\"me.everything.launcher\");\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/HuaweiHomeBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.net.Uri;\nimport android.os.Bundle;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\n\n/**\n * @author Jason Ling\n */\npublic class HuaweiHomeBadger implements Badger {\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException {\n        Bundle localBundle = new Bundle();\n        localBundle.putString(\"package\", context.getPackageName());\n        localBundle.putString(\"class\", componentName.getClassName());\n        localBundle.putInt(\"badgenumber\", badgeCount);\n        context.getContentResolver().call(Uri.parse(\"content://com.huawei.android.launcher.settings/badge/\"), \"change_badge\", null, localBundle);\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Arrays.asList(\n                \"com.huawei.android.launcher\"\n        );\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/IntentConstants.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\npublic interface IntentConstants {\n    String DEFAULT_INTENT_ACTION = \"android.intent.action.BADGE_COUNT_UPDATE\";\n    String DEFAULT_OREO_INTENT_ACTION = \"me.leolin.shortcutbadger.BADGE_COUNT_UPDATE\";\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/LGHomeBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\nimport me.leolin.shortcutbadger.util.BroadcastHelper;\n\n/**\n * @author Leo Lin\n * Deprecated, LG devices will use DefaultBadger\n */\n@Deprecated\npublic class LGHomeBadger implements Badger {\n\n    private static final String INTENT_ACTION = IntentConstants.DEFAULT_INTENT_ACTION;\n    private static final String INTENT_EXTRA_BADGE_COUNT = \"badge_count\";\n    private static final String INTENT_EXTRA_PACKAGENAME = \"badge_count_package_name\";\n    private static final String INTENT_EXTRA_ACTIVITY_NAME = \"badge_count_class_name\";\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException {\n        Intent intent = new Intent(INTENT_ACTION);\n        intent.putExtra(INTENT_EXTRA_BADGE_COUNT, badgeCount);\n        intent.putExtra(INTENT_EXTRA_PACKAGENAME, componentName.getPackageName());\n        intent.putExtra(INTENT_EXTRA_ACTIVITY_NAME, componentName.getClassName());\n\n        BroadcastHelper.sendDefaultIntentExplicitly(context, intent);\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Arrays.asList(\n                \"com.lge.launcher\",\n                \"com.lge.launcher2\"\n        );\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/NewHtcHomeBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\n\nimport java.util.Collections;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\nimport me.leolin.shortcutbadger.util.BroadcastHelper;\n\n/**\n * @author Leo Lin\n */\npublic class NewHtcHomeBadger implements Badger {\n\n    public static final String INTENT_UPDATE_SHORTCUT = \"com.htc.launcher.action.UPDATE_SHORTCUT\";\n    public static final String INTENT_SET_NOTIFICATION = \"com.htc.launcher.action.SET_NOTIFICATION\";\n    public static final String PACKAGENAME = \"packagename\";\n    public static final String COUNT = \"count\";\n    public static final String EXTRA_COMPONENT = \"com.htc.launcher.extra.COMPONENT\";\n    public static final String EXTRA_COUNT = \"com.htc.launcher.extra.COUNT\";\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException {\n\n        Intent intent1 = new Intent(INTENT_SET_NOTIFICATION);\n        boolean intent1Success;\n\n        intent1.putExtra(EXTRA_COMPONENT, componentName.flattenToShortString());\n        intent1.putExtra(EXTRA_COUNT, badgeCount);\n\n        Intent intent = new Intent(INTENT_UPDATE_SHORTCUT);\n        boolean intentSuccess;\n\n        intent.putExtra(PACKAGENAME, componentName.getPackageName());\n        intent.putExtra(COUNT, badgeCount);\n\n        try {\n            BroadcastHelper.sendIntentExplicitly(context, intent1);\n            intent1Success = true;\n        } catch (ShortcutBadgeException e) {\n            intent1Success = false;\n        }\n\n        try {\n            BroadcastHelper.sendIntentExplicitly(context, intent);\n            intentSuccess = true;\n        } catch (ShortcutBadgeException e) {\n            intentSuccess = false;\n        }\n\n        if (!intent1Success && !intentSuccess) {\n            throw new ShortcutBadgeException(\"unable to resolve intent: \" + intent.toString());\n        }\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Collections.singletonList(\"com.htc.launcher\");\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/NovaHomeBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.content.ComponentName;\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.net.Uri;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\n\n/**\n * Shortcut Badger support for Nova Launcher.\n * TeslaUnread must be installed.\n * User: Gernot Pansy\n * Date: 2014/11/03\n * Time: 7:15\n */\npublic class NovaHomeBadger implements Badger {\n\n    private static final String CONTENT_URI = \"content://com.teslacoilsw.notifier/unread_count\";\n    private static final String COUNT = \"count\";\n    private static final String TAG = \"tag\";\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException {\n        ContentValues contentValues = new ContentValues();\n        contentValues.put(TAG, componentName.getPackageName() + \"/\" + componentName.getClassName());\n        contentValues.put(COUNT, badgeCount);\n        context.getContentResolver().insert(Uri.parse(CONTENT_URI), contentValues);\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Arrays.asList(\"com.teslacoilsw.launcher\");\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/OPPOHomeBader.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.annotation.TargetApi;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.ProviderInfo;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\nimport java.util.Collections;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\nimport me.leolin.shortcutbadger.util.BroadcastHelper;\n\n/**\n * Created by NingSo on 2016/10/14.上午10:09\n *\n * @author: NingSo\n * Email: ningso.ping@gmail.com\n */\n\npublic class OPPOHomeBader implements Badger {\n\n    private static final String PROVIDER_CONTENT_URI = \"content://com.android.badge/badge\";\n    private static final String INTENT_ACTION = \"com.oppo.unsettledevent\";\n    private static final String INTENT_EXTRA_PACKAGENAME = \"pakeageName\";\n    private static final String INTENT_EXTRA_BADGE_COUNT = \"number\";\n    private static final String INTENT_EXTRA_BADGE_UPGRADENUMBER = \"upgradeNumber\";\n    private static final String INTENT_EXTRA_BADGEUPGRADE_COUNT = \"app_badge_count\";\n    private int mCurrentTotalCount = -1;\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException {\n        if (mCurrentTotalCount == badgeCount) {\n            return;\n        }\n        mCurrentTotalCount = badgeCount;\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){\n            executeBadgeByContentProvider(context, badgeCount);\n        } else {\n            executeBadgeByBroadcast(context, componentName, badgeCount);\n        }\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Collections.singletonList(\"com.oppo.launcher\");\n    }\n\n    private void executeBadgeByBroadcast(Context context, ComponentName componentName,\n                                         int badgeCount) throws ShortcutBadgeException {\n        if (badgeCount == 0) {\n            badgeCount = -1;\n        }\n        Intent intent = new Intent(INTENT_ACTION);\n        intent.putExtra(INTENT_EXTRA_PACKAGENAME, componentName.getPackageName());\n        intent.putExtra(INTENT_EXTRA_BADGE_COUNT, badgeCount);\n        intent.putExtra(INTENT_EXTRA_BADGE_UPGRADENUMBER, badgeCount);\n\n        BroadcastHelper.sendIntentExplicitly(context, intent);\n    }\n\n    /**\n     * Send request to OPPO badge content provider to set badge in OPPO home launcher.\n     *\n     * @param context       the context to use\n     * @param badgeCount    the badge count\n     */\n    @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n    private void executeBadgeByContentProvider(Context context, int badgeCount) throws ShortcutBadgeException {\n        try {\n            Bundle extras = new Bundle();\n            extras.putInt(INTENT_EXTRA_BADGEUPGRADE_COUNT, badgeCount);\n            context.getContentResolver().call(Uri.parse(PROVIDER_CONTENT_URI), \"setAppBadgeCount\", null, extras);\n        } catch (Throwable ignored) {\n            throw new ShortcutBadgeException(\"Unable to execute Badge By Content Provider\");\n        }\n    }\n}"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/SamsungHomeBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.content.ComponentName;\nimport android.content.ContentResolver;\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.os.Build;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\nimport me.leolin.shortcutbadger.util.CloseHelper;\n\n/**\n * @author Leo Lin\n */\npublic class SamsungHomeBadger implements Badger {\n    private static final String CONTENT_URI = \"content://com.sec.badge/apps?notify=true\";\n    private static final String[] CONTENT_PROJECTION = new String[]{\"_id\", \"class\"};\n\n    private DefaultBadger defaultBadger;\n\n    public SamsungHomeBadger() {\n        if (Build.VERSION.SDK_INT >= 21) {\n            defaultBadger = new DefaultBadger();\n        }\n    }\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException {\n        if (defaultBadger != null && defaultBadger.isSupported(context)) {\n            defaultBadger.executeBadge(context, componentName, badgeCount);\n        } else {\n            Uri mUri = Uri.parse(CONTENT_URI);\n            ContentResolver contentResolver = context.getContentResolver();\n            Cursor cursor = null;\n            try {\n                cursor = contentResolver.query(mUri, CONTENT_PROJECTION, \"package=?\", new String[]{componentName.getPackageName()}, null);\n                if (cursor != null) {\n                    String entryActivityName = componentName.getClassName();\n                    boolean entryActivityExist = false;\n                    while (cursor.moveToNext()) {\n                        int id = cursor.getInt(0);\n                        ContentValues contentValues = getContentValues(componentName, badgeCount, false);\n                        contentResolver.update(mUri, contentValues, \"_id=?\", new String[]{String.valueOf(id)});\n                        if (entryActivityName.equals(cursor.getString(cursor.getColumnIndex(\"class\")))) {\n                            entryActivityExist = true;\n                        }\n                    }\n\n                    if (!entryActivityExist) {\n                        ContentValues contentValues = getContentValues(componentName, badgeCount, true);\n                        contentResolver.insert(mUri, contentValues);\n                    }\n                }\n            } finally {\n                CloseHelper.close(cursor);\n            }\n        }\n    }\n\n    private ContentValues getContentValues(ComponentName componentName, int badgeCount, boolean isInsert) {\n        ContentValues contentValues = new ContentValues();\n        if (isInsert) {\n            contentValues.put(\"package\", componentName.getPackageName());\n            contentValues.put(\"class\", componentName.getClassName());\n        }\n\n        contentValues.put(\"badgecount\", badgeCount);\n\n        return contentValues;\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Arrays.asList(\n                \"com.sec.android.app.launcher\",\n                \"com.sec.android.app.twlauncher\"\n        );\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/SonyHomeBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.content.AsyncQueryHandler;\nimport android.content.ComponentName;\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.ProviderInfo;\nimport android.net.Uri;\nimport android.os.Looper;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\n\n\n/**\n * @author Leo Lin\n */\npublic class SonyHomeBadger implements Badger {\n\n    private static final String INTENT_ACTION = \"com.sonyericsson.home.action.UPDATE_BADGE\";\n    private static final String INTENT_EXTRA_PACKAGE_NAME = \"com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME\";\n    private static final String INTENT_EXTRA_ACTIVITY_NAME = \"com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME\";\n    private static final String INTENT_EXTRA_MESSAGE = \"com.sonyericsson.home.intent.extra.badge.MESSAGE\";\n    private static final String INTENT_EXTRA_SHOW_MESSAGE = \"com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE\";\n\n    private static final String PROVIDER_CONTENT_URI = \"content://com.sonymobile.home.resourceprovider/badge\";\n    private static final String PROVIDER_COLUMNS_BADGE_COUNT = \"badge_count\";\n    private static final String PROVIDER_COLUMNS_PACKAGE_NAME = \"package_name\";\n    private static final String PROVIDER_COLUMNS_ACTIVITY_NAME = \"activity_name\";\n    private static final String SONY_HOME_PROVIDER_NAME = \"com.sonymobile.home.resourceprovider\";\n    private final Uri BADGE_CONTENT_URI = Uri.parse(PROVIDER_CONTENT_URI);\n\n    private AsyncQueryHandler mQueryHandler;\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName,\n                             int badgeCount) throws ShortcutBadgeException {\n        if (sonyBadgeContentProviderExists(context)) {\n            executeBadgeByContentProvider(context, componentName, badgeCount);\n        } else {\n            executeBadgeByBroadcast(context, componentName, badgeCount);\n        }\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Arrays.asList(\"com.sonyericsson.home\", \"com.sonymobile.home\");\n    }\n\n    private static void executeBadgeByBroadcast(Context context, ComponentName componentName,\n                                                int badgeCount) {\n        Intent intent = new Intent(INTENT_ACTION);\n        intent.putExtra(INTENT_EXTRA_PACKAGE_NAME, componentName.getPackageName());\n        intent.putExtra(INTENT_EXTRA_ACTIVITY_NAME, componentName.getClassName());\n        intent.putExtra(INTENT_EXTRA_MESSAGE, String.valueOf(badgeCount));\n        intent.putExtra(INTENT_EXTRA_SHOW_MESSAGE, badgeCount > 0);\n        context.sendBroadcast(intent);\n    }\n\n    /**\n     * Send request to Sony badge content provider to set badge in Sony home launcher.\n     *\n     * @param context       the context to use\n     * @param componentName the componentName to use\n     * @param badgeCount    the badge count\n     */\n    private void executeBadgeByContentProvider(Context context, ComponentName componentName,\n                                               int badgeCount) {\n        if (badgeCount < 0) {\n            return;\n        }\n\n        final ContentValues contentValues = createContentValues(badgeCount, componentName);\n        if (Looper.myLooper() == Looper.getMainLooper()) {\n            // We're in the main thread. Let's ensure the badge update happens in a background\n            // thread by using an AsyncQueryHandler and an async update.\n            if (mQueryHandler == null) {\n                mQueryHandler = new AsyncQueryHandler(\n                        context.getApplicationContext().getContentResolver()) {\n                };\n            }\n            insertBadgeAsync(contentValues);\n        } else {\n            // Already in a background thread. Let's update the badge synchronously. Otherwise,\n            // if we use the AsyncQueryHandler, this thread may already be dead by the time the\n            // async execution finishes, which will lead to an IllegalStateException.\n            insertBadgeSync(context, contentValues);\n        }\n    }\n\n    /**\n     * Asynchronously inserts the badge counter.\n     *\n     * @param contentValues Content values containing the badge count, package and activity names\n     */\n    private void insertBadgeAsync(final ContentValues contentValues) {\n        mQueryHandler.startInsert(0, null, BADGE_CONTENT_URI, contentValues);\n    }\n\n    /**\n     * Synchronously inserts the badge counter.\n     *\n     * @param context       Caller context\n     * @param contentValues Content values containing the badge count, package and activity names\n     */\n    private void insertBadgeSync(final Context context, final ContentValues contentValues) {\n        context.getApplicationContext().getContentResolver()\n                .insert(BADGE_CONTENT_URI, contentValues);\n    }\n\n    /**\n     * Creates a ContentValues object to be used in the badge counter update. The package and\n     * activity names must correspond to an activity that holds an intent filter with action\n     * \"android.intent.action.MAIN\" and category android.intent.category.LAUNCHER\" in the manifest.\n     * Also, it is not allowed to publish badges on behalf of another client, so the package and\n     * activity names must belong to the process from which the insert is made.\n     * To be able to insert badges, the app must have the PROVIDER_INSERT_BADGE\n     * permission in the manifest file. In case these conditions are not\n     * fulfilled, or any content values are missing, there will be an unhandled\n     * exception on the background thread.\n     *\n     * @param badgeCount    the badge count\n     * @param componentName the component name from which package and class name will be extracted\n     *\n     */\n    private ContentValues createContentValues(final int badgeCount,\n            final ComponentName componentName) {\n        final ContentValues contentValues = new ContentValues();\n        contentValues.put(PROVIDER_COLUMNS_BADGE_COUNT, badgeCount);\n        contentValues.put(PROVIDER_COLUMNS_PACKAGE_NAME, componentName.getPackageName());\n        contentValues.put(PROVIDER_COLUMNS_ACTIVITY_NAME, componentName.getClassName());\n        return contentValues;\n    }\n\n    /**\n     * Check if the latest Sony badge content provider exists .\n     *\n     * @param context the context to use\n     * @return true if Sony badge content provider exists, otherwise false.\n     */\n    private static boolean sonyBadgeContentProviderExists(Context context) {\n        boolean exists = false;\n        ProviderInfo info = context.getPackageManager().resolveContentProvider(SONY_HOME_PROVIDER_NAME, 0);\n        if (info != null) {\n            exists = true;\n        }\n        return exists;\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/VivoHomeBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\n\n/**\n * @author leolin\n */\npublic class VivoHomeBadger implements Badger {\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException {\n        Intent intent = new Intent(\"launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM\");\n        intent.putExtra(\"packageName\", context.getPackageName());\n        intent.putExtra(\"className\", componentName.getClassName());\n        intent.putExtra(\"notificationNum\", badgeCount);\n        context.sendBroadcast(intent);\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Arrays.asList(\"com.vivo.launcher\");\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/XiaomiHomeBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.annotation.TargetApi;\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.PackageManager;\nimport android.content.pm.ResolveInfo;\nimport android.os.Build;\n\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.util.Arrays;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\nimport me.leolin.shortcutbadger.util.BroadcastHelper;\n\n\n/**\n * @author leolin\n */\n@Deprecated\npublic class XiaomiHomeBadger implements Badger {\n\n    public static final String INTENT_ACTION = \"android.intent.action.APPLICATION_MESSAGE_UPDATE\";\n    public static final String EXTRA_UPDATE_APP_COMPONENT_NAME = \"android.intent.extra.update_application_component_name\";\n    public static final String EXTRA_UPDATE_APP_MSG_TEXT = \"android.intent.extra.update_application_message_text\";\n    private ResolveInfo resolveInfo;\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException {\n        try {\n            Class miuiNotificationClass = Class.forName(\"android.app.MiuiNotification\");\n            Object miuiNotification = miuiNotificationClass.newInstance();\n            Field field = miuiNotification.getClass().getDeclaredField(\"messageCount\");\n            field.setAccessible(true);\n            try {\n                field.set(miuiNotification, String.valueOf(badgeCount == 0 ? \"\" : badgeCount));\n            } catch (Exception e) {\n                field.set(miuiNotification, badgeCount);\n            }\n        } catch (Exception e) {\n            Intent localIntent = new Intent(\n                    INTENT_ACTION);\n            localIntent.putExtra(EXTRA_UPDATE_APP_COMPONENT_NAME, componentName.getPackageName() + \"/\" + componentName.getClassName());\n            localIntent.putExtra(EXTRA_UPDATE_APP_MSG_TEXT, String.valueOf(badgeCount == 0 ? \"\" : badgeCount));\n\n            try {\n                BroadcastHelper.sendIntentExplicitly(context, localIntent);\n            } catch (ShortcutBadgeException ignored) {}\n        }\n        if (Build.MANUFACTURER.equalsIgnoreCase(\"Xiaomi\")) {\n            tryNewMiuiBadge(context, badgeCount);\n        }\n    }\n\n    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)\n    private void tryNewMiuiBadge(Context context, int badgeCount) throws ShortcutBadgeException {\n        if (resolveInfo == null) {\n            Intent intent = new Intent(Intent.ACTION_MAIN);\n            intent.addCategory(Intent.CATEGORY_HOME);\n            resolveInfo = context.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);\n        }\n\n        if (resolveInfo != null) {\n            NotificationManager mNotificationManager = (NotificationManager) context\n                    .getSystemService(Context.NOTIFICATION_SERVICE);\n            Notification.Builder builder = new Notification.Builder(context)\n                    .setContentTitle(\"\")\n                    .setContentText(\"\")\n                    .setSmallIcon(resolveInfo.getIconResource());\n            Notification notification = builder.build();\n            try {\n                Field field = notification.getClass().getDeclaredField(\"extraNotification\");\n                Object extraNotification = field.get(notification);\n                Method method = extraNotification.getClass().getDeclaredMethod(\"setMessageCount\", int.class);\n                method.invoke(extraNotification, badgeCount);\n                mNotificationManager.notify(0, notification);\n            } catch (Exception e) {\n                throw new ShortcutBadgeException(\"not able to set badge\", e);\n            }\n        }\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Arrays.asList(\n                \"com.miui.miuilite\",\n                \"com.miui.home\",\n                \"com.miui.miuihome\",\n                \"com.miui.miuihome2\",\n                \"com.miui.mihome\",\n                \"com.miui.mihome2\",\n                \"com.i.miui.launcher\"\n        );\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/YandexLauncherBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\n\nimport java.util.Collections;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\n\n/**\n * @author Nikolay Pakhomov\n * created 16/04/2018\n */\npublic class YandexLauncherBadger implements Badger {\n\n    public static final String PACKAGE_NAME = \"com.yandex.launcher\";\n\n    private static final String AUTHORITY = \"com.yandex.launcher.badges_external\";\n    private static final Uri CONTENT_URI = Uri.parse(\"content://\" + AUTHORITY);\n    private static final String METHOD_TO_CALL = \"setBadgeNumber\";\n\n    private static final String COLUMN_CLASS = \"class\";\n    private static final String COLUMN_PACKAGE = \"package\";\n    private static final String COLUMN_BADGES_COUNT = \"badges_count\";\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException {\n        Bundle extras = new Bundle();\n        extras.putString(COLUMN_CLASS, componentName.getClassName());\n        extras.putString(COLUMN_PACKAGE, componentName.getPackageName());\n        extras.putString(COLUMN_BADGES_COUNT, String.valueOf(badgeCount));\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {\n            context.getContentResolver().call(CONTENT_URI, METHOD_TO_CALL, null, extras);\n        }\n    }\n\n    public static boolean isVersionSupported(Context context) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {\n            try {\n                context.getContentResolver().call(CONTENT_URI, \"\", null, null);\n                return true;\n            } catch (IllegalArgumentException e) {\n                return false;\n            }\n        }\n        return false;\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Collections.singletonList(PACKAGE_NAME);\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/ZTEHomeBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\n\npublic class ZTEHomeBadger implements Badger {\n\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount)\n            throws ShortcutBadgeException {\n        Bundle extra = new Bundle();\n        extra.putInt(\"app_badge_count\", badgeCount);\n        extra.putString(\"app_badge_component_name\", componentName.flattenToString());\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {\n            context.getContentResolver().call(\n                    Uri.parse(\"content://com.android.launcher3.cornermark.unreadbadge\"),\n                    \"setAppUnreadCount\", null, extra);\n        }\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return new ArrayList<String>(0);\n    }\n} \n\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/ZukHomeBadger.java",
    "content": "package me.leolin.shortcutbadger.impl;\n\nimport android.annotation.TargetApi;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\n\nimport java.util.Collections;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.Badger;\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\n\n/**\n * Created by wuxuejian on 2016/10/9.\n * 需在设置 -- 通知和状态栏 -- 应用角标管理 中开启应用\n */\n\npublic class ZukHomeBadger implements Badger {\n\n    private final Uri CONTENT_URI = Uri.parse(\"content://com.android.badge/badge\");\n\n    @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n    @Override\n    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException {\n        Bundle extra = new Bundle();\n        extra.putInt(\"app_badge_count\", badgeCount);\n        context.getContentResolver().call(CONTENT_URI, \"setAppBadgeCount\", null, extra);\n    }\n\n    @Override\n    public List<String> getSupportLaunchers() {\n        return Collections.singletonList(\"com.zui.launcher\");\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/util/BroadcastHelper.java",
    "content": "package me.leolin.shortcutbadger.util;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.PackageManager;\nimport android.content.pm.ResolveInfo;\nimport android.os.Build;\n\nimport java.util.Collections;\nimport java.util.List;\n\nimport me.leolin.shortcutbadger.ShortcutBadgeException;\nimport me.leolin.shortcutbadger.impl.IntentConstants;\n\n/**\n * Created by mahijazi on 17/05/16.\n */\npublic class BroadcastHelper {\n\n    public static List<ResolveInfo> resolveBroadcast(Context context, Intent intent) {\n        PackageManager packageManager = context.getPackageManager();\n        List<ResolveInfo> receivers = packageManager.queryBroadcastReceivers(intent, 0);\n\n        return receivers != null ? receivers : Collections.<ResolveInfo>emptyList();\n    }\n\n    public static void sendIntentExplicitly(Context context, Intent intent) throws ShortcutBadgeException {\n        List<ResolveInfo> resolveInfos = resolveBroadcast(context, intent);\n\n        if (resolveInfos.size() == 0) {\n            throw new ShortcutBadgeException(\"unable to resolve intent: \" + intent.toString());\n        }\n\n        for (ResolveInfo info : resolveInfos) {\n            Intent actualIntent = new Intent(intent);\n\n            if (info != null) {\n                actualIntent.setPackage(info.resolvePackageName);\n                context.sendBroadcast(actualIntent);\n            }\n        }\n    }\n\n    public static void sendDefaultIntentExplicitly(Context context, Intent intent) throws ShortcutBadgeException {\n        boolean oreoIntentSuccess = false;\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            Intent oreoIntent = new Intent(intent);\n\n            oreoIntent.setAction(IntentConstants.DEFAULT_OREO_INTENT_ACTION);\n\n            try {\n                sendIntentExplicitly(context, oreoIntent);\n                oreoIntentSuccess = true;\n            } catch (ShortcutBadgeException e) {\n                oreoIntentSuccess = false;\n            }\n        }\n\n        if (oreoIntentSuccess) {\n            return;\n        }\n\n        // try pre-Oreo default intent\n        sendIntentExplicitly(context, intent);\n    }\n}\n"
  },
  {
    "path": "ShortcutBadger/src/main/java/me/leolin/shortcutbadger/util/CloseHelper.java",
    "content": "package me.leolin.shortcutbadger.util;\n\nimport android.database.Cursor;\n\nimport java.io.Closeable;\nimport java.io.IOException;\n\n/**\n * @author leolin\n */\npublic class CloseHelper {\n\n    public static void close(Cursor cursor) {\n        if (cursor != null && !cursor.isClosed()) {\n            cursor.close();\n        }\n    }\n\n\n    public static void closeQuietly(Closeable closeable) {\n        try {\n            if (closeable != null) {\n                closeable.close();\n            }\n        } catch (IOException var2) {\n\n        }\n    }\n}\n"
  },
  {
    "path": "build.gradle",
    "content": "buildscript {\n    repositories {\n        jcenter()\n        mavenCentral()\n        google()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.1.0'\n    }\n    ext {\n        POM_NAME = 'ShortcutBadger'\n        POM_DESCRIPTION = 'The ShortcutBadger makes your Android App show the count of unread messages as a badge on your App shortcut!'\n        POM_URL = 'https://github.com/leolin310148/ShortcutBadger'\n        POM_SCM_URL = 'https://github.com/leolin310148/ShortcutBadger'\n        POM_SCM_CONNECTION = 'https://github.com/leolin310148/ShortcutBadger.git'\n        POM_SCM_DEV_CONNECTION = 'https://github.com/leolin310148/ShortcutBadger.git'\n        POM_LICENCE_NAME = 'The Apache Software License, Version 2.0'\n        POM_LICENCE_URL = 'http://www.apache.org/licenses/LICENSE-2.0'\n        POM_LICENCE_DIST = 'repo'\n        POM_DEVELOPER_ID = 'leolin310148'\n        POM_DEVELOPER_NAME = 'Leo Lin'\n        POM_PACKAGING = 'aar'\n        POM_ARTIFACT_ID = 'ShortcutBadger'\n        VERSION_NAME = '1.1.8'\n        VERSION_CODE = 1\n        GROUP = 'me.leolin'\n    }\n}\n\n\nsubprojects {\n    buildscript {\n        repositories {\n            jcenter()\n            mavenCentral()\n            google()\n        }\n        dependencies {\n            classpath 'com.android.tools.build:gradle:3.1.3'\n        }\n    }\n    repositories {\n        jcenter()\n        mavenCentral()\n        google()\n    }\n\n}"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Sun Apr 01 16:48:39 MSK 2018\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-4.5-all.zip\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# For Cygwin, ensure paths are in UNIX format before anything is touched.\nif $cygwin ; then\n    [ -n \"$JAVA_HOME\" ] && JAVA_HOME=`cygpath --unix \"$JAVA_HOME\"`\nfi\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >&-\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >&-\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windowz variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\ngoto execute\n\n:4NT_args\n@rem Get arguments from the 4NT Shell from JP Software\nset CMD_LINE_ARGS=%$\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':ShortcutBadger'\ninclude ':SampleApp'\n"
  }
]