├── .buildscript └── deploy_google_play.sh ├── .gitignore ├── .travis.yml ├── README.md ├── Safe ├── .classpath ├── .gitignore ├── .project ├── AUTHORS ├── CHANGELOG ├── NOTES ├── README ├── build.gradle ├── build.properties ├── build.xml ├── libs │ └── OISafeMyBackupPro.jar ├── proguard.cfg ├── project.properties ├── readme.txt ├── src │ ├── androidTest │ │ └── java │ │ │ └── org │ │ │ └── openintents │ │ │ └── safe │ │ │ └── test │ │ │ └── SafeTest.java │ └── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ └── help.html │ │ ├── java │ │ ├── estreamj │ │ │ ├── ciphers │ │ │ │ └── trivium │ │ │ │ │ └── Trivium.java │ │ │ └── framework │ │ │ │ ├── ESJException.java │ │ │ │ ├── Engine.java │ │ │ │ ├── ICipher.java │ │ │ │ ├── ICipherMaker.java │ │ │ │ └── Utils.java │ │ └── org │ │ │ └── openintents │ │ │ ├── intents │ │ │ ├── CryptoIntents.java │ │ │ └── FileManagerIntents.java │ │ │ ├── safe │ │ │ ├── AskPassword.java │ │ │ ├── Backup.java │ │ │ ├── CSVReader.java │ │ │ ├── CSVWriter.java │ │ │ ├── CategoryEdit.java │ │ │ ├── CategoryList.java │ │ │ ├── CategoryListItemAdapter.java │ │ │ ├── ChangePass.java │ │ │ ├── CryptoContentProvider.java │ │ │ ├── CryptoHelper.java │ │ │ ├── CryptoHelperException.java │ │ │ ├── DBHelper.java │ │ │ ├── Export.java │ │ │ ├── FrontDoor.java │ │ │ ├── Help.java │ │ │ ├── Import.java │ │ │ ├── InputStreamData.java │ │ │ ├── IntentHandlerActivity.java │ │ │ ├── Intents.java │ │ │ ├── LogOffActivity.java │ │ │ ├── OutputStreamData.java │ │ │ ├── PRNGFixes.java │ │ │ ├── PassEdit.java │ │ │ ├── PassEditFragment.java │ │ │ ├── PassGen.java │ │ │ ├── PassList.java │ │ │ ├── PassView.java │ │ │ ├── PreferenceActivity.java │ │ │ ├── Restore.java │ │ │ ├── RestoreFirstTimeActivity.java │ │ │ ├── RestoreHandler.java │ │ │ ├── Safe.java │ │ │ ├── SafeApplication.java │ │ │ ├── Search.java │ │ │ ├── SearchFragment.java │ │ │ ├── SearchListItemAdapter.java │ │ │ ├── SimpleGestureFilter.java │ │ │ ├── dialog │ │ │ │ ├── AllowExternalAccessDialog.java │ │ │ │ ├── DialogHostingActivity.java │ │ │ │ ├── FilenameDialog.java │ │ │ │ └── FirstTimeWarningDialog.java │ │ │ ├── model │ │ │ │ ├── CategoryEntry.java │ │ │ │ ├── PackageAccessEntry.java │ │ │ │ ├── PassEntry.java │ │ │ │ ├── Passwords.java │ │ │ │ ├── RestoreDataSet.java │ │ │ │ └── SearchEntry.java │ │ │ ├── password │ │ │ │ └── Master.java │ │ │ ├── service │ │ │ │ ├── AutoLockService.java │ │ │ │ └── ServiceNotification.java │ │ │ └── wrappers │ │ │ │ ├── CheckWrappers.java │ │ │ │ └── icecreamsandwich │ │ │ │ └── WrapNotificationBuilder.java │ │ │ └── util │ │ │ └── SecureDelete.java │ │ └── res │ │ ├── anim │ │ ├── cycle_7.xml │ │ └── shake.xml │ │ ├── drawable-hdpi-v11 │ │ ├── ic_menu_add_password.png │ │ ├── ic_menu_switch_alpha.png │ │ └── ic_menu_switch_numeric.png │ │ ├── drawable-hdpi-v5 │ │ └── ic_launcher_safe.png │ │ ├── drawable-ldpi-v11 │ │ ├── ic_menu_add_password.png │ │ ├── ic_menu_switch_alpha.png │ │ └── ic_menu_switch_numeric.png │ │ ├── drawable-ldpi-v5 │ │ └── ic_launcher_safe.png │ │ ├── drawable-mdpi-v11 │ │ ├── ic_menu_add_password.png │ │ ├── ic_menu_switch_alpha.png │ │ └── ic_menu_switch_numeric.png │ │ ├── drawable-mdpi-v5 │ │ └── ic_launcher_safe.png │ │ ├── drawable-xhdpi-v11 │ │ ├── ic_menu_add_password.png │ │ ├── ic_menu_switch_alpha.png │ │ └── ic_menu_switch_numeric.png │ │ ├── drawable-xhdpi-v5 │ │ └── ic_launcher_safe.png │ │ ├── drawable │ │ ├── ic_launcher_folder_small.png │ │ ├── ic_launcher_safe.png │ │ └── passicon.png │ │ ├── layout-land │ │ ├── front_door.xml │ │ └── keypad.xml │ │ ├── layout-small │ │ └── keypad.xml │ │ ├── layout │ │ ├── auto_backup.xml │ │ ├── cat_edit.xml │ │ ├── cat_list.xml │ │ ├── cat_row.xml │ │ ├── chg_pass.xml │ │ ├── dialog_allow_access.xml │ │ ├── dialog_filename.xml │ │ ├── front_door.xml │ │ ├── help.xml │ │ ├── keypad.xml │ │ ├── log_off.xml │ │ ├── pass_edit.xml │ │ ├── pass_edit_fragment.xml │ │ ├── pass_gen.xml │ │ ├── pass_list.xml │ │ ├── pass_view.xml │ │ ├── preferences.xml │ │ ├── restore.xml │ │ ├── restore_first_time.xml │ │ ├── search.xml │ │ ├── search_fragment.xml │ │ └── search_row.xml │ │ ├── raw │ │ ├── click6a.ogg │ │ ├── dooropening1.ogg │ │ ├── dtmf2a.ogg │ │ ├── license_short.txt │ │ └── recent_changes.txt │ │ ├── values-ar │ │ └── strings.xml │ │ ├── values-be │ │ └── strings.xml │ │ ├── values-bg │ │ └── strings.xml │ │ ├── values-cs │ │ └── strings.xml │ │ ├── values-de │ │ └── strings.xml │ │ ├── values-el │ │ └── strings.xml │ │ ├── values-en-rGB │ │ └── strings.xml │ │ ├── values-es │ │ └── strings.xml │ │ ├── values-fi │ │ └── strings.xml │ │ ├── values-fr │ │ └── strings.xml │ │ ├── values-hi │ │ └── strings.xml │ │ ├── values-it │ │ └── strings.xml │ │ ├── values-iw │ │ └── strings.xml │ │ ├── values-ja │ │ └── strings.xml │ │ ├── values-ko │ │ └── strings.xml │ │ ├── values-lv │ │ └── strings.xml │ │ ├── values-nb │ │ └── strings.xml │ │ ├── values-nl │ │ └── strings.xml │ │ ├── values-oc │ │ └── strings.xml │ │ ├── values-pl │ │ └── strings.xml │ │ ├── values-pt-rBR │ │ └── strings.xml │ │ ├── values-pt │ │ └── strings.xml │ │ ├── values-ro │ │ └── strings.xml │ │ ├── values-ru │ │ └── strings.xml │ │ ├── values-sc │ │ └── strings.xml │ │ ├── values-sd │ │ └── strings.xml │ │ ├── values-sk │ │ └── strings.xml │ │ ├── values-sv │ │ └── strings.xml │ │ ├── values-tl │ │ └── strings.xml │ │ ├── values-tr │ │ └── strings.xml │ │ ├── values-ug │ │ └── strings.xml │ │ ├── values-zh-rCN │ │ └── strings.xml │ │ ├── values │ │ ├── arrays.xml │ │ ├── colors.xml │ │ ├── donottranslate.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ ├── about.xml │ │ └── preferences.xml ├── template of build-private.properties ├── template of local.properties └── tests │ ├── NOTES │ ├── oisafe-test1.csv │ ├── oisafe-test2.csv │ ├── oisafe-test3.csv │ ├── oisafe-test4.csv │ ├── oisafe-test5.csv │ ├── oisafe-test6.csv │ ├── oisafe-test7.csv │ └── test-procedure.html ├── SafeDemo ├── .classpath ├── .project ├── AndroidManifest.xml ├── build.gradle ├── project.properties ├── readme.txt ├── res │ ├── drawable │ │ └── icon.png │ ├── layout │ │ └── main.xml │ └── values │ │ └── strings.xml └── src │ └── org │ └── openintents │ ├── intents │ └── CryptoIntents.java │ ├── safe │ └── service │ │ └── ServiceDispatch.aidl │ └── samples │ └── testsafe │ └── TestSafe.java ├── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── icons ├── ic_menu_add_category │ ├── ic_menu_add_category_holo_dark │ │ ├── hdpi │ │ │ └── ic_menu_add_category.png │ │ ├── ic_menu_add_category.svg │ │ ├── ldpi │ │ │ └── ic_menu_add_category.png │ │ ├── mdpi │ │ │ └── ic_menu_add_category.png │ │ └── xhdpi │ │ │ └── ic_menu_add_category.png │ └── ic_menu_add_category_holo_light │ │ ├── hdpi │ │ └── ic_menu_add_category.png │ │ ├── ic_menu_add_category.svg │ │ ├── ldpi │ │ └── ic_menu_add_category.png │ │ ├── mdpi │ │ └── ic_menu_add_category.png │ │ └── xhdpi │ │ └── ic_menu_add_category.png ├── ic_menu_add_password │ ├── holo_dark │ │ ├── drawable-hdpi │ │ │ └── ic_menu_add_password.png │ │ ├── drawable-ldpi │ │ │ └── ic_menu_add_password.png │ │ ├── drawable-mdpi │ │ │ └── ic_menu_add_password.png │ │ ├── drawable-xdpi │ │ │ └── ic_menu_add_password.png │ │ └── ic_menu_add_password.svg │ └── holo_light │ │ ├── drawable-hdpi │ │ └── ic_menu_add_password.png │ │ ├── drawable-ldpi │ │ └── ic_menu_add_password.png │ │ ├── drawable-mdpi │ │ └── ic_menu_add_password.png │ │ ├── drawable-xdpi │ │ └── ic_menu_add_password.png │ │ └── ic_menu_add_password.svg ├── ic_menu_switch_alpha │ ├── holo_dark │ │ ├── drawable-hdpi │ │ │ └── ic_menu_switch_alpha.png │ │ ├── drawable-ldpi │ │ │ └── ic_menu_switch_alpha.png │ │ ├── drawable-mdpi │ │ │ └── ic_menu_switch_alpha.png │ │ ├── drawable-xhdpi │ │ │ └── ic_menu_switch_alpha.png │ │ └── ic_menu_switch_alpha.svg │ └── holo_light │ │ ├── drawable-hdpi │ │ └── ic_menu_switch_alpha.png │ │ ├── drawable-ldpi │ │ └── ic_menu_switch_alpha.png │ │ ├── drawable-mdpi │ │ └── ic_menu_switch_alpha.png │ │ ├── drawable-xhdpi │ │ └── ic_menu_switch_alpha.png │ │ └── ic_menu_switch_alpha.svg ├── ic_menu_switch_numeric │ ├── holo_dark │ │ ├── drawable-hdpi │ │ │ └── ic_menu_switch_numeric.png │ │ ├── drawable-ldpi │ │ │ └── ic_menu_switch_numeric.png │ │ ├── drawable-mdpi │ │ │ └── ic_menu_switch_numeric.png │ │ ├── drawable-xhdpi │ │ │ └── ic_menu_switch_numeric.png │ │ └── ic_menu_switch_numeric.svg │ └── holo_light │ │ ├── drawable-hdpi │ │ └── ic_menu_switch_numeric.png │ │ ├── drawable-ldpi │ │ └── ic_menu_switch_numeric.png │ │ ├── drawable-mdpi │ │ └── ic_menu_switch_numeric.png │ │ ├── drawable-xhdpi │ │ └── ic_menu_switch_numeric.png │ │ └── ic_menu_switch_numeric.svg └── readme.txt ├── local.properties.gpg ├── promotion ├── description │ ├── description.txt │ ├── description_extensions.txt │ └── translations │ │ ├── application_names.txt │ │ ├── description-ar.txt │ │ ├── description-be.txt │ │ ├── description-bg.txt │ │ ├── description-ca.txt │ │ ├── description-cs.txt │ │ ├── description-da.txt │ │ ├── description-de.txt │ │ ├── description-el.txt │ │ ├── description-en-rGB.txt │ │ ├── description-en.txt │ │ ├── description-es.txt │ │ ├── description-fa.txt │ │ ├── description-fi.txt │ │ ├── description-fr.txt │ │ ├── description-hi.txt │ │ ├── description-hr.txt │ │ ├── description-it.txt │ │ ├── description-iw.txt │ │ ├── description-ja.txt │ │ ├── description-ko.txt │ │ ├── description-lv.txt │ │ ├── description-mk.txt │ │ ├── description-nb.txt │ │ ├── description-nl.txt │ │ ├── description-oc.txt │ │ ├── description-pa.txt │ │ ├── description-pl.txt │ │ ├── description-pt-rBR.txt │ │ ├── description-pt.txt │ │ ├── description-ro.txt │ │ ├── description-ru.txt │ │ ├── description-sc.txt │ │ ├── description-sd.txt │ │ ├── description-sk.txt │ │ ├── description-sv.txt │ │ ├── description-tl.txt │ │ ├── description-tr.txt │ │ ├── description-ug.txt │ │ └── description-zh-rCN.txt ├── icons │ ├── ic_launcher_safe.svg │ └── ic_launcher_safe_512.png ├── market │ ├── safe_promo.svg │ ├── safe_promo_1024x500.png │ └── safe_promo_180x120.png └── screenshots │ └── android-4-0 │ ├── OISafe01.png │ ├── OISafe02.png │ ├── OISafe03.png │ ├── OISafe04.png │ ├── OISafe05.png │ ├── OISafe06.png │ ├── OISafe07.png │ ├── OISafe08.png │ └── readme.txt ├── settings.gradle └── settings ├── debug.keystore ├── release.keystore.gpg ├── safe.gradle └── service_account.json.gpg /.gitignore: -------------------------------------------------------------------------------- 1 | bin 2 | gen 3 | build-private.properties 4 | build 5 | .idea 6 | .gradle 7 | .DS_Store 8 | *.iml 9 | local.properties 10 | 11 | #private files 12 | release.keystore 13 | service_account.json 14 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | env: 3 | global: 4 | - GRADLE_OPTS="-Xms40m -Xmx3g -XX:MaxPermSize=3g" 5 | - secure: FeDzaUloNC2A8G2v2Z5B1kx5kizTWGELnimtYeFO8VfYk+WVtvS+6dRfZN2whp0GxYJIvGr//6cnodxAUr039cXROm3zVXZu1/G7cHtJkb89/DGcKmIOaolWZ9BnggqdYTNU7xYoA0T7HNH5ILFs41L2f60rOBVzMMrEvzb8VfY= 6 | - secure: VJYe/hgudROET8hXZwB4LlhE+hlIW6R+rt9ieWBAruLlH+Udl+dRBhq3d9Vh36ImqslgSP6yZsyk3Ey7mdSgdkFu70bF1WHs925D/DVSEtByIpMEINJ/pEFFajJOk1p54kxVxhGg0gBzD8hFhPb3FoeG/8MTF31s0aahJqmPEgI= 7 | jdk: oraclejdk8 8 | android: 9 | components: 10 | - tools 11 | - tools 12 | - platform-tools 13 | - android-27 14 | - build-tools-27.0.3 15 | license: 16 | - android-sdk-license-.+ 17 | 18 | before_install: 19 | - mkdir "$ANDROID_HOME/licenses" || true 20 | - echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55\nd56f5187479451eabf01fb78af6dfcb131a6481e" > "$ANDROID_HOME/licenses/android-sdk-license" 21 | - if [ -n "$GPG_PASS" ]; then echo $GPG_PASS | gpg --passphrase-fd 0 local.properties.gpg; 22 | fi 23 | - if [ -n "$GPG_PASS" ]; then echo $GPG_PASS | gpg --passphrase-fd 0 settings/service_account.json.gpg; 24 | fi 25 | - if [ -n "$GPG_PASS" ]; then echo $GPG_PASS | gpg --passphrase-fd 0 settings/release.keystore.gpg; 26 | fi 27 | - if [ -z "$GPG_PASS"]; then touch local.properties; fi 28 | after_success: 29 | - if [ -n "$GITHUB_API_KEY" ]; then .buildscript/deploy_google_play.sh; fi 30 | script: "./gradlew check" 31 | branches: 32 | except: 33 | - gh-pages 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OI Safe 2 | Password manager for Android 3 | Please see https://www.openintents.org/safe for description using Trivium streaming encryption. 4 | 5 | ## Build 6 | Depends on OI Distribution. 7 | 8 | ``` 9 | ./gradlew assemble 10 | ``` 11 | 12 | ## Release to Googe Play alpha channel 13 | Just push to master 14 | 15 | -------------------------------------------------------------------------------- /Safe/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Safe/.gitignore: -------------------------------------------------------------------------------- 1 | # built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # files for the dex VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # generated files 12 | bin/ 13 | gen/ 14 | release/ 15 | 16 | # Eclipse settings 17 | .settings/ 18 | 19 | # Local configuration file (sdk path, etc) 20 | local.properties 21 | 22 | -------------------------------------------------------------------------------- /Safe/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | OI Safe 4 | 5 | 6 | 7 | 8 | 9 | com.android.ide.eclipse.adt.ResourceManagerBuilder 10 | 11 | 12 | 13 | 14 | com.android.ide.eclipse.adt.PreCompilerBuilder 15 | 16 | 17 | 18 | 19 | org.eclipse.jdt.core.javabuilder 20 | 21 | 22 | 23 | 24 | com.android.ide.eclipse.adt.ApkBuilder 25 | 26 | 27 | 28 | 29 | 30 | com.android.ide.eclipse.adt.AndroidNature 31 | org.eclipse.jdt.core.javanature 32 | 33 | 34 | -------------------------------------------------------------------------------- /Safe/AUTHORS: -------------------------------------------------------------------------------- 1 | Steven Osborn - http://steven.bitsetters.com 2 | Randy McEoin 3 | Isaac Potoczny-Jones - http://www.syntaxpolice.org 4 | Peli 5 | -------------------------------------------------------------------------------- /Safe/CHANGELOG: -------------------------------------------------------------------------------- 1 | 0.1.0 [Nov 20, 2007] - Initial release of Password Safe 2 | 0.2.0 [Sept 4, 2008] - Updated to work with Android 0.9 thanks to Randy McEoin 3 | 0.2.1 [Sept 5, 2008] - Fixed delete, fixed bug where new entries wouldn't show 4 | up immediately. 5 | 0.2.2 [Sept 16, 2008] - Added categories and export to CSV. 6 | 0.2.3 [Oct 21, 2008] - Assorted bug fixes. Bumped database to version 2. 7 | Initial Market Version. 8 | 0.3.0 [Nov 2, 2008] - Improved Import/Export, Help Screen, 9 | [I7] Password Generator, 10 | [I10] Fixed issue where initial screen ate back button 11 | [I13] Fixed issue with passwords/categories not being saved after orientation change 12 | Made Delete menu option disabled on list views if there is no item selected 13 | Launching browser from password edit screen copies password to clip board 14 | 0.4.0 [Nov 15, 2008] 15 | [I14] Added the ChangePass activity allowing user to change the 16 | password used to unlock the app and encrypt the data 17 | [I19] User is not prompted before deleting a password 18 | [I20] During import a progress dialog is displayed 19 | 0.5.0 [Nov 22, 2008] 20 | [I23] Added the ability for an encrypted backup/restore 21 | [I24] Offer a ContextMenu on CategoryList when user long presses 22 | [I25] Fixed crashing when user hits Go on an invalid URL in PassEdit 23 | 0.6.0 [Dec 18, 2008] 24 | Changed encryption method to use a generated master key. User provides 25 | a master password that decrypts the master key. The master key is used 26 | to encrypt/decrypt the password entries. 27 | Database is now version 3. No upgrade path provided, user must export/import. 28 | 0.7.0 [Jan 16, 2009] 29 | Rename APWS to OI Safe. 30 | -------------------------------------------------------------------------------- /Safe/NOTES: -------------------------------------------------------------------------------- 1 | 2 | To grab the database to work with it locally:: 3 | 4 | adb pull /data/data/org.openintents.safe/databases/safe . 5 | 6 | 7 | Then to open it with sqlite3:: 8 | 9 | sqlite3 safe 10 | 11 | To delete the database and force a clean start:: 12 | 13 | adb shell rm /data/data/org.openintents.safe/databases/safe 14 | 15 | To uninstall the application completely:: 16 | 17 | adb uninstall org.openintents.safe 18 | 19 | To make the keyword Id update:: 20 | 21 | svn propset svn:keywords Id org/openintents/safe/filename.java 22 | -------------------------------------------------------------------------------- /Safe/README: -------------------------------------------------------------------------------- 1 | LEGAL 2 | ------------------------------------------------------------------------------ 3 | Key Icon is Copyright David Vignoni, http://www.icon-king.com/ and licensed 4 | under the GNU LGPL V2.1 http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html 5 | 6 | ALL OTHER SOURCE CODE AND CONTENT: 7 | 8 | Copyright 2007, Steven Osborn - http://steven.bitsetters.com and 9 | Randy McEoin 10 | 11 | Licensed under the Apache License, Version 2.0 (the "License"); 12 | you may not use this file except in compliance with the License. 13 | You may obtain a copy of the License at 14 | 15 | http://www.apache.org/licenses/LICENSE-2.0 16 | 17 | Unless required by applicable law or agreed to in writing, software 18 | distributed under the License is distributed on an "AS IS" BASIS, 19 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 20 | See the License for the specific language governing permissions and 21 | limitations under the License. 22 | 23 | ------------------------------------------------------------------------------ 24 | 25 | Features planned for version 1.0 26 | ------------------------------------------------------------------------------ 27 | * Store username, password, site name, notes 28 | * Encrypt all data using password based encryption 29 | * A way to launch url in browser from password safe 30 | 31 | Ideas for future versions: 32 | ------------------------------------------------------------------------------ 33 | * Favicon fetching and display 34 | * Customizeable encryption levels 35 | * Browser plugin -------------------------------------------------------------------------------- /Safe/build.properties: -------------------------------------------------------------------------------- 1 | # This file is used to override default values used by the Ant build system. 2 | # 3 | # This file must be checked in Version Control Systems, as it is 4 | # integral to the build system of your project. 5 | 6 | # This file is only used by the Ant script. 7 | 8 | # You can use this to override default values such as 9 | # 'source.dir' for the location of your java source folder and 10 | # 'out.dir' for the location of your output folder. 11 | 12 | # You can also use it define how the release builds are signed by declaring 13 | # the following properties: 14 | # 'key.store' for the location of your keystore and 15 | # 'key.alias' for the name of the key to use. 16 | # The password will be asked during the build when you use the 'release' target. 17 | -------------------------------------------------------------------------------- /Safe/build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 19 | 20 | 23 | 24 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Safe/libs/OISafeMyBackupPro.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/libs/OISafeMyBackupPro.jar -------------------------------------------------------------------------------- /Safe/proguard.cfg: -------------------------------------------------------------------------------- 1 | -optimizationpasses 5 2 | -dontusemixedcaseclassnames 3 | -dontskipnonpubliclibraryclasses 4 | -dontpreverify 5 | -verbose 6 | -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 7 | 8 | -keep public class * extends android.app.Activity 9 | -keep public class * extends android.app.Application 10 | -keep public class * extends android.app.Service 11 | -keep public class * extends android.content.BroadcastReceiver 12 | -keep public class * extends android.content.ContentProvider 13 | -keep public class com.android.vending.licensing.ILicensingService 14 | 15 | -keepclasseswithmembernames class * { 16 | native ; 17 | } 18 | 19 | -keepclasseswithmembernames class * { 20 | public (android.content.Context, android.util.AttributeSet); 21 | } 22 | 23 | -keepclasseswithmembernames class * { 24 | public (android.content.Context, android.util.AttributeSet, int); 25 | } 26 | 27 | -keepclassmembers enum * { 28 | public static **[] values(); 29 | public static ** valueOf(java.lang.String); 30 | } 31 | 32 | -keep class * implements android.os.Parcelable { 33 | public static final android.os.Parcelable$Creator *; 34 | } 35 | -------------------------------------------------------------------------------- /Safe/project.properties: -------------------------------------------------------------------------------- 1 | # This file is automatically generated by Android Tools. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file must be checked in Version Control Systems. 5 | # 6 | # To customize properties used by the Ant build system use, 7 | # "ant.properties", and override values to adapt the script to your 8 | # project structure. 9 | 10 | android.library.reference.1=../../distribution/DistributionLibrary/ 11 | # Project target. 12 | target=android-16 13 | -------------------------------------------------------------------------------- /Safe/src/main/java/estreamj/framework/ESJException.java: -------------------------------------------------------------------------------- 1 | package estreamj.framework; 2 | 3 | public class ESJException extends Exception { 4 | private static final long serialVersionUID = 6375271013846829471L; 5 | 6 | public ESJException() { 7 | super(); 8 | } 9 | 10 | public ESJException(String message) { 11 | super(message); 12 | } 13 | 14 | public ESJException(Throwable cause) { 15 | super(cause); 16 | } 17 | 18 | public ESJException(String message, Throwable cause) { 19 | super(message, cause); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Safe/src/main/java/estreamj/framework/ICipher.java: -------------------------------------------------------------------------------- 1 | package estreamj.framework; 2 | 3 | /** 4 | * Generic interface every cipher needs to implement, so it can participate in 5 | * the test framework. If a cipher comes in different flavors (variable key 6 | * sizes, MAC computation or not, etc.) it should then implement a version for 7 | * each of them - this keeps the actual testing logic simple. Simple is good. 8 | */ 9 | public interface ICipher { 10 | /** 11 | * mode: instance is used for encryption 12 | */ 13 | public final static int MODE_ENCRYPT = 0; 14 | 15 | /** 16 | * mode: instance is used for decryption 17 | */ 18 | public final static int MODE_DECRYPT = 1; 19 | 20 | /////////////////////////////////////////////////////////////////////////// 21 | 22 | /** 23 | * @return true: algorithm is patented, check with vendor for license 24 | * details / false: free to use in private and commerical applications 25 | */ 26 | public boolean isPatented(); 27 | 28 | /** 29 | * @return key size in bytes 30 | */ 31 | public int getKeySize(); 32 | 33 | /** 34 | * @return nonce size in bytes. 35 | */ 36 | public int getNonceSize(); 37 | 38 | /** 39 | * @return alignment of data needed during calls into process() 40 | */ 41 | public int getWordSize(); 42 | 43 | /////////////////////////////////////////////////////////////////////////// 44 | 45 | /** 46 | * Resets the instance, so it can be reused. 47 | * 48 | * @throws ESJException if any error occurs 49 | */ 50 | public void reset() throws ESJException; 51 | 52 | /** 53 | * Sets up a new key with the existing instance. 54 | * 55 | * @param mode see MODE_xxx 56 | * @param key buffer with key material 57 | * @param ofs where the key starts 58 | * @throws ESJException if any error occurs 59 | */ 60 | public void setupKey(int mode, byte[] key, int ofs) 61 | throws ESJException; 62 | 63 | /** 64 | * Sets up a new nonce with the existing cipher instance. 65 | * 66 | * @param mode see MODE_xxx 67 | * @param nonce buffer with nonce material 68 | * @param ofs where the nonce starts 69 | * @throws ESJException if any error occurs 70 | */ 71 | public void setupNonce(byte[] nonce, int ofs) 72 | throws ESJException; 73 | 74 | /////////////////////////////////////////////////////////////////////////// 75 | 76 | /** 77 | * Processes data. 78 | * 79 | * @param inbuf input buffer 80 | * @param inOfs where to start reading from the input buffer 81 | * @param outbuf output buffer 82 | * @param outOfs where to start writing in the output buffer 83 | * @param len number of bytes to process, must be aligned to the cipher's 84 | * word size except on the last call where an arbitrary size can be used 85 | * @throws ESJException in any error occured 86 | */ 87 | public void process( 88 | byte[] inbuf, 89 | int inOfs, 90 | byte[] outbuf, 91 | int outOfs, 92 | int len) throws ESJException; 93 | } 94 | -------------------------------------------------------------------------------- /Safe/src/main/java/estreamj/framework/ICipherMaker.java: -------------------------------------------------------------------------------- 1 | package estreamj.framework; 2 | 3 | /** 4 | * Simple cipher factory. 5 | */ 6 | public interface ICipherMaker { 7 | /** 8 | * @return the name of cipher, which is used for queries - so it must be 9 | * unique 10 | */ 11 | public String getName(); 12 | 13 | /** 14 | * Create a new cipher instance. 15 | * 16 | * @return new instance, which can also be of the type ICipherMAC, use the 17 | * "instanceof" keyword to find out what you are dealing with 18 | * @throws ESJException if any error occured 19 | */ 20 | public ICipher create() throws ESJException; 21 | } 22 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/intents/FileManagerIntents.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2008 OpenIntents.org 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package org.openintents.intents; 18 | 19 | // Version Dec 9, 2008 20 | 21 | /** 22 | * Provides OpenIntents actions, extras, and categories used by providers. 23 | *

