Skip to main content
Version: 1.1.8.3

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