A library that checks for your apps' updates on Google Play, GitHub, Amazon, F-Droid or your own server. API 9+ required.

Overview

AppUpdater

Android Library

Android Library that checks for updates on Google Play, GitHub, Amazon, F-Droid or your own server. This library notifies your apps' updates by showing a Material dialog, Snackbar or notification. Check out the wiki.

Sample Project

You can download the latest sample APK from Google Play:

How to include

Add the repository to your project build.gradle:

repositories {
    maven {
        url "https://jitpack.io"
    }
}

And add the library to your module build.gradle:

dependencies {
    implementation 'com.github.javiersantos:AppUpdater:2.7'
}

Usage

Activity / Fragment

By default, the basic usage will show a default dialog when a new version is found on the Play Store (otherwise nothing will be shown). By calling the .start() method, the library will work in background. You can cancel it at any time by calling .stop(). Other customizations are explained below.

Activity

AppUpdater appUpdater = new AppUpdater(this);
appUpdater.start();

Fragment

AppUpdater appUpdater = new AppUpdater(getActivity());
appUpdater.start();

Customizations (Wiki)

Displaying a dialog, Snackbar or notification

The default usage is configured to display a dialog. However, there are other ways to show the update notice.

new AppUpdater(this)
	.setDisplay(Display.SNACKBAR)
	.setDisplay(Display.DIALOG)
	.setDisplay(Display.NOTIFICATION)
	...

When using Display.DIALOG, you can make the dialog dismissable when touching outside by using .setCancelable(false) (enabled by default).

When using Display.SNACKBAR, you can change the duration by using .setDuration(Duration.NORMAL) (default) or .setDuration(Duration.INDEFINITE).

Providing a source for the updates

By default the library will check for updates on the Play Store. However, there are other alternatives, such as GitHub, Amazon, F-Droid or using your own server.

new AppUpdater(this)
	.setUpdateFrom(UpdateFrom.GITHUB)
	.setUpdateFrom(UpdateFrom.GOOGLE_PLAY)
	.setUpdateFrom(UpdateFrom.AMAZON)
	.setUpdateFrom(UpdateFrom.FDROID)
	.setUpdateFrom(UpdateFrom.XML)
	.setUpdateFrom(UpdateFrom.JSON)
	...

When using GitHub you must provide the repo where the library will check for updates: .setGitHubUserAndRepo("javiersantos", "AppUpdater"). Check out the wiki for more details.

When using the XML source you must upload a .xml file somewhere on the Internet following the structure explained in the wiki and add the URL as shown in this example: .setUpdateXML("https://raw.githubusercontent.com/javiersantos/AppUpdater/master/app/update-changelog.xml").

When using the JSON source you must upload a .json file somewhere on the Internet following the structure explained in the wiki and add the URL as shown in this example: .setUpdateJSON("https://raw.githubusercontent.com/javiersantos/AppUpdater/master/app/update-changelog.json").

A detailed description with examples is available at: https://github.com/javiersantos/AppUpdater/wiki

Setting the frequency to show updates

By default, a dialog/Snackbar/notification will be shown whenever a new version is found. However, this can be set to show only every X times that the app ascertains that a new update is available.

new AppUpdater(this)
	.showEvery(5)
	...

You can also show the dialog, Snackbar or notification although there aren't updates by using .showAppUpdated(true) (disabled by default).

Customizing the title, description, buttons and more

new AppUpdater(this)
	.setTitleOnUpdateAvailable("Update available")
	.setContentOnUpdateAvailable("Check out the latest version available of my app!")
	.setTitleOnUpdateNotAvailable("Update not available")
	.setContentOnUpdateNotAvailable("No update available. Check for updates again later!")
	.setButtonUpdate("Update now?")
	.setButtonUpdateClickListener(...)
	.setButtonDismiss("Maybe later")
	.setButtonDismissClickListener(...)
	.setButtonDoNotShowAgain("Huh, not interested")
	.setButtonDoNotShowAgainClickListener(...)
	.setIcon(R.drawable.ic_update) // Notification icon 
	.setCancelable(false) // Dialog could not be dismissable
	...

By default, the "Don't show again" button will be displayed. Use .setButtonDoNotShowAgain(null) to hide the button.

AppUpdaterUtils

The AppUpdaterUtils class works in the same way that the AppUpdater class does, but it won't display any dialog, Snackbar or notification. When using the AppUpdaterUtils class you must provide a custom callback that will be called when the latest version has been checked.

