├── settings.gradle ├── gradle.properties ├── Android-PwdHash.zip ├── .idea ├── copyright │ └── profiles_settings.xml ├── compiler.xml ├── vcs.xml ├── modules.xml ├── runConfigurations.xml ├── gradle.xml ├── misc.xml ├── jarRepositories.xml └── codeStyles │ └── Project.xml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── app ├── src │ ├── main │ │ ├── res │ │ │ ├── drawable-hdpi │ │ │ │ └── icon.png │ │ │ ├── drawable-ldpi │ │ │ │ └── icon.png │ │ │ ├── drawable-mdpi │ │ │ │ └── icon.png │ │ │ ├── drawable-xhdpi │ │ │ │ └── icon.png │ │ │ ├── drawable-xxhdpi │ │ │ │ └── icon.png │ │ │ ├── drawable-xxxhdpi │ │ │ │ └── icon.png │ │ │ ├── values │ │ │ │ ├── theme.xml │ │ │ │ ├── geometry.xml │ │ │ │ ├── style.xml │ │ │ │ └── strings.xml │ │ │ ├── values-v11 │ │ │ │ ├── theme.xml │ │ │ │ └── style.xml │ │ │ ├── values-v21 │ │ │ │ ├── theme.xml │ │ │ │ ├── geometry.xml │ │ │ │ └── style.xml │ │ │ ├── values-ar │ │ │ │ └── strings.xml │ │ │ ├── values-nl-rNL │ │ │ │ └── strings.xml │ │ │ ├── values-zh-rCN │ │ │ │ └── strings.xml │ │ │ ├── values-ko │ │ │ │ └── strings.xml │ │ │ ├── values-ja │ │ │ │ └── strings.xml │ │ │ ├── values-ca │ │ │ │ └── strings.xml │ │ │ ├── values-nb-rNO │ │ │ │ └── strings.xml │ │ │ ├── values-tr │ │ │ │ └── strings.xml │ │ │ ├── values-cs │ │ │ │ └── strings.xml │ │ │ ├── values-pl │ │ │ │ └── strings.xml │ │ │ ├── values-pt-rBR │ │ │ │ └── strings.xml │ │ │ ├── values-it │ │ │ │ └── strings.xml │ │ │ ├── values-uk │ │ │ │ └── strings.xml │ │ │ ├── values-ru │ │ │ │ └── strings.xml │ │ │ ├── values-hr │ │ │ │ └── strings.xml │ │ │ ├── values-vi │ │ │ │ └── strings.xml │ │ │ ├── values-ro-rRO │ │ │ │ └── strings.xml │ │ │ ├── values-de │ │ │ │ └── strings.xml │ │ │ ├── values-el │ │ │ │ └── strings.xml │ │ │ ├── values-es │ │ │ │ └── strings.xml │ │ │ ├── values-fr │ │ │ │ └── strings.xml │ │ │ └── layout │ │ │ │ └── main.xml │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── uploadedlobster │ │ │ └── PwdHash │ │ │ ├── util │ │ │ ├── Constants.kt │ │ │ └── Preferences.kt │ │ │ ├── storage │ │ │ ├── UpdateHistoryTask.kt │ │ │ ├── HistoryOpenHelper.kt │ │ │ └── HistoryDataSource.kt │ │ │ ├── algorithm │ │ │ ├── DomainExtractor.kt │ │ │ └── HashedPassword.kt │ │ │ └── activities │ │ │ └── PwdHashApp.kt │ └── androidTest │ │ ├── res │ │ ├── drawable │ │ │ └── icon.png │ │ └── values │ │ │ └── strings.xml │ │ └── java │ │ └── com │ │ └── uploadedlobster │ │ └── PwdHash │ │ ├── utils │ │ └── ToastMatcher.java │ │ ├── PreferencesTest.java │ │ ├── DomainExtractorTest.java │ │ ├── HashedPasswordTest.java │ │ └── MainActivityTest.java ├── lint.xml └── build.gradle ├── TODO ├── .gitignore ├── README.md ├── LICENSE ├── gradlew.bat ├── design ├── feature-graphic.svg └── icon.svg ├── ChangeLog └── gradlew /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | android.enableJetifier=true 2 | android.useAndroidX=true -------------------------------------------------------------------------------- /Android-PwdHash.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phw/Android-PwdHash/HEAD/Android-PwdHash.zip -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phw/Android-PwdHash/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phw/Android-PwdHash/HEAD/app/src/main/res/drawable-hdpi/icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-ldpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phw/Android-PwdHash/HEAD/app/src/main/res/drawable-ldpi/icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phw/Android-PwdHash/HEAD/app/src/main/res/drawable-mdpi/icon.png -------------------------------------------------------------------------------- /app/src/androidTest/res/drawable/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phw/Android-PwdHash/HEAD/app/src/androidTest/res/drawable/icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phw/Android-PwdHash/HEAD/app/src/main/res/drawable-xhdpi/icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phw/Android-PwdHash/HEAD/app/src/main/res/drawable-xxhdpi/icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phw/Android-PwdHash/HEAD/app/src/main/res/drawable-xxxhdpi/icon.png -------------------------------------------------------------------------------- /app/src/androidTest/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Password HashTest 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values/theme.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values-v11/theme.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /TODO: -------------------------------------------------------------------------------- 1 | * Copy to clipboard and open browser 2 | * Allow cleartext password field 3 | * Better notify user about empty input (flash/animate the TextEdit) 4 | * Place Password Hash in notification area for quick access -------------------------------------------------------------------------------- /app/src/main/res/values-v21/theme.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/workspace.xml 6 | /.idea/libraries 7 | .DS_Store 8 | Thumbs.db 9 | build/ 10 | app/release/ 11 | /captures 12 | .externalNativeBuild 13 | *~ 14 | -------------------------------------------------------------------------------- /app/src/main/res/values/geometry.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 448dp 4 | 12dp 5 | 4dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values-v21/geometry.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 448dp 4 | 24dp 5 | 8dp 6 | 7 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Sep 27 15:15:10 CEST 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip 7 | -------------------------------------------------------------------------------- /app/lint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-ar/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Password Hash 4 | Site address 5 | http://example.com 6 | كلمة المرور 7 | Hash: 8 | نسخ 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/style.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values-nl-rNL/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Wachtwoord hash 4 | Website adres 5 | http://www.example.nl 6 | Wachtwoord 7 | Hash: 8 | Kopiëren 9 | Wachtwoord gekopieerd naar het klembord 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-v11/style.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/values-zh-rCN/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 密码加密 4 | 根据网址生成密码的小工具,可以通过浏览器的“分享页面”选项激活,或直接使用。与pwdhash.com生成的密码兼容。 5 | 本应用是自由软件,使用开源协议发布。 6 | 网址 7 | http://example.com 8 | 原始密码 9 | 加密密码 10 | 复制 11 | 密码已复制到剪贴板 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-v21/style.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/values-ko/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 비밀번호 생성기 4 | 훔쳐가기 힘든 암호를 웹 사이트 별로 생성하는 가벼운 도구입니다. 안드로이드 웹 브라우저에서 \"공유\" 옵션을 사용하거나, Password Hash를 바로 실행하시면 사용하실 수 있습니다. pwdhash.com과 호환됩니다. 5 | 6 | 이 앱은 오픈소스 라이선스 적용을 받는 무료 소프트웨어입니다. 7 | 사이트 주소 8 | http://example.com 9 | 비밀번호 10 | 생성된 비밀번호: 11 | 복사 12 | 비밀번호가 클립보드로 복사되었습니다 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-ja/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Password Hash 4 | ウェブサイトを指定して、盗難耐性パスワードを生成する、軽量のツールです。Android のブラウザから \"ページを共有\" オプションを使用するだけです。Password Hash を直接開くこともできます。 pwdhash.com と互換性があります。 5 | 6 | このアプリはオープンソースライセンスで公開されるフリーソフトウェアです。 7 | サイトアドレス 8 | http://example.com 9 | パスワード 10 | ハッシュ: 11 | コピー 12 | パスワードをクリップボードにコピーしました 13 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-ca/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Password Hash 4 | Aplicació per generar contrasenyes segures per llocs web. Feu servir \"Compartir\" al vostre navegador Android o obriu Password Hash directament. Compatible amb pwdhash.com. 5 | 6 | Aplicación es distribueix lliurement sota llicencia open source. 7 | Lloc web 8 | http://example.com 9 | Password 10 | Hash: 11 | Copiar 12 | Contrasenya copiada al portapapers 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/values-nb-rNO/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Passordsjekksum 4 | Et lett verktøy for å generere nettsidespesifikke, tyverisikre passord. Trykk på \"Del side\" i Android-nettleseren eller åpne Passordsjekksum direkte. Kompatibelt med pwdhash.com. 5 | 6 | Dette programmet er publisert med en friprog-lisens. 7 | Sideadresse 8 | http://eksempel.no 9 | Passord 10 | Sjekksum: 11 | Kopier 12 | Passord kopiert til utklippstavle 13 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Password Hash 4 | Lightweight tool to generate website specific, theft-resistant passwords. Just use the "Share page" option in the Android browser or open Password Hash directly. Compatible with pwdhash.com. 5 | 6 | This app is free software published under an open source license. 7 | Site address 8 | http://example.com 9 | Password 10 | Hash: 11 | Copy 12 | Password copied to clipboard 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-tr/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Şifre Hash 4 | Özel web sitesi oluşturmak, hırsızlığa dayanıklı şifre yaratmak için hafif bir araçtır. Android tarayıcısında \'Paylaş\' butonunu kullanın veya Şifre Hash\'ı doğrudan açın. pwdhash.com ile uyumludur. 5 | 6 | Bu uygulama açık kaynak lisansı altında yayınlanan ücretsiz bir yazılımdır. 7 | Site adresi 8 | http://ornek.com 9 | Şifre 10 | Hash: 11 | Kopyala 12 | Şifre panoya kopyalandı 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-cs/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Password Hash 4 | Jednoduchý nástroj pro generování hesel odolných proti krádeži. Stačí použít možnost „Sdílet stránku“ v Android prohlížeči nebo přímo otevřít Password Hash. Kompatibilní s psdhash.com. 5 | 6 | Tato aplikace je svobodný software publikovaný pod open source licencí. 7 | Adresa stránky 8 | http://example.com 9 | Heslo 10 | Hash: 11 | Zkopírovat 12 | Heslo bylo zkopírováno do schránky 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-pl/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Hash hasła 4 | Lekkie narzędzie do generowania antywłamaniowy, konkretnych haseł do stron. Wystarczy skorzystać z opcji \"Poleć stronę\" w przeglądarce Android lub otworzyć Hash hasło bezpośrednio. Kompatybilne z pwdhash.com. 5 | 6 | Ta aplikacja jest darmowym oprogramowaniem na licencji open source. 7 | Adres strony 8 | http://przyklad.pl 9 | Hasło 10 | Hash: 11 | Kopiuj 12 | Hasło skopiowane do schowka 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-pt-rBR/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Password Hash 4 | Aplicativo para geração de senhas seguras para a internet. Use a opção \"Compartilhar página\" no navegador do Android ou abra Password Hash diretamente. Compatível com pwdhash.com. 5 | 6 | Este aplicativo é um software livre, lançado sob de código aberto. 7 | Endereço do site 8 | http://exemplo.com 9 | Senha 10 | Senha segura: 11 | Copiar 12 | Senha copiada para a área de transferência 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-it/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Password Hash 4 | Strumento leggero per generare password a prova di furto, specifiche per il web. Usa solo l\'opzione \"Condividi pagina\" nel tuo browser Android o apri direttamente Password Hash. Compatibile con pwdhash.com 5 | 6 | Questa app è software libero pubblicato sotto una licenza open source. 7 | Indirizzo del sito 8 | http://example.com 9 | Password 10 | Hash: 11 | Copia 12 | Password copiata negli appunti 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-uk/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Password Hash 4 | Зручний інструмент для створення надійних паролів, прив\'язаних до конкретних сайтів. Просто використовуйте опцію \"Поділитись сторінкою\" в браузері або введіть дані прямо в Password Hash. Повністю сумісний з pwdhash.com. 5 | Цей додаток безкоштовний і поширюється під відкритою ліцензією. 6 | Адреса сайту 7 | http://example.com 8 | Пароль 9 | Хеш: 10 | Копіювати 11 | Пароль скопійований в буфер обміну 12 | -------------------------------------------------------------------------------- /app/src/main/res/values-ru/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Password Hash 4 | Удобный инструмент для создания паролей, привязанных к конкретным сайтам, из одного мастер-пароля. Просто используйте опцию \"Отправить страницу\" в браузере или вручную введите данные в Password Hash. Полностью совместим с pwdhash.com. 5 | 6 | Это приложение бесплатное и распространяется под открытой лицензией. 7 | Адрес сайта 8 | http://example.com 9 | Пароль 10 | Хеш: 11 | Копировать 12 | Пароль скопирован в буфер обмена 13 | 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Android PwdHash 2 | =============== 3 | 4 | Description 5 | ----------- 6 | Lightweight tool to generate website specific, theft-resistant passwords. Just 7 | use the "Share page" option in the Android browser or open Password Hash 8 | directly. Based upon and compatible with pwdhash.com. 9 | 10 | License 11 | ------- 12 | Android PwdHash is free software published under a BSD style open source license. 13 | See LICENSE for details. 14 | 15 | Translations 16 | ------------ 17 | You can help translate this project into your language. Please visit the Android PwdHash 18 | localization project on https://translate.uploadedlobster.com/engage/android-pwdhash/ 19 | 20 | Known Issues 21 | ----------- 22 | * Android PwdHash does not allow empty passwords for generating the hash, while 23 | pwdhash.com does. 24 | 25 | Author 26 | ------ 27 | Philipp Wolfer 28 | -------------------------------------------------------------------------------- /app/src/main/res/values-hr/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Password Hash 4 | Lagani alat za generiranje posebnih, otpornih na krađu lozinki. Samo iskoristite \"Share page\" opciju u Android Pretraživaču ili izravno otvorite Password Hash. Kompatibilno sa pwdhash.com 5 | 6 | Ova aplikacija je besplatan software izdan pod open-source licencom. (Preveo: Marijan Smetko, Novska, Hrvatska) 7 | Adresa stranice 8 | http://example.com 9 | Lozinka 10 | Hash: 11 | Kopiraj 12 | Lozinka je kopirana u međuspremnik 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-vi/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Mã hóa mật khẩu 4 | Là công cụ gọn nhẹ để nhúng vào các website, chống khả năng dòm trộm mật khẩu. Chỉ sử dụng tùy chọn \"Trang chia sẻ\" trong trình duyệt Android hoặc tác động đến việc hash hay còn gọi là băm mật khẩu trực tiếp. Tương thích với pwdhash.com. 5 | 6 | Phần mềm này được phân phối dưới dạng giấy phép mã nguồn mở. 7 | Địa chỉ trang web 8 | http://thídụ.com 9 | Mật khẩu 10 | Mã khóa: 11 | Sao chép 12 | Mật khẩu đã được lưu vào bộ nhớ ảo 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-ro-rRO/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Password Hash 4 | Un instrument lejer pentru generarea de parole rezistente la fraude, şi specifice site-urilor web. Trebuie doar să folosiţi opţiunea \"Partajare pagină\" din browserul Android, sau deschideţi direct Password Hash. Compatibil cu pwdhash.com. 5 | 6 | Această aplicaţie este un program gratuit publicat sub licenţă open source. 7 | Adresa sitului 8 | http://example.com 9 | Parola 10 | Hash: 11 | Copiere 12 | Parolă copiată în clipboard 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-de/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Password Hash 4 | Leichtgewichtiges Tool zum Erzeugen von diebstahlsicheren Passwörtern. Password Hash kann einfach über die \"Seitenlink weiterleiten\" Option im Browser oder direkt gestartet werden. Kompatibel mit pwdhash.com. 5 | 6 | Diese App ist freie Software, die unter einer Open-Source-Lizenz bereitgestellt wird. 7 | Adresse der Webseite 8 | http://example.com 9 | Passwort 10 | Hash: 11 | Kopieren 12 | Das Passwort wurde in die Zwischenablage kopiert 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-el/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Password Hash 4 | Ελαφρύ εργαλείο για να δημιουργήσει ιστοσελίδα συγκεκριμένη, κλοπή ανθεκτικών κωδικών πρόσβασης. Απλά χρησιμοποιήστε την \"Κοινή χρήση σελίδας\" στο πρόγραμμα περιήγησης Android ή ανοιχτό Hash κωδικό άμεσα. Συμβατό με pwdhash.com 5 | 6 | Αυτή η εφαρμογή είναι δωρεάν λογισμικό δημοσιευμένο με άδεια ανοιχτού κώδικα. 7 | Διεύθυνση ιστοσελίδας 8 | http://example.com 9 | Κωδικός 10 | Δίεση: 11 | Αντιγραφή 12 | Ο κωδικός αντιγράφεται στο πρόχειρο 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-es/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Password Hash 4 | Herramienta ligera para generar contraseñas resistentes al robo, para sitios web específicos. Simplemente use la opción \"Compartir página\" en el navegador de Android, o directamente abra Password Hash. Compatible con pwdhash.com 5 | 6 | Esta aplicación es software libre publicado bajo una licencia de código abierto. 7 | Dirección del sitio 8 | http://example.com 9 | Contraseña 10 | Hash: 11 | Copiar 12 | Contraseña copiada al portapapeles 13 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/values-fr/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Mot de passe chiffré 4 | Utilitaire léger pour générer des mots de passe fiables contre les intrusions et spécifiques aux sites Web. Utiliser simplement l\'option « Partager page » dans le navigateur Android ou ouvrir Mot de passe chiffré directement. Compatible avec pwdhash.com. 5 | 6 | Cette appli est un logiciel gratuit publié sous licence « open source ». 7 | Adresse du site 8 | http://exemple.com 9 | Mot de passe 10 | Mot de passe chiffré : 11 | Copier 12 | Le mot de passe a été copié dans le presse-papiers 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/uploadedlobster/PwdHash/utils/ToastMatcher.java: -------------------------------------------------------------------------------- 1 | package com.uploadedlobster.PwdHash.utils; 2 | 3 | import android.os.IBinder; 4 | import androidx.test.espresso.Root; 5 | import android.view.WindowManager; 6 | 7 | import org.hamcrest.Description; 8 | import org.hamcrest.TypeSafeMatcher; 9 | 10 | class ToastMatcher extends TypeSafeMatcher { 11 | 12 | @Override 13 | public void describeTo(Description description) { 14 | description.appendText("is toast"); 15 | } 16 | 17 | @Override 18 | public boolean matchesSafely(Root root) { 19 | int type = root.getWindowLayoutParams().get().type; 20 | if ((type == WindowManager.LayoutParams.TYPE_TOAST)) { 21 | IBinder windowToken = root.getDecorView().getWindowToken(); 22 | IBinder appToken = root.getDecorView().getApplicationWindowToken(); 23 | if (windowToken == appToken) { 24 | //means this window isn't contained by any other windows. 25 | return true; 26 | } 27 | } 28 | return false; 29 | } 30 | } -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | android { 5 | compileSdkVersion 31 6 | buildToolsVersion '30.0.3' 7 | defaultConfig { 8 | applicationId "com.uploadedlobster.PwdHash" 9 | minSdkVersion 17 10 | targetSdkVersion 31 11 | testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' 12 | versionCode 26 13 | versionName '1.3.15' 14 | } 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 19 | } 20 | } 21 | return void 22 | } 23 | 24 | dependencies { 25 | testImplementation 'junit:junit:4.13.2' 26 | androidTestImplementation 'androidx.annotation:annotation:1.2.0' 27 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' 28 | androidTestImplementation 'androidx.test.ext:junit:1.1.3' 29 | implementation "androidx.core:core-ktx:1.6.0" 30 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 31 | } 32 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/uploadedlobster/PwdHash/PreferencesTest.java: -------------------------------------------------------------------------------- 1 | package com.uploadedlobster.PwdHash; 2 | 3 | import android.content.Context; 4 | import androidx.test.platform.app.InstrumentationRegistry; 5 | import androidx.test.ext.junit.runners.AndroidJUnit4; 6 | 7 | import com.uploadedlobster.PwdHash.util.Preferences; 8 | 9 | import org.junit.Test; 10 | import org.junit.runner.RunWith; 11 | 12 | import static org.junit.Assert.assertEquals; 13 | import static org.junit.Assert.assertNotEquals; 14 | 15 | @RunWith(AndroidJUnit4.class) 16 | public class PreferencesTest { 17 | @Test 18 | public void testSaveSiteAddress() { 19 | final Context context = InstrumentationRegistry.getTargetContext(); 20 | Preferences preferences = new Preferences(context); 21 | 22 | String urlToSave = "https://www.example.com/storage-test"; 23 | String urlLoaded = preferences.getSavedSiteAddress(); 24 | 25 | assertNotEquals(urlToSave, urlLoaded); 26 | 27 | preferences.setSavedSiteAddress(urlToSave); 28 | urlLoaded = preferences.getSavedSiteAddress(); 29 | assertEquals(urlToSave, urlLoaded); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | PwdHash for Android is Copyright (c) 2010-2011 Philipp Wolfer 2 | 3 | Redistribution and use in source and binary forms, with or without 4 | modification, are permitted provided that the following conditions 5 | are met: 6 | 1. Redistributions of source code must retain the above copyright 7 | notice, this list of conditions and the following disclaimer. 8 | 2. Redistributions in binary form must reproduce the above copyright 9 | notice, this list of conditions and the following disclaimer in the 10 | documentation and/or other materials provided with the distribution. 11 | 3. Neither the name of PwdHash for Android nor the names of the 12 | contributors may be used to endorse or promote products derived from 13 | this software without specific prior written permission. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 21 | TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 22 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 23 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 24 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 29 | 30 | 34 | 35 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/uploadedlobster/PwdHash/DomainExtractorTest.java: -------------------------------------------------------------------------------- 1 | package com.uploadedlobster.PwdHash; 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4; 4 | 5 | import com.uploadedlobster.PwdHash.algorithm.DomainExtractor; 6 | 7 | import org.junit.Before; 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import java.util.HashMap; 12 | import java.util.Map; 13 | 14 | import static org.junit.Assert.assertEquals; 15 | 16 | /** 17 | * @author Philipp Wolfer 18 | */ 19 | @RunWith(AndroidJUnit4.class) 20 | public class DomainExtractorTest { 21 | 22 | private static HashMap testSamples; 23 | 24 | @Before 25 | public void setUp() throws Exception { 26 | testSamples = new HashMap<>(); 27 | testSamples.put("example.com", "example.com"); 28 | testSamples.put("http://example.com", "example.com"); 29 | testSamples.put("http://example.com/aPath/test.html", "example.com"); 30 | testSamples.put("http://www.example.com", "example.com"); 31 | testSamples.put("https://www.example.com", "example.com"); 32 | testSamples.put("http://www.example.com/aPath/test.html", "example.com"); 33 | testSamples.put("http://login.test.example.com", "example.com"); 34 | testSamples.put("http://example.co.uk", "example.co.uk"); 35 | testSamples.put("http://login.example.co.uk", "example.co.uk"); 36 | testSamples.put("https://login.example.co.uk/test.htm", "example.co.uk"); 37 | } 38 | 39 | @Test 40 | public void testExtractDomain() throws Exception { 41 | for (Map.Entry t : testSamples.entrySet()) { 42 | assertEquals(t.getValue(), 43 | DomainExtractor.extractDomain(t.getKey())); 44 | } 45 | } 46 | 47 | @Test 48 | public void testExtractDomainWithEmptyStringInput() throws Exception { 49 | assertEquals("", DomainExtractor.extractDomain("")); 50 | } 51 | 52 | @Test(expected = IllegalArgumentException.class) 53 | public void testExtractDomainWithNullInput() throws Exception { 54 | DomainExtractor.extractDomain(null); 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/com/uploadedlobster/PwdHash/util/Constants.kt: -------------------------------------------------------------------------------- 1 | /** 2 | * PwdHash, Constants.java 3 | * A password hash implementation for Android. 4 | * 5 | * Copyright (c) 2012 Philipp Wolfer 6 | * 7 | * Redistribution and use in source and binary forms, with or without 8 | * modification, are permitted provided that the following conditions 9 | * are met: 10 | * 1. Redistributions of source code must retain the above copyright 11 | * notice, this list of conditions and the following disclaimer. 12 | * 2. Redistributions in binary form must reproduce the above copyright 13 | * notice, this list of conditions and the following disclaimer in the 14 | * documentation and/or other materials provided with the distribution. 15 | * 3. Neither the name of the RBrainz project nor the names of the 16 | * contributors may be used to endorse or promote products derived from 17 | * this software without specific prior written permission. 18 | * 19 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 25 | * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 26 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 27 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | * 31 | * @author Philipp Wolfer @gmail.com> 32 | */ 33 | package com.uploadedlobster.PwdHash.util 34 | 35 | object Constants { 36 | const val PREFERENCES_NAME = "com.uploadedlobster.pwdhash.preferences" 37 | const val PREFERENCE_SAVED_SITE_ADDRESS = "saved_uri" 38 | const val DATABASE_NAME = "pwdhash" 39 | const val DATABASE_VERSION = 1 40 | } -------------------------------------------------------------------------------- /app/src/main/java/com/uploadedlobster/PwdHash/storage/UpdateHistoryTask.kt: -------------------------------------------------------------------------------- 1 | /** 2 | * PwdHash, UpdateHistoryTask.java 3 | * A password hash implementation for Android. 4 | * 5 | * Copyright (c) 2012 Philipp Wolfer 6 | * 7 | * Redistribution and use in source and binary forms, with or without 8 | * modification, are permitted provided that the following conditions 9 | * are met: 10 | * 1. Redistributions of source code must retain the above copyright 11 | * notice, this list of conditions and the following disclaimer. 12 | * 2. Redistributions in binary form must reproduce the above copyright 13 | * notice, this list of conditions and the following disclaimer in the 14 | * documentation and/or other materials provided with the distribution. 15 | * 3. Neither the name of the RBrainz project nor the names of the 16 | * contributors may be used to endorse or promote products derived from 17 | * this software without specific prior written permission. 18 | * 19 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 25 | * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 26 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 27 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | * 31 | * @author Philipp Wolfer @gmail.com> 32 | */ 33 | package com.uploadedlobster.PwdHash.storage 34 | 35 | import android.os.AsyncTask 36 | 37 | class UpdateHistoryTask(private val mDataSource: HistoryDataSource) : 38 | AsyncTask() { 39 | override fun doInBackground(vararg params: String?): Void? { 40 | for (realm in params) { 41 | if (realm != null) { 42 | mDataSource.insertHistoryEntry(realm) 43 | } 44 | } 45 | return null 46 | } 47 | } -------------------------------------------------------------------------------- /app/src/main/java/com/uploadedlobster/PwdHash/util/Preferences.kt: -------------------------------------------------------------------------------- 1 | /** 2 | * PwdHash, Preferences.java 3 | * A password hash implementation for Android. 4 | * 5 | * Copyright (c) 2012 Philipp Wolfer 6 | * 7 | * Redistribution and use in source and binary forms, with or without 8 | * modification, are permitted provided that the following conditions 9 | * are met: 10 | * 1. Redistributions of source code must retain the above copyright 11 | * notice, this list of conditions and the following disclaimer. 12 | * 2. Redistributions in binary form must reproduce the above copyright 13 | * notice, this list of conditions and the following disclaimer in the 14 | * documentation and/or other materials provided with the distribution. 15 | * 3. Neither the name of the RBrainz project nor the names of the 16 | * contributors may be used to endorse or promote products derived from 17 | * this software without specific prior written permission. 18 | * 19 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 25 | * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 26 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 27 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | * 31 | * @author Philipp Wolfer @gmail.com> 32 | */ 33 | package com.uploadedlobster.PwdHash.util 34 | 35 | import android.content.Context 36 | import android.content.SharedPreferences 37 | 38 | class Preferences(packageContext: Context) { 39 | private val mSettings: SharedPreferences = packageContext.getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE) 40 | 41 | var savedSiteAddress: String? 42 | get() = mSettings.getString(Constants.PREFERENCE_SAVED_SITE_ADDRESS, "") 43 | set(siteAddress) { 44 | val editor = mSettings.edit() 45 | editor.putString(Constants.PREFERENCE_SAVED_SITE_ADDRESS, siteAddress) 46 | editor.apply() 47 | } 48 | 49 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/com/uploadedlobster/PwdHash/HashedPasswordTest.java: -------------------------------------------------------------------------------- 1 | package com.uploadedlobster.PwdHash; 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4; 4 | 5 | import com.uploadedlobster.PwdHash.algorithm.HashedPassword; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.assertEquals; 11 | 12 | /** 13 | * @author Philipp Wolfer 14 | */ 15 | @RunWith(AndroidJUnit4.class) 16 | public class HashedPasswordTest { 17 | 18 | @Test 19 | public void testToString() { 20 | HashedPassword hashedPassword = HashedPassword.create("my53cret#", 21 | "example.com"); 22 | assertEquals("Bu6aSm+Zcsf", hashedPassword.toString()); 23 | } 24 | 25 | @Test 26 | public void testToStringWithNonAsciiChars() { 27 | HashedPassword hashedPassword = HashedPassword.create("mü53crét#", 28 | "example.com"); 29 | assertEquals("r9qeSjv+lwJ", hashedPassword.toString()); 30 | } 31 | 32 | @Test 33 | public void testToStringWithNonLatin1Chars() { 34 | HashedPassword hashedPassword = HashedPassword.create("中文العربي", 35 | "example.com"); 36 | assertEquals("AwMz3+BdMT", hashedPassword.toString()); 37 | } 38 | 39 | @Test 40 | public void testToStringWithoutNonAlphanumeric() { 41 | HashedPassword hashedPassword = HashedPassword.create("my53cret", 42 | "example.com"); 43 | assertEquals("CIUD4SCSgh", hashedPassword.toString()); 44 | } 45 | 46 | @Test 47 | public void testToStringWithShortSecret() { 48 | HashedPassword hashedPassword = HashedPassword.create("ab", 49 | "example.com"); 50 | assertEquals("0IKv", hashedPassword.toString()); 51 | } 52 | 53 | @Test 54 | public void testToStringWithShortestSecret() { 55 | HashedPassword hashedPassword = HashedPassword.create("a", 56 | "example.com"); 57 | assertEquals("9FBo", hashedPassword.toString()); 58 | } 59 | 60 | @Test 61 | public void testToStringWithLongSecret() { 62 | HashedPassword hashedPassword = HashedPassword.create( 63 | "abcdefghijklmnopqrstuvwxyz0123456789=", "example.com"); 64 | String result = hashedPassword.toString(); 65 | 66 | // The original algorithm appends NULL bytes at the end. 67 | // Those bytes should not be part of the output. 68 | // "XO3u58jVa1nd+8qd08SDIQ\0\0\0\0" 69 | assertEquals("XO3u58jVa1nd+8qd08SDIQ", result); 70 | } 71 | 72 | @Test(expected = IllegalArgumentException.class) 73 | public void testToStringWithEmptySecret() { 74 | HashedPassword hashedPassword = HashedPassword.create("", 75 | "example.com"); 76 | hashedPassword.toString(); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /app/src/main/res/layout/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 12 | 13 | 18 | 19 | 26 | 27 | 32 | 33 | 40 | 41 | 46 | 47 | 53 | 54 | 60 | 61 | 62 | 67 | 68 |