Search in sources :

Example 16 with PrinterId

use of android.print.PrinterId in project platform_frameworks_base by android.

the class PrinterDiscoverySession method sendOutOfDiscoveryPeriodPrinterChanges.

private void sendOutOfDiscoveryPeriodPrinterChanges() {
    // Noting changed since the last discovery period - nothing to do.
    if (mLastSentPrinters == null || mLastSentPrinters.isEmpty()) {
        mLastSentPrinters = null;
        return;
    }
    // Determine the added printers.
    List<PrinterInfo> addedPrinters = null;
    for (PrinterInfo printer : mPrinters.values()) {
        PrinterInfo sentPrinter = mLastSentPrinters.get(printer.getId());
        if (sentPrinter == null || !sentPrinter.equals(printer)) {
            if (addedPrinters == null) {
                addedPrinters = new ArrayList<PrinterInfo>();
            }
            addedPrinters.add(printer);
        }
    }
    // Send the added printers, if such.
    if (addedPrinters != null) {
        try {
            mObserver.onPrintersAdded(new ParceledListSlice<PrinterInfo>(addedPrinters));
        } catch (RemoteException re) {
            Log.e(LOG_TAG, "Error sending added printers", re);
        }
    }
    // Determine the removed printers.
    List<PrinterId> removedPrinterIds = null;
    for (PrinterInfo sentPrinter : mLastSentPrinters.values()) {
        if (!mPrinters.containsKey(sentPrinter.getId())) {
            if (removedPrinterIds == null) {
                removedPrinterIds = new ArrayList<PrinterId>();
            }
            removedPrinterIds.add(sentPrinter.getId());
        }
    }
    // Send the removed printers, if such.
    if (removedPrinterIds != null) {
        try {
            mObserver.onPrintersRemoved(new ParceledListSlice<PrinterId>(removedPrinterIds));
        } catch (RemoteException re) {
            Log.e(LOG_TAG, "Error sending removed printers", re);
        }
    }
    mLastSentPrinters = null;
}
Also used : PrinterId(android.print.PrinterId) PrinterInfo(android.print.PrinterInfo) RemoteException(android.os.RemoteException)

Example 17 with PrinterId

use of android.print.PrinterId in project platform_frameworks_base by android.

the class PrinterDiscoverySession method removePrinters.

/**
     * Removes added printers. Removing an already removed or never added
     * printer has no effect. Removed printers can be added again. You can
     * call this method multiple times during the lifetime of this session.
     * <p>
     * <strong>Note: </strong> Calls to this method after the session is
     * destroyed, that is after the {@link #onDestroy()} callback, will be ignored.
     * </p>
     *
     * @param printerIds The ids of the removed printers.
     *
     * @see #addPrinters(List)
     * @see #getPrinters()
     * @see #isDestroyed()
     */
public final void removePrinters(@NonNull List<PrinterId> printerIds) {
    PrintService.throwIfNotCalledOnMainThread();
    // If the session is destroyed - nothing do to.
    if (mIsDestroyed) {
        Log.w(LOG_TAG, "Not removing printers - session destroyed.");
        return;
    }
    if (mIsDiscoveryStarted) {
        // If during discovery, remove existing printers and send them.
        List<PrinterId> removedPrinterIds = new ArrayList<PrinterId>();
        final int removedPrinterIdCount = printerIds.size();
        for (int i = 0; i < removedPrinterIdCount; i++) {
            PrinterId removedPrinterId = printerIds.get(i);
            if (mPrinters.remove(removedPrinterId) != null) {
                removedPrinterIds.add(removedPrinterId);
            }
        }
        // Send the removed printers, if such.
        if (!removedPrinterIds.isEmpty()) {
            try {
                mObserver.onPrintersRemoved(new ParceledListSlice<PrinterId>(removedPrinterIds));
            } catch (RemoteException re) {
                Log.e(LOG_TAG, "Error sending removed printers", re);
            }
        }
    } else {
        // Remember the last sent printers if needed.
        if (mLastSentPrinters == null) {
            mLastSentPrinters = new ArrayMap<PrinterId, PrinterInfo>(mPrinters);
        }
        // Update the printers.
        final int removedPrinterIdCount = printerIds.size();
        for (int i = 0; i < removedPrinterIdCount; i++) {
            PrinterId removedPrinterId = printerIds.get(i);
            mPrinters.remove(removedPrinterId);
        }
    }
}
Also used : ArrayList(java.util.ArrayList) PrinterId(android.print.PrinterId) RemoteException(android.os.RemoteException) PrinterInfo(android.print.PrinterInfo)