Using custom callbacks

Adding a callback to the builder allows you to customize what will happen when the latest update has been checked. Keep in mind that when using this method you must be aware of displaying any dialog, snackbar or whatever you want to let the user know that there is a new update available.

AppUpdaterUtils appUpdaterUtils = new AppUpdaterUtils(this)
    //.setUpdateFrom(UpdateFrom.AMAZON)
    //.setUpdateFrom(UpdateFrom.GITHUB)
    //.setGitHubUserAndRepo("javiersantos", "AppUpdater")
    //...
    .withListener(new AppUpdaterUtils.UpdateListener() {
        @Override
        public void onSuccess(Update update, Boolean isUpdateAvailable) {
            Log.d("Latest Version", update.getLatestVersion());
	    Log.d("Latest Version Code", update.getLatestVersionCode());
	    Log.d("Release notes", update.getReleaseNotes());
	    Log.d("URL", update.getUrlToDownload());
	    Log.d("Is update available?", Boolean.toString(isUpdateAvailable));
        }
        
        @Override
        public void onFailed(AppUpdaterError error) {
            Log.d("AppUpdater Error", "Something went wrong");
        }
     });
appUpdaterUtils.start();

AppUpdater

License

Copyright 2016 Javier Santos

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • Always get Latest Version 0.0.0.0 update from GOOGLE_PLAY

    Always get Latest Version 0.0.0.0 update from GOOGLE_PLAY

    • [x] I have verified there are no duplicate active or recent bugs, questions, or requests.
    • [x] I have verified that I am using the latest version of AppUpdater.
    • [x] I have given my issue a non-generic title.
    • [x] I have read over the README, Wiki and FAQs (before asking questions on how to do something).
    Details
    • PiracyChecker version: 2.6.5
    • Device OS version: 5.0.2
    • Device Manufacturer: LG
    • Device Name: G2
    Builder
    AppUpdaterUtils appUpdaterUtils = new AppUpdaterUtils(this)
                    .setUpdateFrom(UpdateFrom.GOOGLE_PLAY)
                    .withListener(new AppUpdaterUtils.UpdateListener() {
                        @Override
                        public void onSuccess(Update update, Boolean isUpdateAvailable) {
                            Log.d("Latest Version ",  update.getLatestVersion());
                            Log.d("Release notes",  update.getReleaseNotes());
                            Log.d("URL",  update.getUrlToDownload().toString());
                            Log.d("Is update available? ", Boolean.toString(isUpdateAvailable));
                        }
    
                        @Override
                        public void onFailed(AppUpdaterError error) {
                            Log.d("AppUpdater Error", "Something went wrong");
                        }
                    });
            appUpdaterUtils.start();
    
    Problem

    Hi.. I want to ask, why I always get return Latest Version 0.0.0.0 while in the playstore has its version 1.0.0 thanks.

    Expected Result

    Latest Version 1.0.0 Release notes URL https://play.google.com/store/apps/details?id=com.vcard.sg&hl=en Is update available?true

    Actual Result

    Latest Version 0.0.0.0 Release notes URL https://play.google.com/store/apps/details?id=com.vcard.sg&hl=en Is update available?false

    bug help wanted 
    opened by SetiaBudy-Mail 35
  • Unable to resolve host

    Unable to resolve host "sit30.ru": No address associated with hostname

    Exception java.lang.RuntimeException: An error occurred while executing doInBackground() android.os.AsyncTask$3.done (AsyncTask.java:309) java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:354) java.util.concurrent.FutureTask.setException (FutureTask.java:223) java.util.concurrent.FutureTask.run (FutureTask.java:242) android.os.AsyncTask$SerialExecutor$1.run (AsyncTask.java:234) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1113) java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:588) java.lang.Thread.run (Thread.java:818) arrow_drop_down Caused by java.lang.RuntimeException: java.lang.RuntimeException: java.net.UnknownHostException: Unable to resolve host "sit30.ru": No address associated with hostname com.github.javiersantos.appupdater.RssParser.parse (RssParser.java:33) com.github.javiersantos.appupdater.UtilsLibrary.getLatestAppVersionXml (UtilsLibrary.java:201) com.github.javiersantos.appupdater.UtilsAsync$LatestAppVersion.doInBackground (UtilsAsync.java:57) com.github.javiersantos.appupdater.UtilsAsync$LatestAppVersion.doInBackground (UtilsAsync.java:13) android.os.AsyncTask$2.call (AsyncTask.java:295) java.util.concurrent.FutureTask.run (FutureTask.java:237) android.os.AsyncTask$SerialExecutor$1.run (AsyncTask.java:234) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1113) java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:588) java.lang.Thread.run (Thread.java:818) arrow_drop_down Caused by java.lang.RuntimeException: java.net.UnknownHostException: Unable to resolve host "sit30.ru": No address associated with hostname com.github.javiersantos.appupdater.RssParser.getInputStream (RssParser.java:41) com.github.javiersantos.appupdater.RssParser.parse (RssParser.java:30) com.github.javiersantos.appupdater.UtilsLibrary.getLatestAppVersionXml (UtilsLibrary.java:201) com.github.javiersantos.appupdater.UtilsAsync$LatestAppVersion.doInBackground (UtilsAsync.java:57) com.github.javiersantos.appupdater.UtilsAsync$LatestAppVersion.doInBackground (UtilsAsync.java:13) android.os.AsyncTask$2.call (AsyncTask.java:295) java.util.concurrent.FutureTask.run (FutureTask.java:237) android.os.AsyncTask$SerialExecutor$1.run (AsyncTask.java:234) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1113) java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:588) java.lang.Thread.run (Thread.java:818)

    opened by codeitnos 7
  • The JSON updater file is mal-formatted. AppUpdate can't check for updates

    The JSON updater file is mal-formatted. AppUpdate can't check for updates

    • [x] I have verified there are no duplicate active or recent bugs, questions, or requests.
    • [x] I have verified that I am using the latest version of AppUpdater.
    • [x] I have given my issue a non-generic title.
    • [x] I have read over the README, Wiki and FAQs (before asking questions on how to do something).
    Details
    • PiracyChecker version: 2.x.x (Doesn't used this)
    • Device OS version: 5.1
    • Device Manufacturer: Lenovo
    • Device Name: leneovo tab3 7Essentials
    Builder
    AppUpdaterUtils appUpdaterUtils = new AppUpdaterUtils(getContext())
                    .setUpdateFrom(UpdateFrom.JSON)
                    .setUpdateJSON("https://somesite.com/MyApp/update-changelog.json")
                    .withListener(new AppUpdaterUtils.UpdateListener() {
                        @Override
                        public void onSuccess(Update update, Boolean isUpdateAvailable) {
    					Intent updateIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(update.getUrlToDownload().toString()));
                            updateIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            getContext().startActivity(updateIntent);
    					}
    					
    					@Override
                        public void onFailed(AppUpdaterError error) {
                            Log.d("AppUpdater Error", "Something went wrong");
                        }
                    });
            appUpdaterUtils.start();
    

    JSON I used

    {
      "latestVersion": "1.0.1",
      "latestVersionCode": "2",
      "url": "https://somesite.com/app-debug.apk",
      "releaseNotes": [
        "- First evolution",
        "- Second evolution",
        "- Bug fixes"
      ]
    }
    
    
    Expected Result

    Invoking Update Intent

    Actual Result

    The JSON updater file is mal-formatted. AppUpdate can't check for updates

    possible bug 
    opened by SankarGaneshKumar 6
  • Dependencies Conflict

    Dependencies Conflict

    Why does this library import

    com.android.support:design:22.2.0 (14977 methods and 218kb) com.squareup.okhttp3:okhttp:3.2.0 (2750 methods and 336kb)

    It conflicts with other dependencies in my app and I can't use yours.

    Any workaround?

    opened by PuneetKohli 5
  • UpdateListener methods not called

    UpdateListener methods not called

    Hi! We are using this library for quite a time and all was good until recently. We have two separate flavours of our app, one which is released to the Play Store and one which used for development purposes. Both apps check for updates using this lib, but obviously the development flavour never has updates (as it is not published to the Play Store). We do not use the built-in dialogs of this lib, but use an UpdateListener and do our own logic, like this:

    appUpdaterUtils
    	.setUpdateFrom(UpdateFrom.GOOGLE_PLAY)
    	.withListener(new AppUpdaterUtils.UpdateListener() {
    		@Override
    		public void onSuccess(Update update, Boolean isUpdateAvailable) {
    			// OUR OWN LOGIC
    		}
    
    		@Override
    		public void onFailed(AppUpdaterError error) {
    			// OUR OWN LOGIC
    		}
    	});
    appUpdaterUtils.start();
    

    Until version 2.5, the UpdateListener's onSuccess method was always called on our development flavour with the isUpdateAvailable value as false. Since 2.5.1, sometimes none of the methods of the UpdateListener are called, and sometimes the same happens as before. It is not deterministic and I could not find anything that triggers the wrong behavior yet.

    Could you look into this issue? We will use version 2.5 until it is resolved.

    opened by balazsgerlei 5
  • RuntimeException in UtilsLibrary class

    RuntimeException in UtilsLibrary class

    Fatal Exception: java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:300) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) at java.util.concurrent.FutureTask.setException(FutureTask.java:222) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:848) Caused by java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 at com.github.javiersantos.appupdater.UtilsLibrary.getLatestAppVersionHttp(UtilsLibrary.java:171) at com.github.javiersantos.appupdater.UtilsAsync$LatestAppVersion.doInBackground(UtilsAsync.java:59) at com.github.javiersantos.appupdater.UtilsAsync$LatestAppVersion.doInBackground(UtilsAsync.java:13) at android.os.AsyncTask$2.call(AsyncTask.java:288) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:848)

    bug 
    opened by dlet24 5
  • Update followers list

    Update followers list

    • [ ] I have verified there are no duplicate active or recent bugs, questions, or requests.
    • [x] I have verified that I am using the latest version of AppUpdater.
    • [ ] I have given my issue a non-generic title.
    • [ ] I have read over the README, Wiki and FAQs (before asking questions on how to do something).
    Details
    • PiracyChecker version: 2.x.x
    • Device OS version: 7.1.1
    • Device Manufacturer: LG
    • Device Name: Nexus 5X
    Builder
    new AppUpdater(this)
       ...
       .start();
    
    Reproduction Steps
    Expected Result
    Actual Result
    opened by Harisalimian2 4
  • Noticed crash using Crashlytics

    Noticed crash using Crashlytics

    Fatal Exception: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
           at android.support.v7.app.AppCompatDelegateImplV9.createSubDecor(AppCompatDelegateImplV9.java:359)
           at android.support.v7.app.AppCompatDelegateImplV9.ensureSubDecor(AppCompatDelegateImplV9.java:328)
           at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:289)
           at android.support.v7.app.AppCompatDialog.setContentView(AppCompatDialog.java:83)
           at android.support.v7.app.AlertController.installContent(AlertController.java:225)
           at android.support.v7.app.AlertDialog.onCreate(AlertDialog.java:257)
           at android.app.Dialog.dispatchOnCreate(Dialog.java:733)
           at android.app.Dialog.show(Dialog.java:469)
           at com.github.javiersantos.appupdater.AppUpdater$1.onSuccess(AppUpdater.java:347)
           at com.github.javiersantos.appupdater.UtilsAsync$LatestAppVersion.onPostExecute(UtilsAsync.java:97)
           at com.github.javiersantos.appupdater.UtilsAsync$LatestAppVersion.onPostExecute(UtilsAsync.java:15)
           at android.os.AsyncTask.finish(AsyncTask.java:651)
           at android.os.AsyncTask.access$500(AsyncTask.java:180)
           at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
           at android.os.Handler.dispatchMessage(Handler.java:102)
           at android.os.Looper.loop(Looper.java:148)
           at android.app.ActivityThread.main(ActivityThread.java:7407)
           at java.lang.reflect.Method.invoke(Method.java)
           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
    
    opened by radvansky-tomas 4
  • Dialog don't pop up when including latestVersionCode (JSON)

    Dialog don't pop up when including latestVersionCode (JSON)

    In the new 2.6 version:

    {
      "latestVersion": "1.2.2",
      "latestVersionCode": 10,
      "url": "https://github.com/javiersantos/AppUpdater/releases",
      "releaseNotes": [
        "- First evolution",
        "- Second evolution",
        "- Bug fixes"
      ]
    }
    

    If you don't include latestVersionCode in your JSON, the update dialog won't pop up.

    bug 
    opened by yofu1234 4
  • Latest version JSON

    Latest version JSON

    for some reason the library has it that latestVersion integer you put in JSON has to be: latestVersion - 1

    "latestVersion": "2.14",

    I.E.: the latest version right now is 2.15. For the pop up to not show up on version 2.15. You have to put latest version as 2.14

    Json here: https://github.com/yofu1234/androidappupdate/blob/master/update-changelog.json

    invalid 
    opened by yofu1234 4
  • I do not receive any type of notification

    I do not receive any type of notification

    I'm trying to display a notification for the presence of an update on playstore but I do not receive anything, I have no error between the logs.

    this is my app: https://play.google.com/store/apps/details?id=com.movisystem.flippycard

    and this is the code I use in a fragment new AppUpdater(getActivity()) .setDisplay(Display.NOTIFICATION) .setUpdateFrom(UpdateFrom.GOOGLE_PLAY) .showAppUpdated(false) .start();

    can you help me?

    opened by EminDemiri 4
  • Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.

    Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.

    • [x ] I have verified there are no duplicate active or recent bugs, questions, or requests.
    • [x ] I have verified that I am using the latest version of AppUpdater.
    • [ ] I have given my issue a non-generic title.
    • [ x] I have read over the README, Wiki and FAQs (before asking questions on how to do something).
    Details
    • PiracyChecker version: 2.x.x
    • Device OS version: 7.1.1
    • Device Manufacturer: LG
    • Device Name: Nexus 5X
    Builder
    new AppUpdater(this)
       ...
       .start();
    
    Reproduction Steps
    Expected Result
    Actual Result
    opened by morfeo777 1
  • About directly apk URL in xml file

    About directly apk URL in xml file

    Hi, i want to use directly .apk link in xml file that: <AppUpdate.r> <update.>

    ---> "< url.>http.s://github.com/javiersantos/AppUpdater/releases</url" </update.> </AppUpdater.>

    like : "< url.>http.s://github.com/javiersantos/AppUpdater/releases/example.apk</url".>

    Is that possible?

    opened by ahmet-topal 0
  • Using the library in the kotlin project

    Using the library in the kotlin project

    good afternoon. Can I use your library in a Kotlin project? I tried to add dependencies and implement the update, but it caused an error related to duplicating classes. Thanks.

    opened by SmartHome2021 0
  • Always get Latest Version 0.0.0.0 update from GOOGLE_PLAY

    Always get Latest Version 0.0.0.0 update from GOOGLE_PLAY

    • [x] I have verified there are no duplicate active or recent bugs, questions, or requests.
    • [x] I have verified that I am using the latest version of AppUpdater.
    • [x] I have given my issue a non-generic title.
    • [x] I have read over the README, Wiki and FAQs (before asking questions on how to do something).
    Details
    • PiracyChecker version: 2.x.x
    • Device OS version: 12
    • Device Manufacturer: Samsung
    • Device Name: GalaxyM31
    Builder
     AppUpdaterUtils appUpdaterUtils = new AppUpdaterUtils(this)
                    .setUpdateFrom(UpdateFrom.GOOGLE_PLAY)
                    .withListener(new AppUpdaterUtils.UpdateListener() {
                        @Override
                        public void onSuccess(Update update, Boolean isUpdateAvailable) {
                            Log.d("Latest Version ",  update.getLatestVersion());
                            Log.d("Release notes",  update.getReleaseNotes());
                            Log.d("URL",  update.getUrlToDownload().toString());
                            Log.d("Is update available? ", Boolean.toString(isUpdateAvailable));
                        }
    
                        @Override
                        public void onFailed(AppUpdaterError error) {
                            Log.d("AppUpdater Error", "Something went wrong");
                        }
                    });
            appUpdaterUtils.start();
    
    problem

    Hi.. I want to ask, why I always get return Latest Version 0.0.0.0 while in the playstore has its version 1.2.0 . before this issue was appear earlier in 2018, now its appear again, and it was fixed as an temporary solution with update of 2.7, but current library version is still 2.7. so when this issue will resolve now

    Expected Result

    Latest Version 6.2.0 Release notes URL https://play.google.com/store/apps/details?id=com.city.tenantmnm&hl=en Is update available?true

    Actual Result

    Latest Version 0.0.0 Release notes URL https://play.google.com/store/apps/details?id=com.city.tenantmnm&hl=en Is update available?false

    opened by IMWaqasFarooq 1
  • How do i delete the .APK after i update my app ??

    How do i delete the .APK after i update my app ??

    • [ X] I have verified there are no duplicate active or recent bugs, questions, or requests.
    • [ X] I have verified that I am using the latest version of AppUpdater.
    • [ X] I have given my issue a non-generic title.
    • [X ] I have read over the README, Wiki and FAQs (before asking questions on how to do something).
    Details
    • PiracyChecker version: 2.x.x
    • Device OS version: 7.1.1
    • Device Manufacturer: LG
    • Device Name: Nexus 5X
    Builder

    new AppUpdater(mContext) .setUpdateFrom(UpdateFrom.JSON) .setUpdateJSON("http://172.16.206.19/REST_API/json_format.json") .setDisplay(Display.DIALOG) .setCancelable(false) // Dialog could not be dismissable .showAppUpdated(true) .setButtonDoNotShowAgain(null) .start();

    How do i automatically clear the .apk file after i update my app automatically ??

    opened by Nanumiric123 1
