From 5feebeba01bd6955315daad618a8fb6c11415baa Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Jun 2019 15:01:46 +0200 Subject: [PATCH 01/21] Integrate new icons for preference root screen --- .../main/res/drawable/ic_settings_general.xml | 22 ---------------- .../src/main/res/drawable/ic_settings_lab.xml | 14 ---------- .../res/drawable/ic_settings_root_call.xml | 14 ++++++++++ .../res/drawable/ic_settings_root_flair.xml | 22 ++++++++++++++++ .../res/drawable/ic_settings_root_general.xml | 22 ++++++++++++++++ .../drawable/ic_settings_root_help_about.xml | 22 ++++++++++++++++ .../res/drawable/ic_settings_root_labs.xml | 14 ++++++++++ .../res/drawable/ic_settings_root_legacy.xml | 14 ++++++++++ .../ic_settings_root_notification.xml | 14 ++++++++++ .../drawable/ic_settings_root_preferences.xml | 14 ++++++++++ .../ic_settings_root_security_privacy.xml | 22 ++++++++++++++++ vector/src/main/res/values/strings_riotX.xml | 2 ++ .../xml/vector_settings_preferences_root.xml | 26 ++++++++++++++----- 13 files changed, 179 insertions(+), 43 deletions(-) delete mode 100644 vector/src/main/res/drawable/ic_settings_general.xml delete mode 100644 vector/src/main/res/drawable/ic_settings_lab.xml create mode 100644 vector/src/main/res/drawable/ic_settings_root_call.xml create mode 100644 vector/src/main/res/drawable/ic_settings_root_flair.xml create mode 100644 vector/src/main/res/drawable/ic_settings_root_general.xml create mode 100644 vector/src/main/res/drawable/ic_settings_root_help_about.xml create mode 100644 vector/src/main/res/drawable/ic_settings_root_labs.xml create mode 100644 vector/src/main/res/drawable/ic_settings_root_legacy.xml create mode 100644 vector/src/main/res/drawable/ic_settings_root_notification.xml create mode 100644 vector/src/main/res/drawable/ic_settings_root_preferences.xml create mode 100644 vector/src/main/res/drawable/ic_settings_root_security_privacy.xml diff --git a/vector/src/main/res/drawable/ic_settings_general.xml b/vector/src/main/res/drawable/ic_settings_general.xml deleted file mode 100644 index 97b060f6..00000000 --- a/vector/src/main/res/drawable/ic_settings_general.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - diff --git a/vector/src/main/res/drawable/ic_settings_lab.xml b/vector/src/main/res/drawable/ic_settings_lab.xml deleted file mode 100644 index d1f5aca7..00000000 --- a/vector/src/main/res/drawable/ic_settings_lab.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/vector/src/main/res/drawable/ic_settings_root_call.xml b/vector/src/main/res/drawable/ic_settings_root_call.xml new file mode 100644 index 00000000..b29ef895 --- /dev/null +++ b/vector/src/main/res/drawable/ic_settings_root_call.xml @@ -0,0 +1,14 @@ + + + diff --git a/vector/src/main/res/drawable/ic_settings_root_flair.xml b/vector/src/main/res/drawable/ic_settings_root_flair.xml new file mode 100644 index 00000000..889b2f7e --- /dev/null +++ b/vector/src/main/res/drawable/ic_settings_root_flair.xml @@ -0,0 +1,22 @@ + + + + diff --git a/vector/src/main/res/drawable/ic_settings_root_general.xml b/vector/src/main/res/drawable/ic_settings_root_general.xml new file mode 100644 index 00000000..c70ec666 --- /dev/null +++ b/vector/src/main/res/drawable/ic_settings_root_general.xml @@ -0,0 +1,22 @@ + + + + diff --git a/vector/src/main/res/drawable/ic_settings_root_help_about.xml b/vector/src/main/res/drawable/ic_settings_root_help_about.xml new file mode 100644 index 00000000..9260a777 --- /dev/null +++ b/vector/src/main/res/drawable/ic_settings_root_help_about.xml @@ -0,0 +1,22 @@ + + + + diff --git a/vector/src/main/res/drawable/ic_settings_root_labs.xml b/vector/src/main/res/drawable/ic_settings_root_labs.xml new file mode 100644 index 00000000..f44a0c91 --- /dev/null +++ b/vector/src/main/res/drawable/ic_settings_root_labs.xml @@ -0,0 +1,14 @@ + + + diff --git a/vector/src/main/res/drawable/ic_settings_root_legacy.xml b/vector/src/main/res/drawable/ic_settings_root_legacy.xml new file mode 100644 index 00000000..c56a7d31 --- /dev/null +++ b/vector/src/main/res/drawable/ic_settings_root_legacy.xml @@ -0,0 +1,14 @@ + + + diff --git a/vector/src/main/res/drawable/ic_settings_root_notification.xml b/vector/src/main/res/drawable/ic_settings_root_notification.xml new file mode 100644 index 00000000..ae1cba08 --- /dev/null +++ b/vector/src/main/res/drawable/ic_settings_root_notification.xml @@ -0,0 +1,14 @@ + + + diff --git a/vector/src/main/res/drawable/ic_settings_root_preferences.xml b/vector/src/main/res/drawable/ic_settings_root_preferences.xml new file mode 100644 index 00000000..2a57f927 --- /dev/null +++ b/vector/src/main/res/drawable/ic_settings_root_preferences.xml @@ -0,0 +1,14 @@ + + + diff --git a/vector/src/main/res/drawable/ic_settings_root_security_privacy.xml b/vector/src/main/res/drawable/ic_settings_root_security_privacy.xml new file mode 100644 index 00000000..eb5bdc83 --- /dev/null +++ b/vector/src/main/res/drawable/ic_settings_root_security_privacy.xml @@ -0,0 +1,22 @@ + + + + diff --git a/vector/src/main/res/values/strings_riotX.xml b/vector/src/main/res/values/strings_riotX.xml index 7ff01489..28a539eb 100644 --- a/vector/src/main/res/values/strings_riotX.xml +++ b/vector/src/main/res/values/strings_riotX.xml @@ -29,5 +29,7 @@ Format: Legacy + Voice & Video + Help & About \ No newline at end of file diff --git a/vector/src/main/res/xml/vector_settings_preferences_root.xml b/vector/src/main/res/xml/vector_settings_preferences_root.xml index 968aa68c..4e8051af 100644 --- a/vector/src/main/res/xml/vector_settings_preferences_root.xml +++ b/vector/src/main/res/xml/vector_settings_preferences_root.xml @@ -4,45 +4,57 @@ + + + + \ No newline at end of file From 8370f4fc7658a336c100fac6e0a7665763369788 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Jun 2019 15:05:07 +0200 Subject: [PATCH 02/21] rename file --- .../features/settings/VectorSettingsPreferencesFragmentV2.kt | 2 +- ...r_settings_preferences_root.xml => vector_settings_root.xml} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename vector/src/main/res/xml/{vector_settings_preferences_root.xml => vector_settings_root.xml} (100%) diff --git a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferencesFragmentV2.kt b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferencesFragmentV2.kt index b29db440..fc52bd6a 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferencesFragmentV2.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferencesFragmentV2.kt @@ -26,7 +26,7 @@ class VectorSettingsPreferencesFragmentV2 : VectorPreferenceFragment() { override var titleRes: Int = R.string.title_activity_settings override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.vector_settings_preferences_root) + addPreferencesFromResource(R.xml.vector_settings_root) } diff --git a/vector/src/main/res/xml/vector_settings_preferences_root.xml b/vector/src/main/res/xml/vector_settings_root.xml similarity index 100% rename from vector/src/main/res/xml/vector_settings_preferences_root.xml rename to vector/src/main/res/xml/vector_settings_root.xml From e63f51821f58c4e2e59ef403eb7806f4dc70d322 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Jun 2019 15:26:08 +0200 Subject: [PATCH 03/21] split preference (XML) --- .../main/res/xml/vector_settings_flair.xml | 12 + .../main/res/xml/vector_settings_general.xml | 106 ++++ .../res/xml/vector_settings_help_about.xml | 51 ++ .../res/xml/vector_settings_ignored_users.xml | 13 + .../src/main/res/xml/vector_settings_labs.xml | 41 ++ .../res/xml/vector_settings_notifications.xml | 90 ++- .../res/xml/vector_settings_preferences.xml | 513 ------------------ .../xml/vector_settings_preferences_v2.xml | 150 +++++ .../src/main/res/xml/vector_settings_root.xml | 7 + .../xml/vector_settings_security_privacy.xml | 77 +++ .../res/xml/vector_settings_voice_video.xml | 21 + 11 files changed, 561 insertions(+), 520 deletions(-) create mode 100644 vector/src/main/res/xml/vector_settings_flair.xml create mode 100644 vector/src/main/res/xml/vector_settings_general.xml create mode 100644 vector/src/main/res/xml/vector_settings_help_about.xml create mode 100644 vector/src/main/res/xml/vector_settings_ignored_users.xml create mode 100644 vector/src/main/res/xml/vector_settings_labs.xml delete mode 100755 vector/src/main/res/xml/vector_settings_preferences.xml create mode 100644 vector/src/main/res/xml/vector_settings_preferences_v2.xml create mode 100644 vector/src/main/res/xml/vector_settings_security_privacy.xml create mode 100644 vector/src/main/res/xml/vector_settings_voice_video.xml diff --git a/vector/src/main/res/xml/vector_settings_flair.xml b/vector/src/main/res/xml/vector_settings_flair.xml new file mode 100644 index 00000000..8520b8c9 --- /dev/null +++ b/vector/src/main/res/xml/vector_settings_flair.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/xml/vector_settings_general.xml b/vector/src/main/res/xml/vector_settings_general.xml new file mode 100644 index 00000000..152bc64d --- /dev/null +++ b/vector/src/main/res/xml/vector_settings_general.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/xml/vector_settings_help_about.xml b/vector/src/main/res/xml/vector_settings_help_about.xml new file mode 100644 index 00000000..6774f934 --- /dev/null +++ b/vector/src/main/res/xml/vector_settings_help_about.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/xml/vector_settings_ignored_users.xml b/vector/src/main/res/xml/vector_settings_ignored_users.xml new file mode 100644 index 00000000..15223b63 --- /dev/null +++ b/vector/src/main/res/xml/vector_settings_ignored_users.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/xml/vector_settings_labs.xml b/vector/src/main/res/xml/vector_settings_labs.xml new file mode 100644 index 00000000..f6a2e35b --- /dev/null +++ b/vector/src/main/res/xml/vector_settings_labs.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/xml/vector_settings_notifications.xml b/vector/src/main/res/xml/vector_settings_notifications.xml index 325c5fe1..27b8a1e1 100644 --- a/vector/src/main/res/xml/vector_settings_notifications.xml +++ b/vector/src/main/res/xml/vector_settings_notifications.xml @@ -3,12 +3,12 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> - - + + @@ -24,12 +24,12 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vector/src/main/res/xml/vector_settings_preferences.xml b/vector/src/main/res/xml/vector_settings_preferences.xml deleted file mode 100755 index 70489cff..00000000 --- a/vector/src/main/res/xml/vector_settings_preferences.xml +++ /dev/null @@ -1,513 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vector/src/main/res/xml/vector_settings_preferences_v2.xml b/vector/src/main/res/xml/vector_settings_preferences_v2.xml new file mode 100644 index 00000000..98966d42 --- /dev/null +++ b/vector/src/main/res/xml/vector_settings_preferences_v2.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/xml/vector_settings_root.xml b/vector/src/main/res/xml/vector_settings_root.xml index 4e8051af..d5e78d93 100644 --- a/vector/src/main/res/xml/vector_settings_root.xml +++ b/vector/src/main/res/xml/vector_settings_root.xml @@ -33,6 +33,13 @@ android:title="@string/preference_voice_and_video" app:fragment="com.example.SyncFragment" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/xml/vector_settings_voice_video.xml b/vector/src/main/res/xml/vector_settings_voice_video.xml new file mode 100644 index 00000000..f7a80481 --- /dev/null +++ b/vector/src/main/res/xml/vector_settings_voice_video.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + \ No newline at end of file From 289b2a4eb1ecd771f6806376fb9c59d6672efaec Mon Sep 17 00:00:00 2001 From: Valere Date: Wed, 26 Jun 2019 17:14:28 +0200 Subject: [PATCH 04/21] Launch icons update --- .../ic_launcher_foreground.xml | 32 ++++ .../drawable-v24/ic_launcher_foreground.xml | 34 ---- .../res/drawable/ic_launcher_background.xml | 172 +----------------- .../res/mipmap-anydpi-v26/ic_launcher.xml | 4 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 4 +- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 7880 -> 3592 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 4602 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 7926 -> 4987 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 5024 -> 2164 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 2925 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 5048 -> 3094 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 10800 -> 5012 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 6344 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 10789 -> 7132 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 17245 -> 8160 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 10518 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 17413 -> 11772 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 24238 -> 11596 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 14836 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 24368 -> 16718 bytes .../res/values/ic_launcher_background.xml | 6 - 21 files changed, 42 insertions(+), 210 deletions(-) create mode 100644 vector/src/main/res/drawable-anydpi-v26/ic_launcher_foreground.xml delete mode 100644 vector/src/main/res/drawable-v24/ic_launcher_foreground.xml delete mode 100644 vector/src/main/res/mipmap-hdpi/ic_launcher_foreground.png delete mode 100644 vector/src/main/res/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 vector/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png delete mode 100644 vector/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png delete mode 100644 vector/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png delete mode 100644 vector/src/main/res/values/ic_launcher_background.xml diff --git a/vector/src/main/res/drawable-anydpi-v26/ic_launcher_foreground.xml b/vector/src/main/res/drawable-anydpi-v26/ic_launcher_foreground.xml new file mode 100644 index 00000000..be23738b --- /dev/null +++ b/vector/src/main/res/drawable-anydpi-v26/ic_launcher_foreground.xml @@ -0,0 +1,32 @@ + + + + + + + diff --git a/vector/src/main/res/drawable-v24/ic_launcher_foreground.xml b/vector/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index c7bd21db..00000000 --- a/vector/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/vector/src/main/res/drawable/ic_launcher_background.xml b/vector/src/main/res/drawable/ic_launcher_background.xml index d5fccc53..e6850c4b 100644 --- a/vector/src/main/res/drawable/ic_launcher_background.xml +++ b/vector/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:viewportWidth="108" + android:viewportHeight="108"> + diff --git a/vector/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/vector/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index c9ad5f98..eca70cfe 100644 --- a/vector/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/vector/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/vector/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/vector/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index c9ad5f98..eca70cfe 100644 --- a/vector/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/vector/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/vector/src/main/res/mipmap-hdpi/ic_launcher.png b/vector/src/main/res/mipmap-hdpi/ic_launcher.png index a3cc150316063282a3ba6de7ee7e65d36460cc39..90a6b5977b3a506c0860e4948c9ea105ec21c52e 100644 GIT binary patch literal 3592 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 acF_1)&_#Fm&c85+Ku5zsz4qx#*#7~qK#Rfv diff --git a/vector/src/main/res/mipmap-hdpi/ic_launcher_round.png b/vector/src/main/res/mipmap-hdpi/ic_launcher_round.png index acf8ede14dda3c1036d176a37de07757820abdfa..5c205f3069ad0e6b90a7f3bf6eaa00d126e5938f 100644 GIT binary patch literal 4987 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 FV1na1p``!- literal 7926 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 literal 5024 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 literal 5048 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 Wrn!y041HQaA!H;J#j8X?{{IKr!U916 diff --git a/vector/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/vector/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index 06d0a09a0b6ada4bda2bdf295d4a974fc9265acb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6344 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

