Loading core/java/android/print/PrinterInfo.java +11 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,17 @@ public final class PrinterInfo implements Parcelable { return drawable; } /** * Check if the printer has a custom printer icon. * * @return {@code true} iff the printer has a custom printer icon. * * @hide */ public boolean getHasCustomPrinterIcon() { return mHasCustomPrinterIcon; } /** * Get the printer name. * Loading packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java +3 −1 Original line number Diff line number Diff line Loading @@ -89,6 +89,8 @@ public final class PrintSpoolerService extends Service { private static final boolean PERSISTENCE_MANAGER_ENABLED = true; private static final String PRINT_JOB_STATE_HISTO = "print_job_state"; private static final long CHECK_ALL_PRINTJOBS_HANDLED_DELAY = 5000; private static final String PRINT_JOB_FILE_PREFIX = "print_job_"; Loading Loading @@ -532,7 +534,7 @@ public final class PrintSpoolerService extends Service { Slog.i(LOG_TAG, "[STATE CHANGED] " + printJob); } MetricsLogger.histogram(this, "print_job_state", state); MetricsLogger.histogram(this, PRINT_JOB_STATE_HISTO, state); switch (state) { case PrintJobInfo.STATE_COMPLETED: case PrintJobInfo.STATE_CANCELED: Loading packages/PrintSpooler/src/com/android/printspooler/ui/AddPrinterActivity.java +16 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,8 @@ import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.printspooler.R; import java.text.Collator; Loading Loading @@ -123,6 +125,16 @@ public class AddPrinterActivity extends ListActivity implements AdapterView.OnIt getLoaderManager().initLoader(LOADER_ID_ALL_SERVICES, null, printServiceLoaderCallbacks); } @Override protected void onDestroy() { if (isFinishing()) { MetricsLogger.action(this, MetricsEvent.PRINT_ADD_PRINTERS, mEnabledServicesAdapter.getCount()); } super.onDestroy(); } /** * Callbacks for the loaders operating on list of {@link PrintServiceInfo print service infos}. */ Loading Loading @@ -674,6 +686,10 @@ public class AddPrinterActivity extends ListActivity implements AdapterView.OnIt } else { RecommendationInfo recommendation = (RecommendationInfo) getItem(position); MetricsLogger.action(AddPrinterActivity.this, MetricsEvent.ACTION_PRINT_RECOMMENDED_SERVICE_INSTALL, recommendation.getPackageName().toString()); try { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString( R.string.uri_package_details, recommendation.getPackageName())))); Loading packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java +125 −8 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.printspooler.ui; import android.annotation.NonNull; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; Loading Loading @@ -45,6 +46,8 @@ import android.os.Handler; import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.print.IPrintDocumentAdapter; import android.print.PageRange; import android.print.PrintAttributes; Loading Loading @@ -86,6 +89,7 @@ import android.widget.TextView; import android.widget.Toast; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.printspooler.R; import com.android.printspooler.model.MutexFileProvider; import com.android.printspooler.model.PrintSpoolerProvider; Loading Loading @@ -126,6 +130,11 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat private static final boolean DEBUG = false; // Constants for MetricsLogger.count and MetricsLogger.histo private static final String PRINT_PAGES_HISTO = "print_pages"; private static final String PRINT_DEFAULT_COUNT = "print_default"; private static final String PRINT_WORK_COUNT = "print_work"; private static final String FRAGMENT_TAG = "FRAGMENT_TAG"; private static final String HAS_PRINTED_PREF = "has_printed"; Loading Loading @@ -160,6 +169,14 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat private static final int UI_STATE_ERROR = 1; private static final int UI_STATE_PROGRESS = 2; // see frameworks/base/proto/src/metrics_constats.proto -> ACTION_PRINT_JOB_OPTIONS private static final int PRINT_JOB_OPTIONS_SUBTYPE_COPIES = 1; private static final int PRINT_JOB_OPTIONS_SUBTYPE_COLOR_MODE = 2; private static final int PRINT_JOB_OPTIONS_SUBTYPE_DUPLEX_MODE = 3; private static final int PRINT_JOB_OPTIONS_SUBTYPE_MEDIA_SIZE = 4; private static final int PRINT_JOB_OPTIONS_SUBTYPE_ORIENTATION = 5; private static final int PRINT_JOB_OPTIONS_SUBTYPE_PAGE_RANGE = 6; private static final int MIN_COPIES = 1; private static final String MIN_COPIES_STRING = String.valueOf(MIN_COPIES); Loading Loading @@ -228,6 +245,9 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat private int mUiState = UI_STATE_PREVIEW; /** The ID of the printer initially set */ private PrinterId mDefaultPrinter; /** Observer for changes to the printers */ private PrintersObserver mPrintersObserver; Loading Loading @@ -263,6 +283,10 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat mCallingPackageName = extras.getString(DocumentsContract.EXTRA_PACKAGE_NAME); if (savedInstanceState == null) { MetricsLogger.action(this, MetricsEvent.PRINT_PREVIEW, mCallingPackageName); } // This will take just a few milliseconds, so just wait to // bind to the local service before showing the UI. mSpoolerProvider = new PrintSpoolerProvider(this, Loading Loading @@ -354,7 +378,6 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat if (mPrinterRegistry != null && mCurrentPrinter != null) { mPrinterRegistry.setTrackedPrinter(mCurrentPrinter.getId()); } MetricsLogger.count(this, "print_preview", 1); } @Override Loading Loading @@ -574,6 +597,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat @Override public void onOptionsOpened() { MetricsLogger.action(this, MetricsEvent.PRINT_JOB_OPTIONS); updateSelectedPagesFromPreview(); } Loading Loading @@ -677,6 +701,9 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat if (resultCode == RESULT_OK && data != null) { updateOptionsUi(); final Uri uri = data.getData(); countPrintOperation(getPackageName()); // Calling finish here does not invoke lifecycle callbacks but we // update the print job in onPause if finishing, hence post a message. mDestinationSpinner.post(new Runnable() { Loading Loading @@ -725,6 +752,9 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat mPrintJob.setPrinterName(printerInfo.getName()); mDestinationSpinnerAdapter.ensurePrinterInVisibleAdapterPosition(printerInfo); MetricsLogger.action(this, MetricsEvent.ACTION_PRINTER_SELECT_ALL, printerInfo.getId().getServiceName().getPackageName()); } } Loading Loading @@ -1044,12 +1074,35 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat getFragmentManager().executePendingTransactions(); } /** * Count that a print operation has been confirmed. * * @param packageName The package name of the print service used */ private void countPrintOperation(@NonNull String packageName) { MetricsLogger.action(this, MetricsEvent.ACTION_PRINT, packageName); MetricsLogger.histogram(this, PRINT_PAGES_HISTO, getAdjustedPageCount(mPrintJob.getDocumentInfo())); if (mPrintJob.getPrinterId().equals(mDefaultPrinter)) { MetricsLogger.histogram(this, PRINT_DEFAULT_COUNT, 1); } UserManager um = (UserManager) getSystemService(Context.USER_SERVICE); if (um.isManagedProfile()) { MetricsLogger.histogram(this, PRINT_WORK_COUNT, 1); } } private void requestCreatePdfFileOrFinish() { mPrintedDocument.cancel(false); if (mCurrentPrinter == mDestinationSpinnerAdapter.getPdfPrinter()) { startCreateDocumentActivity(); } else { countPrintOperation(mCurrentPrinter.getId().getServiceName().getPackageName()); transformDocumentAndFinish(null); } } Loading Loading @@ -1205,8 +1258,6 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat private void confirmPrint() { setState(STATE_PRINT_CONFIRMED); MetricsLogger.count(this, "print_confirmed", 1); updateOptionsUi(); addCurrentPrinterToHistory(); setUserPrinted(); Loading Loading @@ -2677,11 +2728,14 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat return; } if (mDefaultPrinter == null) { mDefaultPrinter = currentPrinter.getId(); } PrinterId oldId = null; if (mCurrentPrinter != null) { oldId = mCurrentPrinter.getId(); } mCurrentPrinter = currentPrinter; if (oldId != null) { Loading @@ -2693,6 +2747,17 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat mDestinationSpinnerAdapter.notifyDataSetChanged(); return; } if (mState != STATE_INITIALIZING) { if (currentPrinter != null) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINTER_SELECT_DROPDOWN, currentPrinter.getId().getServiceName().getPackageName()); } else { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINTER_SELECT_DROPDOWN, ""); } } } PrinterHolder printerHolder = mDestinationSpinnerAdapter.getPrinterHolder( Loading Loading @@ -2729,24 +2794,57 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat } if (newMediaSize != attributes.getMediaSize()) { if (!newMediaSize.equals(attributes.getMediaSize()) && !attributes.getMediaSize().equals(MediaSize.UNKNOWN_LANDSCAPE) && !attributes.getMediaSize().equals(MediaSize.UNKNOWN_PORTRAIT) && mState != STATE_INITIALIZING) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINT_JOB_OPTIONS, PRINT_JOB_OPTIONS_SUBTYPE_MEDIA_SIZE); } clearRanges = true; attributes.setMediaSize(newMediaSize); } } else if (spinner == mColorModeSpinner) { SpinnerItem<Integer> colorModeItem = mColorModeSpinnerAdapter.getItem(position); mPrintJob.getAttributes().setColorMode(colorModeItem.value); int newMode = colorModeItem.value; if (mPrintJob.getAttributes().getColorMode() != newMode && mState != STATE_INITIALIZING) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINT_JOB_OPTIONS, PRINT_JOB_OPTIONS_SUBTYPE_COLOR_MODE); } mPrintJob.getAttributes().setColorMode(newMode); } else if (spinner == mDuplexModeSpinner) { SpinnerItem<Integer> duplexModeItem = mDuplexModeSpinnerAdapter.getItem(position); mPrintJob.getAttributes().setDuplexMode(duplexModeItem.value); int newMode = duplexModeItem.value; if (mPrintJob.getAttributes().getDuplexMode() != newMode && mState != STATE_INITIALIZING) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINT_JOB_OPTIONS, PRINT_JOB_OPTIONS_SUBTYPE_DUPLEX_MODE); } mPrintJob.getAttributes().setDuplexMode(newMode); } else if (spinner == mOrientationSpinner) { SpinnerItem<Integer> orientationItem = mOrientationSpinnerAdapter.getItem(position); PrintAttributes attributes = mPrintJob.getAttributes(); if (mMediaSizeSpinner.getSelectedItem() != null) { boolean isPortrait = attributes.isPortrait(); boolean newIsPortrait = orientationItem.value == ORIENTATION_PORTRAIT; if (isPortrait != newIsPortrait) { if (mState != STATE_INITIALIZING) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINT_JOB_OPTIONS, PRINT_JOB_OPTIONS_SUBTYPE_ORIENTATION); } if (isPortrait != (orientationItem.value == ORIENTATION_PORTRAIT)) { clearRanges = true; if (orientationItem.value == ORIENTATION_PORTRAIT) { if (newIsPortrait) { attributes.copyFrom(attributes.asPortrait()); } else { attributes.copyFrom(attributes.asLandscape()); Loading @@ -2757,8 +2855,22 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat if (mRangeOptionsSpinner.getSelectedItemPosition() == 0) { clearRanges = true; mPageRangeEditText.setText(""); if (mPageRangeEditText.getVisibility() == View.VISIBLE && mState != STATE_INITIALIZING) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINT_JOB_OPTIONS, PRINT_JOB_OPTIONS_SUBTYPE_PAGE_RANGE); } } else if (TextUtils.isEmpty(mPageRangeEditText.getText())) { mPageRangeEditText.setError(""); if (mPageRangeEditText.getVisibility() != View.VISIBLE && mState != STATE_INITIALIZING) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINT_JOB_OPTIONS, PRINT_JOB_OPTIONS_SUBTYPE_PAGE_RANGE); } } } Loading Loading @@ -2861,6 +2973,11 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat /* ignore */ } if (mState != STATE_INITIALIZING) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINT_JOB_OPTIONS, PRINT_JOB_OPTIONS_SUBTYPE_COPIES); } if (copies < MIN_COPIES) { if (mCopiesEditText.getError() == null) { mCopiesEditText.setError(""); Loading packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java +63 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.printspooler.ui; import android.annotation.NonNull; import android.app.Activity; import android.app.LoaderManager; import android.content.ComponentName; Loading Loading @@ -56,6 +57,8 @@ import android.widget.SearchView; import android.widget.TextView; import android.widget.Toast; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.printspooler.R; import java.util.ArrayList; Loading @@ -79,6 +82,12 @@ public final class SelectPrinterActivity extends Activity implements private static final String EXTRA_PRINTER_ID = "EXTRA_PRINTER_ID"; private static final String KEY_NOT_FIRST_CREATE = "KEY_NOT_FIRST_CREATE"; private static final String KEY_DID_SEARCH = "DID_SEARCH"; // Constants for MetricsLogger.count and MetricsLogger.histo private static final String PRINTERS_LISTED_COUNT = "printers_listed"; private static final String PRINTERS_ICON_COUNT = "printers_icon"; private static final String PRINTERS_INFO_COUNT = "printers_info"; /** The currently enabled print services by their ComponentName */ private ArrayMap<ComponentName, PrintServiceInfo> mEnabledPrintServices; Loading @@ -89,7 +98,10 @@ public final class SelectPrinterActivity extends Activity implements private AnnounceFilterResult mAnnounceFilterResult; private boolean mDidSearch; private void startAddPrinterActivity() { MetricsLogger.action(this, MetricsEvent.ACTION_PRINT_SERVICE_ADD); startActivity(new Intent(this, AddPrinterActivity.class)); } Loading Loading @@ -185,12 +197,17 @@ public final class SelectPrinterActivity extends Activity implements } } } if (savedInstanceState != null) { mDidSearch = savedInstanceState.getBoolean(KEY_DID_SEARCH); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(KEY_NOT_FIRST_CREATE, true); outState.putBoolean(KEY_DID_SEARCH, mDidSearch); } @Override Loading Loading @@ -305,6 +322,37 @@ public final class SelectPrinterActivity extends Activity implements super.onStop(); } @Override protected void onDestroy() { if (isFinishing()) { DestinationAdapter adapter = (DestinationAdapter) mListView.getAdapter(); List<PrinterInfo> printers = adapter.getPrinters(); int numPrinters = adapter.getPrinters().size(); MetricsLogger.action(this, MetricsEvent.PRINT_ALL_PRINTERS, numPrinters); MetricsLogger.count(this, PRINTERS_LISTED_COUNT, numPrinters); int numInfoPrinters = 0; int numIconPrinters = 0; for (int i = 0; i < numPrinters; i++) { PrinterInfo printer = printers.get(i); if (printer.getInfoIntent() != null) { numInfoPrinters++; } if (printer.getHasCustomPrinterIcon()) { numIconPrinters++; } } MetricsLogger.count(this, PRINTERS_INFO_COUNT, numInfoPrinters); MetricsLogger.count(this, PRINTERS_ICON_COUNT, numIconPrinters); } super.onDestroy(); } private void onPrinterSelected(PrinterInfo printer) { Intent intent = new Intent(); intent.putExtra(INTENT_EXTRA_PRINTER, printer); Loading Loading @@ -380,6 +428,15 @@ public final class SelectPrinterActivity extends Activity implements private CharSequence mLastSearchString; /** * Get the currently known printers. * * @return The currently known printers */ @NonNull List<PrinterInfo> getPrinters() { return mPrinters; } public DestinationAdapter() { mPrinterRegistry.setOnPrintersChangeListener(new PrinterRegistry.OnPrintersChangeListener() { @Override Loading Loading @@ -454,6 +511,12 @@ public final class SelectPrinterActivity extends Activity implements if (resultCountChanged) { announceSearchResultIfNeeded(); } if (!mDidSearch) { MetricsLogger.action(SelectPrinterActivity.this, MetricsEvent.ACTION_PRINTER_SEARCH); mDidSearch = true; } notifyDataSetChanged(); } }; Loading Loading
core/java/android/print/PrinterInfo.java +11 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,17 @@ public final class PrinterInfo implements Parcelable { return drawable; } /** * Check if the printer has a custom printer icon. * * @return {@code true} iff the printer has a custom printer icon. * * @hide */ public boolean getHasCustomPrinterIcon() { return mHasCustomPrinterIcon; } /** * Get the printer name. * Loading
packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java +3 −1 Original line number Diff line number Diff line Loading @@ -89,6 +89,8 @@ public final class PrintSpoolerService extends Service { private static final boolean PERSISTENCE_MANAGER_ENABLED = true; private static final String PRINT_JOB_STATE_HISTO = "print_job_state"; private static final long CHECK_ALL_PRINTJOBS_HANDLED_DELAY = 5000; private static final String PRINT_JOB_FILE_PREFIX = "print_job_"; Loading Loading @@ -532,7 +534,7 @@ public final class PrintSpoolerService extends Service { Slog.i(LOG_TAG, "[STATE CHANGED] " + printJob); } MetricsLogger.histogram(this, "print_job_state", state); MetricsLogger.histogram(this, PRINT_JOB_STATE_HISTO, state); switch (state) { case PrintJobInfo.STATE_COMPLETED: case PrintJobInfo.STATE_CANCELED: Loading
packages/PrintSpooler/src/com/android/printspooler/ui/AddPrinterActivity.java +16 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,8 @@ import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.printspooler.R; import java.text.Collator; Loading Loading @@ -123,6 +125,16 @@ public class AddPrinterActivity extends ListActivity implements AdapterView.OnIt getLoaderManager().initLoader(LOADER_ID_ALL_SERVICES, null, printServiceLoaderCallbacks); } @Override protected void onDestroy() { if (isFinishing()) { MetricsLogger.action(this, MetricsEvent.PRINT_ADD_PRINTERS, mEnabledServicesAdapter.getCount()); } super.onDestroy(); } /** * Callbacks for the loaders operating on list of {@link PrintServiceInfo print service infos}. */ Loading Loading @@ -674,6 +686,10 @@ public class AddPrinterActivity extends ListActivity implements AdapterView.OnIt } else { RecommendationInfo recommendation = (RecommendationInfo) getItem(position); MetricsLogger.action(AddPrinterActivity.this, MetricsEvent.ACTION_PRINT_RECOMMENDED_SERVICE_INSTALL, recommendation.getPackageName().toString()); try { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString( R.string.uri_package_details, recommendation.getPackageName())))); Loading
packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java +125 −8 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.printspooler.ui; import android.annotation.NonNull; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; Loading Loading @@ -45,6 +46,8 @@ import android.os.Handler; import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.print.IPrintDocumentAdapter; import android.print.PageRange; import android.print.PrintAttributes; Loading Loading @@ -86,6 +89,7 @@ import android.widget.TextView; import android.widget.Toast; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.printspooler.R; import com.android.printspooler.model.MutexFileProvider; import com.android.printspooler.model.PrintSpoolerProvider; Loading Loading @@ -126,6 +130,11 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat private static final boolean DEBUG = false; // Constants for MetricsLogger.count and MetricsLogger.histo private static final String PRINT_PAGES_HISTO = "print_pages"; private static final String PRINT_DEFAULT_COUNT = "print_default"; private static final String PRINT_WORK_COUNT = "print_work"; private static final String FRAGMENT_TAG = "FRAGMENT_TAG"; private static final String HAS_PRINTED_PREF = "has_printed"; Loading Loading @@ -160,6 +169,14 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat private static final int UI_STATE_ERROR = 1; private static final int UI_STATE_PROGRESS = 2; // see frameworks/base/proto/src/metrics_constats.proto -> ACTION_PRINT_JOB_OPTIONS private static final int PRINT_JOB_OPTIONS_SUBTYPE_COPIES = 1; private static final int PRINT_JOB_OPTIONS_SUBTYPE_COLOR_MODE = 2; private static final int PRINT_JOB_OPTIONS_SUBTYPE_DUPLEX_MODE = 3; private static final int PRINT_JOB_OPTIONS_SUBTYPE_MEDIA_SIZE = 4; private static final int PRINT_JOB_OPTIONS_SUBTYPE_ORIENTATION = 5; private static final int PRINT_JOB_OPTIONS_SUBTYPE_PAGE_RANGE = 6; private static final int MIN_COPIES = 1; private static final String MIN_COPIES_STRING = String.valueOf(MIN_COPIES); Loading Loading @@ -228,6 +245,9 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat private int mUiState = UI_STATE_PREVIEW; /** The ID of the printer initially set */ private PrinterId mDefaultPrinter; /** Observer for changes to the printers */ private PrintersObserver mPrintersObserver; Loading Loading @@ -263,6 +283,10 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat mCallingPackageName = extras.getString(DocumentsContract.EXTRA_PACKAGE_NAME); if (savedInstanceState == null) { MetricsLogger.action(this, MetricsEvent.PRINT_PREVIEW, mCallingPackageName); } // This will take just a few milliseconds, so just wait to // bind to the local service before showing the UI. mSpoolerProvider = new PrintSpoolerProvider(this, Loading Loading @@ -354,7 +378,6 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat if (mPrinterRegistry != null && mCurrentPrinter != null) { mPrinterRegistry.setTrackedPrinter(mCurrentPrinter.getId()); } MetricsLogger.count(this, "print_preview", 1); } @Override Loading Loading @@ -574,6 +597,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat @Override public void onOptionsOpened() { MetricsLogger.action(this, MetricsEvent.PRINT_JOB_OPTIONS); updateSelectedPagesFromPreview(); } Loading Loading @@ -677,6 +701,9 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat if (resultCode == RESULT_OK && data != null) { updateOptionsUi(); final Uri uri = data.getData(); countPrintOperation(getPackageName()); // Calling finish here does not invoke lifecycle callbacks but we // update the print job in onPause if finishing, hence post a message. mDestinationSpinner.post(new Runnable() { Loading Loading @@ -725,6 +752,9 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat mPrintJob.setPrinterName(printerInfo.getName()); mDestinationSpinnerAdapter.ensurePrinterInVisibleAdapterPosition(printerInfo); MetricsLogger.action(this, MetricsEvent.ACTION_PRINTER_SELECT_ALL, printerInfo.getId().getServiceName().getPackageName()); } } Loading Loading @@ -1044,12 +1074,35 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat getFragmentManager().executePendingTransactions(); } /** * Count that a print operation has been confirmed. * * @param packageName The package name of the print service used */ private void countPrintOperation(@NonNull String packageName) { MetricsLogger.action(this, MetricsEvent.ACTION_PRINT, packageName); MetricsLogger.histogram(this, PRINT_PAGES_HISTO, getAdjustedPageCount(mPrintJob.getDocumentInfo())); if (mPrintJob.getPrinterId().equals(mDefaultPrinter)) { MetricsLogger.histogram(this, PRINT_DEFAULT_COUNT, 1); } UserManager um = (UserManager) getSystemService(Context.USER_SERVICE); if (um.isManagedProfile()) { MetricsLogger.histogram(this, PRINT_WORK_COUNT, 1); } } private void requestCreatePdfFileOrFinish() { mPrintedDocument.cancel(false); if (mCurrentPrinter == mDestinationSpinnerAdapter.getPdfPrinter()) { startCreateDocumentActivity(); } else { countPrintOperation(mCurrentPrinter.getId().getServiceName().getPackageName()); transformDocumentAndFinish(null); } } Loading Loading @@ -1205,8 +1258,6 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat private void confirmPrint() { setState(STATE_PRINT_CONFIRMED); MetricsLogger.count(this, "print_confirmed", 1); updateOptionsUi(); addCurrentPrinterToHistory(); setUserPrinted(); Loading Loading @@ -2677,11 +2728,14 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat return; } if (mDefaultPrinter == null) { mDefaultPrinter = currentPrinter.getId(); } PrinterId oldId = null; if (mCurrentPrinter != null) { oldId = mCurrentPrinter.getId(); } mCurrentPrinter = currentPrinter; if (oldId != null) { Loading @@ -2693,6 +2747,17 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat mDestinationSpinnerAdapter.notifyDataSetChanged(); return; } if (mState != STATE_INITIALIZING) { if (currentPrinter != null) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINTER_SELECT_DROPDOWN, currentPrinter.getId().getServiceName().getPackageName()); } else { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINTER_SELECT_DROPDOWN, ""); } } } PrinterHolder printerHolder = mDestinationSpinnerAdapter.getPrinterHolder( Loading Loading @@ -2729,24 +2794,57 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat } if (newMediaSize != attributes.getMediaSize()) { if (!newMediaSize.equals(attributes.getMediaSize()) && !attributes.getMediaSize().equals(MediaSize.UNKNOWN_LANDSCAPE) && !attributes.getMediaSize().equals(MediaSize.UNKNOWN_PORTRAIT) && mState != STATE_INITIALIZING) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINT_JOB_OPTIONS, PRINT_JOB_OPTIONS_SUBTYPE_MEDIA_SIZE); } clearRanges = true; attributes.setMediaSize(newMediaSize); } } else if (spinner == mColorModeSpinner) { SpinnerItem<Integer> colorModeItem = mColorModeSpinnerAdapter.getItem(position); mPrintJob.getAttributes().setColorMode(colorModeItem.value); int newMode = colorModeItem.value; if (mPrintJob.getAttributes().getColorMode() != newMode && mState != STATE_INITIALIZING) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINT_JOB_OPTIONS, PRINT_JOB_OPTIONS_SUBTYPE_COLOR_MODE); } mPrintJob.getAttributes().setColorMode(newMode); } else if (spinner == mDuplexModeSpinner) { SpinnerItem<Integer> duplexModeItem = mDuplexModeSpinnerAdapter.getItem(position); mPrintJob.getAttributes().setDuplexMode(duplexModeItem.value); int newMode = duplexModeItem.value; if (mPrintJob.getAttributes().getDuplexMode() != newMode && mState != STATE_INITIALIZING) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINT_JOB_OPTIONS, PRINT_JOB_OPTIONS_SUBTYPE_DUPLEX_MODE); } mPrintJob.getAttributes().setDuplexMode(newMode); } else if (spinner == mOrientationSpinner) { SpinnerItem<Integer> orientationItem = mOrientationSpinnerAdapter.getItem(position); PrintAttributes attributes = mPrintJob.getAttributes(); if (mMediaSizeSpinner.getSelectedItem() != null) { boolean isPortrait = attributes.isPortrait(); boolean newIsPortrait = orientationItem.value == ORIENTATION_PORTRAIT; if (isPortrait != newIsPortrait) { if (mState != STATE_INITIALIZING) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINT_JOB_OPTIONS, PRINT_JOB_OPTIONS_SUBTYPE_ORIENTATION); } if (isPortrait != (orientationItem.value == ORIENTATION_PORTRAIT)) { clearRanges = true; if (orientationItem.value == ORIENTATION_PORTRAIT) { if (newIsPortrait) { attributes.copyFrom(attributes.asPortrait()); } else { attributes.copyFrom(attributes.asLandscape()); Loading @@ -2757,8 +2855,22 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat if (mRangeOptionsSpinner.getSelectedItemPosition() == 0) { clearRanges = true; mPageRangeEditText.setText(""); if (mPageRangeEditText.getVisibility() == View.VISIBLE && mState != STATE_INITIALIZING) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINT_JOB_OPTIONS, PRINT_JOB_OPTIONS_SUBTYPE_PAGE_RANGE); } } else if (TextUtils.isEmpty(mPageRangeEditText.getText())) { mPageRangeEditText.setError(""); if (mPageRangeEditText.getVisibility() != View.VISIBLE && mState != STATE_INITIALIZING) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINT_JOB_OPTIONS, PRINT_JOB_OPTIONS_SUBTYPE_PAGE_RANGE); } } } Loading Loading @@ -2861,6 +2973,11 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat /* ignore */ } if (mState != STATE_INITIALIZING) { MetricsLogger.action(PrintActivity.this, MetricsEvent.ACTION_PRINT_JOB_OPTIONS, PRINT_JOB_OPTIONS_SUBTYPE_COPIES); } if (copies < MIN_COPIES) { if (mCopiesEditText.getError() == null) { mCopiesEditText.setError(""); Loading
packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java +63 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.printspooler.ui; import android.annotation.NonNull; import android.app.Activity; import android.app.LoaderManager; import android.content.ComponentName; Loading Loading @@ -56,6 +57,8 @@ import android.widget.SearchView; import android.widget.TextView; import android.widget.Toast; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.printspooler.R; import java.util.ArrayList; Loading @@ -79,6 +82,12 @@ public final class SelectPrinterActivity extends Activity implements private static final String EXTRA_PRINTER_ID = "EXTRA_PRINTER_ID"; private static final String KEY_NOT_FIRST_CREATE = "KEY_NOT_FIRST_CREATE"; private static final String KEY_DID_SEARCH = "DID_SEARCH"; // Constants for MetricsLogger.count and MetricsLogger.histo private static final String PRINTERS_LISTED_COUNT = "printers_listed"; private static final String PRINTERS_ICON_COUNT = "printers_icon"; private static final String PRINTERS_INFO_COUNT = "printers_info"; /** The currently enabled print services by their ComponentName */ private ArrayMap<ComponentName, PrintServiceInfo> mEnabledPrintServices; Loading @@ -89,7 +98,10 @@ public final class SelectPrinterActivity extends Activity implements private AnnounceFilterResult mAnnounceFilterResult; private boolean mDidSearch; private void startAddPrinterActivity() { MetricsLogger.action(this, MetricsEvent.ACTION_PRINT_SERVICE_ADD); startActivity(new Intent(this, AddPrinterActivity.class)); } Loading Loading @@ -185,12 +197,17 @@ public final class SelectPrinterActivity extends Activity implements } } } if (savedInstanceState != null) { mDidSearch = savedInstanceState.getBoolean(KEY_DID_SEARCH); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(KEY_NOT_FIRST_CREATE, true); outState.putBoolean(KEY_DID_SEARCH, mDidSearch); } @Override Loading Loading @@ -305,6 +322,37 @@ public final class SelectPrinterActivity extends Activity implements super.onStop(); } @Override protected void onDestroy() { if (isFinishing()) { DestinationAdapter adapter = (DestinationAdapter) mListView.getAdapter(); List<PrinterInfo> printers = adapter.getPrinters(); int numPrinters = adapter.getPrinters().size(); MetricsLogger.action(this, MetricsEvent.PRINT_ALL_PRINTERS, numPrinters); MetricsLogger.count(this, PRINTERS_LISTED_COUNT, numPrinters); int numInfoPrinters = 0; int numIconPrinters = 0; for (int i = 0; i < numPrinters; i++) { PrinterInfo printer = printers.get(i); if (printer.getInfoIntent() != null) { numInfoPrinters++; } if (printer.getHasCustomPrinterIcon()) { numIconPrinters++; } } MetricsLogger.count(this, PRINTERS_INFO_COUNT, numInfoPrinters); MetricsLogger.count(this, PRINTERS_ICON_COUNT, numIconPrinters); } super.onDestroy(); } private void onPrinterSelected(PrinterInfo printer) { Intent intent = new Intent(); intent.putExtra(INTENT_EXTRA_PRINTER, printer); Loading Loading @@ -380,6 +428,15 @@ public final class SelectPrinterActivity extends Activity implements private CharSequence mLastSearchString; /** * Get the currently known printers. * * @return The currently known printers */ @NonNull List<PrinterInfo> getPrinters() { return mPrinters; } public DestinationAdapter() { mPrinterRegistry.setOnPrintersChangeListener(new PrinterRegistry.OnPrintersChangeListener() { @Override Loading Loading @@ -454,6 +511,12 @@ public final class SelectPrinterActivity extends Activity implements if (resultCountChanged) { announceSearchResultIfNeeded(); } if (!mDidSearch) { MetricsLogger.action(SelectPrinterActivity.this, MetricsEvent.ACTION_PRINTER_SEARCH); mDidSearch = true; } notifyDataSetChanged(); } }; Loading