summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Philip P. Moltmann <moltmann@google.com> 2015-11-25 13:35:41 -0800
committer Philip P. Moltmann <moltmann@google.com> 2015-11-25 16:28:34 -0800
commit03755a1f12390be9ddfcce8c5ad3f887fa5ccf9f (patch)
treebbd21737e0509d698f2f1eb9dec4f6b7a850daf4
parent387aac6ad7bde21f2c2510cb8a2f3af3959721e0 (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.java57
-rw-r--r--services/print/java/com/android/server/print/PrintManagerService.java5
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 {