Example 18 with PrinterId

use of android.print.PrinterId in project platform_frameworks_base by android.

the class FusedPrintersProvider method loadInternal.

private void loadInternal() {
    if (mDiscoverySession == null) {
        PrintManager printManager = (PrintManager) getContext().getSystemService(Context.PRINT_SERVICE);
        mDiscoverySession = printManager.createPrinterDiscoverySession();
        mPersistenceManager.readPrinterHistory();
    } else if (mPersistenceManager.isHistoryChanged()) {
        mPersistenceManager.readPrinterHistory();
    }
    if (mPersistenceManager.isReadHistoryCompleted() && !mDiscoverySession.isPrinterDiscoveryStarted()) {
        mDiscoverySession.setOnPrintersChangeListener(new OnPrintersChangeListener() {

            @Override
            public void onPrintersChanged() {
                if (DEBUG) {
                    Log.i(LOG_TAG, "onPrintersChanged() count:" + mDiscoverySession.getPrinters().size() + " " + FusedPrintersProvider.this.hashCode());
                }
                updatePrinters(mDiscoverySession.getPrinters(), mFavoritePrinters, getCurrentLocation());
            }
        });
        final int favoriteCount = mFavoritePrinters.size();
        List<PrinterId> printerIds = new ArrayList<>(favoriteCount);
        for (int i = 0; i < favoriteCount; i++) {
            printerIds.add(mFavoritePrinters.get(i).first.getId());
        }
        mDiscoverySession.startPrinterDiscovery(printerIds);
        List<PrinterInfo> printers = mDiscoverySession.getPrinters();
        updatePrinters(printers, mFavoritePrinters, getCurrentLocation());
    }
}
Also used : OnPrintersChangeListener(android.print.PrinterDiscoverySession.OnPrintersChangeListener) ArrayList(java.util.ArrayList) PrinterId(android.print.PrinterId) PrintManager(android.print.PrintManager) PrinterInfo(android.print.PrinterInfo)

Example 19 with PrinterId

use of android.print.PrinterId in project platform_frameworks_base by android.

the class FusedPrintersProvider method computeAndDeliverResult.

/**
     * Compute the printers, order them appropriately and deliver the printers to the clients. We
     * prefer printers that have been previously used (favorites) and printers that have been used
     * previously close to the current location (near printers).
     *
     * @param discoveredPrinters All printers currently discovered by the print discovery session.
     * @param favoritePrinters The ordered list of printers. The earlier in the list, the more
     *            preferred.
     */
