diff --git a/core/java/android/print/PrinterDiscoverySession.java b/core/java/android/print/PrinterDiscoverySession.java index c6dbc1664b304..6432a376d8ca5 100644 --- a/core/java/android/print/PrinterDiscoverySession.java +++ b/core/java/android/print/PrinterDiscoverySession.java @@ -192,22 +192,46 @@ public final class PrinterDiscoverySession { } } - private void handlePrintersAdded(List printers) { + private void handlePrintersAdded(List addedPrinters) { if (isDestroyed()) { return; } - boolean printersChanged = false; - final int addedPrinterCount = printers.size(); - for (int i = 0; i < addedPrinterCount; i++) { - PrinterInfo addedPrinter = printers.get(i); - PrinterInfo oldPrinter = mPrinters.put(addedPrinter.getId(), addedPrinter); - if (oldPrinter == null || !oldPrinter.equals(addedPrinter)) { - printersChanged = true; + + // No old printers - do not bother keeping their position. + if (mPrinters.isEmpty()) { + final int printerCount = addedPrinters.size(); + for (int i = 0; i < printerCount; i++) { + PrinterInfo printer = addedPrinters.get(i); + mPrinters.put(printer.getId(), printer); + } + notifyOnPrintersChanged(); + return; + } + + // Add the printers to a map. + ArrayMap addedPrintersMap = + new ArrayMap(); + final int printerCount = addedPrinters.size(); + for (int i = 0; i < printerCount; i++) { + PrinterInfo printer = addedPrinters.get(i); + addedPrintersMap.put(printer.getId(), printer); + } + + // Update printers we already have. + final int oldPrinterCount = mPrinters.size(); + for (int i = 0; i < oldPrinterCount; i++) { + PrinterId oldPrinterId = mPrinters.keyAt(i); + PrinterInfo updatedPrinter = addedPrintersMap.remove(oldPrinterId); + if (updatedPrinter != null) { + mPrinters.put(oldPrinterId, updatedPrinter); } } - if (printersChanged) { - notifyOnPrintersChanged(); - } + + // Add the new printers, i.e. what is left. + mPrinters.putAll(addedPrintersMap); + + // Announce the change. + notifyOnPrintersChanged(); } private void handlePrintersRemoved(List printerIds) { diff --git a/packages/PrintSpooler/Android.mk b/packages/PrintSpooler/Android.mk index f65fe4b7c64ba..9e7b969ce1b34 100644 --- a/packages/PrintSpooler/Android.mk +++ b/packages/PrintSpooler/Android.mk @@ -24,7 +24,4 @@ LOCAL_PACKAGE_NAME := PrintSpooler LOCAL_JAVA_LIBRARIES := framework-base -LOCAL_PROGUARD_ENABLED := disabled - include $(BUILD_PACKAGE) - diff --git a/packages/PrintSpooler/res/layout/printer_dropdown_item.xml b/packages/PrintSpooler/res/layout/printer_dropdown_item.xml new file mode 100644 index 0000000000000..6439b49acc9d5 --- /dev/null +++ b/packages/PrintSpooler/res/layout/printer_dropdown_item.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java index 8d11a9392d0f6..b6ef7b1a27567 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java @@ -75,11 +75,10 @@ import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.EditText; +import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; -import libcore.io.IoUtils; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -96,6 +95,8 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; +import libcore.io.IoUtils; + /** * Activity for configuring a print job. */ @@ -2066,11 +2067,12 @@ public class PrintJobConfigActivity extends Activity { public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = getLayoutInflater().inflate( - R.layout.spinner_dropdown_item, parent, false); + R.layout.printer_dropdown_item, parent, false); } CharSequence title = null; CharSequence subtitle = null; + Drawable icon = null; if (mPrinters.isEmpty()) { if (position == 0) { @@ -2092,6 +2094,7 @@ public class PrintJobConfigActivity extends Activity { PackageInfo packageInfo = getPackageManager().getPackageInfo( printer.getId().getServiceName().getPackageName(), 0); subtitle = packageInfo.applicationInfo.loadLabel(getPackageManager()); + icon = packageInfo.applicationInfo.loadIcon(getPackageManager()); } catch (NameNotFoundException nnfe) { /* ignore */ } @@ -2110,6 +2113,14 @@ public class PrintJobConfigActivity extends Activity { subtitleView.setVisibility(View.GONE); } + ImageView iconView = (ImageView) convertView.findViewById(R.id.icon); + if (icon != null) { + iconView.setImageDrawable(icon); + iconView.setVisibility(View.VISIBLE); + } else { + iconView.setVisibility(View.GONE); + } + return convertView; }