Search in sources :

Example 16 with PrintAttributes

use of android.print.PrintAttributes in project android_frameworks_base by AOSPA.

the class PrintActivity method canUpdateDocument.

private boolean canUpdateDocument() {
    if (mPrintedDocument.isDestroyed()) {
        return false;
    }
    if (hasErrors()) {
        return false;
    }
    PrintAttributes attributes = mPrintJob.getAttributes();
    final int colorMode = attributes.getColorMode();
    if (colorMode != PrintAttributes.COLOR_MODE_COLOR && colorMode != PrintAttributes.COLOR_MODE_MONOCHROME) {
        return false;
    }
    if (attributes.getMediaSize() == null) {
        return false;
    }
    if (attributes.getMinMargins() == null) {
        return false;
    }
    if (attributes.getResolution() == null) {
        return false;
    }
    if (mCurrentPrinter == null) {
        return false;
    }
    PrinterCapabilitiesInfo capabilities = mCurrentPrinter.getCapabilities();
    if (capabilities == null) {
        return false;
    }
    if (mCurrentPrinter.getStatus() == PrinterInfo.STATUS_UNAVAILABLE) {
        return false;
    }
    return true;
}
Also used : PrinterCapabilitiesInfo(android.print.PrinterCapabilitiesInfo) PrintAttributes(android.print.PrintAttributes)

Example 17 with PrintAttributes

use of android.print.PrintAttributes in project android_frameworks_base by AOSPA.

the class RemotePrintDocument method update.

public boolean update(PrintAttributes attributes, PageRange[] pages, boolean preview) {
    boolean willUpdate;
    if (DEBUG) {
        Log.i(LOG_TAG, "[CALLED] update()");
    }
    if (hasUpdateError()) {
        throw new IllegalStateException("Cannot update without a clearing the failure");
    }
    if (mState == STATE_INITIAL || mState == STATE_FINISHED || mState == STATE_DESTROYED) {
        throw new IllegalStateException("Cannot update in state:" + stateToString(mState));
    }
    // We schedule a layout if the constraints changed.
    if (!mUpdateSpec.hasSameConstraints(attributes, preview)) {
        willUpdate = true;
        // cancellation and start over.
        if (mCurrentCommand != null && (mCurrentCommand.isRunning() || mCurrentCommand.isPending())) {
            mCurrentCommand.cancel(false);
        }
        // Schedule a layout command.
        PrintAttributes oldAttributes = mDocumentInfo.attributes != null ? mDocumentInfo.attributes : new PrintAttributes.Builder().build();
        AsyncCommand command = new LayoutCommand(mLooper, mPrintDocumentAdapter, mDocumentInfo, oldAttributes, attributes, preview, mCommandResultCallback);
        scheduleCommand(command);
        mState = STATE_UPDATING;
    // If no layout in progress and we don't have all pages - schedule a write.
    } else if ((!(mCurrentCommand instanceof LayoutCommand) || (!mCurrentCommand.isPending() && !mCurrentCommand.isRunning())) && pages != null && !PageRangeUtils.contains(mUpdateSpec.pages, pages, mDocumentInfo.info.getPageCount())) {
        willUpdate = true;
        // Cancel the current write as a new one is to be scheduled.
        if (mCurrentCommand instanceof WriteCommand && (mCurrentCommand.isPending() || mCurrentCommand.isRunning())) {
            mCurrentCommand.cancel(false);
        }
        // Schedule a write command.
        AsyncCommand command = new WriteCommand(mContext, mLooper, mPrintDocumentAdapter, mDocumentInfo, mDocumentInfo.info.getPageCount(), pages, mDocumentInfo.fileProvider, mCommandResultCallback);
        scheduleCommand(command);
        mState = STATE_UPDATING;
    } else {
        willUpdate = false;
        if (DEBUG) {
            Log.i(LOG_TAG, "[SKIPPING] No update needed");
        }
    }
    // Keep track of what is requested.
    mUpdateSpec.update(attributes, preview, pages);
    runPendingCommand();
    return willUpdate;
}
Also used : PrintAttributes(android.print.PrintAttributes)

Example 18 with PrintAttributes

use of android.print.PrintAttributes in project android_frameworks_base by AOSPA.