k#Sg@wYyIdxk`r|&C3`m-K3dt#G@2* zoc<1QWqO&4X@dL8|G%A_rh-LwbOUg#szlQ~$X5&tN4JN=$h%xSS zt1&ny2+*`^gxtd^QXE?!6;D6QXIAiyO(?Fd3hlst4C72?wODWaJlffu_^PN)Wc2zc zKfLxut_h{^uJ_I26z$SxMcGE3wO<75cI|@1Y}sE;avAyzhBmRonJb%FEmR~H_5Htf z_M-EQ-b-1&m%rV}v0eal-j12Q-9j2ZVILBvqk_6_HHP+N65l)dddkIn|B>xZexeST zLvLPiZtO8>^rWP>wJYrN!-vJiT|W{*?S!jh;d8Sw(;}5bi9M69-%We#Ig5R_G*2ax zU8cmjvtg2e1^yE~U@A;2$w#LH@Rs;$DxG)k+fum7Wm19E)<-ekek{QXjwaWdYp>{( zzQC5^=Jj!=dY4C?zBH9|K?9zA8k2cqqua!~u=o390;Le%b7PY~oGw)dPoBC6{V2%rIhSrbIB+Q*QAau)9 zOsq3iH6n7G*A6Z&ogz9VJtsX;SAR2J1_cwe5S7m*KSWeTWV9oK7Mu7*HLA-!n_;h+ ze+o=g*Ho5yImA7Cj@E0fMtL9h1!PSq;ac`fVa?bM?LR&0_XI-beScSx;ktdIyaXVN zTf%w?k<$$S^0V&V78-Da{{`$27bQ$7)7WU2Mjd@-uHZdTST0u2q1ao$BT4xT-TDdu zDf#~A3lwC!g{QXc(=6_x`+I>4hap+#fvsHFRjh<~Ip7y$u9X)GmAi{A}DHMSf{pE`(a3aO(pq5!XJ8p9MPg{VWPNOb_OR$!Yul zQOE&2qgH`9KQww6S{xfXep@FEuzFO5!$HaPBsvba`YDW#Z%;rD%|@8D9qzrsp{QHFee0P4X0|8FRs zD&JU?RW2bXEX>3eC^)&Pw~E{7aJRfNr$;5C=?|bYe`XbNy&yGlw36xWM(|V$K@xcufFsv z+md`QHqoPP;82IVzKG{Dmmyn4ZXb?}=MM;|a3#|C{~57KEAiTJ0{BbTQ(tAa)x=R0 z$9PQZKj3PmV=I02s#aCD`)`L+DZopNC;uD&BLcNJUmkGdzb$Lo#gXqneobJ=%cw|K Ie=rIDKM{J3aR2}S diff --git a/vector/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/vector/src/main/res/mipmap-xhdpi/ic_launcher_round.png index 6c3a26c2a8b459e96d943c97e16c616b9b088381..269e47d393549dec4ae80877c671d644cd6810dd 100644 GIT binary patch literal 7132 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≤*~&JiSJ8eRI176$D|Lza0&JcR^Dq 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 SZvxNDVDNPHb6Mw<&;$U=g0(;Z diff --git a/vector/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/vector/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 73d5cecba65ff25c30d5ebd3fce819b53a67746f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10518 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 diff --git a/vector/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/vector/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index 4f75c9d3b8fc674c57f3fe9e4bb569266c65d58b..46c7034c714c89610c55f073c6c82c65ce1df5d1 100644 GIT binary patch literal 11772 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 literal 17413 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 diff --git a/vector/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/vector/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 8b8e2e24ba209be039e19fc83172995f8caff73a..6ec8243ec977d7c28fbfbd23b4d649a002bcc4cf 100644 GIT binary patch literal 11596 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 sBkb!mdKI;Vst04i`_=l}o! literal 24368 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 diff --git a/vector/src/main/res/values/ic_launcher_background.xml b/vector/src/main/res/values/ic_launcher_background.xml deleted file mode 100644 index 44bbd0b2..00000000 --- a/vector/src/main/res/values/ic_launcher_background.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - #FEC6C7 - \ No newline at end of file From 7c47c6a033722f5181d749d8120222eac1ecbee2 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Jun 2019 17:20:26 +0200 Subject: [PATCH 05/21] split preference (Kotlin) --- .../settings/VectorSettingsActivity.kt | 11 +- .../settings/VectorSettingsBaseFragment.kt | 112 + .../features/settings/VectorSettingsFlair.kt | 171 ++ .../settings/VectorSettingsGeneral.kt | 822 +++++ .../settings/VectorSettingsHelpAbout.kt | 118 + .../settings/VectorSettingsIgnoredUsers.kt | 124 + .../features/settings/VectorSettingsLabs.kt | 128 + .../VectorSettingsNotificationFragment.kt | 280 +- .../settings/VectorSettingsPreferences.kt | 206 ++ .../VectorSettingsPreferencesFragment.kt | 2689 +---------------- ...cesFragmentV2.kt => VectorSettingsRoot.kt} | 12 +- .../settings/VectorSettingsSecurityPrivacy.kt | 868 ++++++ .../settings/VectorSettingsVoiceVideo.kt | 92 + .../main/res/xml/vector_settings_flair.xml | 6 +- ...v2.xml => vector_settings_preferences.xml} | 0 .../src/main/res/xml/vector_settings_root.xml | 26 +- .../xml/vector_settings_security_privacy.xml | 2 - 17 files changed, 3017 insertions(+), 2650 deletions(-) create mode 100644 vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsBaseFragment.kt create mode 100644 vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsFlair.kt create mode 100644 vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsGeneral.kt create mode 100644 vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsHelpAbout.kt create mode 100644 vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsIgnoredUsers.kt create mode 100644 vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsLabs.kt create mode 100644 vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferences.kt rename vector/src/main/java/im/vector/riotredesign/features/settings/{VectorSettingsPreferencesFragmentV2.kt => VectorSettingsRoot.kt} (71%) create mode 100644 vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsSecurityPrivacy.kt create mode 100644 vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsVoiceVideo.kt rename vector/src/main/res/xml/{vector_settings_preferences_v2.xml => vector_settings_preferences.xml} (100%) diff --git a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsActivity.kt b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsActivity.kt index 85f1e0be..23fccedf 100755 --- a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsActivity.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsActivity.kt @@ -48,20 +48,15 @@ class VectorSettingsActivity : VectorBaseActivity(), override fun initUiAndData() { configureToolbar(settingsToolbar) - var vectorSettingsPreferencesFragment: Fragment? = null if (isFirstCreation()) { - vectorSettingsPreferencesFragment = VectorSettingsPreferencesFragmentV2.newInstance() + val vectorSettingsPreferencesFragment = VectorSettingsRoot.newInstance() // display the fragment supportFragmentManager.beginTransaction() .replace(R.id.vector_settings_page, vectorSettingsPreferencesFragment, FRAGMENT_TAG) .commit() - } else { - vectorSettingsPreferencesFragment = supportFragmentManager.findFragmentByTag(FRAGMENT_TAG) } - supportFragmentManager.addOnBackStackChangedListener(this) - } override fun onDestroy() { @@ -78,9 +73,7 @@ class VectorSettingsActivity : VectorBaseActivity(), override fun onPreferenceStartFragment(caller: PreferenceFragmentCompat?, pref: Preference?): Boolean { var oFragment: Fragment? = null - if ("Legacy" == pref?.title) { - oFragment = VectorSettingsPreferencesFragment.newInstance(session.sessionParams.credentials.userId) - } else if (PreferencesManager.SETTINGS_NOTIFICATION_TROUBLESHOOT_PREFERENCE_KEY == pref?.key) { + if (PreferencesManager.SETTINGS_NOTIFICATION_TROUBLESHOOT_PREFERENCE_KEY == pref?.key) { oFragment = VectorSettingsNotificationsTroubleshootFragment.newInstance(session.sessionParams.credentials.userId) } else if (PreferencesManager.SETTINGS_NOTIFICATION_ADVANCED_PREFERENCE_KEY == pref?.key) { oFragment = VectorSettingsAdvancedNotificationPreferenceFragment.newInstance(session.sessionParams.credentials.userId) diff --git a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsBaseFragment.kt b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsBaseFragment.kt new file mode 100644 index 00000000..a4ba7f63 --- /dev/null +++ b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsBaseFragment.kt @@ -0,0 +1,112 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotredesign.features.settings + +import android.os.Bundle +import android.text.TextUtils +import android.view.View +import androidx.annotation.CallSuper +import im.vector.matrix.android.api.session.Session +import im.vector.riotredesign.R +import im.vector.riotredesign.core.platform.VectorPreferenceFragment +import im.vector.riotredesign.core.utils.toast +import org.koin.android.ext.android.inject + +abstract class VectorSettingsBaseFragment : VectorPreferenceFragment() { + + private var mLoadingView: View? = null + + + // members + protected val mSession by inject() + + abstract val preferenceXmlRes: Int + + @CallSuper + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + addPreferencesFromResource(preferenceXmlRes) + + bindPref() + } + + override fun onResume() { + super.onResume() + + // find the view from parent activity + mLoadingView = activity?.findViewById(R.id.vector_settings_spinner_views) + } + + abstract fun bindPref() + + + /** + * Display the loading view. + */ + protected fun displayLoadingView() { + // search the loading view from the upper view + if (null == mLoadingView) { + var parent = view + + while (parent != null && mLoadingView == null) { + mLoadingView = parent.findViewById(R.id.vector_settings_spinner_views) + parent = parent.parent as View + } + } else { + mLoadingView?.visibility = View.VISIBLE + } + } + + /** + * Hide the loading view. + */ + protected fun hideLoadingView() { + mLoadingView?.visibility = View.GONE + } + + /** + * Hide the loading view and refresh the preferences. + * + * @param refresh true to refresh the display + */ + protected fun hideLoadingView(refresh: Boolean) { + mLoadingView?.visibility = View.GONE + + if (refresh) { + // TODO refreshDisplay() + } + } + + /** + * A request has been processed. + * Display a toast if there is a an error message + * + * @param errorMessage the error message + */ + protected fun onCommonDone(errorMessage: String?) { + if (!isAdded) { + return + } + activity?.runOnUiThread { + if (!TextUtils.isEmpty(errorMessage) && errorMessage != null) { + activity?.toast(errorMessage!!) + } + hideLoadingView() + } + } + + +} \ No newline at end of file diff --git a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsFlair.kt b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsFlair.kt new file mode 100644 index 00000000..5346825f --- /dev/null +++ b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsFlair.kt @@ -0,0 +1,171 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotredesign.features.settings + +import androidx.preference.PreferenceCategory +import im.vector.riotredesign.R +import im.vector.riotredesign.core.preference.ProgressBarPreference + +class VectorSettingsFlair : VectorSettingsBaseFragment() { + + override var titleRes = R.string.settings_flair + override val preferenceXmlRes = R.xml.vector_settings_flair + + // current publicised group list + private var mPublicisedGroups: MutableSet? = null + + // Group Flairs + private val mGroupsFlairCategory by lazy { + findPreference(PreferencesManager.SETTINGS_GROUPS_FLAIR_KEY) as PreferenceCategory + } + + override fun bindPref() { + // Flair + refreshGroupFlairsList() + } + + //============================================================================================================== + // Group flairs management + //============================================================================================================== + + /** + * Force the refresh of the devices list.

