├── settings.gradle ├── app ├── libs │ ├── mail.jar │ ├── activation.jar │ ├── additionnal.jar │ └── tokenautocomplete.jar ├── src │ ├── main │ │ ├── jniLibs │ │ │ ├── mips │ │ │ │ └── libscrypt.so │ │ │ ├── x86 │ │ │ │ └── libscrypt.so │ │ │ ├── armeabi │ │ │ │ └── libscrypt.so │ │ │ └── armeabi-v7a │ │ │ │ └── libscrypt.so │ │ ├── res │ │ │ ├── drawable-hdpi │ │ │ │ ├── ic_notif.png │ │ │ │ ├── intro_1.png │ │ │ │ ├── intro_3.png │ │ │ │ ├── intro_4.png │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_contact_picture.png │ │ │ │ ├── ic_navigation_accept.png │ │ │ │ └── ic_scan_qr_code_white_24dp.png │ │ │ ├── drawable-mdpi │ │ │ │ ├── ic_notif.png │ │ │ │ ├── intro_1.png │ │ │ │ ├── intro_3.png │ │ │ │ ├── intro_4.png │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_contact_picture.png │ │ │ │ ├── ic_navigation_accept.png │ │ │ │ └── ic_scan_qr_code_white_24dp.png │ │ │ ├── drawable-xhdpi │ │ │ │ ├── ic_notif.png │ │ │ │ ├── intro_1.png │ │ │ │ ├── intro_3.png │ │ │ │ ├── intro_4.png │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_contact_picture.png │ │ │ │ ├── ic_navigation_accept.png │ │ │ │ └── ic_scan_qr_code_white_24dp.png │ │ │ ├── values-land │ │ │ │ └── dimens.xml │ │ │ ├── drawable-xxhdpi │ │ │ │ └── ic_scan_qr_code_white_24dp.png │ │ │ ├── values │ │ │ │ ├── refs.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── attrs.xml │ │ │ │ ├── arrays.xml │ │ │ │ └── dimens.xml │ │ │ ├── drawable │ │ │ │ ├── drawer_header_background.xml │ │ │ │ ├── attachment_background.xml │ │ │ │ ├── picture_background.xml │ │ │ │ ├── token_background.xml │ │ │ │ ├── fab_label_background.xml │ │ │ │ └── listitem_background_selector.xml │ │ │ ├── menu │ │ │ │ ├── address_book_list.xml │ │ │ │ ├── attachment.xml │ │ │ │ ├── email_list.xml │ │ │ │ ├── edit_contact.xml │ │ │ │ ├── edit_identity.xml │ │ │ │ ├── set_password.xml │ │ │ │ ├── settings.xml │ │ │ │ ├── new_email.xml │ │ │ │ ├── view_address.xml │ │ │ │ ├── view_email.xml │ │ │ │ ├── authenticated_fragment.xml │ │ │ │ ├── email_list_context.xml │ │ │ │ └── main.xml │ │ │ ├── values-v21 │ │ │ │ └── styles.xml │ │ │ ├── layout │ │ │ │ ├── listitem_empty.xml │ │ │ │ ├── listitem_text.xml │ │ │ │ ├── listitem_incomplete.xml │ │ │ │ ├── fragment_authenticated.xml │ │ │ │ ├── dialog_status.xml │ │ │ │ ├── activity_settings.xml │ │ │ │ ├── activity_view_email.xml │ │ │ │ ├── activity_toolbar.xml │ │ │ │ ├── listitem_folder.xml │ │ │ │ ├── dialog_password.xml │ │ │ │ ├── activity_main.xml │ │ │ │ ├── listitem_attachment_warning.xml │ │ │ │ ├── activity_intro.xml │ │ │ │ ├── contact_token.xml │ │ │ │ ├── listitem_folder_with_icon.xml │ │ │ │ ├── activity_help.xml │ │ │ │ ├── listitem_contact.xml │ │ │ │ ├── listitem_identity.xml │ │ │ │ ├── activity_identity_ship.xml │ │ │ │ ├── activity_edit_identity.xml │ │ │ │ ├── activity_set_password.xml │ │ │ │ ├── fragment_intro_1.xml │ │ │ │ ├── fragment_intro_3.xml │ │ │ │ ├── fragment_intro_4.xml │ │ │ │ ├── fragment_intro_2.xml │ │ │ │ ├── listitem_attachment.xml │ │ │ │ ├── fragment_set_password.xml │ │ │ │ ├── fragment_list_identities.xml │ │ │ │ ├── fragment_import_identities.xml │ │ │ │ ├── fragment_list_emails.xml │ │ │ │ ├── fragment_intro_5.xml │ │ │ │ ├── fragment_edit_identity.xml │ │ │ │ ├── fragment_edit_contact.xml │ │ │ │ ├── fragment_intro_0.xml │ │ │ │ ├── fragment_list_emails_with_refresh.xml │ │ │ │ ├── fragment_network_error.xml │ │ │ │ └── fragment_help_about.xml │ │ │ ├── values-v11 │ │ │ │ └── dimens.xml │ │ │ ├── values-sw600dp │ │ │ │ └── dimens.xml │ │ │ ├── values-sw720dp-land │ │ │ │ └── dimens.xml │ │ │ ├── values-w820dp │ │ │ │ └── dimens.xml │ │ │ ├── drawable-v21 │ │ │ │ ├── listitem_background.xml │ │ │ │ └── listitem_background_selector.xml │ │ │ ├── xml │ │ │ │ ├── settings_appearance.xml │ │ │ │ ├── settings_app_protection.xml │ │ │ │ ├── settings_advanced.xml │ │ │ │ ├── settings_network.xml │ │ │ │ ├── settings_privacy.xml │ │ │ │ └── settings.xml │ │ │ ├── raw-zh │ │ │ │ ├── help_identities.html │ │ │ │ └── help_start.html │ │ │ ├── raw-pt │ │ │ │ └── help_start.html │ │ │ ├── raw-uk │ │ │ │ ├── help_start.html │ │ │ │ └── help_identities.html │ │ │ ├── raw-ru │ │ │ │ ├── help_start.html │ │ │ │ └── help_identities.html │ │ │ ├── raw-fi │ │ │ │ └── help_start.html │ │ │ ├── raw-in │ │ │ │ ├── help_start.html │ │ │ │ └── help_identities.html │ │ │ ├── raw-fr │ │ │ │ ├── help_start.html │ │ │ │ └── help_identities.html │ │ │ ├── raw-de │ │ │ │ ├── help_start.html │ │ │ │ └── help_identities.html │ │ │ ├── raw-nl │ │ │ │ ├── help_start.html │ │ │ │ └── help_identities.html │ │ │ ├── raw-es │ │ │ │ ├── help_start.html │ │ │ │ └── help_identities.html │ │ │ ├── raw │ │ │ │ ├── help_start.html │ │ │ │ ├── help_identities.html │ │ │ │ ├── help_about_libraries.html │ │ │ │ ├── help_changelog.html │ │ │ │ └── router_config │ │ │ └── layout-land │ │ │ │ ├── fragment_intro_3.xml │ │ │ │ ├── fragment_intro_2.xml │ │ │ │ ├── fragment_intro_4.xml │ │ │ │ ├── fragment_intro_1.xml │ │ │ │ └── fragment_intro_5.xml │ │ └── java │ │ │ ├── i2p │ │ │ └── bote │ │ │ │ ├── smtp │ │ │ │ └── SmtpService.java │ │ │ │ ├── imap │ │ │ │ └── ImapService.java │ │ │ │ ├── service │ │ │ │ └── seedless │ │ │ │ │ └── SeedlessInitializer.java │ │ │ │ ├── android │ │ │ │ ├── Constants.java │ │ │ │ ├── util │ │ │ │ │ ├── RobustAsyncTask.java │ │ │ │ │ ├── Person.java │ │ │ │ │ ├── IconicsPreference.java │ │ │ │ │ ├── TaskFragment.java │ │ │ │ │ ├── LocaleManager.java │ │ │ │ │ └── QrCodeUtils.java │ │ │ │ ├── widget │ │ │ │ │ ├── SummaryEditTextPreference.java │ │ │ │ │ ├── IntEditTextPreference.java │ │ │ │ │ ├── IconicsFloatingActionButton.java │ │ │ │ │ └── LoadingRecyclerView.java │ │ │ │ ├── NetworkInfoActivity.java │ │ │ │ ├── InitActivities.java │ │ │ │ ├── config │ │ │ │ │ ├── SetPasswordActivity.java │ │ │ │ │ ├── AppearancePreferenceFragment.java │ │ │ │ │ ├── AppProtectionPreferenceFragment.java │ │ │ │ │ ├── NetworkPreferenceFragment.java │ │ │ │ │ └── PrivacyPreferenceFragment.java │ │ │ │ ├── HelpHtmlFragment.java │ │ │ │ ├── BoteActivityBase.java │ │ │ │ ├── identities │ │ │ │ │ ├── EditIdentityActivity.java │ │ │ │ │ ├── IdentityShipActivity.java │ │ │ │ │ ├── IdentityListActivity.java │ │ │ │ │ └── ViewIdentityActivity.java │ │ │ │ ├── NewEmailActivity.java │ │ │ │ ├── HelpAboutFragment.java │ │ │ │ └── addressbook │ │ │ │ │ └── ViewContactActivity.java │ │ │ │ └── crypto │ │ │ │ └── ECUtils.java │ │ │ ├── im │ │ │ └── delight │ │ │ │ └── android │ │ │ │ └── identicons │ │ │ │ └── Identicon.java │ │ │ └── org │ │ │ └── sufficientlysecure │ │ │ └── htmltextview │ │ │ └── LocalImageGetter.java │ ├── debug │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ └── androidTest │ │ └── java │ │ └── i2p │ │ └── bote │ │ └── android │ │ └── intro │ │ └── IntroActivityTest.java └── proguard-rules.txt ├── gradle ├── libs │ └── gradle-witness.jar ├── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties └── signing.gradle ├── .mtn-ignore ├── license.txt ├── botejars └── build.gradle ├── .tx └── config ├── CHANGELOG ├── .github └── workflows │ └── sync.yaml ├── gradlew.bat ├── README.md └── TODO /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':botejars' 2 | -------------------------------------------------------------------------------- /app/libs/mail.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/libs/mail.jar -------------------------------------------------------------------------------- /app/libs/activation.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/libs/activation.jar -------------------------------------------------------------------------------- /app/libs/additionnal.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/libs/additionnal.jar -------------------------------------------------------------------------------- /app/libs/tokenautocomplete.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/libs/tokenautocomplete.jar -------------------------------------------------------------------------------- /gradle/libs/gradle-witness.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/gradle/libs/gradle-witness.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/jniLibs/mips/libscrypt.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/jniLibs/mips/libscrypt.so -------------------------------------------------------------------------------- /app/src/main/jniLibs/x86/libscrypt.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/jniLibs/x86/libscrypt.so -------------------------------------------------------------------------------- /app/src/main/jniLibs/armeabi/libscrypt.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/jniLibs/armeabi/libscrypt.so -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_notif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-hdpi/ic_notif.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/intro_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-hdpi/intro_1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/intro_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-hdpi/intro_3.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/intro_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-hdpi/intro_4.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_notif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-mdpi/ic_notif.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/intro_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-mdpi/intro_1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/intro_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-mdpi/intro_3.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/intro_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-mdpi/intro_4.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_notif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-xhdpi/ic_notif.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/intro_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-xhdpi/intro_1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/intro_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-xhdpi/intro_3.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/intro_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-xhdpi/intro_4.png -------------------------------------------------------------------------------- /app/src/main/jniLibs/armeabi-v7a/libscrypt.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/jniLibs/armeabi-v7a/libscrypt.so -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_contact_picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-hdpi/ic_contact_picture.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_contact_picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-mdpi/ic_contact_picture.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_contact_picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-xhdpi/ic_contact_picture.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_navigation_accept.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-hdpi/ic_navigation_accept.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_navigation_accept.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-mdpi/ic_navigation_accept.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_navigation_accept.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-xhdpi/ic_navigation_accept.png -------------------------------------------------------------------------------- /app/src/main/res/values-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 112dp 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_scan_qr_code_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-hdpi/ic_scan_qr_code_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_scan_qr_code_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-mdpi/ic_scan_qr_code_white_24dp.png -------------------------------------------------------------------------------- /app/src/debug/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Bote DEBUG 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_scan_qr_code_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-xhdpi/ic_scan_qr_code_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_scan_qr_code_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/i2p/i2p.i2p-bote.android/HEAD/app/src/main/res/drawable-xxhdpi/ic_scan_qr_code_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/values/refs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | @drawable/listitem_background_selector 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/drawer_header_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/menu/address_book_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/attachment_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/menu/attachment.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon May 09 00:28:06 NZST 2016 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-2.10-all.zip 7 | -------------------------------------------------------------------------------- /app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/listitem_empty.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/picture_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/values-v11/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | @android:dimen/notification_large_icon_width 4 | @android:dimen/notification_large_icon_height 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw600dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 400dp 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw720dp-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 128dp 8 | 9 | 10 | -------------------------------------------------------------------------------- /.mtn-ignore: -------------------------------------------------------------------------------- 1 | # General ignores 2 | ^.settings 3 | 4 | # Android-specific ignores 5 | ^botejars/libs 6 | lint.xml 7 | local.properties 8 | signing.properties 9 | 10 | #IntelliJ IDEA 11 | ^.idea 12 | .*.iml 13 | .*.ipr 14 | .*.iws 15 | 16 | #Gradle 17 | ^.gradle 18 | build 19 | 20 | # I2P-specific ignores 21 | ^app/src/main/res/raw/certificates_zip 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/token_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/email_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/edit_contact.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/edit_identity.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | -------------------------------------------------------------------------------- /app/proguard-rules.txt: -------------------------------------------------------------------------------- 1 | -keepclassmembers class i2p.bote.crypto.ECUtils { 2 | public static java.security.spec.ECParameterSpec getParameters(String curveName); 3 | public static byte[] encodePoint(java.security.spec.ECParameterSpec ecSpec, java.security.spec.ECPoint point, boolean withCompression); 4 | public static java.security.spec.ECPoint decodePoint(java.security.spec.EllipticCurve curve, byte[] encoded); 5 | } -------------------------------------------------------------------------------- /app/src/main/res/menu/set_password.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/listitem_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/listitem_background_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/fab_label_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/listitem_text.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/xml/settings_appearance.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/listitem_background_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/listitem_incomplete.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/menu/settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 10 | 11 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/menu/new_email.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/menu/view_address.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/xml/settings_app_protection.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/raw-zh/help_identities.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