the class PrintActivity method updatePrintAttributesFromCapabilities.

private void updatePrintAttributesFromCapabilities(PrinterCapabilitiesInfo capabilities) {
    boolean clearRanges = false;
    PrintAttributes defaults = capabilities.getDefaults();
    // Sort the media sizes based on the current locale.
    List<MediaSize> sortedMediaSizes = new ArrayList<>(capabilities.getMediaSizes());
    Collections.sort(sortedMediaSizes, mMediaSizeComparator);
    PrintAttributes attributes = mPrintJob.getAttributes();
    // Media size.
    MediaSize currMediaSize = attributes.getMediaSize();
    if (currMediaSize == null) {
        clearRanges = true;
        attributes.setMediaSize(defaults.getMediaSize());
    } else {
        MediaSize newMediaSize = null;
        boolean isPortrait = currMediaSize.isPortrait();
        // Try to find the current media size in the capabilities as
        // it may be in a different orientation.
        MediaSize currMediaSizePortrait = currMediaSize.asPortrait();
        final int mediaSizeCount = sortedMediaSizes.size();
        for (int i = 0; i < mediaSizeCount; i++) {
            MediaSize mediaSize = sortedMediaSizes.get(i);
            if (currMediaSizePortrait.equals(mediaSize.asPortrait())) {
                newMediaSize = mediaSize;
                break;
            }
        }
        // If we did not find the current media size fall back to default.
        if (newMediaSize == null) {
            clearRanges = true;
            newMediaSize = defaults.getMediaSize();
        }
        if (newMediaSize != null) {
            if (isPortrait) {
                attributes.setMediaSize(newMediaSize.asPortrait());
            } else {
                attributes.setMediaSize(newMediaSize.asLandscape());
            }
        }
    }
    // Color mode.
    final int colorMode = attributes.getColorMode();
    if ((capabilities.getColorModes() & colorMode) == 0) {
        attributes.setColorMode(defaults.getColorMode());
    }
    // Duplex mode.
    final int duplexMode = attributes.getDuplexMode();
    if ((capabilities.getDuplexModes() & duplexMode) == 0) {
        attributes.setDuplexMode(defaults.getDuplexMode());
    }
    // Resolution
    Resolution resolution = attributes.getResolution();
    if (resolution == null || !capabilities.getResolutions().contains(resolution)) {
        attributes.setResolution(defaults.getResolution());
    }
    // Margins.
    if (!Objects.equals(attributes.getMinMargins(), defaults.getMinMargins())) {
        clearRanges = true;
    }
    attributes.setMinMargins(defaults.getMinMargins());
    if (clearRanges) {
        clearPageRanges();
    }
}
Also used : MediaSize(android.print.PrintAttributes.MediaSize) ArrayList(java.util.ArrayList) PrintAttributes(android.print.PrintAttributes) Resolution(android.print.PrintAttributes.Resolution)

Example 19 with PrintAttributes

use of android.print.PrintAttributes in project android_frameworks_base by ResurrectionRemix.

the class RemotePrintDocument method update.