+ * The devices list is the list of the devices where the user as looged in. + * It can be any mobile device, as any browser. + */ + private fun refreshGroupFlairsList() { + // display a spinner while refreshing + if (0 == mGroupsFlairCategory.preferenceCount) { + activity?.let { + val preference = ProgressBarPreference(it) + mGroupsFlairCategory.addPreference(preference) + } + } + + /* + TODO + session.groupsManager.getUserPublicisedGroups(session.myUserId, true, object : MatrixCallback> { + override fun onSuccess(publicisedGroups: Set) { + // clear everything + mGroupsFlairCategory.removeAll() + + if (publicisedGroups.isEmpty()) { + val vectorGroupPreference = Preference(activity) + vectorGroupPreference.title = resources.getString(R.string.settings_without_flair) + mGroupsFlairCategory.addPreference(vectorGroupPreference) + } else { + buildGroupsList(publicisedGroups) + } + } + + override fun onNetworkError(e: Exception) { + // NOP + } + + override fun onMatrixError(e: MatrixError) { + // NOP + } + + override fun onUnexpectedError(e: Exception) { + // NOP + } + }) + */ + } + + /** + * Build the groups list. + * + * @param publicisedGroups the publicised groups list. + */ + private fun buildGroupsList(publicisedGroups: Set) { + var isNewList = true + + mPublicisedGroups?.let { + if (it.size == publicisedGroups.size) { + isNewList = !it.containsAll(publicisedGroups) + } + } + + if (isNewList) { + /* + TODO + val joinedGroups = ArrayList(session.groupsManager.joinedGroups) + Collections.sort(joinedGroups, Group.mGroupsComparator) + + mPublicisedGroups = publicisedGroups.toMutableSet() + + for ((prefIndex, group) in joinedGroups.withIndex()) { + val vectorGroupPreference = VectorGroupPreference(activity!!) + vectorGroupPreference.key = DEVICES_PREFERENCE_KEY_BASE + prefIndex + + vectorGroupPreference.setGroup(group, session) + vectorGroupPreference.title = group.displayName + vectorGroupPreference.summary = group.groupId + + vectorGroupPreference.isChecked = publicisedGroups.contains(group.groupId) + mGroupsFlairCategory.addPreference(vectorGroupPreference) + + vectorGroupPreference.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + if (newValue is Boolean) { + /* + * if mPublicisedGroup is null somehow, then + * we cant check it contains groupId or not + * so set isFlaired to false + */ + val isFlaired = mPublicisedGroups?.contains(group.groupId) ?: false + + if (newValue != isFlaired) { + displayLoadingView() + session.groupsManager.updateGroupPublicity(group.groupId, newValue, object : MatrixCallback { + override fun onSuccess(info: Void?) { + hideLoadingView() + if (newValue) { + mPublicisedGroups?.add(group.groupId) + } else { + mPublicisedGroups?.remove(group.groupId) + } + } + + private fun onError() { + hideLoadingView() + // restore default value + vectorGroupPreference.isChecked = publicisedGroups.contains(group.groupId) + } + + override fun onNetworkError(e: Exception) { + onError() + } + + override fun onMatrixError(e: MatrixError) { + onError() + } + + override fun onUnexpectedError(e: Exception) { + onError() + } + }) + } + } + true + } + } + */ + } + } + +} \ No newline at end of file diff --git a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsGeneral.kt b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsGeneral.kt new file mode 100644 index 00000000..f073c796 --- /dev/null +++ b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsGeneral.kt @@ -0,0 +1,822 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotredesign.features.settings + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.text.Editable +import android.text.TextUtils +import android.view.View +import android.view.ViewGroup +import android.view.inputmethod.InputMethodManager +import android.widget.ImageView +import androidx.appcompat.app.AlertDialog +import androidx.core.content.ContextCompat +import androidx.core.view.isVisible +import androidx.preference.EditTextPreference +import androidx.preference.Preference +import androidx.preference.PreferenceCategory +import com.google.android.material.textfield.TextInputEditText +import com.google.android.material.textfield.TextInputLayout +import im.vector.riotredesign.R +import im.vector.riotredesign.core.extensions.showPassword +import im.vector.riotredesign.core.platform.SimpleTextWatcher +import im.vector.riotredesign.core.preference.UserAvatarPreference +import im.vector.riotredesign.core.preference.VectorPreference +import im.vector.riotredesign.core.utils.PERMISSION_REQUEST_CODE_LAUNCH_CAMERA +import im.vector.riotredesign.core.utils.allGranted +import im.vector.riotredesign.core.utils.copyToClipboard +import im.vector.riotredesign.core.utils.toast +import im.vector.riotredesign.features.MainActivity +import im.vector.riotredesign.features.themes.ThemeUtils +import java.util.* + +class VectorSettingsGeneral : VectorSettingsBaseFragment() { + + override var titleRes = R.string.settings_general_title + override val preferenceXmlRes = R.xml.vector_settings_general + + private var mDisplayedEmails = ArrayList() + private var mDisplayedPhoneNumber = ArrayList() + + private val mUserSettingsCategory by lazy { + findPreference(PreferencesManager.SETTINGS_USER_SETTINGS_PREFERENCE_KEY) as PreferenceCategory + } + private val mUserAvatarPreference by lazy { + findPreference(PreferencesManager.SETTINGS_PROFILE_PICTURE_PREFERENCE_KEY) as UserAvatarPreference + } + private val mDisplayNamePreference by lazy { + findPreference(PreferencesManager.SETTINGS_DISPLAY_NAME_PREFERENCE_KEY) as EditTextPreference + } + private val mPasswordPreference by lazy { + findPreference(PreferencesManager.SETTINGS_CHANGE_PASSWORD_PREFERENCE_KEY) + } + + // Local contacts + private val mContactSettingsCategory by lazy { + findPreference(PreferencesManager.SETTINGS_CONTACT_PREFERENCE_KEYS) as PreferenceCategory + } + + private val mContactPhonebookCountryPreference by lazy { + findPreference(PreferencesManager.SETTINGS_CONTACTS_PHONEBOOK_COUNTRY_PREFERENCE_KEY) + } + + + override fun bindPref() { + // Avatar + mUserAvatarPreference.let { + it.setSession(mSession) + it.onPreferenceClickListener = Preference.OnPreferenceClickListener { + onUpdateAvatarClick() + false + } + } + + // Display name + mDisplayNamePreference.let { + it.summary = "TODO" // session.myUser.displayname + it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + onDisplayNameClick(newValue?.let { (it as String).trim() }) + false + } + } + + // Password + mPasswordPreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { + onPasswordUpdateClick() + false + } + + // Add Email + (findPreference(ADD_EMAIL_PREFERENCE_KEY) as EditTextPreference).let { + // It does not work on XML, do it here + it.icon = activity?.let { + ThemeUtils.tintDrawable(it, + ContextCompat.getDrawable(it, R.drawable.ic_add_black)!!, R.attr.vctr_settings_icon_tint_color) + } + + // Unfortunately, this is not supported in lib v7 + // it.editText.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS + + it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + addEmail((newValue as String).trim()) + false + } + } + + // Add phone number + findPreference(ADD_PHONE_NUMBER_PREFERENCE_KEY).let { + // It does not work on XML, do it here + it.icon = activity?.let { + ThemeUtils.tintDrawable(it, + ContextCompat.getDrawable(it, R.drawable.ic_add_black)!!, R.attr.vctr_settings_icon_tint_color) + } + + it.setOnPreferenceClickListener { + notImplemented() + // TODO val intent = PhoneNumberAdditionActivity.getIntent(activity, session.credentials.userId) + // startActivityForResult(intent, REQUEST_NEW_PHONE_NUMBER) + true + } + } + + // Advanced settings + + // user account + findPreference(PreferencesManager.SETTINGS_LOGGED_IN_PREFERENCE_KEY) + .summary = mSession.sessionParams.credentials.userId + + // home server + findPreference(PreferencesManager.SETTINGS_HOME_SERVER_PREFERENCE_KEY) + .summary = mSession.sessionParams.homeServerConnectionConfig.homeServerUri.toString() + + // identity server + findPreference(PreferencesManager.SETTINGS_IDENTITY_SERVER_PREFERENCE_KEY) + .summary = mSession.sessionParams.homeServerConnectionConfig.identityServerUri.toString() + + + refreshEmailsList() + refreshPhoneNumbersList() + // Contacts + setContactsPreferences() + + // clear cache + findPreference(PreferencesManager.SETTINGS_CLEAR_CACHE_PREFERENCE_KEY).let { + /* + TODO + MXSession.getApplicationSizeCaches(activity, object : SimpleApiCallback() { + override fun onSuccess(size: Long) { + if (null != activity) { + it.summary = android.text.format.Formatter.formatFileSize(activity, size) + } + } + }) + */ + + it.onPreferenceClickListener = Preference.OnPreferenceClickListener { + displayLoadingView() + MainActivity.restartApp(activity!!, clearCache = true, clearCredentials = false) + false + } + } + + // clear medias cache + findPreference(PreferencesManager.SETTINGS_CLEAR_MEDIA_CACHE_PREFERENCE_KEY).let { + /* + TODO + MXMediaCache.getCachesSize(activity, object : SimpleApiCallback() { + override fun onSuccess(size: Long) { + if (null != activity) { + it.summary = android.text.format.Formatter.formatFileSize(activity, size) + } + } + }) + */ + + it.onPreferenceClickListener = Preference.OnPreferenceClickListener { + notImplemented() + /* TODO + displayLoadingView() + + val task = ClearMediaCacheAsyncTask( + backgroundTask = { + session.mediaCache.clear() + activity?.let { it -> Glide.get(it).clearDiskCache() } + }, + onCompleteTask = { + hideLoadingView() + + MXMediaCache.getCachesSize(activity, object : SimpleApiCallback() { + override fun onSuccess(size: Long) { + it.summary = Formatter.formatFileSize(activity, size) + } + }) + } + ) + + try { + task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) + } catch (e: Exception) { + Timber.e(e, "## session.getMediaCache().clear() failed " + e.message) + task.cancel(true) + hideLoadingView() + } + */ + + false + } + } + + // Deactivate account section + + // deactivate account + findPreference(PreferencesManager.SETTINGS_DEACTIVATE_ACCOUNT_KEY) + .onPreferenceClickListener = Preference.OnPreferenceClickListener { + activity?.let { + notImplemented() + // TODO startActivity(DeactivateAccountActivity.getIntent(it)) + } + + false + } + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + if (allGranted(grantResults)) { + if (requestCode == PERMISSION_REQUEST_CODE_LAUNCH_CAMERA) { + changeAvatar() + } + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + REQUEST_NEW_PHONE_NUMBER -> refreshPhoneNumbersList() + REQUEST_PHONEBOOK_COUNTRY -> onPhonebookCountryUpdate(data) + } + } + } + + /** + * Update the avatar. + */ + private fun onUpdateAvatarClick() { + notImplemented() + + /* TODO + if (checkPermissions(PERMISSIONS_FOR_TAKING_PHOTO, this, PERMISSION_REQUEST_CODE_LAUNCH_CAMERA)) { + changeAvatar() + } + */ + } + + private fun changeAvatar() { + /* TODO + val intent = Intent(activity, VectorMediaPickerActivity::class.java) + intent.putExtra(VectorMediaPickerActivity.EXTRA_AVATAR_MODE, true) + startActivityForResult(intent, VectorUtils.TAKE_IMAGE) + */ + } + + + //============================================================================================================== + // contacts management + //============================================================================================================== + + private fun setContactsPreferences() { + /* TODO + // Permission + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + // on Android >= 23, use the system one + mContactSettingsCategory.removePreference(findPreference(ContactsManager.CONTACTS_BOOK_ACCESS_KEY)) + } + // Phonebook country + mContactPhonebookCountryPreference.summary = PhoneNumberUtils.getHumanCountryCode(PhoneNumberUtils.getCountryCode(activity)) + + mContactPhonebookCountryPreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { + val intent = CountryPickerActivity.getIntent(activity, true) + startActivityForResult(intent, REQUEST_PHONEBOOK_COUNTRY) + true + } + */ + } + + private fun onPhonebookCountryUpdate(data: Intent?) { + /* TODO + if (data != null && data.hasExtra(CountryPickerActivity.EXTRA_OUT_COUNTRY_NAME) + && data.hasExtra(CountryPickerActivity.EXTRA_OUT_COUNTRY_CODE)) { + val countryCode = data.getStringExtra(CountryPickerActivity.EXTRA_OUT_COUNTRY_CODE) + if (!TextUtils.equals(countryCode, PhoneNumberUtils.getCountryCode(activity))) { + PhoneNumberUtils.setCountryCode(activity, countryCode) + mContactPhonebookCountryPreference.summary = data.getStringExtra(CountryPickerActivity.EXTRA_OUT_COUNTRY_NAME) + } + } + */ + } + + //============================================================================================================== + // Phone number management + //============================================================================================================== + + /** + * Refresh phone number list + */ + private fun refreshPhoneNumbersList() { + /* TODO + val currentPhoneNumber3PID = ArrayList(session.myUser.getlinkedPhoneNumbers()) + + val phoneNumberList = ArrayList() + for (identifier in currentPhoneNumber3PID) { + phoneNumberList.add(identifier.address) + } + + // check first if there is an update + var isNewList = true + if (phoneNumberList.size == mDisplayedPhoneNumber.size) { + isNewList = !mDisplayedPhoneNumber.containsAll(phoneNumberList) + } + + if (isNewList) { + // remove the displayed one + run { + var index = 0 + while (true) { + val preference = mUserSettingsCategory.findPreference(PHONE_NUMBER_PREFERENCE_KEY_BASE + index) + + if (null != preference) { + mUserSettingsCategory.removePreference(preference) + } else { + break + } + index++ + } + } + + // add new phone number list + mDisplayedPhoneNumber = phoneNumberList + + val addPhoneBtn = mUserSettingsCategory.findPreference(ADD_PHONE_NUMBER_PREFERENCE_KEY) + ?: return + + var order = addPhoneBtn.order + + for ((index, phoneNumber3PID) in currentPhoneNumber3PID.withIndex()) { + val preference = VectorPreference(activity!!) + + preference.title = getString(R.string.settings_phone_number) + var phoneNumberFormatted = phoneNumber3PID.address + try { + // Attempt to format phone number + val phoneNumber = PhoneNumberUtil.getInstance().parse("+$phoneNumberFormatted", null) + phoneNumberFormatted = PhoneNumberUtil.getInstance().format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL) + } catch (e: NumberParseException) { + // Do nothing, we will display raw version + } + + preference.summary = phoneNumberFormatted + preference.key = PHONE_NUMBER_PREFERENCE_KEY_BASE + index + preference.order = order + + preference.onPreferenceClickListener = Preference.OnPreferenceClickListener { + displayDelete3PIDConfirmationDialog(phoneNumber3PID, preference.summary) + true + } + + preference.onPreferenceLongClickListener = object : VectorPreference.OnPreferenceLongClickListener { + override fun onPreferenceLongClick(preference: Preference): Boolean { + activity?.let { copyToClipboard(it, phoneNumber3PID.address) } + return true + } + } + + order++ + mUserSettingsCategory.addPreference(preference) + } + + addPhoneBtn.order = order + } */ + } + + //============================================================================================================== + // Email management + //============================================================================================================== + + /** + * Refresh the emails list + */ + private fun refreshEmailsList() { + val currentEmail3PID = emptyList() // TODO ArrayList(session.myUser.getlinkedEmails()) + + val newEmailsList = ArrayList() + for (identifier in currentEmail3PID) { + // TODO newEmailsList.add(identifier.address) + } + + // check first if there is an update + var isNewList = true + if (newEmailsList.size == mDisplayedEmails.size) { + isNewList = !mDisplayedEmails.containsAll(newEmailsList) + } + + if (isNewList) { + // remove the displayed one + run { + var index = 0 + while (true) { + val preference = mUserSettingsCategory.findPreference(EMAIL_PREFERENCE_KEY_BASE + index) + + if (null != preference) { + mUserSettingsCategory.removePreference(preference) + } else { + break + } + index++ + } + } + + // add new emails list + mDisplayedEmails = newEmailsList + + val addEmailBtn = mUserSettingsCategory.findPreference(ADD_EMAIL_PREFERENCE_KEY) + ?: return + + var order = addEmailBtn.order + + for ((index, email3PID) in currentEmail3PID.withIndex()) { + val preference = VectorPreference(activity!!) + + preference.title = getString(R.string.settings_email_address) + preference.summary = "TODO" // email3PID.address + preference.key = EMAIL_PREFERENCE_KEY_BASE + index + preference.order = order + + preference.onPreferenceClickListener = Preference.OnPreferenceClickListener { pref -> + displayDelete3PIDConfirmationDialog(/* TODO email3PID, */ pref.summary) + true + } + + preference.onPreferenceLongClickListener = object : VectorPreference.OnPreferenceLongClickListener { + override fun onPreferenceLongClick(preference: Preference): Boolean { + activity?.let { copyToClipboard(it, "TODO") } //email3PID.address) } + return true + } + } + + mUserSettingsCategory.addPreference(preference) + + order++ + } + + addEmailBtn.order = order + } + } + + /** + * Attempt to add a new email to the account + * + * @param email the email to add. + */ + private fun addEmail(email: String) { + // check first if the email syntax is valid + // if email is null , then also its invalid email + if (TextUtils.isEmpty(email) || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) { + activity?.toast(R.string.auth_invalid_email) + return + } + + // check first if the email syntax is valid + if (mDisplayedEmails.indexOf(email) >= 0) { + activity?.toast(R.string.auth_email_already_defined) + return + } + + notImplemented() + /* TODO + val pid = ThreePid(email, ThreePid.MEDIUM_EMAIL) + + displayLoadingView() + + session.myUser.requestEmailValidationToken(pid, object : MatrixCallback { + override fun onSuccess(info: Void?) { + activity?.runOnUiThread { showEmailValidationDialog(pid) } + } + + override fun onNetworkError(e: Exception) { + onCommonDone(e.localizedMessage) + } + + override fun onMatrixError(e: MatrixError) { + if (TextUtils.equals(MatrixError.THREEPID_IN_USE, e.errcode)) { + onCommonDone(getString(R.string.account_email_already_used_error)) + } else { + onCommonDone(e.localizedMessage) + } + } + + override fun onUnexpectedError(e: Exception) { + onCommonDone(e.localizedMessage) + } + }) + */ + } + + /** + * Show an email validation dialog to warn the user tho valid his email link. + * + * @param pid the used pid. + */ + /* TODO + private fun showEmailValidationDialog(pid: ThreePid) { + activity?.let { + AlertDialog.Builder(it) + .setTitle(R.string.account_email_validation_title) + .setMessage(R.string.account_email_validation_message) + .setPositiveButton(R.string._continue) { _, _ -> + session.myUser.add3Pid(pid, true, object : MatrixCallback { + override fun onSuccess(info: Void?) { + it.runOnUiThread { + hideLoadingView() + refreshEmailsList() + } + } + + override fun onNetworkError(e: Exception) { + onCommonDone(e.localizedMessage) + } + + override fun onMatrixError(e: MatrixError) { + if (TextUtils.equals(e.errcode, MatrixError.THREEPID_AUTH_FAILED)) { + it.runOnUiThread { + hideLoadingView() + it.toast(R.string.account_email_validation_error) + } + } else { + onCommonDone(e.localizedMessage) + } + } + + override fun onUnexpectedError(e: Exception) { + onCommonDone(e.localizedMessage) + } + }) + } + .setNegativeButton(R.string.cancel) { _, _ -> + hideLoadingView() + } + .show() + } + } */ + + + /** + * Display a dialog which asks confirmation for the deletion of a 3pid + * + * @param pid the 3pid to delete + * @param preferenceSummary the displayed 3pid + */ + private fun displayDelete3PIDConfirmationDialog(/* TODO pid: ThirdPartyIdentifier,*/ preferenceSummary: CharSequence) { + val mediumFriendlyName = "TODO" // ThreePid.getMediumFriendlyName(pid.medium, activity).toLowerCase(VectorLocale.applicationLocale) + val dialogMessage = getString(R.string.settings_delete_threepid_confirmation, mediumFriendlyName, preferenceSummary) + + activity?.let { + AlertDialog.Builder(it) + .setTitle(R.string.dialog_title_confirmation) + .setMessage(dialogMessage) + .setPositiveButton(R.string.remove) { _, _ -> + notImplemented() + /* TODO + displayLoadingView() + + session.myUser.delete3Pid(pid, object : MatrixCallback { + override fun onSuccess(info: Void?) { + when (pid.medium) { + ThreePid.MEDIUM_EMAIL -> refreshEmailsList() + ThreePid.MEDIUM_MSISDN -> refreshPhoneNumbersList() + } + onCommonDone(null) + } + + override fun onNetworkError(e: Exception) { + onCommonDone(e.localizedMessage) + } + + override fun onMatrixError(e: MatrixError) { + onCommonDone(e.localizedMessage) + } + + override fun onUnexpectedError(e: Exception) { + onCommonDone(e.localizedMessage) + } + }) + */ + } + .setNegativeButton(R.string.cancel, null) + .show() + } + } + + + /** + * Update the password. + */ + private fun onPasswordUpdateClick() { + activity?.let { activity -> + val view: ViewGroup = activity.layoutInflater.inflate(R.layout.dialog_change_password, null) as ViewGroup + + val showPassword: ImageView = view.findViewById(R.id.change_password_show_passwords) + val oldPasswordTil: TextInputLayout = view.findViewById(R.id.change_password_old_pwd_til) + val oldPasswordText: TextInputEditText = view.findViewById(R.id.change_password_old_pwd_text) + val newPasswordText: TextInputEditText = view.findViewById(R.id.change_password_new_pwd_text) + val confirmNewPasswordTil: TextInputLayout = view.findViewById(R.id.change_password_confirm_new_pwd_til) + val confirmNewPasswordText: TextInputEditText = view.findViewById(R.id.change_password_confirm_new_pwd_text) + val changePasswordLoader: View = view.findViewById(R.id.change_password_loader) + + var passwordShown = false + + showPassword.setOnClickListener(object : View.OnClickListener { + override fun onClick(v: View?) { + passwordShown = !passwordShown + + oldPasswordText.showPassword(passwordShown) + newPasswordText.showPassword(passwordShown) + confirmNewPasswordText.showPassword(passwordShown) + + showPassword.setImageResource(if (passwordShown) R.drawable.ic_eye_closed_black else R.drawable.ic_eye_black) + } + }) + + val dialog = AlertDialog.Builder(activity) + .setView(view) + .setPositiveButton(R.string.settings_change_password_submit, null) + .setNegativeButton(R.string.cancel, null) + .setOnDismissListener { + val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(view.applicationWindowToken, 0) + } + .create() + + dialog.setOnShowListener { + val updateButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE) + updateButton.isEnabled = false + + fun updateUi() { + val oldPwd = oldPasswordText.text.toString().trim() + val newPwd = newPasswordText.text.toString().trim() + val newConfirmPwd = confirmNewPasswordText.text.toString().trim() + + updateButton.isEnabled = oldPwd.isNotEmpty() && newPwd.isNotEmpty() && TextUtils.equals(newPwd, newConfirmPwd) + + if (newPwd.isNotEmpty() && newConfirmPwd.isNotEmpty() && !TextUtils.equals(newPwd, newConfirmPwd)) { + confirmNewPasswordTil.error = getString(R.string.passwords_do_not_match) + } + } + + oldPasswordText.addTextChangedListener(object : SimpleTextWatcher() { + override fun afterTextChanged(s: Editable) { + oldPasswordTil.error = null + updateUi() + } + }) + + newPasswordText.addTextChangedListener(object : SimpleTextWatcher() { + override fun afterTextChanged(s: Editable) { + confirmNewPasswordTil.error = null + updateUi() + } + }) + + confirmNewPasswordText.addTextChangedListener(object : SimpleTextWatcher() { + override fun afterTextChanged(s: Editable) { + confirmNewPasswordTil.error = null + updateUi() + } + }) + + fun showPasswordLoadingView(toShow: Boolean) { + if (toShow) { + showPassword.isEnabled = false + oldPasswordText.isEnabled = false + newPasswordText.isEnabled = false + confirmNewPasswordText.isEnabled = false + changePasswordLoader.isVisible = true + updateButton.isEnabled = false + } else { + showPassword.isEnabled = true + oldPasswordText.isEnabled = true + newPasswordText.isEnabled = true + confirmNewPasswordText.isEnabled = true + changePasswordLoader.isVisible = false + updateButton.isEnabled = true + } + } + + updateButton.setOnClickListener { + if (passwordShown) { + // Hide passwords during processing + showPassword.performClick() + } + + val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(view.applicationWindowToken, 0) + + val oldPwd = oldPasswordText.text.toString().trim() + val newPwd = newPasswordText.text.toString().trim() + + notImplemented() + /* TODO + showPasswordLoadingView(true) + + session.updatePassword(oldPwd, newPwd, object : MatrixCallback { + private fun onDone(@StringRes textResId: Int) { + showPasswordLoadingView(false) + + if (textResId == R.string.settings_fail_to_update_password_invalid_current_password) { + oldPasswordTil.error = getString(textResId) + } else { + dialog.dismiss() + activity.toast(textResId, Toast.LENGTH_LONG) + } + } + + override fun onSuccess(info: Void?) { + onDone(R.string.settings_password_updated) + } + + override fun onNetworkError(e: Exception) { + onDone(R.string.settings_fail_to_update_password) + } + + override fun onMatrixError(e: MatrixError) { + if (e.error == "Invalid password") { + onDone(R.string.settings_fail_to_update_password_invalid_current_password) + } else { + dialog.dismiss() + onDone(R.string.settings_fail_to_update_password) + } + } + + override fun onUnexpectedError(e: Exception) { + onDone(R.string.settings_fail_to_update_password) + } + }) + */ + } + } + dialog.show() + } + } + + /** + * Update the displayname. + */ + private fun onDisplayNameClick(value: String?) { + notImplemented() + /* TODO + if (!TextUtils.equals(session.myUser.displayname, value)) { + displayLoadingView() + + session.myUser.updateDisplayName(value, object : MatrixCallback { + override fun onSuccess(info: Void?) { + // refresh the settings value + PreferenceManager.getDefaultSharedPreferences(activity).edit { + putString(PreferencesManager.SETTINGS_DISPLAY_NAME_PREFERENCE_KEY, value) + } + + onCommonDone(null) + + refreshDisplay() + } + + override fun onNetworkError(e: Exception) { + onCommonDone(e.localizedMessage) + } + + override fun onMatrixError(e: MatrixError) { + if (MatrixError.M_CONSENT_NOT_GIVEN == e.errcode) { + activity?.runOnUiThread { + hideLoadingView() + (activity as VectorAppCompatActivity).consentNotGivenHelper.displayDialog(e) + } + } else { + onCommonDone(e.localizedMessage) + } + } + + override fun onUnexpectedError(e: Exception) { + onCommonDone(e.localizedMessage) + } + }) + } + */ + } + + + companion object { + private const val ADD_EMAIL_PREFERENCE_KEY = "ADD_EMAIL_PREFERENCE_KEY" + private const val ADD_PHONE_NUMBER_PREFERENCE_KEY = "ADD_PHONE_NUMBER_PREFERENCE_KEY" + + private const val EMAIL_PREFERENCE_KEY_BASE = "EMAIL_PREFERENCE_KEY_BASE" + private const val PHONE_NUMBER_PREFERENCE_KEY_BASE = "PHONE_NUMBER_PREFERENCE_KEY_BASE" + + private const val REQUEST_NEW_PHONE_NUMBER = 456 + private const val REQUEST_PHONEBOOK_COUNTRY = 789 + } +} \ No newline at end of file diff --git a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsHelpAbout.kt b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsHelpAbout.kt new file mode 100644 index 00000000..6c920a1d --- /dev/null +++ b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsHelpAbout.kt @@ -0,0 +1,118 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotredesign.features.settings + +import android.content.Intent +import android.net.Uri +import android.provider.Settings +import androidx.preference.Preference +import com.google.android.gms.oss.licenses.OssLicensesMenuActivity +import im.vector.matrix.android.api.Matrix +import im.vector.riotredesign.R +import im.vector.riotredesign.core.utils.copyToClipboard +import im.vector.riotredesign.core.utils.displayInWebView +import im.vector.riotredesign.features.version.getVersion + +class VectorSettingsHelpAbout : VectorSettingsBaseFragment() { + + override var titleRes = R.string.preference_root_help_about + override val preferenceXmlRes = R.xml.vector_settings_help_about + + override fun bindPref() { + // preference to start the App info screen, to facilitate App permissions access + findPreference(APP_INFO_LINK_PREFERENCE_KEY) + .onPreferenceClickListener = Preference.OnPreferenceClickListener { + + activity?.let { + val intent = Intent().apply { + action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + + val uri = Uri.fromParts("package", requireContext().packageName, null) + + data = uri + } + it.applicationContext.startActivity(intent) + } + + true + } + + // application version + (findPreference(PreferencesManager.SETTINGS_VERSION_PREFERENCE_KEY)).let { + it.summary = getVersion(longFormat = false, useBuildNumber = true) + + it.setOnPreferenceClickListener { pref -> + copyToClipboard(requireContext(), pref.summary) + true + } + } + + // SDK version + (findPreference(PreferencesManager.SETTINGS_SDK_VERSION_PREFERENCE_KEY)).let { + it.summary = Matrix.getSdkVersion() + + it.setOnPreferenceClickListener { pref -> + copyToClipboard(requireContext(), pref.summary) + true + } + } + + // olm version + findPreference(PreferencesManager.SETTINGS_OLM_VERSION_PREFERENCE_KEY) + .summary = mSession.getCryptoVersion(requireContext(), false) + + // copyright + findPreference(PreferencesManager.SETTINGS_COPYRIGHT_PREFERENCE_KEY) + .onPreferenceClickListener = Preference.OnPreferenceClickListener { + activity?.displayInWebView(VectorSettingsUrls.COPYRIGHT) + false + } + + // terms & conditions + findPreference(PreferencesManager.SETTINGS_APP_TERM_CONDITIONS_PREFERENCE_KEY) + .onPreferenceClickListener = Preference.OnPreferenceClickListener { + activity?.displayInWebView(VectorSettingsUrls.TAC) + false + } + + // privacy policy + findPreference(PreferencesManager.SETTINGS_PRIVACY_POLICY_PREFERENCE_KEY) + .onPreferenceClickListener = Preference.OnPreferenceClickListener { + activity?.displayInWebView(VectorSettingsUrls.PRIVACY_POLICY) + false + } + + // third party notice + findPreference(PreferencesManager.SETTINGS_THIRD_PARTY_NOTICES_PREFERENCE_KEY) + .onPreferenceClickListener = Preference.OnPreferenceClickListener { + activity?.displayInWebView(VectorSettingsUrls.THIRD_PARTY_LICENSES) + false + } + + findPreference(PreferencesManager.SETTINGS_OTHER_THIRD_PARTY_NOTICES_PREFERENCE_KEY) + .onPreferenceClickListener = Preference.OnPreferenceClickListener { + // See https://developers.google.com/android/guides/opensource + startActivity(Intent(requireActivity(), OssLicensesMenuActivity::class.java)) + false + } + } + + companion object { + private const val APP_INFO_LINK_PREFERENCE_KEY = "APP_INFO_LINK_PREFERENCE_KEY" + } +} \ No newline at end of file diff --git a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsIgnoredUsers.kt b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsIgnoredUsers.kt new file mode 100644 index 00000000..0bef7541 --- /dev/null +++ b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsIgnoredUsers.kt @@ -0,0 +1,124 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotredesign.features.settings + +import androidx.appcompat.app.AlertDialog +import androidx.preference.Preference +import androidx.preference.PreferenceCategory +import im.vector.riotredesign.R +import java.util.ArrayList +import kotlin.Comparator +import kotlin.String +import kotlin.getValue +import kotlin.lazy +import kotlin.let + +class VectorSettingsIgnoredUsers : VectorSettingsBaseFragment() { + + override var titleRes = R.string.settings_ignored_users + override val preferenceXmlRes = R.xml.vector_settings_ignored_users + + // displayed the ignored users list + private val mIgnoredUserSettingsCategoryDivider by lazy { + findPreference(PreferencesManager.SETTINGS_IGNORE_USERS_DIVIDER_PREFERENCE_KEY) + } + private val mIgnoredUserSettingsCategory by lazy { + findPreference(PreferencesManager.SETTINGS_IGNORED_USERS_PREFERENCE_KEY) as PreferenceCategory + } + + override fun bindPref() { + // Ignore users + refreshIgnoredUsersList() + } + + //============================================================================================================== + // ignored users list management + //============================================================================================================== + + /** + * Refresh the ignored users list + */ + private fun refreshIgnoredUsersList() { + val ignoredUsersList = mutableListOf() // TODO session.dataHandler.ignoredUserIds + + ignoredUsersList.sortWith(Comparator { u1, u2 -> + u1.toLowerCase(VectorLocale.applicationLocale).compareTo(u2.toLowerCase(VectorLocale.applicationLocale)) + }) + + val preferenceScreen = preferenceScreen + + preferenceScreen.removePreference(mIgnoredUserSettingsCategory) + preferenceScreen.removePreference(mIgnoredUserSettingsCategoryDivider) + mIgnoredUserSettingsCategory.removeAll() + + if (ignoredUsersList.size > 0) { + preferenceScreen.addPreference(mIgnoredUserSettingsCategoryDivider) + preferenceScreen.addPreference(mIgnoredUserSettingsCategory) + + for (userId in ignoredUsersList) { + val preference = Preference(activity) + + preference.title = userId + preference.key = IGNORED_USER_KEY_BASE + userId + + preference.onPreferenceClickListener = Preference.OnPreferenceClickListener { + activity?.let { + AlertDialog.Builder(it) + .setMessage(getString(R.string.settings_unignore_user, userId)) + .setPositiveButton(R.string.yes) { _, _ -> + displayLoadingView() + + val idsList = ArrayList() + idsList.add(userId) + + notImplemented() + /* TODO + session.unIgnoreUsers(idsList, object : MatrixCallback { + override fun onSuccess(info: Void?) { + onCommonDone(null) + } + + override fun onNetworkError(e: Exception) { + onCommonDone(e.localizedMessage) + } + + override fun onMatrixError(e: MatrixError) { + onCommonDone(e.localizedMessage) + } + + override fun onUnexpectedError(e: Exception) { + onCommonDone(e.localizedMessage) + } + }) + */ + } + .setNegativeButton(R.string.no, null) + .show() + } + + false + } + + mIgnoredUserSettingsCategory.addPreference(preference) + } + } + } + + companion object { + private const val IGNORED_USER_KEY_BASE = "IGNORED_USER_KEY_BASE" + } +} \ No newline at end of file diff --git a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsLabs.kt b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsLabs.kt new file mode 100644 index 00000000..cdaa549e --- /dev/null +++ b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsLabs.kt @@ -0,0 +1,128 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotredesign.features.settings + +import android.text.TextUtils +import androidx.appcompat.app.AlertDialog +import androidx.preference.Preference +import androidx.preference.PreferenceCategory +import androidx.preference.SwitchPreference +import im.vector.riotredesign.R + +class VectorSettingsLabs : VectorSettingsBaseFragment() { + + override var titleRes = R.string.room_settings_labs_pref_title + override val preferenceXmlRes = R.xml.vector_settings_labs + + private val mLabsCategory by lazy { + findPreference(PreferencesManager.SETTINGS_LABS_PREFERENCE_KEY) as PreferenceCategory + } + + override fun bindPref() { + // Lab + val useCryptoPref = findPreference(PreferencesManager.SETTINGS_ROOM_SETTINGS_LABS_END_TO_END_PREFERENCE_KEY) as SwitchPreference + val cryptoIsEnabledPref = findPreference(PreferencesManager.SETTINGS_ROOM_SETTINGS_LABS_END_TO_END_IS_ACTIVE_PREFERENCE_KEY) + + + if (mSession.isCryptoEnabled()) { + mLabsCategory.removePreference(useCryptoPref) + + cryptoIsEnabledPref.isEnabled = false + } else { + mLabsCategory.removePreference(cryptoIsEnabledPref) + + useCryptoPref.isChecked = false + + useCryptoPref.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValueAsVoid -> + if (TextUtils.isEmpty(mSession.sessionParams.credentials.deviceId)) { + activity?.let { activity -> + AlertDialog.Builder(activity) + .setMessage(R.string.room_settings_labs_end_to_end_warnings) + .setPositiveButton(R.string.logout) { _, _ -> + notImplemented() + // TODO CommonActivityUtils.logout(activity) + } + .setNegativeButton(R.string.cancel) { _, _ -> + useCryptoPref.isChecked = false + } + .setOnCancelListener { + useCryptoPref.isChecked = false + } + .show() + } + } else { + val newValue = newValueAsVoid as Boolean + + if (mSession.isCryptoEnabled() != newValue) { + notImplemented() + /* TODO + displayLoadingView() + + session.enableCrypto(newValue, object : MatrixCallback { + private fun refresh() { + activity?.runOnUiThread { + hideLoadingView() + useCryptoPref.isChecked = session.isCryptoEnabled + + if (session.isCryptoEnabled) { + mLabsCategory.removePreference(useCryptoPref) + mLabsCategory.addPreference(cryptoIsEnabledPref) + } + } + } + + override fun onSuccess(info: Void?) { + useCryptoPref.isEnabled = false + refresh() + } + + override fun onNetworkError(e: Exception) { + useCryptoPref.isChecked = false + } + + override fun onMatrixError(e: MatrixError) { + useCryptoPref.isChecked = false + } + + override fun onUnexpectedError(e: Exception) { + useCryptoPref.isChecked = false + } + }) + */ + } + } + + true + } + } + + // SaveMode Management + findPreference(PreferencesManager.SETTINGS_DATA_SAVE_MODE_PREFERENCE_KEY) + .onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + notImplemented() + /* TODO + val sessions = Matrix.getMXSessions(activity) + for (session in sessions) { + session.setUseDataSaveMode(newValue as Boolean) + } + */ + + true + } + } + +} \ No newline at end of file diff --git a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsNotificationFragment.kt b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsNotificationFragment.kt index 1a967db0..e7ed9ee3 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsNotificationFragment.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsNotificationFragment.kt @@ -16,28 +16,79 @@ package im.vector.riotredesign.features.settings -import android.os.Bundle +import androidx.preference.EditTextPreference import androidx.preference.Preference +import androidx.preference.PreferenceCategory import androidx.preference.SwitchPreference import im.vector.matrix.android.api.Matrix import im.vector.matrix.android.api.MatrixCallback import im.vector.riotredesign.R -import im.vector.riotredesign.core.platform.VectorPreferenceFragment +import im.vector.riotredesign.core.preference.BingRule import im.vector.riotredesign.core.pushers.PushersManager import im.vector.riotredesign.push.fcm.FcmHelper import org.koin.android.ext.android.inject // Referenced in vector_settings_preferences_root.xml -class VectorSettingsNotificationPreferenceFragment : VectorPreferenceFragment() { +class VectorSettingsNotificationPreferenceFragment : VectorSettingsBaseFragment() { override var titleRes: Int = R.string.settings_notifications + override val preferenceXmlRes = R.xml.vector_settings_notifications val pushManager: PushersManager by inject() - - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.vector_settings_notifications) + // background sync category + private val mSyncRequestTimeoutPreference by lazy { + // ? Cause it can be removed + findPreference(PreferencesManager.SETTINGS_SET_SYNC_TIMEOUT_PREFERENCE_KEY) as EditTextPreference? } + private val mSyncRequestDelayPreference by lazy { + // ? Cause it can be removed + findPreference(PreferencesManager.SETTINGS_SET_SYNC_DELAY_PREFERENCE_KEY) as EditTextPreference? + } + + private val backgroundSyncCategory by lazy { + findPreference(PreferencesManager.SETTINGS_BACKGROUND_SYNC_PREFERENCE_KEY) + } + private val backgroundSyncDivider by lazy { + findPreference(PreferencesManager.SETTINGS_BACKGROUND_SYNC_DIVIDER_PREFERENCE_KEY) + } + private val backgroundSyncPreference by lazy { + findPreference(PreferencesManager.SETTINGS_ENABLE_BACKGROUND_SYNC_PREFERENCE_KEY) as SwitchPreference + } + + private val notificationsSettingsCategory by lazy { + findPreference(PreferencesManager.SETTINGS_NOTIFICATIONS_KEY) as PreferenceCategory + } + private val mNotificationPrivacyPreference by lazy { + findPreference(PreferencesManager.SETTINGS_NOTIFICATION_PRIVACY_PREFERENCE_KEY) + } + + override fun bindPref() { + // Notification privacy + mNotificationPrivacyPreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { + notImplemented() + // TODO startActivity(NotificationPrivacyActivity.getIntent(activity)) + true + } + refreshNotificationPrivacy() + + for (preferenceKey in mPrefKeyToBingRuleId.keys) { + val preference = findPreference(preferenceKey) + + if (null != preference) { + if (preference is SwitchPreference) { + preference.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValueAsVoid -> + // on some old android APIs, + // the callback is called even if there is no user interaction + // so the value will be checked to ensure there is really no update. + onPushRuleClick(preference.key, newValueAsVoid as Boolean) + true + } + } + } + } + } + override fun onResume() { super.onResume() @@ -69,4 +120,221 @@ class VectorSettingsNotificationPreferenceFragment : VectorPreferenceFragment() } return super.onPreferenceTreeClick(preference) } + + /** + * Update a push rule. + */ + private fun onPushRuleClick(preferenceKey: String, newValue: Boolean) { + notImplemented() + /* TODO + val matrixInstance = Matrix.getInstance(context) + val pushManager = matrixInstance.pushManager + + Timber.v("onPushRuleClick $preferenceKey : set to $newValue") + + when (preferenceKey) { + + PreferencesManager.SETTINGS_TURN_SCREEN_ON_PREFERENCE_KEY -> { + if (pushManager.isScreenTurnedOn != newValue) { + pushManager.isScreenTurnedOn = newValue + } + } + + PreferencesManager.SETTINGS_ENABLE_THIS_DEVICE_PREFERENCE_KEY -> { + val isConnected = matrixInstance.isConnected + val isAllowed = pushManager.areDeviceNotificationsAllowed() + + // avoid useless update + if (isAllowed == newValue) { + return + } + + pushManager.setDeviceNotificationsAllowed(!isAllowed) + + // when using FCM + // need to register on servers + if (isConnected && pushManager.useFcm() && (pushManager.isServerRegistered || pushManager.isServerUnRegistered)) { + val listener = object : MatrixCallback { + + private fun onDone() { + activity?.runOnUiThread { + hideLoadingView(true) + refreshPushersList() + } + } + + override fun onSuccess(info: Void?) { + onDone() + } + + override fun onMatrixError(e: MatrixError?) { + // Set again the previous state + pushManager.setDeviceNotificationsAllowed(isAllowed) + onDone() + } + + override fun onNetworkError(e: java.lang.Exception?) { + // Set again the previous state + pushManager.setDeviceNotificationsAllowed(isAllowed) + onDone() + } + + override fun onUnexpectedError(e: java.lang.Exception?) { + // Set again the previous state + pushManager.setDeviceNotificationsAllowed(isAllowed) + onDone() + } + } + + displayLoadingView() + if (pushManager.isServerRegistered) { + pushManager.unregister(listener) + } else { + pushManager.register(listener) + } + } + } + + // check if there is an update + + // on some old android APIs, + // the callback is called even if there is no user interaction + // so the value will be checked to ensure there is really no update. + else -> { + + val ruleId = mPrefKeyToBingRuleId[preferenceKey] + val rule = session.dataHandler.pushRules()?.findDefaultRule(ruleId) + + // check if there is an update + var curValue = null != rule && rule.isEnabled + + if (TextUtils.equals(ruleId, BingRule.RULE_ID_DISABLE_ALL) || TextUtils.equals(ruleId, BingRule.RULE_ID_SUPPRESS_BOTS_NOTIFICATIONS)) { + curValue = !curValue + } + + // on some old android APIs, + // the callback is called even if there is no user interaction + // so the value will be checked to ensure there is really no update. + if (newValue == curValue) { + return + } + + if (null != rule) { + displayLoadingView() + session.dataHandler.bingRulesManager.updateEnableRuleStatus(rule, !rule.isEnabled, object : BingRulesManager.onBingRuleUpdateListener { + private fun onDone() { + refreshDisplay() + hideLoadingView() + } + + override fun onBingRuleUpdateSuccess() { + onDone() + } + + override fun onBingRuleUpdateFailure(errorMessage: String) { + activity?.toast(errorMessage) + onDone() + } + }) + } + } + } + */ + } + + /** + * Refresh the notification privacy setting + */ + private fun refreshNotificationPrivacy() { + /* TODO + val pushManager = Matrix.getInstance(activity).pushManager + + // this setting apply only with FCM for the moment + if (pushManager.useFcm()) { + val notificationPrivacyString = NotificationPrivacyActivity.getNotificationPrivacyString(activity, + pushManager.notificationPrivacy) + mNotificationPrivacyPreference.summary = notificationPrivacyString + } else { + notificationsSettingsCategory.removePreference(mNotificationPrivacyPreference) + } + */ + } + + /** + * Refresh the background sync preference + */ + private fun refreshBackgroundSyncPrefs() { + /* TODO + activity?.let { activity -> + val pushManager = Matrix.getInstance(activity).pushManager + + val timeout = pushManager.backgroundSyncTimeOut / 1000 + val delay = pushManager.backgroundSyncDelay / 1000 + + // update the settings + PreferenceManager.getDefaultSharedPreferences(activity).edit { + putString(PreferencesManager.SETTINGS_SET_SYNC_TIMEOUT_PREFERENCE_KEY, timeout.toString() + "") + putString(PreferencesManager.SETTINGS_SET_SYNC_DELAY_PREFERENCE_KEY, delay.toString() + "") + } + + mSyncRequestTimeoutPreference?.let { + it.summary = secondsToText(timeout) + it.text = timeout.toString() + "" + + it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + var newTimeOut = timeout + + try { + newTimeOut = Integer.parseInt(newValue as String) + } catch (e: Exception) { + Timber.e(e, "## refreshBackgroundSyncPrefs : parseInt failed " + e.message) + } + + if (newTimeOut != timeout) { + pushManager.backgroundSyncTimeOut = newTimeOut * 1000 + + activity.runOnUiThread { refreshBackgroundSyncPrefs() } + } + + false + } + } + + mSyncRequestDelayPreference?.let { + it.summary = secondsToText(delay) + it.text = delay.toString() + "" + + it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + var newDelay = delay + + try { + newDelay = Integer.parseInt(newValue as String) + } catch (e: Exception) { + Timber.e(e, "## refreshBackgroundSyncPrefs : parseInt failed " + e.message) + } + + if (newDelay != delay) { + pushManager.backgroundSyncDelay = newDelay * 1000 + + activity.runOnUiThread { refreshBackgroundSyncPrefs() } + } + + false + } + } + } + */ + } + + companion object { + private const val DUMMY_RULE = "DUMMY_RULE" + + // preference name <-> rule Id + private var mPrefKeyToBingRuleId = mapOf( + PreferencesManager.SETTINGS_ENABLE_ALL_NOTIF_PREFERENCE_KEY to BingRule.RULE_ID_DISABLE_ALL, + PreferencesManager.SETTINGS_ENABLE_THIS_DEVICE_PREFERENCE_KEY to DUMMY_RULE, + PreferencesManager.SETTINGS_TURN_SCREEN_ON_PREFERENCE_KEY to DUMMY_RULE + ) + } + } \ No newline at end of file diff --git a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferences.kt b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferences.kt new file mode 100644 index 00000000..fcb4791b --- /dev/null +++ b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferences.kt @@ -0,0 +1,206 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotredesign.features.settings + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.text.TextUtils +import android.widget.CheckedTextView +import android.widget.LinearLayout +import androidx.appcompat.app.AlertDialog +import androidx.preference.Preference +import androidx.preference.SwitchPreference +import im.vector.riotredesign.R +import im.vector.riotredesign.features.configuration.VectorConfiguration +import im.vector.riotredesign.features.themes.ThemeUtils +import org.koin.android.ext.android.inject + +class VectorSettingsPreferences : VectorSettingsBaseFragment() { + + override var titleRes = R.string.settings_preferences + override val preferenceXmlRes = R.xml.vector_settings_preferences + + private val selectedLanguagePreference by lazy { + findPreference(PreferencesManager.SETTINGS_INTERFACE_LANGUAGE_PREFERENCE_KEY) + } + private val textSizePreference by lazy { + findPreference(PreferencesManager.SETTINGS_INTERFACE_TEXT_SIZE_KEY) + } + + private val vectorConfiguration by inject() + + override fun bindPref() { + // user interface preferences + setUserInterfacePreferences() + + // Themes + findPreference(ThemeUtils.APPLICATION_THEME_KEY) + .onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + if (newValue is String) { + vectorConfiguration.updateApplicationTheme(newValue) + // Restart the Activity + activity?.let { + // Note: recreate does not apply the color correctly + it.startActivity(it.intent) + it.finish() + } + true + } else { + false + } + } + + // Url preview + (findPreference(PreferencesManager.SETTINGS_SHOW_URL_PREVIEW_KEY) as SwitchPreference).let { + /* + TODO + it.isChecked = session.isURLPreviewEnabled + + it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + if (null != newValue && newValue as Boolean != session.isURLPreviewEnabled) { + displayLoadingView() + session.setURLPreviewStatus(newValue, object : MatrixCallback { + override fun onSuccess(info: Void?) { + it.isChecked = session.isURLPreviewEnabled + hideLoadingView() + } + + private fun onError(errorMessage: String) { + activity?.toast(errorMessage) + + onSuccess(null) + } + + override fun onNetworkError(e: Exception) { + onError(e.localizedMessage) + } + + override fun onMatrixError(e: MatrixError) { + onError(e.localizedMessage) + } + + override fun onUnexpectedError(e: Exception) { + onError(e.localizedMessage) + } + }) + } + + false + } + */ + } + + // update keep medias period + findPreference(PreferencesManager.SETTINGS_MEDIA_SAVING_PERIOD_KEY).let { + it.summary = PreferencesManager.getSelectedMediasSavingPeriodString(activity) + + it.onPreferenceClickListener = Preference.OnPreferenceClickListener { + context?.let { context: Context -> + AlertDialog.Builder(context) + .setSingleChoiceItems(R.array.media_saving_choice, + PreferencesManager.getSelectedMediasSavingPeriod(activity)) { d, n -> + PreferencesManager.setSelectedMediasSavingPeriod(activity, n) + d.cancel() + + it.summary = PreferencesManager.getSelectedMediasSavingPeriodString(activity) + } + .show() + } + + false + } + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + REQUEST_LOCALE -> { + activity?.let { + startActivity(it.intent) + it.finish() + } + } + } + } + } + + + //============================================================================================================== + // user interface management + //============================================================================================================== + + private fun setUserInterfacePreferences() { + // Selected language + selectedLanguagePreference.summary = VectorLocale.localeToLocalisedString(VectorLocale.applicationLocale) + + selectedLanguagePreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { + notImplemented() + // TODO startActivityForResult(LanguagePickerActivity.getIntent(activity), REQUEST_LOCALE) + true + } + + // Text size + textSizePreference.summary = FontScale.getFontScaleDescription(activity!!) + + textSizePreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { + activity?.let { displayTextSizeSelection(it) } + true + } + } + + private fun displayTextSizeSelection(activity: Activity) { + val inflater = activity.layoutInflater + val layout = inflater.inflate(R.layout.dialog_select_text_size, null) + + val dialog = AlertDialog.Builder(activity) + .setTitle(R.string.font_size) + .setView(layout) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .show() + + val linearLayout = layout.findViewById(R.id.text_selection_group_view) + + val childCount = linearLayout.childCount + + val scaleText = FontScale.getFontScaleDescription(activity) + + for (i in 0 until childCount) { + val v = linearLayout.getChildAt(i) + + if (v is CheckedTextView) { + v.isChecked = TextUtils.equals(v.text, scaleText) + + v.setOnClickListener { + dialog.dismiss() + FontScale.updateFontScale(activity, v.text.toString()) + activity.startActivity(activity.intent) + activity.finish() + } + } + } + } + + companion object { + private const val REQUEST_LOCALE = 777 + } + +} \ No newline at end of file diff --git a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferencesFragment.kt b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferencesFragment.kt index 6ce235f6..d1b98d1a 100755 --- a/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferencesFragment.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/settings/VectorSettingsPreferencesFragment.kt @@ -16,77 +16,26 @@ package im.vector.riotredesign.features.settings -import android.annotation.SuppressLint import android.app.Activity import android.content.Context -import android.content.DialogInterface import android.content.Intent import android.content.SharedPreferences -import android.graphics.Typeface -import android.media.RingtoneManager -import android.net.Uri import android.os.AsyncTask import android.os.Bundle -import android.provider.Settings -import android.text.Editable -import android.text.TextUtils -import android.view.KeyEvent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.view.inputmethod.InputMethodManager -import android.widget.* import androidx.appcompat.app.AlertDialog -import androidx.core.content.ContextCompat import androidx.core.content.edit -import androidx.core.view.isVisible -import androidx.preference.* -import com.google.android.gms.oss.licenses.OssLicensesMenuActivity -import com.google.android.material.textfield.TextInputEditText -import com.google.android.material.textfield.TextInputLayout -import im.vector.matrix.android.api.Matrix -import im.vector.matrix.android.api.MatrixCallback -import im.vector.matrix.android.api.extensions.getFingerprintHumanReadable -import im.vector.matrix.android.api.extensions.sortByLastSeen -import im.vector.matrix.android.api.failure.Failure -import im.vector.matrix.android.api.session.Session -import im.vector.matrix.android.internal.auth.data.LoginFlowTypes -import im.vector.matrix.android.internal.crypto.model.ImportRoomKeysResult -import im.vector.matrix.android.internal.crypto.model.rest.DeviceInfo -import im.vector.matrix.android.internal.crypto.model.rest.DevicesListResponse +import androidx.preference.Preference +import androidx.preference.PreferenceManager import im.vector.riotredesign.R -import im.vector.riotredesign.core.dialogs.ExportKeysDialog -import im.vector.riotredesign.core.extensions.showPassword -import im.vector.riotredesign.core.extensions.withArgs -import im.vector.riotredesign.core.intent.ExternalIntentData -import im.vector.riotredesign.core.intent.analyseIntent -import im.vector.riotredesign.core.intent.getFilenameFromUri -import im.vector.riotredesign.core.platform.SimpleTextWatcher -import im.vector.riotredesign.core.platform.VectorPreferenceFragment import im.vector.riotredesign.core.preference.BingRule -import im.vector.riotredesign.core.preference.ProgressBarPreference -import im.vector.riotredesign.core.preference.UserAvatarPreference import im.vector.riotredesign.core.preference.VectorPreference -import im.vector.riotredesign.core.utils.* -import im.vector.riotredesign.features.MainActivity -import im.vector.riotredesign.features.configuration.VectorConfiguration -import im.vector.riotredesign.features.crypto.keys.KeysExporter -import im.vector.riotredesign.features.crypto.keys.KeysImporter -import im.vector.riotredesign.features.crypto.keysbackup.settings.KeysBackupManageActivity -import im.vector.riotredesign.features.themes.ThemeUtils -import im.vector.riotredesign.features.version.getVersion -import org.koin.android.ext.android.inject -import timber.log.Timber import java.lang.ref.WeakReference -import java.text.DateFormat -import java.text.SimpleDateFormat -import java.util.* -class VectorSettingsPreferencesFragment : VectorPreferenceFragment(), SharedPreferences.OnSharedPreferenceChangeListener { - - override var titleRes: Int = R.string.title_activity_settings - // members - private val mSession by inject() +// TODO Remove +class VectorSettingsPreferencesFragment { // disable some updates if there is // TODO private val mNetworkListener = IMXNetworkEventListener { refreshDisplay() } @@ -107,333 +56,15 @@ class VectorSettingsPreferencesFragment : VectorPreferenceFragment(), SharedPref // TODO } // TODO } - private var mLoadingView: View? = null - - private var mDisplayedEmails = ArrayList() - private var mDisplayedPhoneNumber = ArrayList() - - private var mMyDeviceInfo: DeviceInfo? = null // TODO private var mDisplayedPushers = ArrayList() private var interactionListener: VectorSettingsFragmentInteractionListener? = null - // devices: device IDs and device names - private var mDevicesNameList: List = ArrayList() - // used to avoid requesting to enter the password for each deletion - private var mAccountPassword: String = "" - - private val vectorConfiguration by inject() - - // current publicised group list - private var mPublicisedGroups: MutableSet? = null - - /* ========================================================================================== - * Preferences - * ========================================================================================== */ - - private val mUserSettingsCategory by lazy { - findPreference(PreferencesManager.SETTINGS_USER_SETTINGS_PREFERENCE_KEY) as PreferenceCategory - } - private val mUserAvatarPreference by lazy { - findPreference(PreferencesManager.SETTINGS_PROFILE_PICTURE_PREFERENCE_KEY) as UserAvatarPreference - } - private val mDisplayNamePreference by lazy { - findPreference(PreferencesManager.SETTINGS_DISPLAY_NAME_PREFERENCE_KEY) as EditTextPreference - } - private val mPasswordPreference by lazy { - findPreference(PreferencesManager.SETTINGS_CHANGE_PASSWORD_PREFERENCE_KEY) - } - - // Local contacts - private val mContactSettingsCategory by lazy { - findPreference(PreferencesManager.SETTINGS_CONTACT_PREFERENCE_KEYS) as PreferenceCategory - } - - private val mContactPhonebookCountryPreference by lazy { - findPreference(PreferencesManager.SETTINGS_CONTACTS_PHONEBOOK_COUNTRY_PREFERENCE_KEY) - } - - // Group Flairs - private val mGroupsFlairCategory by lazy { - findPreference(PreferencesManager.SETTINGS_GROUPS_FLAIR_KEY) as PreferenceCategory - } - - // cryptography - private val mCryptographyCategory by lazy { - findPreference(PreferencesManager.SETTINGS_CRYPTOGRAPHY_PREFERENCE_KEY) as PreferenceCategory - } - private val mCryptographyCategoryDivider by lazy { - findPreference(PreferencesManager.SETTINGS_CRYPTOGRAPHY_DIVIDER_PREFERENCE_KEY) - } - // cryptography manage - private val mCryptographyManageCategory by lazy { - findPreference(PreferencesManager.SETTINGS_CRYPTOGRAPHY_MANAGE_PREFERENCE_KEY) as PreferenceCategory - } - private val mCryptographyManageCategoryDivider by lazy { - findPreference(PreferencesManager.SETTINGS_CRYPTOGRAPHY_MANAGE_DIVIDER_PREFERENCE_KEY) - } - // displayed pushers - private val mPushersSettingsDivider by lazy { - findPreference(PreferencesManager.SETTINGS_NOTIFICATIONS_TARGET_DIVIDER_PREFERENCE_KEY) - } - private val mPushersSettingsCategory by lazy { - findPreference(PreferencesManager.SETTINGS_NOTIFICATIONS_TARGETS_PREFERENCE_KEY) as PreferenceCategory - } - private val mDevicesListSettingsCategory by lazy { - findPreference(PreferencesManager.SETTINGS_DEVICES_LIST_PREFERENCE_KEY) as PreferenceCategory - } - private val mDevicesListSettingsCategoryDivider by lazy { - findPreference(PreferencesManager.SETTINGS_DEVICES_DIVIDER_PREFERENCE_KEY) - } - // displayed the ignored users list - private val mIgnoredUserSettingsCategoryDivider by lazy { - findPreference(PreferencesManager.SETTINGS_IGNORE_USERS_DIVIDER_PREFERENCE_KEY) - } - private val mIgnoredUserSettingsCategory by lazy { - findPreference(PreferencesManager.SETTINGS_IGNORED_USERS_PREFERENCE_KEY) as PreferenceCategory - } - // background sync category - private val mSyncRequestTimeoutPreference by lazy { - // ? Cause it can be removed - findPreference(PreferencesManager.SETTINGS_SET_SYNC_TIMEOUT_PREFERENCE_KEY) as EditTextPreference? - } - private val mSyncRequestDelayPreference by lazy { - // ? Cause it can be removed - findPreference(PreferencesManager.SETTINGS_SET_SYNC_DELAY_PREFERENCE_KEY) as EditTextPreference? - } - private val mLabsCategory by lazy { - findPreference(PreferencesManager.SETTINGS_LABS_PREFERENCE_KEY) as PreferenceCategory - } - private val backgroundSyncCategory by lazy { - findPreference(PreferencesManager.SETTINGS_BACKGROUND_SYNC_PREFERENCE_KEY) - } - private val backgroundSyncDivider by lazy { - findPreference(PreferencesManager.SETTINGS_BACKGROUND_SYNC_DIVIDER_PREFERENCE_KEY) - } - private val backgroundSyncPreference by lazy { - findPreference(PreferencesManager.SETTINGS_ENABLE_BACKGROUND_SYNC_PREFERENCE_KEY) as SwitchPreference - } - private val mUseRiotCallRingtonePreference by lazy { - findPreference(PreferencesManager.SETTINGS_CALL_RINGTONE_USE_RIOT_PREFERENCE_KEY) as SwitchPreference - } - private val mCallRingtonePreference by lazy { - findPreference(PreferencesManager.SETTINGS_CALL_RINGTONE_URI_PREFERENCE_KEY) - } - private val notificationsSettingsCategory by lazy { - findPreference(PreferencesManager.SETTINGS_NOTIFICATIONS_KEY) as PreferenceCategory - } - private val mNotificationPrivacyPreference by lazy { - findPreference(PreferencesManager.SETTINGS_NOTIFICATION_PRIVACY_PREFERENCE_KEY) - } - private val selectedLanguagePreference by lazy { - findPreference(PreferencesManager.SETTINGS_INTERFACE_LANGUAGE_PREFERENCE_KEY) - } - private val textSizePreference by lazy { - findPreference(PreferencesManager.SETTINGS_INTERFACE_TEXT_SIZE_KEY) - } - private val cryptoInfoDeviceNamePreference by lazy { - findPreference(PreferencesManager.SETTINGS_ENCRYPTION_INFORMATION_DEVICE_NAME_PREFERENCE_KEY) as VectorPreference - } - private val cryptoInfoDeviceIdPreference by lazy { - findPreference(PreferencesManager.SETTINGS_ENCRYPTION_INFORMATION_DEVICE_ID_PREFERENCE_KEY) - } - - private val manageBackupPref by lazy { - findPreference(PreferencesManager.SETTINGS_SECURE_MESSAGE_RECOVERY_PREFERENCE_KEY) - } - - private val exportPref by lazy { - findPreference(PreferencesManager.SETTINGS_ENCRYPTION_EXPORT_E2E_ROOM_KEYS_PREFERENCE_KEY) - } - - private val importPref by lazy { - findPreference(PreferencesManager.SETTINGS_ENCRYPTION_IMPORT_E2E_ROOM_KEYS_PREFERENCE_KEY) - } - - private val cryptoInfoTextPreference by lazy { - findPreference(PreferencesManager.SETTINGS_ENCRYPTION_INFORMATION_DEVICE_KEY_PREFERENCE_KEY) - } - // encrypt to unverified devices - private val sendToUnverifiedDevicesPref by lazy { - findPreference(PreferencesManager.SETTINGS_ENCRYPTION_NEVER_SENT_TO_PREFERENCE_KEY) as SwitchPreference - } - - /* ========================================================================================== - * Life cycle - * ========================================================================================== */ - - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - val appContext = activity?.applicationContext - - // retrieve the arguments - /* - val sessionArg = Matrix.getInstance(appContext).getSession(arguments?.getString(ARG_MATRIX_ID)) - - // sanity checks - if (null == sessionArg || !sessionArg.isAlive) { - activity?.finish() - return - } - - session = sessionArg - */ - - // define the layout - addPreferencesFromResource(R.xml.vector_settings_preferences) - - // Avatar - mUserAvatarPreference.let { - it.setSession(mSession) - it.onPreferenceClickListener = Preference.OnPreferenceClickListener { - onUpdateAvatarClick() - false - } - } - - // Display name - mDisplayNamePreference.let { - it.summary = "TODO" // session.myUser.displayname - it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> - onDisplayNameClick(newValue?.let { (it as String).trim() }) - false - } - } - - // Password - mPasswordPreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - onPasswordUpdateClick() - false - } - - // Add Email - (findPreference(ADD_EMAIL_PREFERENCE_KEY) as EditTextPreference).let { - // It does not work on XML, do it here - it.icon = activity?.let { - ThemeUtils.tintDrawable(it, - ContextCompat.getDrawable(it, R.drawable.ic_add_black)!!, R.attr.vctr_settings_icon_tint_color) - } - - // Unfortunately, this is not supported in lib v7 - // it.editText.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS - - it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> - addEmail((newValue as String).trim()) - false - } - } - - // Add phone number - findPreference(ADD_PHONE_NUMBER_PREFERENCE_KEY).let { - // It does not work on XML, do it here - it.icon = activity?.let { - ThemeUtils.tintDrawable(it, - ContextCompat.getDrawable(it, R.drawable.ic_add_black)!!, R.attr.vctr_settings_icon_tint_color) - } - - it.setOnPreferenceClickListener { - notImplemented() - // TODO val intent = PhoneNumberAdditionActivity.getIntent(activity, session.credentials.userId) - // startActivityForResult(intent, REQUEST_NEW_PHONE_NUMBER) - true - } - } - - refreshEmailsList() - refreshPhoneNumbersList() - - // Contacts - setContactsPreferences() - - // user interface preferences - setUserInterfacePreferences() - - // Url preview - (findPreference(PreferencesManager.SETTINGS_SHOW_URL_PREVIEW_KEY) as SwitchPreference).let { - /* - TODO - it.isChecked = session.isURLPreviewEnabled - - it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> - if (null != newValue && newValue as Boolean != session.isURLPreviewEnabled) { - displayLoadingView() - session.setURLPreviewStatus(newValue, object : MatrixCallback { - override fun onSuccess(info: Void?) { - it.isChecked = session.isURLPreviewEnabled - hideLoadingView() - } - - private fun onError(errorMessage: String) { - activity?.toast(errorMessage) - - onSuccess(null) - } - - override fun onNetworkError(e: Exception) { - onError(e.localizedMessage) - } - - override fun onMatrixError(e: MatrixError) { - onError(e.localizedMessage) - } - - override fun onUnexpectedError(e: Exception) { - onError(e.localizedMessage) - } - }) - } - - false - } - */ - } - - // Themes - findPreference(ThemeUtils.APPLICATION_THEME_KEY) - .onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> - if (newValue is String) { - vectorConfiguration.updateApplicationTheme(newValue) - // Restart the Activity - activity?.let { - // Note: recreate does not apply the color correctly - it.startActivity(it.intent) - it.finish() - } - true - } else { - false - } - } - - // Flair - refreshGroupFlairsList() + fun bindPref() { // push rules - // Notification privacy - mNotificationPrivacyPreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - notImplemented() - // TODO startActivity(NotificationPrivacyActivity.getIntent(activity)) - true - } - refreshNotificationPrivacy() - - for (preferenceKey in mPrefKeyToBingRuleId.keys) { - val preference = findPreference(preferenceKey) - - if (null != preference) { - if (preference is SwitchPreference) { - preference.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValueAsVoid -> - // on some old android APIs, - // the callback is called even if there is no user interaction - // so the value will be checked to ensure there is really no update. - onPushRuleClick(preference.key, newValueAsVoid as Boolean) - true - } - } - } - } - // background sync tuning settings // these settings are useless and hidden if the app is registered to the FCM push service /* @@ -480,356 +111,11 @@ class VectorSettingsPreferencesFragment : VectorPreferenceFragment(), SharedPref } */ - // Push target - refreshPushersList() - - // Ignore users - refreshIgnoredUsersList() - - // Lab - val useCryptoPref = findPreference(PreferencesManager.SETTINGS_ROOM_SETTINGS_LABS_END_TO_END_PREFERENCE_KEY) as SwitchPreference - val cryptoIsEnabledPref = findPreference(PreferencesManager.SETTINGS_ROOM_SETTINGS_LABS_END_TO_END_IS_ACTIVE_PREFERENCE_KEY) - if (mSession.isCryptoEnabled()) { - mLabsCategory.removePreference(useCryptoPref) - - cryptoIsEnabledPref.isEnabled = false - } else { - mLabsCategory.removePreference(cryptoIsEnabledPref) - - useCryptoPref.isChecked = false - - useCryptoPref.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValueAsVoid -> - if (TextUtils.isEmpty(mSession.sessionParams.credentials.deviceId)) { - activity?.let { activity -> - AlertDialog.Builder(activity) - .setMessage(R.string.room_settings_labs_end_to_end_warnings) - .setPositiveButton(R.string.logout) { _, _ -> - notImplemented() - // TODO CommonActivityUtils.logout(activity) - } - .setNegativeButton(R.string.cancel) { _, _ -> - useCryptoPref.isChecked = false - } - .setOnCancelListener { - useCryptoPref.isChecked = false - } - .show() - } - } else { - val newValue = newValueAsVoid as Boolean - - if (mSession.isCryptoEnabled() != newValue) { - notImplemented() - /* TODO - displayLoadingView() - - session.enableCrypto(newValue, object : MatrixCallback { - private fun refresh() { - activity?.runOnUiThread { - hideLoadingView() - useCryptoPref.isChecked = session.isCryptoEnabled - - if (session.isCryptoEnabled) { - mLabsCategory.removePreference(useCryptoPref) - mLabsCategory.addPreference(cryptoIsEnabledPref) - } - } - } - - override fun onSuccess(info: Void?) { - useCryptoPref.isEnabled = false - refresh() - } - - override fun onNetworkError(e: Exception) { - useCryptoPref.isChecked = false - } - - override fun onMatrixError(e: MatrixError) { - useCryptoPref.isChecked = false - } - - override fun onUnexpectedError(e: Exception) { - useCryptoPref.isChecked = false - } - }) - */ - } - } - - true - } - } - - // SaveMode Management - findPreference(PreferencesManager.SETTINGS_DATA_SAVE_MODE_PREFERENCE_KEY) - .onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> - notImplemented() - /* TODO - val sessions = Matrix.getMXSessions(activity) - for (session in sessions) { - session.setUseDataSaveMode(newValue as Boolean) - } - */ - - true - } - - // Device list - refreshDevicesList() - - //Refresh Key Management section - refreshKeysManagementSection() - - // Advanced settings - - // user account - findPreference(PreferencesManager.SETTINGS_LOGGED_IN_PREFERENCE_KEY) - .summary = mSession.sessionParams.credentials.userId - - // home server - findPreference(PreferencesManager.SETTINGS_HOME_SERVER_PREFERENCE_KEY) - .summary = mSession.sessionParams.homeServerConnectionConfig.homeServerUri.toString() - - // identity server - findPreference(PreferencesManager.SETTINGS_IDENTITY_SERVER_PREFERENCE_KEY) - .summary = mSession.sessionParams.homeServerConnectionConfig.identityServerUri.toString() - - // Analytics - - // Analytics tracking management - (findPreference(PreferencesManager.SETTINGS_USE_ANALYTICS_KEY) as SwitchPreference).let { - // On if the analytics tracking is activated - it.isChecked = PreferencesManager.useAnalytics(appContext) - - it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> - PreferencesManager.setUseAnalytics(appContext, newValue as Boolean) - true - } - } - - // Rageshake Management - (findPreference(PreferencesManager.SETTINGS_USE_RAGE_SHAKE_KEY) as SwitchPreference).let { - it.isChecked = PreferencesManager.useRageshake(appContext) - - it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> - PreferencesManager.setUseRageshake(appContext, newValue as Boolean) - true - } - } - - // preference to start the App info screen, to facilitate App permissions access - findPreference(APP_INFO_LINK_PREFERENCE_KEY) - .onPreferenceClickListener = Preference.OnPreferenceClickListener { - - activity?.let { - val intent = Intent().apply { - action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - - val uri = appContext?.let { Uri.fromParts("package", it.packageName, null) } - - data = uri - } - it.applicationContext.startActivity(intent) - } - - true - } - - // application version - (findPreference(PreferencesManager.SETTINGS_VERSION_PREFERENCE_KEY)).let { - it.summary = getVersion(longFormat = false, useBuildNumber = true) - - it.setOnPreferenceClickListener { pref -> - appContext?.let { ctx -> - copyToClipboard(ctx, pref.summary) - } - true - } - } - - // SDK version - (findPreference(PreferencesManager.SETTINGS_SDK_VERSION_PREFERENCE_KEY)).let { - it.summary = Matrix.getSdkVersion() - - it.setOnPreferenceClickListener { pref -> - appContext?.let { ctx -> - copyToClipboard(ctx, pref.summary) - } - true - } - } - - // olm version - findPreference(PreferencesManager.SETTINGS_OLM_VERSION_PREFERENCE_KEY) - .summary = mSession.getCryptoVersion(requireContext(), false) - - // copyright - findPreference(PreferencesManager.SETTINGS_COPYRIGHT_PREFERENCE_KEY) - .onPreferenceClickListener = Preference.OnPreferenceClickListener { - activity?.displayInWebView(VectorSettingsUrls.COPYRIGHT) - false - } - - // terms & conditions - findPreference(PreferencesManager.SETTINGS_APP_TERM_CONDITIONS_PREFERENCE_KEY) - .onPreferenceClickListener = Preference.OnPreferenceClickListener { - activity?.displayInWebView(VectorSettingsUrls.TAC) - false - } - - // privacy policy - findPreference(PreferencesManager.SETTINGS_PRIVACY_POLICY_PREFERENCE_KEY) - .onPreferenceClickListener = Preference.OnPreferenceClickListener { - activity?.displayInWebView(VectorSettingsUrls.PRIVACY_POLICY) - false - } - - // third party notice - findPreference(PreferencesManager.SETTINGS_THIRD_PARTY_NOTICES_PREFERENCE_KEY) - .onPreferenceClickListener = Preference.OnPreferenceClickListener { - activity?.displayInWebView(VectorSettingsUrls.THIRD_PARTY_LICENSES) - false - } - - findPreference(PreferencesManager.SETTINGS_OTHER_THIRD_PARTY_NOTICES_PREFERENCE_KEY) - .onPreferenceClickListener = Preference.OnPreferenceClickListener { - // See https://developers.google.com/android/guides/opensource - startActivity(Intent(requireActivity(), OssLicensesMenuActivity::class.java)) - false - } - - // update keep medias period - findPreference(PreferencesManager.SETTINGS_MEDIA_SAVING_PERIOD_KEY).let { - it.summary = PreferencesManager.getSelectedMediasSavingPeriodString(activity) - - it.onPreferenceClickListener = Preference.OnPreferenceClickListener { - context?.let { context: Context -> - AlertDialog.Builder(context) - .setSingleChoiceItems(R.array.media_saving_choice, - PreferencesManager.getSelectedMediasSavingPeriod(activity)) { d, n -> - PreferencesManager.setSelectedMediasSavingPeriod(activity, n) - d.cancel() - - it.summary = PreferencesManager.getSelectedMediasSavingPeriodString(activity) - } - .show() - } - - false - } - } - - // clear medias cache - findPreference(PreferencesManager.SETTINGS_CLEAR_MEDIA_CACHE_PREFERENCE_KEY).let { - /* - TODO - MXMediaCache.getCachesSize(activity, object : SimpleApiCallback() { - override fun onSuccess(size: Long) { - if (null != activity) { - it.summary = android.text.format.Formatter.formatFileSize(activity, size) - } - } - }) - */ - - it.onPreferenceClickListener = Preference.OnPreferenceClickListener { - notImplemented() - /* TODO - displayLoadingView() - - val task = ClearMediaCacheAsyncTask( - backgroundTask = { - session.mediaCache.clear() - activity?.let { it -> Glide.get(it).clearDiskCache() } - }, - onCompleteTask = { - hideLoadingView() - - MXMediaCache.getCachesSize(activity, object : SimpleApiCallback() { - override fun onSuccess(size: Long) { - it.summary = Formatter.formatFileSize(activity, size) - } - }) - } - ) - - try { - task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) - } catch (e: Exception) { - Timber.e(e, "## session.getMediaCache().clear() failed " + e.message) - task.cancel(true) - hideLoadingView() - } - */ - - false - } - } - - // Incoming call sounds - mUseRiotCallRingtonePreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - activity?.let { setUseRiotDefaultRingtone(it, mUseRiotCallRingtonePreference.isChecked) } - false - } - - mCallRingtonePreference.let { - activity?.let { activity -> it.summary = getCallRingtoneName(activity) } - it.onPreferenceClickListener = Preference.OnPreferenceClickListener { - displayRingtonePicker() - false - } - } - - // clear cache - findPreference(PreferencesManager.SETTINGS_CLEAR_CACHE_PREFERENCE_KEY).let { - /* - TODO - MXSession.getApplicationSizeCaches(activity, object : SimpleApiCallback() { - override fun onSuccess(size: Long) { - if (null != activity) { - it.summary = android.text.format.Formatter.formatFileSize(activity, size) - } - } - }) - */ - - it.onPreferenceClickListener = Preference.OnPreferenceClickListener { - displayLoadingView() - MainActivity.restartApp(activity!!, clearCache = true, clearCredentials = false) - false - } - } - - // Deactivate account section - - // deactivate account - findPreference(PreferencesManager.SETTINGS_DEACTIVATE_ACCOUNT_KEY) - .onPreferenceClickListener = Preference.OnPreferenceClickListener { - activity?.let { - notImplemented() - // TODO startActivity(DeactivateAccountActivity.getIntent(it)) - } - - false - } } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - val view = super.onCreateView(inflater, container, savedInstanceState) - - view?.apply { - val listView = findViewById(android.R.id.list) - listView?.setPadding(0, 0, 0, 0) - } - - return view - } - - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { // if the user toggles the contacts book permission /* TODO if (TextUtils.equals(key, ContactsManager.CONTACTS_BOOK_ACCESS_KEY)) { @@ -839,6 +125,7 @@ class VectorSettingsPreferencesFragment : VectorPreferenceFragment(), SharedPref */ } + /* TODO override fun onAttach(context: Context) { super.onAttach(context) if (context is VectorSettingsFragmentInteractionListener) { @@ -850,121 +137,73 @@ class VectorSettingsPreferencesFragment : VectorPreferenceFragment(), SharedPref interactionListener = null super.onDetach() } + */ - override fun onResume() { - super.onResume() +// override fun onResume() { +// super.onResume() +// +// +// /* TODO +// if (session.isAlive) { +// val context = activity?.applicationContext +// +// session.dataHandler.addListener(mEventsListener) +// +// Matrix.getInstance(context)?.addNetworkEventListener(mNetworkListener) +// +// session.myUser.refreshThirdPartyIdentifiers(object : SimpleApiCallback() { +// override fun onSuccess(info: Void?) { +// // ensure that the activity still exists +// // and the result is called in the right thread +// activity?.runOnUiThread { +// refreshEmailsList() +// refreshPhoneNumbersList() +// } +// } +// }) +// +// Matrix.getInstance(context)?.pushManager?.refreshPushersList(Matrix.getInstance(context)?.sessions, object : SimpleApiCallback(activity) { +// override fun onSuccess(info: Void?) { +// refreshPushersList() +// } +// }) +// +// PreferenceManager.getDefaultSharedPreferences(context).registerOnSharedPreferenceChangeListener(this) +// +// // refresh anything else +// refreshPreferences() +// refreshNotificationPrivacy() +// refreshDisplay() +// refreshBackgroundSyncPrefs() +// } +// */ +// +// interactionListener?.requestedKeyToHighlight()?.let { key -> +// interactionListener?.requestHighlightPreferenceKeyOnResume(null) +// val preference = findPreference(key) +// (preference as? VectorPreference)?.isHighlighted = true +// } +// } - // find the view from parent activity - mLoadingView = activity?.findViewById(R.id.vector_settings_spinner_views) - - /* TODO - if (session.isAlive) { - val context = activity?.applicationContext - - session.dataHandler.addListener(mEventsListener) - - Matrix.getInstance(context)?.addNetworkEventListener(mNetworkListener) - - session.myUser.refreshThirdPartyIdentifiers(object : SimpleApiCallback() { - override fun onSuccess(info: Void?) { - // ensure that the activity still exists - // and the result is called in the right thread - activity?.runOnUiThread { - refreshEmailsList() - refreshPhoneNumbersList() - } - } - }) - - Matrix.getInstance(context)?.pushManager?.refreshPushersList(Matrix.getInstance(context)?.sessions, object : SimpleApiCallback(activity) { - override fun onSuccess(info: Void?) { - refreshPushersList() - } - }) - - PreferenceManager.getDefaultSharedPreferences(context).registerOnSharedPreferenceChangeListener(this) - - // refresh anything else - refreshPreferences() - refreshNotificationPrivacy() - refreshDisplay() - refreshBackgroundSyncPrefs() - } - */ - - interactionListener?.requestedKeyToHighlight()?.let { key -> - interactionListener?.requestHighlightPreferenceKeyOnResume(null) - val preference = findPreference(key) - (preference as? VectorPreference)?.isHighlighted = true - } - } - - override fun onPause() { - super.onPause() - - val context = activity?.applicationContext - - /* TODO - if (session.isAlive) { - session.dataHandler.removeListener(mEventsListener) - Matrix.getInstance(context)?.removeNetworkEventListener(mNetworkListener) - } - */ - - PreferenceManager.getDefaultSharedPreferences(context).unregisterOnSharedPreferenceChangeListener(this) - } - - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { - if (allGranted(grantResults)) { - if (requestCode == PERMISSION_REQUEST_CODE_LAUNCH_CAMERA) { - changeAvatar() - } else if (requestCode == PERMISSION_REQUEST_CODE_EXPORT_KEYS) { - exportKeys() - } - } - } +// override fun onPause() { +// super.onPause() +// +// val context = activity?.applicationContext +// +// /* TODO +// if (session.isAlive) { +// session.dataHandler.removeListener(mEventsListener) +// Matrix.getInstance(context)?.removeNetworkEventListener(mNetworkListener) +// } +// */ +// +// PreferenceManager.getDefaultSharedPreferences(context).unregisterOnSharedPreferenceChangeListener(this) +// } //============================================================================================================== // Display methods //============================================================================================================== - /** - * Display the loading view. - */ - private fun displayLoadingView() { - // search the loading view from the upper view - if (null == mLoadingView) { - var parent = view - - while (parent != null && mLoadingView == null) { - mLoadingView = parent.findViewById(R.id.vector_settings_spinner_views) - parent = parent.parent as View - } - } else { - mLoadingView?.visibility = View.VISIBLE - } - } - - /** - * Hide the loading view. - */ - private fun hideLoadingView() { - mLoadingView?.visibility = View.GONE - } - - /** - * Hide the loading view and refresh the preferences. - * - * @param refresh true to refresh the display - */ - private fun hideLoadingView(refresh: Boolean) { - mLoadingView?.visibility = View.GONE - - if (refresh) { - refreshDisplay() - } - } - /** * Refresh the preferences. */ @@ -1031,394 +270,11 @@ class VectorSettingsPreferencesFragment : VectorPreferenceFragment(), SharedPref // Update items methods //============================================================================================================== - /** - * Update the password. - */ - private fun onPasswordUpdateClick() { - activity?.let { activity -> - val view: ViewGroup = activity.layoutInflater.inflate(R.layout.dialog_change_password, null) as ViewGroup - val showPassword: ImageView = view.findViewById(R.id.change_password_show_passwords) - val oldPasswordTil: TextInputLayout = view.findViewById(R.id.change_password_old_pwd_til) - val oldPasswordText: TextInputEditText = view.findViewById(R.id.change_password_old_pwd_text) - val newPasswordText: TextInputEditText = view.findViewById(R.id.change_password_new_pwd_text) - val confirmNewPasswordTil: TextInputLayout = view.findViewById(R.id.change_password_confirm_new_pwd_til) - val confirmNewPasswordText: TextInputEditText = view.findViewById(R.id.change_password_confirm_new_pwd_text) - val changePasswordLoader: View = view.findViewById(R.id.change_password_loader) - - var passwordShown = false - - showPassword.setOnClickListener(object : View.OnClickListener { - override fun onClick(v: View?) { - passwordShown = !passwordShown - - oldPasswordText.showPassword(passwordShown) - newPasswordText.showPassword(passwordShown) - confirmNewPasswordText.showPassword(passwordShown) - - showPassword.setImageResource(if (passwordShown) R.drawable.ic_eye_closed_black else R.drawable.ic_eye_black) - } - }) - - val dialog = AlertDialog.Builder(activity) - .setView(view) - .setPositiveButton(R.string.settings_change_password_submit, null) - .setNegativeButton(R.string.cancel, null) - .setOnDismissListener { - val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - imm.hideSoftInputFromWindow(view.applicationWindowToken, 0) - } - .create() - - dialog.setOnShowListener { - val updateButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE) - updateButton.isEnabled = false - - fun updateUi() { - val oldPwd = oldPasswordText.text.toString().trim() - val newPwd = newPasswordText.text.toString().trim() - val newConfirmPwd = confirmNewPasswordText.text.toString().trim() - - updateButton.isEnabled = oldPwd.isNotEmpty() && newPwd.isNotEmpty() && TextUtils.equals(newPwd, newConfirmPwd) - - if (newPwd.isNotEmpty() && newConfirmPwd.isNotEmpty() && !TextUtils.equals(newPwd, newConfirmPwd)) { - confirmNewPasswordTil.error = getString(R.string.passwords_do_not_match) - } - } - - oldPasswordText.addTextChangedListener(object : SimpleTextWatcher() { - override fun afterTextChanged(s: Editable) { - oldPasswordTil.error = null - updateUi() - } - }) - - newPasswordText.addTextChangedListener(object : SimpleTextWatcher() { - override fun afterTextChanged(s: Editable) { - confirmNewPasswordTil.error = null - updateUi() - } - }) - - confirmNewPasswordText.addTextChangedListener(object : SimpleTextWatcher() { - override fun afterTextChanged(s: Editable) { - confirmNewPasswordTil.error = null - updateUi() - } - }) - - fun showPasswordLoadingView(toShow: Boolean) { - if (toShow) { - showPassword.isEnabled = false - oldPasswordText.isEnabled = false - newPasswordText.isEnabled = false - confirmNewPasswordText.isEnabled = false - changePasswordLoader.isVisible = true - updateButton.isEnabled = false - } else { - showPassword.isEnabled = true - oldPasswordText.isEnabled = true - newPasswordText.isEnabled = true - confirmNewPasswordText.isEnabled = true - changePasswordLoader.isVisible = false - updateButton.isEnabled = true - } - } - - updateButton.setOnClickListener { - if (passwordShown) { - // Hide passwords during processing - showPassword.performClick() - } - - val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - imm.hideSoftInputFromWindow(view.applicationWindowToken, 0) - - val oldPwd = oldPasswordText.text.toString().trim() - val newPwd = newPasswordText.text.toString().trim() - - notImplemented() - /* TODO - showPasswordLoadingView(true) - - session.updatePassword(oldPwd, newPwd, object : MatrixCallback { - private fun onDone(@StringRes textResId: Int) { - showPasswordLoadingView(false) - - if (textResId == R.string.settings_fail_to_update_password_invalid_current_password) { - oldPasswordTil.error = getString(textResId) - } else { - dialog.dismiss() - activity.toast(textResId, Toast.LENGTH_LONG) - } - } - - override fun onSuccess(info: Void?) { - onDone(R.string.settings_password_updated) - } - - override fun onNetworkError(e: Exception) { - onDone(R.string.settings_fail_to_update_password) - } - - override fun onMatrixError(e: MatrixError) { - if (e.error == "Invalid password") { - onDone(R.string.settings_fail_to_update_password_invalid_current_password) - } else { - dialog.dismiss() - onDone(R.string.settings_fail_to_update_password) - } - } - - override fun onUnexpectedError(e: Exception) { - onDone(R.string.settings_fail_to_update_password) - } - }) - */ - } - } - dialog.show() - } - } - - /** - * Update a push rule. - */ - - private fun onPushRuleClick(preferenceKey: String, newValue: Boolean) { - notImplemented() - /* TODO - val matrixInstance = Matrix.getInstance(context) - val pushManager = matrixInstance.pushManager - - Timber.v("onPushRuleClick $preferenceKey : set to $newValue") - - when (preferenceKey) { - - PreferencesManager.SETTINGS_TURN_SCREEN_ON_PREFERENCE_KEY -> { - if (pushManager.isScreenTurnedOn != newValue) { - pushManager.isScreenTurnedOn = newValue - } - } - - PreferencesManager.SETTINGS_ENABLE_THIS_DEVICE_PREFERENCE_KEY -> { - val isConnected = matrixInstance.isConnected - val isAllowed = pushManager.areDeviceNotificationsAllowed() - - // avoid useless update - if (isAllowed == newValue) { - return - } - - pushManager.setDeviceNotificationsAllowed(!isAllowed) - - // when using FCM - // need to register on servers - if (isConnected && pushManager.useFcm() && (pushManager.isServerRegistered || pushManager.isServerUnRegistered)) { - val listener = object : MatrixCallback { - - private fun onDone() { - activity?.runOnUiThread { - hideLoadingView(true) - refreshPushersList() - } - } - - override fun onSuccess(info: Void?) { - onDone() - } - - override fun onMatrixError(e: MatrixError?) { - // Set again the previous state - pushManager.setDeviceNotificationsAllowed(isAllowed) - onDone() - } - - override fun onNetworkError(e: java.lang.Exception?) { - // Set again the previous state - pushManager.setDeviceNotificationsAllowed(isAllowed) - onDone() - } - - override fun onUnexpectedError(e: java.lang.Exception?) { - // Set again the previous state - pushManager.setDeviceNotificationsAllowed(isAllowed) - onDone() - } - } - - displayLoadingView() - if (pushManager.isServerRegistered) { - pushManager.unregister(listener) - } else { - pushManager.register(listener) - } - } - } - - // check if there is an update - - // on some old android APIs, - // the callback is called even if there is no user interaction - // so the value will be checked to ensure there is really no update. - else -> { - - val ruleId = mPrefKeyToBingRuleId[preferenceKey] - val rule = session.dataHandler.pushRules()?.findDefaultRule(ruleId) - - // check if there is an update - var curValue = null != rule && rule.isEnabled - - if (TextUtils.equals(ruleId, BingRule.RULE_ID_DISABLE_ALL) || TextUtils.equals(ruleId, BingRule.RULE_ID_SUPPRESS_BOTS_NOTIFICATIONS)) { - curValue = !curValue - } - - // on some old android APIs, - // the callback is called even if there is no user interaction - // so the value will be checked to ensure there is really no update. - if (newValue == curValue) { - return - } - - if (null != rule) { - displayLoadingView() - session.dataHandler.bingRulesManager.updateEnableRuleStatus(rule, !rule.isEnabled, object : BingRulesManager.onBingRuleUpdateListener { - private fun onDone() { - refreshDisplay() - hideLoadingView() - } - - override fun onBingRuleUpdateSuccess() { - onDone() - } - - override fun onBingRuleUpdateFailure(errorMessage: String) { - activity?.toast(errorMessage) - onDone() - } - }) - } - } - } - */ - } - - /** - * Update the displayname. - */ - private fun onDisplayNameClick(value: String?) { - notImplemented() - /* TODO - if (!TextUtils.equals(session.myUser.displayname, value)) { - displayLoadingView() - - session.myUser.updateDisplayName(value, object : MatrixCallback { - override fun onSuccess(info: Void?) { - // refresh the settings value - PreferenceManager.getDefaultSharedPreferences(activity).edit { - putString(PreferencesManager.SETTINGS_DISPLAY_NAME_PREFERENCE_KEY, value) - } - - onCommonDone(null) - - refreshDisplay() - } - - override fun onNetworkError(e: Exception) { - onCommonDone(e.localizedMessage) - } - - override fun onMatrixError(e: MatrixError) { - if (MatrixError.M_CONSENT_NOT_GIVEN == e.errcode) { - activity?.runOnUiThread { - hideLoadingView() - (activity as VectorAppCompatActivity).consentNotGivenHelper.displayDialog(e) - } - } else { - onCommonDone(e.localizedMessage) - } - } - - override fun onUnexpectedError(e: Exception) { - onCommonDone(e.localizedMessage) - } - }) - } - */ - } - - private fun displayRingtonePicker() { - val intent = Intent(RingtoneManager.ACTION_RINGTONE_PICKER).apply { - putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, getString(R.string.settings_call_ringtone_dialog_title)) - putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false) - putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true) - putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE) - activity?.let { putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, getCallRingtoneUri(it)) } - } - startActivityForResult(intent, REQUEST_CALL_RINGTONE) - } - - /** - * Update the avatar. - */ - private fun onUpdateAvatarClick() { - notImplemented() - - /* TODO - if (checkPermissions(PERMISSIONS_FOR_TAKING_PHOTO, this, PERMISSION_REQUEST_CODE_LAUNCH_CAMERA)) { - changeAvatar() - } - */ - } - - private fun changeAvatar() { - /* TODO - val intent = Intent(activity, VectorMediaPickerActivity::class.java) - intent.putExtra(VectorMediaPickerActivity.EXTRA_AVATAR_MODE, true) - startActivityForResult(intent, VectorUtils.TAKE_IMAGE) - */ - } - - /** - * Refresh the notification privacy setting - */ - private fun refreshNotificationPrivacy() { - /* TODO - val pushManager = Matrix.getInstance(activity).pushManager - - // this setting apply only with FCM for the moment - if (pushManager.useFcm()) { - val notificationPrivacyString = NotificationPrivacyActivity.getNotificationPrivacyString(activity, - pushManager.notificationPrivacy) - mNotificationPrivacyPreference.summary = notificationPrivacyString - } else { - notificationsSettingsCategory.removePreference(mNotificationPrivacyPreference) - } - */ - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) + fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (resultCode == Activity.RESULT_OK) { when (requestCode) { - REQUEST_CALL_RINGTONE -> { - val callRingtoneUri: Uri? = data?.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) - val thisActivity = activity - if (callRingtoneUri != null && thisActivity != null) { - setCallRingtoneUri(thisActivity, callRingtoneUri) - mCallRingtonePreference.summary = getCallRingtoneName(thisActivity) - } - } - REQUEST_E2E_FILE_REQUEST_CODE -> importKeys(data) - REQUEST_NEW_PHONE_NUMBER -> refreshPhoneNumbersList() - REQUEST_PHONEBOOK_COUNTRY -> onPhonebookCountryUpdate(data) - REQUEST_LOCALE -> { - activity?.let { - startActivity(it.intent) - it.finish() - } - } /* TODO VectorUtils.TAKE_IMAGE -> { val thumbnailUri = VectorUtils.getThumbnailUriFromIntent(activity, data, session.mediaCache) @@ -1477,9 +333,9 @@ class VectorSettingsPreferencesFragment : VectorPreferenceFragment(), SharedPref * Refresh the known information about the account */ private fun refreshPreferences() { - PreferenceManager.getDefaultSharedPreferences(activity).edit { - putString(PreferencesManager.SETTINGS_DISPLAY_NAME_PREFERENCE_KEY, "TODO") //session.myUser.displayname) - + //PreferenceManager.getDefaultSharedPreferences(activity).edit { + // putString(PreferencesManager.SETTINGS_DISPLAY_NAME_PREFERENCE_KEY, "TODO") //session.myUser.displayname) +// /* TODO session.dataHandler.pushRules()?.let { for (preferenceKey in mPrefKeyToBingRuleId.keys) { @@ -1514,579 +370,9 @@ class VectorSettingsPreferencesFragment : VectorPreferenceFragment(), SharedPref } } */ - } + // } } - /** - * Display a dialog which asks confirmation for the deletion of a 3pid - * - * @param pid the 3pid to delete - * @param preferenceSummary the displayed 3pid - */ - private fun displayDelete3PIDConfirmationDialog(/* TODO pid: ThirdPartyIdentifier,*/ preferenceSummary: CharSequence) { - val mediumFriendlyName = "TODO" // ThreePid.getMediumFriendlyName(pid.medium, activity).toLowerCase(VectorLocale.applicationLocale) - val dialogMessage = getString(R.string.settings_delete_threepid_confirmation, mediumFriendlyName, preferenceSummary) - - activity?.let { - AlertDialog.Builder(it) - .setTitle(R.string.dialog_title_confirmation) - .setMessage(dialogMessage) - .setPositiveButton(R.string.remove) { _, _ -> - notImplemented() - /* TODO - displayLoadingView() - - session.myUser.delete3Pid(pid, object : MatrixCallback { - override fun onSuccess(info: Void?) { - when (pid.medium) { - ThreePid.MEDIUM_EMAIL -> refreshEmailsList() - ThreePid.MEDIUM_MSISDN -> refreshPhoneNumbersList() - } - onCommonDone(null) - } - - override fun onNetworkError(e: Exception) { - onCommonDone(e.localizedMessage) - } - - override fun onMatrixError(e: MatrixError) { - onCommonDone(e.localizedMessage) - } - - override fun onUnexpectedError(e: Exception) { - onCommonDone(e.localizedMessage) - } - }) - */ - } - .setNegativeButton(R.string.cancel, null) - .show() - } - } - - //============================================================================================================== - // ignored users list management - //============================================================================================================== - - /** - * Refresh the ignored users list - */ - private fun refreshIgnoredUsersList() { - val ignoredUsersList = mutableListOf() // TODO session.dataHandler.ignoredUserIds - - ignoredUsersList.sortWith(Comparator { u1, u2 -> - u1.toLowerCase(VectorLocale.applicationLocale).compareTo(u2.toLowerCase(VectorLocale.applicationLocale)) - }) - - val preferenceScreen = preferenceScreen - - preferenceScreen.removePreference(mIgnoredUserSettingsCategory) - preferenceScreen.removePreference(mIgnoredUserSettingsCategoryDivider) - mIgnoredUserSettingsCategory.removeAll() - - if (ignoredUsersList.size > 0) { - preferenceScreen.addPreference(mIgnoredUserSettingsCategoryDivider) - preferenceScreen.addPreference(mIgnoredUserSettingsCategory) - - for (userId in ignoredUsersList) { - val preference = Preference(activity) - - preference.title = userId - preference.key = IGNORED_USER_KEY_BASE + userId - - preference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - activity?.let { - AlertDialog.Builder(it) - .setMessage(getString(R.string.settings_unignore_user, userId)) - .setPositiveButton(R.string.yes) { _, _ -> - displayLoadingView() - - val idsList = ArrayList() - idsList.add(userId) - - notImplemented() - /* TODO - session.unIgnoreUsers(idsList, object : MatrixCallback { - override fun onSuccess(info: Void?) { - onCommonDone(null) - } - - override fun onNetworkError(e: Exception) { - onCommonDone(e.localizedMessage) - } - - override fun onMatrixError(e: MatrixError) { - onCommonDone(e.localizedMessage) - } - - override fun onUnexpectedError(e: Exception) { - onCommonDone(e.localizedMessage) - } - }) - */ - } - .setNegativeButton(R.string.no, null) - .show() - } - - false - } - - mIgnoredUserSettingsCategory.addPreference(preference) - } - } - } - - //============================================================================================================== - // pushers list management - //============================================================================================================== - - /** - * Refresh the pushers list - */ - private fun refreshPushersList() { - activity?.let { activity -> - /* TODO - val pushManager = Matrix.getInstance(activity).pushManager - val pushersList = ArrayList(pushManager.mPushersList) - - if (pushersList.isEmpty()) { - preferenceScreen.removePreference(mPushersSettingsCategory) - preferenceScreen.removePreference(mPushersSettingsDivider) - return - } - - // check first if there is an update - var isNewList = true - if (pushersList.size == mDisplayedPushers.size) { - isNewList = !mDisplayedPushers.containsAll(pushersList) - } - - if (isNewList) { - // remove the displayed one - mPushersSettingsCategory.removeAll() - - // add new emails list - mDisplayedPushers = pushersList - - var index = 0 - - for (pushRule in mDisplayedPushers) { - if (null != pushRule.lang) { - val isThisDeviceTarget = TextUtils.equals(pushManager.currentRegistrationToken, pushRule.pushkey) - - val preference = VectorPreference(activity).apply { - mTypeface = if (isThisDeviceTarget) Typeface.BOLD else Typeface.NORMAL - } - preference.title = pushRule.deviceDisplayName - preference.summary = pushRule.appDisplayName - preference.key = PUSHER_PREFERENCE_KEY_BASE + index - index++ - mPushersSettingsCategory.addPreference(preference) - - // the user cannot remove the self device target - if (!isThisDeviceTarget) { - preference.onPreferenceLongClickListener = object : VectorPreference.OnPreferenceLongClickListener { - override fun onPreferenceLongClick(preference: Preference): Boolean { - AlertDialog.Builder(activity) - .setTitle(R.string.dialog_title_confirmation) - .setMessage(R.string.settings_delete_notification_targets_confirmation) - .setPositiveButton(R.string.remove) - { _, _ -> - displayLoadingView() - pushManager.unregister(session, pushRule, object : MatrixCallback { - override fun onSuccess(info: Void?) { - refreshPushersList() - onCommonDone(null) - } - - override fun onNetworkError(e: Exception) { - onCommonDone(e.localizedMessage) - } - - override fun onMatrixError(e: MatrixError) { - onCommonDone(e.localizedMessage) - } - - override fun onUnexpectedError(e: Exception) { - onCommonDone(e.localizedMessage) - } - }) - } - .setNegativeButton(R.string.cancel, null) - .show() - return true - } - } - } - } - } - } - */ - } - } - - //============================================================================================================== - // Email management - //============================================================================================================== - - /** - * Refresh the emails list - */ - private fun refreshEmailsList() { - val currentEmail3PID = emptyList() // TODO ArrayList(session.myUser.getlinkedEmails()) - - val newEmailsList = ArrayList() - for (identifier in currentEmail3PID) { - // TODO newEmailsList.add(identifier.address) - } - - // check first if there is an update - var isNewList = true - if (newEmailsList.size == mDisplayedEmails.size) { - isNewList = !mDisplayedEmails.containsAll(newEmailsList) - } - - if (isNewList) { - // remove the displayed one - run { - var index = 0 - while (true) { - val preference = mUserSettingsCategory.findPreference(EMAIL_PREFERENCE_KEY_BASE + index) - - if (null != preference) { - mUserSettingsCategory.removePreference(preference) - } else { - break - } - index++ - } - } - - // add new emails list - mDisplayedEmails = newEmailsList - - val addEmailBtn = mUserSettingsCategory.findPreference(ADD_EMAIL_PREFERENCE_KEY) - ?: return - - var order = addEmailBtn.order - - for ((index, email3PID) in currentEmail3PID.withIndex()) { - val preference = VectorPreference(activity!!) - - preference.title = getString(R.string.settings_email_address) - preference.summary = "TODO" // email3PID.address - preference.key = EMAIL_PREFERENCE_KEY_BASE + index - preference.order = order - - preference.onPreferenceClickListener = Preference.OnPreferenceClickListener { pref -> - displayDelete3PIDConfirmationDialog(/* TODO email3PID, */ pref.summary) - true - } - - preference.onPreferenceLongClickListener = object : VectorPreference.OnPreferenceLongClickListener { - override fun onPreferenceLongClick(preference: Preference): Boolean { - activity?.let { copyToClipboard(it, "TODO") } //email3PID.address) } - return true - } - } - - mUserSettingsCategory.addPreference(preference) - - order++ - } - - addEmailBtn.order = order - } - } - - /** - * A request has been processed. - * Display a toast if there is a an error message - * - * @param errorMessage the error message - */ - private fun onCommonDone(errorMessage: String?) { - if (!isAdded) { - return - } - activity?.runOnUiThread { - if (!TextUtils.isEmpty(errorMessage) && errorMessage != null) { - activity?.toast(errorMessage!!) - } - hideLoadingView() - } - } - - /** - * Attempt to add a new email to the account - * - * @param email the email to add. - */ - private fun addEmail(email: String) { - // check first if the email syntax is valid - // if email is null , then also its invalid email - if (TextUtils.isEmpty(email) || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) { - activity?.toast(R.string.auth_invalid_email) - return - } - - // check first if the email syntax is valid - if (mDisplayedEmails.indexOf(email) >= 0) { - activity?.toast(R.string.auth_email_already_defined) - return - } - - notImplemented() - /* TODO - val pid = ThreePid(email, ThreePid.MEDIUM_EMAIL) - - displayLoadingView() - - session.myUser.requestEmailValidationToken(pid, object : MatrixCallback { - override fun onSuccess(info: Void?) { - activity?.runOnUiThread { showEmailValidationDialog(pid) } - } - - override fun onNetworkError(e: Exception) { - onCommonDone(e.localizedMessage) - } - - override fun onMatrixError(e: MatrixError) { - if (TextUtils.equals(MatrixError.THREEPID_IN_USE, e.errcode)) { - onCommonDone(getString(R.string.account_email_already_used_error)) - } else { - onCommonDone(e.localizedMessage) - } - } - - override fun onUnexpectedError(e: Exception) { - onCommonDone(e.localizedMessage) - } - }) - */ - } - - /** - * Show an email validation dialog to warn the user tho valid his email link. - * - * @param pid the used pid. - */ - /* TODO - private fun showEmailValidationDialog(pid: ThreePid) { - activity?.let { - AlertDialog.Builder(it) - .setTitle(R.string.account_email_validation_title) - .setMessage(R.string.account_email_validation_message) - .setPositiveButton(R.string._continue) { _, _ -> - session.myUser.add3Pid(pid, true, object : MatrixCallback { - override fun onSuccess(info: Void?) { - it.runOnUiThread { - hideLoadingView() - refreshEmailsList() - } - } - - override fun onNetworkError(e: Exception) { - onCommonDone(e.localizedMessage) - } - - override fun onMatrixError(e: MatrixError) { - if (TextUtils.equals(e.errcode, MatrixError.THREEPID_AUTH_FAILED)) { - it.runOnUiThread { - hideLoadingView() - it.toast(R.string.account_email_validation_error) - } - } else { - onCommonDone(e.localizedMessage) - } - } - - override fun onUnexpectedError(e: Exception) { - onCommonDone(e.localizedMessage) - } - }) - } - .setNegativeButton(R.string.cancel) { _, _ -> - hideLoadingView() - } - .show() - } - } */ - - //============================================================================================================== - // Phone number management - //============================================================================================================== - - /** - * Refresh phone number list - */ - private fun refreshPhoneNumbersList() { - /* TODO - val currentPhoneNumber3PID = ArrayList(session.myUser.getlinkedPhoneNumbers()) - - val phoneNumberList = ArrayList() - for (identifier in currentPhoneNumber3PID) { - phoneNumberList.add(identifier.address) - } - - // check first if there is an update - var isNewList = true - if (phoneNumberList.size == mDisplayedPhoneNumber.size) { - isNewList = !mDisplayedPhoneNumber.containsAll(phoneNumberList) - } - - if (isNewList) { - // remove the displayed one - run { - var index = 0 - while (true) { - val preference = mUserSettingsCategory.findPreference(PHONE_NUMBER_PREFERENCE_KEY_BASE + index) - - if (null != preference) { - mUserSettingsCategory.removePreference(preference) - } else { - break - } - index++ - } - } - - // add new phone number list - mDisplayedPhoneNumber = phoneNumberList - - val addPhoneBtn = mUserSettingsCategory.findPreference(ADD_PHONE_NUMBER_PREFERENCE_KEY) - ?: return - - var order = addPhoneBtn.order - - for ((index, phoneNumber3PID) in currentPhoneNumber3PID.withIndex()) { - val preference = VectorPreference(activity!!) - - preference.title = getString(R.string.settings_phone_number) - var phoneNumberFormatted = phoneNumber3PID.address - try { - // Attempt to format phone number - val phoneNumber = PhoneNumberUtil.getInstance().parse("+$phoneNumberFormatted", null) - phoneNumberFormatted = PhoneNumberUtil.getInstance().format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL) - } catch (e: NumberParseException) { - // Do nothing, we will display raw version - } - - preference.summary = phoneNumberFormatted - preference.key = PHONE_NUMBER_PREFERENCE_KEY_BASE + index - preference.order = order - - preference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - displayDelete3PIDConfirmationDialog(phoneNumber3PID, preference.summary) - true - } - - preference.onPreferenceLongClickListener = object : VectorPreference.OnPreferenceLongClickListener { - override fun onPreferenceLongClick(preference: Preference): Boolean { - activity?.let { copyToClipboard(it, phoneNumber3PID.address) } - return true - } - } - - order++ - mUserSettingsCategory.addPreference(preference) - } - - addPhoneBtn.order = order - } */ - } - - //============================================================================================================== - // contacts management - //============================================================================================================== - - private fun setContactsPreferences() { - /* TODO - // Permission - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - // on Android >= 23, use the system one - mContactSettingsCategory.removePreference(findPreference(ContactsManager.CONTACTS_BOOK_ACCESS_KEY)) - } - // Phonebook country - mContactPhonebookCountryPreference.summary = PhoneNumberUtils.getHumanCountryCode(PhoneNumberUtils.getCountryCode(activity)) - - mContactPhonebookCountryPreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - val intent = CountryPickerActivity.getIntent(activity, true) - startActivityForResult(intent, REQUEST_PHONEBOOK_COUNTRY) - true - } - */ - } - - private fun onPhonebookCountryUpdate(data: Intent?) { - /* TODO - if (data != null && data.hasExtra(CountryPickerActivity.EXTRA_OUT_COUNTRY_NAME) - && data.hasExtra(CountryPickerActivity.EXTRA_OUT_COUNTRY_CODE)) { - val countryCode = data.getStringExtra(CountryPickerActivity.EXTRA_OUT_COUNTRY_CODE) - if (!TextUtils.equals(countryCode, PhoneNumberUtils.getCountryCode(activity))) { - PhoneNumberUtils.setCountryCode(activity, countryCode) - mContactPhonebookCountryPreference.summary = data.getStringExtra(CountryPickerActivity.EXTRA_OUT_COUNTRY_NAME) - } - } - */ - } - - //============================================================================================================== - // user interface management - //============================================================================================================== - - private fun setUserInterfacePreferences() { - // Selected language - selectedLanguagePreference.summary = VectorLocale.localeToLocalisedString(VectorLocale.applicationLocale) - - selectedLanguagePreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - notImplemented() - // TODO startActivityForResult(LanguagePickerActivity.getIntent(activity), REQUEST_LOCALE) - true - } - - // Text size - textSizePreference.summary = FontScale.getFontScaleDescription(activity!!) - - textSizePreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - activity?.let { displayTextSizeSelection(it) } - true - } - } - - private fun displayTextSizeSelection(activity: Activity) { - val inflater = activity.layoutInflater - val layout = inflater.inflate(R.layout.dialog_select_text_size, null) - - val dialog = AlertDialog.Builder(activity) - .setTitle(R.string.font_size) - .setView(layout) - .setPositiveButton(R.string.ok, null) - .setNegativeButton(R.string.cancel, null) - .show() - - val linearLayout = layout.findViewById(R.id.text_selection_group_view) - - val childCount = linearLayout.childCount - - val scaleText = FontScale.getFontScaleDescription(activity) - - for (i in 0 until childCount) { - val v = linearLayout.getChildAt(i) - - if (v is CheckedTextView) { - v.isChecked = TextUtils.equals(v.text, scaleText) - - v.setOnClickListener { - dialog.dismiss() - FontScale.updateFontScale(activity, v.text.toString()) - activity.startActivity(activity.intent) - activity.finish() - } - } - } - } //============================================================================================================== // background sync management @@ -2098,797 +384,15 @@ class VectorSettingsPreferencesFragment : VectorPreferenceFragment(), SharedPref * @param seconds the delay in seconds * @return the text */ - private fun secondsToText(seconds: Int): String { - return if (seconds > 1) { - seconds.toString() + " " + getString(R.string.settings_seconds) - } else { - seconds.toString() + " " + getString(R.string.settings_second) - } - } +// private fun secondsToText(seconds: Int): String { +// return if (seconds > 1) { +// seconds.toString() + " " + getString(R.string.settings_seconds) +// } else { +// seconds.toString() + " " + getString(R.string.settings_second) +// } +// } - /** - * Refresh the background sync preference - */ - private fun refreshBackgroundSyncPrefs() { - /* TODO - activity?.let { activity -> - val pushManager = Matrix.getInstance(activity).pushManager - val timeout = pushManager.backgroundSyncTimeOut / 1000 - val delay = pushManager.backgroundSyncDelay / 1000 - - // update the settings - PreferenceManager.getDefaultSharedPreferences(activity).edit { - putString(PreferencesManager.SETTINGS_SET_SYNC_TIMEOUT_PREFERENCE_KEY, timeout.toString() + "") - putString(PreferencesManager.SETTINGS_SET_SYNC_DELAY_PREFERENCE_KEY, delay.toString() + "") - } - - mSyncRequestTimeoutPreference?.let { - it.summary = secondsToText(timeout) - it.text = timeout.toString() + "" - - it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> - var newTimeOut = timeout - - try { - newTimeOut = Integer.parseInt(newValue as String) - } catch (e: Exception) { - Timber.e(e, "## refreshBackgroundSyncPrefs : parseInt failed " + e.message) - } - - if (newTimeOut != timeout) { - pushManager.backgroundSyncTimeOut = newTimeOut * 1000 - - activity.runOnUiThread { refreshBackgroundSyncPrefs() } - } - - false - } - } - - mSyncRequestDelayPreference?.let { - it.summary = secondsToText(delay) - it.text = delay.toString() + "" - - it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> - var newDelay = delay - - try { - newDelay = Integer.parseInt(newValue as String) - } catch (e: Exception) { - Timber.e(e, "## refreshBackgroundSyncPrefs : parseInt failed " + e.message) - } - - if (newDelay != delay) { - pushManager.backgroundSyncDelay = newDelay * 1000 - - activity.runOnUiThread { refreshBackgroundSyncPrefs() } - } - - false - } - } - } - */ - } - - //============================================================================================================== - // Cryptography - //============================================================================================================== - - private fun removeCryptographyPreference() { - preferenceScreen.let { - it.removePreference(mCryptographyCategory) - it.removePreference(mCryptographyCategoryDivider) - - // Also remove keys management section - it.removePreference(mCryptographyManageCategory) - it.removePreference(mCryptographyManageCategoryDivider) - } - } - - /** - * Build the cryptography preference section. - * - * @param aMyDeviceInfo the device info - */ - private fun refreshCryptographyPreference(aMyDeviceInfo: DeviceInfo?) { - val userId = mSession.sessionParams.credentials.userId - val deviceId = mSession.sessionParams.credentials.deviceId - - // device name - if (null != aMyDeviceInfo) { - cryptoInfoDeviceNamePreference.summary = aMyDeviceInfo.displayName - - cryptoInfoDeviceNamePreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - displayDeviceRenameDialog(aMyDeviceInfo) - true - } - - cryptoInfoDeviceNamePreference.onPreferenceLongClickListener = object : VectorPreference.OnPreferenceLongClickListener { - override fun onPreferenceLongClick(preference: Preference): Boolean { - activity?.let { copyToClipboard(it, aMyDeviceInfo.displayName!!) } - return true - } - } - } - - // crypto section: device ID - if (!TextUtils.isEmpty(deviceId)) { - cryptoInfoDeviceIdPreference.summary = deviceId - - cryptoInfoDeviceIdPreference.setOnPreferenceClickListener { - activity?.let { copyToClipboard(it, deviceId!!) } - true - } - } - - // crypto section: device key (fingerprint) - if (!TextUtils.isEmpty(deviceId) && !TextUtils.isEmpty(userId)) { - val deviceInfo = mSession.getDeviceInfo(userId, deviceId) - - if (null != deviceInfo && !TextUtils.isEmpty(deviceInfo.fingerprint())) { - cryptoInfoTextPreference.summary = deviceInfo.getFingerprintHumanReadable() - - cryptoInfoTextPreference.setOnPreferenceClickListener { - deviceInfo.fingerprint()?.let { - copyToClipboard(requireActivity(), it) - } - true - } - } - } - - sendToUnverifiedDevicesPref.isChecked = false - - sendToUnverifiedDevicesPref.isChecked = mSession.getGlobalBlacklistUnverifiedDevices() - - sendToUnverifiedDevicesPref.onPreferenceClickListener = Preference.OnPreferenceClickListener { - mSession.setGlobalBlacklistUnverifiedDevices(sendToUnverifiedDevicesPref.isChecked) - - true - } - } - - private fun refreshKeysManagementSection() { - //If crypto is not enabled parent section will be removed - //TODO notice that this will not work when no network - manageBackupPref.onPreferenceClickListener = Preference.OnPreferenceClickListener { - context?.let { - startActivity(KeysBackupManageActivity.intent(it)) - } - false - } - - exportPref.onPreferenceClickListener = Preference.OnPreferenceClickListener { - exportKeys() - true - } - - importPref.onPreferenceClickListener = Preference.OnPreferenceClickListener { - importKeys() - true - } - } - - //============================================================================================================== - // devices list - //============================================================================================================== - - private fun removeDevicesPreference() { - preferenceScreen.let { - it.removePreference(mDevicesListSettingsCategory) - it.removePreference(mDevicesListSettingsCategoryDivider) - } - } - - /** - * Force the refresh of the devices list.

- * The devices list is the list of the devices where the user as looged in. - * It can be any mobile device, as any browser. - */ - private fun refreshDevicesList() { - if (mSession.isCryptoEnabled() && !TextUtils.isEmpty(mSession.sessionParams.credentials.deviceId)) { - // display a spinner while loading the devices list - if (0 == mDevicesListSettingsCategory.preferenceCount) { - activity?.let { - val preference = ProgressBarPreference(it) - mDevicesListSettingsCategory.addPreference(preference) - } - } - - mSession.getDevicesList(object : MatrixCallback { - override fun onSuccess(data: DevicesListResponse) { - if (!isAdded) { - return - } - - if (data.devices?.isEmpty() == true) { - removeDevicesPreference() - } else { - buildDevicesSettings(data.devices!!) - } - } - - override fun onFailure(failure: Throwable) { - if (!isAdded) { - return - } - - removeDevicesPreference() - onCommonDone(failure.message) - } - }) - } else { - removeDevicesPreference() - removeCryptographyPreference() - } - } - - /** - * Build the devices portion of the settings.

- * Each row correspond to a device ID and its corresponding device name. Clicking on the row - * display a dialog containing: the device ID, the device name and the "last seen" information. - * - * @param aDeviceInfoList the list of the devices - */ - private fun buildDevicesSettings(aDeviceInfoList: List) { - var preference: VectorPreference - var typeFaceHighlight: Int - var isNewList = true - val myDeviceId = mSession.sessionParams.credentials.deviceId - - if (aDeviceInfoList.size == mDevicesNameList.size) { - isNewList = !mDevicesNameList.containsAll(aDeviceInfoList) - } - - if (isNewList) { - var prefIndex = 0 - mDevicesNameList = aDeviceInfoList - - // sort before display: most recent first - mDevicesNameList.sortByLastSeen() - - // start from scratch: remove the displayed ones - mDevicesListSettingsCategory.removeAll() - - for (deviceInfo in mDevicesNameList) { - // set bold to distinguish current device ID - if (null != myDeviceId && myDeviceId == deviceInfo.deviceId) { - mMyDeviceInfo = deviceInfo - typeFaceHighlight = Typeface.BOLD - } else { - typeFaceHighlight = Typeface.NORMAL - } - - // add the edit text preference - preference = VectorPreference(requireActivity()).apply { - mTypeface = typeFaceHighlight - } - - if (null == deviceInfo.deviceId && null == deviceInfo.displayName) { - continue - } else { - if (null != deviceInfo.deviceId) { - preference.title = deviceInfo.deviceId - } - - // display name parameter can be null (new JSON API) - if (null != deviceInfo.displayName) { - preference.summary = deviceInfo.displayName - } - } - - preference.key = DEVICES_PREFERENCE_KEY_BASE + prefIndex - prefIndex++ - - // onClick handler: display device details dialog - preference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - displayDeviceDetailsDialog(deviceInfo) - true - } - - mDevicesListSettingsCategory.addPreference(preference) - } - - refreshCryptographyPreference(mMyDeviceInfo) - } - } - - /** - * Display a dialog containing the device ID, the device name and the "last seen" information.<> - * This dialog allow to delete the corresponding device (see [.displayDeviceDeletionDialog]) - * - * @param aDeviceInfo the device information - */ - private fun displayDeviceDetailsDialog(aDeviceInfo: DeviceInfo) { - - activity?.let { - - val builder = AlertDialog.Builder(it) - val inflater = it.layoutInflater - val layout = inflater.inflate(R.layout.dialog_device_details, null) - var textView = layout.findViewById(R.id.device_id) - - textView.text = aDeviceInfo.deviceId - - // device name - textView = layout.findViewById(R.id.device_name) - val displayName = if (TextUtils.isEmpty(aDeviceInfo.displayName)) LABEL_UNAVAILABLE_DATA else aDeviceInfo.displayName - textView.text = displayName - - // last seen info - textView = layout.findViewById(R.id.device_last_seen) - - val lastSeenIp = aDeviceInfo.lastSeenIp?.takeIf { ip -> ip.isNotBlank() } ?: "-" - - val lastSeenTime = aDeviceInfo.lastSeenTs?.let { ts -> - val dateFormatTime = SimpleDateFormat("HH:mm:ss") - val date = Date(ts) - - val time = dateFormatTime.format(date) - val dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault()) - - dateFormat.format(date) + ", " + time - } ?: "-" - - val lastSeenInfo = getString(R.string.devices_details_last_seen_format, lastSeenIp, lastSeenTime) - textView.text = lastSeenInfo - - // title & icon - builder.setTitle(R.string.devices_details_dialog_title) - .setIcon(android.R.drawable.ic_dialog_info) - .setView(layout) - .setPositiveButton(R.string.rename) { _, _ -> displayDeviceRenameDialog(aDeviceInfo) } - - // disable the deletion for our own device - if (!TextUtils.equals(mSession.getMyDevice()?.deviceId, aDeviceInfo.deviceId)) { - builder.setNegativeButton(R.string.delete) { _, _ -> deleteDevice(aDeviceInfo) } - } - - builder.setNeutralButton(R.string.cancel, null) - .setOnKeyListener(DialogInterface.OnKeyListener { dialog, keyCode, event -> - if (event.action == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { - dialog.cancel() - return@OnKeyListener true - } - false - }) - .show() - } - } - - /** - * Display an alert dialog to rename a device - * - * @param aDeviceInfoToRename device info - */ - private fun displayDeviceRenameDialog(aDeviceInfoToRename: DeviceInfo) { - activity?.let { - val inflater = it.layoutInflater - val layout = inflater.inflate(R.layout.dialog_base_edit_text, null) - - val input = layout.findViewById(R.id.edit_text) - input.setText(aDeviceInfoToRename.displayName) - - AlertDialog.Builder(it) - .setTitle(R.string.devices_details_device_name) - .setView(layout) - .setPositiveButton(R.string.ok) { _, _ -> - displayLoadingView() - - val newName = input.text.toString() - - mSession.setDeviceName(aDeviceInfoToRename.deviceId!!, newName, object : MatrixCallback { - override fun onSuccess(data: Unit) { - hideLoadingView() - - // search which preference is updated - val count = mDevicesListSettingsCategory.preferenceCount - - for (i in 0 until count) { - val pref = mDevicesListSettingsCategory.getPreference(i) - - if (TextUtils.equals(aDeviceInfoToRename.deviceId, pref.title)) { - pref.summary = newName - } - } - - // detect if the updated device is the current account one - if (TextUtils.equals(cryptoInfoDeviceIdPreference.summary, aDeviceInfoToRename.deviceId)) { - cryptoInfoDeviceNamePreference.summary = newName - } - - // Also change the display name in aDeviceInfoToRename, in case of multiple renaming - aDeviceInfoToRename.displayName = newName - } - - override fun onFailure(failure: Throwable) { - onCommonDone(failure.localizedMessage) - } - }) - } - .setNegativeButton(R.string.cancel, null) - .show() - } - } - - /** - * Try to delete a device. - * - * @param deviceInfo the device to delete - */ - private fun deleteDevice(deviceInfo: DeviceInfo) { - val deviceId = deviceInfo.deviceId - if (deviceId == null) { - Timber.e("## displayDeviceDeletionDialog(): sanity check failure") - return - } - - displayLoadingView() - mSession.deleteDevice(deviceId, object : MatrixCallback { - override fun onSuccess(data: Unit) { - hideLoadingView() - // force settings update - refreshDevicesList() - } - - override fun onFailure(failure: Throwable) { - var isPasswordRequestFound = false - - if (failure is Failure.RegistrationFlowError) { - // We only support LoginFlowTypes.PASSWORD - // Check if we can provide the user password - failure.registrationFlowResponse.flows?.forEach { interactiveAuthenticationFlow -> - isPasswordRequestFound = isPasswordRequestFound || interactiveAuthenticationFlow.stages?.any { it == LoginFlowTypes.PASSWORD } == true - } - - if (isPasswordRequestFound) { - maybeShowDeleteDeviceWithPasswordDialog(deviceId, failure.registrationFlowResponse.session) - } - - } - - if (!isPasswordRequestFound) { - // LoginFlowTypes.PASSWORD not supported, and this is the only one RiotX supports so far... - onCommonDone(failure.localizedMessage) - } - } - }) - } - - /** - * Show a dialog to ask for user password, or use a previously entered password. - */ - private fun maybeShowDeleteDeviceWithPasswordDialog(deviceId: String, authSession: String?) { - if (!TextUtils.isEmpty(mAccountPassword)) { - deleteDeviceWithPassword(deviceId, authSession, mAccountPassword) - } else { - activity?.let { - val inflater = it.layoutInflater - val layout = inflater.inflate(R.layout.dialog_device_delete, null) - val passwordEditText = layout.findViewById(R.id.delete_password) - - AlertDialog.Builder(it) - .setIcon(android.R.drawable.ic_dialog_alert) - .setTitle(R.string.devices_delete_dialog_title) - .setView(layout) - .setPositiveButton(R.string.devices_delete_submit_button_label, DialogInterface.OnClickListener { _, _ -> - if (TextUtils.isEmpty(passwordEditText.toString())) { - it.toast(R.string.error_empty_field_your_password) - return@OnClickListener - } - mAccountPassword = passwordEditText.text.toString() - deleteDeviceWithPassword(deviceId, authSession, mAccountPassword) - }) - .setNegativeButton(R.string.cancel) { _, _ -> - hideLoadingView() - } - .setOnKeyListener(DialogInterface.OnKeyListener { dialog, keyCode, event -> - if (event.action == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { - dialog.cancel() - hideLoadingView() - return@OnKeyListener true - } - false - }) - .show() - } - } - } - - private fun deleteDeviceWithPassword(deviceId: String, authSession: String?, accountPassword: String) { - mSession.deleteDeviceWithUserPassword(deviceId, authSession, accountPassword, object : MatrixCallback { - override fun onSuccess(data: Unit) { - hideLoadingView() - // force settings update - refreshDevicesList() - } - - override fun onFailure(failure: Throwable) { - // Password is maybe not good - onCommonDone(failure.localizedMessage) - mAccountPassword = "" - } - }) - } - - /** - * Manage the e2e keys export. - */ - private fun exportKeys() { - // We need WRITE_EXTERNAL permission - if (checkPermissions(PERMISSIONS_FOR_WRITING_FILES, this, PERMISSION_REQUEST_CODE_EXPORT_KEYS)) { - activity?.let { activity -> - ExportKeysDialog().show(activity, object : ExportKeysDialog.ExportKeyDialogListener { - override fun onPassphrase(passphrase: String) { - displayLoadingView() - - KeysExporter(mSession) - .export(requireContext(), - passphrase, - object : MatrixCallback { - override fun onSuccess(data: String) { - if (isAdded) { - hideLoadingView() - - AlertDialog.Builder(activity) - .setMessage(getString(R.string.encryption_export_saved_as, data)) - .setCancelable(false) - .setPositiveButton(R.string.ok, null) - .show() - } - } - - override fun onFailure(failure: Throwable) { - onCommonDone(failure.localizedMessage) - } - - }) - } - }) - } - } - } - - /** - * Manage the e2e keys import. - */ - @SuppressLint("NewApi") - private fun importKeys() { - activity?.let { openFileSelection(it, this, false, REQUEST_E2E_FILE_REQUEST_CODE) } - } - - /** - * Manage the e2e keys import. - * - * @param intent the intent result - */ - private fun importKeys(intent: Intent?) { - // sanity check - if (null == intent) { - return - } - - val sharedDataItems = analyseIntent(intent) - val thisActivity = activity - - if (sharedDataItems.isNotEmpty() && thisActivity != null) { - val sharedDataItem = sharedDataItems[0] - - val uri = when (sharedDataItem) { - is ExternalIntentData.IntentDataUri -> sharedDataItem.uri - is ExternalIntentData.IntentDataClipData -> sharedDataItem.clipDataItem.uri - else -> null - } - - val mimetype = when (sharedDataItem) { - is ExternalIntentData.IntentDataClipData -> sharedDataItem.mimeType - else -> null - } - - if (uri == null) { - return - } - - val appContext = thisActivity.applicationContext - - val filename = getFilenameFromUri(appContext, uri) - - val dialogLayout = thisActivity.layoutInflater.inflate(R.layout.dialog_import_e2e_keys, null) - - val textView = dialogLayout.findViewById(R.id.dialog_e2e_keys_passphrase_filename) - - if (filename.isNullOrBlank()) { - textView.isVisible = false - } else { - textView.isVisible = true - textView.text = getString(R.string.import_e2e_keys_from_file, filename) - } - - val builder = AlertDialog.Builder(thisActivity) - .setTitle(R.string.encryption_import_room_keys) - .setView(dialogLayout) - - val passPhraseEditText = dialogLayout.findViewById(R.id.dialog_e2e_keys_passphrase_edit_text) - val importButton = dialogLayout.findViewById