Skip to main content

Resource Management

Templates and fonts live on the device, not in your app. Before you can print, you need to upload them. This guide shows you how.


What Are Resources?

Resources are files stored on the Pathfinder Edge device:

TypeExtensionPurpose
Templates.ngt, .lntLabel layouts with placeholders
Fonts.TTFCustom typefaces for text

Think of it like loading paper into a printer — you do it once, then print as many times as you want.


Available Methods

The SDK provides several methods for registering resources:

// Single resource from byte array (e.g., from a String value or downloaded file)
CompletableFuture<Void> createResource(String filename, byte[] data, boolean overwrite, ProgressCallback callback);

// Single resource from assets
CompletableFuture<Void> registerResource(String assetFilePath, boolean overwrite, ProgressCallback callback);

// Single resource from device storage (Uri)
CompletableFuture<Void> registerResource(Uri uri, boolean overwrite, ProgressCallback callback);

// Multiple resources from a list of Uris
CompletableFuture<Void> registerResources(List<Uri> uris, boolean overwrite, ProgressCallback callback);

// All resources from an assets directory
CompletableFuture<Void> registerResources(String assetDirPath, boolean overwrite, ProgressCallback callback);

// All resources from a device storage directory
CompletableFuture<Void> registerResources(Uri directoryUri, boolean overwrite, ProgressCallback callback);

Uploading a Single Resource

Upload a template or font from your app's assets folder:

import com.averydennison.addevicemanager.callbacks.ProgressCallback;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private final Logger logger = LoggerFactory.getLogger(getClass());

// Upload a template from your app's assets folder
String assetPath = "templates/PriceTag.ngt";

deviceAdapter.registerResource(assetPath, true, new ProgressCallback() {
@Override
public void onProgress(String fileName, int current, int total, double percent) {
logger.debug("Uploading {}: {:.0f}%", fileName, percent);
}
})
.thenAccept(unused -> {
logger.info("Template uploaded successfully");
})
.exceptionally(error -> {
logger.error("Upload failed: {}", error.getMessage());
return null;
});

Parameters:

ParameterDescription
assetPathPath to the file in your assets/ folder
overwritetrue to replace if file already exists on device, false to skip
callbackProgress updates during upload

Uploading Multiple Resources

Upload an entire folder of templates and fonts at once:

// Upload everything in the "PrintResources" folder
String assetsDir = "PrintResources";

deviceAdapter.registerResources(assetsDir, true, new ProgressCallback() {
@Override
public void onProgress(String fileName, int current, int total, double percent) {
logger.info("Uploading {} ({} of {}): {:.0f}%", fileName, current, total, percent);

// Update your progress bar
updateProgressBar(current, total, percent);
}
})
.thenAccept(unused -> {
logger.info("All resources uploaded");
showToast("Ready to print!");
})
.exceptionally(error -> {
logger.error("Upload failed: {}", error.getMessage());
return null;
});

Uploading from Device Storage

Upload files the user selected (e.g., from a file picker):

Single File

Uri templateUri = /* from file picker */;

deviceAdapter.registerResource(templateUri, true, new ProgressCallback() {
@Override
public void onProgress(String fileName, int current, int total, double percent) {
logger.debug("Uploading {}: {:.0f}%", fileName, percent);
}
})
.thenAccept(unused -> logger.info("Uploaded from device storage"));

Multiple Files

List<Uri> selectedFiles = /* from file picker */;

deviceAdapter.registerResources(selectedFiles, true, progressCallback)
.thenAccept(unused -> logger.info("All files uploaded"));

Removing Resources

Free up device storage by removing resources you no longer need:

String resourceName = "OldTemplate.ngt";

deviceAdapter.unregisterResource(resourceName)
.thenAccept(unused -> {
logger.info("Removed: {}", resourceName);
})
.exceptionally(error -> {
logger.error("Failed to remove {}: {}", resourceName, error.getMessage());
return null;
});

Progress Tracking

The ProgressCallback provides everything you need for a great user experience:

new ProgressCallback() {
@Override
public void onProgress(String fileName, int current, int total, double percent) {
// fileName: Current file being uploaded (e.g., "PriceTag.ngt")
// current: Current file number (1-based)
// total: Total number of files
// percent: Progress of current file (0.0 to 100.0)

runOnUiThread(() -> {
// Update UI
currentFileText.setText("Uploading: " + fileName);
fileProgressBar.setProgress((int) percent);
overallProgressBar.setProgress((current * 100) / total);
progressText.setText(String.format("%d of %d files", current, total));
});
}
}

Troubleshooting

ProblemSolution
"File not found" errorVerify the file exists in assets/ folder and path is correct
Upload times outCheck Bluetooth connection; large files may take longer
Resources don't appear on deviceEnsure overwrite: true if updating existing files
Upload succeeds but print failsCheck that font files referenced in templates are also uploaded

Next Steps

GuideWhat You'll Learn
PrintingUse uploaded templates to print labels
Getting StartedConnection setup basics
LoggingDebug resource upload issues