diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b6cc365 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 OrangeGangsters + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..82946b1 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,43 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 26 + buildToolsVersion '26.0.2' + + defaultConfig { + applicationId "com.github.orangegangsters.lollipin" + minSdkVersion 14 + targetSdkVersion 24 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + + compile project(':lib') + compile 'com.android.support:appcompat-v7:26.0.2' + + //Lollipop dialogs https://github.com/lewisjdeane/L-Dialogs and buttons, animations etc... + compile 'uk.me.lewisdeane.ldialogs:ldialogs:1.2.0@aar' + + //test + androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.5.2' +} + +// REQUIRED: Google's new Maven repo is required for the latest +// support library that is compatible with Android 8.0 +repositories { + maven { + url 'https://maven.google.com' + // Alternative URL is 'https://dl.google.com/dl/android/maven2/' + } +} + diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..baf289b --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/stoyan/android_sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# 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/app/src/androidTest/java/lollipin/orangegangsters/github/com/lollipin/functional/AbstractTest.java b/app/src/androidTest/java/lollipin/orangegangsters/github/com/lollipin/functional/AbstractTest.java new file mode 100644 index 0000000..0056a6e --- /dev/null +++ b/app/src/androidTest/java/lollipin/orangegangsters/github/com/lollipin/functional/AbstractTest.java @@ -0,0 +1,69 @@ +package lollipin.orangegangsters.github.com.lollipin.functional; + +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import android.test.ActivityInstrumentationTestCase2; +import android.view.View; + +import com.github.omadahealth.lollipin.MainActivity; +import com.github.omadahealth.lollipin.lib.managers.LockManager; +import com.robotium.solo.Solo; + +/** + * Created by stoyan and oliviergoutay on 1/13/15. + */ +public class AbstractTest extends ActivityInstrumentationTestCase2 { + + protected static final String PASSWORD_PREFERENCE_KEY = "PASSCODE"; + protected static final String PASSWORD_ALGORITHM_PREFERENCE_KEY = "ALGORITHM"; + private static final String LAST_ACTIVE_MILLIS_PREFERENCE_KEY = "LAST_ACTIVE_MILLIS"; + protected static final String ONLY_BACKGROUND_TIMEOUT_PREFERENCE_KEY = "ONLY_BACKGROUND_TIMEOUT_PREFERENCE_KEY"; + + protected Solo solo; + + public AbstractTest() { + super(MainActivity.class); + } + + public void setUp() throws Exception { + solo = new Solo(getInstrumentation(), getActivity()); + } + + + @Override + public void tearDown() throws Exception { + removeAllPrefs(); + solo.finishOpenedActivities(); + } + + /** + * Click on the specified view id + * + * @param id + */ + protected void clickOnView(int id) { + solo.sleep(300); + solo.clickOnView(getView(id)); + } + + /** + * Get the view for the specified id + * + * @param id + * @return + */ + protected View getView(int id) { + return solo.getView(id); + } + + protected void removeAllPrefs() { + LockManager.getInstance().getAppLock().disableAndRemoveConfiguration(); + } + + protected void setMillis(long millis) { + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); + SharedPreferences.Editor editor = sharedPref.edit(); + editor.putLong(LAST_ACTIVE_MILLIS_PREFERENCE_KEY, millis); + editor.apply(); + } +} diff --git a/app/src/androidTest/java/lollipin/orangegangsters/github/com/lollipin/functional/PinLockTest.java b/app/src/androidTest/java/lollipin/orangegangsters/github/com/lollipin/functional/PinLockTest.java new file mode 100644 index 0000000..f2b5ff4 --- /dev/null +++ b/app/src/androidTest/java/lollipin/orangegangsters/github/com/lollipin/functional/PinLockTest.java @@ -0,0 +1,339 @@ +package lollipin.orangegangsters.github.com.lollipin.functional; + +import android.content.Context; +import android.content.SharedPreferences; +import android.hardware.fingerprint.FingerprintManager; +import android.os.Build; +import android.preference.PreferenceManager; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.github.omadahealth.lollipin.CustomPinActivity; +import com.github.omadahealth.lollipin.MainActivity; +import com.github.omadahealth.lollipin.NotLockedActivity; +import com.github.omadahealth.lollipin.lib.encryption.Encryptor; +import com.github.omadahealth.lollipin.lib.enums.Algorithm; +import com.github.omadahealth.lollipin.lib.managers.AppLockImpl; +import com.github.omadahealth.lollipin.lib.managers.FingerprintUiHelper; +import com.github.omadahealth.lollipin.lib.managers.LockManager; +import com.github.omadahealth.lollipin.lib.views.PinCodeRoundView; + +import lollipin.orangegangsters.github.com.lollipin.R; + +/** + * @author stoyan and oliviergoutay + * @version 1/13/15 + */ +public class PinLockTest extends AbstractTest { + + public void testMigratingFromSha1toSha256() { + //Init + removeAllPrefs(); + AppLockImpl appLockImpl = (AppLockImpl) LockManager.getInstance().getAppLock(); + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); + + //Should use sha256 if the SharedPreferences is set, by default + enablePin(); + assertEquals(Algorithm.SHA256, Algorithm.getFromText(sharedPref.getString(PASSWORD_ALGORITHM_PREFERENCE_KEY, ""))); + assertTrue(appLockImpl.checkPasscode("1234")); + removeAllPrefs(); + + //Should still use sha1 if password is stored but not the algorithm + SharedPreferences.Editor editor = sharedPref.edit(); + editor.putString(PASSWORD_PREFERENCE_KEY, Encryptor.getSHA(appLockImpl.getSalt() + "test" + appLockImpl.getSalt(), Algorithm.SHA1)); + editor.apply(); + assertEquals(Algorithm.SHA1, Algorithm.getFromText(sharedPref.getString(PASSWORD_ALGORITHM_PREFERENCE_KEY, ""))); + assertTrue(appLockImpl.checkPasscode("test")); + removeAllPrefs(); + } + + public void testPinClearButton() { + removePrefsAndGoToEnable(); + + //Enter 3 codes + clickOnView(R.id.pin_code_button_1); + clickOnView(R.id.pin_code_button_2); + clickOnView(R.id.pin_code_button_3); + + //Check length 3 + solo.sleep(1000); + PinCodeRoundView pinCodeRoundView = (PinCodeRoundView) solo.getCurrentActivity().findViewById(com.github.omadahealth.lollipin.lib.R.id.pin_code_round_view); + assertEquals(3, pinCodeRoundView.getCurrentLength()); + + //Click clear button + clickOnView(R.id.pin_code_button_clear); + + //Check length 0 + solo.sleep(1000); + assertEquals(2, pinCodeRoundView.getCurrentLength()); + } + + public void testPinEnabling() { + removePrefsAndGoToEnable(); + + //Test no fingerprint + assertEquals(View.GONE, solo.getView(R.id.pin_code_fingerprint_imageview).getVisibility()); + assertEquals(View.GONE, solo.getView(R.id.pin_code_fingerprint_textview).getVisibility()); + + //--------Not the same pin-------- + //Enter 4 codes + clickOnView(R.id.pin_code_button_1); + clickOnView(R.id.pin_code_button_2); + clickOnView(R.id.pin_code_button_3); + clickOnView(R.id.pin_code_button_4); + solo.sleep(1000); + clickOnView(R.id.pin_code_button_2); + clickOnView(R.id.pin_code_button_3); + clickOnView(R.id.pin_code_button_4); + clickOnView(R.id.pin_code_button_5); + solo.waitForActivity(CustomPinActivity.class); + solo.assertCurrentActivity("CustomPinActivity", CustomPinActivity.class); + solo.sleep(1000); + + //--------Same pin-------- + enablePin(); + } + + public void testPinEnablingChecking() throws SecurityException { + enablePin(); + + //Go to unlock + clickOnView(R.id.button_unlock_pin); + solo.waitForActivity(CustomPinActivity.class); + solo.assertCurrentActivity("CustomPinActivity", CustomPinActivity.class); + + //Test fingerprint if available + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + ImageView fingerprintImageView = (ImageView) solo.getView(com.github.omadahealth.lollipin.lib.R.id.pin_code_fingerprint_imageview); + TextView fingerprintTextView = (TextView) solo.getView(com.github.omadahealth.lollipin.lib.R.id.pin_code_fingerprint_textview); + FingerprintManager fingerprintManager = (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE); + FingerprintUiHelper fingerprintUiHelper = new FingerprintUiHelper.FingerprintUiHelperBuilder(fingerprintManager).build(fingerprintImageView, fingerprintTextView, (CustomPinActivity) solo.getCurrentActivity()); + if (fingerprintManager.isHardwareDetected() && fingerprintUiHelper.isFingerprintAuthAvailable()) { + assertEquals(View.VISIBLE, solo.getView(R.id.pin_code_fingerprint_imageview).getVisibility()); + assertEquals(View.VISIBLE, solo.getView(R.id.pin_code_fingerprint_textview).getVisibility()); + } else { + assertEquals(View.GONE, solo.getView(R.id.pin_code_fingerprint_imageview).getVisibility()); + assertEquals(View.GONE, solo.getView(R.id.pin_code_fingerprint_textview).getVisibility()); + } + } else { + assertEquals(View.GONE, solo.getView(R.id.pin_code_fingerprint_imageview).getVisibility()); + assertEquals(View.GONE, solo.getView(R.id.pin_code_fingerprint_textview).getVisibility()); + } + + //Enter the code + clickOnView(R.id.pin_code_button_1); + clickOnView(R.id.pin_code_button_2); + clickOnView(R.id.pin_code_button_3); + clickOnView(R.id.pin_code_button_4); + + //Check view + solo.waitForActivity(MainActivity.class); + solo.assertCurrentActivity("MainActivity", MainActivity.class); + } + + public void testPinEnablingChanging() { + enablePin(); + + //Go to change + clickOnView(R.id.button_change_pin); + solo.waitForActivity(CustomPinActivity.class); + solo.assertCurrentActivity("CustomPinActivity", CustomPinActivity.class); + + //Enter previous code + clickOnView(R.id.pin_code_button_1); + clickOnView(R.id.pin_code_button_2); + clickOnView(R.id.pin_code_button_3); + clickOnView(R.id.pin_code_button_4); + solo.sleep(1000); + + //Enter the new one + clickOnView(R.id.pin_code_button_2); + clickOnView(R.id.pin_code_button_3); + clickOnView(R.id.pin_code_button_4); + clickOnView(R.id.pin_code_button_5); + solo.sleep(1000); + clickOnView(R.id.pin_code_button_2); + clickOnView(R.id.pin_code_button_3); + clickOnView(R.id.pin_code_button_4); + clickOnView(R.id.pin_code_button_5); + solo.waitForActivity(MainActivity.class); + solo.assertCurrentActivity("MainActivity", MainActivity.class); + + //Go to unlock + clickOnView(R.id.button_unlock_pin); + solo.waitForActivity(CustomPinActivity.class); + solo.assertCurrentActivity("CustomPinActivity", CustomPinActivity.class); + + //Enter the code + clickOnView(R.id.pin_code_button_2); + clickOnView(R.id.pin_code_button_3); + clickOnView(R.id.pin_code_button_4); + clickOnView(R.id.pin_code_button_5); + + //Check view + solo.waitForActivity(MainActivity.class); + solo.assertCurrentActivity("MainActivity", MainActivity.class); + } + + public void testPinLockAfterDefaultTimeout() { + enablePin(); + + //Go to NotLockedActivity + solo.sleep(1000); + clickOnView(R.id.button_not_locked); + solo.waitForActivity(NotLockedActivity.class); + solo.assertCurrentActivity("NotLockedActivity", NotLockedActivity.class); + + //Set the last time to now - 11sec + setMillis(System.currentTimeMillis() - (1000 * 15)); + solo.getCurrentActivity().finish(); + + //Check view + solo.waitForActivity(CustomPinActivity.class); + solo.assertCurrentActivity("CustomPinActivity", CustomPinActivity.class); + solo.sleep(1000); + } + + public void testPinLockAfterCustomTimeout() { + enablePin(); + + //Set to 3minutes + LockManager.getInstance().getAppLock().setTimeout(1000 * 60 * 3); + + //Go to NotLockedActivity + clickOnView(R.id.button_not_locked); + solo.waitForActivity(NotLockedActivity.class); + solo.assertCurrentActivity("NotLockedActivity", NotLockedActivity.class); + + //Set the last time to now - 11sec + setMillis(System.currentTimeMillis() - (1000 * 11)); + solo.getCurrentActivity().finish(); + + //Check view + solo.waitForActivity(MainActivity.class); + solo.assertCurrentActivity("MainActivity", MainActivity.class); + solo.sleep(1000); + + //Go to NotLockedActivity + clickOnView(R.id.button_not_locked); + solo.waitForActivity(NotLockedActivity.class); + solo.assertCurrentActivity("NotLockedActivity", NotLockedActivity.class); + + //Set the last time to now - 6minutes + setMillis(System.currentTimeMillis() - (1000 * 60 * 6)); + solo.getCurrentActivity().finish(); + + //Check view + solo.waitForActivity(CustomPinActivity.class); + solo.assertCurrentActivity("CustomPinActivity", CustomPinActivity.class); + solo.sleep(1000); + } + + public void testPinLockWithBackgroundTimeout() { + enablePin(); + + // Set the option to use timeout in background only + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); + SharedPreferences.Editor editor = sharedPref.edit(); + editor.putBoolean(ONLY_BACKGROUND_TIMEOUT_PREFERENCE_KEY, true); + editor.apply(); + + //Go to NotLockedActivity + solo.sleep(1000); + clickOnView(R.id.button_not_locked); + solo.waitForActivity(NotLockedActivity.class); + solo.assertCurrentActivity("NotLockedActivity", NotLockedActivity.class); + + //Set the last time to now - 15sec + setMillis(System.currentTimeMillis() - (1000 * 15)); + solo.getCurrentActivity().finish(); + + //Check view + solo.waitForActivity(MainActivity.class); + solo.assertCurrentActivity("MainActivity", MainActivity.class); + solo.sleep(1000); + } + + public void testBackButton() { + enablePin(); + + //Go to unlock + clickOnView(R.id.button_unlock_pin); + solo.waitForActivity(CustomPinActivity.class); + solo.assertCurrentActivity("CustomPinActivity", CustomPinActivity.class); + + solo.goBack(); + solo.assertCurrentActivity("CustomPinActivity", CustomPinActivity.class); + + //reset + clickOnView(R.id.pin_code_button_1); + clickOnView(R.id.pin_code_button_2); + clickOnView(R.id.pin_code_button_3); + clickOnView(R.id.pin_code_button_4); + solo.sleep(1000); + + //Go to change + clickOnView(R.id.button_change_pin); + solo.waitForActivity(CustomPinActivity.class); + solo.assertCurrentActivity("CustomPinActivity", CustomPinActivity.class); + + solo.goBack(); + solo.assertCurrentActivity("MainActivity", MainActivity.class); + } + + public void testDisablingFingerprintReader() { + enablePin(); + + // Disable fingerprint reader. + LockManager.getInstance().getAppLock().setFingerprintAuthEnabled(false); + + // Go to unlock. + clickOnView(R.id.button_unlock_pin); + solo.waitForActivity(CustomPinActivity.class); + solo.assertCurrentActivity("CustomPinActivity", CustomPinActivity.class); + + // Make sure the fingerprint views are gone. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + assertEquals(View.GONE, solo.getView(R.id.pin_code_fingerprint_imageview).getVisibility()); + assertEquals(View.GONE, solo.getView(R.id.pin_code_fingerprint_textview).getVisibility()); + } + + // Make sure pin unlocking still works. + clickOnView(R.id.pin_code_button_1); + clickOnView(R.id.pin_code_button_2); + clickOnView(R.id.pin_code_button_3); + clickOnView(R.id.pin_code_button_4); + solo.waitForActivity(MainActivity.class); + solo.assertCurrentActivity("MainActivity", MainActivity.class); + } + + private void enablePin() { + removePrefsAndGoToEnable(); + + clickOnView(R.id.pin_code_button_1); + clickOnView(R.id.pin_code_button_2); + clickOnView(R.id.pin_code_button_3); + clickOnView(R.id.pin_code_button_4); + solo.sleep(1000); + clickOnView(R.id.pin_code_button_1); + clickOnView(R.id.pin_code_button_2); + clickOnView(R.id.pin_code_button_3); + clickOnView(R.id.pin_code_button_4); + solo.waitForActivity(MainActivity.class); + solo.assertCurrentActivity("MainActivity", MainActivity.class); + } + + private void removePrefsAndGoToEnable() { + //init + removeAllPrefs(); + + //Go to enable + if (solo.getCurrentActivity() instanceof MainActivity) { + clickOnView(R.id.button_enable_pin); + solo.waitForActivity(CustomPinActivity.class); + solo.assertCurrentActivity("CustomPinActivity", CustomPinActivity.class); + solo.waitForText("1"); + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..6d216ad --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/github/omadahealth/lollipin/CustomApplication.java b/app/src/main/java/com/github/omadahealth/lollipin/CustomApplication.java new file mode 100644 index 0000000..8aac76e --- /dev/null +++ b/app/src/main/java/com/github/omadahealth/lollipin/CustomApplication.java @@ -0,0 +1,23 @@ +package com.github.omadahealth.lollipin; + +import android.app.Application; + +import com.github.omadahealth.lollipin.lib.managers.LockManager; + +import lollipin.orangegangsters.github.com.lollipin.R; + +/** + * Created by oliviergoutay on 1/14/15. + */ +public class CustomApplication extends Application { + + @SuppressWarnings("unchecked") + @Override + public void onCreate() { + super.onCreate(); + + LockManager lockManager = LockManager.getInstance(); + lockManager.enableAppLock(this, CustomPinActivity.class); + lockManager.getAppLock().setLogoId(R.drawable.security_lock); + } +} diff --git a/app/src/main/java/com/github/omadahealth/lollipin/CustomPinActivity.java b/app/src/main/java/com/github/omadahealth/lollipin/CustomPinActivity.java new file mode 100644 index 0000000..cb33aa5 --- /dev/null +++ b/app/src/main/java/com/github/omadahealth/lollipin/CustomPinActivity.java @@ -0,0 +1,80 @@ +package com.github.omadahealth.lollipin; + +import android.content.res.Resources; +import android.graphics.Color; +import android.graphics.Typeface; +import android.graphics.drawable.ColorDrawable; +import android.widget.Toast; + +import com.github.omadahealth.lollipin.lib.managers.AppLockActivity; + +import lollipin.orangegangsters.github.com.lollipin.R; +import uk.me.lewisdeane.ldialogs.BaseDialog; +import uk.me.lewisdeane.ldialogs.CustomDialog; + +/** + * Created by oliviergoutay on 1/14/15. + */ +public class CustomPinActivity extends AppLockActivity { + + @Override + public void showForgotDialog() { + Resources res = getResources(); + // Create the builder with required paramaters - Context, Title, Positive Text + CustomDialog.Builder builder = new CustomDialog.Builder(this, + res.getString(R.string.activity_dialog_title), + res.getString(R.string.activity_dialog_accept)); + builder.content(res.getString(R.string.activity_dialog_content)); + builder.negativeText(res.getString(R.string.activity_dialog_decline)); + + //Set theme + builder.darkTheme(false); + builder.typeface(Typeface.SANS_SERIF); + builder.positiveColor(res.getColor(R.color.light_blue_500)); // int res, or int colorRes parameter versions available as well. + builder.negativeColor(res.getColor(R.color.light_blue_500)); + builder.rightToLeft(false); // Enables right to left positioning for languages that may require so. + builder.titleAlignment(BaseDialog.Alignment.CENTER); + builder.buttonAlignment(BaseDialog.Alignment.CENTER); + builder.setButtonStacking(false); + + //Set text sizes + builder.titleTextSize((int) res.getDimension(R.dimen.activity_dialog_title_size)); + builder.contentTextSize((int) res.getDimension(R.dimen.activity_dialog_content_size)); + builder.positiveButtonTextSize((int) res.getDimension(R.dimen.activity_dialog_positive_button_size)); + builder.negativeButtonTextSize((int) res.getDimension(R.dimen.activity_dialog_negative_button_size)); + + //Build the dialog. + CustomDialog customDialog = builder.build(); + customDialog.setCanceledOnTouchOutside(false); + customDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + customDialog.setClickListener(new CustomDialog.ClickListener() { + @Override + public void onConfirmClick() { + Toast.makeText(getApplicationContext(), "Yes", Toast.LENGTH_SHORT).show(); + } + + @Override + public void onCancelClick() { + Toast.makeText(getApplicationContext(), "Cancel", Toast.LENGTH_SHORT).show(); + } + }); + + // Show the dialog. + customDialog.show(); + } + + @Override + public void onPinFailure(int attempts) { + + } + + @Override + public void onPinSuccess(int attempts) { + + } + + @Override + public int getPinLength() { + return super.getPinLength();//you can override this method to change the pin length from the default 4 + } +} diff --git a/app/src/main/java/com/github/omadahealth/lollipin/LockedCompatActivity.java b/app/src/main/java/com/github/omadahealth/lollipin/LockedCompatActivity.java new file mode 100644 index 0000000..93141c2 --- /dev/null +++ b/app/src/main/java/com/github/omadahealth/lollipin/LockedCompatActivity.java @@ -0,0 +1,31 @@ +package com.github.omadahealth.lollipin; + +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import com.github.omadahealth.lollipin.lib.PinCompatActivity; +import lollipin.orangegangsters.github.com.lollipin.R; + +/** + * Created by callmepeanut on 16-1-14. + */ +public class LockedCompatActivity extends PinCompatActivity{ + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_compat_locked); + initView(); + } + + private void initView() { + Toolbar toolbar = (Toolbar) findViewById(R.id.id_toolbar); + setSupportActionBar(toolbar); + + toolbar.setTitle("Title"); + toolbar.setTitleTextColor(getResources().getColor(android.R.color.white)); + toolbar.setSubtitle("SubTitle"); + toolbar.setSubtitleTextColor(getResources().getColor(android.R.color.white)); + toolbar.setLogo(R.drawable.ic_launcher); + toolbar.setNavigationIcon(R.drawable.ic_menu_white_36dp); + } +} diff --git a/app/src/main/java/com/github/omadahealth/lollipin/MainActivity.java b/app/src/main/java/com/github/omadahealth/lollipin/MainActivity.java new file mode 100644 index 0000000..07651b7 --- /dev/null +++ b/app/src/main/java/com/github/omadahealth/lollipin/MainActivity.java @@ -0,0 +1,66 @@ +package com.github.omadahealth.lollipin; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Toast; + +import com.github.omadahealth.lollipin.lib.PinActivity; +import com.github.omadahealth.lollipin.lib.managers.AppLock; + +import lollipin.orangegangsters.github.com.lollipin.R; + + +public class MainActivity extends PinActivity implements View.OnClickListener { + + private static final int REQUEST_CODE_ENABLE = 11; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + this.findViewById(R.id.button_enable_pin).setOnClickListener(this); + this.findViewById(R.id.button_change_pin).setOnClickListener(this); + this.findViewById(R.id.button_unlock_pin).setOnClickListener(this); + this.findViewById(R.id.button_compat_locked).setOnClickListener(this); + this.findViewById(R.id.button_not_locked).setOnClickListener(this); + } + + @Override + public void onClick(View v) { + Intent intent = new Intent(MainActivity.this, CustomPinActivity.class); + switch (v.getId()) { + case R.id.button_enable_pin: + intent.putExtra(AppLock.EXTRA_TYPE, AppLock.ENABLE_PINLOCK); + startActivityForResult(intent, REQUEST_CODE_ENABLE); + break; + case R.id.button_change_pin: + intent.putExtra(AppLock.EXTRA_TYPE, AppLock.CHANGE_PIN); + startActivity(intent); + break; + case R.id.button_unlock_pin: + intent.putExtra(AppLock.EXTRA_TYPE, AppLock.UNLOCK_PIN); + startActivity(intent); + break; + case R.id.button_compat_locked: + Intent intent2 = new Intent(MainActivity.this, LockedCompatActivity.class); + startActivity(intent2); + break; + case R.id.button_not_locked: + Intent intent3 = new Intent(MainActivity.this, NotLockedActivity.class); + startActivity(intent3); + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + switch (requestCode){ + case REQUEST_CODE_ENABLE: + Toast.makeText(this, "PinCode enabled", Toast.LENGTH_SHORT).show(); + break; + } + } +} diff --git a/app/src/main/java/com/github/omadahealth/lollipin/NotLockedActivity.java b/app/src/main/java/com/github/omadahealth/lollipin/NotLockedActivity.java new file mode 100644 index 0000000..a67beb0 --- /dev/null +++ b/app/src/main/java/com/github/omadahealth/lollipin/NotLockedActivity.java @@ -0,0 +1,19 @@ +package com.github.omadahealth.lollipin; + +import android.app.Activity; +import android.os.Bundle; + +import lollipin.orangegangsters.github.com.lollipin.R; + +/** + * Created by oliviergoutay on 1/13/15. + */ +public class NotLockedActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_not_locked); + } + +} diff --git a/app/src/main/res/drawable-hdpi/ic_menu_white_36dp.png b/app/src/main/res/drawable-hdpi/ic_menu_white_36dp.png new file mode 100644 index 0000000..59aca7c Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_menu_white_36dp.png differ diff --git a/app/src/main/res/drawable-hdpi/icon.png b/app/src/main/res/drawable-hdpi/icon.png new file mode 100644 index 0000000..96a442e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_menu_white_36dp.png b/app/src/main/res/drawable-mdpi/ic_menu_white_36dp.png new file mode 100644 index 0000000..238cfd6 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_menu_white_36dp.png differ diff --git a/app/src/main/res/drawable-mdpi/icon.png b/app/src/main/res/drawable-mdpi/icon.png new file mode 100644 index 0000000..359047d Binary files /dev/null and b/app/src/main/res/drawable-mdpi/icon.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_menu_white_36dp.png b/app/src/main/res/drawable-xhdpi/ic_menu_white_36dp.png new file mode 100644 index 0000000..9cb0348 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_menu_white_36dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon.png b/app/src/main/res/drawable-xhdpi/icon.png new file mode 100644 index 0000000..71c6d76 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon.png differ diff --git a/app/src/main/res/drawable-xhdpi/security_lock.png b/app/src/main/res/drawable-xhdpi/security_lock.png new file mode 100644 index 0000000..7e971a9 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/security_lock.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_menu_white_36dp.png b/app/src/main/res/drawable-xxhdpi/ic_menu_white_36dp.png new file mode 100644 index 0000000..6d8c5ed Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_menu_white_36dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/icon.png b/app/src/main/res/drawable-xxhdpi/icon.png new file mode 100644 index 0000000..4df1894 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_menu_white_36dp.png b/app/src/main/res/drawable-xxxhdpi/ic_menu_white_36dp.png new file mode 100644 index 0000000..48ae218 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_menu_white_36dp.png differ diff --git a/app/src/main/res/layout/activity_compat_locked.xml b/app/src/main/res/layout/activity_compat_locked.xml new file mode 100644 index 0000000..ee14966 --- /dev/null +++ b/app/src/main/res/layout/activity_compat_locked.xml @@ -0,0 +1,20 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..6c91487 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,40 @@ + + +