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:
| Type | Extension | Purpose |
|---|---|---|
| Templates | .ngt, .lnt | Label layouts with placeholders |
| Fonts | .TTF | Custom 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:
| Parameter | Description |
|---|---|
assetPath | Path to the file in your assets/ folder |
overwrite | true to replace if file already exists on device, false to skip |
callback | Progress 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
| Problem | Solution |
|---|---|
| "File not found" error | Verify the file exists in assets/ folder and path is correct |
| Upload times out | Check Bluetooth connection; large files may take longer |
| Resources don't appear on device | Ensure overwrite: true if updating existing files |
| Upload succeeds but print fails | Check that font files referenced in templates are also uploaded |
Next Steps
| Guide | What You'll Learn |
|---|---|
| Printing | Use uploaded templates to print labels |
| Getting Started | Connection setup basics |
| Logging | Debug resource upload issues |