public boolean update(PrintAttributes attributes, PageRange[] pages, boolean preview) {
    boolean willUpdate;
    if (DEBUG) {
        Log.i(LOG_TAG, "[CALLED] update()");
    }
    if (hasUpdateError()) {
        throw new IllegalStateException("Cannot update without a clearing the failure");
    }
    if (mState == STATE_INITIAL || mState == STATE_FINISHED || mState == STATE_DESTROYED) {
        throw new IllegalStateException("Cannot update in state:" + stateToString(mState));
    }
    // We schedule a layout if the constraints changed.
    if (!mUpdateSpec.hasSameConstraints(attributes, preview)) {
        willUpdate = true;
        // cancellation and start over.
        if (mCurrentCommand != null && (mCurrentCommand.isRunning() || mCurrentCommand.isPending())) {
            mCurrentCommand.cancel(false);
        }
        // Schedule a layout command.
        PrintAttributes oldAttributes = mDocumentInfo.attributes != null ? mDocumentInfo.attributes : new PrintAttributes.Builder().build();
        AsyncCommand command = new LayoutCommand(mLooper, mPrintDocumentAdapter, mDocumentInfo, oldAttributes, attributes, preview, mCommandResultCallback);
        scheduleCommand(command);
        mState = STATE_UPDATING;
    // If no layout in progress and we don't have all pages - schedule a write.
    } else if ((!(mCurrentCommand instanceof LayoutCommand) || (!mCurrentCommand.isPending() && !mCurrentCommand.isRunning())) && pages != null && !PageRangeUtils.contains(mUpdateSpec.pages, pages, mDocumentInfo.info.getPageCount())) {
        willUpdate = true;
        // Cancel the current write as a new one is to be scheduled.
        if (mCurrentCommand instanceof WriteCommand && (mCurrentCommand.isPending() || mCurrentCommand.isRunning())) {
            mCurrentCommand.cancel(false);
        }
        // Schedule a write command.
        AsyncCommand command = new WriteCommand(mContext, mLooper, mPrintDocumentAdapter, mDocumentInfo, mDocumentInfo.info.getPageCount(), pages, mDocumentInfo.fileProvider, mCommandResultCallback);
        scheduleCommand(command);
        mState = STATE_UPDATING;
    } else {
        willUpdate = false;
        if (DEBUG) {
            Log.i(LOG_TAG, "[SKIPPING] No update needed");
        }
    }
    // Keep track of what is requested.
    mUpdateSpec.update(attributes, preview, pages);
    runPendingCommand();
    return willUpdate;
}
Also used : PrintAttributes(android.print.PrintAttributes)

Example 20 with PrintAttributes

use of android.print.PrintAttributes in project android_frameworks_base by ResurrectionRemix.

the class PrintActivity method updateOptionsUi.

