diff options
| author | 2015-11-25 13:35:41 -0800 | |
|---|---|---|
| committer | 2015-11-25 16:28:34 -0800 | |
| commit | 03755a1f12390be9ddfcce8c5ad3f887fa5ccf9f (patch) | |
| tree | bbd21737e0509d698f2f1eb9dec4f6b7a850daf4 | |
| parent | 387aac6ad7bde21f2c2510cb8a2f3af3959721e0 (diff) | |
Syncronosuly notify SelectPrinterActivity about changes to enabled print
services
If the SelectPrinterActivity is visible it shows different emptyState
depending on if there are print services available or not. Hence the
activity has to listen to changes to the list of enabled services.
This also fixes a small syncronsation problem if two observers are
registered for the enabled print services.
Bug: 25666802
Change-Id: I79af66f25f10e66347b48ce9bb99c1657b30a8dd
| -rw-r--r-- | packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java | 57 | ||||
| -rw-r--r-- | services/print/java/com/android/server/print/PrintManagerService.java | 5 |
2 files changed, 56 insertions, 6 deletions
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java index f4c15bd0690a..ab0b2f1acf85 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java @@ -33,10 +33,12 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; +import android.database.ContentObserver; import android.database.DataSetObserver; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; import android.print.PrintManager; import android.print.PrinterId; import android.print.PrinterInfo; @@ -84,9 +86,7 @@ public final class SelectPrinterActivity extends Activity { private static final String EXTRA_PRINTER_ID = "EXTRA_PRINTER_ID"; - /** - * If there are any enabled print services - */ + /** If there are any enabled print services */ private boolean mHasEnabledPrintServices; private final ArrayList<PrintServiceInfo> mAddPrinterServices = @@ -98,6 +98,9 @@ public final class SelectPrinterActivity extends Activity { private AnnounceFilterResult mAnnounceFilterResult; + /** Monitor if new print services get enabled or disabled */ + private ContentObserver mPrintServicesObserver; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -227,14 +230,50 @@ public final class SelectPrinterActivity extends Activity { return false; } - @Override - public void onResume() { - super.onResume(); + /** + * Adjust the UI if the enabled print services changed. + */ + private synchronized void onPrintServicesUpdate() { updateServicesWithAddPrinterActivity(); updateEmptyView((DestinationAdapter)mListView.getAdapter()); invalidateOptionsMenu(); } + /** + * Register listener for changes to the enabled print services. + */ + private void registerServiceMonitor() { + mPrintServicesObserver = new ContentObserver(new Handler()) { + @Override + public void onChange(boolean selfChange) { + onPrintServicesUpdate(); + } + }; + + getContentResolver().registerContentObserver( + Settings.Secure.getUriFor(Settings.Secure.ENABLED_PRINT_SERVICES), false, + mPrintServicesObserver); + } + + /** + * Unregister {@link #mPrintServicesObserver listener for changes to the enabled print services} + * or nothing if the listener is not registered. + */ + private void unregisterServiceMonitorIfNeeded() { + if (mPrintServicesObserver != null) { + getContentResolver().unregisterContentObserver(mPrintServicesObserver); + + mPrintServicesObserver = null; + } + } + + @Override + public void onStart() { + super.onStart(); + registerServiceMonitor(); + onPrintServicesUpdate(); + } + @Override public void onPause() { if (mAnnounceFilterResult != null) { @@ -244,6 +283,12 @@ public final class SelectPrinterActivity extends Activity { } @Override + public void onStop() { + unregisterServiceMonitorIfNeeded(); + super.onStop(); + } + + @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.action_add_printer) { showAddPrinterSelectionDialog(); diff --git a/services/print/java/com/android/server/print/PrintManagerService.java b/services/print/java/com/android/server/print/PrintManagerService.java index 92bd81fd0fd6..0a8c014c4d37 100644 --- a/services/print/java/com/android/server/print/PrintManagerService.java +++ b/services/print/java/com/android/server/print/PrintManagerService.java @@ -228,6 +228,11 @@ public final class PrintManagerService extends SystemService { return null; } userState = getOrCreateUserStateLocked(resolvedUserId); + + // The user state might be updated via the same observer-set as the caller of this + // interface. If the caller is called back first the user state is not yet updated + // and the user gets and inconsistent view. Hence force an update. + userState.updateIfNeededLocked(); } final long identity = Binder.clearCallingIdentity(); try { |