// Path: app/src/main/java/com/ftinc/showcase/ShowcaseApp.java
// public class ShowcaseApp extends Application {
// 
//     public static final String DB_NAME = "Showcase.db";
//     public static final int DB_VERSION = 1;
// 
//     private ObjectGraph objectGraph;
// 
//     @Override
//     public void onCreate() {
// 
//         if(BuildConfig.DEBUG){
//             Timber.plant(new Timber.DebugTree());
//             Timber.plant(new CrashlyticsTree(this));
//         }else{
//             Timber.plant(new CrashlyticsTree(this));
//         }
// 
//         // Initialize PostOffice
//         PostOffice.lick(new Stamp.Builder(this)
//                 .setCancelable(true)
//                 .setCanceledOnTouchOutside(true)
//                 .setDesign(Design.MATERIAL_LIGHT)
//                 .setThemeColorResource(R.color.accent)
//                 .build());
// 
//         // Intialize Ollie
//         Ollie.with(this)
//              .setName(DB_NAME)
//              .setVersion(DB_VERSION)
//              .setLogLevel(BuildConfig.DEBUG ? Ollie.LogLevel.FULL : Ollie.LogLevel.NONE)
//              .init();
// 
//         // Build and Inject Dagger Object Graph
//         buildObjectGraphAndInject();
// 
//     }
// 
//     @DebugLog
//     public void buildObjectGraphAndInject(){
//         objectGraph = ObjectGraph.create(new Object[]{
//             new ShowcaseModule(this)
//         });
//         objectGraph.inject(this);
//     }
// 
//     /**
//      * Create a scoped object graph
//      *
//      * @param modules       the list of modules to add to the scope
//      * @return              the scoped graph
//      */
//     public ObjectGraph createScopedGraph(Object... modules){
//         return objectGraph.plus(modules);
//     }
// 
//     /**
//      * Inject an object with the object graph
//      */
//     public void inject(Object o){
//         objectGraph.inject(o);
//     }
// 
//     /**
//      * Get a reference to the Application
//      *
//      * @param ctx       the context
//      *
//      * @return          the ChipperApp reference
//      */
//     public static ShowcaseApp get(Context ctx){
//         return (ShowcaseApp) ctx.getApplicationContext();
//     }
// 
//     /**
//      * Get a reference to this application with a service
//      * object
//      *
//      * @param ctx
//      * @return
//      */
//     public static ShowcaseApp get(Service ctx){
//         return (ShowcaseApp) ctx.getApplication();
//     }
// 
// }
// 
// Path: app/src/main/java/com/ftinc/showcase/ui/lock/LockType.java
// public enum LockType{
//     NONE("None"),
//     PIN("PIN"),
//     PATTERN("Pattern"),
//     PASSWORD("Password");
// 
//     // The proper name
//     private final String mName;
// 
//     /**
//      * Constructor
//      * @param name      the proper name for this enum
//      */
//     LockType(String name){
//         mName = name;
//     }
// 
//     public static LockType from(int ordinal){
//         return LockType.values()[ordinal];
//     }
// 
//     /**
//      * Create the lockscreen for this given type
//      * @return      the lockscreen implementation for this type
//      */
//     public Lockscreen create(Context ctx){
//         switch (this){
//             case PIN:
//                 return new Lockscreen.Builder(ctx, this)
//                         .ui(new PinUI())
//                         .storage(new SecurePrefStorage(ctx))
//                         .authenticator(new BasicAuth())
//                         .build();
// 
//             case PATTERN:
//                 return new Lockscreen.Builder(ctx, this)
//                         .ui(new PatternUI())
//                         .storage(new SecurePrefStorage(ctx))
//                         .authenticator(new BasicAuth())
//                         .build();
// 
//             case PASSWORD:
//                 return null;
//             default:
//                 return null;
//         }
//     }
// 
//     /**
//      * Get this lockscreen's storage key
//      */
//     public String getKey(){
//         return String.format("lockscreen_key_%s", toString());
//     }
// 
//     /**
//      * Get the proper name for this enum
//      * @return      the enum's proper name
//      */
//     public String getName(){
//         return mName;
//     }
// 
// }


import android.content.Context;
import android.util.Base64;
import com.ftinc.kit.preferences.SecurePreferences;
import com.ftinc.showcase.ShowcaseApp;
import com.ftinc.showcase.ui.lock.LockType;
import javax.inject.Inject;
package com.ftinc.showcase.ui.lock.storage;




/**
 * Basic storage mechanism that stores the data in base64 strings using {@link android.util.Base64}
 * in the Secure AES-256 SharedPreference wrapper: {@link SecurePreferences}
 *
 * Project: Showcase
 * Package: com.ftinc.showcase.ui.lock.storage
 * Created by drew.heavner on 3/2/15.
 */
public class SecurePrefStorage implements Storage{

    @Inject
    SecurePreferences mSecPrefs;

    /**
     * Constructor
     *
     * @param ctx       the context reference to inject with
     */
    public SecurePrefStorage(Context ctx){
        ShowcaseApp.get(ctx).inject(this);
    }


    @Override
    public void deposit(byte[] input, LockType type) {
        String encoded = Base64.encodeToString(input, Base64.DEFAULT);
        mSecPrefs.put(type.getKey(), encoded);
    }