身份是什么?<br>

5 |

身份就像是一个电子邮件帐户,但没有一个可以控制的提供者 - 取代第三者方服务商,如谷歌或雅虎帐户。

6 | 7 |

目标是什么?<br>

8 |

所谓的目标就是一个使你的朋友可以发送邮件给你的邮箱地址

9 | 10 |

为什么电子邮件地址那么长?<br>

11 |

每封电子邮件是由I2P系统自动加密的。每个地址包含一组公开密钥,它用于加密发送到该地址的电子邮件。该地址的长度取决于所用的加密类型。

12 | 13 |

我可以拥有的身份有数量限制吗?

14 |

你可以使用无限多的身份,并使用不同的名称用于不同的目的。

15 | 16 |

身份什麽时候过期?

17 |

决不。只要你有一个身份的私钥,你可以使用它。这也意味着,没有“帐户救援” - 如果你失去了你的手机,意味着你失去了你的身份。

18 |

您可以通过“设置”菜单中将它们导出以备份您的身份。这将使它们的副本保存在您的手机外。该文件可用于恢复您的身份,或将其移动到另一台设备。

19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/smtp/SmtpService.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.smtp; 2 | 3 | import java.net.UnknownHostException; 4 | 5 | import i2p.bote.Configuration; 6 | import i2p.bote.MailSender; 7 | import i2p.bote.fileencryption.PasswordVerifier; 8 | 9 | /** 10 | * Stubbed-out SmtpService 11 | */ 12 | public class SmtpService { 13 | public SmtpService(Configuration configuration, PasswordVerifier passwordVerifier, MailSender mailSender) throws UnknownHostException { 14 | } 15 | 16 | public boolean isRunning() { 17 | return false; 18 | } 19 | 20 | public void start() { 21 | } 22 | 23 | public void stop() { 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/res/xml/settings_advanced.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/raw-zh/help_start.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

入门

5 |

首先,你需要一个身份。通过创建一个“设置”菜单,或导入现有的身份。之后,你可以通过复制粘贴添加您的朋友的地址,或通过QR码亦或是NFC交换。

6 | 7 |

如果你的安卓版本低于4.4,我们建议您安装 OI文件管理器 增强文件选择能力。通过QR码分享安装条码扫描器。点击链接会打开Google Play应用商店或者F-Droid以供安装。

8 | 9 |

我找到了 Bote 中的 bug!<br>

10 |

请使用 I2P 缺陷跟踪系统进行报告。

11 | 12 |

译者

13 |

帮忙翻译 Bote!每个人都可以在 Transifex 上参与翻译 I2P

14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/menu/view_email.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/menu/authenticated_fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 12 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_authenticated.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 14 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_status.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/imap/ImapService.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.imap; 2 | 3 | import org.apache.commons.configuration.ConfigurationException; 4 | 5 | import i2p.bote.Configuration; 6 | import i2p.bote.fileencryption.PasswordVerifier; 7 | import i2p.bote.folder.EmailFolderManager; 8 | 9 | /** 10 | * Stubbed-out ImapService 11 | */ 12 | public class ImapService { 13 | public ImapService(Configuration configuration, final PasswordVerifier passwordVerifier, EmailFolderManager folderManager) throws ConfigurationException { 14 | } 15 | 16 | public boolean isStarted() { 17 | return false; 18 | } 19 | 20 | public boolean start() { 21 | return false; 22 | } 23 | 24 | public boolean stop() { 25 | return true; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | LICENSES 2 | -------- 3 | 4 | This software is licensed under the GPL version 3 (see licenses/GPLv3.txt). 5 | 6 | Several libraries and classes are licensed under the Apache License, Version 7 | 2.0 (see licenses/LICENSE-Apache2.0.txt). The full list of libraries in use 8 | can be found in app/src/main/res/raw/help_about_libraries.html 9 | 10 | I2P-Bote is licensed under the GPL version 3. See its repository for details 11 | about its license and those of the libraries it uses. 12 | 13 | Images used in the introduction are adapted from the Free Software Foundation 14 | Email Self-Defense guide (https://emailselfdefense.fsf.org/), and are licensed 15 | under the Creative Commons Attribution 4.0 license (or later version) (see 16 | https://creativecommons.org/licenses/by/4.0/). 17 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/service/seedless/SeedlessInitializer.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.service.seedless; 2 | 3 | import java.util.Collection; 4 | import java.util.Collections; 5 | 6 | import i2p.bote.network.DhtPeerSource; 7 | import net.i2p.client.streaming.I2PSocketManager; 8 | import net.i2p.data.Destination; 9 | import net.i2p.util.I2PAppThread; 10 | 11 | /** 12 | * Stubbed-out SeedlessInitializer 13 | */ 14 | public class SeedlessInitializer extends I2PAppThread implements DhtPeerSource { 15 | public SeedlessInitializer(I2PSocketManager socketManager) { 16 | super("SeedlessInit"); 17 | } 18 | 19 | @Override 20 | public void run() {} 21 | 22 | @Override 23 | public Collection getPeers() { 24 | return Collections.emptyList(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /botejars/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | 3 | task buildJars(type: Exec) { 4 | outputs.dir('libs') 5 | commandLine 'ant', 'preparebotelibs' 6 | } 7 | 8 | // TODO an empty botejars.jar is added to the classpath 9 | 10 | artifacts { 11 | 'default' file: file('libs/router.jar'), builtBy: buildJars 12 | 'default' file: file('libs/flexi-gmss-1.7p1.jar'), builtBy: buildJars 13 | 'default' file: file('libs/lzma-9.20.jar'), builtBy: buildJars 14 | 'default' file: file('libs/ntruenc-1.2.jar'), builtBy: buildJars 15 | 'default' file: file('libs/scrypt-1.4.0.jar'), builtBy: buildJars 16 | 'default' file: file('libs/i2pbote.jar'), builtBy: buildJars 17 | } 18 | 19 | clean.dependsOn cleanBuildJars 20 | 21 | clean << { 22 | exec { 23 | commandLine 'ant', 'clean' 24 | } 25 | } -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | lang_map = he: iw, id: in, pt_BR: pt-rBR, ru_RU: ru, sv_SE: sv, tr_TR: tr, uk_UA: uk, yi: ji, zh_CN: zh 4 | 5 | [I2P.android_bote] 6 | file_filter = app/src/main/res/values-/strings.xml 7 | source_file = app/src/main/res/values/strings.xml 8 | source_lang = en 9 | type = ANDROID 10 | minimum_perc = 50 11 | 12 | [I2P.android_bote_help_start] 13 | file_filter = app/src/main/res/raw-/help_start.html 14 | source_file = app/src/main/res/raw/help_start.html 15 | source_lang = en 16 | type = HTML 17 | minimum_perc = 50 18 | 19 | [I2P.android_bote_help_identities] 20 | file_filter = app/src/main/res/raw-/help_identities.html 21 | source_file = app/src/main/res/raw/help_identities.html 22 | source_lang = en 23 | type = HTML 24 | minimum_perc = 50 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/Constants.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android; 2 | 3 | public class Constants { 4 | public static final String ANDROID_LOG_TAG = "I2P-Bote"; 5 | 6 | public static final String SHARED_PREFS = "i2p.bote"; 7 | public static final String PREF_SELECTED_IDENTITY = "selectedIdentity"; 8 | 9 | public static final String EMAILDEST_SCHEME = "bote"; 10 | 11 | public static final String NDEF_DOMAIN = "i2p.bote"; 12 | public static final String NDEF_TYPE_CONTACT = "contact"; 13 | public static final String NDEF_TYPE_CONTACT_DESTINATION = "contactDestination"; 14 | public static final String NDEF_LEGACY_TYPE_CONTACT = NDEF_DOMAIN + ":" + NDEF_TYPE_CONTACT; 15 | public static final String NDEF_LEGACY_TYPE_CONTACT_DESTINATION = NDEF_DOMAIN + ":" + NDEF_TYPE_CONTACT_DESTINATION; 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/res/menu/email_list_context.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 13 | 17 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/xml/settings_network.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 15 | 16 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | #3f51b5 5 | #303f9f 6 | #ffab40 7 | #ff9100 8 | 9 | #e0e0e0 10 | #bdbdbd 11 | #c31756 12 | #f00 13 | #e51e25 14 | 15 | #4caf50 16 | #f44336 17 | 18 | #B2000000 19 | 20 | @android:color/black 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/util/RobustAsyncTask.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android.util; 2 | 3 | import android.os.AsyncTask; 4 | 5 | public abstract class RobustAsyncTask extends 6 | AsyncTask { 7 | TaskFragment mDialog; 8 | 9 | void setFragment(TaskFragment fragment) { 10 | mDialog = fragment; 11 | } 12 | 13 | @Override 14 | protected void onProgressUpdate(Progress... values) { 15 | if (mDialog != null) 16 | mDialog.updateProgress(values); 17 | } 18 | 19 | @Override 20 | protected void onPostExecute(Result result) { 21 | if (mDialog != null) 22 | mDialog.taskFinished(result); 23 | } 24 | 25 | @Override 26 | protected void onCancelled(Result result) { 27 | if (mDialog != null) 28 | mDialog.taskCancelled(result); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/widget/SummaryEditTextPreference.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android.widget; 2 | 3 | import android.content.Context; 4 | import android.preference.EditTextPreference; 5 | import android.util.AttributeSet; 6 | 7 | public class SummaryEditTextPreference extends EditTextPreference { 8 | 9 | public SummaryEditTextPreference(Context context) { 10 | super(context); 11 | } 12 | 13 | public SummaryEditTextPreference(Context context, AttributeSet attrs) { 14 | super(context, attrs); 15 | } 16 | 17 | public SummaryEditTextPreference(Context context, AttributeSet attrs, int defStyle) { 18 | super(context, attrs, defStyle); 19 | } 20 | 21 | @Override 22 | public CharSequence getSummary() { 23 | String summary = (String) super.getSummary(); 24 | if (summary == null) 25 | summary = "%s"; 26 | return String.format(summary, getText()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_view_email.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 | 20 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/NetworkInfoActivity.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.widget.Toolbar; 5 | 6 | public class NetworkInfoActivity extends BoteActivityBase { 7 | @Override 8 | protected void onCreate(Bundle savedInstanceState) { 9 | super.onCreate(savedInstanceState); 10 | setContentView(R.layout.activity_toolbar); 11 | 12 | // Set the action bar 13 | Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar); 14 | setSupportActionBar(toolbar); 15 | 16 | // Enable ActionBar app icon to behave as action to go back 17 | getSupportActionBar().setDisplayHomeAsUpEnabled(true); 18 | 19 | if (savedInstanceState == null) { 20 | NetworkInfoFragment f = new NetworkInfoFragment(); 21 | getSupportFragmentManager().beginTransaction() 22 | .add(R.id.container, f).commit(); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/res/menu/main.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 9 | 10 | 15 | 16 | 21 | 22 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 16 | 17 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/raw-pt/help_start.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Iniciação

5 |

First you need an identity. Create one via the "Settings" menu, or import an existing identity. Afterwards, you can add your friends' addresses by copy-paste, or exchange them via QR Codes or NFC.

6 | 7 |

On Android lower than 4.4, it is recommended that you install OI File Manager for enhanced file selection. To share via QR Codes install Barcode Scanner. Clicking on the links will open Google Play Store or F-Droid for installation.

8 | 9 |

Eu encontrei um erro no Bote!

10 |

Por favor, reporte o erro, usando "rastrear erros I2P".

11 | 12 |

Traduções

13 |

Help translating Bote! Everybody can participate at I2P on Transifex.

14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/listitem_folder.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/raw-uk/help_start.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Розпочати

5 |

Спочатку вам потрібен ідентифікатор. Створіть через меню налаштувань або імпортуйте існуючий. Після цього ви зможете додавати адреси друзів, копіюючи й вставляючи їх або обмінюючись ними через QR-коди чи NFC.

6 | 7 |

На Android нижче 4.4 рекомендовано встановити OI File Manager для зручнішого вибору файлів. Щоб поділитись через QR-код, встановіть Barcode Scanner. Натискаючи на посилання, ви відкриєте Google Play Store чи F-Droid для встановлення.

8 | 9 |

Я знайшов помилку в Bote!

10 |

Будь ласка, повідомте про ваду на баг-трекері I2P.

11 | 12 |

Переклади

13 |

Допоможіть перекласти Bote! Кожен може взяти участь у I2P на Transifex.

14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/raw-ru/help_start.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Начало работы

5 |

Для начала вам понадобится идентификатор. Создайте его в меню "Настройки" или импортируйте уже существующий. После этого вы сможете добавить адреса друзей, скопировав и вставив их, или обменяться ими с помощью QR-кодов или NFC.

6 | 7 |

На Android до версии 4.4 рекомендуется установить OI File Manager для удобства выбора файлов. Для использования QR-кодов установите Barcode Scanner. При нажатии на ссылку откроется Google Play Store или F-Droid.

8 | 9 |

Я нашёл ошибку в Bote!

10 |

Пожалуйста, сообщите об ошибке на багтрекере I2P.

11 | 12 |

Переводы

13 |

Помогите перевести Bote! Каждый может принять участие на странице I2P на Transifex.

14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/util/Person.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android.util; 2 | 3 | import android.graphics.Bitmap; 4 | 5 | import java.io.Serializable; 6 | 7 | public class Person implements Serializable { 8 | private static final long serialVersionUID = -2874686247798691378L; 9 | private String name; 10 | private String address; 11 | private Bitmap picture; 12 | private boolean isExternal; 13 | 14 | public Person(String n, String a, Bitmap p) { this(n, a, p, false); } 15 | public Person(String n, String a, Bitmap p, boolean e) { name = n; address = a; picture = p; isExternal = e; } 16 | 17 | public String getName() { return name; } 18 | public String getAddress() { return address; } 19 | public Bitmap getPicture() { return picture; } 20 | public boolean isExternal() { return isExternal; } 21 | 22 | @Override 23 | public boolean equals(Object other) { 24 | return other instanceof Person && address.equals(((Person) other).address); 25 | } 26 | 27 | @Override 28 | public String toString() { return name; } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/res/raw-fi/help_start.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Aloitetaan

5 |

Tarvitsen ensiksi identiteetin. Luo yksi ”Asetukset”-valikon kautta, tai tuo olemassa oleva identiteetti. Jälkeenpäin voit lisätä ystävien osoitteet copy-paste-menetelmällä, tai vaihtamalla niitä QR-koodeina tai NFC:n avulla.

6 | 7 |

Android-versiota 4.4 alemmissa käyttöjärjestelmäversioissa on suositeltavaa asentaa OI-tiedostohallinta laajennettua tiedostovalintaa varten. QR-kautta jakamiseksi asenna Viivakoodilukija. Linkkejä napsauttamalla avautuu joko Google Play-sovellus tai F-Droid asennusta varten.

8 | 9 |

Löysin virhee Bote-ohjelmasta!

10 |

Ilmoita viasta käyttäen I2P-vikaseuraajaa.

11 | 12 |

Kotoistamiset

13 |

Auta Bote-ohjelman kotoistamisessa! Kaikki voivat osallistua osoiteessa I2P Transifexissa.

14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/InitActivities.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android; 2 | 3 | import android.content.Context; 4 | 5 | import java.security.Security; 6 | 7 | public class InitActivities { 8 | static { 9 | Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1); 10 | } 11 | 12 | private final String myDir; 13 | 14 | public InitActivities(Context c) { 15 | this(c.getFilesDir().getAbsolutePath()); 16 | } 17 | 18 | public InitActivities(String i2pBaseDir) { 19 | myDir = i2pBaseDir; 20 | } 21 | 22 | public void initialize() { 23 | // Don't initialize twice 24 | if (System.getProperty("i2pbote.initialized", "false").equals("true")) 25 | return; 26 | 27 | // Set up the locations so settings can find them 28 | System.setProperty("i2p.dir.base", myDir); 29 | System.setProperty("i2p.dir.config", myDir); 30 | System.setProperty("wrapper.logfile", myDir + "/wrapper.log"); 31 | 32 | System.setProperty("i2pbote.initialized", "true"); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/res/raw-in/help_start.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Mari memulai

5 |

Pertama-tama anda memerlukan sebuah identitas. Buatlah satu identitas melalui menu "Setelan", atau impor identitas yang sudah ada. Setelah itu, anda dapat menambahkan alamat teman-teman anda dengan menyalin-tempel, atau bertukar melalui Kode QR atau NFC.

6 | 7 |

Pada Android dibawah 4.4, direkomendasikan agar memasang OI File Manager untuk pemilihan file yang lebih baik. Untuk berbagi melalui Kode QR silahkan pasaang Barcode Scanner. Mengklik tautan akan membuka Google Play Store atau F-Droid untuk pemasang.

8 | 9 |

Saya menemukan bug di Bote!

10 |

Silahkan laporkan bug dengan menggunakan I2P bug tracker.

11 | 12 |

Penerjemahan

13 |

Bantu menerjemahkan Bote! Semua orang bisa berpartisipasi di I2P di Transifex.

14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_password.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 19 | 20 | 21 | 22 | 23 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/raw-fr/help_start.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Débuter

5 |

D'abord vous aurez besoin d'une identité. Créez en une via le menu "Paramètres", ou importez une identité existante. Ensuite, vous pourrez ajouter les adresses de vos amis via copier/coller, ou les échanger via des QR Codes ou NFC.

6 | 7 |

Sur Android antérieur à 4.4, et il recommandé d'installer OI File Manager pour disposer d'une sélection de fichiers améliorée. Pour partager via QR Codes, installez Barcode Scanner. Cliquez sur les liens ouvrira Google Play Store ou F-Droid afin de permettre l'installation.

8 | 9 |

J'ai trouvé un bug dans Bote !

10 |

Veuillez signaler le bug (en anglais) en utilisant le I2P bug tracker.

11 | 12 |

Traductions

13 |

Aidez à traduire Bote ! Tout le monde peut participer via I2P sur Transifex.

14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/raw-de/help_start.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Der Start mit Bote

5 |

Zuerst benötigen Sie eine Identität. Erstellen Sie eine unter dem Menüpunkt "Einstellungen", oder importieren Sie bereits existierende Identitäten. Anschließend fügen Sie die Adressen Ihrer Freunde mittels Kopie, NFC oder QR-Code hinzu.

6 | 7 |

Auf Android älter als Version 4.4 sollten Sie den OI File Manager zur besseren Dateiverwaltung installieren. Zum Austauschen von QR Codes ist der Barcode Scanner gut. Diese Links öffnen diese Pakete zur Installation im Google Play Store oder in F-Droid.

8 | 9 |

Ich habe einen Bug in Bote gefunden!

10 |

Bitte teilen Sie uns diesen Bug auf unserem I2P bug tracker mit.

11 | 12 |

Übersetzungen

13 |

Helfen Sie mit, Bote zu übersetzen! Jeder kann sich unter I2P auf Transifex beteiligen.

14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/raw-nl/help_start.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Aan de slag

5 |

Eerst moet je een identiteit aanmaken. Maak er een aan via het "Instellingen"-menu, of importeer een bestaande identiteit. Vervolgens kan je de adressen van je vrienden toevoegen door kopiëren-plakken, of door ze uit te wisselen via QR-codes of NFC.

6 | 7 |

Op Android-versies lager dan 4.4 raden we aan dat je OI File Manager installeert voor een verbeterde bestandsselectie. Om via QR codes te delen raden we aan dat je Barcode Scanner installeert. Wanneer je op deze links klikt zal F-Droid of Google Play Store worden geopend voor installatie.

8 | 9 |

Ik heb een bug in Bote gevonden!

10 |

Gelieve de bug de melden via de I2P-bug tracker.

11 | 12 |

Vertalingen

13 |

Help mee Bote te vertalen! Iedereen kan meewerken op I2P op Transifex.

14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/raw-es/help_start.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Comenzar

5 |

Primero necesita una identidad. Cree una mediante el menú "Configuración", o importe una identidad existente. Después, puede añadir las direcciones de sus amigos mediante copiar-pegar, o intercambiándolas mediante códigos QR o vía NFC.

6 | 7 |

En Android inferior a 4.4, se recomienda que instale el administrador de ficheros OI File Manager para una selección de ficheros mejorada. Para compartir mediante códigos QR instale Barcode Scanner. Haciendo clic en los enlaces abrirá la tienda Google Play o el sitio de F-Droid para la instalación.

8 | 9 |

¡Encontré un fallo en Bote!

10 |

Por favor informe del fallo utilizando el rastreador de fallos de I2P.

11 | 12 |

Traducciones

13 |

¡Ayude a traducir Bote! Todos pueden participar en I2P en Transifex.

14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 18 | 19 | 20 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/listitem_attachment_warning.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 18 | 19 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/config/SetPasswordActivity.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android.config; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.widget.Toolbar; 5 | import android.widget.Toast; 6 | 7 | import i2p.bote.android.BoteActivityBase; 8 | import i2p.bote.android.R; 9 | 10 | public class SetPasswordActivity extends BoteActivityBase implements 11 | SetPasswordFragment.Callbacks { 12 | @Override 13 | public void onCreate(Bundle savedInstanceState) { 14 | super.onCreate(savedInstanceState); 15 | setContentView(R.layout.activity_set_password); 16 | 17 | // Set the action bar 18 | Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar); 19 | setSupportActionBar(toolbar); 20 | 21 | // Enable ActionBar app icon to behave as action to go back 22 | //noinspection ConstantConditions 23 | getSupportActionBar().setDisplayHomeAsUpEnabled(true); 24 | } 25 | 26 | // SetPasswordFragment.Callbacks 27 | 28 | public void onTaskFinished() { 29 | Toast.makeText(this, R.string.password_changed, 30 | Toast.LENGTH_SHORT).show(); 31 | setResult(RESULT_OK); 32 | finish(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/res/raw/help_start.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 |

Getting started

9 |

First you need an identity. Create one via the "Settings" menu, or import an existing identity. Afterwards, you can add your friends' addresses by copy-paste, or exchange them via QR Codes or NFC.

10 | 11 |

On Android lower than 4.4, it is recommended that you install OI File Manager for enhanced file selection. To share via QR Codes install Barcode Scanner. Clicking on the links will open Google Play Store or F-Droid for installation.

12 | 13 |

I found a bug in Bote!

14 |

Please report the bug using the I2P bug tracker.

15 | 16 |

Translations

17 |

Help translating Bote! Everybody can participate at I2P on Transifex.

18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/config/AppearancePreferenceFragment.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android.config; 2 | 3 | import android.os.Bundle; 4 | import android.support.v4.preference.PreferenceFragment; 5 | 6 | import i2p.bote.android.R; 7 | 8 | public class AppearancePreferenceFragment extends PreferenceFragment { 9 | @Override 10 | public void onCreate(Bundle paramBundle) { 11 | super.onCreate(paramBundle); 12 | addPreferencesFromResource(R.xml.settings_appearance); 13 | } 14 | 15 | @Override 16 | public void onStart() { 17 | super.onStart(); 18 | getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener( 19 | (SettingsActivity) getActivity() 20 | ); 21 | } 22 | 23 | @Override 24 | public void onResume() { 25 | super.onResume(); 26 | ((SettingsActivity) getActivity()).getSupportActionBar().setTitle(R.string.settings_label_appearance); 27 | } 28 | 29 | @Override 30 | public void onStop() { 31 | super.onStop(); 32 | getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener( 33 | (SettingsActivity) getActivity() 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /gradle/signing.gradle: -------------------------------------------------------------------------------- 1 | android { 2 | signingConfigs { 3 | release 4 | } 5 | buildTypes { 6 | release { 7 | signingConfig signingConfigs.release 8 | } 9 | } 10 | } 11 | 12 | def Properties props = new Properties() 13 | def propFile = new File(project.rootDir, 'signing.properties') 14 | 15 | if (propFile.canRead()) { 16 | props.load(new FileInputStream(propFile)) 17 | 18 | if (props != null && 19 | props.containsKey('STORE_FILE') && 20 | props.containsKey('STORE_PASSWORD') && 21 | props.containsKey('KEY_ALIAS') && 22 | props.containsKey('KEY_PASSWORD')) { 23 | android.signingConfigs.release.storeFile = file(props['STORE_FILE']) 24 | android.signingConfigs.release.storePassword = props['STORE_PASSWORD'] 25 | android.signingConfigs.release.keyAlias = props['KEY_ALIAS'] 26 | android.signingConfigs.release.keyPassword = props['KEY_PASSWORD'] 27 | } else { 28 | println 'signing.properties found but some entries are missing' 29 | android.buildTypes.release.signingConfig = null 30 | } 31 | } else { 32 | println 'signing.properties not found' 33 | android.buildTypes.release.signingConfig = null 34 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/i2p/bote/android/intro/IntroActivityTest.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android.intro; 2 | 3 | import android.support.test.rule.ActivityTestRule; 4 | import android.support.test.runner.AndroidJUnit4; 5 | 6 | import org.junit.Rule; 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import i2p.bote.android.R; 11 | 12 | import static android.support.test.espresso.Espresso.onView; 13 | import static android.support.test.espresso.action.ViewActions.click; 14 | import static android.support.test.espresso.action.ViewActions.swipeLeft; 15 | import static android.support.test.espresso.matcher.ViewMatchers.withId; 16 | 17 | @RunWith(AndroidJUnit4.class) 18 | public class IntroActivityTest { 19 | 20 | @Rule 21 | public ActivityTestRule mRule = new ActivityTestRule<>(IntroActivity.class); 22 | 23 | @Test 24 | public void enterSetup() { 25 | onView(withId(R.id.pager)).perform(swipeLeft(), swipeLeft(), swipeLeft(), swipeLeft(), swipeLeft()); 26 | onView(withId(R.id.start_setup_wizard)).perform(click()); 27 | // TODO check result 28 | } 29 | 30 | @Test 31 | public void closeIntro() { 32 | onView(withId(R.id.skip_intro)).perform(click()); 33 | // TODO check result 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_intro.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | 14 | 18 | 19 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/contact_token.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/raw-uk/help_identities.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Що таке ідентифікатор?

5 |

Ідентифікатор — це щось, схоже на поштовий аккаунт, але без центру, своїм аккаунтом керуєте ви, а не хтось інший, як наприклад Google чи Yahoo.

6 | 7 |

Що таке призначення?

8 |

Призначення — це адреса, яку ви даєте друзям і на яку вони можуть відправляти вам повідомлення.

9 | 10 |

Чому електронні адрси такі довгі?

11 |

Кожне повідомлення автоматично шифрується Bote'ом. Кожна адреса містить у собі набір відкритих ключів, якими шифруються надіслані на цю адресу. Довжина адреси залежить від використовуваного типу шифрування.

12 | 13 |

Чи є обмеження на кількість ідентифікаторів, які я можу мати?

14 |

Ви можете робити скільки завгодно ідентифікаторів і використовувати кожен для різних цілей.

15 | 16 |

Коли ідентифікатори закінчуються?

17 |

Ніколи. Поки ви маєте секретні ключі, ви можете його використовувати. Це також означає, що не існує такого, як відновлення аккаунту: втрачаєте телефон — втрачаєте й ідентифікатори.

18 |

Ви можете зробити резервну копію ідентифікаторів з меню налаштувань. Це створить їх копію в пам’яті телфона. Файл можна буде використати для відновлення ваших ідентифікаторів або переміщення їх на інший пристрій.

19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/crypto/ECUtils.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.crypto; 2 | 3 | import org.spongycastle.asn1.nist.NISTNamedCurves; 4 | import org.spongycastle.asn1.x9.X9ECParameters; 5 | import org.spongycastle.jcajce.provider.asymmetric.util.EC5Util; 6 | import org.spongycastle.jce.ECPointUtil; 7 | import org.spongycastle.jce.spec.ECNamedCurveSpec; 8 | 9 | import java.security.spec.ECParameterSpec; 10 | import java.security.spec.ECPoint; 11 | import java.security.spec.EllipticCurve; 12 | 13 | /** 14 | * A wrapper around the SpongyCastle EC classes. 15 | */ 16 | public class ECUtils { 17 | public static ECParameterSpec getParameters(String curveName) { 18 | X9ECParameters params = NISTNamedCurves.getByName(curveName); 19 | return new ECNamedCurveSpec(curveName, params.getCurve(), params.getG(), params.getN(), params.getH(), null); 20 | } 21 | 22 | public static byte[] encodePoint( 23 | ECParameterSpec ecSpec, 24 | ECPoint point, 25 | boolean withCompression) { 26 | org.spongycastle.math.ec.ECPoint bcPoint = EC5Util.convertPoint(ecSpec, point, withCompression); 27 | return bcPoint.getEncoded(); 28 | } 29 | 30 | public static ECPoint decodePoint( 31 | EllipticCurve curve, 32 | byte[] encoded) { 33 | return ECPointUtil.decodePoint(curve, encoded); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/listitem_folder_with_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_help.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 17 | 18 | 26 | 27 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/java/im/delight/android/identicons/Identicon.java: -------------------------------------------------------------------------------- 1 | package im.delight.android.identicons; 2 | 3 | import android.graphics.Color; 4 | 5 | public class Identicon extends IdenticonBase { 6 | private static final int CENTER_COLUMN_INDEX = 5; 7 | 8 | @Override 9 | protected int getRowCount() { 10 | return 9; 11 | } 12 | 13 | @Override 14 | protected int getColumnCount() { 15 | return 9; 16 | } 17 | 18 | protected int getSymmetricColumnIndex(int col) { 19 | if (col < CENTER_COLUMN_INDEX) { 20 | return col; 21 | } else { 22 | return getColumnCount() - col - 1; 23 | } 24 | } 25 | 26 | @Override 27 | protected boolean isCellVisible(int row, int column) { 28 | return getByte(3 + row * CENTER_COLUMN_INDEX + getSymmetricColumnIndex(column)) >= 0; 29 | } 30 | 31 | @Override 32 | protected int getIconColor() { 33 | return Color.rgb(getByte(0) + 128, getByte(1) + 128, getByte(2) + 128); 34 | } 35 | 36 | @Override 37 | protected int getBackgroundColor() { 38 | float[] hsv = new float[3]; 39 | Color.colorToHSV(getIconColor(), hsv); 40 | if (hsv[2] < 0.5) 41 | return Color.parseColor("#ffeeeeee"); // @color/background_material_light 42 | else 43 | return Color.parseColor("#ff303030"); // @color/background_material_dark 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/res/raw-ru/help_identities.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Что такое идентификатор?

5 |

Идентификатор похож на адрес электронной почты, только без посредника: вы сами контролируете ваш аккаунт, а не третья сторона, как Google или Yahoo.

6 | 7 |

Что такое пункт назначения?

8 |

Пункт назначения — это адрес, который вы даете друзьям, чтобы они могли отправлять вам письма.

9 | 10 |

Почему адреса такие длинные?

11 |

Bote автоматически шифрует каждое письмо. Адрес содержит набор открытых ключей, которые используются для шифрования писем, отправляемых на этот адрес. Длина адреса зависит от используемого вида шифрования.

12 | 13 |

Есть ли ограничение на количество идентификаторов?

14 |

Вы можете создать столько идентификаторов, сколько хотите, и использовать различные идентификаторы для разных целей.

15 | 16 |

Когда заканчивается время действия идентификатора?

17 |

Никогда. Пока у вас есть закрытый ключ для идентификатора, вы можете им пользоваться. Это также означает, что возможность восстановить аккаунт отсутствует: если вы потеряете телефон, вы потеряете ключи и идентификаторы.

18 |

Вы можете создать резервную копию идентификаторов с помощью функции экспорта в меню "Настройки". В результате вы получите файл в хранилище вашего телефона. Файл можно использовать для восстановления идентифкаторов или переноса на другое устройство.

19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/listitem_contact.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 18 | 19 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/widget/IntEditTextPreference.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android.widget; 2 | 3 | import android.content.Context; 4 | import android.preference.EditTextPreference; 5 | import android.text.InputType; 6 | import android.util.AttributeSet; 7 | 8 | public class IntEditTextPreference extends EditTextPreference { 9 | 10 | public IntEditTextPreference(Context context) { 11 | super(context); 12 | getEditText().setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED); 13 | } 14 | 15 | public IntEditTextPreference(Context context, AttributeSet attrs) { 16 | super(context, attrs); 17 | getEditText().setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED); 18 | } 19 | 20 | public IntEditTextPreference(Context context, AttributeSet attrs, int defStyle) { 21 | super(context, attrs, defStyle); 22 | getEditText().setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED); 23 | } 24 | 25 | @Override 26 | public CharSequence getSummary() { 27 | return String.format((String) super.getSummary(), getText()); 28 | } 29 | 30 | @Override 31 | protected String getPersistedString(String defaultReturnValue) { 32 | return String.valueOf(getPersistedInt(-1)); 33 | } 34 | 35 | @Override 36 | protected boolean persistString(String value) { 37 | return persistInt(Integer.valueOf(value)); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/res/raw-in/help_identities.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Apa sih Identitas?

5 |

Identitas adalah seperti sebuah akun email, tetapi tanpa penyedia layanan - anda yang mengontrol akun anda, sebagai pengganti pihak ketiga seperti Google atau Yahoo.

6 | 7 |

Apa sih Destinasi?

8 |

Destinasi adalah alamat yang anda berikan kepada teman-teman anda agar mereka dapat mengirimi anda email.

9 | 10 |

Kenapa alamat emailnya begitu panjang?

11 |

Setiap email otomatis dienkripsi oleh Bote. Setiap alamat berisi satu set kunci publik, yang mana digunakan untuk mengenkripsi email terkirim ke alamat tersebut. Panjang alamat tergantung pada tipe enkripsi yang digunakan.

12 | 13 |

Apakah ada batasan pada jumlah Identitas yang dapat saya miliki?

14 |

Anda dapat membuat Identitas sebanyak yang anda inginkan, dan menggunakan Identitas berbeda untuk kepentingan berbeda.

15 | 16 |

Kapan Identitas berakhir?

17 |

Tidak akan. Selama anda memiliki kunci pribadi untuk sebuah Identitas, anda tetap dapat menggunakannya. Hal ini juga berarti tidak ada "pemulihan akun" - jika anda kehilangan ponsel anda, maka anda kehilangan Identitas anda.

18 |

Anda dapat mencadangkan Identitas dengan mengekspornya dari menu "Setelan". Ini akan menyimpan salinannya kedalam sebuah file pada penyimpanan ponsel anda. File dapat digunakan untuk memulihkan Identitas anda, atau memindahkannya ke perangkat lain.

19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/raw-nl/help_identities.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Wat is een Identiteit?

5 |

Een Identiteit is zoals een e-mailaccount, maar dan zonder provider - je beheert zelf je account, in plaats van een derde partij zoals Google of Yahoo.

6 | 7 |

Wat is een Bestemming?

8 |

Een Bestemming is het adres dat je aan je vrienden geeft zodat ze je e-mails kunnen sturen.

9 | 10 |

Waarom zijn de e-mailadressen zo lang?

11 |

Elke e-mail wordt automatisch versleuteld door Bote. Elk adres bevat een set publieke sleutels, die gebruikt worden om e-mails die naar dat adres verzonden worden te versleutelen. De lengte van het adres hangt af van de gebruikte versleutelingsmethode.

12 | 13 |

Is er een limiet op het aantal Identiteiten die ik kan hebben?

14 |

Je kan zoveel Identiteiten aanmaken als je wil, en verschillende Identiteiten gebruiken voor verschillende doeleinden.

15 | 16 |

Wanneer vervallen Identiteiten?

17 |

Nooit. Zo lang je de privésleutels voor een Identiteit hebt, kan je die gebruiken. Dit betekent ook dat er geen "accountherstel" is - als je je telefoon verliest, verlies je je Identiteiten.

18 |

Je kan je Identiteiten backuppen door ze te exporteren via het "Instellingen"-menu. Dit zal een kopie ervan opslaan naar een bestand in je telefoongeheugen. Het bestand kan gebruikt worden om je Identiteiten te herstellen, of ze naar een ander toestel te verplaatsen.

19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/raw-es/help_identities.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

¿Qué es una identidad?

5 |

Una identidad es como una cuenta de correo electrónico, pero sin un proveedor ajeno - puede controlar su cuenta en lugar de que lo haga un tercero como Google o Yahoo.

6 | 7 |

¿Qué es un destino?

8 |

Un destino es una dirección que usted proporciona a sus amigos para que puedan enviarle sus correos electrónicos.

9 | 10 |

¿Por qué son tan largas las direcciones de correo electrónico?

11 |

Todo el correo electrónico se cifra automáticamente por Bote. Cada dirección contiene un conjunto de claves públicas que se utilizan para cifrar correos enviados a esa dirección. La longitud de la dirección depende del tipo de cifrado usado.

12 | 13 |

¿Hay un límite para el número de identidades que puedo tener?

14 |

Puede crear tantas identidades como quiera, y utilizar distintas identidades para diferentes propósitos.

15 | 16 |

¿Cuándo caducan las identidades?

17 |

Nunca. Mientras tenga las claves privadas para una identidad, podrá usarla. Esto también significa que no hay "recuperación de cuenta" - si pierde su teléfono, pierde sus identidades.

18 |

Puede realizar una copia de seguridad de sus identidades exportándolas desde el menú "Configuración". Esto guardará una copia de ellas en un fichero en el almacenamiento de su teléfono. El fichero puede usarse para recuperar sus identidades, o moverlas a otro dispositivo.

19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/listitem_identity.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 19 | 20 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/HelpHtmlFragment.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android; 2 | 3 | import android.os.Bundle; 4 | import android.support.v4.app.Fragment; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.ScrollView; 9 | 10 | import org.sufficientlysecure.htmltextview.HtmlTextView; 11 | 12 | public class HelpHtmlFragment extends Fragment { 13 | public static final String ARG_HTML_FILE = "htmlFile"; 14 | 15 | static HelpHtmlFragment newInstance(int htmlFile) { 16 | HelpHtmlFragment f = new HelpHtmlFragment(); 17 | Bundle args = new Bundle(); 18 | args.putInt(ARG_HTML_FILE, htmlFile); 19 | f.setArguments(args); 20 | return f; 21 | } 22 | 23 | @Override 24 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 25 | ScrollView scroller = new ScrollView(getActivity()); 26 | HtmlTextView text = new HtmlTextView(getActivity()); 27 | scroller.addView(text); 28 | int padH = getResources().getDimensionPixelOffset(R.dimen.activity_horizontal_margin); 29 | int padV = getResources().getDimensionPixelOffset(R.dimen.activity_vertical_margin); 30 | text.setPadding(padH, padV, padH, padV); 31 | text.setHtmlFromRawResource(getActivity(), getArguments().getInt(ARG_HTML_FILE), true); 32 | text.setTextColor(getResources().getColor(R.color.primary_text_default_material_light)); 33 | return scroller; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/res/raw/help_identities.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 |

What is an Identity?

9 |

An Identity is like an email account, but without a provider - you control your account, instead of a third party like Google or Yahoo.

10 | 11 |

What is a Destination?

12 |

A Destination is the address that you give to your friends so they can send you emails.

13 | 14 |

Why are the email addresses so long?

15 |

Every email is automatically encrypted by Bote. Each address contains a set of public keys, which are used to encrypt emails sent to that address. The length of the address depends on the type of encryption used.

16 | 17 |

Is there a limit on the number of Identities I can have?

18 |

You can make as many Identities as you want, and use different Identities for different purposes.

19 | 20 |

When do Identities expire?

21 |

Never. As long as you have the private keys for an Identity, you can use it. This also means that there is no "account recovery" - if you lose your phone, you lose your Identities.

22 |

You can back up your Identities by exporting them from the "Settings" menu. This will save a copy of them to a file in your phone's storage. The file can be used to recover your Identities, or move them to another device.

23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/raw-de/help_identities.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Was ist eine Identität?

5 |

Eine Idnetität ist wie ein E-Mail-Konto, nur ohne einen Anbieter - Sie kontrollieren Ihr Konto, und nicht jemand anderes wie Google oder Yahoo.

6 | 7 |

Was ist eine Destination?

8 |

Eine Destination ist eine Adresse, die Sie Ihren Freunden geben können, damit diese Ihnen dann E-Mails schicken können.

9 | 10 |

Warum sind die E-Mail-Adressen so lang?

11 |

Jede E-Mail wird von Bote automatisch verschlüsselt. Jede Adresse enthält ein Paar öffentlicher Schlüsseln, um die E-Mails, die an diese Adresse geschickt werden, zu verschlüsseln. Die Länge der Adresse variiert mit je nach verwendeter Verschlüsselung.

12 | 13 |

Gibt es eine Begrenzung der Anzahl an Indentitäten, die ich haben kann?

14 |

Sie können so viele Identitäten erstellen, wie sie möchten und jeweils für verschiedene Zwecke nutzen.

15 | 16 |

Wann verfallen die Identitäten?

17 |

Niemals. Solange Sie die privaten Schlüssel für eine Identität haben, können Sie diese nutzen. Somit gibt es auch keine "Kontowiederherstellung" - verlieren Sie Ihre privaten Schlüssel (ihr Handy), verlieren Sie auch diese Identitäten.

18 |

Sie können Ihre Identitäten mit einem Export aus dem "Einstellungen"-Menü sichern. Dieses legt eine Kopie als Datei im Speicher Ihres Handys an. Diese Datei sollten Sie extern sichern und sie kann zum Wiederherstellen Ihrer Indentitäten auf diesem oder einem anderem Gerät benutzt werden.

19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/raw-fr/help_identities.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Qu'est-ce qu'une identité ?

5 |

Une identité est comme un compte email, mais sans fournisseur - vous contrôlez vote compte, au lieu que ce soit un tiers tel que Google, Yahoo, ...

6 | 7 |

Qu'est-ce qu'une Destination ?

8 |

Une Destination est l'adresse que vous indiquez à vos amis afin qu'ils puissent vous envoyer des emails.

9 | 10 |

Pourquoi les adresses emails sont-elles si longues ?

11 |

Chaque courrier électronique est chiffré automatiquement par Bote. Chaque adresse contient un ensemble de clés publiques, lesquelles sont utilisées pour chiffrer les courriers électroniques envoyés à cette adresse. La longueur de l'adresse dépend du type de chiffrement utilisé.

12 | 13 |

Y-a-t-il un nombre limite d'Identités que je peux avoir ?

14 |

Vous pouvez faire autant d'Identités que voulez, et utiliser des Identités différentes pour des buts différents.

15 | 16 |

Quand l'identité expire-t-elle ?

17 |

Jamais. Aussi longtemps que vous aurez les clés privées d'une Identité, vous pourrez l'utiliser. Ceci signifie aussi qu'il n'y a aucun "rétablissement de compte" - si vous perdez votre téléphone, vous perdez vos Identités.

18 |

Vous pouvez sauvegarder vos Identités en les exportant depuis le menu "Paramètres". Ceci sauvegardera une copie d'entre eux dans un fichier situé sur le stockage de votre téléphone. Le fichier pourra être utilisé pour récupérer vos Identités, ou pour les déplacer vers un autre dispositif.

19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/raw/help_about_libraries.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_identity_ship.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 | 19 | 20 | 24 | 25 | 29 | 30 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_edit_identity.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 | 19 | 20 | 24 | 25 | 29 | 30 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/BoteActivityBase.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.content.SharedPreferences; 5 | import android.os.Build; 6 | import android.os.Bundle; 7 | import android.preference.PreferenceManager; 8 | import android.support.v7.app.AppCompatActivity; 9 | import android.view.WindowManager; 10 | 11 | import i2p.bote.android.util.LocaleManager; 12 | 13 | @SuppressLint("Registered") 14 | public class BoteActivityBase extends AppCompatActivity { 15 | private final LocaleManager localeManager = new LocaleManager(); 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | localeManager.onCreate(this); 20 | super.onCreate(savedInstanceState); 21 | 22 | // Initialize I2P settings 23 | InitActivities init = new InitActivities(this); 24 | init.initialize(); 25 | 26 | // Initialize screen security 27 | SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 28 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH && 29 | prefs.getBoolean("pref_screen_security", true)) 30 | getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); 31 | else 32 | getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE); 33 | } 34 | 35 | @Override 36 | public void onResume() { 37 | super.onResume(); 38 | localeManager.onResume(this); 39 | } 40 | 41 | public void notifyLocaleChanged() { 42 | localeManager.onResume(this); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/res/values/arrays.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 0 5 | 1 6 | 2 7 | 3 8 | 9 | 10 | internal 11 | android 12 | remote 13 | 14 | 15 | @string/internal 16 | I2P Android 17 | @string/remote_i2p_router 18 | 19 | 20 | zz 21 | en 22 | zh 23 | de 24 | es 25 | fr 26 | in 27 | nb 28 | nl 29 | pl 30 | pt 31 | ro 32 | ru 33 | sq 34 | 35 | 36 | @string/settings_default 37 | English 38 | Chinese 中国的 39 | Deutsch 40 | Español 41 | Français 42 | Indonesia 43 | Norwegian Bokmål 44 | Nederlands 45 | Polski 46 | Português 47 | Română 48 | Russian Pусский 49 | Shqip 50 | 51 | 52 | -------------------------------------------------------------------------------- /app/src/main/res/xml/settings_privacy.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 15 | 16 | 17 | 23 | 24 | 30 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/config/AppProtectionPreferenceFragment.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android.config; 2 | 3 | import android.content.Intent; 4 | import android.os.Build; 5 | import android.os.Bundle; 6 | import android.preference.Preference; 7 | import android.support.v4.preference.PreferenceFragment; 8 | 9 | import i2p.bote.android.R; 10 | 11 | public class AppProtectionPreferenceFragment extends PreferenceFragment { 12 | @Override 13 | public void onCreate(Bundle paramBundle) { 14 | super.onCreate(paramBundle); 15 | addPreferencesFromResource(R.xml.settings_app_protection); 16 | setupAppProtectionSettings(); 17 | } 18 | 19 | @Override 20 | public void onResume() { 21 | super.onResume(); 22 | //noinspection ConstantConditions 23 | ((SettingsActivity) getActivity()).getSupportActionBar().setTitle(R.string.settings_label_app_protection); 24 | 25 | // Screen security only works from API 14 26 | Preference screenSecurityPreference = findPreference("pref_screen_security"); 27 | if (screenSecurityPreference != null && 28 | Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) 29 | getPreferenceScreen().removePreference(screenSecurityPreference); 30 | } 31 | 32 | private void setupAppProtectionSettings() { 33 | findPreference("pref_change_password").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 34 | @Override 35 | public boolean onPreferenceClick(Preference preference) { 36 | startActivity(new Intent(getActivity(), SetPasswordActivity.class)); 37 | return true; 38 | } 39 | }); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/identities/EditIdentityActivity.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android.identities; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.widget.Toolbar; 5 | import android.widget.Toast; 6 | 7 | import i2p.bote.android.BoteActivityBase; 8 | import i2p.bote.android.R; 9 | 10 | public class EditIdentityActivity extends BoteActivityBase implements 11 | EditIdentityFragment.Callbacks { 12 | @Override 13 | public void onCreate(Bundle savedInstanceState) { 14 | super.onCreate(savedInstanceState); 15 | setContentView(R.layout.activity_edit_identity); 16 | 17 | // Set the action bar 18 | Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar); 19 | setSupportActionBar(toolbar); 20 | 21 | // Enable ActionBar app icon to behave as action to go back 22 | getSupportActionBar().setDisplayHomeAsUpEnabled(true); 23 | 24 | if (savedInstanceState == null) { 25 | String key = null; 26 | Bundle args = getIntent().getExtras(); 27 | if (args != null) 28 | key = args.getString(EditIdentityFragment.IDENTITY_KEY); 29 | if (key != null) 30 | getSupportActionBar().setDisplayShowTitleEnabled(false); 31 | EditIdentityFragment f = EditIdentityFragment.newInstance(key); 32 | getSupportFragmentManager().beginTransaction() 33 | .add(R.id.edit_identity_frag, f).commit(); 34 | } 35 | } 36 | 37 | // EditIdentityFragment.Callbacks 38 | 39 | public void onTaskFinished() { 40 | Toast.makeText(this, R.string.identity_saved, 41 | Toast.LENGTH_SHORT).show(); 42 | setResult(RESULT_OK); 43 | finish(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/config/NetworkPreferenceFragment.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android.config; 2 | 3 | import android.content.SharedPreferences; 4 | import android.os.Bundle; 5 | import android.preference.PreferenceManager; 6 | import android.support.v4.preference.PreferenceFragment; 7 | 8 | import java.util.Map; 9 | 10 | import i2p.bote.Configuration; 11 | import i2p.bote.I2PBote; 12 | import i2p.bote.android.R; 13 | 14 | public class NetworkPreferenceFragment extends PreferenceFragment { 15 | @Override 16 | public void onCreate(Bundle paramBundle) { 17 | super.onCreate(paramBundle); 18 | addPreferencesFromResource(R.xml.settings_network); 19 | } 20 | 21 | @Override 22 | public void onResume() { 23 | super.onResume(); 24 | //noinspection ConstantConditions 25 | ((SettingsActivity) getActivity()).getSupportActionBar().setTitle(R.string.settings_label_network); 26 | } 27 | 28 | @Override 29 | public void onPause() { 30 | Configuration config = I2PBote.getInstance().getConfiguration(); 31 | SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 32 | 33 | Map all = prefs.getAll(); 34 | for (String x : all.keySet()) { 35 | if ("autoMailCheckEnabled".equals(x)) 36 | config.setAutoMailCheckEnabled(prefs.getBoolean(x, true)); 37 | else if ("mailCheckInterval".equals(x)) 38 | config.setMailCheckInterval(prefs.getInt(x, 30)); 39 | else if ("deliveryCheckEnabled".equals(x)) 40 | config.setDeliveryCheckEnabled(prefs.getBoolean(x, true)); 41 | } 42 | 43 | config.save(); 44 | 45 | // Store the settings in Android 46 | super.onPause(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | 120dp 7 | 64dp 8 | 9 | 320dp 10 | 16dp 11 | 48dp 12 | 13 | 20sp 14 | 16sp 15 | 14sp 16 | 17 | 8dp 18 | 16dp 19 | 40dp 20 | 24dp 21 | 72dp 22 | 8dp 23 | 24 | 48dp 25 | 56dp 26 | 27 | 88dp 28 | 29 | 54dp 30 | 31 | 64dp 32 | 64dp 33 | 34 | 32dp 35 | 8dp 36 | 12dp 37 | 16dp 38 | 39 | 200dp 40 | 41 | 300dp 42 | 43 | 32dp 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/identities/IdentityShipActivity.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android.identities; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.widget.Toolbar; 5 | import android.widget.Toast; 6 | 7 | import i2p.bote.android.BoteActivityBase; 8 | import i2p.bote.android.InitActivities; 9 | import i2p.bote.android.R; 10 | 11 | public class IdentityShipActivity extends BoteActivityBase implements 12 | IdentityShipFragment.Callbacks { 13 | public static final String EXPORTING = "exporting"; 14 | 15 | boolean mExporting; 16 | 17 | @Override 18 | public void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_identity_ship); 21 | 22 | // Set the action bar 23 | Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar); 24 | setSupportActionBar(toolbar); 25 | 26 | // Enable ActionBar app icon to behave as action to go back 27 | getSupportActionBar().setDisplayHomeAsUpEnabled(true); 28 | 29 | if (savedInstanceState == null) { 30 | Bundle args = getIntent().getExtras(); 31 | mExporting = args.getBoolean(EXPORTING); 32 | IdentityShipFragment f = IdentityShipFragment.newInstance(mExporting); 33 | getSupportFragmentManager().beginTransaction() 34 | .add(R.id.identity_ship_frag, f).commit(); 35 | } 36 | } 37 | 38 | // IdentityShipFragment.Callbacks 39 | 40 | public void onTaskFinished() { 41 | Toast.makeText(this, 42 | mExporting ? 43 | R.string.identities_exported : 44 | R.string.identities_imported, 45 | Toast.LENGTH_SHORT).show(); 46 | setResult(RESULT_OK); 47 | finish(); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_set_password.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 16 | 17 | 21 | 22 | 26 | 27 | 33 | 34 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_intro_1.xml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | 19 | 29 | 30 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_intro_3.xml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | 19 | 29 | 30 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_intro_4.xml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | 19 | 29 | 30 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_intro_2.xml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | 19 | 29 | 30 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/widget/IconicsFloatingActionButton.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android.widget; 2 | 3 | import android.content.Context; 4 | import android.content.res.TypedArray; 5 | import android.util.AttributeSet; 6 | 7 | import com.mikepenz.iconics.IconicsDrawable; 8 | 9 | import net.i2p.android.ext.floatingactionbutton.FloatingActionButton; 10 | 11 | import i2p.bote.android.R; 12 | 13 | public class IconicsFloatingActionButton extends FloatingActionButton { 14 | public IconicsFloatingActionButton(Context context) { 15 | this(context, null); 16 | } 17 | 18 | public IconicsFloatingActionButton(Context context, AttributeSet attrs) { 19 | super(context, attrs); 20 | init(context, attrs); 21 | } 22 | 23 | public IconicsFloatingActionButton(Context context, AttributeSet attrs, int defStyle) { 24 | super(context, attrs, defStyle); 25 | init(context, attrs); 26 | } 27 | 28 | private void init(Context context, AttributeSet attrs) { 29 | TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.IconicsFloatingActionButton, 0, 0); 30 | String iconName = a.getString(R.styleable.IconicsFloatingActionButton_ifab_icon); 31 | if (iconName == null) 32 | return; 33 | 34 | IconicsDrawable icon = new IconicsDrawable(context, iconName); 35 | int color = a.getColor(R.styleable.IconicsFloatingActionButton_ifab_color, 0); 36 | if (color != 0) 37 | icon.color(color); 38 | int size = a.getDimensionPixelSize(R.styleable.IconicsFloatingActionButton_ifab_size, 0); 39 | if (size != 0) 40 | icon.sizePx(size); 41 | int padding = a.getDimensionPixelSize(R.styleable.IconicsFloatingActionButton_ifab_padding, 0); 42 | if (padding != 0) 43 | icon.paddingPx(padding); 44 | 45 | a.recycle(); 46 | setIconDrawable(icon); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/i2p/bote/android/util/IconicsPreference.java: -------------------------------------------------------------------------------- 1 | package i2p.bote.android.util; 2 | 3 | import android.annotation.TargetApi; 4 | import android.content.Context; 5 | import android.content.res.TypedArray; 6 | import android.os.Build; 7 | import android.preference.Preference; 8 | import android.util.AttributeSet; 9 | 10 | import com.mikepenz.iconics.IconicsDrawable; 11 | 12 | import i2p.bote.android.R; 13 | 14 | public class IconicsPreference extends Preference { 15 | public IconicsPreference(Context context, AttributeSet attrs) { 16 | super(context, attrs); 17 | init(context, attrs); 18 | } 19 | 20 | public IconicsPreference(Context context, AttributeSet attrs, int defStyle) { 21 | super(context, attrs, defStyle); 22 | init(context, attrs); 23 | } 24 | 25 | @TargetApi(Build.VERSION_CODES.HONEYCOMB) 26 | private void init(Context context, AttributeSet attrs) { 27 | // Icons only work on API 11+ 28 | if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) 29 | return; 30 | 31 | TypedArray a = context.obtainStyledAttributes(attrs, 32 | R.styleable.IconicsPreference, 0, 0); 33 | String iconName = a.getString(R.styleable.IconicsPreference_ip_icon); 34 | if (iconName == null) 35 | return; 36 | 37 | IconicsDrawable icon = new IconicsDrawable(context, iconName); 38 | int color = a.getColor(R.styleable.IconicsPreference_ip_color, 0); 39 | if (color != 0) 40 | icon.color(color); 41 | int size = a.getDimensionPixelSize(R.styleable.IconicsPreference_ip_size, 0); 42 | if (size != 0) 43 | icon.sizePx(size); 44 | int padding = a.getDimensionPixelSize(R.styleable.IconicsPreference_ip_padding, 0); 45 | if (padding != 0) 46 | icon.paddingPx(padding); 47 | 48 | a.recycle(); 49 | setIcon(icon); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/res/layout/listitem_attachment.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 18 | 19 | 26 | 27 | 33 | 34 | 40 | 41 | 42 | 47 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_set_password.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 18 | 19 | 20 | 21 | 22 | 29 | 30 | 37 | 38 | 44 | 45 | 50 | 51 | -------------------------------------------------------------------------------- /app/src/main/java/org/sufficientlysecure/htmltextview/LocalImageGetter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2014 Dominik Schürmann 3 | * Copyright (C) 2014 drawk 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 | 18 | package org.sufficientlysecure.htmltextview; 19 | 20 | import android.content.Context; 21 | import android.graphics.drawable.Drawable; 22 | import android.text.Html; 23 | import android.util.Log; 24 | 25 | /** 26 | * Copied from http://stackoverflow.com/a/22298833 27 | */ 28 | public class LocalImageGetter implements Html.ImageGetter { 29 | Context c; 30 | 31 | public LocalImageGetter(Context c) { 32 | this.c = c; 33 | } 34 | 35 | public Drawable getDrawable(String source) { 36 | int id = c.getResources().getIdentifier(source, "drawable", c.getPackageName()); 37 | 38 | if (id == 0) { 39 | // the drawable resource wasn't found in our package, maybe it is a stock android drawable? 40 | id = c.getResources().getIdentifier(source, "drawable", "android"); 41 | } 42 | 43 | if (id == 0) { 44 | // prevent a crash if the resource still can't be found 45 | Log.e(HtmlTextView.TAG, "source could not be found: " + source); 46 | return null; 47 | } else { 48 | Drawable d = c.getResources().getDrawable(id); 49 | d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); 50 | return d; 51 | } 52 | } 53 | 54 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_list_identities.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | 17 | 18 | 22 | 23 | 31 | 32 | 33 | 34 | 46 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_import_identities.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | 17 | 18 | 24 | 25 | 31 | 32 | 38 | 39 | 45 | 46 |