diff options
| author | 2013-10-02 12:23:12 -0700 | |
|---|---|---|
| committer | 2013-10-02 12:23:12 -0700 | |
| commit | cea40b25bd47aff5db8f5651d7e62c89c3ee9d88 (patch) | |
| tree | 864bfd06214a528878d3f9512a441bc635784842 | |
| parent | e8a7bcde5853071f68af89329b751c7c030ecd26 (diff) | |
| parent | 7f0e8be082590dadb8606f71f4b9b28b88851360 (diff) | |
am 7f0e8be0: am c114e19c: am 228a7d2a: Merge "Sometimes printer selection from all printers activity does not work." into klp-dev
* commit '7f0e8be082590dadb8606f71f4b9b28b88851360':
  Sometimes printer selection from all printers activity does not work.
| -rw-r--r-- | packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java | 132 | 
1 files changed, 96 insertions, 36 deletions
| diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java index 44362d4ab85f..847411527615 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java @@ -56,6 +56,7 @@ import android.text.Editable;  import android.text.TextUtils;  import android.text.TextUtils.SimpleStringSplitter;  import android.text.TextWatcher; +import android.util.ArrayMap;  import android.util.ArraySet;  import android.util.AttributeSet;  import android.util.Log; @@ -735,8 +736,12 @@ public class PrintJobConfigActivity extends Activity {                  if (resultCode == RESULT_OK) {                      PrinterId printerId = (PrinterId) data.getParcelableExtra(                              INTENT_EXTRA_PRINTER_ID); -                    mEditor.selectPrinter(printerId); +                    if (printerId != null) { +                        mEditor.ensurePrinterSelected(printerId); +                        break; +                    }                  } +                mEditor.ensureCurrentPrinterSelected();              } break;          }      } @@ -817,6 +822,8 @@ public class PrintJobConfigActivity extends Activity {          private Button mPrintButton; +        private PrinterId mNextPrinterId; +          private PrinterInfo mCurrentPrinter;          private final OnItemSelectedListener mOnItemSelectedListener = @@ -830,10 +837,6 @@ public class PrintJobConfigActivity extends Activity {                      }                      if (id == DEST_ADAPTER_ITEM_ID_ALL_PRINTERS) { -                        // The selection changed to the all printers item. We -                        // want to select back the last selected printer. -                        mIgnoreNextDestinationChange = true; -                        mEditor.selectPrinter(mCurrentPrinter.getId());                          startSelectPrinterActivity();                          return;                      } @@ -1157,6 +1160,13 @@ public class PrintJobConfigActivity extends Activity {                          mDestinationSpinner.setSelection(0);                      } +                    // If there is a next printer to select and we succeed selecting +                    // it - done. Let the selection handling code make everything right. +                    if (mNextPrinterId != null && selectPrinter(mNextPrinterId)) { +                        mNextPrinterId = null; +                        return; +                    } +                      // If the current printer properties changed, we update the UI.                      if (mCurrentPrinter != null) {                          final int printerCount = mDestinationSpinnerAdapter.getCount(); @@ -1299,10 +1309,32 @@ public class PrintJobConfigActivity extends Activity {              }          } -        public void selectPrinter(PrinterId printerId) { -            mDestinationSpinnerAdapter.ensurePrinterShownPrinterShown(printerId); +        public void ensurePrinterSelected(PrinterId printerId) { +            // If the printer is not present maybe the loader is not +            // updated yet. In this case make a note and as soon as +            // the printer appears will will select it. +            if (!selectPrinter(printerId)) { +                mNextPrinterId = printerId; +            } +        } + +        public boolean selectPrinter(PrinterId printerId) { +            mDestinationSpinnerAdapter.ensurePrinterInVisibleAdapterPosition(printerId);              final int position = mDestinationSpinnerAdapter.getPrinterIndex(printerId); -            mDestinationSpinner.setSelection(position); +            if (position != AdapterView.INVALID_POSITION +                    && position != mDestinationSpinner.getSelectedItemPosition()) { +                Object item = mDestinationSpinnerAdapter.getItem(position); +                mCurrentPrinter = (PrinterInfo) item; +                mDestinationSpinner.setSelection(position); +                return true; +            } +            return false; +        } + +        public void ensureCurrentPrinterSelected() { +            if (mCurrentPrinter != null) { +                selectPrinter(mCurrentPrinter.getId()); +            }          }          public boolean isPrintingToPdf() { @@ -2015,8 +2047,6 @@ public class PrintJobConfigActivity extends Activity {              private final PrinterInfo mFakePdfPrinter; -            private PrinterId mLastShownPrinterId; -              public DestinationAdapter() {                  getLoaderManager().initLoader(LOADER_ID_PRINTERS_LOADER, null, this);                  mFakePdfPrinter = createFakePdfPrinter(); @@ -2032,9 +2062,23 @@ public class PrintJobConfigActivity extends Activity {                  return AdapterView.INVALID_POSITION;              } -            public void ensurePrinterShownPrinterShown(PrinterId printerId) { -                mLastShownPrinterId = printerId; -                ensureLastShownPrinterInPosition(); +            public void ensurePrinterInVisibleAdapterPosition(PrinterId printerId) { +                final int printerCount = mPrinters.size(); +                for (int i = 0; i < printerCount; i++) { +                    PrinterInfo printer = (PrinterInfo) mPrinters.get(i); +                    if (printer.getId().equals(printerId)) { +                        // If already in the list - do nothing. +                        if (i < getCount() - 2) { +                            return; +                        } +                        // Else replace the last one (two items are not printers). +                        final int lastPrinterIndex = getCount() - 3; +                        mPrinters.set(i, mPrinters.get(lastPrinterIndex)); +                        mPrinters.set(lastPrinterIndex, printer); +                        notifyDataSetChanged(); +                        return; +                    } +                }              }              @Override @@ -2172,9 +2216,46 @@ public class PrintJobConfigActivity extends Activity {              @Override              public void onLoadFinished(Loader<List<PrinterInfo>> loader,                      List<PrinterInfo> printers) { +                // We rearrange the printers if the user selects a printer +                // not shown in the initial short list. Therefore, we have +                // to keep the printer order. + +                // No old printers - do not bother keeping their position. +                if (mPrinters.isEmpty()) { +                    mPrinters.addAll(printers); +                    mEditor.ensureCurrentPrinterSelected(); +                    notifyDataSetChanged(); +                    return; +                } + +                // Add the new printers to a map. +                ArrayMap<PrinterId, PrinterInfo> newPrintersMap = +                        new ArrayMap<PrinterId, PrinterInfo>(); +                final int printerCount = printers.size(); +                for (int i = 0; i < printerCount; i++) { +                    PrinterInfo printer = printers.get(i); +                    newPrintersMap.put(printer.getId(), printer); +                } + +                List<PrinterInfo> newPrinters = new ArrayList<PrinterInfo>(); + +                // Update printers we already have. +                final int oldPrinterCount = mPrinters.size(); +                for (int i = 0; i < oldPrinterCount; i++) { +                    PrinterId oldPrinterId = mPrinters.get(i).getId(); +                    PrinterInfo updatedPrinter = newPrintersMap.remove(oldPrinterId); +                    if (updatedPrinter != null) { +                        newPrinters.add(updatedPrinter); +                    } +                } + +                // Add the rest of the new printers, i.e. what is left. +                newPrinters.addAll(newPrintersMap.values()); +                  mPrinters.clear(); -                mPrinters.addAll(printers); -                ensureLastShownPrinterInPosition(); +                mPrinters.addAll(newPrinters); + +                mEditor.ensureCurrentPrinterSelected();                  notifyDataSetChanged();              } @@ -2184,27 +2265,6 @@ public class PrintJobConfigActivity extends Activity {                  notifyDataSetInvalidated();              } -            private void ensureLastShownPrinterInPosition() { -                if (mLastShownPrinterId == null) { -                    return; -                } -                final int printerCount = mPrinters.size(); -                for (int i = 0; i < printerCount; i++) { -                    PrinterInfo printer = (PrinterInfo) mPrinters.get(i); -                    if (printer.getId().equals(mLastShownPrinterId)) { -                        // If already in the list - do nothing. -                        if (i < getCount() - 2) { -                            return; -                        } -                        // Else replace the last one. -                        final int lastPrinter = getCount() - 2; -                        mPrinters.set(i, mPrinters.get(lastPrinter - 1)); -                        mPrinters.set(lastPrinter - 1, printer); -                        return; -                    } -                } -            } -              private PrinterInfo createFakePdfPrinter() {                  final MediaSize defaultMediaSize;                  String currentCountry = getResources().getConfiguration().locale.getCountry(); |