package com.eleybourn.bookcatalogue.scanner; import java.util.Hashtable; import com.eleybourn.bookcatalogue.BookCatalogueApp; /** * Class to handle details of specific scanner interfaces and return a * Scanner object to the caller. * * @author pjw */ public class ScannerManager { /** Preference key */ public static final String PREF_PREFERRED_SCANNER = "ScannerManager.PreferredScanner"; /** Unique IDs to associate with each supported scanner intent */ public static final int SCANNER_ZXING_COMPATIBLE = 1; public static final int SCANNER_PIC2SHOP = 2; public static final int SCANNER_ZXING = 3; /** * Support for creating scanner objects on the fly without know which ones are available. * * @author pjw */ private interface ScannerFactory { /** Create a new scanner of the related type */ public Scanner newInstance(); /** Check if this scanner is available */ public boolean isIntentAvaiable(); } /** * Collection of ScannerFactory objects */ private static final Hashtable<Integer,ScannerFactory> myScannerFactories = new Hashtable<Integer,ScannerFactory>(); /** * Build the collection */ static { myScannerFactories.put(SCANNER_ZXING_COMPATIBLE, new ScannerFactory() { @Override public Scanner newInstance() { return new ZxingScanner(false); } @Override public boolean isIntentAvaiable() { return ZxingScanner.isIntentAvailable(false); }}); myScannerFactories.put(SCANNER_ZXING, new ScannerFactory() { @Override public Scanner newInstance() { return new ZxingScanner(true); } @Override public boolean isIntentAvaiable() { return ZxingScanner.isIntentAvailable(true); }}); myScannerFactories.put(SCANNER_PIC2SHOP, new ScannerFactory() { @Override public Scanner newInstance() { return new Pic2ShopScanner(); } @Override public boolean isIntentAvaiable() { return Pic2ShopScanner.isIntentAvailable(); }}); } /** * Return a Scanner object based on the current environment and user preferences. * * @return A Scanner */ public static Scanner getScanner() { // Find out what the user prefers if any int prefScanner = BookCatalogueApp.getAppPreferences().getInt( PREF_PREFERRED_SCANNER, SCANNER_ZXING_COMPATIBLE); // See if preferred one is present, if so return a new instance ScannerFactory psf = myScannerFactories.get(prefScanner); if (psf != null && psf.isIntentAvaiable()) { return psf.newInstance(); } // Search all supported scanners. If none, just return a Zxing one for(ScannerFactory sf: myScannerFactories.values()) { if (sf != psf && sf.isIntentAvaiable()) { return sf.newInstance(); } } return new ZxingScanner(false); } }