private static final boolean DEBUG = false;
private static final double WEIGHT_DECAY_COEFFICIENT = 0.95f;
-
private static final int MAX_HISTORY_LENGTH = 50;
private static final int MAX_FAVORITE_PRINTER_COUNT = 4;
+ FusedPrintersProvider.this.hashCode());
}
- // Ignore printer records whose target services are not installed.
+ // Ignore printer records whose target services are not enabled.
PrintManager printManager = (PrintManager) getContext()
.getSystemService(Context.PRINT_SERVICE);
List<PrintServiceInfo> services = printManager
- .getInstalledPrintServices();
+ .getEnabledPrintServices();
- Set<ComponentName> installedComponents = new ArraySet<ComponentName>();
+ Set<ComponentName> enabledComponents = new ArraySet<ComponentName>();
final int installedServiceCount = services.size();
for (int i = 0; i < installedServiceCount; i++) {
ServiceInfo serviceInfo = services.get(i).getResolveInfo().serviceInfo;
ComponentName componentName = new ComponentName(
serviceInfo.packageName, serviceInfo.name);
- installedComponents.add(componentName);
+ enabledComponents.add(componentName);
}
final int printerCount = printers.size();
for (int i = printerCount - 1; i >= 0; i--) {
ComponentName printerServiceName = printers.get(i).getId().getServiceName();
- if (!installedComponents.contains(printerServiceName.getPackageName())) {
+ if (!enabledComponents.contains(printerServiceName)) {
printers.remove(i);
}
}
if (capabilitiesChanged || statusChanged) {
// If something changed during update...
- if (updateUi()) {
+ if (updateUi() || !mController.hasPerformedLayout()) {
// Update the document.
mController.update();
}
showUi(UI_EDITING_PRINT_JOB, null);
bindUi();
-
- mCurrentPrinter = mDestinationSpinnerAdapter.mFakePdfPrinter;
- updatePrintAttributes(mCurrentPrinter.getCapabilities());
-
updateUi();
}
implements LoaderManager.LoaderCallbacks<List<PrinterInfo>>{
private final List<PrinterInfo> mPrinters = new ArrayList<PrinterInfo>();
- private final PrinterInfo mFakePdfPrinter;
+ private PrinterInfo mFakePdfPrinter;
public DestinationAdapter() {
getLoaderManager().initLoader(LOADER_ID_PRINTERS_LOADER, null, this);
- mFakePdfPrinter = createFakePdfPrinter();
}
public int getPrinterIndex(PrinterId printerId) {
@Override
public int getCount() {
- return Math.min(mPrinters.size() + 2, DEST_ADAPTER_MAX_ITEM_COUNT);
+ final int additionalItemCount = (mFakePdfPrinter != null) ? 2 : 1;
+ return Math.min(mPrinters.size() + additionalItemCount,
+ DEST_ADAPTER_MAX_ITEM_COUNT);
}
@Override
@Override
public Object getItem(int position) {
if (mPrinters.isEmpty()) {
- if (position == 0) {
+ if (position == 0 && mFakePdfPrinter != null) {
return mFakePdfPrinter;
}
} else {
if (position < 1) {
return mPrinters.get(position);
}
- if (position == 1) {
+ if (position == 1 && mFakePdfPrinter != null) {
return mFakePdfPrinter;
}
if (position < getCount() - 1) {
@Override
public long getItemId(int position) {
if (mPrinters.isEmpty()) {
- if (position == 0) {
+ if (position == 0 && mFakePdfPrinter != null) {
return DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF;
}
if (position == 1) {
return DEST_ADAPTER_ITEM_ID_ALL_PRINTERS;
}
} else {
- if (position == 1) {
+ if (position == 1 && mFakePdfPrinter != null) {
return DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF;
}
if (position == getCount() - 1) {
Drawable icon = null;
if (mPrinters.isEmpty()) {
- if (position == 0) {
+ if (position == 0 && mFakePdfPrinter != null) {
PrinterInfo printer = (PrinterInfo) getItem(position);
title = printer.getName();
} else if (position == 1) {
title = getString(R.string.all_printers);
}
} else {
- if (position == 1) {
+ if (position == 1 && mFakePdfPrinter != null) {
PrinterInfo printer = (PrinterInfo) getItem(position);
title = printer.getName();
} else if (position == getCount() - 1) {
@Override
public void onLoadFinished(Loader<List<PrinterInfo>> loader,
List<PrinterInfo> printers) {
+ // If this is the first load, create the fake PDF printer.
+ // We do this to avoid flicker where the PDF printer is the
+ // only one and as soon as the loader loads the favorites
+ // it gets switched. Not a great user experience.
+ if (mFakePdfPrinter == null) {
+ mCurrentPrinter = mFakePdfPrinter = createFakePdfPrinter();
+ updatePrintAttributes(mCurrentPrinter.getCapabilities());
+ updateUi();
+ }
+
// 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.
adapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
- if (adapter.getCount() <= 0) {
+ if (!getActivity().isFinishing() && adapter.getCount() <= 0) {
updateEmptyView(adapter);
}
}
@Override
public void onInvalidated() {
- updateEmptyView(adapter);
+ if (!getActivity().isFinishing()) {
+ updateEmptyView(adapter);
+ }
}
});
setListAdapter(adapter);
- View emptyView = getActivity().findViewById(R.id.empty_print_state);
- getListView().setEmptyView(emptyView);
}
@Override
}
public void updateEmptyView(DestinationAdapter adapter) {
+ if (getListView().getEmptyView() == null) {
+ View emptyView = getActivity().findViewById(R.id.empty_print_state);
+ getListView().setEmptyView(emptyView);
+ }
TextView titleView = (TextView) getActivity().findViewById(R.id.title);
View progressBar = getActivity().findViewById(R.id.progress_bar);
if (adapter.getUnfilteredCount() <= 0) {