From c335eb411503154cf475903eb6c5c67575769112 Mon Sep 17 00:00:00 2001 From: Svetoslav Date: Thu, 26 Sep 2013 15:55:47 -0700 Subject: [PATCH] Printers in the list of printers change position. 1. The printers in the printers list of settings change position if they are updated. The settings app is using hidden platform APIs the this change fixes. 2. Enable ProGuard for the PrintSpooler. 3. Added icons on the list of printers so the user knows which print service used the printer. Now the user can know when he is using cloud print and maybe incurring data costs vs local printer discovered by a vendor plug in. bug:10955751 Change-Id: I292f48b424cb561218fdb424d0388f4d786d8339 --- .../print/PrinterDiscoverySession.java | 46 +++++++++--- packages/PrintSpooler/Android.mk | 3 - .../res/layout/printer_dropdown_item.xml | 70 +++++++++++++++++++ .../printspooler/PrintJobConfigActivity.java | 17 ++++- 4 files changed, 119 insertions(+), 17 deletions(-) create mode 100644 packages/PrintSpooler/res/layout/printer_dropdown_item.xml 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; }