These specifiers extend the standard Android specifiers.

24 | */ 25 | public final class FileManagerIntents { 26 | 27 | /** 28 | * Activity Action: Pick a file through the file manager, or let user 29 | * specify a custom file name. 30 | * Data is the current file name or file name suggestion. 31 | * Returns a new file name as file URI in data. 32 | *

33 | *

Constant Value: "org.openintents.action.PICK_FILE"

34 | */ 35 | public static final String ACTION_PICK_FILE = "org.openintents.action.PICK_FILE"; 36 | 37 | /** 38 | * Activity Action: Pick a directory through the file manager, or let user 39 | * specify a custom file name. 40 | * Data is the current directory name or directory name suggestion. 41 | * Returns a new directory name as file URI in data. 42 | *

43 | *

Constant Value: "org.openintents.action.PICK_DIRECTORY"

44 | */ 45 | public static final String ACTION_PICK_DIRECTORY = "org.openintents.action.PICK_DIRECTORY"; 46 | 47 | /** 48 | * The title to display. 49 | *

50 | *

This is shown in the title bar of the file manager.

51 | *

52 | *

Constant Value: "org.openintents.extra.TITLE"

53 | */ 54 | public static final String EXTRA_TITLE = "org.openintents.extra.TITLE"; 55 | 56 | /** 57 | * The text on the button to display. 58 | *

59 | *

Depending on the use, it makes sense to set this to "Open" or "Save".

60 | *

61 | *

Constant Value: "org.openintents.extra.BUTTON_TEXT"

62 | */ 63 | public static final String EXTRA_BUTTON_TEXT = "org.openintents.extra.BUTTON_TEXT"; 64 | 65 | } 66 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/CryptoHelperException.java: -------------------------------------------------------------------------------- 1 | /* $Id$ 2 | * 3 | * Copyright 2007-2008 Steven Osborn 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | package org.openintents.safe; 18 | 19 | /** 20 | * @author Steven Osborn - http://steven.bitsetters.com 21 | */ 22 | public class CryptoHelperException extends Exception { 23 | 24 | private static final long serialVersionUID = 9198874648607918125L; 25 | 26 | public CryptoHelperException(String message) { 27 | super(message); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/Export.java: -------------------------------------------------------------------------------- 1 | package org.openintents.safe; 2 | 3 | import android.content.Context; 4 | 5 | import org.openintents.safe.model.PassEntry; 6 | import org.openintents.safe.model.Passwords; 7 | 8 | import java.io.IOException; 9 | import java.io.Writer; 10 | import java.util.HashMap; 11 | import java.util.List; 12 | 13 | public class Export { 14 | static void exportDatabaseToWriter(Context context, Writer w) throws IOException { 15 | 16 | CSVWriter writer = new CSVWriter(w, ','); 17 | 18 | String[] header = {context.getString(R.string.category), 19 | context.getString(R.string.description), 20 | context.getString(R.string.website), 21 | context.getString(R.string.username), 22 | context.getString(R.string.password), 23 | context.getString(R.string.notes), 24 | context.getString(R.string.last_edited) 25 | }; 26 | writer.writeNext(header); 27 | 28 | HashMap categories = Passwords.getCategoryIdToName(); 29 | 30 | List rows; 31 | rows = Passwords.getPassEntries(Long.valueOf(0), true, false); 32 | 33 | for (PassEntry row : rows) { 34 | String[] rowEntries = {categories.get(row.category), 35 | row.plainDescription, 36 | row.plainWebsite, 37 | row.plainUsername, 38 | row.plainPassword, 39 | row.plainNote, 40 | row.lastEdited 41 | }; 42 | writer.writeNext(rowEntries); 43 | } 44 | writer.close(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/FrontDoor.java: -------------------------------------------------------------------------------- 1 | package org.openintents.safe; 2 | 3 | /** 4 | * The main activity prior to version 1.2.4 was ".FrontDoor". Home screens 5 | * may still contain a direct link to the old activity, therefore this class 6 | * must never be renamed or moved. 7 | *

8 | * Prior to version 1.3.1, activity-alias was used. Unfortunately with that in use 9 | * the application would not automatically launch from Eclipse and would not debug 10 | * correctly. 11 | *

12 | * This class is derived from .Safe which contains the actual 13 | * implementation. 14 | */ 15 | public class FrontDoor extends Safe { 16 | 17 | } 18 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/InputStreamData.java: -------------------------------------------------------------------------------- 1 | package org.openintents.safe; 2 | 3 | import android.content.Context; 4 | import android.net.Uri; 5 | 6 | import java.io.FileInputStream; 7 | import java.io.FileNotFoundException; 8 | import java.io.InputStream; 9 | 10 | public class InputStreamData { 11 | private String filename; 12 | private InputStream stream; 13 | 14 | public InputStreamData(String filename) throws FileNotFoundException { 15 | this.filename = filename; 16 | this.stream = new FileInputStream(filename); 17 | } 18 | 19 | public InputStreamData(Uri documentUri, Context context) throws FileNotFoundException { 20 | this.filename = documentUri.toString(); 21 | this.stream = context.getContentResolver().openInputStream(documentUri); 22 | } 23 | 24 | public String getFilename() { 25 | return filename; 26 | } 27 | 28 | public InputStream getStream() { 29 | return stream; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/Intents.java: -------------------------------------------------------------------------------- 1 | package org.openintents.safe; 2 | 3 | import android.annotation.TargetApi; 4 | import android.content.Intent; 5 | import android.net.Uri; 6 | import android.os.Build; 7 | 8 | import static android.content.Intent.*; 9 | 10 | public class Intents { 11 | static Intent createPickFileIntent(String filename, int titleResource) { 12 | Intent intent; 13 | intent = new Intent("org.openintents.action.PICK_FILE"); 14 | intent.setData(Uri.parse("file://" + filename)); 15 | intent.putExtra("org.openintents.extra.TITLE", titleResource); 16 | return intent; 17 | } 18 | 19 | @TargetApi(Build.VERSION_CODES.KITKAT) 20 | static Intent createCreateDocumentIntent(String mimeType, String filename) { 21 | Intent intent = new Intent(ACTION_CREATE_DOCUMENT); 22 | intent.addCategory(CATEGORY_OPENABLE); 23 | intent.setType(mimeType); 24 | intent.putExtra(EXTRA_TITLE, filename); 25 | return intent; 26 | } 27 | 28 | @TargetApi(Build.VERSION_CODES.KITKAT) 29 | public static Intent createOpenDocumentIntents(String mimeType, String backupDocument) { 30 | Intent intent = new Intent(ACTION_OPEN_DOCUMENT); 31 | if (backupDocument != null) { 32 | intent.setData(Uri.parse(backupDocument)); 33 | } 34 | intent.addCategory(CATEGORY_OPENABLE); 35 | intent.setType(mimeType); 36 | return intent; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/OutputStreamData.java: -------------------------------------------------------------------------------- 1 | package org.openintents.safe; 2 | 3 | import android.content.Context; 4 | import android.net.Uri; 5 | 6 | import java.io.FileNotFoundException; 7 | import java.io.FileOutputStream; 8 | import java.io.OutputStream; 9 | 10 | public class OutputStreamData { 11 | private String filename; 12 | private OutputStream stream; 13 | 14 | public OutputStreamData(String filename) throws FileNotFoundException { 15 | this.filename = filename; 16 | this.stream = new FileOutputStream(filename); 17 | } 18 | 19 | public OutputStreamData(Uri documentUri, Context context) throws FileNotFoundException { 20 | this.filename = documentUri.toString(); 21 | this.stream = context.getContentResolver().openOutputStream(documentUri); 22 | } 23 | 24 | public String getFilename() { 25 | return filename; 26 | } 27 | 28 | public OutputStream getStream() { 29 | return stream; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/RestoreFirstTimeActivity.java: -------------------------------------------------------------------------------- 1 | package org.openintents.safe; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.view.View; 8 | import android.view.View.OnClickListener; 9 | import android.widget.Button; 10 | import android.widget.TextView; 11 | 12 | import org.openintents.util.VersionUtils; 13 | 14 | public class RestoreFirstTimeActivity extends AppCompatActivity { 15 | private Button restore; 16 | private Button cancel; 17 | private String path; 18 | 19 | private static final int REQUEST_RESTORE = 0; 20 | 21 | @Override 22 | public void onCreate(Bundle savedInstanceState) { 23 | super.onCreate(savedInstanceState); 24 | setContentView(R.layout.restore_first_time); 25 | path = PreferenceActivity.getBackupPath(this); 26 | restore = (Button) findViewById(R.id.restore); 27 | cancel = (Button) findViewById(R.id.cancel); 28 | 29 | ((TextView) findViewById(R.id.filename)).setText(path); 30 | restore.setOnClickListener( 31 | new OnClickListener() { 32 | public void onClick(View v) { 33 | Intent i = new Intent(RestoreFirstTimeActivity.this, Restore.class); 34 | i.putExtra(Restore.KEY_FILE_PATH, path); 35 | i.putExtra(Restore.KEY_FIRST_TIME, true); 36 | startActivityForResult(i, REQUEST_RESTORE); 37 | } 38 | } 39 | ); 40 | cancel.setOnClickListener( 41 | new OnClickListener() { 42 | public void onClick(View v) { 43 | setResult(RESULT_CANCELED); 44 | finish(); 45 | } 46 | } 47 | ); 48 | 49 | /* Copied from AskPassword.java - normalInit() */ 50 | TextView header = (TextView) findViewById(R.id.entry_header); 51 | String version = VersionUtils.getVersionNumber(this); 52 | String appName = VersionUtils.getApplicationName(this); 53 | String head = appName + " " + version; 54 | header.setText(head); 55 | } 56 | 57 | @Override 58 | protected void onActivityResult(int requestCode, int resultCode, Intent i) { 59 | super.onActivityResult(requestCode, resultCode, i); 60 | switch (requestCode) { 61 | case REQUEST_RESTORE: 62 | setResult(resultCode); 63 | finish(); 64 | break; 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/Safe.java: -------------------------------------------------------------------------------- 1 | /* $Id: FrontDoor.java 1805 2009-01-20 04:05:01Z rmceoin $ 2 | * 3 | * Copyright 2007-2008 Steven Osborn 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | package org.openintents.safe; 18 | 19 | import android.app.Activity; 20 | import android.content.Intent; 21 | import android.os.Bundle; 22 | import android.support.v7.app.AppCompatActivity; 23 | import android.util.Log; 24 | 25 | import org.openintents.intents.CryptoIntents; 26 | 27 | /** 28 | * Safe Activity 29 | *

30 | * This activity just makes sure we're entering the front door, not calling encrypt/decrypt 31 | * or other intents. 32 | * 33 | * @author Steven Osborn - http://steven.bitsetters.com 34 | */ 35 | public class Safe extends AppCompatActivity { 36 | 37 | private static final String TAG = "FrontDoor"; 38 | private static final boolean debug = false; 39 | public static String last_used_password = null; 40 | 41 | // public static final String KEY_AUTOLOCK = "autolock"; 42 | 43 | /** 44 | * Called when the activity is first created. 45 | */ 46 | @Override 47 | public void onCreate(Bundle icicle) { 48 | super.onCreate(icicle); 49 | 50 | if (debug) { 51 | Log.d(TAG, "onCreate()"); 52 | } 53 | final Intent thisIntent = getIntent(); 54 | final String action = thisIntent.getAction(); 55 | if (action == null || action.equals(Intent.ACTION_MAIN) || action.equals(CryptoIntents.ACTION_AUTOLOCK)) { 56 | //TODO: When launched from debugger, action is null. Other such cases? 57 | Intent i = new Intent( 58 | getApplicationContext(), 59 | IntentHandlerActivity.class 60 | ); 61 | // boolean autoLock = icicle != null ? icicle.getBoolean(FrontDoor.KEY_AUTOLOCK) : false; 62 | if (debug) { 63 | Log.d(TAG, "action=" + action); 64 | } 65 | // if (action.equals(CryptoIntents.ACTION_AUTOLOCK)) { 66 | // i.setAction(CryptoIntents.ACTION_AUTOLOCK); 67 | // } 68 | i.setAction(action); 69 | startActivity(i); 70 | } // otherwise, do not start intents, those must be protected by permissions 71 | finish(); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/SafeApplication.java: -------------------------------------------------------------------------------- 1 | package org.openintents.safe; 2 | 3 | import android.app.Application; 4 | 5 | public class SafeApplication extends Application { 6 | @Override 7 | public void onCreate() { 8 | super.onCreate(); 9 | PRNGFixes.apply(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/Search.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2012 OpenIntents 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.openintents.safe; 17 | 18 | import android.content.Intent; 19 | import android.os.Bundle; 20 | import android.support.v4.app.FragmentActivity; 21 | import android.support.v7.app.AppCompatActivity; 22 | import android.util.Log; 23 | 24 | import org.openintents.intents.CryptoIntents; 25 | 26 | public class Search extends AppCompatActivity { 27 | 28 | private final boolean debug = false; 29 | private final String TAG = "Search"; 30 | 31 | private Intent restartTimerIntent = null; 32 | 33 | @Override 34 | protected void onCreate(Bundle savedInstanceState) { 35 | super.onCreate(savedInstanceState); 36 | 37 | if (debug) { 38 | Log.d(TAG, "onCreate()"); 39 | } 40 | setContentView(R.layout.search); 41 | 42 | restartTimerIntent = new Intent(CryptoIntents.ACTION_RESTART_TIMER); 43 | 44 | } 45 | 46 | @Override 47 | public void onUserInteraction() { 48 | super.onUserInteraction(); 49 | 50 | if (debug) { 51 | Log.d(TAG, "onUserInteraction()"); 52 | } 53 | 54 | if (CategoryList.isSignedIn() == false) { 55 | // startActivity(frontdoor); 56 | } else { 57 | if (restartTimerIntent != null) { 58 | sendBroadcast(restartTimerIntent); 59 | } 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/SearchListItemAdapter.java: -------------------------------------------------------------------------------- 1 | /* $Id$ 2 | * 3 | * Copyright (C) 2011 OpenIntents.org 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | package org.openintents.safe; 18 | 19 | import android.content.Context; 20 | import android.util.Log; 21 | import android.view.LayoutInflater; 22 | import android.view.View; 23 | import android.view.ViewGroup; 24 | import android.widget.ArrayAdapter; 25 | import android.widget.LinearLayout; 26 | import android.widget.TextView; 27 | 28 | import org.openintents.safe.model.SearchEntry; 29 | 30 | import java.util.List; 31 | 32 | /** 33 | * @author Randy McEoin 34 | *

35 | * Many thanks to Professional Android Application Development by Reto Meier 36 | * from which this adapter is based upon. 37 | */ 38 | public class SearchListItemAdapter extends ArrayAdapter { 39 | 40 | private static boolean debug = false; 41 | private static final String TAG = "SearchListItemAdapter"; 42 | 43 | int resource; 44 | 45 | public SearchListItemAdapter(Context _context, int _resource, 46 | List _items) { 47 | super(_context, _resource, _items); 48 | resource = _resource; 49 | } 50 | 51 | @Override 52 | public View getView(int position, View convertView, ViewGroup parent) { 53 | LinearLayout searchListView; 54 | 55 | SearchEntry item = getItem(position); 56 | 57 | String name = item.name; 58 | String category = item.category; 59 | 60 | if (convertView == null) { 61 | searchListView = new LinearLayout(getContext()); 62 | String inflater = Context.LAYOUT_INFLATER_SERVICE; 63 | LayoutInflater vi; 64 | vi = (LayoutInflater) getContext().getSystemService(inflater); 65 | vi.inflate(resource, searchListView, true); 66 | } else { 67 | searchListView = (LinearLayout) convertView; 68 | } 69 | 70 | TextView nameView = (TextView) searchListView.findViewById(R.id.rowName); 71 | TextView categoryView = (TextView) searchListView.findViewById(R.id.rowCategory); 72 | 73 | if (debug) { 74 | Log.d(TAG, "category=" + category); 75 | } 76 | nameView.setText(name); 77 | categoryView.setText(category); 78 | 79 | return searchListView; 80 | } 81 | } 82 | 83 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/dialog/FirstTimeWarningDialog.java: -------------------------------------------------------------------------------- 1 | package org.openintents.safe.dialog; 2 | 3 | import android.content.Context; 4 | import android.content.DialogInterface; 5 | import android.content.DialogInterface.OnClickListener; 6 | import android.support.v7.app.AlertDialog; 7 | import android.widget.CheckBox; 8 | 9 | import org.openintents.safe.R; 10 | 11 | public class FirstTimeWarningDialog extends AlertDialog implements OnClickListener { 12 | // private static final String TAG = "FilenameDialog"; 13 | 14 | // private static final String BUNDLE_TAGS = "tags"; 15 | 16 | protected static final int DIALOG_ID_NO_FILE_MANAGER_AVAILABLE = 2; 17 | 18 | Context mContext; 19 | 20 | CheckBox mCheckBox; 21 | 22 | public FirstTimeWarningDialog(Context context) { 23 | super(context); 24 | mContext = context; 25 | 26 | setTitle(context.getText(R.string.dialog_title_first_time_warning)); 27 | setButton(BUTTON_POSITIVE, context.getText(android.R.string.ok), (OnClickListener) null); 28 | //setButton2(context.getText(android.R.string.cancel), (OnClickListener) null); 29 | setIcon(android.R.drawable.ic_dialog_alert); 30 | setMessage(context.getText(R.string.dialog_summary_first_time_warning)); 31 | 32 | } 33 | 34 | public void onClick(DialogInterface dialog, int which) { 35 | if (which == BUTTON_POSITIVE) { 36 | // User pressed OK 37 | } 38 | 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/model/CategoryEntry.java: -------------------------------------------------------------------------------- 1 | /* $Id$ 2 | * 3 | * Copyright 2008 Randy McEoin 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | package org.openintents.safe.model; 18 | 19 | /** 20 | * @author Randy McEoin 21 | */ 22 | public class CategoryEntry { 23 | public long id = -1; 24 | public String name; 25 | public boolean nameNeedsDecrypt; 26 | public String plainName; 27 | public boolean plainNameNeedsEncrypt = true; 28 | private int count = 0; 29 | 30 | public String getName() { 31 | return name; 32 | } 33 | 34 | public int getCount() { 35 | return count; 36 | } 37 | 38 | public CategoryEntry() { 39 | name = ""; 40 | } 41 | 42 | public CategoryEntry(String _name) { 43 | name = _name; 44 | } 45 | 46 | public CategoryEntry(String _name, int _count) { 47 | name = _name; 48 | count = _count; 49 | } 50 | 51 | @Override 52 | public String toString() { 53 | return name + " " + count; 54 | } 55 | 56 | public void setCount(int count) { 57 | this.count = count; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/model/PackageAccessEntry.java: -------------------------------------------------------------------------------- 1 | /* $Id$ 2 | * 3 | * Copyright (C) 2009 OpenIntents.org 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | package org.openintents.safe.model; 18 | 19 | public class PackageAccessEntry { 20 | public boolean needsDecrypt; 21 | public boolean needsEncrypt = true; 22 | public String packageAccess; 23 | public String plainPackageAccess; 24 | } 25 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/model/PassEntry.java: -------------------------------------------------------------------------------- 1 | /* $Id$ 2 | * 3 | * Copyright 2007-2008 Steven Osborn 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | package org.openintents.safe.model; 18 | 19 | import java.util.ArrayList; 20 | 21 | /** 22 | * @author Steven Osborn - http://steven.bitsetters.com 23 | */ 24 | public class PassEntry { 25 | public long id = -1; 26 | public boolean needsDecryptDescription; 27 | public boolean needsDecrypt; 28 | public boolean needsEncrypt = true; 29 | public String password; 30 | public long category; 31 | public String categoryName; 32 | public String description; 33 | public String username; 34 | public String website; 35 | public String uniqueName; 36 | public ArrayList packageAccess; 37 | public String note; 38 | public String plainPassword; 39 | public String plainDescription; 40 | public String plainUsername; 41 | public String plainWebsite; 42 | public String plainNote; 43 | public String plainUniqueName; 44 | public String lastEdited; 45 | 46 | public static boolean checkPackageAccess(ArrayList packageAccess, String packageName) { 47 | return (packageAccess.contains(packageName)); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/model/SearchEntry.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2011-2012 OpenIntents.org 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.openintents.safe.model; 17 | 18 | import android.os.Parcel; 19 | import android.os.Parcelable; 20 | 21 | /** 22 | * @author Randy McEoin 23 | */ 24 | public class SearchEntry implements Parcelable { 25 | public long id = -1; 26 | public String name; 27 | public String category; 28 | public long categoryId = -1; 29 | 30 | public String getName() { 31 | return name; 32 | } 33 | 34 | public String getCategory() { 35 | return category; 36 | } 37 | 38 | public SearchEntry() { 39 | name = ""; 40 | category = ""; 41 | } 42 | 43 | public SearchEntry(String _name) { 44 | name = _name; 45 | category = ""; 46 | } 47 | 48 | public SearchEntry(String _name, String _category) { 49 | name = _name; 50 | category = _category; 51 | } 52 | 53 | @Override 54 | public String toString() { 55 | return name + " " + category; 56 | } 57 | 58 | public int describeContents() { 59 | return 0; 60 | } 61 | 62 | /** 63 | * save object in parcel 64 | */ 65 | public void writeToParcel(Parcel out, int flags) { 66 | out.writeLong(id); 67 | out.writeString(name); 68 | out.writeString(category); 69 | out.writeLong(categoryId); 70 | } 71 | 72 | public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 73 | public SearchEntry createFromParcel(Parcel in) { 74 | return new SearchEntry(in); 75 | } 76 | 77 | public SearchEntry[] newArray(int size) { 78 | return new SearchEntry[size]; 79 | } 80 | }; 81 | 82 | /** 83 | * recreate object from parcel 84 | */ 85 | private SearchEntry(Parcel in) { 86 | id = in.readLong(); 87 | name = in.readString(); 88 | category = in.readString(); 89 | categoryId = in.readLong(); 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/password/Master.java: -------------------------------------------------------------------------------- 1 | /* $Id$ 2 | * 3 | * Copyright 2012 OpenIntents.org 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | package org.openintents.safe.password; 18 | 19 | /** 20 | * Centrally stores the Master Key and Salt for all other classes to use. 21 | */ 22 | public class Master { 23 | 24 | private static String salt = null; 25 | private static String masterKey = null; 26 | 27 | /** 28 | * @return the salt 29 | */ 30 | public synchronized static String getSalt() { 31 | return salt; 32 | } 33 | 34 | /** 35 | * @param saltIn the salt to set 36 | */ 37 | public synchronized static void setSalt(String saltIn) { 38 | salt = saltIn; 39 | } 40 | 41 | /** 42 | * @return the masterKey 43 | */ 44 | public synchronized static String getMasterKey() { 45 | return masterKey; 46 | } 47 | 48 | /** 49 | * @param masterKeyIn the masterKey to set 50 | */ 51 | public synchronized static void setMasterKey(String masterKeyIn) { 52 | masterKey = masterKeyIn; 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/wrappers/CheckWrappers.java: -------------------------------------------------------------------------------- 1 | package org.openintents.safe.wrappers; 2 | 3 | import org.openintents.safe.wrappers.icecreamsandwich.WrapNotificationBuilder; 4 | 5 | public class CheckWrappers { 6 | 7 | public static boolean mNotificationBuilderAvailable; 8 | 9 | static { 10 | try { 11 | WrapNotificationBuilder.checkAvailable(); 12 | mNotificationBuilderAvailable = true; 13 | } catch (Throwable t) { 14 | mNotificationBuilderAvailable = false; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/safe/wrappers/icecreamsandwich/WrapNotificationBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2012 OpenIntents.org 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.openintents.safe.wrappers.icecreamsandwich; 17 | 18 | import android.annotation.SuppressLint; 19 | import android.app.Notification; 20 | import android.app.Notification.Builder; 21 | import android.app.NotificationManager; 22 | import android.app.PendingIntent; 23 | import android.content.Context; 24 | 25 | /** 26 | * Notification was introduced with Honeycomb, however this wrapper is targeted 27 | * at Ice Cream Sandwich to handle setProgress(). The setProgress is included in 28 | * the NotificationCompat.Builder, however it doesn't do anything. So if you use 29 | * it, nothing shows even on ICS. Thus use a wrapper for the real API here and 30 | * over in ServiceNotification, if less than ICS, use 31 | * NotificationCompat.Builder. 32 | */ 33 | @SuppressLint("NewApi") 34 | public class WrapNotificationBuilder { 35 | 36 | private Builder mInstance; 37 | 38 | static { 39 | try { 40 | Class.forName("android.app.Notification$Builder"); 41 | } catch (Exception ex) { 42 | throw new RuntimeException(ex); 43 | } 44 | } 45 | 46 | /* calling here forces class initialization */ 47 | public static void checkAvailable() { 48 | } 49 | 50 | public WrapNotificationBuilder(Context context) { 51 | mInstance = new Notification.Builder(context); 52 | } 53 | 54 | public Builder GetBuilder() { 55 | return mInstance; 56 | } 57 | 58 | public void setContentTitle(CharSequence title) { 59 | mInstance.setContentTitle(title); 60 | } 61 | 62 | public void setContentText(CharSequence text) { 63 | mInstance.setContentText(text); 64 | } 65 | 66 | public void setSmallIcon(int icon) { 67 | mInstance.setSmallIcon(icon); 68 | } 69 | 70 | public void setOngoing(boolean ongoing) { 71 | mInstance.setOngoing(ongoing); 72 | } 73 | 74 | public void setContentIntent(PendingIntent intent) { 75 | mInstance.setContentIntent(intent); 76 | } 77 | 78 | public void setProgress(int max, int progress, boolean indeterminate) { 79 | mInstance.setProgress(max, progress, indeterminate); 80 | } 81 | 82 | @SuppressWarnings("deprecation") 83 | public void notifyManager(NotificationManager nm, int id) { 84 | nm.notify(id, mInstance.getNotification()); 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /Safe/src/main/java/org/openintents/util/SecureDelete.java: -------------------------------------------------------------------------------- 1 | package org.openintents.util; 2 | 3 | import android.util.Log; 4 | 5 | import java.io.File; 6 | import java.io.FileNotFoundException; 7 | import java.io.IOException; 8 | import java.io.RandomAccessFile; 9 | import java.nio.MappedByteBuffer; 10 | import java.nio.channels.FileChannel; 11 | import java.security.SecureRandom; 12 | 13 | import estreamj.ciphers.trivium.Trivium; 14 | import estreamj.framework.ESJException; 15 | 16 | /** 17 | * Secure file delete. 18 | * 19 | * @author Peli 20 | */ 21 | public class SecureDelete { 22 | private static final String TAG = "SecureDelete"; 23 | 24 | /** 25 | * Securely delete a file. 26 | *

27 | * Currently, there is only 1 pass that overwrites the file first 28 | * with a random bit stream generated by Trivium. 29 | * 30 | * @param file 31 | * @return true if this File was deleted, false otherwise. 32 | */ 33 | public static boolean delete(File file) { 34 | 35 | if (file.exists()) { 36 | SecureRandom random = new SecureRandom(); 37 | 38 | Trivium tri = new Trivium(); 39 | 40 | try { 41 | RandomAccessFile raf = new RandomAccessFile(file, "rw"); 42 | FileChannel channel = raf.getChannel(); 43 | MappedByteBuffer buffer = channel.map( 44 | FileChannel.MapMode.READ_WRITE, 0, raf.length() 45 | ); 46 | 47 | byte[] key = new byte[10]; 48 | byte[] nonce = new byte[10]; 49 | random.nextBytes(key); 50 | random.nextBytes(nonce); 51 | 52 | tri.setupKey( 53 | Trivium.MODE_DECRYPT, 54 | key, 0 55 | ); 56 | tri.setupNonce(nonce, 0); 57 | 58 | int buffersize = 1024; 59 | byte[] bytes = new byte[1024]; 60 | 61 | // overwrite with random numbers 62 | while (buffer.hasRemaining()) { 63 | int max = buffer.limit() - buffer.position(); 64 | if (max > buffersize) { 65 | max = buffersize; 66 | } 67 | //random.nextBytes(bytes); 68 | 69 | tri.process( 70 | bytes, 0, 71 | bytes, 0, max 72 | ); 73 | 74 | buffer.put(bytes, 0, max); 75 | } 76 | buffer.force(); 77 | buffer.rewind(); 78 | 79 | } catch (FileNotFoundException e) { 80 | Log.d(TAG, "FileNotFoundException", e); 81 | } catch (IOException e) { 82 | Log.d(TAG, "IOException", e); 83 | } catch (ESJException e) { 84 | Log.d(TAG, "ESJException", e); 85 | } 86 | return file.delete(); 87 | } 88 | return false; 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /Safe/src/main/res/anim/cycle_7.xml: -------------------------------------------------------------------------------- 1 | 19 | 20 | 22 | -------------------------------------------------------------------------------- /Safe/src/main/res/anim/shake.xml: -------------------------------------------------------------------------------- 1 | 19 | 20 | 25 | -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-hdpi-v11/ic_menu_add_password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-hdpi-v11/ic_menu_add_password.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-hdpi-v11/ic_menu_switch_alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-hdpi-v11/ic_menu_switch_alpha.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-hdpi-v11/ic_menu_switch_numeric.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-hdpi-v11/ic_menu_switch_numeric.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-hdpi-v5/ic_launcher_safe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-hdpi-v5/ic_launcher_safe.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-ldpi-v11/ic_menu_add_password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-ldpi-v11/ic_menu_add_password.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-ldpi-v11/ic_menu_switch_alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-ldpi-v11/ic_menu_switch_alpha.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-ldpi-v11/ic_menu_switch_numeric.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-ldpi-v11/ic_menu_switch_numeric.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-ldpi-v5/ic_launcher_safe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-ldpi-v5/ic_launcher_safe.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-mdpi-v11/ic_menu_add_password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-mdpi-v11/ic_menu_add_password.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-mdpi-v11/ic_menu_switch_alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-mdpi-v11/ic_menu_switch_alpha.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-mdpi-v11/ic_menu_switch_numeric.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-mdpi-v11/ic_menu_switch_numeric.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-mdpi-v5/ic_launcher_safe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-mdpi-v5/ic_launcher_safe.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-xhdpi-v11/ic_menu_add_password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-xhdpi-v11/ic_menu_add_password.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-xhdpi-v11/ic_menu_switch_alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-xhdpi-v11/ic_menu_switch_alpha.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-xhdpi-v11/ic_menu_switch_numeric.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-xhdpi-v11/ic_menu_switch_numeric.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable-xhdpi-v5/ic_launcher_safe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable-xhdpi-v5/ic_launcher_safe.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable/ic_launcher_folder_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable/ic_launcher_folder_small.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable/ic_launcher_safe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable/ic_launcher_safe.png -------------------------------------------------------------------------------- /Safe/src/main/res/drawable/passicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openintents/safe/a25a90afac11a861d62135869002969fd817e900/Safe/src/main/res/drawable/passicon.png -------------------------------------------------------------------------------- /Safe/src/main/res/layout-land/front_door.xml: -------------------------------------------------------------------------------- 1 | 19 | 23 | 24 | 30 | 31 | 41 | 42 | 49 | 50 | 56 | 57 | 64 | 65 |