    @Override
// Path: app/src/main/java/com/ftinc/showcase/ShowcaseApp.java
// public class ShowcaseApp extends Application {
// 
//     public static final String DB_NAME = "Showcase.db";
//     public static final int DB_VERSION = 1;
// 
//     private ObjectGraph objectGraph;
// 
//     @Override
//     public void onCreate() {
// 
//         if(BuildConfig.DEBUG){
//             Timber.plant(new Timber.DebugTree());
//             Timber.plant(new CrashlyticsTree(this));
//         }else{
//             Timber.plant(new CrashlyticsTree(this));
//         }
// 
//         // Initialize PostOffice
//         PostOffice.lick(new Stamp.Builder(this)
//                 .setCancelable(true)
//                 .setCanceledOnTouchOutside(true)
//                 .setDesign(Design.MATERIAL_LIGHT)
//                 .setThemeColorResource(R.color.accent)
//                 .build());
// 
//         // Intialize Ollie
//         Ollie.with(this)
//              .setName(DB_NAME)
//              .setVersion(DB_VERSION)
//              .setLogLevel(BuildConfig.DEBUG ? Ollie.LogLevel.FULL : Ollie.LogLevel.NONE)
//              .init();
// 
//         // Build and Inject Dagger Object Graph
//         buildObjectGraphAndInject();
// 
//     }
// 
//     @DebugLog
//     public void buildObjectGraphAndInject(){
//         objectGraph = ObjectGraph.create(new Object[]{
//             new ShowcaseModule(this)
//         });
//         objectGraph.inject(this);
//     }
// 
//     /**
//      * Create a scoped object graph
//      *
//      * @param modules       the list of modules to add to the scope
//      * @return              the scoped graph
//      */
//     public ObjectGraph createScopedGraph(Object... modules){
//         return objectGraph.plus(modules);
//     }
// 
//     /**
//      * Inject an object with the object graph
//      */
//     public void inject(Object o){
//         objectGraph.inject(o);
//     }
// 
//     /**
//      * Get a reference to the Application
//      *
//      * @param ctx       the context
//      *
//      * @return          the ChipperApp reference
//      */
//     public static ShowcaseApp get(Context ctx){
//         return (ShowcaseApp) ctx.getApplicationContext();
//     }
// 
//     /**
//      * Get a reference to this application with a service
//      * object
//      *
//      * @param ctx
//      * @return
//      */
//     public static ShowcaseApp get(Service ctx){
//         return (ShowcaseApp) ctx.getApplication();
//     }
// 
// }
// 
// Path: app/src/main/java/com/ftinc/showcase/ui/lock/LockType.java
// public enum LockType{
//     NONE("None"),
//     PIN("PIN"),
//     PATTERN("Pattern"),
//     PASSWORD("Password");
// 
//     // The proper name
//     private final String mName;
// 
//     /**
//      * Constructor
//      * @param name      the proper name for this enum
//      */
//     LockType(String name){
//         mName = name;
//     }
// 
//     public static LockType from(int ordinal){
//         return LockType.values()[ordinal];
//     }
// 
//     /**
//      * Create the lockscreen for this given type
//      * @return      the lockscreen implementation for this type
//      */
//     public Lockscreen create(Context ctx){
//         switch (this){
//             case PIN:
//                 return new Lockscreen.Builder(ctx, this)
//                         .ui(new PinUI())
//                         .storage(new SecurePrefStorage(ctx))
//                         .authenticator(new BasicAuth())
//                         .build();
// 
//             case PATTERN:
//                 return new Lockscreen.Builder(ctx, this)
//                         .ui(new PatternUI())
//                         .storage(new SecurePrefStorage(ctx))
//                         .authenticator(new BasicAuth())
//                         .build();
// 
//             case PASSWORD:
//                 return null;
//             default:
//                 return null;
//         }
//     }
// 
//     /**
//      * Get this lockscreen's storage key
//      */
//     public String getKey(){
//         return String.format("lockscreen_key_%s", toString());
//     }
// 
//     /**
//      * Get the proper name for this enum
//      * @return      the enum's proper name
//      */
//     public String getName(){
//         return mName;
//     }
// 
// }


// Path: app/src/main/java/com/ftinc/showcase/ui/lock/storage/SecurePrefStorage.java
import android.content.Context;
import android.util.Base64;
import com.ftinc.kit.preferences.SecurePreferences;
import com.ftinc.showcase.ShowcaseApp;
import com.ftinc.showcase.ui.lock.LockType;
import javax.inject.Inject;

package com.ftinc.showcase.ui.lock.storage;




/**
 * Basic storage mechanism that stores the data in base64 strings using {@link android.util.Base64}
 * in the Secure AES-256 SharedPreference wrapper: {@link SecurePreferences}
 *
 * Project: Showcase
 * Package: com.ftinc.showcase.ui.lock.storage
 * Created by drew.heavner on 3/2/15.
 */
public class SecurePrefStorage implements Storage{

    @Inject
    SecurePreferences mSecPrefs;

    /**
     * Constructor
     *
     * @param ctx       the context reference to inject with
     */
    public SecurePrefStorage(Context ctx){
        ShowcaseApp.get(ctx).inject(this);
    }


    @Override
    public void deposit(byte[] input, LockType type) {
        String encoded = Base64.encodeToString(input, Base64.DEFAULT);
        mSecPrefs.put(type.getKey(), encoded);
    }

    @Override
    public byte[] withdraw(LockType type) {