private void computeAndDeliverResult(Map<PrinterId, PrinterInfo> discoveredPrinters, List<Pair<PrinterInfo, Location>> favoritePrinters) {
    List<PrinterInfo> printers = new ArrayList<>();
    // Store the printerIds that have already been added. We cannot compare the printerInfos in
    // "printers" as they might have been taken from discoveredPrinters and the printerInfo does
    // not equals() anymore
    HashSet<PrinterId> alreadyAddedPrinter = new HashSet<>(MAX_FAVORITE_PRINTER_COUNT);
    Location location = getCurrentLocation();
    // Add the favorite printers that have last been used close to the current location
    final int favoritePrinterCount = favoritePrinters.size();
    if (location != null) {
        for (int i = 0; i < favoritePrinterCount; i++) {
            // Only add a certain amount of favorite printers
            if (printers.size() == MAX_FAVORITE_PRINTER_COUNT) {
                break;
            }
            PrinterInfo favoritePrinter = favoritePrinters.get(i).first;
            Location printerLocation = favoritePrinters.get(i).second;
            if (printerLocation != null && !alreadyAddedPrinter.contains(favoritePrinter.getId())) {
                if (printerLocation.distanceTo(location) <= MAX_PRINTER_DISTANCE) {
                    updateAndAddPrinter(printers, favoritePrinter, discoveredPrinters);
                    alreadyAddedPrinter.add(favoritePrinter.getId());
                }
            }
        }
    }
    // Add the other favorite printers
    for (int i = 0; i < favoritePrinterCount; i++) {
        // Only add a certain amount of favorite printers
        if (printers.size() == MAX_FAVORITE_PRINTER_COUNT) {
            break;
        }
        PrinterInfo favoritePrinter = favoritePrinters.get(i).first;
        if (!alreadyAddedPrinter.contains(favoritePrinter.getId())) {
            updateAndAddPrinter(printers, favoritePrinter, discoveredPrinters);
            alreadyAddedPrinter.add(favoritePrinter.getId());
        }
    }
    // Add other updated printers. Printers that have already been added have been removed from
    // discoveredPrinters in the calls to updateAndAddPrinter
    final int printerCount = mPrinters.size();
    for (int i = 0; i < printerCount; i++) {
        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);
    if (isStarted()) {
        // If stated deliver the new printers.
        deliverResult(printers);
    } else {
        // Otherwise, take a note for the change.
        onContentChanged();
    }
}
Also used : ArrayList(java.util.ArrayList) PrinterId(android.print.PrinterId) PrinterInfo(android.print.PrinterInfo) HashSet(java.util.HashSet) Location(android.location.Location)

Example 20 with PrinterId

use of android.print.PrinterId in project platform_frameworks_base by android.

the class FusedPrintersProvider method updatePrinters.

private void updatePrinters(List<PrinterInfo> printers, List<Pair<PrinterInfo, Location>> favoritePrinters, Location location) {
    if (mPrintersUpdatedBefore && mPrinters.equals(printers) && mFavoritePrinters.equals(favoritePrinters) && Objects.equals(mLocationOfLastPrinterUpdate, location)) {
        return;
    }
    mLocationOfLastPrinterUpdate = location;
    mPrintersUpdatedBefore = true;
    // Some of the found printers may have be a printer that is in the
    // history but with its properties changed. Hence, we try to update the
    // printer to use its current properties instead of the historical one.
    mPersistenceManager.updateHistoricalPrintersIfNeeded(printers);
    Map<PrinterId, PrinterInfo> printersMap = new LinkedHashMap<>();
    final int printerCount = printers.size();
    for (int i = 0; i < printerCount; i++) {
        PrinterInfo printer = printers.get(i);
        printersMap.put(printer.getId(), printer);
    }
    computeAndDeliverResult(printersMap, favoritePrinters);
}
Also used : PrinterId(android.print.PrinterId) PrinterInfo(android.print.PrinterInfo) LinkedHashMap(java.util.LinkedHashMap)

Aggregations

PrinterId (android.print.PrinterId)49 PrinterInfo (android.print.PrinterInfo)30 RemoteException (android.os.RemoteException)15 ArrayList (java.util.ArrayList)15 ComponentName (android.content.ComponentName)14 PrintJobInfo (android.print.PrintJobInfo)14 NonNull (android.annotation.NonNull)5 Location (android.location.Location)5 PrintManager (android.print.PrintManager)5 OnPrintersChangeListener (android.print.PrinterDiscoverySession.OnPrintersChangeListener)5 HashSet (java.util.HashSet)5 LinkedHashMap (java.util.LinkedHashMap)5