Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1e40a1e0 authored by Svetoslav Ganov's avatar Svetoslav Ganov Committed by Android Git Automerger
Browse files

am 107218d7: am f5293b6b: Merge "The printers in print dialog should not...

am 107218d7: am f5293b6b: Merge "The printers in print dialog should not change position." into klp-dev

* commit '107218d7':
  The printers in print dialog should not change position.
parents 0a675ae8 107218d7
Loading
Loading
Loading
Loading
+45 −32
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Loader;
import android.os.AsyncTask;
import android.os.Build;
import android.print.PrintManager;
import android.print.PrinterDiscoverySession;
import android.print.PrinterDiscoverySession.OnPrintersChangeListener;
@@ -34,8 +33,6 @@ import android.util.Xml;

import com.android.internal.util.FastXmlSerializer;

import libcore.io.IoUtils;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
@@ -50,6 +47,8 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;

import libcore.io.IoUtils;

/**
 * This class is responsible for loading printers by doing discovery
 * and merging the discovered printers with the previously used ones.
@@ -86,38 +85,44 @@ public class FusedPrintersProvider extends Loader<List<PrinterInfo>> {
        mPersistenceManager.addPrinterAndWritePrinterHistory(printer);
    }

    private void computeAndDeliverResult() {
    private void computeAndDeliverResult(Map<PrinterId, PrinterInfo> discoveredPrinters) {
        if (!isStarted()) {
            return;
        }

        List<PrinterInfo> printers = new ArrayList<PrinterInfo>();

        // We want the first few favorite printers on top of the list.
        final int favoriteCount = Math.min(mFavoritePrinters.size(),
                MAX_FAVORITE_PRINTER_COUNT);
        for (int i = 0; i < favoriteCount; i++) {
            printers.add(mFavoritePrinters.get(i));
        // Add the updated favorite printers.
        final int favoritePrinterCount = mFavoritePrinters.size();
        for (int i = 0; i < favoritePrinterCount; i++) {
            PrinterInfo favoritePrinter = mFavoritePrinters.get(i);
            PrinterInfo updatedPrinter = discoveredPrinters.remove(
                    favoritePrinter.getId());
            if (updatedPrinter != null) {
                printers.add(updatedPrinter);
            } else {
                printers.add(favoritePrinter);
            }
        }

        // Add discovered printers updating favorites if needed.
        // Add other updated printers.
        final int printerCount = mPrinters.size();
        for (int i = 0; i < printerCount; i++) {
            PrinterInfo discoveredPrinter = mPrinters.get(i);
            boolean printerHandled = false;
            for (int j = 0; j< favoriteCount; j++) {
                PrinterInfo favoritePrinter = printers.get(j);
                if (favoritePrinter.getId().equals(discoveredPrinter.getId())) {
                    printers.set(j, discoveredPrinter);
                    printerHandled = true;
                    break;
                }
            }
            if (!printerHandled) {
                printers.add(discoveredPrinter);
            PrinterInfo printer = mPrinters.get(i);
            PrinterInfo updatedPrinter = discoveredPrinters.remove(
                    printer.getId());
            if (updatedPrinter != null) {
                printers.add(updatedPrinter);
            }
        }

        // Add the new printers, i.e. what is left.
        printers.addAll(discoveredPrinters.values());

        // Update the list of printers.
        mPrinters.clear();
        mPrinters.addAll(printers);

        // Deliver the printers.
        deliverResult(printers);
    }
@@ -129,8 +134,8 @@ public class FusedPrintersProvider extends Loader<List<PrinterInfo>> {
        }
        // The contract is that if we already have a valid,
        // result the we have to deliver it immediately.
        if (!mPrinters.isEmpty() || !mFavoritePrinters.isEmpty()) {
            computeAndDeliverResult();
        if (!mPrinters.isEmpty()) {
            deliverResult(new ArrayList<PrinterInfo>(mPrinters));
        }
        // Always load the data to ensure discovery period is
        // started and to make sure obsolete printers are updated.
@@ -161,17 +166,22 @@ public class FusedPrintersProvider extends Loader<List<PrinterInfo>> {
            mDiscoverySession.setOnPrintersChangeListener(new OnPrintersChangeListener() {
                @Override
                public void onPrintersChanged() {
                    mPrinters.clear();
                    mPrinters.addAll(mDiscoverySession.getPrinters());
                    computeAndDeliverResult();
                    ArrayMap<PrinterId, PrinterInfo> printersMap =
                            new ArrayMap<PrinterId, PrinterInfo>();
                    List<PrinterInfo> printers = mDiscoverySession.getPrinters();
                    final int printerCount = printers.size();
                    for (int i = 0; i < printerCount; i++) {
                        PrinterInfo printer = printers.get(i);
                        printersMap.put(printer.getId(), printer);
                    }
                    computeAndDeliverResult(printersMap);
                }
            });
            mPersistenceManager.readPrinterHistory();
        }
        if (mPersistenceManager.isReadHistoryCompleted()
                && !mDiscoverySession.isPrinterDiscoveryStarted()) {
            final int favoriteCount = Math.min(MAX_FAVORITE_PRINTER_COUNT,
                    mFavoritePrinters.size());
            final int favoriteCount = mFavoritePrinters.size();
            List<PrinterId> printerIds = new ArrayList<PrinterId>(favoriteCount);
            for (int i = 0; i < favoriteCount; i++) {
                printerIds.add(mFavoritePrinters.get(i).getId());
@@ -322,7 +332,8 @@ public class FusedPrintersProvider extends Loader<List<PrinterInfo>> {
            Collections.sort(favoriteRecords);

            // Write the favorites to the output.
            final int favoriteCount = favoriteRecords.size();
            final int favoriteCount = Math.min(favoriteRecords.size(),
                    MAX_FAVORITE_PRINTER_COUNT);
            List<PrinterInfo> favoritePrinters = new ArrayList<PrinterInfo>(favoriteCount);
            for (int i = 0; i < favoriteCount; i++) {
                PrinterInfo printer = favoriteRecords.get(i).printer;
@@ -362,13 +373,15 @@ public class FusedPrintersProvider extends Loader<List<PrinterInfo>> {
                mHistoricalPrinters = printers;

                // Compute the favorite printers.
                mFavoritePrinters.addAll(computeFavoritePrinters(printers));
                mFavoritePrinters.clear();
                mFavoritePrinters.addAll(computeFavoritePrinters(mHistoricalPrinters));

                mReadHistoryInProgress = false;
                mReadHistoryCompleted = true;

                // Deliver the favorites.
                computeAndDeliverResult();
                Map<PrinterId, PrinterInfo> discoveredPrinters = Collections.emptyMap();
                computeAndDeliverResult(discoveredPrinters);

                // Start loading the available printers.
                loadInternal();