diff --git a/build.gradle b/build.gradle
index eff173b..81eaba9 100644
--- a/build.gradle
+++ b/build.gradle
@@ -99,7 +99,6 @@
 "connectivity/bluetooth/BluetoothAdvertisements",
 "wearable/wear/AlwaysOn",
 "security/ConfirmCredential",
-"security/FingerprintDialog",
 "system/RuntimePermissions",
 "system/RuntimePermissionsBasic",
 "wearable/wear/RuntimePermissionsWear",
@@ -112,7 +111,6 @@
 "content/DirectShare",
 "media/MidiScope",
 "media/MidiSynth",
-"security/AsymmetricFingerprintDialog",
 "wearable/wear/WearSpeakerSample",
 "wearable/wear/WearDrawers",
 "ui/window/DragAndDropAcrossApps",
diff --git a/security/AsymmetricFingerprintDialog/Application/.gitignore b/security/AsymmetricFingerprintDialog/Application/.gitignore
deleted file mode 100644
index 6eb878d..0000000
--- a/security/AsymmetricFingerprintDialog/Application/.gitignore
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2013 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-src/template/
-src/common/
-build.gradle
diff --git a/security/AsymmetricFingerprintDialog/Application/proguard-project.txt b/security/AsymmetricFingerprintDialog/Application/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/security/AsymmetricFingerprintDialog/Application/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/AndroidManifest.xml b/security/AsymmetricFingerprintDialog/Application/src/main/AndroidManifest.xml
deleted file mode 100644
index 4dce266..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright 2015 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<manifest package="com.example.android.asymmetricfingerprintdialog"
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:versionCode="1"
-    android:versionName="1.0">
-
-    <uses-permission android:name="android.permission.USE_FINGERPRINT" />
-
-    <application
-        android:name=".InjectedApplication"
-        android:allowBackup="true"
-        android:icon="@mipmap/ic_launcher"
-        android:label="@string/app_name"
-        android:supportsRtl="true"
-        android:theme="@style/AppTheme"
-        tools:ignore="GoogleAppIndexingWarning">
-
-        <activity
-            android:name=".MainActivity"
-            android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-
-        <activity
-            android:name=".SettingsActivity"
-            android:label="@string/action_settings" />
-    </application>
-</manifest>
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/FingerprintAuthenticationDialogFragment.java b/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/FingerprintAuthenticationDialogFragment.java
deleted file mode 100644
index fbe8ec9..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/FingerprintAuthenticationDialogFragment.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.asymmetricfingerprintdialog;
-
-import com.example.android.asymmetricfingerprintdialog.server.StoreBackend;
-import com.example.android.asymmetricfingerprintdialog.server.Transaction;
-
-import android.app.DialogFragment;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.hardware.fingerprint.FingerprintManager;
-import android.os.Bundle;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.EditText;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import java.io.IOException;
-import java.security.KeyFactory;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.PublicKey;
-import java.security.SecureRandom;
-import java.security.Signature;
-import java.security.SignatureException;
-import java.security.cert.CertificateException;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.X509EncodedKeySpec;
-
-import javax.inject.Inject;
-
-/**
- * A dialog which uses fingerprint APIs to authenticate the user, and falls back to password
- * authentication if fingerprint is not available.
- */
-public class FingerprintAuthenticationDialogFragment extends DialogFragment
-        implements TextView.OnEditorActionListener, FingerprintUiHelper.Callback {
-
-    private Button mCancelButton;
-    private Button mSecondDialogButton;
-    private View mFingerprintContent;
-    private View mBackupContent;
-    private EditText mPassword;
-    private CheckBox mUseFingerprintFutureCheckBox;
-    private TextView mPasswordDescriptionTextView;
-    private TextView mNewFingerprintEnrolledTextView;
-
-    private Stage mStage = Stage.FINGERPRINT;
-
-    private FingerprintManager.CryptoObject mCryptoObject;
-    private FingerprintUiHelper mFingerprintUiHelper;
-    private MainActivity mActivity;
-
-    @Inject FingerprintUiHelper.FingerprintUiHelperBuilder mFingerprintUiHelperBuilder;
-    @Inject InputMethodManager mInputMethodManager;
-    @Inject SharedPreferences mSharedPreferences;
-    @Inject StoreBackend mStoreBackend;
-
-    @Inject
-    public FingerprintAuthenticationDialogFragment() {}
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        // Do not create a new Fragment when the Activity is re-created such as orientation changes.
-        setRetainInstance(true);
-        setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Material_Light_Dialog);
-
-        // We register a new user account here. Real apps should do this with proper UIs.
-        enroll();
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        getDialog().setTitle(getString(R.string.sign_in));
-        View v = inflater.inflate(R.layout.fingerprint_dialog_container, container, false);
-        mCancelButton = (Button) v.findViewById(R.id.cancel_button);
-        mCancelButton.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                dismiss();
-            }
-        });
-
-        mSecondDialogButton = (Button) v.findViewById(R.id.second_dialog_button);
-        mSecondDialogButton.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                if (mStage == Stage.FINGERPRINT) {
-                    goToBackup();
-                } else {
-                    verifyPassword();
-                }
-            }
-        });
-        mFingerprintContent = v.findViewById(R.id.fingerprint_container);
-        mBackupContent = v.findViewById(R.id.backup_container);
-        mPassword = (EditText) v.findViewById(R.id.password);
-        mPassword.setOnEditorActionListener(this);
-        mPasswordDescriptionTextView = (TextView) v.findViewById(R.id.password_description);
-        mUseFingerprintFutureCheckBox = (CheckBox)
-                v.findViewById(R.id.use_fingerprint_in_future_check);
-        mNewFingerprintEnrolledTextView = (TextView)
-                v.findViewById(R.id.new_fingerprint_enrolled_description);
-        mFingerprintUiHelper = mFingerprintUiHelperBuilder.build(
-                (ImageView) v.findViewById(R.id.fingerprint_icon),
-                (TextView) v.findViewById(R.id.fingerprint_status), this);
-        updateStage();
-
-        // If fingerprint authentication is not available, switch immediately to the backup
-        // (password) screen.
-        if (!mFingerprintUiHelper.isFingerprintAuthAvailable()) {
-            goToBackup();
-        }
-        return v;
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        if (mStage == Stage.FINGERPRINT) {
-            mFingerprintUiHelper.startListening(mCryptoObject);
-        }
-    }
-
-    public void setStage(Stage stage) {
-        mStage = stage;
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        mFingerprintUiHelper.stopListening();
-    }
-
-    @Override
-    public void onAttach(Context context) {
-        super.onAttach(context);
-        mActivity = (MainActivity) getActivity();
-    }
-
-    /**
-     * Sets the crypto object to be passed in when authenticating with fingerprint.
-     */
-    public void setCryptoObject(FingerprintManager.CryptoObject cryptoObject) {
-        mCryptoObject = cryptoObject;
-    }
-
-    /**
-     * Switches to backup (password) screen. This either can happen when fingerprint is not
-     * available or the user chooses to use the password authentication method by pressing the
-     * button. This can also happen when the user had too many fingerprint attempts.
-     */
-    private void goToBackup() {
-        mStage = Stage.PASSWORD;
-        updateStage();
-        mPassword.requestFocus();
-
-        // Show the keyboard.
-        mPassword.postDelayed(mShowKeyboardRunnable, 500);
-
-        // Fingerprint is not used anymore. Stop listening for it.
-        mFingerprintUiHelper.stopListening();
-    }
-
-    /**
-     * Enrolls a user to the fake backend.
-     */
-    private void enroll() {
-        try {
-            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
-            keyStore.load(null);
-            PublicKey publicKey = keyStore.getCertificate(MainActivity.KEY_NAME).getPublicKey();
-            // Provide the public key to the backend. In most cases, the key needs to be transmitted
-            // to the backend over the network, for which Key.getEncoded provides a suitable wire
-            // format (X.509 DER-encoded). The backend can then create a PublicKey instance from the
-            // X.509 encoded form using KeyFactory.generatePublic. This conversion is also currently
-            // needed on API Level 23 (Android M) due to a platform bug which prevents the use of
-            // Android Keystore public keys when their private keys require user authentication.
-            // This conversion creates a new public key which is not backed by Android Keystore and
-            // thus is not affected by the bug.
-            KeyFactory factory = KeyFactory.getInstance(publicKey.getAlgorithm());
-            X509EncodedKeySpec spec = new X509EncodedKeySpec(publicKey.getEncoded());
-            PublicKey verificationKey = factory.generatePublic(spec);
-            mStoreBackend.enroll("user", "password", verificationKey);
-        } catch (KeyStoreException | CertificateException | NoSuchAlgorithmException |
-                IOException | InvalidKeySpecException e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Checks whether the current entered password is correct, and dismisses the the dialog and lets
-     * the activity know about the result.
-     */
-    private void verifyPassword() {
-        Transaction transaction = new Transaction("user", 1, new SecureRandom().nextLong());
-        if (!mStoreBackend.verify(transaction, mPassword.getText().toString())) {
-            return;
-        }
-        if (mStage == Stage.NEW_FINGERPRINT_ENROLLED) {
-            SharedPreferences.Editor editor = mSharedPreferences.edit();
-            editor.putBoolean(getString(R.string.use_fingerprint_to_authenticate_key),
-                    mUseFingerprintFutureCheckBox.isChecked());
-            editor.apply();
-
-            if (mUseFingerprintFutureCheckBox.isChecked()) {
-                // Re-create the key so that fingerprints including new ones are validated.
-                mActivity.createKeyPair();
-                mStage = Stage.FINGERPRINT;
-            }
-        }
-        mPassword.setText("");
-        mActivity.onPurchased(null);
-        dismiss();
-    }
-
-    private final Runnable mShowKeyboardRunnable = new Runnable() {
-        @Override
-        public void run() {
-            mInputMethodManager.showSoftInput(mPassword, 0);
-        }
-    };
-
-    private void updateStage() {
-        switch (mStage) {
-            case FINGERPRINT:
-                mCancelButton.setText(R.string.cancel);
-                mSecondDialogButton.setText(R.string.use_password);
-                mFingerprintContent.setVisibility(View.VISIBLE);
-                mBackupContent.setVisibility(View.GONE);
-                break;
-            case NEW_FINGERPRINT_ENROLLED:
-                // Intentional fall through
-            case PASSWORD:
-                mCancelButton.setText(R.string.cancel);
-                mSecondDialogButton.setText(R.string.ok);
-                mFingerprintContent.setVisibility(View.GONE);
-                mBackupContent.setVisibility(View.VISIBLE);
-                if (mStage == Stage.NEW_FINGERPRINT_ENROLLED) {
-                    mPasswordDescriptionTextView.setVisibility(View.GONE);
-                    mNewFingerprintEnrolledTextView.setVisibility(View.VISIBLE);
-                    mUseFingerprintFutureCheckBox.setVisibility(View.VISIBLE);
-                }
-                break;
-        }
-    }
-
-    @Override
-    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
-        if (actionId == EditorInfo.IME_ACTION_GO) {
-            verifyPassword();
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public void onAuthenticated() {
-        // Callback from FingerprintUiHelper. Let the activity know that authentication was
-        // successful.
-        mPassword.setText("");
-        Signature signature = mCryptoObject.getSignature();
-        // Include a client nonce in the transaction so that the nonce is also signed by the private
-        // key and the backend can verify that the same nonce can't be used to prevent replay
-        // attacks.
-        Transaction transaction = new Transaction("user", 1, new SecureRandom().nextLong());
-        try {
-            signature.update(transaction.toByteArray());
-            byte[] sigBytes = signature.sign();
-            if (mStoreBackend.verify(transaction, sigBytes)) {
-                mActivity.onPurchased(sigBytes);
-                dismiss();
-            } else {
-                mActivity.onPurchaseFailed();
-                dismiss();
-            }
-        } catch (SignatureException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public void onError() {
-        goToBackup();
-    }
-
-    /**
-     * Enumeration to indicate which authentication method the user is trying to authenticate with.
-     */
-    public enum Stage {
-        FINGERPRINT,
-        NEW_FINGERPRINT_ENROLLED,
-        PASSWORD
-    }
-}
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/FingerprintModule.java b/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/FingerprintModule.java
deleted file mode 100644
index ae3acf8..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/FingerprintModule.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.asymmetricfingerprintdialog;
-
-import com.example.android.asymmetricfingerprintdialog.server.StoreBackend;
-import com.example.android.asymmetricfingerprintdialog.server.StoreBackendImpl;
-
-import android.app.KeyguardManager;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.hardware.fingerprint.FingerprintManager;
-import android.preference.PreferenceManager;
-import android.security.keystore.KeyProperties;
-import android.view.inputmethod.InputMethodManager;
-
-import java.security.KeyPairGenerator;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.NoSuchProviderException;
-import java.security.Signature;
-
-import dagger.Module;
-import dagger.Provides;
-
-/**
- * Dagger module for Fingerprint APIs.
- */
-@Module(
-        library = true,
-        injects = {MainActivity.class}
-)
-public class FingerprintModule {
-
-    private final Context mContext;
-
-    public FingerprintModule(Context context) {
-        mContext = context;
-    }
-
-    @Provides
-    public Context providesContext() {
-        return mContext;
-    }
-
-    @Provides
-    public FingerprintManager providesFingerprintManager(Context context) {
-        return context.getSystemService(FingerprintManager.class);
-    }
-
-    @Provides
-    public KeyguardManager providesKeyguardManager(Context context) {
-        return context.getSystemService(KeyguardManager.class);
-    }
-
-    @Provides
-    public KeyStore providesKeystore() {
-        try {
-            return KeyStore.getInstance("AndroidKeyStore");
-        } catch (KeyStoreException e) {
-            throw new RuntimeException("Failed to get an instance of KeyStore", e);
-        }
-    }
-
-    @Provides
-    public KeyPairGenerator providesKeyPairGenerator() {
-        try {
-            return KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
-        } catch (NoSuchAlgorithmException | NoSuchProviderException e) {
-            throw new RuntimeException("Failed to get an instance of KeyPairGenerator", e);
-        }
-    }
-
-    @Provides
-    public Signature providesSignature(KeyStore keyStore) {
-        try {
-            return Signature.getInstance("SHA256withECDSA");
-        } catch (NoSuchAlgorithmException e) {
-            throw new RuntimeException("Failed to get an instance of Signature", e);
-        }
-    }
-
-    @Provides
-    public InputMethodManager providesInputMethodManager(Context context) {
-        return (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
-    }
-
-    @Provides
-    public SharedPreferences providesSharedPreferences(Context context) {
-        return PreferenceManager.getDefaultSharedPreferences(context);
-    }
-
-    @Provides
-    public StoreBackend providesStoreBackend() {
-        return new StoreBackendImpl();
-    }
-}
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/FingerprintUiHelper.java b/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/FingerprintUiHelper.java
deleted file mode 100644
index 847bec8..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/FingerprintUiHelper.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.asymmetricfingerprintdialog;
-
-import android.hardware.fingerprint.FingerprintManager;
-import android.os.CancellationSignal;
-import android.support.annotation.VisibleForTesting;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import javax.inject.Inject;
-
-/**
- * Small helper class to manage text/icon around fingerprint authentication UI.
- * This class assumes that the {@link android.Manifest.permission#USE_FINGERPRINT}
- * permission has already been granted. (As of API 23 this permission is normal instead of dangerous
- * and is granted at install time.)
- */
-@SuppressWarnings("MissingPermission")
-public class FingerprintUiHelper extends FingerprintManager.AuthenticationCallback {
-
-    @VisibleForTesting static final long ERROR_TIMEOUT_MILLIS = 1600;
-    @VisibleForTesting static final long SUCCESS_DELAY_MILLIS = 1300;
-
-    private final FingerprintManager mFingerprintManager;
-    private final ImageView mIcon;
-    private final TextView mErrorTextView;
-    private final Callback mCallback;
-    private CancellationSignal mCancellationSignal;
-
-    @VisibleForTesting boolean mSelfCancelled;
-
-    /**
-     * Builder class for {@link FingerprintUiHelper} in which injected fields from Dagger
-     * holds its fields and takes other arguments in the {@link #build} method.
-     */
-    public static class FingerprintUiHelperBuilder {
-        private final FingerprintManager mFingerPrintManager;
-
-        @Inject
-        public FingerprintUiHelperBuilder(FingerprintManager fingerprintManager) {
-            mFingerPrintManager = fingerprintManager;
-        }
-
-        public FingerprintUiHelper build(ImageView icon, TextView errorTextView, Callback callback) {
-            return new FingerprintUiHelper(mFingerPrintManager, icon, errorTextView,
-                    callback);
-        }
-    }
-
-    /**
-     * Constructor for {@link FingerprintUiHelper}. This method is expected to be called from
-     * only the {@link FingerprintUiHelperBuilder} class.
-     */
-    private FingerprintUiHelper(FingerprintManager fingerprintManager,
-            ImageView icon, TextView errorTextView, Callback callback) {
-        mFingerprintManager = fingerprintManager;
-        mIcon = icon;
-        mErrorTextView = errorTextView;
-        mCallback = callback;
-    }
-
-    public boolean isFingerprintAuthAvailable() {
-        return mFingerprintManager.isHardwareDetected()
-                && mFingerprintManager.hasEnrolledFingerprints();
-    }
-
-    public void startListening(FingerprintManager.CryptoObject cryptoObject) {
-        if (!isFingerprintAuthAvailable()) {
-            return;
-        }
-        mCancellationSignal = new CancellationSignal();
-        mSelfCancelled = false;
-        mFingerprintManager
-                .authenticate(cryptoObject, mCancellationSignal, 0 /* flags */, this, null);
-        mIcon.setImageResource(R.drawable.ic_fp_40px);
-    }
-
-    public void stopListening() {
-        if (mCancellationSignal != null) {
-            mSelfCancelled = true;
-            mCancellationSignal.cancel();
-            mCancellationSignal = null;
-        }
-    }
-
-    @Override
-    public void onAuthenticationError(int errMsgId, CharSequence errString) {
-        if (!mSelfCancelled) {
-            showError(errString);
-            mIcon.postDelayed(new Runnable() {
-                @Override
-                public void run() {
-                    mCallback.onError();
-                }
-            }, ERROR_TIMEOUT_MILLIS);
-        }
-    }
-
-    @Override
-    public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
-        showError(helpString);
-    }
-
-    @Override
-    public void onAuthenticationFailed() {
-        showError(mIcon.getResources().getString(
-                R.string.fingerprint_not_recognized));
-    }
-
-    @Override
-    public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
-        mErrorTextView.removeCallbacks(mResetErrorTextRunnable);
-        mIcon.setImageResource(R.drawable.ic_fingerprint_success);
-        mErrorTextView.setTextColor(
-                mErrorTextView.getResources().getColor(R.color.success_color, null));
-        mErrorTextView.setText(
-                mErrorTextView.getResources().getString(R.string.fingerprint_success));
-        mIcon.postDelayed(new Runnable() {
-            @Override
-            public void run() {
-                mCallback.onAuthenticated();
-            }
-        }, SUCCESS_DELAY_MILLIS);
-    }
-
-    private void showError(CharSequence error) {
-        mIcon.setImageResource(R.drawable.ic_fingerprint_error);
-        mErrorTextView.setText(error);
-        mErrorTextView.setTextColor(
-                mErrorTextView.getResources().getColor(R.color.warning_color, null));
-        mErrorTextView.removeCallbacks(mResetErrorTextRunnable);
-        mErrorTextView.postDelayed(mResetErrorTextRunnable, ERROR_TIMEOUT_MILLIS);
-    }
-
-    @VisibleForTesting
-    Runnable mResetErrorTextRunnable = new Runnable() {
-        @Override
-        public void run() {
-            mErrorTextView.setTextColor(
-                    mErrorTextView.getResources().getColor(R.color.hint_color, null));
-            mErrorTextView.setText(
-                    mErrorTextView.getResources().getString(R.string.fingerprint_hint));
-            mIcon.setImageResource(R.drawable.ic_fp_40px);
-        }
-    };
-
-    public interface Callback {
-
-        void onAuthenticated();
-
-        void onError();
-    }
-}
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/InjectedApplication.java b/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/InjectedApplication.java
deleted file mode 100644
index 1c3ed7e..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/InjectedApplication.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.asymmetricfingerprintdialog;
-
-import android.app.Application;
-import android.util.Log;
-
-import dagger.ObjectGraph;
-
-/**
- * The Application class of the sample which holds the ObjectGraph in Dagger and enables
- * dependency injection.
- */
-public class InjectedApplication extends Application {
-
-    private static final String TAG = InjectedApplication.class.getSimpleName();
-
-    private ObjectGraph mObjectGraph;
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-
-        initObjectGraph(new FingerprintModule(this));
-    }
-
-    /**
-     * Initialize the Dagger module. Passing null or mock modules can be used for testing.
-     *
-     * @param module for Dagger
-     */
-    public void initObjectGraph(Object module) {
-        mObjectGraph = module != null ? ObjectGraph.create(module) : null;
-    }
-
-    public void inject(Object object) {
-        if (mObjectGraph == null) {
-            // This usually happens during tests.
-            Log.i(TAG, "Object graph is not initialized.");
-            return;
-        }
-        mObjectGraph.inject(object);
-    }
-
-}
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/MainActivity.java b/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/MainActivity.java
deleted file mode 100644
index 26832f2..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/MainActivity.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.asymmetricfingerprintdialog;
-
-import android.app.Activity;
-import android.app.KeyguardManager;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.hardware.fingerprint.FingerprintManager;
-import android.os.Bundle;
-import android.security.keystore.KeyGenParameterSpec;
-import android.security.keystore.KeyPermanentlyInvalidatedException;
-import android.security.keystore.KeyProperties;
-import android.util.Base64;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.Button;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import java.io.IOException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.KeyPairGenerator;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.Signature;
-import java.security.UnrecoverableKeyException;
-import java.security.cert.CertificateException;
-import java.security.spec.ECGenParameterSpec;
-
-import javax.inject.Inject;
-
-/**
- * Main entry point for the sample, showing a backpack and "Purchase" button.
- */
-public class MainActivity extends Activity {
-
-    private static final String DIALOG_FRAGMENT_TAG = "myFragment";
-    /** Alias for our key in the Android Key Store */
-    public static final String KEY_NAME = "my_key";
-
-    @Inject KeyguardManager mKeyguardManager;
-    @Inject FingerprintManager mFingerprintManager;
-    @Inject FingerprintAuthenticationDialogFragment mFragment;
-    @Inject KeyStore mKeyStore;
-    @Inject KeyPairGenerator mKeyPairGenerator;
-    @Inject Signature mSignature;
-    @Inject SharedPreferences mSharedPreferences;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        ((InjectedApplication) getApplication()).inject(this);
-
-        setContentView(R.layout.activity_main);
-        Button purchaseButton = (Button) findViewById(R.id.purchase_button);
-        if (!mKeyguardManager.isKeyguardSecure()) {
-            // Show a message that the user hasn't set up a fingerprint or lock screen.
-            Toast.makeText(this,
-                    "Secure lock screen hasn't set up.\n"
-                            + "Go to 'Settings -> Security -> Fingerprint' to set up a fingerprint",
-                    Toast.LENGTH_LONG).show();
-            purchaseButton.setEnabled(false);
-            return;
-        }
-        //noinspection ResourceType
-        if (!mFingerprintManager.hasEnrolledFingerprints()) {
-            purchaseButton.setEnabled(false);
-            // This happens when no fingerprints are registered.
-            Toast.makeText(this,
-                    "Go to 'Settings -> Security -> Fingerprint' and register at least one fingerprint",
-                    Toast.LENGTH_LONG).show();
-            return;
-        }
-        createKeyPair();
-        purchaseButton.setEnabled(true);
-        purchaseButton.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                findViewById(R.id.confirmation_message).setVisibility(View.GONE);
-                findViewById(R.id.encrypted_message).setVisibility(View.GONE);
-
-                // Set up the crypto object for later. The object will be authenticated by use
-                // of the fingerprint.
-                if (initSignature()) {
-
-                    // Show the fingerprint dialog. The user has the option to use the fingerprint with
-                    // crypto, or you can fall back to using a server-side verified password.
-                    mFragment.setCryptoObject(new FingerprintManager.CryptoObject(mSignature));
-                    boolean useFingerprintPreference = mSharedPreferences
-                            .getBoolean(getString(R.string.use_fingerprint_to_authenticate_key),
-                                    true);
-                    if (useFingerprintPreference) {
-                        mFragment.setStage(
-                                FingerprintAuthenticationDialogFragment.Stage.FINGERPRINT);
-                    } else {
-                        mFragment.setStage(
-                                FingerprintAuthenticationDialogFragment.Stage.PASSWORD);
-                    }
-                    mFragment.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);
-                } else {
-                    // This happens if the lock screen has been disabled or or a fingerprint got
-                    // enrolled. Thus show the dialog to authenticate with their password first
-                    // and ask the user if they want to authenticate with fingerprints in the
-                    // future
-                    mFragment.setStage(
-                            FingerprintAuthenticationDialogFragment.Stage.NEW_FINGERPRINT_ENROLLED);
-                    mFragment.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);
-                }
-            }
-        });
-    }
-
-    /**
-     * Initialize the {@link Signature} instance with the created key in the
-     * {@link #createKeyPair()} method.
-     *
-     * @return {@code true} if initialization is successful, {@code false} if the lock screen has
-     * been disabled or reset after the key was generated, or if a fingerprint got enrolled after
-     * the key was generated.
-     */
-    private boolean initSignature() {
-        try {
-            mKeyStore.load(null);
-            PrivateKey key = (PrivateKey) mKeyStore.getKey(KEY_NAME, null);
-            mSignature.initSign(key);
-            return true;
-        } catch (KeyPermanentlyInvalidatedException e) {
-            return false;
-        } catch (KeyStoreException | CertificateException | UnrecoverableKeyException | IOException
-                | NoSuchAlgorithmException | InvalidKeyException e) {
-            throw new RuntimeException("Failed to init Cipher", e);
-        }
-    }
-
-    public void onPurchased(byte[] signature) {
-        showConfirmation(signature);
-    }
-
-    public void onPurchaseFailed() {
-        Toast.makeText(this, R.string.purchase_fail, Toast.LENGTH_SHORT).show();
-    }
-
-    // Show confirmation, if fingerprint was used show crypto information.
-    private void showConfirmation(byte[] encrypted) {
-        findViewById(R.id.confirmation_message).setVisibility(View.VISIBLE);
-        if (encrypted != null) {
-            TextView v = (TextView) findViewById(R.id.encrypted_message);
-            v.setVisibility(View.VISIBLE);
-            v.setText(Base64.encodeToString(encrypted, 0 /* flags */));
-        }
-    }
-
-    /**
-     * Generates an asymmetric key pair in the Android Keystore. Every use of the private key must
-     * be authorized by the user authenticating with fingerprint. Public key use is unrestricted.
-     */
-    public void createKeyPair() {
-        // The enrolling flow for fingerprint. This is where you ask the user to set up fingerprint
-        // for your flow. Use of keys is necessary if you need to know if the set of
-        // enrolled fingerprints has changed.
-        try {
-            // Set the alias of the entry in Android KeyStore where the key will appear
-            // and the constrains (purposes) in the constructor of the Builder
-            mKeyPairGenerator.initialize(
-                    new KeyGenParameterSpec.Builder(KEY_NAME,
-                            KeyProperties.PURPOSE_SIGN)
-                            .setDigests(KeyProperties.DIGEST_SHA256)
-                            .setAlgorithmParameterSpec(new ECGenParameterSpec("secp256r1"))
-                            // Require the user to authenticate with a fingerprint to authorize
-                            // every use of the private key
-                            .setUserAuthenticationRequired(true)
-                            .build());
-            mKeyPairGenerator.generateKeyPair();
-        } catch (InvalidAlgorithmParameterException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        getMenuInflater().inflate(R.menu.menu_main, menu);
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        int id = item.getItemId();
-
-        if (id == R.id.action_settings) {
-            Intent intent = new Intent(this, SettingsActivity.class);
-            startActivity(intent);
-            return true;
-        }
-        return super.onOptionsItemSelected(item);
-    }
-}
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/SettingsActivity.java b/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/SettingsActivity.java
deleted file mode 100644
index acc5e37..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/SettingsActivity.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.asymmetricfingerprintdialog;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.preference.PreferenceFragment;
-
-public class SettingsActivity extends Activity {
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        // Display the fragment as the main content.
-        getFragmentManager().beginTransaction().replace(android.R.id.content,
-                new SettingsFragment()).commit();
-    }
-
-    /**
-     * Fragment for settings.
-     */
-    public static class SettingsFragment extends PreferenceFragment {
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-            addPreferencesFromResource(R.xml.preferences);
-        }
-    }
-}
-
-
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/server/StoreBackend.java b/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/server/StoreBackend.java
deleted file mode 100644
index 87921ae..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/server/StoreBackend.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.asymmetricfingerprintdialog.server;
-
-import java.security.PublicKey;
-
-/**
- * An interface that defines the methods required for the store backend.
- */
-public interface StoreBackend {
-
-    /**
-     * Verifies the authenticity of the provided transaction by confirming that it was signed with
-     * the private key enrolled for the userId.
-     *
-     * @param transaction          the contents of the purchase transaction, its contents are
-     *                             signed
-     *                             by the
-     *                             private key in the client side.
-     * @param transactionSignature the signature of the transaction's contents.
-     * @return true if the signedSignature was verified, false otherwise. If this method returns
-     * true, the server can consider the transaction is successful.
-     */
-    boolean verify(Transaction transaction, byte[] transactionSignature);
-
-    /**
-     * Verifies the authenticity of the provided transaction by password.
-     *
-     * @param transaction the contents of the purchase transaction, its contents are signed by the
-     *                    private key in the client side.
-     * @param password    the password for the user associated with the {@code transaction}.
-     * @return true if the password is verified.
-     */
-    boolean verify(Transaction transaction, String password);
-
-    /**
-     * Enrolls a public key associated with the userId
-     *
-     * @param userId    the unique ID of the user within the app including server side
-     *                  implementation
-     * @param password  the password for the user for the server side
-     * @param publicKey the public key object to verify the signature from the user
-     * @return true if the enrollment was successful, false otherwise
-     */
-    boolean enroll(String userId, String password, PublicKey publicKey);
-}
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/server/StoreBackendImpl.java b/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/server/StoreBackendImpl.java
deleted file mode 100644
index b28dce4..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/server/StoreBackendImpl.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.asymmetricfingerprintdialog.server;
-
-
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-import java.security.PublicKey;
-import java.security.Signature;
-import java.security.SignatureException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * A fake backend implementation of {@link StoreBackend}.
- */
-public class StoreBackendImpl implements StoreBackend {
-
-    private final Map<String, PublicKey> mPublicKeys = new HashMap<>();
-    private final Set<Transaction> mReceivedTransactions = new HashSet<>();
-
-    @Override
-    public boolean verify(Transaction transaction, byte[] transactionSignature) {
-        try {
-            if (mReceivedTransactions.contains(transaction)) {
-                // It verifies the equality of the transaction including the client nonce
-                // So attackers can't do replay attacks.
-                return false;
-            }
-            mReceivedTransactions.add(transaction);
-            PublicKey publicKey = mPublicKeys.get(transaction.getUserId());
-            Signature verificationFunction = Signature.getInstance("SHA256withECDSA");
-            verificationFunction.initVerify(publicKey);
-            verificationFunction.update(transaction.toByteArray());
-            if (verificationFunction.verify(transactionSignature)) {
-                // Transaction is verified with the public key associated with the user
-                // Do some post purchase processing in the server
-                return true;
-            }
-        } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
-            // In a real world, better to send some error message to the user
-        }
-        return false;
-    }
-
-    @Override
-    public boolean verify(Transaction transaction, String password) {
-        // As this is just a sample, we always assume that the password is right.
-        return true;
-    }
-
-    @Override
-    public boolean enroll(String userId, String password, PublicKey publicKey) {
-        if (publicKey != null) {
-            mPublicKeys.put(userId, publicKey);
-        }
-        // We just ignore the provided password here, but in real life, it is registered to the
-        // backend.
-        return true;
-    }
-}
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/server/Transaction.java b/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/server/Transaction.java
deleted file mode 100644
index 789cc0e..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/java/com/example/android/asymmetricfingerprintdialog/server/Transaction.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.asymmetricfingerprintdialog.server;
-
-import java.io.ByteArrayOutputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.util.Objects;
-
-/**
- * An entity that represents a single transaction (purchase) of an item.
- */
-public class Transaction {
-
-    /** The unique ID of the item of the purchase */
-    private final Long mItemId;
-
-    /** The unique user ID who made the transaction */
-    private final String mUserId;
-
-    /**
-     * The random long value that will be also signed by the private key and verified in the server
-     * that the same nonce can't be reused to prevent replay attacks.
-     */
-    private final Long mClientNonce;
-
-    public Transaction(String userId, long itemId, long clientNonce) {
-        mItemId = itemId;
-        mUserId = userId;
-        mClientNonce = clientNonce;
-    }
-
-    public String getUserId() {
-        return mUserId;
-    }
-
-    public byte[] toByteArray() {
-        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-        DataOutputStream dataOutputStream = null;
-        try {
-            dataOutputStream = new DataOutputStream(byteArrayOutputStream);
-            dataOutputStream.writeLong(mItemId);
-            dataOutputStream.writeUTF(mUserId);
-            dataOutputStream.writeLong(mClientNonce);
-            return byteArrayOutputStream.toByteArray();
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        } finally {
-            try {
-                if (dataOutputStream != null) {
-                    dataOutputStream.close();
-                }
-            } catch (IOException ignore) {
-            }
-            try {
-                byteArrayOutputStream.close();
-            } catch (IOException ignore) {
-            }
-        }
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        Transaction that = (Transaction) o;
-        return Objects.equals(mItemId, that.mItemId) && Objects.equals(mUserId, that.mUserId) &&
-                Objects.equals(mClientNonce, that.mClientNonce);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mItemId, mUserId, mClientNonce);
-    }
-}
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-hdpi/ic_fp_40px.png b/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-hdpi/ic_fp_40px.png
deleted file mode 100644
index 48ebd8a..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-hdpi/ic_fp_40px.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-mdpi/ic_fp_40px.png b/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-mdpi/ic_fp_40px.png
deleted file mode 100644
index 122f442..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-mdpi/ic_fp_40px.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-nodpi/android_robot.png b/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-nodpi/android_robot.png
deleted file mode 100644
index 40bf934..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-nodpi/android_robot.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-xhdpi/ic_fp_40px.png b/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-xhdpi/ic_fp_40px.png
deleted file mode 100644
index e1c9590..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-xhdpi/ic_fp_40px.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-xxhdpi/ic_fp_40px.png b/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-xxhdpi/ic_fp_40px.png
deleted file mode 100644
index f7e8724..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-xxhdpi/ic_fp_40px.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-xxxhdpi/ic_fp_40px.png b/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-xxxhdpi/ic_fp_40px.png
deleted file mode 100644
index 0fb8545..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable-xxxhdpi/ic_fp_40px.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable/card.xml b/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable/card.xml
deleted file mode 100644
index 691a4c5..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable/card.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <solid
-        android:color="#fefefe"/>
-
-    <corners
-        android:radius="2dp" />
-</shape>
\ No newline at end of file
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable/ic_fingerprint_error.xml b/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable/ic_fingerprint_error.xml
deleted file mode 100644
index be46116..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable/ic_fingerprint_error.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="40.0dp"
-        android:height="40.0dp"
-        android:viewportWidth="40.0"
-        android:viewportHeight="40.0">
-    <path
-        android:pathData="M20.0,0.0C8.96,0.0 0.0,8.95 0.0,20.0s8.96,20.0 20.0,20.0c11.04,0.0 20.0,-8.95 20.0,-20.0S31.04,0.0 20.0,0.0z"
-        android:fillColor="#F4511E"/>
-    <path
-        android:pathData="M21.33,29.33l-2.67,0.0l0.0,-2.67l2.67,0.0L21.33,29.33zM21.33,22.67l-2.67,0.0l0.0,-12.0l2.67,0.0L21.33,22.67z"
-        android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable/ic_fingerprint_success.xml b/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable/ic_fingerprint_success.xml
deleted file mode 100644
index 261f3e7..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/drawable/ic_fingerprint_success.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="40.0dp"
-        android:height="40.0dp"
-        android:viewportWidth="40.0"
-        android:viewportHeight="40.0">
-    <path
-        android:pathData="M20.0,20.0m-20.0,0.0a20.0,20.0 0.0,1.0 1.0,40.0 0.0a20.0,20.0 0.0,1.0 1.0,-40.0 0.0"
-        android:fillColor="#009688"/>
-    <path
-        android:pathData="M11.2,21.41l1.63,-1.619999 4.17,4.169998 10.59,-10.589999 1.619999,1.63 -12.209999,12.209999z"
-        android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/layout/activity_main.xml b/security/AsymmetricFingerprintDialog/Application/src/main/res/layout/activity_main.xml
deleted file mode 100644
index 16b29bd..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/layout/activity_main.xml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<ScrollView
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-
-    <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="vertical">
-
-        <ImageView
-                android:layout_width="150dp"
-                android:layout_height="150dp"
-                android:layout_marginTop="32dp"
-                android:layout_marginBottom="32dp"
-                android:layout_gravity="center_horizontal"
-                android:scaleType="fitCenter"
-                android:src="@drawable/android_robot"
-                android:contentDescription="@string/description_bugdroid_icon" />
-
-        <LinearLayout
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="8dp"
-                android:layout_marginStart="8dp"
-                android:layout_marginEnd="8dp"
-                android:orientation="vertical"
-                android:background="@drawable/card"
-                android:elevation="4dp"
-                android:paddingTop="16dp"
-                android:paddingBottom="16dp"
-                android:paddingStart="16dp"
-                android:paddingEnd="16dp">
-
-            <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:textAppearance="@android:style/TextAppearance.Material.Headline"
-                    android:text="@string/item_title"/>
-
-            <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:textAppearance="@android:style/TextAppearance.Material.Body2"
-                    android:textColor="?android:attr/colorAccent"
-                    android:text="@string/item_price"/>
-
-            <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="16dp"
-                    android:textAppearance="@android:style/TextAppearance.Material.Body1"
-                    android:textColor="?android:attr/textColorSecondary"
-                    android:text="@string/item_description"/>
-
-        </LinearLayout>
-        <Button style="@android:style/Widget.Material.Button.Colored"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="8dp"
-                android:layout_marginEnd="4dp"
-                android:layout_gravity="end"
-                android:textColor="?android:attr/textColorPrimaryInverse"
-                android:text="@string/purchase"
-                android:id="@+id/purchase_button"/>
-
-        <TextView
-                android:id="@+id/confirmation_message"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="16dp"
-                android:paddingStart="16dp"
-                android:paddingEnd="16dp"
-                android:textAppearance="@android:style/TextAppearance.Material.Body2"
-                android:textColor="?android:attr/colorAccent"
-                android:text="@string/purchase_done"
-                android:visibility="gone"/>
-
-        <TextView
-                android:id="@+id/encrypted_message"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="16dp"
-                android:paddingStart="16dp"
-                android:paddingEnd="16dp"
-                android:textAppearance="@android:style/TextAppearance.Material.Body2"
-                android:textColor="?android:attr/colorAccent"
-                android:text="@string/purchase_done"
-                android:visibility="gone"/>
-    </LinearLayout>
-</ScrollView>
\ No newline at end of file
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_backup.xml b/security/AsymmetricFingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_backup.xml
deleted file mode 100644
index 2be05b1..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_backup.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/backup_container"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingTop="16dp"
-    android:paddingBottom="8dp">
-
-    <FrameLayout
-        android:id="@+id/description"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentTop="true"
-        android:layout_alignParentStart="true"
-        android:layout_marginStart="24dp"
-        android:layout_marginEnd="24dp"
-        >
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textAppearance="@android:style/TextAppearance.Material.Subhead"
-            android:text="@string/password_description"
-            android:id="@+id/password_description"
-            android:textColor="?android:attr/textColorSecondary" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textAppearance="@android:style/TextAppearance.Material.Subhead"
-            android:text="@string/new_fingerprint_enrolled_description"
-            android:id="@+id/new_fingerprint_enrolled_description"
-            android:visibility="gone"
-            android:textColor="?android:attr/textColorSecondary" />
-    </FrameLayout>
-
-    <EditText
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:inputType="textPassword"
-        android:ems="10"
-        android:hint="@string/password"
-        android:imeOptions="actionGo"
-        android:id="@+id/password"
-        android:layout_below="@+id/description"
-        android:layout_marginTop="16dp"
-        android:layout_marginStart="20dp"
-        android:layout_marginEnd="20dp"
-        android:layout_alignParentStart="true" />
-
-    <CheckBox
-        android:id="@+id/use_fingerprint_in_future_check"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/password"
-        android:layout_alignParentStart="true"
-        android:layout_marginTop="16dp"
-        android:layout_marginStart="20dp"
-        android:layout_marginEnd="20dp"
-        android:checked="true"
-        android:visibility="gone"
-        android:text="@string/use_fingerprint_in_future" />
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_container.xml b/security/AsymmetricFingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_container.xml
deleted file mode 100644
index 08bb1bb..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_container.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-
-    <FrameLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-
-        <include layout="@layout/fingerprint_dialog_content" />
-
-        <include
-            layout="@layout/fingerprint_dialog_backup"
-            android:visibility="gone" />
-
-    </FrameLayout>
-
-    <LinearLayout
-        android:id="@+id/buttonPanel"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:paddingStart="12dp"
-        android:paddingEnd="12dp"
-        android:paddingTop="4dp"
-        android:paddingBottom="4dp"
-        android:gravity="bottom"
-        style="?android:attr/buttonBarStyle">
-
-        <Space
-            android:id="@+id/spacer"
-            android:layout_width="0dp"
-            android:layout_height="0dp"
-            android:layout_weight="1"
-            android:visibility="invisible" />
-        <Button
-            android:id="@+id/cancel_button"
-            style="?android:attr/buttonBarNegativeButtonStyle"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"/>
-
-        <Button
-            android:id="@+id/second_dialog_button"
-            style="?android:attr/buttonBarPositiveButtonStyle"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"/>
-    </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_content.xml b/security/AsymmetricFingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_content.xml
deleted file mode 100644
index 5bb65b2..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_content.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/fingerprint_container"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingBottom="8dp"
-    android:paddingStart="24dp"
-    android:paddingEnd="24dp"
-    android:paddingTop="16dp">
-
-    <TextView
-        android:id="@+id/fingerprint_description"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentStart="true"
-        android:layout_alignParentTop="true"
-        android:text="@string/fingerprint_description"
-        android:textAppearance="@android:style/TextAppearance.Material.Subhead"
-        android:textColor="?android:attr/textColorSecondary"/>
-
-
-    <ImageView
-        android:id="@+id/fingerprint_icon"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentStart="true"
-        android:layout_below="@+id/fingerprint_description"
-        android:layout_marginTop="20dp"
-        android:src="@drawable/ic_fp_40px"
-        android:contentDescription="@string/description_fingerprint_icon"/>
-
-    <TextView
-        android:id="@+id/fingerprint_status"
-        style="@android:style/TextAppearance.Material.Body1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignBottom="@+id/fingerprint_icon"
-        android:layout_alignTop="@+id/fingerprint_icon"
-        android:layout_marginStart="16dp"
-        android:layout_toEndOf="@+id/fingerprint_icon"
-        android:gravity="center_vertical"
-        android:text="@string/fingerprint_hint"
-        android:textColor="@color/hint_color" />
-</RelativeLayout>
\ No newline at end of file
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/menu/menu_main.xml b/security/AsymmetricFingerprintDialog/Application/src/main/res/menu/menu_main.xml
deleted file mode 100644
index 1596970..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/menu/menu_main.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    tools:context=".MainActivity">
-    <item
-        android:id="@+id/action_settings"
-        android:orderInCategory="100"
-        android:title="@string/action_settings"
-        app:showAsAction="never" />
-</menu>
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/mipmap-hdpi/ic_launcher.png b/security/AsymmetricFingerprintDialog/Application/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index b82d7af..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/mipmap-mdpi/ic_launcher.png b/security/AsymmetricFingerprintDialog/Application/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index b0d26ba..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/mipmap-xhdpi/ic_launcher.png b/security/AsymmetricFingerprintDialog/Application/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 135858d..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png b/security/AsymmetricFingerprintDialog/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 02960da..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/security/AsymmetricFingerprintDialog/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index d425459..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/values/colors.xml b/security/AsymmetricFingerprintDialog/Application/src/main/res/values/colors.xml
deleted file mode 100644
index a24f3c8..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<resources>
-    <color name="warning_color">#f4511e</color>
-    <color name="hint_color">#42000000</color>
-    <color name="success_color">#009688</color>
-</resources>
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/values/strings.xml b/security/AsymmetricFingerprintDialog/Application/src/main/res/values/strings.xml
deleted file mode 100644
index 86b8d42..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<resources>
-    <string name="action_settings">Settings</string>
-    <string name="cancel">Cancel</string>
-    <string name="use_password">Use password</string>
-    <string name="sign_in">Sign in</string>
-    <string name="ok">OK</string>
-    <string name="password">Password</string>
-    <string name="fingerprint_description">Confirm fingerprint to continue</string>
-    <string name="fingerprint_hint">Touch sensor</string>
-    <string name="password_description">Enter your store password to continue</string>
-    <string name="purchase">Purchase</string>
-    <string name="fingerprint_not_recognized">Fingerprint not recognized. Try again</string>
-    <string name="fingerprint_success">Fingerprint recognized</string>
-    <string name="item_title">White Mesh Pluto Backpack</string>
-    <string name="item_price">$62.68</string>
-    <string name="item_description">Mesh backpack in white. Black textile trim throughout.</string>
-    <string name="purchase_done">Purchase successful</string>
-    <string name="purchase_fail">Purchase failed</string>
-    <string name="new_fingerprint_enrolled_description">A new fingerprint was added to this device, so your password is required.</string>
-    <string name="use_fingerprint_in_future">Use fingerprint in the future</string>
-    <string name="use_fingerprint_to_authenticate_title">Use fingerprint to authenticate</string>
-    <string name="use_fingerprint_to_authenticate_key" >use_fingerprint_to_authenticate_key</string>
-    <string name="description_bugdroid_icon">Android bugdroid image</string>
-    <string name="description_fingerprint_icon">Fingerprint icon</string>
-</resources>
diff --git a/security/AsymmetricFingerprintDialog/Application/src/main/res/xml/preferences.xml b/security/AsymmetricFingerprintDialog/Application/src/main/res/xml/preferences.xml
deleted file mode 100644
index 761391d..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/main/res/xml/preferences.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<PreferenceScreen  xmlns:android="http://schemas.android.com/apk/res/android">
-    <CheckBoxPreference
-        android:key="@string/use_fingerprint_to_authenticate_key"
-        android:title="@string/use_fingerprint_to_authenticate_title"
-        android:persistent="true"
-        android:defaultValue="true" />
-</PreferenceScreen>
\ No newline at end of file
diff --git a/security/AsymmetricFingerprintDialog/Application/src/test/java/com/example/android/asymmetricfingerprintdialog/FingerprintUiHelperTest.java b/security/AsymmetricFingerprintDialog/Application/src/test/java/com/example/android/asymmetricfingerprintdialog/FingerprintUiHelperTest.java
deleted file mode 100644
index 112d1a1..0000000
--- a/security/AsymmetricFingerprintDialog/Application/src/test/java/com/example/android/asymmetricfingerprintdialog/FingerprintUiHelperTest.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package com.example.android.asymmetricfingerprintdialog;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import android.content.res.Resources;
-import android.hardware.fingerprint.FingerprintManager;
-import android.os.CancellationSignal;
-import android.os.Handler;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Matchers.isA;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-/**
- * Unit tests for {@link FingerprintUiHelper}.
- */
-// Hide lint warnings about missing USE_FINGERPRINT permission that is granted at app install time.
-@SuppressWarnings("MissingPermission")
-@RunWith(MockitoJUnitRunner.class)
-public class FingerprintUiHelperTest {
-
-    private static final int ERROR_MSG_ID = 1;
-    private static final CharSequence ERR_STRING = "ERROR_STRING";
-    private static final int HINT_COLOR = 10;
-
-    @Mock private FingerprintManager mockFingerprintManager;
-    @Mock private ImageView mockIcon;
-    @Mock private TextView mockTextView;
-    @Mock private FingerprintUiHelper.Callback mockCallback;
-    @Mock private FingerprintManager.CryptoObject mockCryptoObject;
-    @Mock private Resources mockResources;
-
-    @Captor private ArgumentCaptor<Runnable> mRunnableArgumentCaptor;
-
-    @InjectMocks private FingerprintUiHelper.FingerprintUiHelperBuilder mockBuilder;
-
-    private FingerprintUiHelper mFingerprintUiHelper;
-
-    @Before
-    public void setUp() {
-        mFingerprintUiHelper = mockBuilder.build(mockIcon, mockTextView, mockCallback);
-
-        when(mockFingerprintManager.isHardwareDetected()).thenReturn(true);
-        when(mockFingerprintManager.hasEnrolledFingerprints()).thenReturn(true);
-        when(mockTextView.getResources()).thenReturn(mockResources);
-        when(mockResources.getColor(R.color.hint_color, null)).thenReturn(HINT_COLOR);
-    }
-
-    @Test
-    public void testStartListening_fingerprintAuthAvailable() {
-        mFingerprintUiHelper.startListening(mockCryptoObject);
-
-        verify(mockFingerprintManager).authenticate(eq(mockCryptoObject),
-                isA(CancellationSignal.class), eq(0), eq(mFingerprintUiHelper),
-                any(Handler.class));
-        verify(mockIcon).setImageResource(R.drawable.ic_fp_40px);
-    }
-
-    @Test
-    public void testStartListening_fingerprintAuthNotAvailable() {
-        when(mockFingerprintManager.isHardwareDetected()).thenReturn(false);
-
-        mFingerprintUiHelper.startListening(mockCryptoObject);
-
-        verify(mockFingerprintManager, never()).authenticate(
-                any(FingerprintManager.CryptoObject.class), any(CancellationSignal.class), eq(0),
-                any(FingerprintUiHelper.class), any(Handler.class));
-    }
-
-    @Test
-    public void testOnAuthenticationError() {
-        mFingerprintUiHelper.mSelfCancelled = false;
-
-        mFingerprintUiHelper.onAuthenticationError(ERROR_MSG_ID, ERR_STRING);
-
-        verify(mockIcon).setImageResource(R.drawable.ic_fingerprint_error);
-        verify(mockTextView).removeCallbacks(mFingerprintUiHelper.mResetErrorTextRunnable);
-        verify(mockTextView).postDelayed(mFingerprintUiHelper.mResetErrorTextRunnable,
-                FingerprintUiHelper.ERROR_TIMEOUT_MILLIS);
-        verify(mockIcon).postDelayed(mRunnableArgumentCaptor.capture(),
-                eq(FingerprintUiHelper.ERROR_TIMEOUT_MILLIS));
-
-        mRunnableArgumentCaptor.getValue().run();
-
-        verify(mockCallback).onError();
-    }
-
-    @Test
-    public void testOnAuthenticationSucceeded() {
-        mFingerprintUiHelper.onAuthenticationSucceeded(null);
-
-        verify(mockIcon).setImageResource(R.drawable.ic_fingerprint_success);
-        verify(mockTextView).removeCallbacks(mFingerprintUiHelper.mResetErrorTextRunnable);
-        verify(mockIcon).postDelayed(mRunnableArgumentCaptor.capture(),
-                eq(FingerprintUiHelper.SUCCESS_DELAY_MILLIS));
-
-        mRunnableArgumentCaptor.getValue().run();
-
-        verify(mockCallback).onAuthenticated();
-    }
-}
diff --git a/security/AsymmetricFingerprintDialog/build.gradle b/security/AsymmetricFingerprintDialog/build.gradle
deleted file mode 100644
index 2b8d1ef..0000000
--- a/security/AsymmetricFingerprintDialog/build.gradle
+++ /dev/null
@@ -1,11 +0,0 @@
-
-// BEGIN_EXCLUDE
-import com.example.android.samples.build.SampleGenPlugin
-apply plugin: SampleGenPlugin
-
-samplegen {
-  pathToBuild "../../../../build"
-  pathToSamplesCommon "../../common"
-}
-apply from: "../../../../build/build.gradle"
-// END_EXCLUDE
diff --git a/security/AsymmetricFingerprintDialog/buildSrc/build.gradle b/security/AsymmetricFingerprintDialog/buildSrc/build.gradle
deleted file mode 100644
index 8c294c2..0000000
--- a/security/AsymmetricFingerprintDialog/buildSrc/build.gradle
+++ /dev/null
@@ -1,15 +0,0 @@
-repositories {
-    mavenCentral()
-}
-dependencies {
-    compile 'org.freemarker:freemarker:2.3.20'
-}
-
-sourceSets {
-    main {
-        groovy {
-            srcDir new File(rootDir, "../../../../../build/buildSrc/src/main/groovy")
-        }
-    }
-}
-
diff --git a/security/AsymmetricFingerprintDialog/gradle/wrapper/gradle-wrapper.jar b/security/AsymmetricFingerprintDialog/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 94336fc..0000000
--- a/security/AsymmetricFingerprintDialog/gradle/wrapper/gradle-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/gradle/wrapper/gradle-wrapper.properties b/security/AsymmetricFingerprintDialog/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index ae45383..0000000
--- a/security/AsymmetricFingerprintDialog/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
diff --git a/security/AsymmetricFingerprintDialog/gradlew b/security/AsymmetricFingerprintDialog/gradlew
deleted file mode 100755
index cccdd3d..0000000
--- a/security/AsymmetricFingerprintDialog/gradlew
+++ /dev/null
@@ -1,172 +0,0 @@
-#!/usr/bin/env sh
-
-##############################################################################
-##
-##  Gradle start up script for UN*X
-##
-##############################################################################
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn () {
-    echo "$*"
-}
-
-die () {
-    echo
-    echo "$*"
-    echo
-    exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-nonstop=false
-case "`uname`" in
-  CYGWIN* )
-    cygwin=true
-    ;;
-  Darwin* )
-    darwin=true
-    ;;
-  MINGW* )
-    msys=true
-    ;;
-  NONSTOP* )
-    nonstop=true
-    ;;
-esac
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-        # IBM's JDK on AIX uses strange locations for the executables
-        JAVACMD="$JAVA_HOME/jre/sh/java"
-    else
-        JAVACMD="$JAVA_HOME/bin/java"
-    fi
-    if [ ! -x "$JAVACMD" ] ; then
-        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-    fi
-else
-    JAVACMD="java"
-    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
-    MAX_FD_LIMIT=`ulimit -H -n`
-    if [ $? -eq 0 ] ; then
-        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
-            MAX_FD="$MAX_FD_LIMIT"
-        fi
-        ulimit -n $MAX_FD
-        if [ $? -ne 0 ] ; then
-            warn "Could not set maximum file descriptor limit: $MAX_FD"
-        fi
-    else
-        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
-    fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
-    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
-    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
-    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-    JAVACMD=`cygpath --unix "$JAVACMD"`
-
-    # We build the pattern for arguments to be converted via cygpath
-    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
-    SEP=""
-    for dir in $ROOTDIRSRAW ; do
-        ROOTDIRS="$ROOTDIRS$SEP$dir"
-        SEP="|"
-    done
-    OURCYGPATTERN="(^($ROOTDIRS))"
-    # Add a user-defined pattern to the cygpath arguments
-    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
-        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
-    fi
-    # Now convert the arguments - kludge to limit ourselves to /bin/sh
-    i=0
-    for arg in "$@" ; do
-        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
-        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
-
-        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
-            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
-        else
-            eval `echo args$i`="\"$arg\""
-        fi
-        i=$((i+1))
-    done
-    case $i in
-        (0) set -- ;;
-        (1) set -- "$args0" ;;
-        (2) set -- "$args0" "$args1" ;;
-        (3) set -- "$args0" "$args1" "$args2" ;;
-        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
-        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
-        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
-        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
-        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
-        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
-    esac
-fi
-
-# Escape application args
-save () {
-    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
-    echo " "
-}
-APP_ARGS=$(save "$@")
-
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
-
-# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
-if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
-  cd "$(dirname "$0")"
-fi
-
-exec "$JAVACMD" "$@"
diff --git a/security/AsymmetricFingerprintDialog/gradlew.bat b/security/AsymmetricFingerprintDialog/gradlew.bat
deleted file mode 100644
index e95643d..0000000
--- a/security/AsymmetricFingerprintDialog/gradlew.bat
+++ /dev/null
@@ -1,84 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem  Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/security/AsymmetricFingerprintDialog/screenshots/1-purchase-screen.png b/security/AsymmetricFingerprintDialog/screenshots/1-purchase-screen.png
deleted file mode 100644
index 0bf03bd..0000000
--- a/security/AsymmetricFingerprintDialog/screenshots/1-purchase-screen.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/screenshots/2-fingerprint-dialog.png b/security/AsymmetricFingerprintDialog/screenshots/2-fingerprint-dialog.png
deleted file mode 100644
index 5e681f9..0000000
--- a/security/AsymmetricFingerprintDialog/screenshots/2-fingerprint-dialog.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/screenshots/3-fingerprint-authenticated.png b/security/AsymmetricFingerprintDialog/screenshots/3-fingerprint-authenticated.png
deleted file mode 100644
index d485b1d..0000000
--- a/security/AsymmetricFingerprintDialog/screenshots/3-fingerprint-authenticated.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/screenshots/4-new-fingerprint-enrolled.png b/security/AsymmetricFingerprintDialog/screenshots/4-new-fingerprint-enrolled.png
deleted file mode 100644
index 7dcf080..0000000
--- a/security/AsymmetricFingerprintDialog/screenshots/4-new-fingerprint-enrolled.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/screenshots/big-icon.png b/security/AsymmetricFingerprintDialog/screenshots/big-icon.png
deleted file mode 100644
index 1063d0b..0000000
--- a/security/AsymmetricFingerprintDialog/screenshots/big-icon.png
+++ /dev/null
Binary files differ
diff --git a/security/AsymmetricFingerprintDialog/settings.gradle b/security/AsymmetricFingerprintDialog/settings.gradle
deleted file mode 100644
index 9464a35..0000000
--- a/security/AsymmetricFingerprintDialog/settings.gradle
+++ /dev/null
@@ -1 +0,0 @@
-include 'Application'
diff --git a/security/AsymmetricFingerprintDialog/template-params.xml b/security/AsymmetricFingerprintDialog/template-params.xml
deleted file mode 100644
index 6fd7dbf..0000000
--- a/security/AsymmetricFingerprintDialog/template-params.xml
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright 2015 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<!-- TODO(thagikura) Add tests for Activity and Fragment once InstrumentationTests can be run
-     on an emulator or a device.
-     At this moment, due to the different API between the image and the SDK, they can't be launched.
-     E.g. Skipping device 'Nexus 5 - MNC', due to different API preview 'MNC' and 'android-MNC'
-     -->
-<sample>
-    <name>AsymmetricFingerprintDialog</name>
-    <group>Security</group>
-    <package>com.example.android.asymmetricfingerprintdialog</package>
-
-    <minSdk>23</minSdk>
-
-    <dependency>com.squareup.dagger:dagger:1.2.2</dependency>
-    <annotationProcessor>com.squareup.dagger:dagger-compiler:1.2.2</annotationProcessor>
-
-    <!-- TODO(thagikura) These dependencies should be created as testCompile instead of compile but
-         the template system doesn't allow androidTestCompile dependencies. Change it once fixed.
-    -->
-    <dependency>junit:junit:4.12</dependency>
-    <dependency>org.mockito:mockito-core:1.10.19</dependency>
-
-    <strings>
-        <intro>
-            <![CDATA[
-This sample demonstrates how you can use registered fingerprints to authenticate the user
-before proceeding some actions such as purchasing an item. This version uses asymmetric keys.
-            ]]>
-        </intro>
-    </strings>
-
-    <template src="base" />
-
-    <metadata>
-        <!-- Values: {DRAFT | PUBLISHED | INTERNAL | DEPRECATED | SUPERCEDED} -->
-        <status>PUBLISHED</status>
-        <categories>security</categories>
-        <technologies>Android</technologies>
-        <languages>Java</languages>
-        <solutions>Mobile</solutions>
-        <level>INTERMEDIATE</level>
-        <icon>screenshots/big-icon.png</icon>
-        <screenshots>
-            <img>screenshots/1-purchase-screen.png</img>
-            <img>screenshots/2-fingerprint-dialog.png</img>
-            <img>screenshots/3-fingerprint-authenticated.png</img>
-            <img>screenshots/4-new-fingerprint-enrolled.png</img>
-        </screenshots>
-
-        <api_refs>
-            <android>android.hardware.fingerprint.FingerprintManager</android>
-            <android>android.hardware.fingerprint.FingerprintManager.AuthenticationCallback</android>
-            <android>android.hardware.fingerprint.FingerprintManager.CryptoObject</android>
-            <android>android.security.KeyGenParameterSpec</android>
-            <android>java.security.KeyStore</android>
-            <android>java.security.Signature</android>
-            <android>java.security.KeyPairGenerator</android>
-        </api_refs>
-
-        <description>
-<![CDATA[
-A sample that demonstrates to use registered fingerprints to authenticate the user in your app
-]]>
-        </description>
-
-        <intro>
-<![CDATA[
-This sample demonstrates how you can use registered fingerprints in your app to authenticate the
-user before proceeding some actions such as purchasing an item.
-
-First you need to create an asymmetric key pair in the Android Key Store using [KeyPairGenerator][1]
-in the way that its private key can only be used after the user has authenticated with fingerprint
-and transmit the public key to your backend with the user verified password (In a real world, the
-app should show proper UIs).
-
-By setting [KeyGenParameterSpec.Builder.setUserAuthenticationRequired][2] to true, you can permit the
-use of the key only after the user authenticate it including when authenticated with the user's
-fingerprint.
-
-Then start listening to a fingerprint on the fingerprint sensor by calling
-[FingerprintManager.authenticate][3] with a [Signature][4] initialized with the asymmetric key pair
-created. Or alternatively you can fall back to server-side verified password as an authenticator.
-
-Once the fingerprint (or password) is verified, the
-[FingerprintManager.AuthenticationCallback#onAuthenticationSucceeded()][5] callback is called.
-
-Then you can verify the purchase transaction on server side with the public key passed from the
-client, by verifying the piece of data signed by the Signature.
-
-[1]: https://developer.android.com/reference/java/security/KeyPairGenerator.html
-[2]: https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.Builder.html#setUserAuthenticationRequired%28boolean%29
-[3]: https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager.html#authenticate%28android.hardware.fingerprint.FingerprintManager.CryptoObject,%20android.os.CancellationSignal,%20int,%20android.hardware.fingerprint.FingerprintManager.AuthenticationCallback,%20android.os.Handler%29
-[4]: https://developer.android.com/reference/java/security/Signature.html
-[5]: https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager.AuthenticationCallback.html#onAuthenticationSucceeded%28android.hardware.fingerprint.FingerprintManager.AuthenticationResult%29
-]]>
-        </intro>
-    </metadata>
-</sample>
diff --git a/security/FingerprintDialog/Application/.gitignore b/security/FingerprintDialog/Application/.gitignore
deleted file mode 100644
index 6eb878d..0000000
--- a/security/FingerprintDialog/Application/.gitignore
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2013 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-src/template/
-src/common/
-build.gradle
diff --git a/security/FingerprintDialog/Application/proguard-project.txt b/security/FingerprintDialog/Application/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/security/FingerprintDialog/Application/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/security/FingerprintDialog/Application/src/main/Android.bp b/security/FingerprintDialog/Application/src/main/Android.bp
deleted file mode 100644
index 8fd208f..0000000
--- a/security/FingerprintDialog/Application/src/main/Android.bp
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (C) 2016 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package {
-    // See: http://go/android-license-faq
-    default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-android_app {
-    name: "FingerprintDialog",
-    static_libs: [
-        "androidx.appcompat_appcompat",
-        "androidx.legacy_legacy-support-v4",
-        "androidx.annotation_annotation",
-    ],
-    srcs: ["**/*.java"],
-    sdk_version: "current",
-    resource_dirs: [
-        "res",
-    ],
-    aaptflags: [
-        "--auto-add-overlay",
-        "--extra-packages",
-        "android.support.v7.appcompat",
-    ],
-}
diff --git a/security/FingerprintDialog/Application/src/main/AndroidManifest.xml b/security/FingerprintDialog/Application/src/main/AndroidManifest.xml
deleted file mode 100644
index 08f3955..0000000
--- a/security/FingerprintDialog/Application/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><!--
- Copyright 2015 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<manifest package="com.example.android.fingerprintdialog"
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:versionCode="1"
-    android:versionName="1.0">
-
-    <uses-permission android:name="android.permission.USE_FINGERPRINT" />
-
-    <application
-        android:allowBackup="true"
-        android:icon="@mipmap/ic_launcher"
-        android:label="@string/application_name"
-        android:supportsRtl="true"
-        android:theme="@style/Theme.AppCompat.Light"
-        tools:ignore="GoogleAppIndexingWarning">
-
-        <activity
-            android:name=".MainActivity"
-            android:label="@string/application_name"
-            android:theme="@style/Theme.AppCompat.Light.NoActionBar"
-            android:exported="true">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-
-        <activity
-            android:name=".SettingsActivity"
-            android:label="@string/action_settings"
-            android:parentActivityName=".MainActivity"/>
-    </application>
-</manifest>
diff --git a/security/FingerprintDialog/Application/src/main/java/com/example/android/fingerprintdialog/FingerprintAuthenticationDialogFragment.java b/security/FingerprintDialog/Application/src/main/java/com/example/android/fingerprintdialog/FingerprintAuthenticationDialogFragment.java
deleted file mode 100644
index 9f4a684..0000000
--- a/security/FingerprintDialog/Application/src/main/java/com/example/android/fingerprintdialog/FingerprintAuthenticationDialogFragment.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.fingerprintdialog;
-
-import android.app.DialogFragment;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.hardware.fingerprint.FingerprintManager;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.EditText;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-/**
- * A dialog which uses fingerprint APIs to authenticate the user, and falls back to password
- * authentication if fingerprint is not available.
- */
-public class FingerprintAuthenticationDialogFragment extends DialogFragment
-        implements TextView.OnEditorActionListener, FingerprintUiHelper.Callback {
-
-    private Button mCancelButton;
-    private Button mSecondDialogButton;
-    private View mFingerprintContent;
-    private View mBackupContent;
-    private EditText mPassword;
-    private CheckBox mUseFingerprintFutureCheckBox;
-    private TextView mPasswordDescriptionTextView;
-    private TextView mNewFingerprintEnrolledTextView;
-
-    private Stage mStage = Stage.FINGERPRINT;
-
-    private FingerprintManager.CryptoObject mCryptoObject;
-    private FingerprintUiHelper mFingerprintUiHelper;
-    private MainActivity mActivity;
-
-    private InputMethodManager mInputMethodManager;
-    private SharedPreferences mSharedPreferences;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        // Do not create a new Fragment when the Activity is re-created such as orientation changes.
-        setRetainInstance(true);
-        setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Material_Light_Dialog);
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        getDialog().setTitle(getString(R.string.sign_in));
-        View v = inflater.inflate(R.layout.fingerprint_dialog_container, container, false);
-        mCancelButton = (Button) v.findViewById(R.id.cancel_button);
-        mCancelButton.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                dismiss();
-            }
-        });
-
-        mSecondDialogButton = (Button) v.findViewById(R.id.second_dialog_button);
-        mSecondDialogButton.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                if (mStage == Stage.FINGERPRINT) {
-                    goToBackup();
-                } else {
-                    verifyPassword();
-                }
-            }
-        });
-        mFingerprintContent = v.findViewById(R.id.fingerprint_container);
-        mBackupContent = v.findViewById(R.id.backup_container);
-        mPassword = (EditText) v.findViewById(R.id.password);
-        mPassword.setOnEditorActionListener(this);
-        mPasswordDescriptionTextView = (TextView) v.findViewById(R.id.password_description);
-        mUseFingerprintFutureCheckBox = (CheckBox)
-                v.findViewById(R.id.use_fingerprint_in_future_check);
-        mNewFingerprintEnrolledTextView = (TextView)
-                v.findViewById(R.id.new_fingerprint_enrolled_description);
-        mFingerprintUiHelper = new FingerprintUiHelper(
-                mActivity.getSystemService(FingerprintManager.class),
-                (ImageView) v.findViewById(R.id.fingerprint_icon),
-                (TextView) v.findViewById(R.id.fingerprint_status), this);
-        updateStage();
-
-        // If fingerprint authentication is not available, switch immediately to the backup
-        // (password) screen.
-        if (!mFingerprintUiHelper.isFingerprintAuthAvailable()) {
-            goToBackup();
-        }
-        return v;
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        if (mStage == Stage.FINGERPRINT) {
-            mFingerprintUiHelper.startListening(mCryptoObject);
-        }
-    }
-
-    public void setStage(Stage stage) {
-        mStage = stage;
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        mFingerprintUiHelper.stopListening();
-    }
-
-    @Override
-    public void onAttach(Context context) {
-        super.onAttach(context);
-        mActivity = (MainActivity) getActivity();
-        mInputMethodManager = context.getSystemService(InputMethodManager.class);
-        mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
-    }
-
-    /**
-     * Sets the crypto object to be passed in when authenticating with fingerprint.
-     */
-    public void setCryptoObject(FingerprintManager.CryptoObject cryptoObject) {
-        mCryptoObject = cryptoObject;
-    }
-
-    /**
-     * Switches to backup (password) screen. This either can happen when fingerprint is not
-     * available or the user chooses to use the password authentication method by pressing the
-     * button. This can also happen when the user had too many fingerprint attempts.
-     */
-    private void goToBackup() {
-        mStage = Stage.PASSWORD;
-        updateStage();
-        mPassword.requestFocus();
-
-        // Show the keyboard.
-        mPassword.postDelayed(mShowKeyboardRunnable, 500);
-
-        // Fingerprint is not used anymore. Stop listening for it.
-        mFingerprintUiHelper.stopListening();
-    }
-
-    /**
-     * Checks whether the current entered password is correct, and dismisses the the dialog and
-     * let's the activity know about the result.
-     */
-    private void verifyPassword() {
-        if (!checkPassword(mPassword.getText().toString())) {
-            return;
-        }
-        if (mStage == Stage.NEW_FINGERPRINT_ENROLLED) {
-            SharedPreferences.Editor editor = mSharedPreferences.edit();
-            editor.putBoolean(getString(R.string.use_fingerprint_to_authenticate_key),
-                    mUseFingerprintFutureCheckBox.isChecked());
-            editor.apply();
-
-            if (mUseFingerprintFutureCheckBox.isChecked()) {
-                // Re-create the key so that fingerprints including new ones are validated.
-                mActivity.createKey(MainActivity.DEFAULT_KEY_NAME, true);
-                mStage = Stage.FINGERPRINT;
-            }
-        }
-        mPassword.setText("");
-        mActivity.onPurchased(false /* without Fingerprint */, null);
-        dismiss();
-    }
-
-    /**
-     * @return true if {@code password} is correct, false otherwise
-     */
-    private boolean checkPassword(String password) {
-        // Assume the password is always correct.
-        // In the real world situation, the password needs to be verified in the server side.
-        return password.length() > 0;
-    }
-
-    private final Runnable mShowKeyboardRunnable = new Runnable() {
-        @Override
-        public void run() {
-            mInputMethodManager.showSoftInput(mPassword, 0);
-        }
-    };
-
-    private void updateStage() {
-        switch (mStage) {
-            case FINGERPRINT:
-                mCancelButton.setText(R.string.cancel);
-                mSecondDialogButton.setText(R.string.use_password);
-                mFingerprintContent.setVisibility(View.VISIBLE);
-                mBackupContent.setVisibility(View.GONE);
-                break;
-            case NEW_FINGERPRINT_ENROLLED:
-                // Intentional fall through
-            case PASSWORD:
-                mCancelButton.setText(R.string.cancel);
-                mSecondDialogButton.setText(R.string.ok);
-                mFingerprintContent.setVisibility(View.GONE);
-                mBackupContent.setVisibility(View.VISIBLE);
-                if (mStage == Stage.NEW_FINGERPRINT_ENROLLED) {
-                    mPasswordDescriptionTextView.setVisibility(View.GONE);
-                    mNewFingerprintEnrolledTextView.setVisibility(View.VISIBLE);
-                    mUseFingerprintFutureCheckBox.setVisibility(View.VISIBLE);
-                }
-                break;
-        }
-    }
-
-    @Override
-    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
-        if (actionId == EditorInfo.IME_ACTION_GO) {
-            verifyPassword();
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public void onAuthenticated() {
-        // Callback from FingerprintUiHelper. Let the activity know that authentication was
-        // successful.
-        mActivity.onPurchased(true /* withFingerprint */, mCryptoObject);
-        dismiss();
-    }
-
-    @Override
-    public void onError() {
-        goToBackup();
-    }
-
-    /**
-     * Enumeration to indicate which authentication method the user is trying to authenticate with.
-     */
-    public enum Stage {
-        FINGERPRINT,
-        NEW_FINGERPRINT_ENROLLED,
-        PASSWORD
-    }
-}
diff --git a/security/FingerprintDialog/Application/src/main/java/com/example/android/fingerprintdialog/FingerprintUiHelper.java b/security/FingerprintDialog/Application/src/main/java/com/example/android/fingerprintdialog/FingerprintUiHelper.java
deleted file mode 100644
index be81646..0000000
--- a/security/FingerprintDialog/Application/src/main/java/com/example/android/fingerprintdialog/FingerprintUiHelper.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.fingerprintdialog;
-
-import android.hardware.fingerprint.FingerprintManager;
-import android.os.CancellationSignal;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-/**
- * Small helper class to manage text/icon around fingerprint authentication UI.
- */
-public class FingerprintUiHelper extends FingerprintManager.AuthenticationCallback {
-
-    private static final long ERROR_TIMEOUT_MILLIS = 1600;
-    private static final long SUCCESS_DELAY_MILLIS = 1300;
-
-    private final FingerprintManager mFingerprintManager;
-    private final ImageView mIcon;
-    private final TextView mErrorTextView;
-    private final Callback mCallback;
-    private CancellationSignal mCancellationSignal;
-
-    private boolean mSelfCancelled;
-
-    /**
-     * Constructor for {@link FingerprintUiHelper}.
-     */
-    FingerprintUiHelper(FingerprintManager fingerprintManager,
-            ImageView icon, TextView errorTextView, Callback callback) {
-        mFingerprintManager = fingerprintManager;
-        mIcon = icon;
-        mErrorTextView = errorTextView;
-        mCallback = callback;
-    }
-
-    public boolean isFingerprintAuthAvailable() {
-        // The line below prevents the false positive inspection from Android Studio
-        // noinspection ResourceType
-        return mFingerprintManager.isHardwareDetected()
-                && mFingerprintManager.hasEnrolledFingerprints();
-    }
-
-    public void startListening(FingerprintManager.CryptoObject cryptoObject) {
-        if (!isFingerprintAuthAvailable()) {
-            return;
-        }
-        mCancellationSignal = new CancellationSignal();
-        mSelfCancelled = false;
-        // The line below prevents the false positive inspection from Android Studio
-        // noinspection ResourceType
-        mFingerprintManager
-                .authenticate(cryptoObject, mCancellationSignal, 0 /* flags */, this, null);
-        mIcon.setImageResource(R.drawable.ic_fp_40px);
-    }
-
-    public void stopListening() {
-        if (mCancellationSignal != null) {
-            mSelfCancelled = true;
-            mCancellationSignal.cancel();
-            mCancellationSignal = null;
-        }
-    }
-
-    @Override
-    public void onAuthenticationError(int errMsgId, CharSequence errString) {
-        if (!mSelfCancelled) {
-            showError(errString);
-            mIcon.postDelayed(new Runnable() {
-                @Override
-                public void run() {
-                    mCallback.onError();
-                }
-            }, ERROR_TIMEOUT_MILLIS);
-        }
-    }
-
-    @Override
-    public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
-        showError(helpString);
-    }
-
-    @Override
-    public void onAuthenticationFailed() {
-        showError(mIcon.getResources().getString(
-                R.string.fingerprint_not_recognized));
-    }
-
-    @Override
-    public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
-        mErrorTextView.removeCallbacks(mResetErrorTextRunnable);
-        mIcon.setImageResource(R.drawable.ic_fingerprint_success);
-        mErrorTextView.setTextColor(
-                mErrorTextView.getResources().getColor(R.color.success_color, null));
-        mErrorTextView.setText(
-                mErrorTextView.getResources().getString(R.string.fingerprint_success));
-        mIcon.postDelayed(new Runnable() {
-            @Override
-            public void run() {
-                mCallback.onAuthenticated();
-            }
-        }, SUCCESS_DELAY_MILLIS);
-    }
-
-    private void showError(CharSequence error) {
-        mIcon.setImageResource(R.drawable.ic_fingerprint_error);
-        mErrorTextView.setText(error);
-        mErrorTextView.setTextColor(
-                mErrorTextView.getResources().getColor(R.color.warning_color, null));
-        mErrorTextView.removeCallbacks(mResetErrorTextRunnable);
-        mErrorTextView.postDelayed(mResetErrorTextRunnable, ERROR_TIMEOUT_MILLIS);
-    }
-
-    private Runnable mResetErrorTextRunnable = new Runnable() {
-        @Override
-        public void run() {
-            mErrorTextView.setTextColor(
-                    mErrorTextView.getResources().getColor(R.color.hint_color, null));
-            mErrorTextView.setText(
-                    mErrorTextView.getResources().getString(R.string.fingerprint_hint));
-            mIcon.setImageResource(R.drawable.ic_fp_40px);
-        }
-    };
-
-    public interface Callback {
-
-        void onAuthenticated();
-
-        void onError();
-    }
-}
diff --git a/security/FingerprintDialog/Application/src/main/java/com/example/android/fingerprintdialog/MainActivity.java b/security/FingerprintDialog/Application/src/main/java/com/example/android/fingerprintdialog/MainActivity.java
deleted file mode 100644
index 867f6f9..0000000
--- a/security/FingerprintDialog/Application/src/main/java/com/example/android/fingerprintdialog/MainActivity.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.fingerprintdialog;
-
-import android.app.KeyguardManager;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.hardware.fingerprint.FingerprintManager;
-import android.os.Build;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.security.keystore.KeyGenParameterSpec;
-import android.security.keystore.KeyPermanentlyInvalidatedException;
-import android.security.keystore.KeyProperties;
-import androidx.annotation.Nullable;
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.appcompat.widget.Toolbar;
-import android.util.Base64;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.Button;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import java.io.IOException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.NoSuchProviderException;
-import java.security.UnrecoverableKeyException;
-import java.security.cert.CertificateException;
-
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.KeyGenerator;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.SecretKey;
-
-/**
- * Main entry point for the sample, showing a backpack and "Purchase" button.
- */
-public class MainActivity extends AppCompatActivity {
-
-    private static final String TAG = MainActivity.class.getSimpleName();
-
-    private static final String DIALOG_FRAGMENT_TAG = "myFragment";
-    private static final String SECRET_MESSAGE = "Very secret message";
-    private static final String KEY_NAME_NOT_INVALIDATED = "key_not_invalidated";
-    static final String DEFAULT_KEY_NAME = "default_key";
-
-    private KeyStore mKeyStore;
-    private KeyGenerator mKeyGenerator;
-    private SharedPreferences mSharedPreferences;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_main);
-        Toolbar toolbar = findViewById(R.id.toolbar);
-        setSupportActionBar(toolbar);
-
-        try {
-            mKeyStore = KeyStore.getInstance("AndroidKeyStore");
-        } catch (KeyStoreException e) {
-            throw new RuntimeException("Failed to get an instance of KeyStore", e);
-        }
-        try {
-            mKeyGenerator = KeyGenerator
-                    .getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
-        } catch (NoSuchAlgorithmException | NoSuchProviderException e) {
-            throw new RuntimeException("Failed to get an instance of KeyGenerator", e);
-        }
-        Cipher defaultCipher;
-        Cipher cipherNotInvalidated;
-        try {
-            defaultCipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"
-                    + KeyProperties.BLOCK_MODE_CBC + "/"
-                    + KeyProperties.ENCRYPTION_PADDING_PKCS7);
-            cipherNotInvalidated = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"
-                    + KeyProperties.BLOCK_MODE_CBC + "/"
-                    + KeyProperties.ENCRYPTION_PADDING_PKCS7);
-        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
-            throw new RuntimeException("Failed to get an instance of Cipher", e);
-        }
-        mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
-
-        KeyguardManager keyguardManager = getSystemService(KeyguardManager.class);
-        FingerprintManager fingerprintManager = getSystemService(FingerprintManager.class);
-        Button purchaseButton = findViewById(R.id.purchase_button);
-        Button purchaseButtonNotInvalidated = findViewById(R.id.purchase_button_not_invalidated);
-
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            purchaseButtonNotInvalidated.setEnabled(true);
-            purchaseButtonNotInvalidated.setOnClickListener(
-                    new PurchaseButtonClickListener(cipherNotInvalidated,
-                            KEY_NAME_NOT_INVALIDATED));
-        } else {
-            // Hide the purchase button which uses a non-invalidated key
-            // if the app doesn't work on Android N preview
-            purchaseButtonNotInvalidated.setVisibility(View.GONE);
-            findViewById(R.id.purchase_button_not_invalidated_description).setVisibility(View.GONE);
-        }
-
-        if (!keyguardManager.isKeyguardSecure()) {
-            // Show a message that the user hasn't set up a fingerprint or lock screen.
-            Toast.makeText(this,
-                    "Secure lock screen hasn't set up.\n"
-                            + "Go to 'Settings -> Security -> Fingerprint' to set up a fingerprint",
-                    Toast.LENGTH_LONG).show();
-            purchaseButton.setEnabled(false);
-            purchaseButtonNotInvalidated.setEnabled(false);
-            return;
-        }
-
-        // Now the protection level of USE_FINGERPRINT permission is normal instead of dangerous.
-        // See http://developer.android.com/reference/android/Manifest.permission.html#USE_FINGERPRINT
-        // The line below prevents the false positive inspection from Android Studio
-        // noinspection ResourceType
-        if (!fingerprintManager.hasEnrolledFingerprints()) {
-            purchaseButton.setEnabled(false);
-            // This happens when no fingerprints are registered.
-            Toast.makeText(this,
-                    "Go to 'Settings -> Security -> Fingerprint' and register at least one" +
-                            " fingerprint",
-                    Toast.LENGTH_LONG).show();
-            return;
-        }
-        createKey(DEFAULT_KEY_NAME, true);
-        createKey(KEY_NAME_NOT_INVALIDATED, false);
-        purchaseButton.setEnabled(true);
-        purchaseButton.setOnClickListener(
-                new PurchaseButtonClickListener(defaultCipher, DEFAULT_KEY_NAME));
-    }
-
-    /**
-     * Initialize the {@link Cipher} instance with the created key in the
-     * {@link #createKey(String, boolean)} method.
-     *
-     * @param keyName the key name to init the cipher
-     * @return {@code true} if initialization is successful, {@code false} if the lock screen has
-     * been disabled or reset after the key was generated, or if a fingerprint got enrolled after
-     * the key was generated.
-     */
-    private boolean initCipher(Cipher cipher, String keyName) {
-        try {
-            mKeyStore.load(null);
-            SecretKey key = (SecretKey) mKeyStore.getKey(keyName, null);
-            cipher.init(Cipher.ENCRYPT_MODE, key);
-            return true;
-        } catch (KeyPermanentlyInvalidatedException e) {
-            return false;
-        } catch (KeyStoreException | CertificateException | UnrecoverableKeyException | IOException
-                | NoSuchAlgorithmException | InvalidKeyException e) {
-            throw new RuntimeException("Failed to init Cipher", e);
-        }
-    }
-
-    /**
-     * Proceed the purchase operation
-     *
-     * @param withFingerprint {@code true} if the purchase was made by using a fingerprint
-     * @param cryptoObject the Crypto object
-     */
-    public void onPurchased(boolean withFingerprint,
-            @Nullable FingerprintManager.CryptoObject cryptoObject) {
-        if (withFingerprint) {
-            // If the user has authenticated with fingerprint, verify that using cryptography and
-            // then show the confirmation message.
-            assert cryptoObject != null;
-            tryEncrypt(cryptoObject.getCipher());
-        } else {
-            // Authentication happened with backup password. Just show the confirmation message.
-            showConfirmation(null);
-        }
-    }
-
-    // Show confirmation, if fingerprint was used show crypto information.
-    private void showConfirmation(byte[] encrypted) {
-        findViewById(R.id.confirmation_message).setVisibility(View.VISIBLE);
-        if (encrypted != null) {
-            TextView v = findViewById(R.id.encrypted_message);
-            v.setVisibility(View.VISIBLE);
-            v.setText(Base64.encodeToString(encrypted, 0 /* flags */));
-        }
-    }
-
-    /**
-     * Tries to encrypt some data with the generated key in {@link #createKey} which is
-     * only works if the user has just authenticated via fingerprint.
-     */
-    private void tryEncrypt(Cipher cipher) {
-        try {
-            byte[] encrypted = cipher.doFinal(SECRET_MESSAGE.getBytes());
-            showConfirmation(encrypted);
-        } catch (BadPaddingException | IllegalBlockSizeException e) {
-            Toast.makeText(this, "Failed to encrypt the data with the generated key. "
-                    + "Retry the purchase", Toast.LENGTH_LONG).show();
-            Log.e(TAG, "Failed to encrypt the data with the generated key." + e.getMessage());
-        }
-    }
-
-    /**
-     * Creates a symmetric key in the Android Key Store which can only be used after the user has
-     * authenticated with fingerprint.
-     *
-     * @param keyName the name of the key to be created
-     * @param invalidatedByBiometricEnrollment if {@code false} is passed, the created key will not
-     *                                         be invalidated even if a new fingerprint is enrolled.
-     *                                         The default value is {@code true}, so passing
-     *                                         {@code true} doesn't change the behavior
-     *                                         (the key will be invalidated if a new fingerprint is
-     *                                         enrolled.). Note that this parameter is only valid if
-     *                                         the app works on Android N developer preview.
-     *
-     */
-    public void createKey(String keyName, boolean invalidatedByBiometricEnrollment) {
-        // The enrolling flow for fingerprint. This is where you ask the user to set up fingerprint
-        // for your flow. Use of keys is necessary if you need to know if the set of
-        // enrolled fingerprints has changed.
-        try {
-            mKeyStore.load(null);
-            // Set the alias of the entry in Android KeyStore where the key will appear
-            // and the constrains (purposes) in the constructor of the Builder
-
-            KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(keyName,
-                    KeyProperties.PURPOSE_ENCRYPT |
-                            KeyProperties.PURPOSE_DECRYPT)
-                    .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
-                    // Require the user to authenticate with a fingerprint to authorize every use
-                    // of the key
-                    .setUserAuthenticationRequired(true)
-                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7);
-
-            // This is a workaround to avoid crashes on devices whose API level is < 24
-            // because KeyGenParameterSpec.Builder#setInvalidatedByBiometricEnrollment is only
-            // visible on API level +24.
-            // Ideally there should be a compat library for KeyGenParameterSpec.Builder but
-            // which isn't available yet.
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-                builder.setInvalidatedByBiometricEnrollment(invalidatedByBiometricEnrollment);
-            }
-            mKeyGenerator.init(builder.build());
-            mKeyGenerator.generateKey();
-        } catch (NoSuchAlgorithmException | InvalidAlgorithmParameterException
-                | CertificateException | IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        getMenuInflater().inflate(R.menu.menu_main, menu);
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        int id = item.getItemId();
-
-        if (id == R.id.action_settings) {
-            Intent intent = new Intent(this, SettingsActivity.class);
-            startActivity(intent);
-            return true;
-        }
-        return super.onOptionsItemSelected(item);
-    }
-
-    private class PurchaseButtonClickListener implements View.OnClickListener {
-
-        Cipher mCipher;
-        String mKeyName;
-
-        PurchaseButtonClickListener(Cipher cipher, String keyName) {
-            mCipher = cipher;
-            mKeyName = keyName;
-        }
-
-        @Override
-        public void onClick(View view) {
-            findViewById(R.id.confirmation_message).setVisibility(View.GONE);
-            findViewById(R.id.encrypted_message).setVisibility(View.GONE);
-
-            // Set up the crypto object for later. The object will be authenticated by use
-            // of the fingerprint.
-            if (initCipher(mCipher, mKeyName)) {
-
-                // Show the fingerprint dialog. The user has the option to use the fingerprint with
-                // crypto, or you can fall back to using a server-side verified password.
-                FingerprintAuthenticationDialogFragment fragment
-                        = new FingerprintAuthenticationDialogFragment();
-                fragment.setCryptoObject(new FingerprintManager.CryptoObject(mCipher));
-                boolean useFingerprintPreference = mSharedPreferences
-                        .getBoolean(getString(R.string.use_fingerprint_to_authenticate_key),
-                                true);
-                if (useFingerprintPreference) {
-                    fragment.setStage(
-                            FingerprintAuthenticationDialogFragment.Stage.FINGERPRINT);
-                } else {
-                    fragment.setStage(
-                            FingerprintAuthenticationDialogFragment.Stage.PASSWORD);
-                }
-                fragment.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);
-            } else {
-                // This happens if the lock screen has been disabled or or a fingerprint got
-                // enrolled. Thus show the dialog to authenticate with their password first
-                // and ask the user if they want to authenticate with fingerprints in the
-                // future
-                FingerprintAuthenticationDialogFragment fragment
-                        = new FingerprintAuthenticationDialogFragment();
-                fragment.setCryptoObject(new FingerprintManager.CryptoObject(mCipher));
-                fragment.setStage(
-                        FingerprintAuthenticationDialogFragment.Stage.NEW_FINGERPRINT_ENROLLED);
-                fragment.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);
-            }
-        }
-    }
-}
diff --git a/security/FingerprintDialog/Application/src/main/java/com/example/android/fingerprintdialog/SettingsActivity.java b/security/FingerprintDialog/Application/src/main/java/com/example/android/fingerprintdialog/SettingsActivity.java
deleted file mode 100644
index 5ae7518..0000000
--- a/security/FingerprintDialog/Application/src/main/java/com/example/android/fingerprintdialog/SettingsActivity.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.fingerprintdialog;
-
-import android.os.Bundle;
-import android.preference.PreferenceFragment;
-import androidx.appcompat.app.AppCompatActivity;
-
-public class SettingsActivity extends AppCompatActivity {
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        // Display the fragment as the main content.
-        getFragmentManager().beginTransaction().replace(android.R.id.content,
-                new SettingsFragment()).commit();
-    }
-
-    /**
-     * Fragment for settings.
-     */
-    public static class SettingsFragment extends PreferenceFragment {
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-            addPreferencesFromResource(R.xml.preferences);
-        }
-    }
-}
-
-
diff --git a/security/FingerprintDialog/Application/src/main/res/drawable-hdpi/ic_fp_40px.png b/security/FingerprintDialog/Application/src/main/res/drawable-hdpi/ic_fp_40px.png
deleted file mode 100644
index 48ebd8a..0000000
--- a/security/FingerprintDialog/Application/src/main/res/drawable-hdpi/ic_fp_40px.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/Application/src/main/res/drawable-mdpi/ic_fp_40px.png b/security/FingerprintDialog/Application/src/main/res/drawable-mdpi/ic_fp_40px.png
deleted file mode 100644
index 122f442..0000000
--- a/security/FingerprintDialog/Application/src/main/res/drawable-mdpi/ic_fp_40px.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/Application/src/main/res/drawable-nodpi/android_robot.png b/security/FingerprintDialog/Application/src/main/res/drawable-nodpi/android_robot.png
deleted file mode 100644
index 40bf934..0000000
--- a/security/FingerprintDialog/Application/src/main/res/drawable-nodpi/android_robot.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/Application/src/main/res/drawable-xhdpi/ic_fp_40px.png b/security/FingerprintDialog/Application/src/main/res/drawable-xhdpi/ic_fp_40px.png
deleted file mode 100644
index e1c9590..0000000
--- a/security/FingerprintDialog/Application/src/main/res/drawable-xhdpi/ic_fp_40px.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/Application/src/main/res/drawable-xxhdpi/ic_fp_40px.png b/security/FingerprintDialog/Application/src/main/res/drawable-xxhdpi/ic_fp_40px.png
deleted file mode 100644
index f7e8724..0000000
--- a/security/FingerprintDialog/Application/src/main/res/drawable-xxhdpi/ic_fp_40px.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/Application/src/main/res/drawable-xxxhdpi/ic_fp_40px.png b/security/FingerprintDialog/Application/src/main/res/drawable-xxxhdpi/ic_fp_40px.png
deleted file mode 100644
index 0fb8545..0000000
--- a/security/FingerprintDialog/Application/src/main/res/drawable-xxxhdpi/ic_fp_40px.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/Application/src/main/res/drawable/card.xml b/security/FingerprintDialog/Application/src/main/res/drawable/card.xml
deleted file mode 100644
index 691a4c5..0000000
--- a/security/FingerprintDialog/Application/src/main/res/drawable/card.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <solid
-        android:color="#fefefe"/>
-
-    <corners
-        android:radius="2dp" />
-</shape>
\ No newline at end of file
diff --git a/security/FingerprintDialog/Application/src/main/res/drawable/ic_fingerprint_error.xml b/security/FingerprintDialog/Application/src/main/res/drawable/ic_fingerprint_error.xml
deleted file mode 100644
index be46116..0000000
--- a/security/FingerprintDialog/Application/src/main/res/drawable/ic_fingerprint_error.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="40.0dp"
-        android:height="40.0dp"
-        android:viewportWidth="40.0"
-        android:viewportHeight="40.0">
-    <path
-        android:pathData="M20.0,0.0C8.96,0.0 0.0,8.95 0.0,20.0s8.96,20.0 20.0,20.0c11.04,0.0 20.0,-8.95 20.0,-20.0S31.04,0.0 20.0,0.0z"
-        android:fillColor="#F4511E"/>
-    <path
-        android:pathData="M21.33,29.33l-2.67,0.0l0.0,-2.67l2.67,0.0L21.33,29.33zM21.33,22.67l-2.67,0.0l0.0,-12.0l2.67,0.0L21.33,22.67z"
-        android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/security/FingerprintDialog/Application/src/main/res/drawable/ic_fingerprint_success.xml b/security/FingerprintDialog/Application/src/main/res/drawable/ic_fingerprint_success.xml
deleted file mode 100644
index 261f3e7..0000000
--- a/security/FingerprintDialog/Application/src/main/res/drawable/ic_fingerprint_success.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="40.0dp"
-        android:height="40.0dp"
-        android:viewportWidth="40.0"
-        android:viewportHeight="40.0">
-    <path
-        android:pathData="M20.0,20.0m-20.0,0.0a20.0,20.0 0.0,1.0 1.0,40.0 0.0a20.0,20.0 0.0,1.0 1.0,-40.0 0.0"
-        android:fillColor="#009688"/>
-    <path
-        android:pathData="M11.2,21.41l1.63,-1.619999 4.17,4.169998 10.59,-10.589999 1.619999,1.63 -12.209999,12.209999z"
-        android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/security/FingerprintDialog/Application/src/main/res/layout/activity_main.xml b/security/FingerprintDialog/Application/src/main/res/layout/activity_main.xml
deleted file mode 100644
index 956f576..0000000
--- a/security/FingerprintDialog/Application/src/main/res/layout/activity_main.xml
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical">
-
-        <androidx.appcompat.widget.Toolbar
-            android:id="@+id/toolbar"
-            android:layout_width="match_parent"
-            android:layout_height="?attr/actionBarSize"
-            android:background="?attr/colorPrimary"
-            android:elevation="4dp"
-            android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
-            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
-
-        <ImageView
-            android:layout_width="150dp"
-            android:layout_height="150dp"
-            android:layout_marginTop="32dp"
-            android:layout_marginBottom="32dp"
-            android:layout_gravity="center_horizontal"
-            android:scaleType="fitCenter"
-            android:src="@drawable/android_robot"
-            android:contentDescription="@string/description_bugdroid_icon"/>
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="8dp"
-            android:layout_marginStart="8dp"
-            android:layout_marginEnd="8dp"
-            android:orientation="vertical"
-            android:background="@drawable/card"
-            android:elevation="4dp"
-            android:paddingTop="16dp"
-            android:paddingBottom="16dp"
-            android:paddingStart="16dp"
-            android:paddingEnd="16dp">
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textAppearance="@android:style/TextAppearance.Material.Headline"
-                android:text="@string/item_title"/>
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textAppearance="@android:style/TextAppearance.Material.Body2"
-                android:textColor="?android:attr/colorAccent"
-                android:text="@string/item_price"/>
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="16dp"
-                android:textAppearance="@android:style/TextAppearance.Material.Body1"
-                android:textColor="?android:attr/textColorSecondary"
-                android:text="@string/item_description"/>
-
-        </LinearLayout>
-        <Button style="@android:style/Widget.Material.Button.Colored"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="8dp"
-            android:layout_marginEnd="4dp"
-            android:layout_gravity="end"
-            android:textColor="?android:attr/textColorPrimaryInverse"
-            android:text="@string/purchase"
-            android:id="@+id/purchase_button" />
-
-        <Button style="@android:style/Widget.Material.Button.Colored"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="8dp"
-            android:layout_marginEnd="4dp"
-            android:layout_gravity="end"
-            android:textColor="?android:attr/textColorPrimaryInverse"
-            android:text="@string/purchase_not_invalidated"
-            android:id="@+id/purchase_button_not_invalidated" />
-
-        <TextView
-            android:id="@+id/purchase_button_not_invalidated_description"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="4dp"
-            android:gravity="end"
-            android:textAlignment="gravity"
-            android:text="@string/purchase_button_not_invalidated_description"
-            />
-
-        <TextView
-            android:id="@+id/confirmation_message"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="16dp"
-            android:paddingStart="16dp"
-            android:paddingEnd="16dp"
-            android:textAppearance="@android:style/TextAppearance.Material.Body2"
-            android:textColor="?android:attr/colorAccent"
-            android:text="@string/purchase_done"
-            android:visibility="gone"/>
-
-        <TextView
-            android:id="@+id/encrypted_message"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="16dp"
-            android:paddingStart="16dp"
-            android:paddingEnd="16dp"
-            android:textAppearance="@android:style/TextAppearance.Material.Body2"
-            android:textColor="?android:attr/colorAccent"
-            android:text="@string/purchase_done"
-            android:visibility="gone"/>
-    </LinearLayout>
-</ScrollView>
\ No newline at end of file
diff --git a/security/FingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_backup.xml b/security/FingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_backup.xml
deleted file mode 100644
index 2be05b1..0000000
--- a/security/FingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_backup.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/backup_container"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingTop="16dp"
-    android:paddingBottom="8dp">
-
-    <FrameLayout
-        android:id="@+id/description"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentTop="true"
-        android:layout_alignParentStart="true"
-        android:layout_marginStart="24dp"
-        android:layout_marginEnd="24dp"
-        >
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textAppearance="@android:style/TextAppearance.Material.Subhead"
-            android:text="@string/password_description"
-            android:id="@+id/password_description"
-            android:textColor="?android:attr/textColorSecondary" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textAppearance="@android:style/TextAppearance.Material.Subhead"
-            android:text="@string/new_fingerprint_enrolled_description"
-            android:id="@+id/new_fingerprint_enrolled_description"
-            android:visibility="gone"
-            android:textColor="?android:attr/textColorSecondary" />
-    </FrameLayout>
-
-    <EditText
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:inputType="textPassword"
-        android:ems="10"
-        android:hint="@string/password"
-        android:imeOptions="actionGo"
-        android:id="@+id/password"
-        android:layout_below="@+id/description"
-        android:layout_marginTop="16dp"
-        android:layout_marginStart="20dp"
-        android:layout_marginEnd="20dp"
-        android:layout_alignParentStart="true" />
-
-    <CheckBox
-        android:id="@+id/use_fingerprint_in_future_check"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/password"
-        android:layout_alignParentStart="true"
-        android:layout_marginTop="16dp"
-        android:layout_marginStart="20dp"
-        android:layout_marginEnd="20dp"
-        android:checked="true"
-        android:visibility="gone"
-        android:text="@string/use_fingerprint_in_future" />
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/security/FingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_container.xml b/security/FingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_container.xml
deleted file mode 100644
index 08bb1bb..0000000
--- a/security/FingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_container.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-
-    <FrameLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-
-        <include layout="@layout/fingerprint_dialog_content" />
-
-        <include
-            layout="@layout/fingerprint_dialog_backup"
-            android:visibility="gone" />
-
-    </FrameLayout>
-
-    <LinearLayout
-        android:id="@+id/buttonPanel"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:paddingStart="12dp"
-        android:paddingEnd="12dp"
-        android:paddingTop="4dp"
-        android:paddingBottom="4dp"
-        android:gravity="bottom"
-        style="?android:attr/buttonBarStyle">
-
-        <Space
-            android:id="@+id/spacer"
-            android:layout_width="0dp"
-            android:layout_height="0dp"
-            android:layout_weight="1"
-            android:visibility="invisible" />
-        <Button
-            android:id="@+id/cancel_button"
-            style="?android:attr/buttonBarNegativeButtonStyle"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"/>
-
-        <Button
-            android:id="@+id/second_dialog_button"
-            style="?android:attr/buttonBarPositiveButtonStyle"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"/>
-    </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/security/FingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_content.xml b/security/FingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_content.xml
deleted file mode 100644
index 5bb65b2..0000000
--- a/security/FingerprintDialog/Application/src/main/res/layout/fingerprint_dialog_content.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/fingerprint_container"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingBottom="8dp"
-    android:paddingStart="24dp"
-    android:paddingEnd="24dp"
-    android:paddingTop="16dp">
-
-    <TextView
-        android:id="@+id/fingerprint_description"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentStart="true"
-        android:layout_alignParentTop="true"
-        android:text="@string/fingerprint_description"
-        android:textAppearance="@android:style/TextAppearance.Material.Subhead"
-        android:textColor="?android:attr/textColorSecondary"/>
-
-
-    <ImageView
-        android:id="@+id/fingerprint_icon"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentStart="true"
-        android:layout_below="@+id/fingerprint_description"
-        android:layout_marginTop="20dp"
-        android:src="@drawable/ic_fp_40px"
-        android:contentDescription="@string/description_fingerprint_icon"/>
-
-    <TextView
-        android:id="@+id/fingerprint_status"
-        style="@android:style/TextAppearance.Material.Body1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignBottom="@+id/fingerprint_icon"
-        android:layout_alignTop="@+id/fingerprint_icon"
-        android:layout_marginStart="16dp"
-        android:layout_toEndOf="@+id/fingerprint_icon"
-        android:gravity="center_vertical"
-        android:text="@string/fingerprint_hint"
-        android:textColor="@color/hint_color" />
-</RelativeLayout>
\ No newline at end of file
diff --git a/security/FingerprintDialog/Application/src/main/res/menu/menu_main.xml b/security/FingerprintDialog/Application/src/main/res/menu/menu_main.xml
deleted file mode 100644
index 6a6ba0f..0000000
--- a/security/FingerprintDialog/Application/src/main/res/menu/menu_main.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    tools:context=".MainActivity">
-    <item
-        android:id="@+id/action_settings"
-        android:orderInCategory="100"
-        android:title="@string/action_settings"
-        app:showAsAction="never" />
-</menu>
diff --git a/security/FingerprintDialog/Application/src/main/res/mipmap-hdpi/ic_launcher.png b/security/FingerprintDialog/Application/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 68c473a..0000000
--- a/security/FingerprintDialog/Application/src/main/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/Application/src/main/res/mipmap-mdpi/ic_launcher.png b/security/FingerprintDialog/Application/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index fd7e5f6..0000000
--- a/security/FingerprintDialog/Application/src/main/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/Application/src/main/res/mipmap-xhdpi/ic_launcher.png b/security/FingerprintDialog/Application/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 106c0d3..0000000
--- a/security/FingerprintDialog/Application/src/main/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png b/security/FingerprintDialog/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index b319beb..0000000
--- a/security/FingerprintDialog/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/security/FingerprintDialog/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 4dc0ddf..0000000
--- a/security/FingerprintDialog/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/Application/src/main/res/values/colors.xml b/security/FingerprintDialog/Application/src/main/res/values/colors.xml
deleted file mode 100644
index a24f3c8..0000000
--- a/security/FingerprintDialog/Application/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<resources>
-    <color name="warning_color">#f4511e</color>
-    <color name="hint_color">#42000000</color>
-    <color name="success_color">#009688</color>
-</resources>
diff --git a/security/FingerprintDialog/Application/src/main/res/values/strings.xml b/security/FingerprintDialog/Application/src/main/res/values/strings.xml
deleted file mode 100644
index b085606..0000000
--- a/security/FingerprintDialog/Application/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<resources>
-    <!--
-      The similar strings app_name is added in the Application/template directory, but depending
-      on the template directory makes it hard for the sample buildable with Android.mk.
-      Thus defining the application_name with different name from the template.
-    -->
-    <string name="application_name">FingerprintDialog</string>
-    <string name="action_settings">Settings</string>
-    <string name="cancel">Cancel</string>
-    <string name="use_password">Use password</string>
-    <string name="sign_in">Sign in</string>
-    <string name="ok">OK</string>
-    <string name="password">Password</string>
-    <string name="fingerprint_description">Confirm fingerprint to continue</string>
-    <string name="fingerprint_hint">Touch sensor</string>
-    <string name="password_description">Enter your store password to continue</string>
-    <string name="purchase">Purchase</string>
-    <string name="purchase_not_invalidated">Purchase not invalidated</string>
-    <string name="purchase_button_not_invalidated_description">
-        You can proceed to purchase with this button \n even if a new fingerprint is enrolled
-    </string>
-    <string name="fingerprint_not_recognized">Fingerprint not recognized. Try again</string>
-    <string name="fingerprint_success">Fingerprint recognized</string>
-    <string name="item_title">White Mesh Pluto Backpack</string>
-    <string name="item_price">$62.68</string>
-    <string name="item_description">Mesh backpack in white. Black textile trim throughout.</string>
-    <string name="purchase_done">Purchase successful</string>
-    <string name="new_fingerprint_enrolled_description">A new fingerprint was added to this device, so your password is required.</string>
-    <string name="use_fingerprint_in_future">Use fingerprint in the future</string>
-    <string name="use_fingerprint_to_authenticate_title">Use fingerprint to authenticate</string>
-    <string name="use_fingerprint_to_authenticate_key" >use_fingerprint_to_authenticate_key</string>
-    <string name="description_bugdroid_icon">Android bugdroid image</string>
-    <string name="description_fingerprint_icon">Fingerprint icon</string>
-</resources>
diff --git a/security/FingerprintDialog/Application/src/main/res/xml/preferences.xml b/security/FingerprintDialog/Application/src/main/res/xml/preferences.xml
deleted file mode 100644
index 761391d..0000000
--- a/security/FingerprintDialog/Application/src/main/res/xml/preferences.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<PreferenceScreen  xmlns:android="http://schemas.android.com/apk/res/android">
-    <CheckBoxPreference
-        android:key="@string/use_fingerprint_to_authenticate_key"
-        android:title="@string/use_fingerprint_to_authenticate_title"
-        android:persistent="true"
-        android:defaultValue="true" />
-</PreferenceScreen>
\ No newline at end of file
diff --git a/security/FingerprintDialog/build.gradle b/security/FingerprintDialog/build.gradle
deleted file mode 100644
index 2b8d1ef..0000000
--- a/security/FingerprintDialog/build.gradle
+++ /dev/null
@@ -1,11 +0,0 @@
-
-// BEGIN_EXCLUDE
-import com.example.android.samples.build.SampleGenPlugin
-apply plugin: SampleGenPlugin
-
-samplegen {
-  pathToBuild "../../../../build"
-  pathToSamplesCommon "../../common"
-}
-apply from: "../../../../build/build.gradle"
-// END_EXCLUDE
diff --git a/security/FingerprintDialog/buildSrc/build.gradle b/security/FingerprintDialog/buildSrc/build.gradle
deleted file mode 100644
index 8c294c2..0000000
--- a/security/FingerprintDialog/buildSrc/build.gradle
+++ /dev/null
@@ -1,15 +0,0 @@
-repositories {
-    mavenCentral()
-}
-dependencies {
-    compile 'org.freemarker:freemarker:2.3.20'
-}
-
-sourceSets {
-    main {
-        groovy {
-            srcDir new File(rootDir, "../../../../../build/buildSrc/src/main/groovy")
-        }
-    }
-}
-
diff --git a/security/FingerprintDialog/gradle/wrapper/gradle-wrapper.jar b/security/FingerprintDialog/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 94336fc..0000000
--- a/security/FingerprintDialog/gradle/wrapper/gradle-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/gradle/wrapper/gradle-wrapper.properties b/security/FingerprintDialog/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index ae45383..0000000
--- a/security/FingerprintDialog/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
diff --git a/security/FingerprintDialog/gradlew b/security/FingerprintDialog/gradlew
deleted file mode 100755
index cccdd3d..0000000
--- a/security/FingerprintDialog/gradlew
+++ /dev/null
@@ -1,172 +0,0 @@
-#!/usr/bin/env sh
-
-##############################################################################
-##
-##  Gradle start up script for UN*X
-##
-##############################################################################
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn () {
-    echo "$*"
-}
-
-die () {
-    echo
-    echo "$*"
-    echo
-    exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-nonstop=false
-case "`uname`" in
-  CYGWIN* )
-    cygwin=true
-    ;;
-  Darwin* )
-    darwin=true
-    ;;
-  MINGW* )
-    msys=true
-    ;;
-  NONSTOP* )
-    nonstop=true
-    ;;
-esac
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-        # IBM's JDK on AIX uses strange locations for the executables
-        JAVACMD="$JAVA_HOME/jre/sh/java"
-    else
-        JAVACMD="$JAVA_HOME/bin/java"
-    fi
-    if [ ! -x "$JAVACMD" ] ; then
-        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-    fi
-else
-    JAVACMD="java"
-    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
-    MAX_FD_LIMIT=`ulimit -H -n`
-    if [ $? -eq 0 ] ; then
-        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
-            MAX_FD="$MAX_FD_LIMIT"
-        fi
-        ulimit -n $MAX_FD
-        if [ $? -ne 0 ] ; then
-            warn "Could not set maximum file descriptor limit: $MAX_FD"
-        fi
-    else
-        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
-    fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
-    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
-    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
-    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-    JAVACMD=`cygpath --unix "$JAVACMD"`
-
-    # We build the pattern for arguments to be converted via cygpath
-    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
-    SEP=""
-    for dir in $ROOTDIRSRAW ; do
-        ROOTDIRS="$ROOTDIRS$SEP$dir"
-        SEP="|"
-    done
-    OURCYGPATTERN="(^($ROOTDIRS))"
-    # Add a user-defined pattern to the cygpath arguments
-    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
-        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
-    fi
-    # Now convert the arguments - kludge to limit ourselves to /bin/sh
-    i=0
-    for arg in "$@" ; do
-        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
-        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
-
-        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
-            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
-        else
-            eval `echo args$i`="\"$arg\""
-        fi
-        i=$((i+1))
-    done
-    case $i in
-        (0) set -- ;;
-        (1) set -- "$args0" ;;
-        (2) set -- "$args0" "$args1" ;;
-        (3) set -- "$args0" "$args1" "$args2" ;;
-        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
-        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
-        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
-        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
-        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
-        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
-    esac
-fi
-
-# Escape application args
-save () {
-    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
-    echo " "
-}
-APP_ARGS=$(save "$@")
-
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
-
-# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
-if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
-  cd "$(dirname "$0")"
-fi
-
-exec "$JAVACMD" "$@"
diff --git a/security/FingerprintDialog/gradlew.bat b/security/FingerprintDialog/gradlew.bat
deleted file mode 100644
index e95643d..0000000
--- a/security/FingerprintDialog/gradlew.bat
+++ /dev/null
@@ -1,84 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem  Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/security/FingerprintDialog/kotlinApp/.google/packaging.yaml b/security/FingerprintDialog/kotlinApp/.google/packaging.yaml
deleted file mode 100644
index 1846486..0000000
--- a/security/FingerprintDialog/kotlinApp/.google/packaging.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-# GOOGLE SAMPLE PACKAGING DATA
-#
-# This file is used by Google as part of our samples packaging process.
-# End users may safely ignore this file. It has no relevance to other systems.
----
-status:       PUBLISHED
-technologies: [Android]
-categories:   [security]
-languages:    [Kotlin]
-solutions:    [Mobile]
-github:       android-FingerprintDialog
-level:        INTERMEDIATE
-icon:         screenshots/big-icon.png
-apiRefs:
-    - android:android.hardware.fingerprint.FingerprintManager
-    - android:android.hardware.fingerprint.FingerprintManager.AuthenticationCallback
-    - android:android.hardware.fingerprint.FingerprintManager.CryptoObject
-    - android:android.security.KeyGenParameterSpec
-    - android:java.security.KeyStore
-    - android:javax.crypto.Cipher
-    - android:javax.crypto.KeyGenerator
-license: apache2
diff --git a/security/FingerprintDialog/kotlinApp/README.md b/security/FingerprintDialog/kotlinApp/README.md
deleted file mode 100644
index 85650d0..0000000
--- a/security/FingerprintDialog/kotlinApp/README.md
+++ /dev/null
@@ -1,85 +0,0 @@
-
-Android FingerprintDialog Sample (Kotlin)
-=========================================
-
-A sample that demonstrates to use registered fingerprints to authenticate the user in your app
-
-Introduction
-------------
-
-This sample demonstrates how you can use registered fingerprints in your app to authenticate the
-user before proceeding some actions such as purchasing an item.
-
-First you need to create a symmetric key in the Android Key Store using [KeyGenerator][1]
-which can be only be used after the user has authenticated with fingerprint and pass
-a [KeyGenParameterSpec][2].
-
-By setting [KeyGenParameterSpec.Builder.setUserAuthenticationRequired][3] to true, you can permit
-the use of the key only after the user authenticate it including when authenticated with the user's
-fingerprint.
-
-Then start listening to a fingerprint on the fingerprint sensor by calling
-[FingerprintManager.authenticate][4] with a [Cipher][5] initialized with the symmetric key created.
-Or alternatively you can fall back to server-side verified password as an authenticator.
-
-Once the fingerprint (or password) is verified, the
-[FingerprintManager.AuthenticationCallback#onAuthenticationSucceeded()][6] callback is called.
-
-[1]: https://developer.android.com/reference/javax/crypto/KeyGenerator.html
-[2]: https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.html
-[3]: https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.Builder.html#setUserAuthenticationRequired%28boolean%29
-[4]: https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager.html#authenticate%28android.hardware.fingerprint.FingerprintManager.CryptoObject,%20android.os.CancellationSignal,%20int,%20android.hardware.fingerprint.FingerprintManager.AuthenticationCallback,%20android.os.Handler%29
-[5]: https://developer.android.com/reference/javax/crypto/Cipher.html
-[6]: https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager.AuthenticationCallback.html#onAuthenticationSucceeded%28android.hardware.fingerprint.FingerprintManager.AuthenticationResult%29
-
-Pre-requisites
---------------
-
-- Android SDK 27
-- Android Support Repository
-
-Screenshots
--------------
-
-<img src="screenshots/1-purchase-screen.png" height="400" alt="Screenshot"/>
-<img src="screenshots/2-fingerprint-dialog.png" height="400" alt="Screenshot"/>
-<img src="screenshots/3-fingerprint-authenticated.png" height="400" alt="Screenshot"/>
-<img src="screenshots/4-new-fingerprint-enrolled.png" height="400" alt="Screenshot"/>
-
-Getting Started
----------------
-
-This sample uses the Gradle build system. To build this project, use the
-"gradlew build" command or use "Import Project" in Android Studio.
-
-Support
--------
-
-- Google+ Community: https://plus.google.com/communities/105153134372062985968
-- Stack Overflow: http://stackoverflow.com/questions/tagged/android
-
-If you've found an error in this sample, please file an issue:
-https://github.com/googlesamples/android-FingerprintDialog
-
-Patches are encouraged, and may be submitted by forking this project and
-submitting a pull request through GitHub. Please see CONTRIBUTING.md for more details.
-
-License
--------
-
-Copyright 2017 The Android Open Source Project, Inc.
-
-Licensed to the Apache Software Foundation (ASF) under one or more contributor
-license agreements.  See the NOTICE file distributed with this work for
-additional information regarding copyright ownership.  The ASF licenses this
-file to you under the Apache License, Version 2.0 (the "License"); you may not
-use this file except in compliance with the License.  You may obtain a copy of
-the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
-License for the specific language governing permissions and limitations under
-the License.
diff --git a/security/FingerprintDialog/kotlinApp/app/build.gradle b/security/FingerprintDialog/kotlinApp/app/build.gradle
deleted file mode 100644
index 4b678c5..0000000
--- a/security/FingerprintDialog/kotlinApp/app/build.gradle
+++ /dev/null
@@ -1,25 +0,0 @@
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
-
-android {
-    compileSdkVersion 27
-    defaultConfig {
-        applicationId "com.example.android.fingerprintdialog"
-        minSdkVersion 24
-        targetSdkVersion 27
-        versionCode 1
-        versionName "1.0"
-    }
-    buildTypes {
-        release {
-            minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
-        }
-    }
-}
-
-dependencies {
-    implementation "com.android.support:appcompat-v7:27.0.0"
-    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
-}
diff --git a/security/FingerprintDialog/kotlinApp/app/proguard-project.txt b/security/FingerprintDialog/kotlinApp/app/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/security/FingerprintDialog/kotlinApp/app/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/AndroidManifest.xml b/security/FingerprintDialog/kotlinApp/app/src/main/AndroidManifest.xml
deleted file mode 100644
index 9dffd1c..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<manifest package="com.example.android.fingerprintdialog"
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:versionCode="1"
-    android:versionName="1.0">
-
-    <uses-permission android:name="android.permission.USE_FINGERPRINT" />
-
-    <application
-        android:allowBackup="true"
-        android:icon="@mipmap/ic_launcher"
-        android:label="@string/application_name"
-        android:supportsRtl="true"
-        android:theme="@style/Theme.AppCompat.Light"
-        tools:ignore="GoogleAppIndexingWarning">
-
-        <activity
-            android:name=".MainActivity"
-            android:label="@string/application_name"
-            android:theme="@style/Theme.AppCompat.Light.NoActionBar">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-
-        <activity
-            android:name=".SettingsActivity"
-            android:label="@string/action_settings"
-            android:parentActivityName=".MainActivity"/>
-    </application>
-</manifest>
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/ActivityExtensions.kt b/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/ActivityExtensions.kt
deleted file mode 100644
index 108ca43..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/ActivityExtensions.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.example.android.fingerprintdialog
-
-import android.support.v7.app.AppCompatActivity
-import android.widget.Toast
-
-fun AppCompatActivity.showToast(text: String) {
-    Toast.makeText(this, text, Toast.LENGTH_LONG).show()
-}
\ No newline at end of file
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/Constants.kt b/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/Constants.kt
deleted file mode 100644
index 8f93fb1..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/Constants.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-@file:JvmName("Constants")
-
-package com.example.android.fingerprintdialog
-
-@JvmField val DEFAULT_KEY_NAME = "default_key"
-
-/**
- * Enumeration to indicate which authentication method the user is trying to authenticate with.
- */
-enum class Stage { FINGERPRINT, NEW_FINGERPRINT_ENROLLED, PASSWORD }
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/FingerprintAuthenticationDialogFragment.kt b/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/FingerprintAuthenticationDialogFragment.kt
deleted file mode 100644
index f095e10..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/FingerprintAuthenticationDialogFragment.kt
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.fingerprintdialog
-
-import android.app.DialogFragment
-import android.content.Context
-import android.content.SharedPreferences
-import android.hardware.fingerprint.FingerprintManager
-import android.os.Bundle
-import android.preference.PreferenceManager
-import android.view.KeyEvent
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.view.inputmethod.EditorInfo
-import android.view.inputmethod.InputMethodManager
-import android.widget.Button
-import android.widget.CheckBox
-import android.widget.EditText
-import android.widget.TextView
-
-/**
- * A dialog which uses fingerprint APIs to authenticate the user, and falls back to password
- * authentication if fingerprint is not available.
- */
-class FingerprintAuthenticationDialogFragment : DialogFragment(),
-        TextView.OnEditorActionListener,
-        FingerprintUiHelper.Callback {
-
-    private lateinit var backupContent: View
-    private lateinit var cancelButton: Button
-    private lateinit var fingerprintContainer: View
-    private lateinit var fingerprintEnrolledTextView: TextView
-    private lateinit var passwordDescriptionTextView: TextView
-    private lateinit var passwordEditText: EditText
-    private lateinit var secondDialogButton: Button
-    private lateinit var useFingerprintFutureCheckBox: CheckBox
-
-    private lateinit var callback: Callback
-    private lateinit var cryptoObject: FingerprintManager.CryptoObject
-    private lateinit var fingerprintUiHelper: FingerprintUiHelper
-    private lateinit var inputMethodManager: InputMethodManager
-    private lateinit var sharedPreferences: SharedPreferences
-
-    private var stage = Stage.FINGERPRINT
-
-    private val showKeyboardRunnable = Runnable {
-        inputMethodManager.showSoftInput(passwordEditText, 0)
-    }
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-
-        // Do not create a new Fragment when the Activity is re-created such as orientation changes.
-        retainInstance = true
-        setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Material_Light_Dialog)
-    }
-
-    override fun onCreateView(inflater: LayoutInflater,
-            container: ViewGroup?,
-            savedInstanceState: Bundle?
-    ): View? {
-        dialog.setTitle(getString(R.string.sign_in))
-        return inflater.inflate(R.layout.fingerprint_dialog_container, container, false)
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-
-        backupContent = view.findViewById(R.id.backup_container)
-        cancelButton = view.findViewById(R.id.cancel_button)
-        fingerprintContainer = view.findViewById(R.id.fingerprint_container)
-        fingerprintEnrolledTextView = view.findViewById(R.id.new_fingerprint_enrolled_description)
-        passwordDescriptionTextView = view.findViewById(R.id.password_description)
-        passwordEditText = view.findViewById(R.id.password)
-        secondDialogButton = view.findViewById(R.id.second_dialog_button)
-        useFingerprintFutureCheckBox = view.findViewById(R.id.use_fingerprint_in_future_check)
-
-        cancelButton.setOnClickListener { dismiss() }
-        passwordEditText.setOnEditorActionListener(this)
-        secondDialogButton.setOnClickListener {
-            if (stage == Stage.FINGERPRINT) goToBackup() else verifyPassword()
-        }
-
-        fingerprintUiHelper = FingerprintUiHelper(
-                activity.getSystemService(FingerprintManager::class.java),
-                view.findViewById(R.id.fingerprint_icon),
-                view.findViewById(R.id.fingerprint_status),
-                this
-        )
-        updateStage()
-
-        // If fingerprint authentication is not available, switch immediately to the backup
-        // (password) screen.
-        if (!fingerprintUiHelper.isFingerprintAuthAvailable) {
-            goToBackup()
-        }
-    }
-    override fun onResume() {
-        super.onResume()
-        if (stage == Stage.FINGERPRINT) {
-            fingerprintUiHelper.startListening(cryptoObject)
-        }
-    }
-
-    override fun onPause() {
-        super.onPause()
-        fingerprintUiHelper.stopListening()
-    }
-
-    override fun onAttach(context: Context) {
-        super.onAttach(context)
-        inputMethodManager = context.getSystemService(InputMethodManager::class.java)
-        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
-    }
-
-    fun setCallback(callback: Callback) {
-        this.callback = callback
-    }
-
-    fun setCryptoObject(cryptoObject: FingerprintManager.CryptoObject) {
-        this.cryptoObject = cryptoObject
-    }
-
-    fun setStage(stage: Stage) {
-        this.stage = stage
-    }
-
-    /**
-     * Switches to backup (password) screen. This either can happen when fingerprint is not
-     * available or the user chooses to use the password authentication method by pressing the
-     * button. This can also happen when the user has too many invalid fingerprint attempts.
-     */
-    private fun goToBackup() {
-        stage = Stage.PASSWORD
-        updateStage()
-        passwordEditText.run {
-            requestFocus()
-
-            // Show the keyboard.
-            postDelayed(showKeyboardRunnable, 500)
-        }
-
-        // Fingerprint is not used anymore. Stop listening for it.
-        fingerprintUiHelper.stopListening()
-    }
-
-    /**
-     * Checks whether the current entered password is correct, and dismisses the dialog and
-     * informs the activity about the result.
-     */
-    private fun verifyPassword() {
-        if (!checkPassword(passwordEditText.text.toString())) {
-            return
-        }
-        if (stage == Stage.NEW_FINGERPRINT_ENROLLED) {
-            sharedPreferences.edit()
-                    .putBoolean(getString(R.string.use_fingerprint_to_authenticate_key),
-                            useFingerprintFutureCheckBox.isChecked)
-                    .apply()
-
-            if (useFingerprintFutureCheckBox.isChecked) {
-                // Re-create the key so that fingerprints including new ones are validated.
-                callback.createKey(DEFAULT_KEY_NAME)
-                stage = Stage.FINGERPRINT
-            }
-        }
-        passwordEditText.setText("")
-        callback.onPurchased(withFingerprint = false)
-        dismiss()
-    }
-
-    /**
-     * Checks if the given password is valid. Assume that the password is always correct.
-     * In a real world situation, the password needs to be verified via the server.
-     *
-     * @param password The password String
-     *
-     * @return true if `password` is correct, false otherwise
-     */
-    private fun checkPassword(password: String) = password.isNotEmpty()
-
-    private fun updateStage() {
-        when (stage) {
-            Stage.FINGERPRINT -> {
-                cancelButton.setText(R.string.cancel)
-                secondDialogButton.setText(R.string.use_password)
-                fingerprintContainer.visibility = View.VISIBLE
-                backupContent.visibility = View.GONE
-            }
-            Stage.NEW_FINGERPRINT_ENROLLED, // Intentional fall through
-            Stage.PASSWORD -> {
-                cancelButton.setText(R.string.cancel)
-                secondDialogButton.setText(R.string.ok)
-                fingerprintContainer.visibility = View.GONE
-                backupContent.visibility = View.VISIBLE
-                if (stage == Stage.NEW_FINGERPRINT_ENROLLED) {
-                    passwordDescriptionTextView.visibility = View.GONE
-                    fingerprintEnrolledTextView.visibility = View.VISIBLE
-                    useFingerprintFutureCheckBox.visibility = View.VISIBLE
-                }
-            }
-        }
-    }
-
-    override fun onEditorAction(v: TextView, actionId: Int, event: KeyEvent?): Boolean {
-        return if (actionId == EditorInfo.IME_ACTION_GO) { verifyPassword(); true } else false
-    }
-
-    override fun onAuthenticated() {
-        // Callback from FingerprintUiHelper. Let the activity know that authentication succeeded.
-        callback.onPurchased(withFingerprint = true, crypto = cryptoObject)
-        dismiss()
-    }
-
-    override fun onError() {
-        goToBackup()
-    }
-
-    interface Callback {
-        fun onPurchased(withFingerprint: Boolean, crypto: FingerprintManager.CryptoObject? = null)
-        fun createKey(keyName: String, invalidatedByBiometricEnrollment: Boolean = true)
-    }
-}
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/FingerprintUiHelper.kt b/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/FingerprintUiHelper.kt
deleted file mode 100644
index ad38abc..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/FingerprintUiHelper.kt
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.fingerprintdialog
-
-import android.hardware.fingerprint.FingerprintManager
-import android.os.CancellationSignal
-import android.widget.ImageView
-import android.widget.TextView
-
-/**
- * Small helper class to manage text/icon around fingerprint authentication UI.
- */
-class FingerprintUiHelper
-
-/**
- * Constructor for [FingerprintUiHelper].
- */
-internal constructor(private val fingerprintMgr: FingerprintManager,
-        private val icon: ImageView,
-        private val errorTextView: TextView,
-        private val callback: Callback
-) : FingerprintManager.AuthenticationCallback() {
-
-    private var cancellationSignal: CancellationSignal? = null
-    private var selfCancelled = false
-
-    val isFingerprintAuthAvailable: Boolean
-        get() = fingerprintMgr.isHardwareDetected && fingerprintMgr.hasEnrolledFingerprints()
-
-    private val resetErrorTextRunnable = Runnable {
-        icon.setImageResource(R.drawable.ic_fp_40px)
-        errorTextView.run {
-            setTextColor(errorTextView.resources.getColor(R.color.hint_color, null))
-            text = errorTextView.resources.getString(R.string.fingerprint_hint)
-        }
-    }
-
-    fun startListening(cryptoObject: FingerprintManager.CryptoObject) {
-        if (!isFingerprintAuthAvailable) return
-        cancellationSignal = CancellationSignal()
-        selfCancelled = false
-        fingerprintMgr.authenticate(cryptoObject, cancellationSignal, 0, this, null)
-        icon.setImageResource(R.drawable.ic_fp_40px)
-    }
-
-    fun stopListening() {
-        cancellationSignal?.also {
-            selfCancelled = true
-            it.cancel()
-        }
-        cancellationSignal = null
-    }
-
-    override fun onAuthenticationError(errMsgId: Int, errString: CharSequence) {
-        if (!selfCancelled) {
-            showError(errString)
-            icon.postDelayed({ callback.onError() }, ERROR_TIMEOUT_MILLIS)
-        }
-    }
-
-    override fun onAuthenticationHelp(helpMsgId: Int, helpString: CharSequence) =
-            showError(helpString)
-
-    override fun onAuthenticationFailed() =
-            showError(icon.resources.getString(R.string.fingerprint_not_recognized))
-
-    override fun onAuthenticationSucceeded(result: FingerprintManager.AuthenticationResult) {
-        errorTextView.run {
-            removeCallbacks(resetErrorTextRunnable)
-            setTextColor(errorTextView.resources.getColor(R.color.success_color, null))
-            text = errorTextView.resources.getString(R.string.fingerprint_success)
-        }
-        icon.run {
-            setImageResource(R.drawable.ic_fingerprint_success)
-            postDelayed({ callback.onAuthenticated() }, SUCCESS_DELAY_MILLIS)
-        }
-    }
-
-    private fun showError(error: CharSequence) {
-        icon.setImageResource(R.drawable.ic_fingerprint_error)
-        errorTextView.run {
-            text = error
-            setTextColor(errorTextView.resources.getColor(R.color.warning_color, null))
-            removeCallbacks(resetErrorTextRunnable)
-            postDelayed(resetErrorTextRunnable, ERROR_TIMEOUT_MILLIS)
-        }
-    }
-
-    interface Callback {
-        fun onAuthenticated()
-        fun onError()
-    }
-
-    companion object {
-        val ERROR_TIMEOUT_MILLIS: Long = 1600
-        val SUCCESS_DELAY_MILLIS: Long = 1300
-    }
-}
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/MainActivity.kt b/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/MainActivity.kt
deleted file mode 100644
index 0a4732d..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/MainActivity.kt
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.fingerprintdialog
-
-import android.app.KeyguardManager
-import android.content.Intent
-import android.content.SharedPreferences
-import android.hardware.fingerprint.FingerprintManager
-import android.os.Bundle
-import android.preference.PreferenceManager
-import android.security.keystore.KeyGenParameterSpec
-import android.security.keystore.KeyPermanentlyInvalidatedException
-import android.security.keystore.KeyProperties
-import android.security.keystore.KeyProperties.BLOCK_MODE_CBC
-import android.security.keystore.KeyProperties.ENCRYPTION_PADDING_PKCS7
-import android.security.keystore.KeyProperties.KEY_ALGORITHM_AES
-import android.support.v7.app.AppCompatActivity
-import android.util.Base64
-import android.util.Log
-import android.view.Menu
-import android.view.MenuItem
-import android.view.View
-import android.widget.Button
-import android.widget.TextView
-import android.widget.Toast
-import java.io.IOException
-import java.security.InvalidAlgorithmParameterException
-import java.security.InvalidKeyException
-import java.security.KeyStore
-import java.security.KeyStoreException
-import java.security.NoSuchAlgorithmException
-import java.security.NoSuchProviderException
-import java.security.UnrecoverableKeyException
-import java.security.cert.CertificateException
-import javax.crypto.BadPaddingException
-import javax.crypto.Cipher
-import javax.crypto.IllegalBlockSizeException
-import javax.crypto.KeyGenerator
-import javax.crypto.NoSuchPaddingException
-import javax.crypto.SecretKey
-
-/**
- * Main entry point for the sample, showing a backpack and "Purchase" button.
- */
-class MainActivity : AppCompatActivity(),
-    FingerprintAuthenticationDialogFragment.Callback {
-
-    private lateinit var keyStore: KeyStore
-    private lateinit var keyGenerator: KeyGenerator
-    private lateinit var sharedPreferences: SharedPreferences
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_main)
-        setSupportActionBar(findViewById(R.id.toolbar))
-        setupKeyStoreAndKeyGenerator()
-
-        val (defaultCipher: Cipher, cipherNotInvalidated: Cipher) = setupCiphers()
-        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
-        setUpPurchaseButtons(cipherNotInvalidated, defaultCipher)
-    }
-
-    /**
-     * Enables or disables purchase buttons and sets the appropriate click listeners.
-     *
-     * @param cipherNotInvalidated cipher for the not invalidated purchase button
-     * @param defaultCipher the default cipher, used for the purchase button
-     */
-    private fun setUpPurchaseButtons(cipherNotInvalidated: Cipher, defaultCipher: Cipher) {
-        val purchaseButton = findViewById<Button>(R.id.purchase_button)
-        val purchaseButtonNotInvalidated =
-                findViewById<Button>(R.id.purchase_button_not_invalidated)
-
-        purchaseButtonNotInvalidated.run {
-            isEnabled = true
-            setOnClickListener(PurchaseButtonClickListener(
-                    cipherNotInvalidated, KEY_NAME_NOT_INVALIDATED))
-        }
-
-        val keyguardManager = getSystemService(KeyguardManager::class.java)
-        if (!keyguardManager.isKeyguardSecure) {
-            // Show a message that the user hasn't set up a fingerprint or lock screen.
-            showToast(getString(R.string.setup_lock_screen))
-            purchaseButton.isEnabled = false
-            purchaseButtonNotInvalidated.isEnabled = false
-            return
-        }
-
-        val fingerprintManager = getSystemService(FingerprintManager::class.java)
-        if (!fingerprintManager.hasEnrolledFingerprints()) {
-            purchaseButton.isEnabled = false
-            // This happens when no fingerprints are registered.
-            showToast(getString(R.string.register_fingerprint))
-            return
-        }
-
-        createKey(DEFAULT_KEY_NAME)
-        createKey(KEY_NAME_NOT_INVALIDATED, false)
-        purchaseButton.run {
-            isEnabled = true
-            setOnClickListener(PurchaseButtonClickListener(defaultCipher, DEFAULT_KEY_NAME))
-        }
-    }
-
-    /**
-     * Sets up KeyStore and KeyGenerator
-     */
-    private fun setupKeyStoreAndKeyGenerator() {
-        try {
-            keyStore = KeyStore.getInstance(ANDROID_KEY_STORE)
-        } catch (e: KeyStoreException) {
-            throw RuntimeException("Failed to get an instance of KeyStore", e)
-        }
-
-        try {
-            keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM_AES, ANDROID_KEY_STORE)
-        } catch (e: Exception) {
-            when (e) {
-                is NoSuchAlgorithmException,
-                is NoSuchProviderException ->
-                    throw RuntimeException("Failed to get an instance of KeyGenerator", e)
-                else -> throw e
-            }
-        }
-    }
-
-    /**
-     * Sets up default cipher and a non-invalidated cipher
-     */
-    private fun setupCiphers(): Pair<Cipher, Cipher> {
-        val defaultCipher: Cipher
-        val cipherNotInvalidated: Cipher
-        try {
-            val cipherString = "$KEY_ALGORITHM_AES/$BLOCK_MODE_CBC/$ENCRYPTION_PADDING_PKCS7"
-            defaultCipher = Cipher.getInstance(cipherString)
-            cipherNotInvalidated = Cipher.getInstance(cipherString)
-        } catch (e: Exception) {
-            when (e) {
-                is NoSuchAlgorithmException,
-                is NoSuchPaddingException ->
-                    throw RuntimeException("Failed to get an instance of Cipher", e)
-                else -> throw e
-            }
-        }
-        return Pair(defaultCipher, cipherNotInvalidated)
-    }
-
-    /**
-     * Initialize the [Cipher] instance with the created key in the [createKey] method.
-     *
-     * @param keyName the key name to init the cipher
-     * @return `true` if initialization succeeded, `false` if the lock screen has been disabled or
-     * reset after key generation, or if a fingerprint was enrolled after key generation.
-     */
-    private fun initCipher(cipher: Cipher, keyName: String): Boolean {
-        try {
-            keyStore.load(null)
-            cipher.init(Cipher.ENCRYPT_MODE, keyStore.getKey(keyName, null) as SecretKey)
-            return true
-        } catch (e: Exception) {
-            when (e) {
-                is KeyPermanentlyInvalidatedException -> return false
-                is KeyStoreException,
-                is CertificateException,
-                is UnrecoverableKeyException,
-                is IOException,
-                is NoSuchAlgorithmException,
-                is InvalidKeyException -> throw RuntimeException("Failed to init Cipher", e)
-                else -> throw e
-            }
-        }
-    }
-
-    /**
-     * Proceed with the purchase operation
-     *
-     * @param withFingerprint `true` if the purchase was made by using a fingerprint
-     * @param crypto the Crypto object
-     */
-    override fun onPurchased(withFingerprint: Boolean, crypto: FingerprintManager.CryptoObject?) {
-        if (withFingerprint) {
-            // If the user authenticated with fingerprint, verify using cryptography and then show
-            // the confirmation message.
-            if (crypto != null) {
-                tryEncrypt(crypto.cipher)
-            }
-        } else {
-            // Authentication happened with backup password. Just show the confirmation message.
-            showConfirmation()
-        }
-    }
-
-    // Show confirmation message. Also show crypto information if fingerprint was used.
-    private fun showConfirmation(encrypted: ByteArray? = null) {
-        findViewById<View>(R.id.confirmation_message).visibility = View.VISIBLE
-        if (encrypted != null) {
-            findViewById<TextView>(R.id.encrypted_message).run {
-                visibility = View.VISIBLE
-                text = Base64.encodeToString(encrypted, 0 /* flags */)
-            }
-        }
-    }
-
-    /**
-     * Tries to encrypt some data with the generated key from [createKey]. This only works if the
-     * user just authenticated via fingerprint.
-     */
-    private fun tryEncrypt(cipher: Cipher) {
-        try {
-            showConfirmation(cipher.doFinal(SECRET_MESSAGE.toByteArray()))
-        } catch (e: Exception) {
-            when (e) {
-                is BadPaddingException,
-                is IllegalBlockSizeException -> {
-                    Toast.makeText(this, "Failed to encrypt the data with the generated key. "
-                            + "Retry the purchase", Toast.LENGTH_LONG).show()
-                    Log.e(TAG, "Failed to encrypt the data with the generated key. ${e.message}")
-                }
-                else -> throw e
-            }
-        }
-    }
-
-    /**
-     * Creates a symmetric key in the Android Key Store which can only be used after the user has
-     * authenticated with a fingerprint.
-     *
-     * @param keyName the name of the key to be created
-     * @param invalidatedByBiometricEnrollment if `false` is passed, the created key will not be
-     * invalidated even if a new fingerprint is enrolled. The default value is `true` - the key will
-     * be invalidated if a new fingerprint is enrolled.
-     */
-    override fun createKey(keyName: String, invalidatedByBiometricEnrollment: Boolean) {
-        // The enrolling flow for fingerprint. This is where you ask the user to set up fingerprint
-        // for your flow. Use of keys is necessary if you need to know if the set of enrolled
-        // fingerprints has changed.
-        try {
-            keyStore.load(null)
-
-            val keyProperties = KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
-            val builder = KeyGenParameterSpec.Builder(keyName, keyProperties)
-                    .setBlockModes(BLOCK_MODE_CBC)
-                    .setUserAuthenticationRequired(true)
-                    .setEncryptionPaddings(ENCRYPTION_PADDING_PKCS7)
-                    .setInvalidatedByBiometricEnrollment(invalidatedByBiometricEnrollment)
-
-            keyGenerator.run {
-                init(builder.build())
-                generateKey()
-            }
-        } catch (e: Exception) {
-            when (e) {
-                is NoSuchAlgorithmException,
-                is InvalidAlgorithmParameterException,
-                is CertificateException,
-                is IOException -> throw RuntimeException(e)
-                else -> throw e
-            }
-        }
-    }
-
-    override fun onCreateOptionsMenu(menu: Menu): Boolean {
-        menuInflater.inflate(R.menu.menu_main, menu)
-        return true
-    }
-
-    override fun onOptionsItemSelected(item: MenuItem): Boolean {
-        if (item.itemId == R.id.action_settings) {
-            val intent = Intent(this, SettingsActivity::class.java)
-            startActivity(intent)
-            return true
-        }
-        return super.onOptionsItemSelected(item)
-    }
-
-    private inner class PurchaseButtonClickListener internal constructor(
-            internal var cipher: Cipher,
-            internal var keyName: String
-    ) : View.OnClickListener {
-
-        override fun onClick(view: View) {
-            findViewById<View>(R.id.confirmation_message).visibility = View.GONE
-            findViewById<View>(R.id.encrypted_message).visibility = View.GONE
-
-            val fragment = FingerprintAuthenticationDialogFragment()
-            fragment.setCryptoObject(FingerprintManager.CryptoObject(cipher))
-            fragment.setCallback(this@MainActivity)
-
-            // Set up the crypto object for later, which will be authenticated by fingerprint usage.
-            if (initCipher(cipher, keyName)) {
-
-                // Show the fingerprint dialog. The user has the option to use the fingerprint with
-                // crypto, or can fall back to using a server-side verified password.
-                val useFingerprintPreference = sharedPreferences
-                        .getBoolean(getString(R.string.use_fingerprint_to_authenticate_key), true)
-                if (useFingerprintPreference) {
-                    fragment.setStage(Stage.FINGERPRINT)
-                } else {
-                    fragment.setStage(Stage.PASSWORD)
-                }
-            } else {
-                // This happens if the lock screen has been disabled or or a fingerprint was
-                // enrolled. Thus, show the dialog to authenticate with their password first and ask
-                // the user if they want to authenticate with a fingerprint in the future.
-                fragment.setStage(Stage.NEW_FINGERPRINT_ENROLLED)
-            }
-            fragment.show(fragmentManager, DIALOG_FRAGMENT_TAG)
-        }
-    }
-
-    companion object {
-        private val ANDROID_KEY_STORE = "AndroidKeyStore"
-        private val DIALOG_FRAGMENT_TAG = "myFragment"
-        private val KEY_NAME_NOT_INVALIDATED = "key_not_invalidated"
-        private val SECRET_MESSAGE = "Very secret message"
-        private val TAG = MainActivity::class.java.simpleName
-    }
-}
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/SettingsActivity.kt b/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/SettingsActivity.kt
deleted file mode 100644
index 6a8dc16..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/SettingsActivity.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.fingerprintdialog
-
-import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
-
-class SettingsActivity : AppCompatActivity() {
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        fragmentManager.beginTransaction()
-                .replace(android.R.id.content, SettingsFragment())
-                .commit()
-    }
-
-}
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/SettingsFragment.kt b/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/SettingsFragment.kt
deleted file mode 100644
index 0681e6d..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/java/com/example/android/fingerprintdialog/SettingsFragment.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.example.android.fingerprintdialog
-
-import android.os.Bundle
-import android.preference.PreferenceFragment
-
-class SettingsFragment : PreferenceFragment() {
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        addPreferencesFromResource(R.xml.preferences)
-    }
-
-}
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-hdpi/ic_fp_40px.png b/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-hdpi/ic_fp_40px.png
deleted file mode 100644
index 48ebd8a..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-hdpi/ic_fp_40px.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-mdpi/ic_fp_40px.png b/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-mdpi/ic_fp_40px.png
deleted file mode 100644
index 122f442..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-mdpi/ic_fp_40px.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-nodpi/android_robot.png b/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-nodpi/android_robot.png
deleted file mode 100644
index 40bf934..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-nodpi/android_robot.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-xhdpi/ic_fp_40px.png b/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-xhdpi/ic_fp_40px.png
deleted file mode 100644
index e1c9590..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-xhdpi/ic_fp_40px.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-xxhdpi/ic_fp_40px.png b/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-xxhdpi/ic_fp_40px.png
deleted file mode 100644
index f7e8724..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-xxhdpi/ic_fp_40px.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-xxxhdpi/ic_fp_40px.png b/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-xxxhdpi/ic_fp_40px.png
deleted file mode 100644
index 0fb8545..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable-xxxhdpi/ic_fp_40px.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable/card.xml b/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable/card.xml
deleted file mode 100644
index cdd2907..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable/card.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <solid
-        android:color="@color/card_solid"/>
-
-    <corners
-        android:radius="@dimen/card_corner" />
-</shape>
\ No newline at end of file
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable/ic_fingerprint_error.xml b/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable/ic_fingerprint_error.xml
deleted file mode 100644
index b382543..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable/ic_fingerprint_error.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/fingerprint_square_dimen"
-        android:height="@dimen/fingerprint_square_dimen"
-        android:viewportWidth="@dimen/fingerprint_square_dimen_viewport"
-        android:viewportHeight="@dimen/fingerprint_square_dimen_viewport">
-    <path
-        android:pathData="M20.0,0.0C8.96,0.0 0.0,8.95 0.0,20.0s8.96,20.0 20.0,20.0c11.04,0.0 20.0,-8.95 20.0,-20.0S31.04,0.0 20.0,0.0z"
-        android:fillColor="@color/finerprint_error"/>
-    <path
-        android:pathData="M21.33,29.33l-2.67,0.0l0.0,-2.67l2.67,0.0L21.33,29.33zM21.33,22.67l-2.67,0.0l0.0,-12.0l2.67,0.0L21.33,22.67z"
-        android:fillColor="@color/fingerprint_fill"/>
-</vector>
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable/ic_fingerprint_success.xml b/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable/ic_fingerprint_success.xml
deleted file mode 100644
index 0195cd7..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/drawable/ic_fingerprint_success.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/fingerprint_square_dimen"
-        android:height="@dimen/fingerprint_square_dimen"
-        android:viewportWidth="@dimen/fingerprint_square_dimen_viewport"
-        android:viewportHeight="@dimen/fingerprint_square_dimen_viewport">
-    <path
-        android:pathData="M20.0,20.0m-20.0,0.0a20.0,20.0 0.0,1.0 1.0,40.0 0.0a20.0,20.0 0.0,1.0 1.0,-40.0 0.0"
-        android:fillColor="@color/fingerprint_success"/>
-    <path
-        android:pathData="M11.2,21.41l1.63,-1.619999 4.17,4.169998 10.59,-10.589999 1.619999,1.63 -12.209999,12.209999z"
-        android:fillColor="@color/fingerprint_fill"/>
-</vector>
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/layout/activity_main.xml b/security/FingerprintDialog/kotlinApp/app/src/main/res/layout/activity_main.xml
deleted file mode 100644
index fedfde6..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/layout/activity_main.xml
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical">
-
-        <android.support.v7.widget.Toolbar
-            android:id="@+id/toolbar"
-            android:layout_width="match_parent"
-            android:layout_height="?attr/actionBarSize"
-            android:background="?attr/colorPrimary"
-            android:elevation="@dimen/default_elevation"
-            android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
-            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
-
-        <ImageView
-            android:layout_width="@dimen/logo_square_dimen"
-            android:layout_height="@dimen/logo_square_dimen"
-            android:layout_marginTop="@dimen/logo_square_margin"
-            android:layout_marginBottom="@dimen/logo_square_margin"
-            android:layout_gravity="center_horizontal"
-            android:scaleType="fitCenter"
-            android:src="@drawable/android_robot"
-            android:contentDescription="@string/description_bugdroid_icon"/>
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="@dimen/default_margin_small"
-            android:layout_marginStart="@dimen/default_margin_small"
-            android:layout_marginEnd="@dimen/default_margin_small"
-            android:orientation="vertical"
-            android:background="@drawable/card"
-            android:elevation="@dimen/default_elevation"
-            android:paddingTop="@dimen/default_padding"
-            android:paddingBottom="@dimen/default_padding"
-            android:paddingStart="@dimen/default_padding"
-            android:paddingEnd="@dimen/default_padding">
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textAppearance="@android:style/TextAppearance.Material.Headline"
-                android:text="@string/item_title"/>
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textAppearance="@android:style/TextAppearance.Material.Body2"
-                android:textColor="?android:attr/colorAccent"
-                android:text="@string/item_price"/>
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="@dimen/default_margin"
-                android:textAppearance="@android:style/TextAppearance.Material.Body1"
-                android:textColor="?android:attr/textColorSecondary"
-                android:text="@string/item_description"/>
-
-        </LinearLayout>
-
-        <Button style="@android:style/Widget.Material.Button.Colored"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="@dimen/default_margin_small"
-            android:layout_marginEnd="@dimen/default_margin_end"
-            android:layout_gravity="end"
-            android:textColor="?android:attr/textColorPrimaryInverse"
-            android:text="@string/purchase"
-            android:id="@+id/purchase_button" />
-
-        <Button style="@android:style/Widget.Material.Button.Colored"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="@dimen/default_margin_small"
-            android:layout_marginEnd="@dimen/default_margin_end"
-            android:layout_gravity="end"
-            android:textColor="?android:attr/textColorPrimaryInverse"
-            android:text="@string/purchase_not_invalidated"
-            android:id="@+id/purchase_button_not_invalidated" />
-
-        <TextView
-            android:id="@+id/purchase_button_not_invalidated_description"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="@dimen/default_margin_end"
-            android:gravity="end"
-            android:textAlignment="gravity"
-            android:text="@string/purchase_button_not_invalidated_description"/>
-
-        <TextView
-            android:id="@+id/confirmation_message"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="@dimen/default_margin"
-            android:paddingStart="@dimen/default_padding"
-            android:paddingEnd="@dimen/default_padding"
-            android:textAppearance="@android:style/TextAppearance.Material.Body2"
-            android:textColor="?android:attr/colorAccent"
-            android:text="@string/purchase_done"
-            android:visibility="gone"/>
-
-        <TextView
-            android:id="@+id/encrypted_message"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="@dimen/default_margin"
-            android:paddingStart="@dimen/default_padding"
-            android:paddingEnd="@dimen/default_padding"
-            android:textAppearance="@android:style/TextAppearance.Material.Body2"
-            android:textColor="?android:attr/colorAccent"
-            android:text="@string/purchase_done"
-            android:visibility="gone"/>
-
-    </LinearLayout>
-
-</ScrollView>
\ No newline at end of file
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/layout/fingerprint_dialog_backup.xml b/security/FingerprintDialog/kotlinApp/app/src/main/res/layout/fingerprint_dialog_backup.xml
deleted file mode 100644
index 9668f50..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/layout/fingerprint_dialog_backup.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/backup_container"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingTop="@dimen/default_padding"
-    android:paddingBottom="@dimen/default_padding_small">
-
-    <FrameLayout
-        android:id="@+id/description"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentTop="true"
-        android:layout_alignParentStart="true"
-        android:layout_marginStart="@dimen/fingerprint_margin"
-        android:layout_marginEnd="@dimen/fingerprint_margin">
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textAppearance="@android:style/TextAppearance.Material.Subhead"
-            android:text="@string/password_description"
-            android:id="@+id/password_description"
-            android:textColor="?android:attr/textColorSecondary" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textAppearance="@android:style/TextAppearance.Material.Subhead"
-            android:text="@string/new_fingerprint_enrolled_description"
-            android:id="@+id/new_fingerprint_enrolled_description"
-            android:visibility="gone"
-            android:textColor="?android:attr/textColorSecondary" />
-    </FrameLayout>
-
-    <EditText
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:inputType="textPassword"
-        android:ems="10"
-        android:hint="@string/password"
-        android:imeOptions="actionGo"
-        android:id="@+id/password"
-        android:layout_below="@+id/description"
-        android:layout_marginTop="@dimen/fingerprint_margin_vertical"
-        android:layout_marginStart="@dimen/fingerprint_margin_horizontal"
-        android:layout_marginEnd="@dimen/fingerprint_margin_horizontal"
-        android:layout_alignParentStart="true" />
-
-    <CheckBox
-        android:id="@+id/use_fingerprint_in_future_check"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/password"
-        android:layout_alignParentStart="true"
-        android:layout_marginTop="@dimen/fingerprint_margin_vertical"
-        android:layout_marginStart="@dimen/fingerprint_margin_horizontal"
-        android:layout_marginEnd="@dimen/fingerprint_margin_horizontal"
-        android:checked="true"
-        android:visibility="gone"
-        android:text="@string/use_fingerprint_in_future" />
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/layout/fingerprint_dialog_container.xml b/security/FingerprintDialog/kotlinApp/app/src/main/res/layout/fingerprint_dialog_container.xml
deleted file mode 100644
index c5881ff..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/layout/fingerprint_dialog_container.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-
-    <FrameLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-
-        <include layout="@layout/fingerprint_dialog_content" />
-
-        <include
-            layout="@layout/fingerprint_dialog_backup"
-            android:visibility="gone" />
-
-    </FrameLayout>
-
-    <LinearLayout
-        android:id="@+id/buttonPanel"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:paddingStart="@dimen/fingerprint_padding_horizontal"
-        android:paddingEnd="@dimen/fingerprint_padding_horizontal"
-        android:paddingTop="@dimen/fingerprint_padding_vertical"
-        android:paddingBottom="@dimen/fingerprint_padding_vertical"
-        android:gravity="bottom"
-        style="?android:attr/buttonBarStyle">
-
-        <Space
-            android:id="@+id/spacer"
-            android:layout_width="0dp"
-            android:layout_height="0dp"
-            android:layout_weight="1"
-            android:visibility="invisible" />
-        <Button
-            android:id="@+id/cancel_button"
-            style="?android:attr/buttonBarNegativeButtonStyle"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"/>
-
-        <Button
-            android:id="@+id/second_dialog_button"
-            style="?android:attr/buttonBarPositiveButtonStyle"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"/>
-    </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/layout/fingerprint_dialog_content.xml b/security/FingerprintDialog/kotlinApp/app/src/main/res/layout/fingerprint_dialog_content.xml
deleted file mode 100644
index c68a178..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/layout/fingerprint_dialog_content.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/fingerprint_container"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingBottom="@dimen/default_padding_small"
-    android:paddingStart="@dimen/default_padding_large"
-    android:paddingEnd="@dimen/default_padding_large"
-    android:paddingTop="@dimen/default_padding">
-
-    <TextView
-        android:id="@+id/fingerprint_description"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentStart="true"
-        android:layout_alignParentTop="true"
-        android:text="@string/fingerprint_description"
-        android:textAppearance="@android:style/TextAppearance.Material.Subhead"
-        android:textColor="?android:attr/textColorSecondary"/>
-
-    <ImageView
-        android:id="@+id/fingerprint_icon"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentStart="true"
-        android:layout_below="@+id/fingerprint_description"
-        android:layout_marginTop="@dimen/fingerprint_margin_horizontal"
-        android:src="@drawable/ic_fp_40px"
-        android:contentDescription="@string/description_fingerprint_icon"/>
-
-    <TextView
-        android:id="@+id/fingerprint_status"
-        style="@android:style/TextAppearance.Material.Body1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignBottom="@+id/fingerprint_icon"
-        android:layout_alignTop="@+id/fingerprint_icon"
-        android:layout_marginStart="@dimen/default_margin"
-        android:layout_toEndOf="@+id/fingerprint_icon"
-        android:gravity="center_vertical"
-        android:text="@string/fingerprint_hint"
-        android:textColor="@color/hint_color" />
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/menu/menu_main.xml b/security/FingerprintDialog/kotlinApp/app/src/main/res/menu/menu_main.xml
deleted file mode 100644
index 2adf23c..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/menu/menu_main.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    tools:context=".MainActivity">
-    <item
-        android:id="@+id/action_settings"
-        android:orderInCategory="100"
-        android:title="@string/action_settings"
-        app:showAsAction="never" />
-</menu>
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/mipmap-hdpi/ic_launcher.png b/security/FingerprintDialog/kotlinApp/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 68c473a..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/mipmap-mdpi/ic_launcher.png b/security/FingerprintDialog/kotlinApp/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index fd7e5f6..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/security/FingerprintDialog/kotlinApp/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 106c0d3..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/security/FingerprintDialog/kotlinApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index b319beb..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/security/FingerprintDialog/kotlinApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 4dc0ddf..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/values/colors.xml b/security/FingerprintDialog/kotlinApp/app/src/main/res/values/colors.xml
deleted file mode 100644
index 403534e..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<resources>
-    <color name="warning_color">#f4511e</color>
-    <color name="hint_color">#42000000</color>
-    <color name="success_color">#009688</color>
-    <color name="fingerprint_success">#009688</color>
-    <color name="finerprint_error">#F4511E</color>
-    <color name="fingerprint_fill">#FFFFFF</color>
-    <color name="card_solid">#fefefe</color>
-</resources>
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/values/dimens.xml b/security/FingerprintDialog/kotlinApp/app/src/main/res/values/dimens.xml
deleted file mode 100644
index e2d290b..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/values/dimens.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<resources>
-    <dimen name="fingerprint_square_dimen">40dp</dimen>
-    <dimen name="fingerprint_square_dimen_viewport" type="float">40.0</dimen>
-    <dimen name="card_corner">2dp</dimen>
-    <dimen name="default_elevation">4dp</dimen>
-    <dimen name="logo_square_dimen">150dp</dimen>
-    <dimen name="logo_square_margin">32dp</dimen>
-    <dimen name="default_padding">16dp</dimen>
-    <dimen name="default_margin">16dp</dimen>
-    <dimen name="default_margin_end">4dp</dimen>
-    <dimen name="default_margin_small">8dp</dimen>
-    <dimen name="fingerprint_padding_horizontal">12dp</dimen>
-    <dimen name="fingerprint_padding_vertical">4dp</dimen>
-    <dimen name="fingerprint_margin">24dp</dimen>
-    <dimen name="default_padding_small">8dp</dimen>
-    <dimen name="fingerprint_margin_horizontal">20dp</dimen>
-    <dimen name="fingerprint_margin_vertical">16dp</dimen>
-    <dimen name="default_padding_large">24dp</dimen>
-</resources>
\ No newline at end of file
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/values/strings.xml b/security/FingerprintDialog/kotlinApp/app/src/main/res/values/strings.xml
deleted file mode 100644
index 09f0376..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<resources>
-    <!--
-      The similar strings app_name is added in the Application/template directory, but depending
-      on the template directory makes it hard for the sample buildable with Android.mk.
-      Thus defining the application_name with different name from the template.
-    -->
-    <string name="application_name">FingerprintDialog</string>
-    <string name="action_settings">Settings</string>
-    <string name="cancel">Cancel</string>
-    <string name="use_password">Use password</string>
-    <string name="sign_in">Sign in</string>
-    <string name="ok">OK</string>
-    <string name="password">Password</string>
-    <string name="fingerprint_description">Confirm fingerprint to continue</string>
-    <string name="fingerprint_hint">Touch sensor</string>
-    <string name="password_description">Enter your store password to continue</string>
-    <string name="purchase">Purchase</string>
-    <string name="purchase_not_invalidated">Purchase not invalidated</string>
-    <string name="purchase_button_not_invalidated_description">
-        You can proceed to purchase with this button \n even if a new fingerprint is enrolled
-    </string>
-    <string name="fingerprint_not_recognized">Fingerprint not recognized. Try again</string>
-    <string name="fingerprint_success">Fingerprint recognized</string>
-    <string name="item_title">White Mesh Pluto Backpack</string>
-    <string name="item_price">$62.68</string>
-    <string name="item_description">Mesh backpack in white. Black textile trim throughout.</string>
-    <string name="purchase_done">Purchase successful</string>
-    <string name="new_fingerprint_enrolled_description">
-        A new fingerprint was added to this device, so your password is required.
-    </string>
-    <string name="use_fingerprint_in_future">Use fingerprint in the future</string>
-    <string name="use_fingerprint_to_authenticate_title">Use fingerprint to authenticate</string>
-    <string name="use_fingerprint_to_authenticate_key" >use_fingerprint_to_authenticate_key</string>
-    <string name="description_bugdroid_icon">Android bugdroid image</string>
-    <string name="description_fingerprint_icon">Fingerprint icon</string>
-    <string name="register_fingerprint">
-        Go to \'Settings -> Security -> Fingerprint\' and register at least one fingerprint
-    </string>
-    <string name="setup_lock_screen">
-        Secure lock screen hasn\'t set been up.\n
-        Go to \'Settings -> Security -> Fingerprint\' to set up a fingerprint
-    </string>
-</resources>
diff --git a/security/FingerprintDialog/kotlinApp/app/src/main/res/xml/preferences.xml b/security/FingerprintDialog/kotlinApp/app/src/main/res/xml/preferences.xml
deleted file mode 100644
index c9fd74b..0000000
--- a/security/FingerprintDialog/kotlinApp/app/src/main/res/xml/preferences.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-    <CheckBoxPreference
-        android:key="@string/use_fingerprint_to_authenticate_key"
-        android:title="@string/use_fingerprint_to_authenticate_title"
-        android:persistent="true"
-        android:defaultValue="true" />
-</PreferenceScreen>
\ No newline at end of file
diff --git a/security/FingerprintDialog/kotlinApp/build.gradle b/security/FingerprintDialog/kotlinApp/build.gradle
deleted file mode 100644
index 6919788..0000000
--- a/security/FingerprintDialog/kotlinApp/build.gradle
+++ /dev/null
@@ -1,22 +0,0 @@
-buildscript {
-  ext.kotlin_version = '1.3.11'
-  repositories {
-    google()
-    jcenter()
-  }
-  dependencies {
-    classpath 'com.android.tools.build:gradle:3.3.0'
-    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
-  }
-}
-
-allprojects {
-  repositories {
-    google()
-    jcenter()
-  }
-}
-
-task clean(type: Delete) {
-  delete rootProject.buildDir
-}
diff --git a/security/FingerprintDialog/kotlinApp/gradle.properties b/security/FingerprintDialog/kotlinApp/gradle.properties
deleted file mode 100644
index 89196d1..0000000
--- a/security/FingerprintDialog/kotlinApp/gradle.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# Project-wide Gradle settings.
-
-# IDE (e.g. Android Studio) users:
-# Gradle settings configured through the IDE *will override*
-# any settings specified in this file.
-
-# For more details on how to configure your build environment visit
-# http://www.gradle.org/docs/current/userguide/build_environment.html
-
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx1536m
-
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
-
diff --git a/security/FingerprintDialog/kotlinApp/gradle/wrapper/gradle-wrapper.jar b/security/FingerprintDialog/kotlinApp/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 8c0fb64..0000000
--- a/security/FingerprintDialog/kotlinApp/gradle/wrapper/gradle-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/gradle/wrapper/gradle-wrapper.properties b/security/FingerprintDialog/kotlinApp/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index f941550..0000000
--- a/security/FingerprintDialog/kotlinApp/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-distributionUrl=https://services.gradle.org/distributions/gradle-4.10.3-all.zip
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
diff --git a/security/FingerprintDialog/kotlinApp/gradlew b/security/FingerprintDialog/kotlinApp/gradlew
deleted file mode 100755
index 91a7e26..0000000
--- a/security/FingerprintDialog/kotlinApp/gradlew
+++ /dev/null
@@ -1,164 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-##  Gradle start up script for UN*X
-##
-##############################################################################
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
-    echo "$*"
-}
-
-die ( ) {
-    echo
-    echo "$*"
-    echo
-    exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-case "`uname`" in
-  CYGWIN* )
-    cygwin=true
-    ;;
-  Darwin* )
-    darwin=true
-    ;;
-  MINGW* )
-    msys=true
-    ;;
-esac
-
-# For Cygwin, ensure paths are in UNIX format before anything is touched.
-if $cygwin ; then
-    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
-fi
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >&-
-APP_HOME="`pwd -P`"
-cd "$SAVED" >&-
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-        # IBM's JDK on AIX uses strange locations for the executables
-        JAVACMD="$JAVA_HOME/jre/sh/java"
-    else
-        JAVACMD="$JAVA_HOME/bin/java"
-    fi
-    if [ ! -x "$JAVACMD" ] ; then
-        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-    fi
-else
-    JAVACMD="java"
-    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
-    MAX_FD_LIMIT=`ulimit -H -n`
-    if [ $? -eq 0 ] ; then
-        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
-            MAX_FD="$MAX_FD_LIMIT"
-        fi
-        ulimit -n $MAX_FD
-        if [ $? -ne 0 ] ; then
-            warn "Could not set maximum file descriptor limit: $MAX_FD"
-        fi
-    else
-        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
-    fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
-    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
-    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
-    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-
-    # We build the pattern for arguments to be converted via cygpath
-    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
-    SEP=""
-    for dir in $ROOTDIRSRAW ; do
-        ROOTDIRS="$ROOTDIRS$SEP$dir"
-        SEP="|"
-    done
-    OURCYGPATTERN="(^($ROOTDIRS))"
-    # Add a user-defined pattern to the cygpath arguments
-    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
-        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
-    fi
-    # Now convert the arguments - kludge to limit ourselves to /bin/sh
-    i=0
-    for arg in "$@" ; do
-        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
-        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
-
-        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
-            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
-        else
-            eval `echo args$i`="\"$arg\""
-        fi
-        i=$((i+1))
-    done
-    case $i in
-        (0) set -- ;;
-        (1) set -- "$args0" ;;
-        (2) set -- "$args0" "$args1" ;;
-        (3) set -- "$args0" "$args1" "$args2" ;;
-        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
-        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
-        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
-        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
-        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
-        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
-    esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
-    JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/security/FingerprintDialog/kotlinApp/gradlew.bat b/security/FingerprintDialog/kotlinApp/gradlew.bat
deleted file mode 100644
index 8a0b282..0000000
--- a/security/FingerprintDialog/kotlinApp/gradlew.bat
+++ /dev/null
@@ -1,90 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem  Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/security/FingerprintDialog/kotlinApp/packaging.yaml b/security/FingerprintDialog/kotlinApp/packaging.yaml
deleted file mode 100644
index 1846486..0000000
--- a/security/FingerprintDialog/kotlinApp/packaging.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-# GOOGLE SAMPLE PACKAGING DATA
-#
-# This file is used by Google as part of our samples packaging process.
-# End users may safely ignore this file. It has no relevance to other systems.
----
-status:       PUBLISHED
-technologies: [Android]
-categories:   [security]
-languages:    [Kotlin]
-solutions:    [Mobile]
-github:       android-FingerprintDialog
-level:        INTERMEDIATE
-icon:         screenshots/big-icon.png
-apiRefs:
-    - android:android.hardware.fingerprint.FingerprintManager
-    - android:android.hardware.fingerprint.FingerprintManager.AuthenticationCallback
-    - android:android.hardware.fingerprint.FingerprintManager.CryptoObject
-    - android:android.security.KeyGenParameterSpec
-    - android:java.security.KeyStore
-    - android:javax.crypto.Cipher
-    - android:javax.crypto.KeyGenerator
-license: apache2
diff --git a/security/FingerprintDialog/kotlinApp/screenshots/1-purchase-screen.png b/security/FingerprintDialog/kotlinApp/screenshots/1-purchase-screen.png
deleted file mode 100644
index 0bf03bd..0000000
--- a/security/FingerprintDialog/kotlinApp/screenshots/1-purchase-screen.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/screenshots/2-fingerprint-dialog.png b/security/FingerprintDialog/kotlinApp/screenshots/2-fingerprint-dialog.png
deleted file mode 100644
index 5e681f9..0000000
--- a/security/FingerprintDialog/kotlinApp/screenshots/2-fingerprint-dialog.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/screenshots/3-fingerprint-authenticated.png b/security/FingerprintDialog/kotlinApp/screenshots/3-fingerprint-authenticated.png
deleted file mode 100644
index d485b1d..0000000
--- a/security/FingerprintDialog/kotlinApp/screenshots/3-fingerprint-authenticated.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/screenshots/4-new-fingerprint-enrolled.png b/security/FingerprintDialog/kotlinApp/screenshots/4-new-fingerprint-enrolled.png
deleted file mode 100644
index 7dcf080..0000000
--- a/security/FingerprintDialog/kotlinApp/screenshots/4-new-fingerprint-enrolled.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/screenshots/big-icon.png b/security/FingerprintDialog/kotlinApp/screenshots/big-icon.png
deleted file mode 100644
index 9e32334..0000000
--- a/security/FingerprintDialog/kotlinApp/screenshots/big-icon.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/kotlinApp/settings.gradle b/security/FingerprintDialog/kotlinApp/settings.gradle
deleted file mode 100644
index 4c90568..0000000
--- a/security/FingerprintDialog/kotlinApp/settings.gradle
+++ /dev/null
@@ -1 +0,0 @@
-include 'app'
diff --git a/security/FingerprintDialog/screenshots/1-purchase-screen.png b/security/FingerprintDialog/screenshots/1-purchase-screen.png
deleted file mode 100644
index 0bf03bd..0000000
--- a/security/FingerprintDialog/screenshots/1-purchase-screen.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/screenshots/2-fingerprint-dialog.png b/security/FingerprintDialog/screenshots/2-fingerprint-dialog.png
deleted file mode 100644
index 5e681f9..0000000
--- a/security/FingerprintDialog/screenshots/2-fingerprint-dialog.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/screenshots/3-fingerprint-authenticated.png b/security/FingerprintDialog/screenshots/3-fingerprint-authenticated.png
deleted file mode 100644
index d485b1d..0000000
--- a/security/FingerprintDialog/screenshots/3-fingerprint-authenticated.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/screenshots/4-new-fingerprint-enrolled.png b/security/FingerprintDialog/screenshots/4-new-fingerprint-enrolled.png
deleted file mode 100644
index 7dcf080..0000000
--- a/security/FingerprintDialog/screenshots/4-new-fingerprint-enrolled.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/screenshots/big-icon.png b/security/FingerprintDialog/screenshots/big-icon.png
deleted file mode 100644
index 9e32334..0000000
--- a/security/FingerprintDialog/screenshots/big-icon.png
+++ /dev/null
Binary files differ
diff --git a/security/FingerprintDialog/settings.gradle b/security/FingerprintDialog/settings.gradle
deleted file mode 100644
index 9464a35..0000000
--- a/security/FingerprintDialog/settings.gradle
+++ /dev/null
@@ -1 +0,0 @@
-include 'Application'
diff --git a/security/FingerprintDialog/template-params.xml b/security/FingerprintDialog/template-params.xml
deleted file mode 100644
index 72e487e..0000000
--- a/security/FingerprintDialog/template-params.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright 2015 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<!-- TODO(thagikura) Add tests for Activity and Fragment once InstrumentationTests can be run
-     on an emulator or a device.
-     At this moment, due to the different API between the image and the SDK, they can't be launched.
-     E.g. Skipping device 'Nexus 5 - MNC', due to different API preview 'MNC' and 'android-MNC'
-     -->
-<sample>
-    <name>FingerprintDialog</name>
-    <group>Security</group>
-    <package>com.example.android.fingerprintdialog</package>
-
-    <minSdk>23</minSdk>
-
-    <strings>
-        <intro>
-            <![CDATA[
-This sample demonstrates how you can use registered fingerprints to authenticate the user
-before proceeding some actions such as purchasing an item.
-            ]]>
-        </intro>
-    </strings>
-
-    <template src="base" />
-
-    <metadata>
-        <!-- Values: {DRAFT | PUBLISHED | INTERNAL | DEPRECATED | SUPERCEDED} -->
-        <status>PUBLISHED</status>
-        <categories>security</categories>
-        <technologies>Android</technologies>
-        <languages>Java</languages>
-        <solutions>Mobile</solutions>
-        <level>INTERMEDIATE</level>
-        <icon>screenshots/big-icon.png</icon>
-        <screenshots>
-            <img>screenshots/1-purchase-screen.png</img>
-            <img>screenshots/2-fingerprint-dialog.png</img>
-            <img>screenshots/3-fingerprint-authenticated.png</img>
-            <img>screenshots/4-new-fingerprint-enrolled.png</img>
-        </screenshots>
-
-        <api_refs>
-            <android>android.hardware.fingerprint.FingerprintManager</android>
-            <android>android.hardware.fingerprint.FingerprintManager.AuthenticationCallback</android>
-            <android>android.hardware.fingerprint.FingerprintManager.CryptoObject</android>
-            <android>android.security.KeyGenParameterSpec</android>
-            <android>java.security.KeyStore</android>
-            <android>javax.crypto.Cipher</android>
-            <android>javax.crypto.KeyGenerator</android>
-        </api_refs>
-
-        <description>
-<![CDATA[
-A sample that demonstrates to use registered fingerprints to authenticate the user in your app
-]]>
-        </description>
-
-        <intro>
-<![CDATA[
-This sample demonstrates how you can use registered fingerprints in your app to authenticate the user
-before proceeding some actions such as purchasing an item.
-
-First you need to create a symmetric key in the Android Key Store using [KeyGenerator][1]
-which can be only be used after the user has authenticated with fingerprint and pass
-a [KeyGenParameterSpec][2].
-
-By setting [KeyGenParameterSpec.Builder.setUserAuthenticationRequired][3] to true, you can permit the
-use of the key only after the user authenticate it including when authenticated with the user's
-fingerprint.
-
-Then start listening to a fingerprint on the fingerprint sensor by calling
-[FingerprintManager.authenticate][4] with a [Cipher][5] initialized with the symmetric key created.
-Or alternatively you can fall back to server-side verified password as an authenticator.
-
-Once the fingerprint (or password) is verified, the
-[FingerprintManager.AuthenticationCallback#onAuthenticationSucceeded()][6] callback is called.
-
-[1]: https://developer.android.com/reference/javax/crypto/KeyGenerator.html
-[2]: https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.html
-[3]: https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.Builder.html#setUserAuthenticationRequired%28boolean%29
-[4]: https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager.html#authenticate%28android.hardware.fingerprint.FingerprintManager.CryptoObject,%20android.os.CancellationSignal,%20int,%20android.hardware.fingerprint.FingerprintManager.AuthenticationCallback,%20android.os.Handler%29
-[5]: https://developer.android.com/reference/javax/crypto/Cipher.html
-[6]: https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager.AuthenticationCallback.html#onAuthenticationSucceeded%28android.hardware.fingerprint.FingerprintManager.AuthenticationResult%29
-]]>
-        </intro>
-    </metadata>
-</sample>
diff --git a/ui/activitytasks/DocumentCentricApps/Application/tests/src/com/example/android/documentcentricapps/tests/DocumentCentricAppsInstrumentationTest.java b/ui/activitytasks/DocumentCentricApps/Application/tests/src/com/example/android/documentcentricapps/tests/DocumentCentricAppsInstrumentationTest.java
index 3701f22..61b25ed 100644
--- a/ui/activitytasks/DocumentCentricApps/Application/tests/src/com/example/android/documentcentricapps/tests/DocumentCentricAppsInstrumentationTest.java
+++ b/ui/activitytasks/DocumentCentricApps/Application/tests/src/com/example/android/documentcentricapps/tests/DocumentCentricAppsInstrumentationTest.java
@@ -16,16 +16,17 @@
 
 package com.example.android.documentcentricapps.tests;
 
-import com.example.android.documentcentricapps.DocumentCentricActivity;
-import com.example.android.documentcentricapps.R;
-
 import android.app.ActivityManager;
 import android.content.Context;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.TouchUtils;
-import android.test.suitebuilder.annotation.LargeTest;
 import android.widget.Button;
 
+import androidx.test.filters.LargeTest;
+
+import com.example.android.documentcentricapps.DocumentCentricActivity;
+import com.example.android.documentcentricapps.R;
+
 import java.util.List;
 
 /**
diff --git a/ui/activitytasks/DocumentCentricApps/Application/tests/src/com/example/android/documentcentricapps/tests/DocumentCentricAppsUnitTest.java b/ui/activitytasks/DocumentCentricApps/Application/tests/src/com/example/android/documentcentricapps/tests/DocumentCentricAppsUnitTest.java
index b3da974..a3b803f 100644
--- a/ui/activitytasks/DocumentCentricApps/Application/tests/src/com/example/android/documentcentricapps/tests/DocumentCentricAppsUnitTest.java
+++ b/ui/activitytasks/DocumentCentricApps/Application/tests/src/com/example/android/documentcentricapps/tests/DocumentCentricAppsUnitTest.java
@@ -16,15 +16,16 @@
 
 package com.example.android.documentcentricapps.tests;
 
-import com.example.android.documentcentricapps.DocumentCentricActivity;
-import com.example.android.documentcentricapps.R;
-
 import android.content.Intent;
 import android.test.ActivityUnitTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
 import android.widget.Button;
 import android.widget.CheckBox;
 
+import androidx.test.filters.MediumTest;
+
+import com.example.android.documentcentricapps.DocumentCentricActivity;
+import com.example.android.documentcentricapps.R;
+
 /**
  * Unit tests for DocumentCentricApps sample.
  */
diff --git a/ui/window/MultiWindowPlayground/Application/src/androidTest/java/LaunchTests.java b/ui/window/MultiWindowPlayground/Application/src/androidTest/java/LaunchTests.java
index e0567ef..0523859 100644
--- a/ui/window/MultiWindowPlayground/Application/src/androidTest/java/LaunchTests.java
+++ b/ui/window/MultiWindowPlayground/Application/src/androidTest/java/LaunchTests.java
@@ -14,17 +14,6 @@
  * limitations under the License.
  */
 
-import com.android.multiwindowplayground.MainActivity;
-import com.android.multiwindowplayground.R;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.LargeTest;
-
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.action.ViewActions.click;
 import static android.support.test.espresso.action.ViewActions.scrollTo;
@@ -32,6 +21,18 @@
 import static android.support.test.espresso.matcher.ViewMatchers.withId;
 import static android.support.test.espresso.matcher.ViewMatchers.withText;
 
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+
+import com.android.multiwindowplayground.MainActivity;
+import com.android.multiwindowplayground.R;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @LargeTest
 @RunWith(AndroidJUnit4.class)
 public class LaunchTests {
