├── app ├── .gitignore └── build.gradle ├── tessercubecore ├── .gitignore ├── src │ ├── main │ │ ├── ic_launcher_tessercube-web.png │ │ ├── res │ │ │ ├── drawable │ │ │ │ ├── ic_tutorial_1.png │ │ │ │ ├── ic_tutorial_2.png │ │ │ │ ├── ic_tutorial_3.png │ │ │ │ ├── ic_contract_name_background.xml │ │ │ │ ├── ic_add_black_24dp.xml │ │ │ │ ├── ic_home_black_24dp.xml │ │ │ │ ├── ic_splash.xml │ │ │ │ ├── ic_done_black_24dp.xml │ │ │ │ ├── ic_brightness_1_black_24dp.xml │ │ │ │ ├── ic_dashboard_black_24dp.xml │ │ │ │ ├── ic_person_black_24dp.xml │ │ │ │ ├── ic_chat_black_24dp.xml │ │ │ │ ├── ic_edit_black_24dp.xml │ │ │ │ ├── ic_vpn_key_black_24dp.xml │ │ │ │ ├── ic_notifications_black_24dp.xml │ │ │ │ ├── ic_search_black_24dp.xml │ │ │ │ ├── ic_account_circle_black_24dp.xml │ │ │ │ ├── ic_lock_outline_black_24dp.xml │ │ │ │ ├── ic_round_border.xml │ │ │ │ ├── ic_people_black_24dp.xml │ │ │ │ └── ic_keyboard_toggle_icon.xml │ │ │ ├── values │ │ │ │ ├── config.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── attrs_command_button.xml │ │ │ │ ├── dimens.xml │ │ │ │ └── colors.xml │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ ├── ic_launcher_tessercube.png │ │ │ │ └── ic_launcher_tessercube_round.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ ├── ic_launcher_tessercube.png │ │ │ │ └── ic_launcher_tessercube_round.png │ │ │ ├── drawable-hdpi │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── drawable-mdpi │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── drawable-xhdpi │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ ├── ic_launcher_tessercube.png │ │ │ │ └── ic_launcher_tessercube_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ ├── ic_launcher_tessercube.png │ │ │ │ └── ic_launcher_tessercube_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ ├── ic_launcher_tessercube.png │ │ │ │ └── ic_launcher_tessercube_round.png │ │ │ ├── drawable-xxhdpi │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── drawable-xxxhdpi │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── xml │ │ │ │ ├── account_preferences.xml │ │ │ │ ├── authenticator.xml │ │ │ │ └── root.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher_tessercube.xml │ │ │ │ └── ic_launcher_tessercube_round.xml │ │ │ ├── values-night │ │ │ │ └── colors.xml │ │ │ ├── menu │ │ │ │ ├── me_toolbar.xml │ │ │ │ ├── compose_toolbar.xml │ │ │ │ ├── edit_contact_toolbar.xml │ │ │ │ ├── contact_detail_toolbar.xml │ │ │ │ ├── me_add_key.xml │ │ │ │ ├── messages_toolbar.xml │ │ │ │ ├── message_from_others.xml │ │ │ │ ├── message_draft.xml │ │ │ │ ├── me_user_key_recycler_view.xml │ │ │ │ ├── message_from_me.xml │ │ │ │ ├── index_bottom.xml │ │ │ │ └── contacts_toolbar.xml │ │ │ └── layout │ │ │ │ ├── dialog_loading.xml │ │ │ │ ├── item_message_card.xml │ │ │ │ ├── empty_message.xml │ │ │ │ ├── item_contact_empty.xml │ │ │ │ ├── item_keyboard_toolbar_contract.xml │ │ │ │ ├── widget_keyboard_encrypt_button.xml │ │ │ │ ├── widget_command_button.xml │ │ │ │ ├── fragment_contacts.xml │ │ │ │ ├── activity_settings.xml │ │ │ │ ├── widget_keyboard_extend_view.xml │ │ │ │ ├── activity_interpret.xml │ │ │ │ ├── activity_index.xml │ │ │ │ ├── activity_import_contact.xml │ │ │ │ ├── view_keyboard_interpret.xml │ │ │ │ ├── item_message_contact.xml │ │ │ │ ├── item_me_key.xml │ │ │ │ ├── view_keyboard_encrypt.xml │ │ │ │ ├── widget_keyboard_encrypt_toolbar.xml │ │ │ │ ├── activity_input_private_key.xml │ │ │ │ ├── item_contact.xml │ │ │ │ ├── dialog_add_contact.xml │ │ │ │ └── widget_contact.xml │ │ └── java │ │ │ └── com │ │ │ └── sujitech │ │ │ └── tessercubecore │ │ │ ├── common │ │ │ ├── Config.kt │ │ │ ├── Constants.kt │ │ │ ├── collection │ │ │ │ ├── CollectionChangedType.kt │ │ │ │ ├── CollectionChangedEventArg.kt │ │ │ │ ├── IIncrementalSource.kt │ │ │ │ ├── ISupportIncrementalLoading.kt │ │ │ │ └── IncrementalLoadingCollection.kt │ │ │ ├── DataTracking.kt │ │ │ ├── OpenPGPUtils.kt │ │ │ ├── adapter │ │ │ │ ├── FragmentAdapter.kt │ │ │ │ └── ChildViewAdapter.kt │ │ │ ├── extension │ │ │ │ ├── HexExtensions.kt │ │ │ │ ├── ImageExtension.kt │ │ │ │ ├── pgpContentExtensions.kt │ │ │ │ └── Biometric.kt │ │ │ ├── FloatingHoverUtils.kt │ │ │ ├── UserPasswordStorage.kt │ │ │ ├── IMEUtils.kt │ │ │ └── Settings.kt │ │ │ ├── fragment │ │ │ └── ViewPagerFragment.kt │ │ │ ├── widget │ │ │ ├── ImageSwitch.kt │ │ │ ├── BlockedViewPager.kt │ │ │ ├── ContactView.kt │ │ │ └── CommandButton.kt │ │ │ ├── data │ │ │ └── DbContext.kt │ │ │ ├── activity │ │ │ ├── SplashActivity.kt │ │ │ ├── keypair │ │ │ │ └── ImportKeyActivity.kt │ │ │ ├── BaseActivity.kt │ │ │ ├── TutorialActivity.kt │ │ │ └── contact │ │ │ │ ├── EditContactActivity.kt │ │ │ │ └── ImportContactActivity.kt │ │ │ ├── keyboard │ │ │ └── KeyboardEncryptButton.kt │ │ │ └── service │ │ │ └── DummyAccountService.kt │ └── androidTest │ │ └── java │ │ └── com │ │ └── sujitech │ │ └── tessercubecore │ │ └── ExampleInstrumentedTest.kt └── proguard-rules.pro ├── settings.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── PinyinIME ├── src │ └── main │ │ ├── res │ │ ├── drawable │ │ │ ├── num0.png │ │ │ ├── num1.png │ │ │ ├── num2.png │ │ │ ├── num3.png │ │ │ ├── num4.png │ │ │ ├── num5.png │ │ │ ├── num6.png │ │ │ ├── num7.png │ │ │ ├── num8.png │ │ │ ├── num9.png │ │ │ ├── app_icon.png │ │ │ ├── dun_icon.png │ │ │ ├── ime_en.png │ │ │ ├── numalt.png │ │ │ ├── numpound.png │ │ │ ├── numstar.png │ │ │ ├── skb_bg.png │ │ │ ├── arrow_left.png │ │ │ ├── enter_icon.png │ │ │ ├── ime_pinyin.png │ │ │ ├── space_icon.png │ │ │ ├── arrow_right.png │ │ │ ├── delete_icon.png │ │ │ ├── miniskb_bg.9.png │ │ │ ├── period_icon.png │ │ │ ├── search_icon.png │ │ │ ├── shift_on_icon.png │ │ │ ├── smiley_icon.png │ │ │ ├── candidate_hl_bg.png │ │ │ ├── comma_full_icon.png │ │ │ ├── composing_hl_bg.png │ │ │ ├── dun_popup_icon.png │ │ │ ├── emotion_icon_00.png │ │ │ ├── emotion_icon_01.png │ │ │ ├── emotion_icon_02.png │ │ │ ├── emotion_icon_03.png │ │ │ ├── emotion_icon_04.png │ │ │ ├── emotion_icon_05.png │ │ │ ├── emotion_icon_06.png │ │ │ ├── emotion_icon_10.png │ │ │ ├── emotion_icon_11.png │ │ │ ├── emotion_icon_12.png │ │ │ ├── emotion_icon_13.png │ │ │ ├── emotion_icon_14.png │ │ │ ├── emotion_icon_15.png │ │ │ ├── emotion_icon_16.png │ │ │ ├── emotion_icon_20.png │ │ │ ├── emotion_icon_21.png │ │ │ ├── emotion_icon_22.png │ │ │ ├── emotion_icon_23.png │ │ │ ├── emotion_icon_24.png │ │ │ ├── light_key_bg.9.png │ │ │ ├── normal_key_bg.9.png │ │ │ ├── shift_off_icon.png │ │ │ ├── delete_popup_icon.png │ │ │ ├── enter_popup_icon.png │ │ │ ├── key_balloon_bg.9.png │ │ │ ├── light_key_hl_bg.9.png │ │ │ ├── light_key_up_bg.9.png │ │ │ ├── normal_key_hl_bg.9.png │ │ │ ├── period_full_icon.png │ │ │ ├── period_popup_icon.png │ │ │ ├── search_popup_icon.png │ │ │ ├── skb_container_bg.9.png │ │ │ ├── smiley_popup_icon.png │ │ │ ├── space_popup_icon.png │ │ │ ├── candidates_area_bg.9.png │ │ │ ├── cands_container_bg.9.png │ │ │ ├── composing_area_bg.9.png │ │ │ ├── light_key_up_hl_bg.9.png │ │ │ ├── shift_off_popup_icon.png │ │ │ ├── shift_on_popup_icon.png │ │ │ ├── candidate_balloon_bg.9.png │ │ │ ├── comma_full_popup_icon.png │ │ │ ├── composing_area_cursor.png │ │ │ ├── emotion_icon_00_popup.png │ │ │ ├── emotion_icon_01_popup.png │ │ │ ├── emotion_icon_02_popup.png │ │ │ ├── emotion_icon_03_popup.png │ │ │ ├── emotion_icon_04_popup.png │ │ │ ├── emotion_icon_05_popup.png │ │ │ ├── emotion_icon_06_popup.png │ │ │ ├── emotion_icon_10_popup.png │ │ │ ├── emotion_icon_11_popup.png │ │ │ ├── emotion_icon_12_popup.png │ │ │ ├── emotion_icon_13_popup.png │ │ │ ├── emotion_icon_14_popup.png │ │ │ ├── emotion_icon_15_popup.png │ │ │ ├── emotion_icon_16_popup.png │ │ │ ├── emotion_icon_20_popup.png │ │ │ ├── emotion_icon_21_popup.png │ │ │ ├── emotion_icon_22_popup.png │ │ │ ├── emotion_icon_23_popup.png │ │ │ ├── emotion_icon_24_popup.png │ │ │ ├── period_full_popup_icon.png │ │ │ ├── candidates_vertical_line.png │ │ │ └── arrow_bg.xml │ │ ├── raw │ │ │ └── dict_pinyin.dat │ │ ├── values │ │ │ ├── dimens.xml │ │ │ ├── colors.xml │ │ │ └── strings.xml │ │ ├── values-land │ │ │ └── dimens.xml │ │ ├── values-port │ │ │ └── dimens.xml │ │ ├── layout │ │ │ ├── floating_container.xml │ │ │ ├── skb_container.xml │ │ │ └── candidates_container.xml │ │ └── xml │ │ │ ├── skb_sym2.xml │ │ │ ├── settings.xml │ │ │ ├── skb_phone.xml │ │ │ ├── skb_sym1.xml │ │ │ └── skb_qwerty.xml │ │ ├── cpp │ │ ├── data │ │ │ ├── valid_utf16.txt │ │ │ └── rawdict_utf16_65105_freq.txt │ │ ├── command │ │ │ ├── Makefile │ │ │ └── pinyinime_dictbuilder.cpp │ │ ├── Android.mk │ │ ├── include │ │ │ ├── mystdlib.h │ │ │ ├── utf16reader.h │ │ │ ├── utf16char.h │ │ │ ├── lpicache.h │ │ │ ├── sync.h │ │ │ └── ngram.h │ │ ├── share │ │ │ ├── mystdlib.cpp │ │ │ ├── lpicache.cpp │ │ │ └── sync.cpp │ │ └── CMakeLists.txt │ │ ├── java │ │ └── com │ │ │ └── android │ │ │ └── inputmethod │ │ │ └── pinyin │ │ │ ├── CandidateViewListener.java │ │ │ ├── SoundManager.java │ │ │ └── SkbPool.java │ │ ├── AndroidManifest.xml │ │ └── aidl │ │ └── com │ │ └── android │ │ └── inputmethod │ │ └── pinyin │ │ └── IPinyinDecoderService.aidl └── build.gradle ├── .gitmodules ├── .travis.yml ├── .gitignore ├── metadata └── com.dimension.tessercube.yml ├── appveyor.yml ├── privacy_policy.md ├── README.md └── gradlew.bat /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /tessercubecore/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | .kotlintest -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':tessercubecore', ':PinyinIME' 2 | rootProject.name = "Tessercube" 3 | 4 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | android.enableJetifier=true 2 | android.useAndroidX=true 3 | org.gradle.jvmargs=-Xmx1536m 4 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/num0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/num0.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/num1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/num1.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/num2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/num2.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/num3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/num3.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/num4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/num4.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/num5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/num5.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/num6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/num6.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/num7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/num7.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/num8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/num8.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/num9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/num9.png -------------------------------------------------------------------------------- /PinyinIME/src/main/cpp/data/valid_utf16.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/cpp/data/valid_utf16.txt -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/app_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/dun_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/dun_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/ime_en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/ime_en.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/numalt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/numalt.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/numpound.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/numpound.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/numstar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/numstar.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/skb_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/skb_bg.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/raw/dict_pinyin.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/raw/dict_pinyin.dat -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/arrow_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/arrow_left.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/enter_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/enter_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/ime_pinyin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/ime_pinyin.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/space_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/space_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/arrow_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/arrow_right.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/delete_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/delete_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/miniskb_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/miniskb_bg.9.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/period_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/period_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/search_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/search_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/shift_on_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/shift_on_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/smiley_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/smiley_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/candidate_hl_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/candidate_hl_bg.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/comma_full_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/comma_full_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/composing_hl_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/composing_hl_bg.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/dun_popup_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/dun_popup_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_00.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_01.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_02.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_03.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_04.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_05.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_06.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_10.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_11.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_12.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_13.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_14.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_15.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_16.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_20.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_21.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_22.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_23.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_24.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/light_key_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/light_key_bg.9.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/normal_key_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/normal_key_bg.9.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/shift_off_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/shift_off_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/delete_popup_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/delete_popup_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/enter_popup_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/enter_popup_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/key_balloon_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/key_balloon_bg.9.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/light_key_hl_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/light_key_hl_bg.9.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/light_key_up_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/light_key_up_bg.9.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/normal_key_hl_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/normal_key_hl_bg.9.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/period_full_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/period_full_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/period_popup_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/period_popup_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/search_popup_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/search_popup_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/skb_container_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/skb_container_bg.9.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/smiley_popup_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/smiley_popup_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/space_popup_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/space_popup_icon.png -------------------------------------------------------------------------------- /tessercubecore/src/main/ic_launcher_tessercube-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/ic_launcher_tessercube-web.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_tutorial_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/drawable/ic_tutorial_1.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_tutorial_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/drawable/ic_tutorial_2.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_tutorial_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/drawable/ic_tutorial_3.png -------------------------------------------------------------------------------- /PinyinIME/src/main/cpp/data/rawdict_utf16_65105_freq.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/cpp/data/rawdict_utf16_65105_freq.txt -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/candidates_area_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/candidates_area_bg.9.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/cands_container_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/cands_container_bg.9.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/composing_area_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/composing_area_bg.9.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/light_key_up_hl_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/light_key_up_hl_bg.9.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/shift_off_popup_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/shift_off_popup_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/shift_on_popup_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/shift_on_popup_icon.png -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/Config.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common 2 | 3 | import com.sujitech.tessercubecore.BuildConfig 4 | -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/candidate_balloon_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/candidate_balloon_bg.9.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/comma_full_popup_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/comma_full_popup_icon.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/composing_area_cursor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/composing_area_cursor.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_00_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_00_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_01_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_01_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_02_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_02_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_03_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_03_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_04_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_04_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_05_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_05_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_06_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_06_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_10_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_10_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_11_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_11_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_12_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_12_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_13_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_13_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_14_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_14_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_15_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_15_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_16_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_16_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_20_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_20_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_21_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_21_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_22_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_22_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_23_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_23_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/emotion_icon_24_popup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/emotion_icon_24_popup.png -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/period_full_popup_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/period_full_popup_icon.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/values/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/candidates_vertical_line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/PinyinIME/src/main/res/drawable/candidates_vertical_line.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #074C86 4 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-hdpi/ic_launcher_tessercube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/mipmap-hdpi/ic_launcher_tessercube.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-mdpi/ic_launcher_tessercube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/mipmap-mdpi/ic_launcher_tessercube.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/drawable-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/drawable-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/drawable-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-xhdpi/ic_launcher_tessercube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/mipmap-xhdpi/ic_launcher_tessercube.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-xxhdpi/ic_launcher_tessercube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/mipmap-xxhdpi/ic_launcher_tessercube.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-xxxhdpi/ic_launcher_tessercube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/mipmap-xxxhdpi/ic_launcher_tessercube.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-hdpi/ic_launcher_tessercube_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/mipmap-hdpi/ic_launcher_tessercube_round.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-mdpi/ic_launcher_tessercube_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/mipmap-mdpi/ic_launcher_tessercube_round.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-xhdpi/ic_launcher_tessercube_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/mipmap-xhdpi/ic_launcher_tessercube_round.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-xxhdpi/ic_launcher_tessercube_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/mipmap-xxhdpi/ic_launcher_tessercube_round.png -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-xxxhdpi/ic_launcher_tessercube_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DimensionDev/TesserPG-Android/HEAD/tessercubecore/src/main/res/mipmap-xxxhdpi/ic_launcher_tessercube_round.png -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/Constants.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common 2 | 3 | import org.ocpsoft.prettytime.PrettyTime 4 | 5 | val prettyTime by lazy { 6 | PrettyTime() 7 | } -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/collection/CollectionChangedType.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common.collection 2 | 3 | enum class CollectionChangedType { 4 | Add, 5 | Remove, 6 | Update, 7 | Reset, 8 | } -------------------------------------------------------------------------------- /tessercubecore/src/main/res/values/attrs_command_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/collection/CollectionChangedEventArg.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common.collection 2 | 3 | class CollectionChangedEventArg( 4 | val type: CollectionChangedType, 5 | val index: Int = -1, 6 | val count: Int = 1 7 | ) -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "inputmethodcommon"] 2 | path = inputmethodcommon 3 | url = https://android.googlesource.com/platform/frameworks/opt/inputmethodcommon 4 | branch = pie-platform-release 5 | [submodule "LatinIME"] 6 | path = LatinIME 7 | url = https://github.com/DimensionDev/LatinIME.git 8 | branch = pie-fork 9 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/xml/account_preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionSha256Sum=14cd15fc8cc8705bd69dcfa3c8fefb27eb7027f5de4b47a8b279218f76895a91 7 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_contract_name_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-anydpi-v26/ic_launcher_tessercube.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/mipmap-anydpi-v26/ic_launcher_tessercube_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/DataTracking.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common 2 | 3 | import android.app.Application 4 | 5 | object DataTracking { 6 | fun init(app: Application) { 7 | // Do nothing 8 | } 9 | fun track(name: String, data: Map) { 10 | // Do nothing 11 | } 12 | } -------------------------------------------------------------------------------- /tessercubecore/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #3F51B5 6 | 7 | #f5f5f5 8 | 9 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #2196F3 4 | #1976D2 5 | #2196F3 6 | 7 | #f5f5f5 8 | 9 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/collection/IIncrementalSource.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common.collection 2 | 3 | interface IIncrementalSource { 4 | suspend fun getPagedItemAsync(page: Int, count: Int): List 5 | } 6 | 7 | interface ICachedIncrementalSource: IIncrementalSource { 8 | suspend fun getCachedItemsAsync(): List 9 | } -------------------------------------------------------------------------------- /tessercubecore/src/main/res/xml/authenticator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/menu/me_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/menu/compose_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | 3 | android: 4 | components: 5 | - platform-tools 6 | - tools 7 | - build-tools-28.0.3 8 | - android-28 9 | - extra-android-m2repository 10 | - extra-google-m2repository 11 | - extra-android-support 12 | 13 | before_install: 14 | - chmod +x ./gradlew 15 | script: 16 | - echo y | sdkmanager "ndk-bundle" "platforms;android-28" 17 | - ./gradlew assembleDebug -------------------------------------------------------------------------------- /tessercubecore/src/main/res/layout/dialog_loading.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/menu/edit_contact_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/fragment/ViewPagerFragment.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.fragment 2 | 3 | import android.view.KeyEvent 4 | import androidx.fragment.app.Fragment 5 | 6 | abstract class ViewPagerFragment: Fragment() { 7 | open fun onPageSelected() { 8 | 9 | } 10 | 11 | open fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { 12 | return false 13 | } 14 | } -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_add_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_home_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_splash.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/layout/item_message_card.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/menu/contact_detail_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_done_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_brightness_1_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_dashboard_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/menu/me_add_key.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/collection/ISupportIncrementalLoading.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common.collection 2 | 3 | import kotlinx.coroutines.CoroutineScope 4 | 5 | interface ISupportIncrementalLoading { 6 | suspend fun loadMoreItemsAsync() 7 | val hasMoreItems: Boolean 8 | val scope: CoroutineScope 9 | } 10 | 11 | interface ISupportCacheLoading { 12 | suspend fun loadCachedAsync() 13 | val scope: CoroutineScope 14 | } 15 | 16 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/menu/messages_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/OpenPGPUtils.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common 2 | 3 | import android.graphics.Color 4 | import moe.tlaster.kotlinpgp.data.VerifyStatus 5 | 6 | fun VerifyStatus.toColor(): Int { 7 | return when (this) { 8 | VerifyStatus.NO_SIGNATURE -> Color.TRANSPARENT 9 | VerifyStatus.SIGNATURE_BAD -> Color.RED 10 | VerifyStatus.SIGNATURE_OK -> Color.GREEN 11 | VerifyStatus.UNKNOWN_PUBLIC_KEY -> Color.YELLOW 12 | } 13 | } -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_person_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/adapter/FragmentAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common.adapter 2 | 3 | import androidx.fragment.app.Fragment 4 | import androidx.fragment.app.FragmentManager 5 | import androidx.fragment.app.FragmentPagerAdapter 6 | 7 | 8 | class FragmentAdapter(val list: List, fm: FragmentManager) : FragmentPagerAdapter(fm) { 9 | override fun getItem(position: Int): Fragment = list[position] 10 | override fun getCount(): Int = list.size 11 | } 12 | 13 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_chat_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_edit_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/menu/message_from_others.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 12 | 16 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_vpn_key_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_notifications_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/extension/HexExtensions.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common.extension 2 | 3 | import kotlin.math.absoluteValue 4 | 5 | fun String.toFormattedHexText(): String { 6 | return toUpperCase().chunked(4).joinToString(" ") 7 | } 8 | 9 | fun String.splitTo(numberEachLine: Int): String { 10 | return split(" ").chunked(numberEachLine).map { it.joinToString(" ") }.joinToString(System.lineSeparator()) 11 | } 12 | 13 | fun Long.toFormattedHexText(): String { 14 | return absoluteValue.toString(16).toFormattedHexText() 15 | } -------------------------------------------------------------------------------- /tessercubecore/src/main/res/layout/empty_message.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 13 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/layout/item_contact_empty.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 13 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/widget/ImageSwitch.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.widget 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.widget.ImageButton 6 | import android.widget.ImageView 7 | import androidx.core.widget.ImageViewCompat 8 | 9 | class ImageSwitch : ImageButton { 10 | constructor(context: Context) : super(context) 11 | constructor(context: Context, attrs: AttributeSet) : super(context, attrs) 12 | constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) 13 | 14 | } -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_search_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/data/DbContext.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.data 2 | 3 | import com.sujitech.tessercubecore.appContext 4 | import io.requery.Persistable 5 | import io.requery.android.sqlite.DatabaseSource 6 | import io.requery.reactivex.KotlinReactiveEntityStore 7 | import io.requery.sql.KotlinEntityDataStore 8 | 9 | 10 | object DbContext { 11 | 12 | val data: KotlinReactiveEntityStore by lazy { 13 | val source = DatabaseSource(appContext, Models.DEFAULT, 1) 14 | KotlinReactiveEntityStore(KotlinEntityDataStore(source.configuration)) 15 | } 16 | } -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_account_circle_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/menu/message_draft.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 12 | 16 | 20 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/menu/me_user_key_recycler_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 15 | 19 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/menu/message_from_me.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 12 | 16 | 20 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_lock_outline_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/menu/index_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 12 | 16 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_round_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 13 | 18 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/activity/SplashActivity.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.activity 2 | 3 | import android.os.Bundle 4 | import com.sujitech.tessercubecore.common.Settings 5 | import com.sujitech.tessercubecore.common.extension.toActivity 6 | 7 | class SplashActivity : BaseActivity() { 8 | 9 | override fun onCreate(savedInstanceState: Bundle?) { 10 | super.onCreate(savedInstanceState) 11 | if (Settings.get("is_first_run", true)) { 12 | Settings.set("is_first_run", false) 13 | toActivity() 14 | } else { 15 | toActivity() 16 | } 17 | finish() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/drawable/ic_people_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/menu/contacts_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 15 | 16 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/xml/root.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 7 | 10 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/layout/item_keyboard_toolbar_contract.xml: -------------------------------------------------------------------------------- 1 | 2 | 18 | 19 | -------------------------------------------------------------------------------- /PinyinIME/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 0dip 18 | 19 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/widget/BlockedViewPager.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.widget 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.view.MotionEvent 6 | import androidx.viewpager.widget.ViewPager 7 | 8 | class BlockedViewPager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) { 9 | 10 | var pagingEnabled: Boolean = false 11 | 12 | override fun onTouchEvent(event: MotionEvent): Boolean { 13 | return if (this.pagingEnabled) { 14 | super.onTouchEvent(event) 15 | } else false 16 | 17 | } 18 | 19 | override fun onInterceptTouchEvent(event: MotionEvent): Boolean { 20 | return if (this.pagingEnabled) { 21 | super.onInterceptTouchEvent(event) 22 | } else false 23 | 24 | } 25 | 26 | } -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/adapter/ChildViewAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common.adapter 2 | 3 | import android.view.View 4 | import android.view.ViewGroup 5 | import androidx.viewpager.widget.PagerAdapter 6 | import androidx.viewpager.widget.ViewPager 7 | 8 | class ChildViewAdapter(private val viewPager: ViewPager) : PagerAdapter() { 9 | init { 10 | viewPager.offscreenPageLimit = viewPager.childCount 11 | } 12 | 13 | override fun instantiateItem(container: ViewGroup, position: Int): Any { 14 | return viewPager.getChildAt(position) 15 | } 16 | 17 | override fun isViewFromObject(view: View, `object`: Any): Boolean { 18 | return view === `object` as View 19 | } 20 | 21 | override fun getCount(): Int { 22 | return viewPager.childCount 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /PinyinIME/src/main/cpp/command/Makefile: -------------------------------------------------------------------------------- 1 | CC=gcc 2 | CFLAGS= -g -Wall -std=c99 3 | CPP=g++ 4 | CPPFLAGS= -g3 -Wall -lpthread 5 | 6 | PINYINIME_DICTBUILDER=pinyinime_dictbuilder 7 | 8 | LIBRARY_SRC= \ 9 | ../share/dictbuilder.cpp \ 10 | ../share/dictlist.cpp \ 11 | ../share/dicttrie.cpp \ 12 | ../share/lpicache.cpp \ 13 | ../share/mystdlib.cpp \ 14 | ../share/ngram.cpp \ 15 | ../share/searchutility.cpp \ 16 | ../share/spellingtable.cpp \ 17 | ../share/spellingtrie.cpp \ 18 | ../share/splparser.cpp \ 19 | ../share/utf16char.cpp \ 20 | ../share/utf16reader.cpp \ 21 | 22 | all: engine 23 | 24 | engine: $(PINYINIME_DICTBUILDER) 25 | 26 | $(PINYINIME_DICTBUILDER): $(LIBRARY_SRC) pinyinime_dictbuilder.cpp 27 | @$(CPP) $(CPPFLAGS) -o $@ $? 28 | 29 | 30 | clean: 31 | -rm -rf $(PINYINIME_DICTBUILDER) 32 | 33 | .PHONY: clean 34 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/extension/ImageExtension.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common.extension 2 | 3 | import android.graphics.Bitmap 4 | import android.graphics.drawable.Drawable 5 | import android.widget.ImageView 6 | import androidx.annotation.DrawableRes 7 | import com.bumptech.glide.Glide 8 | import java.io.File 9 | 10 | fun ImageView.load(path: String) { 11 | Glide.with(this).load(path).centerCrop().into(this) 12 | } 13 | fun ImageView.load(bitmap: Bitmap) { 14 | Glide.with(this).load(bitmap).centerCrop().into(this) 15 | } 16 | fun ImageView.load(drawable: Drawable) { 17 | Glide.with(this).load(drawable).centerCrop().into(this) 18 | } 19 | fun ImageView.load(@DrawableRes id: Int) { 20 | Glide.with(this).load(id).centerCrop().into(this) 21 | } 22 | fun ImageView.load(file: File) { 23 | Glide.with(this).load(file).centerCrop().into(this) 24 | } -------------------------------------------------------------------------------- /PinyinIME/src/main/res/values-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 10dip 18 | 16dip 19 | 20 | -------------------------------------------------------------------------------- /PinyinIME/src/main/res/values-port/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 3dip 18 | 18dip 19 | 20 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/FloatingHoverUtils.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import android.net.Uri 6 | import android.os.Build 7 | import android.provider.Settings 8 | 9 | object FloatingHoverUtils { 10 | fun hasPermission(context: Context): Boolean { 11 | return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Settings.canDrawOverlays(context) 12 | } 13 | 14 | fun checkPermission(context: Context) { 15 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 16 | if (!hasPermission(context)) { 17 | val intent = Intent( 18 | Settings.ACTION_MANAGE_OVERLAY_PERMISSION, 19 | Uri.parse("package:${context.packageName}") 20 | ) 21 | context.startActivity(intent) 22 | } 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/extension/pgpContentExtensions.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common.extension 2 | 3 | // 4 | //val String.isPGPMessage 5 | // get() = 6 | // (this.startsWith(appContext.getString(R.string.pgp_message_start)) 7 | // && this.endsWith(appContext.getString(R.string.pgp_message_end))) 8 | // || (this.startsWith(appContext.getString(R.string.pgp_signed_message_start)) 9 | // && this.endsWith(appContext.getString(R.string.pgp_signed_message_end))) 10 | // 11 | // 12 | //val String.isPGPPublicKey 13 | // get() = this.startsWith(appContext.getString(R.string.pgp_public_key_start)) && this.endsWith(appContext.getString(R.string.pgp_public_key_end)) 14 | // 15 | //val String.isPGPPrivateKey 16 | // get() = this.startsWith(appContext.getString(R.string.pgp_private_key_start)) && this.endsWith(appContext.getString(R.string.pgp_private_key_end)) 17 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/UserPasswordStorage.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common 2 | 3 | import android.accounts.Account 4 | import android.accounts.AccountManager 5 | import android.content.Context 6 | 7 | 8 | object UserPasswordStorage { 9 | fun save(context: Context, id: String, password: String): Boolean { 10 | val accountManager = AccountManager.get(context) 11 | val account = Account(id, context.packageName) 12 | return accountManager.addAccountExplicitly(account, password, null) 13 | } 14 | 15 | fun get(context: Context, id: String): String? { 16 | val accountManager = AccountManager.get(context) 17 | val account = accountManager.accounts.firstOrNull { 18 | it.name == id 19 | } 20 | return if (account != null) { 21 | accountManager.getPassword(account) 22 | } else { 23 | null 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /PinyinIME/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | //apply plugin: "com.android.application" 3 | 4 | android { 5 | compileSdkVersion target_version 6 | 7 | defaultConfig { 8 | minSdkVersion min_version 9 | targetSdkVersion target_version 10 | // applicationId "com.android.inputmethod.pinyin" 11 | 12 | externalNativeBuild { 13 | cmake { 14 | cppFlags "-Wall" 15 | } 16 | } 17 | } 18 | 19 | 20 | buildTypes { 21 | release { 22 | minifyEnabled false 23 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 24 | } 25 | } 26 | 27 | externalNativeBuild { 28 | cmake { 29 | path 'src/main/cpp/CMakeLists.txt' 30 | } 31 | } 32 | 33 | compileOptions { 34 | sourceCompatibility 1.8 35 | targetCompatibility 1.8 36 | } 37 | } 38 | 39 | dependencies { 40 | } -------------------------------------------------------------------------------- /PinyinIME/src/main/cpp/Android.mk: -------------------------------------------------------------------------------- 1 | LOCAL_PATH := $(call my-dir) 2 | 3 | ### shared library 4 | 5 | include $(CLEAR_VARS) 6 | 7 | LOCAL_SRC_FILES := \ 8 | android/com_android_inputmethod_pinyin_PinyinDecoderService.cpp \ 9 | share/dictbuilder.cpp \ 10 | share/dictlist.cpp \ 11 | share/dicttrie.cpp \ 12 | share/lpicache.cpp \ 13 | share/matrixsearch.cpp \ 14 | share/mystdlib.cpp \ 15 | share/ngram.cpp \ 16 | share/pinyinime.cpp \ 17 | share/searchutility.cpp \ 18 | share/spellingtable.cpp \ 19 | share/spellingtrie.cpp \ 20 | share/splparser.cpp \ 21 | share/userdict.cpp \ 22 | share/utf16char.cpp \ 23 | share/utf16reader.cpp \ 24 | share/sync.cpp 25 | 26 | LOCAL_C_INCLUDES += $(JNI_H_INCLUDE) 27 | LOCAL_MODULE := libjni_pinyinime 28 | #LOCAL_SHARED_LIBRARIES := libcutils libutils 29 | LOCAL_MODULE_TAGS := optional 30 | 31 | LOCAL_CFLAGS += -D_PLATFORM_ANDROID 32 | LOCAL_LDLIBS := -llog -landroid -lz 33 | 34 | include $(BUILD_SHARED_LIBRARY) 35 | APP_CFLAGS += -Wno-error=format-security 36 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/activity/keypair/ImportKeyActivity.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.activity.keypair 2 | 3 | import android.os.Bundle 4 | import com.sujitech.tessercubecore.R 5 | import com.sujitech.tessercubecore.activity.BaseActivity 6 | import com.sujitech.tessercubecore.common.extension.toActivity 7 | import kotlinx.android.synthetic.main.activity_import_key.* 8 | 9 | class ImportKeyActivity : BaseActivity() { 10 | 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | setContentView(R.layout.activity_import_key) 14 | cancel_button.setOnClickListener { 15 | finish() 16 | } 17 | paste_private_key_button.setOnClickListener { 18 | toActivity() 19 | finish() 20 | } 21 | scan_qr_code_button.setOnClickListener { 22 | 23 | } 24 | mnemonic_words_button.setOnClickListener { 25 | 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/layout/widget_keyboard_encrypt_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /PinyinIME/src/main/res/drawable/arrow_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 19 | 21 | 22 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/layout/widget_command_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 14 | 15 | 23 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/activity/BaseActivity.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.activity 2 | 3 | import android.os.Bundle 4 | import android.view.MenuItem 5 | import androidx.appcompat.app.AppCompatActivity 6 | import androidx.appcompat.widget.Toolbar 7 | import com.sujitech.tessercubecore.R 8 | 9 | 10 | abstract class BaseActivity: AppCompatActivity() { 11 | 12 | override fun onPostCreate(savedInstanceState: Bundle?) { 13 | super.onPostCreate(savedInstanceState) 14 | val toolbar = findViewById(R.id.toolbar) 15 | if (toolbar != null) { 16 | setSupportActionBar(toolbar) 17 | } 18 | } 19 | 20 | override fun onOptionsItemSelected(item: MenuItem?): Boolean { 21 | if (item != null && item.itemId == android.R.id.home) { 22 | onBackPressed() 23 | } 24 | return super.onOptionsItemSelected(item) 25 | } 26 | 27 | override fun onDestroy() { 28 | super.onDestroy() 29 | onDestroyCallback?.invoke() 30 | } 31 | 32 | public var onDestroyCallback: (() -> Unit)? = null 33 | } -------------------------------------------------------------------------------- /tessercubecore/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -keep public class * implements com.bumptech.glide.module.GlideModule 23 | -keep public class * extends com.bumptech.glide.module.AppGlideModule 24 | -keep public enum com.bumptech.glide.load.ImageHeaderParser$** { 25 | **[] $VALUES; 26 | public *; 27 | } 28 | 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | # Android Studio captures folder 33 | captures/ 34 | 35 | # IntelliJ 36 | *.iml 37 | .idea/workspace.xml 38 | .idea/tasks.xml 39 | .idea/gradle.xml 40 | .idea/dictionaries 41 | .idea/libraries 42 | 43 | # Keystore files 44 | # Uncomment the following line if you do not want to check your keystore files in. 45 | #*.jks 46 | 47 | # External native build folder generated in Android Studio 2.2 and later 48 | .externalNativeBuild 49 | 50 | # Google Services (e.g. APIs or Firebase) 51 | google-services.json 52 | 53 | # Freeline 54 | freeline.py 55 | freeline/ 56 | freeline_project_description.json 57 | 58 | \.idea/ 59 | 60 | \.circleci/keys/ 61 | 62 | .cxx 63 | .settings 64 | .project 65 | .classpath -------------------------------------------------------------------------------- /PinyinIME/src/main/cpp/include/mystdlib.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2009 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #ifndef PINYINIME_INCLUDE_MYSTDLIB_H__ 18 | #define PINYINIME_INCLUDE_MYSTDLIB_H__ 19 | 20 | #include 21 | 22 | namespace ime_pinyin { 23 | 24 | void myqsort(void *p, size_t n, size_t es, 25 | int (*cmp)(const void *, const void *)); 26 | 27 | void *mybsearch(const void *key, const void *base, 28 | size_t nmemb, size_t size, 29 | int (*compar)(const void *, const void *)); 30 | } 31 | 32 | #endif // PINYINIME_INCLUDE_MYSTDLIB_H__ 33 | -------------------------------------------------------------------------------- /PinyinIME/src/main/java/com/android/inputmethod/pinyin/CandidateViewListener.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2009 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.android.inputmethod.pinyin; 18 | 19 | /** 20 | * Interface to notify the input method when the user clicks a candidate or 21 | * makes a direction-gesture on candidate view. 22 | */ 23 | public interface CandidateViewListener { 24 | public void onClickChoice(int choiceId); 25 | 26 | public void onToLeftGesture(); 27 | 28 | public void onToRightGesture(); 29 | 30 | public void onToTopGesture(); 31 | 32 | public void onToBottomGesture(); 33 | } 34 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/layout/fragment_contacts.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 24 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/layout/activity_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 17 | 25 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/layout/widget_keyboard_extend_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 12 | 13 | 14 | 20 | 25 | 26 | -------------------------------------------------------------------------------- /PinyinIME/src/main/res/layout/floating_container.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 21 | 22 | 27 | 28 | -------------------------------------------------------------------------------- /metadata/com.dimension.tessercube.yml: -------------------------------------------------------------------------------- 1 | 2 | Name: Tessercube 3 | 4 | # Categories (one per line, each starting with a space and a minus), chosen from the 5 | # official list: https://gitlab.com/fdroid/fdroiddata/blob/master/stats/categories.txt 6 | Categories: Security 7 | 8 | # the one license that the whole app is available under, use 9 | # https://spdx.org/licenses/ short identifiers, must be 10 | # floss-compatible. 11 | License: AGPL-3.0 12 | 13 | # A URL for the project's website 14 | WebSite: https://tessercube.com/ 15 | 16 | # A link to the issue tracker where bugs are reported 17 | IssueTracker: https://github.com/DimensionDev/Tessercube-Android/issues 18 | 19 | # One sentence, no more than 30-50 chars, no trailing punctuation, 20 | # focus on actions what the users does with the app, e.g. "Read and 21 | # send emails" instead of "Email client". 22 | Summary: OpenPGP Made Mobile 23 | Description: | 24 | OpenPGP Made Mobile 25 | 26 | # git, git-svn, svn, hg or bzr 27 | RepoType: git 28 | 29 | # source code repo URL (HTTPS required) 30 | Repo: https://github.com/DimensionDev/Tessercube-Android.git 31 | 32 | Builds: 33 | - versionName: '1.0' 34 | versionCode: 1 35 | commit: 0.2.5 36 | subdir: app 37 | gradle: 38 | - yes 39 | 40 | AutoUpdateMode: Version %v 41 | UpdateCheckMode: Tags -------------------------------------------------------------------------------- /PinyinIME/src/main/cpp/share/mystdlib.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2009 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #include 18 | 19 | namespace ime_pinyin { 20 | 21 | // For debug purpose. You can add a fixed version of qsort and bsearch functions 22 | // here so that the output will be totally the same under different platforms. 23 | 24 | void myqsort(void *p, size_t n, size_t es, 25 | int (*cmp)(const void *, const void *)) { 26 | qsort(p,n, es, cmp); 27 | } 28 | 29 | void *mybsearch(const void *k, const void *b, 30 | size_t n, size_t es, 31 | int (*cmp)(const void *, const void *)) { 32 | return bsearch(k, b, n, es, cmp); 33 | } 34 | } // namespace ime_pinyin 35 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/layout/activity_interpret.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 15 | 25 | 26 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/IMEUtils.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common 2 | 3 | import android.content.Context 4 | import android.provider.Settings 5 | import android.view.inputmethod.InputMethodInfo 6 | import android.view.inputmethod.InputMethodManager 7 | 8 | object IMEUtils { 9 | fun isThisImeEnabled(context: Context, imm: InputMethodManager): Boolean { 10 | val packageName = context.packageName 11 | for (imi in imm.enabledInputMethodList) { 12 | if (packageName == imi.packageName) { 13 | return true 14 | } 15 | } 16 | return false 17 | } 18 | 19 | fun isThisImeCurrent(context: Context, imm: InputMethodManager): Boolean { 20 | val imi = getInputMethodInfoOf(context.packageName, imm) 21 | val currentImeId = Settings.Secure.getString( 22 | context.contentResolver, Settings.Secure.DEFAULT_INPUT_METHOD) 23 | return imi != null && imi.id == currentImeId 24 | } 25 | 26 | private fun getInputMethodInfoOf(packageName: String, imm: InputMethodManager): InputMethodInfo? { 27 | for (imi in imm.inputMethodList) { 28 | if (packageName == imi.packageName) { 29 | return imi 30 | } 31 | } 32 | return null 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /PinyinIME/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | #ffffffff 18 | #ffffffff 19 | #ff000000 20 | #ff000000 21 | #ff000000 22 | #ffe35900 23 | #ff343233 24 | #ff000000 25 | #ffffffff 26 | #ff777777 27 | 28 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/layout/activity_index.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 17 | 26 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | image: Ubuntu1804 2 | environment: 3 | ANDROID_COMPILE_SDK: "28" 4 | ANDROID_SDK_TOOLS: "28.0.3" 5 | ANDROID_SDK_VERSION: "4333796" 6 | ANDROID_NDK_VERSION: "18b" 7 | GIT_SUBMODULE_STRATEGY: recursive 8 | JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64 9 | 10 | build_script: 11 | - which java && which javac && java -version 12 | - echo java home is $JAVA_HOME 13 | - git submodule update --init --recursive 14 | - sudo apt update && sudo apt install -y curl bsdtar make file && sudo rm -rf /var/lib/apt/lists/* 15 | - sudo mkdir -p $PWD/android-sdk 16 | - sudo curl https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_VERSION}.zip | sudo bsdtar -xpf- -C $PWD/android-sdk 17 | - export ANDROID_SDK_HOME="$PWD/android-sdk" 18 | - export ANDROID_HOME="$ANDROID_SDK_HOME" 19 | - export NDK_HOME="$ANDROID_SDK_HOME/ndk-bundle" 20 | - export ANDROID_NDK="$NDK_HOME" 21 | - export ANDROID_NDK_HOME="$NDK_HOME" 22 | - export ANDROID_NDK_ROOT="$NDK_HOME" 23 | - export PATH="${ANDROID_SDK_HOME}/tools/bin:${ANDROID_SDK_HOME}/platform-tools:${ANDROID_NDK_HOME}:${PATH}" 24 | - sudo chmod -R 777 ${ANDROID_HOME} 25 | - unset JAVA_TOOL_OPTIONS 26 | - echo y | sdkmanager "ndk-bundle" "build-tools;${ANDROID_SDK_TOOLS}" "platform-tools" "platforms;android-${ANDROID_COMPILE_SDK}" 27 | - chmod +x ./gradlew 28 | - ./gradlew assembleDebug 29 | 30 | artifacts: 31 | - path: '**\*.apk' 32 | name: apk -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/widget/ContactView.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.widget 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.view.LayoutInflater 6 | import androidx.gridlayout.widget.GridLayout 7 | import com.sujitech.tessercubecore.R 8 | import com.sujitech.tessercubecore.common.extension.toFormattedHexText 9 | import com.sujitech.tessercubecore.common.prettyTime 10 | import com.sujitech.tessercubecore.data.ContactData 11 | import kotlinx.android.synthetic.main.widget_contact.view.* 12 | 13 | class ContactView: GridLayout { 14 | constructor(context: Context) : super(context) 15 | constructor(context: Context, attrs: AttributeSet) : super(context, attrs) 16 | constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) 17 | init { 18 | LayoutInflater.from(context).inflate(R.layout.widget_contact, this) 19 | } 20 | 21 | var contact: ContactData? = null 22 | set(value) { 23 | field = value 24 | updateUI(value) 25 | } 26 | 27 | private fun updateUI(value: ContactData?) { 28 | widget_contact_name.text = value?.name 29 | widget_contact_email.text = value?.email 30 | widget_contact_fingerprint.text = value?.keyId?.toFormattedHexText() 31 | widget_contact_created_at.text = prettyTime.format(value?.keyData?.firstOrNull()?.createAt) 32 | } 33 | } -------------------------------------------------------------------------------- /PinyinIME/src/main/cpp/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | 2 | cmake_minimum_required(VERSION 3.4.1) 3 | 4 | add_library(jni_pinyinime SHARED 5 | android/com_android_inputmethod_pinyin_PinyinDecoderService.cpp 6 | share/dictbuilder.cpp 7 | share/dictlist.cpp 8 | share/dicttrie.cpp 9 | share/lpicache.cpp 10 | share/matrixsearch.cpp 11 | share/mystdlib.cpp 12 | share/ngram.cpp 13 | share/pinyinime.cpp 14 | share/searchutility.cpp 15 | share/spellingtable.cpp 16 | share/spellingtrie.cpp 17 | share/splparser.cpp 18 | share/userdict.cpp 19 | share/utf16char.cpp 20 | share/utf16reader.cpp 21 | share/sync.cpp) 22 | 23 | include_directories(src/main/cpp/include/) 24 | 25 | add_library(engine 26 | STATIC 27 | share/dictbuilder.cpp 28 | share/dictlist.cpp 29 | share/dicttrie.cpp 30 | share/lpicache.cpp 31 | share/mystdlib.cpp 32 | share/ngram.cpp 33 | share/searchutility.cpp 34 | share/spellingtable.cpp 35 | share/spellingtrie.cpp 36 | share/splparser.cpp 37 | share/utf16char.cpp 38 | share/utf16reader.cpp ) 39 | 40 | target_link_libraries(jni_pinyinime 41 | android 42 | log 43 | z 44 | engine) 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/common/Settings.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.common 2 | 3 | import android.content.Context 4 | import android.content.SharedPreferences 5 | import com.sujitech.tessercubecore.appContext 6 | 7 | object Settings { 8 | val preferences: SharedPreferences by lazy { 9 | appContext.getSharedPreferences("tessercube", Context.MODE_PRIVATE) 10 | } 11 | inline fun get(key: String, defaultValue: T): T { 12 | return when (defaultValue) { 13 | is String -> preferences.getString(key, defaultValue) as T 14 | is Boolean -> preferences.getBoolean(key, defaultValue) as T 15 | is Long -> preferences.getLong(key, defaultValue) as T 16 | is Float -> preferences.getFloat(key, defaultValue) as T 17 | is Double -> preferences.getFloat(key, defaultValue.toFloat()).toDouble() as T 18 | is Int -> preferences.getInt(key, defaultValue) as T 19 | else -> return defaultValue 20 | } 21 | } 22 | inline fun set(key: String, value: T) { 23 | preferences.edit().also { 24 | when (value) { 25 | is String -> it.putString(key, value) 26 | is Boolean -> it.putBoolean(key, value) 27 | is Long -> it.putLong(key, value) 28 | is Float -> it.putFloat(key, value) 29 | is Double -> it.putFloat(key, value.toFloat()) 30 | is Int -> it.putInt(key, value) 31 | } 32 | }.apply() 33 | } 34 | } -------------------------------------------------------------------------------- /PinyinIME/src/main/cpp/include/utf16reader.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2009 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | #ifndef PINYINIME_INCLUDE_UTF16READER_H__ 18 | #define PINYINIME_INCLUDE_UTF16READER_H__ 19 | 20 | #include 21 | #include "./utf16char.h" 22 | 23 | namespace ime_pinyin { 24 | 25 | class Utf16Reader { 26 | private: 27 | FILE *fp_; 28 | char16 *buffer_; 29 | size_t buffer_total_len_; 30 | size_t buffer_next_pos_; 31 | 32 | // Always less than buffer_total_len_ - buffer_next_pos_ 33 | size_t buffer_valid_len_; 34 | 35 | public: 36 | Utf16Reader(); 37 | ~Utf16Reader(); 38 | 39 | // filename is the name of the file to open. 40 | // buffer_len specifies how long buffer should be allocated to speed up the 41 | // future reading 42 | bool open(const char* filename, size_t buffer_len); 43 | char16* readline(char16* read_buf, size_t max_len); 44 | bool close(); 45 | }; 46 | } 47 | 48 | #endif // PINYINIME_INCLUDE_UTF16READER_H__ 49 | -------------------------------------------------------------------------------- /tessercubecore/src/main/java/com/sujitech/tessercubecore/keyboard/KeyboardEncryptButton.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore.keyboard 2 | 3 | import android.content.ClipboardManager 4 | import android.content.Context 5 | import android.util.AttributeSet 6 | import android.view.LayoutInflater 7 | import android.widget.FrameLayout 8 | import androidx.core.view.isVisible 9 | import com.sujitech.tessercubecore.R 10 | import com.sujitech.tessercubecore.common.extension.getClipboardText 11 | import kotlinx.android.synthetic.main.widget_keyboard_encrypt_button.view.* 12 | import moe.tlaster.kotlinpgp.isPGPMessage 13 | 14 | class KeyboardEncryptButton : FrameLayout, ClipboardManager.OnPrimaryClipChangedListener { 15 | override fun onPrimaryClipChanged() { 16 | val clip = context.getClipboardText() 17 | button_dot.isVisible = clip.isPGPMessage 18 | } 19 | 20 | constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { 21 | init(context, attrs, 0) 22 | } 23 | 24 | constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) { 25 | init(context, attrs, defStyle) 26 | } 27 | 28 | private fun init(context: Context, attrs: AttributeSet, defStyle: Int) { 29 | LayoutInflater.from(context).inflate(R.layout.widget_keyboard_encrypt_button, this) 30 | button_dot.isVisible = false 31 | // val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager 32 | // clipboardManager.addPrimaryClipChangedListener(this) 33 | } 34 | 35 | fun hideDot() { 36 | button_dot.isVisible = false 37 | } 38 | } -------------------------------------------------------------------------------- /PinyinIME/src/main/res/layout/skb_container.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 21 | 22 | 27 | 28 | 32 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /tessercubecore/src/androidTest/java/com/sujitech/tessercubecore/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.sujitech.tessercubecore 2 | 3 | 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey 6 | import org.bouncycastle.jce.provider.BouncyCastleProvider 7 | import org.junit.Test 8 | import org.junit.runner.RunWith 9 | import java.security.KeyPairGenerator 10 | import java.security.Security 11 | import java.security.interfaces.ECPublicKey 12 | import java.security.spec.ECGenParameterSpec 13 | 14 | 15 | /** 16 | * Instrumented test, which will execute on an Android device. 17 | * 18 | * @see [Testing documentation](http://d.android.com/tools/testing) 19 | */ 20 | @RunWith(AndroidJUnit4::class) 21 | class ExampleInstrumentedTest { 22 | @Test 23 | fun useAppContext() { 24 | Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME) 25 | Security.insertProviderAt(BouncyCastleProvider(), 1) 26 | val g = KeyPairGenerator.getInstance("EC") 27 | val kpgparams = ECGenParameterSpec("secp256k1") 28 | g.initialize(kpgparams) 29 | val pair = g.generateKeyPair() 30 | println((pair.private as BCECPrivateKey).s.toString(16)) 31 | (pair.public as ECPublicKey).w 32 | //// val a = getPublicKeyDetails(pair.public as BCECPublicKey) 33 | // val field = pair.public.javaClass.superclass.getDeclaredField("key") 34 | // field.isAccessible = true 35 | // val key = field.get(pair.public) as ByteArray 36 | // println(key.toHexString()) 37 | // println(pair.public as ECPublicKey) 38 | // println(pair.public.encoded.toHexString()) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /tessercubecore/src/main/res/layout/activity_import_contact.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 16 | 26 |