diff --git a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java index f5122e0e5..4917be1c1 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java +++ b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java @@ -9,8 +9,10 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.database.ContentObserver; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; import android.support.design.widget.AppBarLayout; import android.support.design.widget.CoordinatorLayout; import android.support.v4.content.LocalBroadcastManager; @@ -188,6 +190,13 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog if (app != null) { visiblePackageName = app.packageName; } + + appObserver = new AppObserver(new Handler()); + getContentResolver().registerContentObserver( + AppProvider.getHighestPriorityMetadataUri(app.packageName), + true, + appObserver); + updateNotificationsForApp(); } @@ -195,6 +204,8 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog super.onStop(); visiblePackageName = null; + getContentResolver().unregisterContentObserver(appObserver); + // When leaving the app details, make sure to refresh app status for this app, since // we might want to show notifications for it now. updateNotificationsForApp(); @@ -432,7 +443,9 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog case Installer.ACTION_INSTALL_COMPLETE: adapter.clearProgress(); unregisterInstallReceiver(); - onAppChanged(); + // Don't try and update the view here, because the InstalledAppProviderService + // hasn't had time to do its thing and mark the app as installed. Instead, we + // wait for that service to notify us, and then we will respond in appObserver. break; case Installer.ACTION_INSTALL_INTERRUPTED: adapter.clearProgress(); @@ -655,4 +668,26 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog } startUninstall(); } + + // observer to update view when package has been installed/deleted + private AppObserver appObserver; + + class AppObserver extends ContentObserver { + + AppObserver(Handler handler) { + super(handler); + } + + @Override + public void onChange(boolean selfChange) { + onChange(selfChange, null); + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + onAppChanged(); + } + + } + }