Merge "Syncronosuly notify SelectPrinterActivity about changes to enabled print services"

This commit is contained in:
Philip P. Moltmann
2015-11-26 00:36:55 +00:00
committed by Android (Google) Code Review
2 changed files with 56 additions and 6 deletions

View File

@@ -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) {
@@ -243,6 +282,12 @@ public final class SelectPrinterActivity extends Activity {
super.onPause();
}
@Override
public void onStop() {
unregisterServiceMonitorIfNeeded();
super.onStop();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_add_printer) {

View File

@@ -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 {