void updateOptionsUi() {
    if (!mIsOptionsUiBound) {
        return;
    }
    // Always update the summary.
    updateSummary();
    if (mState == STATE_PRINT_CONFIRMED || mState == STATE_PRINT_COMPLETED || mState == STATE_PRINT_CANCELED || mState == STATE_UPDATE_FAILED || mState == STATE_CREATE_FILE_FAILED || mState == STATE_PRINTER_UNAVAILABLE || mState == STATE_UPDATE_SLOW) {
        if (mState != STATE_PRINTER_UNAVAILABLE) {
            mDestinationSpinner.setEnabled(false);
        }
        disableOptionsUi();
        return;
    }
    // available, we disable all print options except the destination.
    if (mCurrentPrinter == null || !canPrint(mCurrentPrinter)) {
        disableOptionsUi();
        return;
    }
    PrinterCapabilitiesInfo capabilities = mCurrentPrinter.getCapabilities();
    PrintAttributes defaultAttributes = capabilities.getDefaults();
    // Destination.
    mDestinationSpinner.setEnabled(true);
    // Media size.
    mMediaSizeSpinner.setEnabled(true);
    List<MediaSize> mediaSizes = new ArrayList<>(capabilities.getMediaSizes());
    // Sort the media sizes based on the current locale.
    Collections.sort(mediaSizes, mMediaSizeComparator);
    PrintAttributes attributes = mPrintJob.getAttributes();
    // If the media sizes changed, we update the adapter and the spinner.
    boolean mediaSizesChanged = false;
    final int mediaSizeCount = mediaSizes.size();
    if (mediaSizeCount != mMediaSizeSpinnerAdapter.getCount()) {
        mediaSizesChanged = true;
    } else {
        for (int i = 0; i < mediaSizeCount; i++) {
            if (!mediaSizes.get(i).equals(mMediaSizeSpinnerAdapter.getItem(i).value)) {
                mediaSizesChanged = true;
                break;
            }
        }
    }
    if (mediaSizesChanged) {
        // Remember the old media size to try selecting it again.
        int oldMediaSizeNewIndex = AdapterView.INVALID_POSITION;
        MediaSize oldMediaSize = attributes.getMediaSize();
        // Rebuild the adapter data.
        mMediaSizeSpinnerAdapter.clear();
        for (int i = 0; i < mediaSizeCount; i++) {
            MediaSize mediaSize = mediaSizes.get(i);
            if (oldMediaSize != null && mediaSize.asPortrait().equals(oldMediaSize.asPortrait())) {
                // Update the index of the old selection.
                oldMediaSizeNewIndex = i;
            }
            mMediaSizeSpinnerAdapter.add(new SpinnerItem<>(mediaSize, mediaSize.getLabel(getPackageManager())));
        }
        if (oldMediaSizeNewIndex != AdapterView.INVALID_POSITION) {
            // Select the old media size - nothing really changed.
            if (mMediaSizeSpinner.getSelectedItemPosition() != oldMediaSizeNewIndex) {
                mMediaSizeSpinner.setSelection(oldMediaSizeNewIndex);
            }
        } else {
            // Select the first or the default.
            final int mediaSizeIndex = Math.max(mediaSizes.indexOf(defaultAttributes.getMediaSize()), 0);
            if (mMediaSizeSpinner.getSelectedItemPosition() != mediaSizeIndex) {
                mMediaSizeSpinner.setSelection(mediaSizeIndex);
            }
            // Respect the orientation of the old selection.
            if (oldMediaSize != null) {
                if (oldMediaSize.isPortrait()) {
                    attributes.setMediaSize(mMediaSizeSpinnerAdapter.getItem(mediaSizeIndex).value.asPortrait());
                } else {
                    attributes.setMediaSize(mMediaSizeSpinnerAdapter.getItem(mediaSizeIndex).value.asLandscape());
                }
            }
        }
    }
    // Color mode.
    mColorModeSpinner.setEnabled(true);
    final int colorModes = capabilities.getColorModes();
    // If the color modes changed, we update the adapter and the spinner.
    boolean colorModesChanged = false;
    if (Integer.bitCount(colorModes) != mColorModeSpinnerAdapter.getCount()) {
        colorModesChanged = true;
    } else {
        int remainingColorModes = colorModes;
        int adapterIndex = 0;
        while (remainingColorModes != 0) {
            final int colorBitOffset = Integer.numberOfTrailingZeros(remainingColorModes);
            final int colorMode = 1 << colorBitOffset;
            remainingColorModes &= ~colorMode;
            if (colorMode != mColorModeSpinnerAdapter.getItem(adapterIndex).value) {
                colorModesChanged = true;
                break;
            }
            adapterIndex++;
        }
    }
    if (colorModesChanged) {
        // Remember the old color mode to try selecting it again.
        int oldColorModeNewIndex = AdapterView.INVALID_POSITION;
        final int oldColorMode = attributes.getColorMode();
        // Rebuild the adapter data.
        mColorModeSpinnerAdapter.clear();
        String[] colorModeLabels = getResources().getStringArray(R.array.color_mode_labels);
        int remainingColorModes = colorModes;
        while (remainingColorModes != 0) {
            final int colorBitOffset = Integer.numberOfTrailingZeros(remainingColorModes);
            final int colorMode = 1 << colorBitOffset;
            if (colorMode == oldColorMode) {
                // Update the index of the old selection.
                oldColorModeNewIndex = mColorModeSpinnerAdapter.getCount();
            }
            remainingColorModes &= ~colorMode;
            mColorModeSpinnerAdapter.add(new SpinnerItem<>(colorMode, colorModeLabels[colorBitOffset]));
        }
        if (oldColorModeNewIndex != AdapterView.INVALID_POSITION) {
            // Select the old color mode - nothing really changed.
            if (mColorModeSpinner.getSelectedItemPosition() != oldColorModeNewIndex) {
                mColorModeSpinner.setSelection(oldColorModeNewIndex);
            }
        } else {
            // Select the default.
            final int selectedColorMode = colorModes & defaultAttributes.getColorMode();
            final int itemCount = mColorModeSpinnerAdapter.getCount();
            for (int i = 0; i < itemCount; i++) {
                SpinnerItem<Integer> item = mColorModeSpinnerAdapter.getItem(i);
                if (selectedColorMode == item.value) {
                    if (mColorModeSpinner.getSelectedItemPosition() != i) {
                        mColorModeSpinner.setSelection(i);
                    }
                    attributes.setColorMode(selectedColorMode);
                    break;
                }
            }
        }
    }
    // Duplex mode.
    mDuplexModeSpinner.setEnabled(true);
    final int duplexModes = capabilities.getDuplexModes();
    // If the duplex modes changed, we update the adapter and the spinner.
    // Note that we use bit count +1 to account for the no duplex option.
    boolean duplexModesChanged = false;
    if (Integer.bitCount(duplexModes) != mDuplexModeSpinnerAdapter.getCount()) {
        duplexModesChanged = true;
    } else {
        int remainingDuplexModes = duplexModes;
        int adapterIndex = 0;
        while (remainingDuplexModes != 0) {
            final int duplexBitOffset = Integer.numberOfTrailingZeros(remainingDuplexModes);
            final int duplexMode = 1 << duplexBitOffset;
            remainingDuplexModes &= ~duplexMode;
            if (duplexMode != mDuplexModeSpinnerAdapter.getItem(adapterIndex).value) {
                duplexModesChanged = true;
                break;
            }
            adapterIndex++;
        }
    }
    if (duplexModesChanged) {
        // Remember the old duplex mode to try selecting it again. Also the fallback
        // is no duplexing which is always the first item in the dropdown.
        int oldDuplexModeNewIndex = AdapterView.INVALID_POSITION;
        final int oldDuplexMode = attributes.getDuplexMode();
        // Rebuild the adapter data.
        mDuplexModeSpinnerAdapter.clear();
        String[] duplexModeLabels = getResources().getStringArray(R.array.duplex_mode_labels);
        int remainingDuplexModes = duplexModes;
        while (remainingDuplexModes != 0) {
            final int duplexBitOffset = Integer.numberOfTrailingZeros(remainingDuplexModes);
            final int duplexMode = 1 << duplexBitOffset;
            if (duplexMode == oldDuplexMode) {
                // Update the index of the old selection.
                oldDuplexModeNewIndex = mDuplexModeSpinnerAdapter.getCount();
            }
            remainingDuplexModes &= ~duplexMode;
            mDuplexModeSpinnerAdapter.add(new SpinnerItem<>(duplexMode, duplexModeLabels[duplexBitOffset]));
        }
        if (oldDuplexModeNewIndex != AdapterView.INVALID_POSITION) {
            // Select the old duplex mode - nothing really changed.
            if (mDuplexModeSpinner.getSelectedItemPosition() != oldDuplexModeNewIndex) {
                mDuplexModeSpinner.setSelection(oldDuplexModeNewIndex);
            }
        } else {
            // Select the default.
            final int selectedDuplexMode = defaultAttributes.getDuplexMode();
            final int itemCount = mDuplexModeSpinnerAdapter.getCount();
            for (int i = 0; i < itemCount; i++) {
                SpinnerItem<Integer> item = mDuplexModeSpinnerAdapter.getItem(i);
                if (selectedDuplexMode == item.value) {
                    if (mDuplexModeSpinner.getSelectedItemPosition() != i) {
                        mDuplexModeSpinner.setSelection(i);
                    }
                    attributes.setDuplexMode(selectedDuplexMode);
                    break;
                }
            }
        }
    }
    mDuplexModeSpinner.setEnabled(mDuplexModeSpinnerAdapter.getCount() > 1);
    // Orientation
    mOrientationSpinner.setEnabled(true);
    MediaSize mediaSize = attributes.getMediaSize();
    if (mediaSize != null) {
        if (mediaSize.isPortrait() && mOrientationSpinner.getSelectedItemPosition() != 0) {
            mOrientationSpinner.setSelection(0);
        } else if (!mediaSize.isPortrait() && mOrientationSpinner.getSelectedItemPosition() != 1) {
            mOrientationSpinner.setSelection(1);
        }
    }
    // Range options
    PrintDocumentInfo info = mPrintedDocument.getDocumentInfo().info;
    final int pageCount = getAdjustedPageCount(info);
    if (pageCount > 0) {
        if (info != null) {
            if (pageCount == 1) {
                mRangeOptionsSpinner.setEnabled(false);
            } else {
                mRangeOptionsSpinner.setEnabled(true);
                if (mRangeOptionsSpinner.getSelectedItemPosition() > 0) {
                    if (!mPageRangeEditText.isEnabled()) {
                        mPageRangeEditText.setEnabled(true);
                        mPageRangeEditText.setVisibility(View.VISIBLE);
                        mPageRangeTitle.setVisibility(View.VISIBLE);
                        mPageRangeEditText.requestFocus();
                        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.showSoftInput(mPageRangeEditText, 0);
                    }
                } else {
                    mPageRangeEditText.setEnabled(false);
                    mPageRangeEditText.setVisibility(View.INVISIBLE);
                    mPageRangeTitle.setVisibility(View.INVISIBLE);
                }
            }
        } else {
            if (mRangeOptionsSpinner.getSelectedItemPosition() != 0) {
                mRangeOptionsSpinner.setSelection(0);
                mPageRangeEditText.setText("");
            }
            mRangeOptionsSpinner.setEnabled(false);
            mPageRangeEditText.setEnabled(false);
            mPageRangeEditText.setVisibility(View.INVISIBLE);
            mPageRangeTitle.setVisibility(View.INVISIBLE);
        }
    }
    final int newPageCount = getAdjustedPageCount(info);
    if (newPageCount != mCurrentPageCount) {
        mCurrentPageCount = newPageCount;
        updatePageRangeOptions(newPageCount);
    }
    // Advanced print options
    if (mAdvancedPrintOptionsActivity != null) {
        mMoreOptionsButton.setVisibility(View.VISIBLE);
        mMoreOptionsButton.setEnabled(true);
    } else {
        mMoreOptionsButton.setVisibility(View.GONE);
        mMoreOptionsButton.setEnabled(false);
    }
    // Print
    if (mDestinationSpinnerAdapter.getPdfPrinter() != mCurrentPrinter) {
        mPrintButton.setImageResource(com.android.internal.R.drawable.ic_print);
        mPrintButton.setContentDescription(getString(R.string.print_button));
    } else {
        mPrintButton.setImageResource(R.drawable.ic_menu_savetopdf);
        mPrintButton.setContentDescription(getString(R.string.savetopdf_button));
    }
    if (!mPrintedDocument.getDocumentInfo().laidout || (mRangeOptionsSpinner.getSelectedItemPosition() == 1 && (TextUtils.isEmpty(mPageRangeEditText.getText()) || hasErrors())) || (mRangeOptionsSpinner.getSelectedItemPosition() == 0 && (mPrintedDocument.getDocumentInfo() == null || hasErrors()))) {
        mPrintButton.setVisibility(View.GONE);
    } else {
        mPrintButton.setVisibility(View.VISIBLE);
    }
    // Copies
    if (mDestinationSpinnerAdapter.getPdfPrinter() != mCurrentPrinter) {
        mCopiesEditText.setEnabled(true);
        mCopiesEditText.setFocusableInTouchMode(true);
    } else {
        CharSequence text = mCopiesEditText.getText();
        if (TextUtils.isEmpty(text) || !MIN_COPIES_STRING.equals(text.toString())) {
            mCopiesEditText.setText(MIN_COPIES_STRING);
        }
        mCopiesEditText.setEnabled(false);
        mCopiesEditText.setFocusable(false);
    }
    if (mCopiesEditText.getError() == null && TextUtils.isEmpty(mCopiesEditText.getText())) {
        mCopiesEditText.setText(MIN_COPIES_STRING);
        mCopiesEditText.requestFocus();
    }
    if (mShowDestinationPrompt) {
        disableOptionsUi();
    }
}
Also used : PrinterCapabilitiesInfo(android.print.PrinterCapabilitiesInfo) MediaSize(android.print.PrintAttributes.MediaSize) ArrayList(java.util.ArrayList) InputMethodManager(android.view.inputmethod.InputMethodManager) PrintAttributes(android.print.PrintAttributes) RemotePrintDocumentInfo(com.android.printspooler.model.RemotePrintDocument.RemotePrintDocumentInfo) PrintDocumentInfo(android.print.PrintDocumentInfo)

Aggregations

PrintAttributes (android.print.PrintAttributes)30 MediaSize (android.print.PrintAttributes.MediaSize)15 PrinterCapabilitiesInfo (android.print.PrinterCapabilitiesInfo)15 ArrayList (java.util.ArrayList)15 Resolution (android.print.PrintAttributes.Resolution)10 PrintDocumentInfo (android.print.PrintDocumentInfo)10 RemotePrintDocumentInfo (com.android.printspooler.model.RemotePrintDocument.RemotePrintDocumentInfo)10 PageRange (android.print.PageRange)5 PrintJobInfo (android.print.PrintJobInfo)5 InputMethodManager (android.view.inputmethod.InputMethodManager)5