Releases(2.7)
  • 2.7(Jul 5, 2018)

    • Temporary fix to Google Play update mechanism. ℹ️ Using UpdateFrom.GOOGLE PLAY is not recommended as the Google Play website may vary at any time, use UpdateFrom.XML or UpdateFrom.JSON instead. More info in issue #132.

    • Updated version comparator to allow non-number characters. Thanks to @dhebbeker.

    • Filter GitHub response to the latest release. Thanks to @dhebbeker.

    • Updated some libraries.

    Source code(tar.gz)
    Source code(zip)
  • 2.6.5(Feb 17, 2018)

  • 2.6.4(Dec 1, 2017)

  • 2.6.3(Jul 28, 2017)

    This release has a quick fix for the previous 2.6.2 release.


    • Added .setCancelable(boolean) to make the dialog dismissable.
    • Updated OkHttp to 3.8.1
    Source code(tar.gz)
    Source code(zip)
  • 2.6.1(Apr 1, 2017)

    • Fixed issue when versionCode wasn't included in the JSON or XML file.
    • Fixed NumberFormatException when versionCode has been added to a XML file.
    Source code(tar.gz)
    Source code(zip)
  • 2.6(Mar 31, 2017)

  • 2.5.4(Mar 21, 2017)

  • 2.5.2(Mar 9, 2017)

    • Added possibility for custom listeners: .setButtonUpdateClickListener(...), .setButtonDismissClickListener(...), .setButtonDoNotShowAgainClickListener(...). Thanks to @joen93.
    • Added Dutch translation.
    • Updated OkHttp to 3.6.0
    Source code(tar.gz)
    Source code(zip)
  • 2.5.1(Jan 3, 2017)

    • Fixed #64, #66. Thanks to @pengrad.
    • Added Russian and Vietnamese translations. Thanks to @pengrad.
    • Updated OkHttp to 3.5.0

    🎉 Happy New Year 🎉

    Source code(tar.gz)
    Source code(zip)
  • 2.5(Nov 29, 2016)

    JSON files are now supported

    new AppUpdater(this)
        .setUpdateFrom(UpdateFrom.JSON)
        .setUpdateJSON("https://github.com/javiersantos/AppUpdater/wiki/UpdateFrom.JSON")
        ...
    

    When using the JSON source you must upload a .json file somewhere on the Internet following the structure explained in the wiki and add the URL as shown in this example: .setUpdateJSON("https://github.com/javiersantos/AppUpdater/wiki/UpdateFrom.JSON").

    Thanks a lot to @kgritesh for your PR!

    Minor changes

    • minSdkVersion now requires API +9.
    • #59 Added Czech translation. Thanks to @thubalek.
    • #51 Added Chinese translation. Thanks to @androidZhai.
    • #57 Improve grammar of some messages. Thanks to @matthewmayer.
    • Fixed #62. Thanks to @thubalek.
    Source code(tar.gz)
    Source code(zip)
  • 2.4(Aug 27, 2016)

  • 2.3.1(Aug 27, 2016)

    • Added Italian translation. Thanks to @DVDAndroid.
    • Added Slovak translation. Thanks to @pylerSM.
    • Fixed #24, #33, #37, #45. Thanks to @pylerSM.
    Source code(tar.gz)
    Source code(zip)
  • 2.3(Aug 7, 2016)

  • 2.2(Jul 9, 2016)

    • Added possibility to set the text of the dismiss button: .setDialogButtonDismiss().
    • Added possibility to stop the background task: .stop().
    • Made the snackbar and the dialog dismissable
    • Using OkHTTP to prevent leaking view.

    Thanks to @Neoklosch for your PR!

    Source code(tar.gz)
    Source code(zip)
  • 2.1.1(May 13, 2016)

  • 2.1(Apr 18, 2016)

    • Provide release notes for your updates using UpdateFrom.XML. Thanks to @johanvs. Documentation available here: https://github.com/javiersantos/AppUpdater/wiki/UpdateFrom.XML
    • Update gradle and libraries.
    Source code(tar.gz)
    Source code(zip)
  • 2.0.2(Mar 4, 2016)

    • Added more AppUpdaterError elements to the enum: UPDATE_VARIES_BY_DEVICE, GITHUB_USER_REPO_INVALID, NETWORK_NOT_AVAILABLE and XML_URL_MALFORMED.
    • Fixed Snackbar was showed behing the Navigation bar.
    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(Mar 3, 2016)

    • Added .setUpdateFrom(UpdateFrom.XML) to allow updates from your own website / server. Documentation available here: https://github.com/javiersantos/AppUpdater/wiki/UpdateFrom.XML
    • Added new listener to retrieve an object with the latest version and URL to download: UpdateListener.
    UpdateListener listener = new AppUpdaterUtils.UpdateListener() {
            @Override
            public void onSuccess(Update update, Boolean isUpdateAvailable) {
                Log.d("AppUpdater", update.getLatestVersion() + ", " + update.getUrlToDownload() + ", " + Boolean.toString(isUpdateAvailable));
            }
    
            @Override
            public void onFailed(AppUpdaterError error) {
                Log.d("AppUpdater", "Something went wrong");
            });
    
    • Some refactoring and bug fixes. Thanks to deletescape.
    Source code(tar.gz)
    Source code(zip)
  • 2.0(Mar 3, 2016)

    • Added .setUpdateFrom(UpdateFrom.XML) to allow updates from your own website / server. Documentation available here: https://github.com/javiersantos/AppUpdater/wiki/UpdateFrom.XML
    • Added new listener to retrieve an object with the latest version and URL to download: UpdateListener.
    UpdateListener listener = new AppUpdaterUtils.UpdateListener() {
            @Override
            public void onSuccess(Update update, Boolean isUpdateAvailable) {
                Log.d("AppUpdater", update.getLatestVersion() + ", " + update.getUrlToDownload() + ", " + Boolean.toString(isUpdateAvailable));
            }
    
            @Override
            public void onFailed(AppUpdaterError error) {
                Log.d("AppUpdater", "Something went wrong");
            });
    
    • Some refactoring and bug fixes. Thanks to deletescape.
    Source code(tar.gz)
    Source code(zip)
  • 1.2.2(Mar 1, 2016)

  • 1.2.1(Feb 28, 2016)

    • Fixed issue on certain Google Play apps showing "Varies by Device".
    • Update AppCompat to 23.2.0
    • Snackbar was displaying the installed version instead the latest one.
    • Removed app_name to avoid Gradle warning.
    Source code(tar.gz)
    Source code(zip)
  • 1.2(Feb 23, 2016)

    • Set a custom title, description and buttons text for the dialogs.
    // Customize the dialog title, description and buttons
    .setDialogTitleWhenUpdateAvailable("Update available")
    .setDialogDescriptionWhenUpdateAvailable("Check out the latest version available of my app!")
    .setDialogButtonUpdate("Update now?")
    .setDialogButtonDoNotShowAgain("Huh, not interested")
    .setDialogTitleWhenUpdateNotAvailable("Update not available")
    .setDialogDescriptionWhenUpdateNotAvailable("No update available. Check for updates again later!")
    
    • French translation.
    Source code(tar.gz)
    Source code(zip)
  • 1.1(Feb 5, 2016)

    • init() method has been deprecated, use start() instead.
    • Added AppUpdaterUtils class. The withListener() asynchronous call returns an string with the latest version available and a boolean comparing the installed version with the latest one.
    new AppUpdaterUtils(this)
        .withListener(new AppUpdaterUtils.AppUpdaterListener() {
            @Override
            public void onSuccess(String latestVersion, Boolean isUpdateAvailable) {
                Log.d("AppUpdater", latestVersion + ", " + Boolean.toString(isUpdateAvailable));
            }).show();
    
    Source code(tar.gz)
    Source code(zip)
  • 1.0.3(Feb 5, 2016)

    • Changed default value of the showEvery(int) method from 5 to 1 (always).
    • Fixed showEvery(int) method not working properly.
    • Switched from the deprecated Apache HTTP Client to HttpURLConnection.
    • German and Catalan translations.
    Source code(tar.gz)
    Source code(zip)
  • 1.0.2(Feb 3, 2016)

  • 1.0.1(Feb 2, 2016)

Owner
Javier Santos
Android developer 📱. I enjoy drinking iced ❄️ coffee. Checkout my apps and libraries!
Javier Santos
Checks for app updates and automatically updates the current app if the new one in local storage have a different version

Silent Android App Update Sample This sample shows how to update Android app silently without user confirmation with a device owner app. It works on A

Hamdi Guerbej 1 May 14, 2022
🧶 Library to handling files for persistent storage with Google Cloud Storage and Amazon S3-compatible server, made in Kotlin

?? Remi Library to handling files for persistent storage with Google Cloud Storage and Amazon S3-compatible server, made in Kotlin! Why is this built?

Noelware 8 Dec 17, 2022
Allowing server admins to backdoor their own server!

DiscordBackdoorBot Allowing server admins to backdoor their own server! What does Discord Backdoor Bot do? Discord Backdoor bot allows the bot owner t

Awesomemoder316 1 Jun 8, 2022
Amazon S3 multipart file upload for Android, made simple

Simpl3r Amazon S3 multipart file upload for Android, made simple This library provides a simple high level Android API for robust and resumable multip

Jeff Gilfelt 182 Nov 15, 2022
Amazon IVS Live to VOD (DVR) Android demo

A demo Android app showing how to implement a Live to VOD (DVR) experience using Amazon IVS and the auto-record-to-s3 feature using Amazon S3.

AWS Samples 4 Jan 3, 2023
Candroid does things different. The Candroid app store is a library of APK client wrappers (F-Droid, APKPure, etc.) For the main Candroid app store, try visiting the Candroid Market.

Candroid App Store Candroid does things different. The Candroid app store is a library of APK client wrappers (F-Droid, APKPure, etc.) For the main Ca

Sean P. Myrick V19.1.7.2 4 Dec 22, 2022
This application uses Google Play Services Vision library to scan barcodes. It uses Google's on device ML kit to scan for barcodes.

Barcode-Scanner This application showcases use of Google Play Services Vision library It uses Google's on device machine learning kit to scan for barc

Soumik 2 Apr 28, 2022
F-Droid client with Material UI.

Droid-ify A quick material F-Droid client. ?? Features Material F-Droid style No cards or inappropriate animations Fast repository syncing Standard An

LooKeR 763 Jan 7, 2023
Unofficial F-Droid client in the style of the classic one.

Foxy Droid Yet another F-Droid client. Description Unofficial F-Droid client in the style of the classic one. Jump over the lazy dog, manage repositor

null 355 Dec 26, 2022
F-Droid Privilege Extension that works with Shizuku (rootless)

F-Droid Shizuku Privileged Extension This is a port of the official F-Droid Privileged Extension to Shizuku, an app that makes it easy to grant apps A

Davide Depau 4 Nov 18, 2022
Android Application that plays music through a Spotify API based on a user's current location found through Google Maps API and also checking Google Weather API.

GeoStereo Android Application that plays music through a Spotify API based on a user's current location found through Google Maps API and also checkin

Jonah Douglas 1 Jun 16, 2022
Github-Api-Pagination-Example - Pagination 3 Example using Github Api

Github-Api-Pagination Pagination 3 Example using Github Api Tech Stack 100% Kotl

Anggoro Beno Lukito 2 Aug 22, 2022
The BitbucketWatcher is a helpful tool to keep up to date with updates on your repo.

The BitbucketWatcher is a helpful tool to keep up to date with updates on your repo. The Watcher tracks new PullRequests, status changes on code reviews, merged branches and forgotten branches.

null 4 Jan 10, 2022
android-trinity is tiny proactive framework with much of the scaffolding code required to start a new Android Application.

android-trinity This is tiny framework with much of the scaffolding code (with some nice utilities and prepared source code) required to start a new A

Fernando Cejas 49 Nov 24, 2022
Scoper - Access any file with zero permission required

Scoper - Access any file with zero permission required With this codebase you will able to access file from your mobile without requiring permission o

Fakhrul Alam Siddiqei 5 Oct 4, 2022
A Gradle plugin providing various utility methods and common code required to set up multi-version Minecraft mods.

Essential Gradle Toolkit A Gradle plugin providing various utility methods and common code required to set up multi-version Minecraft mods via archite

Essential 29 Nov 1, 2022
Run Linux virtual machine on Android OS. Powered by QEMU. No KVM or root required.

vmConsole A free and open-source application that enables you to run Alpine Linux distribution in a virtual machine on your Android device. Thousands

Leonid Pliushch 85 Jan 1, 2023
Glance Experimental Tools aims to supplement Jetpack Glance with features that are commonly required by developers but not yet available.

Glance Experimental Tools ?? Work in-progress: artifacts not available yet This project aims to supplement Jetpack Glance with features that are commo

Google 96 Dec 25, 2022