From a5830599c41a70b61818c2e04f3deb864ee37020 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Tue, 24 Sep 2019 20:29:35 +0200 Subject: [PATCH 001/254] Added initial load of styles and attributes Required for creating basic screens --- app/src/main/res/color/color_menu_tint.xml | 5 + app/src/main/res/drawable/bg_accent.xml | 12 + app/src/main/res/drawable/bg_circle.xml | 14 + app/src/main/res/drawable/bg_divider_top.xml | 21 ++ app/src/main/res/layout/test.xml | 253 ++++++++++++++++++ app/src/main/res/menu/menu_bottom_nav.xml | 29 ++ app/src/main/res/menu/menu_invisible.xml | 8 + app/src/main/res/values-v19/styles_md2.xml | 9 + app/src/main/res/values/attrs.xml | 72 ++++- app/src/main/res/values/styles_md2.xml | 89 ++++++ .../main/res/values/styles_md2_appearance.xml | 101 +++++++ app/src/main/res/values/styles_md2_impl.xml | 61 +++++ 12 files changed, 672 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/color/color_menu_tint.xml create mode 100644 app/src/main/res/drawable/bg_accent.xml create mode 100644 app/src/main/res/drawable/bg_circle.xml create mode 100644 app/src/main/res/drawable/bg_divider_top.xml create mode 100644 app/src/main/res/layout/test.xml create mode 100644 app/src/main/res/menu/menu_bottom_nav.xml create mode 100644 app/src/main/res/menu/menu_invisible.xml create mode 100644 app/src/main/res/values-v19/styles_md2.xml create mode 100644 app/src/main/res/values/styles_md2.xml create mode 100644 app/src/main/res/values/styles_md2_appearance.xml create mode 100644 app/src/main/res/values/styles_md2_impl.xml diff --git a/app/src/main/res/color/color_menu_tint.xml b/app/src/main/res/color/color_menu_tint.xml new file mode 100644 index 000000000..7e45559cd --- /dev/null +++ b/app/src/main/res/color/color_menu_tint.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_accent.xml b/app/src/main/res/drawable/bg_accent.xml new file mode 100644 index 000000000..2d253a52c --- /dev/null +++ b/app/src/main/res/drawable/bg_accent.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_circle.xml b/app/src/main/res/drawable/bg_circle.xml new file mode 100644 index 000000000..cc79f6fdd --- /dev/null +++ b/app/src/main/res/drawable/bg_circle.xml @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/bg_divider_top.xml b/app/src/main/res/drawable/bg_divider_top.xml new file mode 100644 index 000000000..09e8d6a54 --- /dev/null +++ b/app/src/main/res/drawable/bg_divider_top.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/test.xml b/app/src/main/res/layout/test.xml new file mode 100644 index 000000000..eed215ff0 --- /dev/null +++ b/app/src/main/res/layout/test.xml @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_bottom_nav.xml b/app/src/main/res/menu/menu_bottom_nav.xml new file mode 100644 index 000000000..e7ff50f50 --- /dev/null +++ b/app/src/main/res/menu/menu_bottom_nav.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_invisible.xml b/app/src/main/res/menu/menu_invisible.xml new file mode 100644 index 000000000..3638f9a9a --- /dev/null +++ b/app/src/main/res/menu/menu_invisible.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values-v19/styles_md2.xml b/app/src/main/res/values-v19/styles_md2.xml new file mode 100644 index 000000000..b3276387c --- /dev/null +++ b/app/src/main/res/values-v19/styles_md2.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index b6b8c507e..4030c0436 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -1,7 +1,75 @@ - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml new file mode 100644 index 000000000..43962abcd --- /dev/null +++ b/app/src/main/res/values/styles_md2.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles_md2_appearance.xml b/app/src/main/res/values/styles_md2_appearance.xml new file mode 100644 index 000000000..c9f08a8ca --- /dev/null +++ b/app/src/main/res/values/styles_md2_appearance.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml new file mode 100644 index 000000000..0a2be5c42 --- /dev/null +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From b4e1585e2bad8a237e3dee4ced50f13ed7d916e3 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 30 Sep 2019 19:36:51 +0200 Subject: [PATCH 002/254] Added custom font --- app/src/main/res/font/exo.xml | 37 +++++++++++++++++++ app/src/main/res/font/exo_bold.ttf | Bin 0 -> 87075 bytes app/src/main/res/font/exo_bold_italic.ttf | Bin 0 -> 92438 bytes app/src/main/res/font/exo_regular.ttf | Bin 0 -> 87435 bytes app/src/main/res/font/exo_regular_italic.ttf | Bin 0 -> 93176 bytes 5 files changed, 37 insertions(+) create mode 100644 app/src/main/res/font/exo.xml create mode 100755 app/src/main/res/font/exo_bold.ttf create mode 100755 app/src/main/res/font/exo_bold_italic.ttf create mode 100755 app/src/main/res/font/exo_regular.ttf create mode 100755 app/src/main/res/font/exo_regular_italic.ttf diff --git a/app/src/main/res/font/exo.xml b/app/src/main/res/font/exo.xml new file mode 100644 index 000000000..a0e6f8ec3 --- /dev/null +++ b/app/src/main/res/font/exo.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/font/exo_bold.ttf b/app/src/main/res/font/exo_bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..cae2855c09c20d724f923ef55883143b2a6edef0 GIT binary patch literal 87075 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 JbQ<3b{sv#2U#I{8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/exo_bold_italic.ttf b/app/src/main/res/font/exo_bold_italic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..dea01bfd3abd14df6e03fb2a8b7910eddd287def GIT binary patch literal 92438 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 `w6O+vq|^$HSH^toPn0Gez-cAYqF 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 J=rrC8{su1T76kwR literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/exo_regular_italic.ttf b/app/src/main/res/font/exo_regular_italic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..cfd93e0b1d0a7764fbd72385b1265c3e720ce090 GIT binary patch literal 93176 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 Dg@!C? literal 0 HcmV?d00001 From 122e2f7a8e33617546a762637e891129b9b9f857 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 30 Sep 2019 19:37:57 +0200 Subject: [PATCH 003/254] Updated styles and simplified dimension usage --- .../main/res/color/color_error_transient.xml | 5 + .../res/color/color_primary_transient.xml | 5 + .../main/res/color/color_text_transient.xml | 5 + app/src/main/res/drawable/bg_circle.xml | 14 -- app/src/main/res/drawable/bg_divider_top.xml | 21 --- app/src/main/res/drawable/ic_delete_md2.xml | 10 ++ app/src/main/res/drawable/ic_home.xml | 10 ++ app/src/main/res/drawable/ic_install.xml | 10 ++ app/src/main/res/drawable/ic_update_md2.xml | 10 ++ app/src/main/res/layout/test.xml | 155 +++++++++++------- app/src/main/res/menu/menu_bottom_nav.xml | 8 +- app/src/main/res/values/attrs.xml | 54 +++--- app/src/main/res/values/dimens.xml | 10 +- app/src/main/res/values/styles_md2.xml | 25 +-- .../main/res/values/styles_md2_appearance.xml | 11 +- app/src/main/res/values/styles_md2_impl.xml | 33 +++- 16 files changed, 237 insertions(+), 149 deletions(-) create mode 100644 app/src/main/res/color/color_error_transient.xml create mode 100644 app/src/main/res/color/color_primary_transient.xml create mode 100644 app/src/main/res/color/color_text_transient.xml delete mode 100644 app/src/main/res/drawable/bg_circle.xml delete mode 100644 app/src/main/res/drawable/bg_divider_top.xml create mode 100644 app/src/main/res/drawable/ic_delete_md2.xml create mode 100644 app/src/main/res/drawable/ic_home.xml create mode 100644 app/src/main/res/drawable/ic_install.xml create mode 100644 app/src/main/res/drawable/ic_update_md2.xml diff --git a/app/src/main/res/color/color_error_transient.xml b/app/src/main/res/color/color_error_transient.xml new file mode 100644 index 000000000..22fd9491c --- /dev/null +++ b/app/src/main/res/color/color_error_transient.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/color_primary_transient.xml b/app/src/main/res/color/color_primary_transient.xml new file mode 100644 index 000000000..b792af898 --- /dev/null +++ b/app/src/main/res/color/color_primary_transient.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/color_text_transient.xml b/app/src/main/res/color/color_text_transient.xml new file mode 100644 index 000000000..b394648cb --- /dev/null +++ b/app/src/main/res/color/color_text_transient.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_circle.xml b/app/src/main/res/drawable/bg_circle.xml deleted file mode 100644 index cc79f6fdd..000000000 --- a/app/src/main/res/drawable/bg_circle.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/bg_divider_top.xml b/app/src/main/res/drawable/bg_divider_top.xml deleted file mode 100644 index 09e8d6a54..000000000 --- a/app/src/main/res/drawable/bg_divider_top.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_delete_md2.xml b/app/src/main/res/drawable/ic_delete_md2.xml new file mode 100644 index 000000000..dd7f39908 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_home.xml b/app/src/main/res/drawable/ic_home.xml new file mode 100644 index 000000000..90d81fbea --- /dev/null +++ b/app/src/main/res/drawable/ic_home.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_install.xml b/app/src/main/res/drawable/ic_install.xml new file mode 100644 index 000000000..9e71aa185 --- /dev/null +++ b/app/src/main/res/drawable/ic_install.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_update_md2.xml b/app/src/main/res/drawable/ic_update_md2.xml new file mode 100644 index 000000000..7595bcf4d --- /dev/null +++ b/app/src/main/res/drawable/ic_update_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/test.xml b/app/src/main/res/layout/test.xml index eed215ff0..bd8727526 100644 --- a/app/src/main/res/layout/test.xml +++ b/app/src/main/res/layout/test.xml @@ -10,69 +10,54 @@ style="?styleAppbar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@android:color/transparent"> + android:background="?colorSurfaceVariant"> - + android:layout_height="wrap_content" + android:background="@android:color/transparent" + app:contentInsetStartWithNavigation="0dp" + app:layout_constraintBottom_toBottomOf="parent" + tools:paddingTop="24dp"> - - - + android:paddingBottom="@dimen/l1"> - + android:gravity="center" + tools:text="Home" /> - + - + - - - - - + + android:layout_height="wrap_content" + android:paddingTop="@dimen/l1"> + android:text="@string/install" + app:icon="@drawable/ic_install" + app:iconGravity="textEnd" + app:iconPadding="@dimen/l_50" + app:iconSize="18dp" /> + + @@ -155,7 +160,7 @@ android:id="@+id/title1" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="?l1" + android:layout_marginStart="@dimen/l1" android:text="Manager" android:textAppearance="?appearanceTextTitleNormal" app:layout_constraintEnd_toEndOf="parent" @@ -175,20 +180,28 @@ + android:text="@string/update" + app:icon="@drawable/ic_update_md2" + app:iconGravity="textEnd" + app:iconPadding="@dimen/l_50" + app:iconSize="18dp" /> @@ -197,17 +210,23 @@ + + + android:layout_height="wrap_content"> + android:padding="@dimen/l1"> - + app:contentInsetEnd="0dp" + app:contentInsetStart="0dp" + app:fabCradleMargin="@dimen/l_50"> - + app:layout_anchor="@+id/home_bottom_bar" + app:srcCompat="@drawable/ic_superuser" /> \ No newline at end of file diff --git a/app/src/main/res/menu/menu_bottom_nav.xml b/app/src/main/res/menu/menu_bottom_nav.xml index e7ff50f50..6cf30c32d 100644 --- a/app/src/main/res/menu/menu_bottom_nav.xml +++ b/app/src/main/res/menu/menu_bottom_nav.xml @@ -4,7 +4,7 @@ @@ -14,6 +14,12 @@ android:title="@string/modules" tools:showAsAction="always" /> + + - + - - + + - - + + - - + + - + + + + + + - + - - + + - - + + - - + + - + + + + + + + + + - - - - - - - - - diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 6a96e19d0..b2e012541 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -3,13 +3,15 @@ 2dp 16dp - - 32dp 16dp 8dp - 8dp - + 2dp + 4dp + 8dp + 12dp + 16dp + 32dp \ No newline at end of file diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index 43962abcd..6f6e184f4 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -14,17 +14,12 @@ + \ No newline at end of file diff --git a/app/src/main/res/values/styles_md2_appearance.xml b/app/src/main/res/values/styles_md2_appearance.xml index c9f08a8ca..6cc04d5a1 100644 --- a/app/src/main/res/values/styles_md2_appearance.xml +++ b/app/src/main/res/values/styles_md2_appearance.xml @@ -3,7 +3,6 @@ @@ -22,8 +21,8 @@ @@ -60,7 +58,6 @@ @@ -79,10 +76,12 @@ + + + + + + + + + + \ No newline at end of file From cc8f1adca3b4062b5d2fe2605812e386212c3093 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Wed, 2 Oct 2019 18:15:16 +0200 Subject: [PATCH 004/254] Added more styles regarding homescreen --- app/src/main/res/layout/item_developer.xml | 44 ++ app/src/main/res/layout/test.xml | 520 +++++++++++++------- app/src/main/res/values/attrs.xml | 5 + app/src/main/res/values/styles_md2.xml | 4 + app/src/main/res/values/styles_md2_impl.xml | 16 +- 5 files changed, 404 insertions(+), 185 deletions(-) create mode 100644 app/src/main/res/layout/item_developer.xml diff --git a/app/src/main/res/layout/item_developer.xml b/app/src/main/res/layout/item_developer.xml new file mode 100644 index 000000000..984f444bd --- /dev/null +++ b/app/src/main/res/layout/item_developer.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/test.xml b/app/src/main/res/layout/test.xml index bd8727526..33dc79f4b 100644 --- a/app/src/main/res/layout/test.xml +++ b/app/src/main/res/layout/test.xml @@ -46,208 +46,360 @@ - - + android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:paddingTop="@dimen/l1"> - + app:layout_constraintEnd_toStartOf="@+id/home_manager_wrapper" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> - + + + + + + + + + + + + + + + + + + + android:layout_marginStart="@dimen/l1" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/home_magisk_wrapper" + app:layout_constraintTop_toTopOf="parent"> - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index 6f6e184f4..02f4889dd 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -39,6 +39,10 @@ @style/WidgetFoundation.Icon.Primary @style/WidgetFoundation.Icon.Error + @style/WidgetFoundation.Image.Big + @style/WidgetFoundation.Image + @style/WidgetFoundation.Image.Small + @style/AppearanceFoundation.Display diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index 41c8977ab..75b4abbc3 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -65,9 +65,23 @@ variant. Make sure to use style referenced by attribute defined it attrs.xml. - + + + + + + + - - + + \ No newline at end of file From dc8d2ae68319d297dddc1a0c12966d4274afbf5d Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 3 Oct 2019 19:38:57 +0200 Subject: [PATCH 011/254] Added basic navigation --- .../magisk/model/navigation/Navigation.kt | 15 ++++++++++-- .../topjohnwu/magisk/redesign/MainActivity.kt | 23 ++++++++++++++++++- app/src/main/res/menu/menu_bottom_nav.xml | 6 ++--- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt index f339fff30..83e309203 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt @@ -14,12 +14,23 @@ import com.topjohnwu.magisk.ui.module.ReposFragment import com.topjohnwu.magisk.ui.settings.SettingsFragment import com.topjohnwu.magisk.ui.superuser.SuperuserFragment import com.topjohnwu.magisk.redesign.MainActivity as RedesignActivity +import com.topjohnwu.magisk.redesign.home.HomeFragment as RedesignHomeFragment object Navigation { fun home() = MagiskNavigationEvent { - navDirections { destination = HomeFragment::class } - navOptions { popUpTo = HomeFragment::class } + navDirections { + destination = when { + Config.redesign -> RedesignHomeFragment::class + else -> HomeFragment::class + } + } + navOptions { + popUpTo = when { + Config.redesign -> RedesignHomeFragment::class + else -> HomeFragment::class + } + } } fun superuser() = MagiskNavigationEvent { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index f84ab9cf5..9ccdaca87 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -6,8 +6,13 @@ import androidx.fragment.app.Fragment import com.ncapdevi.fragnav.FragNavController import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ActivityMainMd2Binding +import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.redesign.compat.CompatActivity import com.topjohnwu.magisk.redesign.home.HomeFragment +import com.topjohnwu.magisk.ui.log.LogFragment +import com.topjohnwu.magisk.ui.module.ModulesFragment +import com.topjohnwu.magisk.ui.settings.SettingsFragment +import com.topjohnwu.magisk.ui.superuser.SuperuserFragment import org.koin.androidx.viewmodel.ext.android.viewModel import kotlin.reflect.KClass @@ -19,13 +24,29 @@ open class MainActivity : CompatActivity( override val defaultPosition: Int = 0 override val baseFragments: List> = listOf( - HomeFragment::class + HomeFragment::class, + ModulesFragment::class, + SuperuserFragment::class, + LogFragment::class, + SettingsFragment::class ) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setSupportActionBar(binding.mainToolbar) + + binding.mainNavigation.setOnNavigationItemSelectedListener { + when (it.itemId) { + R.id.homeFragment -> Navigation.home() + R.id.modulesFragment -> Navigation.modules() + R.id.superuserFragment -> Navigation.superuser() + R.id.logFragment -> Navigation.log() + R.id.settingsFragment -> Navigation.settings() + else -> throw NotImplementedError("Id ${it.itemId} is not defined as selectable") + }.also { onEventDispatched(it) } + true + } } override fun onTabTransaction(fragment: Fragment?, index: Int) { diff --git a/app/src/main/res/menu/menu_bottom_nav.xml b/app/src/main/res/menu/menu_bottom_nav.xml index 6cf30c32d..2789218ee 100644 --- a/app/src/main/res/menu/menu_bottom_nav.xml +++ b/app/src/main/res/menu/menu_bottom_nav.xml @@ -3,13 +3,13 @@ xmlns:tools="http://schemas.android.com/tools"> @@ -21,7 +21,7 @@ tools:showAsAction="always" /> From 1396faf4332afb6dd1ff5db78f35fbb2e37e56c6 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 4 Oct 2019 17:12:28 +0200 Subject: [PATCH 012/254] Added animated icon for magisk (and its uninstall) --- .../magisk/redesign/home/HomeViewModel.kt | 6 +- .../magisk/utils/DataBindingAdapters.kt | 25 + .../color/color_primary_delete_transient.xml | 5 + .../res/drawable-v21/avd_delete_magisk.xml | 387 ++++++++++++++++ .../res/drawable-v21/avd_magisk_delete.xml | 428 ++++++++++++++++++ .../res/drawable-v21/ic_magisk_delete.xml | 23 + app/src/main/res/drawable/ic_delete_md2.xml | 12 +- .../main/res/drawable/ic_magisk_delete.xml | 8 + app/src/main/res/layout/fragment_home_md2.xml | 25 +- native/jni/external/mincrypt | 2 +- 10 files changed, 901 insertions(+), 20 deletions(-) create mode 100644 app/src/main/res/color/color_primary_delete_transient.xml create mode 100644 app/src/main/res/drawable-v21/avd_delete_magisk.xml create mode 100644 app/src/main/res/drawable-v21/avd_magisk_delete.xml create mode 100644 app/src/main/res/drawable-v21/ic_magisk_delete.xml create mode 100644 app/src/main/res/drawable/ic_magisk_delete.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index fc6b53c3f..91a532e43 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -2,4 +2,8 @@ package com.topjohnwu.magisk.redesign.home import com.topjohnwu.magisk.redesign.compat.CompatViewModel -class HomeViewModel : CompatViewModel() \ No newline at end of file +class HomeViewModel : CompatViewModel() { + + fun onDeletePressed() {} + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index ad61131f8..7e2e93770 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -6,6 +6,7 @@ import androidx.annotation.ColorInt import androidx.annotation.DrawableRes import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.Toolbar +import androidx.core.view.postDelayed import androidx.databinding.BindingAdapter import androidx.databinding.InverseBindingAdapter import androidx.databinding.InverseBindingListener @@ -220,4 +221,28 @@ fun getScrollPosition(view: RecyclerView) = (view.layoutManager as? LinearLayout @BindingAdapter("isEnabled") fun setEnabled(view: View, isEnabled: Boolean) { view.isEnabled = isEnabled +} + +// md2 + +@BindingAdapter("onSelectClick", "onSelectReset", requireAll = false) +fun View.setOnSelectClickListener(listener: View.OnClickListener, resetTime: Long) { + setOnClickListener { + when { + it.isSelected -> { + listener.onClick(it) + (it.tag as? Runnable)?.let { task -> + it.handler.removeCallbacks(task) + } + it.isSelected = false + } + else -> { + it.isSelected = true + it.tag = it.postDelayed(resetTime) { + it.tag = null + it.isSelected = false + } + } + } + } } \ No newline at end of file diff --git a/app/src/main/res/color/color_primary_delete_transient.xml b/app/src/main/res/color/color_primary_delete_transient.xml new file mode 100644 index 000000000..7be83a094 --- /dev/null +++ b/app/src/main/res/color/color_primary_delete_transient.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/avd_delete_magisk.xml b/app/src/main/res/drawable-v21/avd_delete_magisk.xml new file mode 100644 index 000000000..b01b1ce4a --- /dev/null +++ b/app/src/main/res/drawable-v21/avd_delete_magisk.xml @@ -0,0 +1,387 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v21/avd_magisk_delete.xml b/app/src/main/res/drawable-v21/avd_magisk_delete.xml new file mode 100644 index 000000000..0d0c585d9 --- /dev/null +++ b/app/src/main/res/drawable-v21/avd_magisk_delete.xml @@ -0,0 +1,428 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v21/ic_magisk_delete.xml b/app/src/main/res/drawable-v21/ic_magisk_delete.xml new file mode 100644 index 000000000..3feade979 --- /dev/null +++ b/app/src/main/res/drawable-v21/ic_magisk_delete.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_delete_md2.xml b/app/src/main/res/drawable/ic_delete_md2.xml index dd7f39908..e451bfa33 100644 --- a/app/src/main/res/drawable/ic_delete_md2.xml +++ b/app/src/main/res/drawable/ic_delete_md2.xml @@ -1,10 +1,12 @@ - - - \ No newline at end of file + + + diff --git a/app/src/main/res/drawable/ic_magisk_delete.xml b/app/src/main/res/drawable/ic_magisk_delete.xml new file mode 100644 index 000000000..5932b6150 --- /dev/null +++ b/app/src/main/res/drawable/ic_magisk_delete.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 548fd3fad..dd547cba6 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -39,20 +39,13 @@ - - - + app:srcCompat="@drawable/ic_magisk_delete" + app:tint="@color/color_primary_delete_transient" /> + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_chainStyle="packed" /> @@ -133,9 +129,11 @@ android:layout_marginStart="@dimen/l1" android:text="Manager" android:textAppearance="?appearanceTextTitleNormal" + app:layout_constraintBottom_toTopOf="@+id/status2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/icon2" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_chainStyle="packed" /> diff --git a/native/jni/external/mincrypt b/native/jni/external/mincrypt index ac33afa79..d443357d3 160000 --- a/native/jni/external/mincrypt +++ b/native/jni/external/mincrypt @@ -1 +1 @@ -Subproject commit ac33afa79e57e198b9eeec231140d64816a0bb1e +Subproject commit d443357d300f263179e04ef0893e6b8f040c9451 From cb2a1e57fe4dea993b954194175318739aa82a18 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 4 Oct 2019 17:56:30 +0200 Subject: [PATCH 013/254] Added text switchers for descriptions --- .../magisk/redesign/home/HomeViewModel.kt | 4 ++++ .../magisk/utils/DataBindingAdapters.kt | 20 +++++++++++++++++++ app/src/main/res/anim/switcher_bottom_up.xml | 10 ++++++++++ app/src/main/res/anim/switcher_center_up.xml | 10 ++++++++++ app/src/main/res/layout/fragment_home_md2.xml | 12 +++++------ .../res/layout/swicher_caption_variant.xml | 5 +++++ 6 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/anim/switcher_bottom_up.xml create mode 100644 app/src/main/res/anim/switcher_center_up.xml create mode 100644 app/src/main/res/layout/swicher_caption_variant.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 91a532e43..c17c5be56 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -1,9 +1,13 @@ package com.topjohnwu.magisk.redesign.home +import com.skoumal.teanity.util.KObservableField import com.topjohnwu.magisk.redesign.compat.CompatViewModel class HomeViewModel : CompatViewModel() { + val stateTextMagisk = KObservableField("is up to date") + val stateTextManager = KObservableField("is up to date") + fun onDeletePressed() {} } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index 7e2e93770..b7efa39f6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -1,7 +1,9 @@ package com.topjohnwu.magisk.utils import android.view.View +import android.widget.TextSwitcher import android.widget.TextView +import android.widget.ViewSwitcher import androidx.annotation.ColorInt import androidx.annotation.DrawableRes import androidx.appcompat.widget.AppCompatImageView @@ -245,4 +247,22 @@ fun View.setOnSelectClickListener(listener: View.OnClickListener, resetTime: Lon } } } +} + +@BindingAdapter("textCaptionVariant") +fun TextSwitcher.setTextBinding(text: CharSequence) { + tag as? ViewSwitcher.ViewFactory ?: ViewSwitcher.ViewFactory { + View.inflate(context, R.layout.swicher_caption_variant, null) + }.also { + tag = it + setFactory(it) + setInAnimation(context, R.anim.switcher_bottom_up) + setOutAnimation(context, R.anim.switcher_center_up) + } + + + val currentText = (currentView as? TextView)?.text + if (currentText != text) { + setText(text) + } } \ No newline at end of file diff --git a/app/src/main/res/anim/switcher_bottom_up.xml b/app/src/main/res/anim/switcher_bottom_up.xml new file mode 100644 index 000000000..266ec3aa1 --- /dev/null +++ b/app/src/main/res/anim/switcher_bottom_up.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/switcher_center_up.xml b/app/src/main/res/anim/switcher_center_up.xml new file mode 100644 index 000000000..a19a366e9 --- /dev/null +++ b/app/src/main/res/anim/switcher_center_up.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index dd547cba6..2d8ad9fca 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -41,7 +41,7 @@ style="?styleIconPrimary" onSelectClick="@{() -> viewModel.onDeletePressed()}" onSelectReset="@{10000L}" - android:padding="@dimen/l_50" + android:padding="@dimen/l_25" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_magisk_delete" @@ -60,12 +60,11 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_chainStyle="packed" /> - - + \ No newline at end of file From f4ecc315d07d84f4bbdc3b79fdc4b1a6e3f425f3 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 4 Oct 2019 18:03:06 +0200 Subject: [PATCH 014/254] Replaced temporary id names --- app/src/main/res/layout/fragment_home_md2.xml | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 2d8ad9fca..9e88a8f09 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -37,7 +37,7 @@ app:layout_constraintTop_toTopOf="parent"> + app:layout_constraintBottom_toBottomOf="@+id/home_magisk_icon" + app:layout_constraintEnd_toEndOf="@+id/home_magisk_title" + app:layout_constraintStart_toStartOf="@+id/home_magisk_title" + app:layout_constraintTop_toBottomOf="@+id/home_magisk_title" /> + app:layout_constraintTop_toBottomOf="@+id/home_magisk_status"> + app:layout_constraintBottom_toBottomOf="@+id/home_manager_icon" + app:layout_constraintEnd_toEndOf="@+id/home_manager_title" + app:layout_constraintStart_toStartOf="@+id/home_manager_title" + app:layout_constraintTop_toBottomOf="@+id/home_manager_title" /> + app:layout_constraintTop_toBottomOf="@+id/home_manager_status"> Date: Fri, 4 Oct 2019 18:25:06 +0200 Subject: [PATCH 015/254] Added icons for navigation --- app/src/main/res/drawable/ic_bug_md2.xml | 10 ++++++++++ .../main/res/drawable/{ic_home.xml => ic_home_md2.xml} | 0 app/src/main/res/drawable/ic_module_md2.xml | 10 ++++++++++ app/src/main/res/drawable/ic_settings_md2.xml | 10 ++++++++++ app/src/main/res/drawable/ic_superuser_md2.xml | 9 +++++++++ app/src/main/res/layout/activity_main_md2.xml | 2 +- app/src/main/res/menu/menu_bottom_nav.xml | 8 ++++---- 7 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/drawable/ic_bug_md2.xml rename app/src/main/res/drawable/{ic_home.xml => ic_home_md2.xml} (100%) create mode 100644 app/src/main/res/drawable/ic_module_md2.xml create mode 100644 app/src/main/res/drawable/ic_settings_md2.xml create mode 100644 app/src/main/res/drawable/ic_superuser_md2.xml diff --git a/app/src/main/res/drawable/ic_bug_md2.xml b/app/src/main/res/drawable/ic_bug_md2.xml new file mode 100644 index 000000000..2c9a0a795 --- /dev/null +++ b/app/src/main/res/drawable/ic_bug_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_home.xml b/app/src/main/res/drawable/ic_home_md2.xml similarity index 100% rename from app/src/main/res/drawable/ic_home.xml rename to app/src/main/res/drawable/ic_home_md2.xml diff --git a/app/src/main/res/drawable/ic_module_md2.xml b/app/src/main/res/drawable/ic_module_md2.xml new file mode 100644 index 000000000..fd83b65c4 --- /dev/null +++ b/app/src/main/res/drawable/ic_module_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_settings_md2.xml b/app/src/main/res/drawable/ic_settings_md2.xml new file mode 100644 index 000000000..6c20efa2f --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_superuser_md2.xml b/app/src/main/res/drawable/ic_superuser_md2.xml new file mode 100644 index 000000000..b6be3b2b9 --- /dev/null +++ b/app/src/main/res/drawable/ic_superuser_md2.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_main_md2.xml b/app/src/main/res/layout/activity_main_md2.xml index da1b213bb..06cb7d3bd 100644 --- a/app/src/main/res/layout/activity_main_md2.xml +++ b/app/src/main/res/layout/activity_main_md2.xml @@ -83,7 +83,7 @@ android:layout_height="wrap_content" app:fabSize="normal" app:layout_anchor="@+id/main_bottom_bar" - app:srcCompat="@drawable/ic_superuser" /> + app:srcCompat="@drawable/ic_superuser_md2" /> diff --git a/app/src/main/res/menu/menu_bottom_nav.xml b/app/src/main/res/menu/menu_bottom_nav.xml index 2789218ee..3f956627a 100644 --- a/app/src/main/res/menu/menu_bottom_nav.xml +++ b/app/src/main/res/menu/menu_bottom_nav.xml @@ -4,13 +4,13 @@ @@ -22,13 +22,13 @@ From f161cf8b0a6b771d976c0c2fb5a17773205fbbcb Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 4 Oct 2019 18:56:35 +0200 Subject: [PATCH 016/254] Removed no-root state --- .../main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt index 2c98a4190..951b0948c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt @@ -22,7 +22,7 @@ enum class SafetyNetState { } enum class MagiskState { - NO_ROOT, NOT_INSTALLED, UP_TO_DATE, OBSOLETE, LOADING + NOT_INSTALLED, UP_TO_DATE, OBSOLETE, LOADING } enum class MagiskItem { @@ -49,7 +49,6 @@ class HomeViewModel( } val magiskStateText = Observer(magiskState) { when (magiskState.value) { - MagiskState.NO_ROOT -> TODO() MagiskState.NOT_INSTALLED -> R.string.magisk_version_error.res() MagiskState.UP_TO_DATE -> R.string.magisk_up_to_date.res() MagiskState.LOADING -> R.string.checking_for_updates.res() @@ -71,7 +70,6 @@ class HomeViewModel( } val managerStateText = Observer(managerState) { when (managerState.value) { - MagiskState.NO_ROOT -> "wtf" MagiskState.NOT_INSTALLED -> R.string.invalid_update_channel.res() MagiskState.UP_TO_DATE -> R.string.manager_up_to_date.res() MagiskState.LOADING -> R.string.checking_for_updates.res() @@ -234,7 +232,7 @@ class HomeViewModel( private fun ensureEnv() { val invalidStates = - listOf(MagiskState.NOT_INSTALLED, MagiskState.NO_ROOT, MagiskState.LOADING) + listOf(MagiskState.NOT_INSTALLED, MagiskState.LOADING) // Don't bother checking env when magisk is not installed, loading or already has been shown if (invalidStates.any { it == magiskState.value } || shownDialog) return From 277d8773f22e324550a26885323f05acccc5ce11 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 4 Oct 2019 19:35:22 +0200 Subject: [PATCH 017/254] Added automated loading to new compat-based redesign --- .../magisk/redesign/compat/CompatActivity.kt | 6 ++++++ .../magisk/redesign/compat/CompatDelegate.kt | 4 ++++ .../magisk/redesign/compat/CompatFragment.kt | 6 ++++++ .../magisk/redesign/compat/CompatViewModel.kt | 14 ++++++++++++++ 4 files changed, 30 insertions(+) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt index f56bcb118..8aef13008 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt @@ -18,4 +18,10 @@ abstract class CompatActivity ) { + fun onResume() { + view.viewModel.requestRefresh() + } + fun ensureInsets() { ViewCompat.setOnApplyWindowInsetsListener(view.viewRoot) { _, insets -> insets.asInsets() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt index 196f37ae2..52bd1c65b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt @@ -18,4 +18,10 @@ abstract class CompatFragment Date: Fri, 4 Oct 2019 19:36:26 +0200 Subject: [PATCH 018/254] Added logic to redesigned home (partially) --- .../topjohnwu/magisk/di/ViewModelsModule.kt | 2 +- .../magisk/redesign/home/HomeViewModel.kt | 64 +++++++++++++++++-- .../color/color_primary_delete_transient.xml | 1 + app/src/main/res/layout/fragment_home_md2.xml | 11 ++++ 4 files changed, 73 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt index f2e28cb55..daaef422f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt @@ -30,5 +30,5 @@ val viewModelModules = module { // redesign viewModel { RedesignViewModel() } - viewModel { RedesignHomeViewModel() } + viewModel { RedesignHomeViewModel(get()) } } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index c17c5be56..621158a16 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -1,13 +1,69 @@ package com.topjohnwu.magisk.redesign.home +import com.skoumal.teanity.extensions.subscribeK import com.skoumal.teanity.util.KObservableField +import com.topjohnwu.magisk.BuildConfig +import com.topjohnwu.magisk.Info +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.data.repository.MagiskRepository +import com.topjohnwu.magisk.extensions.res +import com.topjohnwu.magisk.model.entity.MagiskJson +import com.topjohnwu.magisk.model.entity.ManagerJson +import com.topjohnwu.magisk.model.entity.UpdateInfo +import com.topjohnwu.magisk.model.observer.Observer import com.topjohnwu.magisk.redesign.compat.CompatViewModel +import com.topjohnwu.magisk.ui.home.MagiskState -class HomeViewModel : CompatViewModel() { +class HomeViewModel( + private val repoMagisk: MagiskRepository +) : CompatViewModel() { - val stateTextMagisk = KObservableField("is up to date") - val stateTextManager = KObservableField("is up to date") + val stateMagisk = KObservableField(MagiskState.LOADING) + val stateManager = KObservableField(MagiskState.LOADING) + val stateTextMagisk = Observer(stateMagisk) { + when (stateMagisk.value) { + MagiskState.NOT_INSTALLED -> R.string.magisk_version_error.res() + MagiskState.UP_TO_DATE -> R.string.magisk_up_to_date.res() + MagiskState.LOADING -> R.string.checking_for_updates.res() + MagiskState.OBSOLETE -> R.string.magisk_update_title.res() + } + } + val stateTextManager = Observer(stateManager) { + when (stateManager.value) { + MagiskState.NOT_INSTALLED -> R.string.invalid_update_channel.res() + MagiskState.UP_TO_DATE -> R.string.manager_up_to_date.res() + MagiskState.LOADING -> R.string.checking_for_updates.res() + MagiskState.OBSOLETE -> R.string.manager_update_title.res() + } + } + + override fun refresh() = repoMagisk.fetchUpdate() + .subscribeK { updateBy(it) } + + private fun updateBy(info: UpdateInfo) { + stateMagisk.value = when { + !info.magisk.isInstalled -> MagiskState.NOT_INSTALLED + info.magisk.isObsolete -> MagiskState.OBSOLETE + else -> MagiskState.UP_TO_DATE + } + + stateManager.value = when { + !info.app.isUpdateChannelCorrect -> MagiskState.NOT_INSTALLED + info.app.isObsolete -> MagiskState.OBSOLETE + else -> MagiskState.UP_TO_DATE + } + } fun onDeletePressed() {} -} \ No newline at end of file +} + +@Suppress("unused") +val MagiskJson.isInstalled + get() = Info.magiskVersionCode > 0 +val MagiskJson.isObsolete + get() = Info.magiskVersionCode < versionCode +val ManagerJson.isUpdateChannelCorrect + get() = versionCode > 0 +val ManagerJson.isObsolete + get() = BuildConfig.VERSION_CODE < versionCode \ No newline at end of file diff --git a/app/src/main/res/color/color_primary_delete_transient.xml b/app/src/main/res/color/color_primary_delete_transient.xml index 7be83a094..b0bcb827a 100644 --- a/app/src/main/res/color/color_primary_delete_transient.xml +++ b/app/src/main/res/color/color_primary_delete_transient.xml @@ -1,5 +1,6 @@ + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 9e88a8f09..ec056d4b6 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -5,6 +5,8 @@ + + @@ -32,6 +34,7 @@ android:id="@+id/home_magisk_wrapper" android:layout_width="0dp" android:layout_height="wrap_content" + android:animateLayoutChanges="true" app:layout_constraintEnd_toStartOf="@+id/home_manager_wrapper" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -39,6 +42,7 @@ Date: Fri, 4 Oct 2019 19:57:27 +0200 Subject: [PATCH 019/254] Updated arrangement of manager/magisk sections --- app/src/main/res/layout/fragment_home_md2.xml | 61 ++++++++++++------- .../res/layout/swicher_caption_variant.xml | 1 + 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index ec056d4b6..db6eaf9a8 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -35,6 +35,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:animateLayoutChanges="true" + android:paddingStart="@dimen/l1" + android:paddingEnd="@dimen/l1" app:layout_constraintEnd_toStartOf="@+id/home_manager_wrapper" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -44,8 +46,9 @@ style="?styleIconPrimary" isEnabled="@{viewModel.stateMagisk != MagiskState.LOADING}" onSelectClick="@{() -> viewModel.onDeletePressed()}" - onSelectReset="@{10000L}" + onSelectReset="@{7000L}" android:padding="@dimen/l_25" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_magisk_delete" @@ -55,21 +58,19 @@ android:id="@+id/home_magisk_title" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/l1" + android:layout_marginTop="@dimen/l1" + android:gravity="center" android:text="Magisk" android:textAppearance="?appearanceTextTitleNormal" - app:layout_constraintBottom_toTopOf="@+id/home_magisk_status" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@+id/home_magisk_icon" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_chainStyle="packed" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/home_magisk_icon" /> @@ -87,8 +88,9 @@ + + @@ -124,6 +140,7 @@ android:id="@+id/home_manager_icon" style="?styleIconPrimary" android:padding="@dimen/l_50" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_manager" /> @@ -132,38 +149,37 @@ android:id="@+id/home_manager_title" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/l1" + android:layout_marginTop="@dimen/l1" + android:gravity="center" android:text="Manager" android:textAppearance="?appearanceTextTitleNormal" - app:layout_constraintBottom_toTopOf="@+id/home_manager_status" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@+id/home_manager_icon" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_chainStyle="packed" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/home_manager_icon" /> \ No newline at end of file From 149d35c687bff26368ed80628c969d9007377d3f Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 5 Oct 2019 11:13:57 +0200 Subject: [PATCH 020/254] Updated strings --- .../magisk/redesign/home/HomeFragment.kt | 2 +- .../magisk/redesign/home/HomeViewModel.kt | 16 ++++++++-------- app/src/main/res/layout/fragment_home_md2.xml | 6 ++++-- app/src/main/res/menu/menu_bottom_nav.xml | 8 ++++---- app/src/main/res/values/strings_md2.xml | 19 +++++++++++++++++++ native/jni/external/mincrypt | 2 +- 6 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 app/src/main/res/values/strings_md2.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt index 8770bad72..3bf76be98 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt @@ -16,7 +16,7 @@ class HomeFragment : CompatFragment() { override fun onStart() { super.onStart() - activity.title = "Home" + activity.title = resources.getString(R.string.section_home) } } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 621158a16..7f6b0f9e0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -22,18 +22,18 @@ class HomeViewModel( val stateManager = KObservableField(MagiskState.LOADING) val stateTextMagisk = Observer(stateMagisk) { when (stateMagisk.value) { - MagiskState.NOT_INSTALLED -> R.string.magisk_version_error.res() - MagiskState.UP_TO_DATE -> R.string.magisk_up_to_date.res() - MagiskState.LOADING -> R.string.checking_for_updates.res() - MagiskState.OBSOLETE -> R.string.magisk_update_title.res() + MagiskState.NOT_INSTALLED -> R.string.installed_error_md2.res() + MagiskState.UP_TO_DATE -> R.string.up_to_date_md2.res() + MagiskState.LOADING -> R.string.loading_md2.res() + MagiskState.OBSOLETE -> R.string.obsolete_md2.res() } } val stateTextManager = Observer(stateManager) { when (stateManager.value) { - MagiskState.NOT_INSTALLED -> R.string.invalid_update_channel.res() - MagiskState.UP_TO_DATE -> R.string.manager_up_to_date.res() - MagiskState.LOADING -> R.string.checking_for_updates.res() - MagiskState.OBSOLETE -> R.string.manager_update_title.res() + MagiskState.NOT_INSTALLED -> R.string.channel_error_md2.res() + MagiskState.UP_TO_DATE -> R.string.up_to_date_md2.res() + MagiskState.LOADING -> R.string.loading_md2.res() + MagiskState.OBSOLETE -> R.string.obsolete_md2.res() } } diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index db6eaf9a8..7a1cc7cf4 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -60,7 +60,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/l1" android:gravity="center" - android:text="Magisk" + android:text="@string/magisk" android:textAppearance="?appearanceTextTitleNormal" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -151,7 +151,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/l1" android:gravity="center" - android:text="Manager" + android:text="@string/manager" android:textAppearance="?appearanceTextTitleNormal" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -207,6 +207,8 @@ diff --git a/app/src/main/res/menu/menu_bottom_nav.xml b/app/src/main/res/menu/menu_bottom_nav.xml index 3f956627a..d1d5b41ab 100644 --- a/app/src/main/res/menu/menu_bottom_nav.xml +++ b/app/src/main/res/menu/menu_bottom_nav.xml @@ -5,13 +5,13 @@ \ No newline at end of file diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml new file mode 100644 index 000000000..61f4a4cd8 --- /dev/null +++ b/app/src/main/res/values/strings_md2.xml @@ -0,0 +1,19 @@ + + + + Manager + Magisk + + Home + @string/modules + @string/superuser + @string/log + @string/settings + + is not installed + has invalid update channel! + is up to date + can be updated! + is loading… + + \ No newline at end of file diff --git a/native/jni/external/mincrypt b/native/jni/external/mincrypt index d443357d3..ac33afa79 160000 --- a/native/jni/external/mincrypt +++ b/native/jni/external/mincrypt @@ -1 +1 @@ -Subproject commit d443357d300f263179e04ef0893e6b8f040c9451 +Subproject commit ac33afa79e57e198b9eeec231140d64816a0bb1e From 823b121cc70714f75cf8b4abd62987788360b16a Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 5 Oct 2019 12:42:27 +0200 Subject: [PATCH 021/254] Added support section content --- .../magisk/model/entity/recycler/HomeItems.kt | 74 +++++++++++++++++++ .../magisk/redesign/home/HomeViewModel.kt | 25 ++++++- .../main/res/drawable-v21/bg_selectable.xml | 10 +++ app/src/main/res/drawable/bg_selectable.xml | 14 ++++ app/src/main/res/layout/fragment_home_md2.xml | 39 ++++++---- app/src/main/res/layout/item_developer.xml | 21 +++++- app/src/main/res/values/dimens.xml | 2 + app/src/main/res/values/strings_md2.xml | 7 ++ app/src/main/res/values/styles_md2.xml | 1 + app/src/main/res/values/styles_md2_impl.xml | 8 +- 10 files changed, 179 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt create mode 100644 app/src/main/res/drawable-v21/bg_selectable.xml create mode 100644 app/src/main/res/drawable/bg_selectable.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt new file mode 100644 index 000000000..088e95cc8 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt @@ -0,0 +1,74 @@ +package com.topjohnwu.magisk.model.entity.recycler + +import com.skoumal.teanity.databinding.ComparableRvItem +import com.topjohnwu.magisk.Const +import com.topjohnwu.magisk.R + +sealed class HomeItem : ComparableRvItem() { + + abstract val icon: Int + abstract val title: Int + abstract val link: String + + override val layoutRes = R.layout.item_developer + + override fun contentSameAs(other: HomeItem) = itemSameAs(other) + override fun itemSameAs(other: HomeItem) = this == other + + override fun equals(other: Any?): Boolean { + if (other !is HomeItem) return false + return icon == other.icon && title == other.title && link == other.link + } + + // region Children + sealed class PayPal : HomeItem() { + override val icon = R.drawable.ic_paypal + override val title = R.string.home_item_paypal + override val link = "https://paypal.me/%s" + + // region Children + object App : PayPal() { + override val link = super.link.format("diareuse") + } + + object Mainline : PayPal() { + override val link = super.link.format("topjohnwu") + } + // endregion + } + + object Patreon : HomeItem() { + override val icon = R.drawable.ic_patreon + override val title = R.string.home_item_patreon + override val link = Const.Url.PATREON_URL + } + + sealed class Twitter : HomeItem() { + override val icon = R.drawable.ic_twitter + override val title = R.string.home_item_twitter + override val link = "https://twitter.com/%s" + + // region Children + object App : Twitter() { + override val link = super.link.format("diareuse") + } + + object Mainline : Twitter() { + override val link = super.link.format("topjohnwu") + } + // endregion + } + + object Github : HomeItem() { + override val icon = R.drawable.ic_github + override val title = R.string.home_item_source + override val link = Const.Url.SOURCE_CODE_URL + } + + object Xda : HomeItem() { + override val icon = R.drawable.ic_xda + override val title = R.string.home_item_xda + override val link = Const.Url.XDA_THREAD + } + // endregion +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 7f6b0f9e0..6bd373ea9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -1,5 +1,6 @@ package com.topjohnwu.magisk.redesign.home +import com.skoumal.teanity.databinding.ComparableRvItem import com.skoumal.teanity.extensions.subscribeK import com.skoumal.teanity.util.KObservableField import com.topjohnwu.magisk.BuildConfig @@ -10,9 +11,13 @@ import com.topjohnwu.magisk.extensions.res import com.topjohnwu.magisk.model.entity.MagiskJson import com.topjohnwu.magisk.model.entity.ManagerJson import com.topjohnwu.magisk.model.entity.UpdateInfo +import com.topjohnwu.magisk.model.entity.recycler.HomeItem import com.topjohnwu.magisk.model.observer.Observer import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.ui.home.MagiskState +import me.tatarka.bindingcollectionadapter2.BR +import me.tatarka.bindingcollectionadapter2.ItemBinding +import me.tatarka.bindingcollectionadapter2.OnItemBind class HomeViewModel( private val repoMagisk: MagiskRepository @@ -37,6 +42,16 @@ class HomeViewModel( } } + val itemsMainline = + listOf(HomeItem.PayPal.Mainline, HomeItem.Patreon, HomeItem.Twitter.Mainline) + val itemsApp = + listOf(HomeItem.PayPal.App, HomeItem.Twitter.App) + val itemsProject = + listOf(HomeItem.Github, HomeItem.Xda) + val itemBinding = itemBindingOf { + it.bindExtra(BR.viewModel, this) + } + override fun refresh() = repoMagisk.fetchUpdate() .subscribeK { updateBy(it) } @@ -55,6 +70,7 @@ class HomeViewModel( } fun onDeletePressed() {} + fun onLinkPressed(link: String) {} } @@ -66,4 +82,11 @@ val MagiskJson.isObsolete val ManagerJson.isUpdateChannelCorrect get() = versionCode > 0 val ManagerJson.isObsolete - get() = BuildConfig.VERSION_CODE < versionCode \ No newline at end of file + get() = BuildConfig.VERSION_CODE < versionCode + +inline fun > itemBindingOf( + crossinline body: (ItemBinding<*>) -> Unit = {} +) = OnItemBind { itemBinding, _, item -> + item.bind(itemBinding) + body(itemBinding) +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/bg_selectable.xml b/app/src/main/res/drawable-v21/bg_selectable.xml new file mode 100644 index 000000000..3fbf0d437 --- /dev/null +++ b/app/src/main/res/drawable-v21/bg_selectable.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_selectable.xml b/app/src/main/res/drawable/bg_selectable.xml new file mode 100644 index 000000000..c7bb35a7f --- /dev/null +++ b/app/src/main/res/drawable/bg_selectable.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 7a1cc7cf4..141d18422 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -208,8 +208,8 @@ android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginStart="@dimen/l1" - android:layout_marginEnd="@dimen/l1" android:layout_marginTop="@dimen/l2" + android:layout_marginEnd="@dimen/l1" android:layout_marginBottom="@dimen/l2" android:background="?colorSurfaceVariant" /> @@ -229,11 +229,13 @@ @@ -246,16 +248,18 @@ + tools:ignore="HardcodedText" /> + android:layout_marginTop="@dimen/l1"> + android:text="\@diareuse" + tools:ignore="HardcodedText" /> + android:text="@string/home_links_project" /> - + + + + + + + + android:padding="@dimen/l_50"> + app:srcCompat="@{item.icon}" + tools:srcCompat="@drawable/ic_paypal" /> 12dp 16dp 32dp + + 8dp \ No newline at end of file diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index 61f4a4cd8..49174d582 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -16,4 +16,11 @@ can be updated! is loading… + Project links + PayPal + Patreon + Twitter + Source + XDA + \ No newline at end of file diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index 570e9c0e8..8b68efc48 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -22,6 +22,7 @@ + @drawable/bg_selectable 60dp @style/WidgetFoundation.Appbar diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index 433aded1c..4439d6dbf 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -23,17 +23,17 @@ variant. Make sure to use style referenced by attribute defined it attrs.xml. From 1d64ddb7f56438bdd3cd6bf2ec0e389a57288441 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 5 Oct 2019 12:53:40 +0200 Subject: [PATCH 022/254] Fixed dimensions and padding throughout the homescreen --- .../magisk/utils/DataBindingAdapters.kt | 26 +++++++++++++++ app/src/main/res/layout/activity_main_md2.xml | 1 + app/src/main/res/layout/fragment_home_md2.xml | 32 +++++++++++-------- app/src/main/res/layout/item_developer.xml | 1 - app/src/main/res/values/dimens.xml | 3 ++ 5 files changed, 49 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index b7efa39f6..d08a20702 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -1,6 +1,7 @@ package com.topjohnwu.magisk.utils import android.view.View +import android.view.ViewGroup import android.widget.TextSwitcher import android.widget.TextView import android.widget.ViewSwitcher @@ -9,6 +10,7 @@ import androidx.annotation.DrawableRes import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.Toolbar import androidx.core.view.postDelayed +import androidx.core.view.updateLayoutParams import androidx.databinding.BindingAdapter import androidx.databinding.InverseBindingAdapter import androidx.databinding.InverseBindingListener @@ -265,4 +267,28 @@ fun TextSwitcher.setTextBinding(text: CharSequence) { if (currentText != text) { setText(text) } +} + +@BindingAdapter( + "android:layout_marginLeft", + "android:layout_marginTop", + "android:layout_marginRight", + "android:layout_marginBottom", + requireAll = false +) +fun View.setMargins( + marginLeft: Int?, + marginTop: Int?, + marginRight: Int?, + marginBottom: Int? +) = updateLayoutParams { + marginLeft?.let { leftMargin = it } + marginTop?.let { topMargin = it } + marginRight?.let { rightMargin = it } + marginBottom?.let { bottomMargin = it } +} + +@BindingAdapter("nestedScrollingEnabled") +fun RecyclerView.setNestedScrolling(enabled: Boolean) { + isNestedScrollingEnabled = enabled } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_md2.xml b/app/src/main/res/layout/activity_main_md2.xml index 06cb7d3bd..02cd771a3 100644 --- a/app/src/main/res/layout/activity_main_md2.xml +++ b/app/src/main/res/layout/activity_main_md2.xml @@ -81,6 +81,7 @@ diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 141d18422..22a49a23a 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -17,7 +17,10 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" - android:padding="@dimen/l1" + android:paddingStart="@dimen/l1" + android:paddingTop="@dimen/l1" + android:paddingEnd="@dimen/l1" + android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/margin_fab}" tools:layout_marginTop="24dp"> @@ -309,17 +313,18 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" + android:text="\@diareuse" android:textAppearance="?appearanceTextCaptionNormal" android:textStyle="bold" - android:text="\@diareuse" tools:ignore="HardcodedText" /> @@ -377,17 +382,18 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="sans-serif-black" + android:text="@string/home_links_project" android:textAppearance="?appearanceTextCaptionNormal" - android:textStyle="bold" - android:text="@string/home_links_project" /> + android:textStyle="bold" /> 32dp 8dp + + + 80dp \ No newline at end of file From fe1ce08a6cf5873c8bef4b4f4fcc50efaabdb869 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 5 Oct 2019 21:53:33 +0200 Subject: [PATCH 023/254] Added self-handling event types --- .../magisk/model/events/EventExecutors.kt | 23 +++++++++++++++++++ .../magisk/redesign/compat/CompatActivity.kt | 7 ++++++ .../magisk/redesign/compat/CompatDelegate.kt | 21 +++++++++++++++++ .../magisk/redesign/compat/CompatFragment.kt | 7 ++++++ 4 files changed, 58 insertions(+) create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/events/EventExecutors.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/EventExecutors.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/EventExecutors.kt new file mode 100644 index 000000000..8039a38e6 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/EventExecutors.kt @@ -0,0 +1,23 @@ +package com.topjohnwu.magisk.model.events + +import android.content.Context +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment + +interface ContextExecutor { + + operator fun invoke(context: Context) + +} + +interface ActivityExecutor { + + operator fun invoke(activity: AppCompatActivity) + +} + +interface FragmentExecutor { + + operator fun invoke(fragment: Fragment) + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt index 8aef13008..4ba995450 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt @@ -3,6 +3,7 @@ package com.topjohnwu.magisk.redesign.compat import android.os.Bundle import android.view.View import androidx.databinding.ViewDataBinding +import com.skoumal.teanity.viewevents.ViewEvent import com.topjohnwu.magisk.ui.base.MagiskActivity abstract class CompatActivity : @@ -24,4 +25,10 @@ abstract class CompatActivity @@ -12,6 +19,20 @@ class CompatDelegate internal constructor( view.viewModel.requestRefresh() } + fun onEventExecute(event: ViewEvent, activity: AppCompatActivity) { + (event as? ContextExecutor)?.invoke(activity) + (event as? ActivityExecutor)?.invoke(activity) + (event as? FragmentExecutor)?.let { + Timber.e("Cannot run ${FragmentExecutor::class.java.simpleName} in Activity. Consider adding ${ContextExecutor::class.java.simpleName} as fallback.") + } + } + + fun onEventExecute(event: ViewEvent, fragment: Fragment) { + (event as? ContextExecutor)?.invoke(fragment.requireContext()) + (event as? FragmentExecutor)?.invoke(fragment) + (event as? ActivityExecutor)?.invoke(fragment.requireActivity() as AppCompatActivity) + } + fun ensureInsets() { ViewCompat.setOnApplyWindowInsetsListener(view.viewRoot) { _, insets -> insets.asInsets() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt index 52bd1c65b..8089f9cd8 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt @@ -3,6 +3,7 @@ package com.topjohnwu.magisk.redesign.compat import android.os.Bundle import android.view.View import androidx.databinding.ViewDataBinding +import com.skoumal.teanity.viewevents.ViewEvent import com.topjohnwu.magisk.ui.base.MagiskFragment abstract class CompatFragment @@ -24,4 +25,10 @@ abstract class CompatFragment Date: Sat, 5 Oct 2019 22:04:03 +0200 Subject: [PATCH 024/254] Added link opening on homepage --- .../magisk/model/events/OpenInappLinkEvent.kt | 32 +++++++++++++++++++ .../magisk/redesign/home/HomeViewModel.kt | 3 +- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/events/OpenInappLinkEvent.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/OpenInappLinkEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/OpenInappLinkEvent.kt new file mode 100644 index 000000000..522b1c88f --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/OpenInappLinkEvent.kt @@ -0,0 +1,32 @@ +package com.topjohnwu.magisk.model.events + +import android.content.Context +import android.content.res.Resources +import android.util.TypedValue +import androidx.annotation.AttrRes +import androidx.browser.customtabs.CustomTabsIntent +import androidx.core.net.toUri +import com.skoumal.teanity.viewevents.ViewEvent +import com.topjohnwu.magisk.R + +data class OpenInappLinkEvent( + private val link: String +) : ViewEvent(), ContextExecutor { + + // todo find app that can open the link and as a fallback open custom tabs! it shouldn't be the default + override fun invoke(context: Context) = CustomTabsIntent.Builder() + .setShowTitle(true) + .setToolbarColor(context.themedColor(R.attr.colorSurface)) + .enableUrlBarHiding() + .build() + .launchUrl(context, link.toUri()) + + private fun Context.themedColor(@AttrRes attribute: Int) = theme + .resolveAttribute(attribute).data + + private fun Resources.Theme.resolveAttribute( + @AttrRes attribute: Int, + resolveRefs: Boolean = true + ) = TypedValue().also { resolveAttribute(attribute, it, resolveRefs) } + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 6bd373ea9..3a1da8894 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -12,6 +12,7 @@ import com.topjohnwu.magisk.model.entity.MagiskJson import com.topjohnwu.magisk.model.entity.ManagerJson import com.topjohnwu.magisk.model.entity.UpdateInfo import com.topjohnwu.magisk.model.entity.recycler.HomeItem +import com.topjohnwu.magisk.model.events.OpenInappLinkEvent import com.topjohnwu.magisk.model.observer.Observer import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.ui.home.MagiskState @@ -70,7 +71,7 @@ class HomeViewModel( } fun onDeletePressed() {} - fun onLinkPressed(link: String) {} + fun onLinkPressed(link: String) = OpenInappLinkEvent(link).publish() } From 086ce63c6c8cea93ea2fec491dbe7a4694cceed2 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 5 Oct 2019 22:04:34 +0200 Subject: [PATCH 025/254] Updated material library --- app/build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4b1156ed7..f8881e830 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -111,9 +111,8 @@ dependencies { implementation 'androidx.browser:browser:1.0.0' implementation 'androidx.preference:preference:1.1.0' implementation 'androidx.recyclerview:recyclerview:1.1.0-beta04' - implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.work:work-runtime:2.2.0' implementation 'androidx.transition:transition:1.2.0-rc01' implementation 'androidx.multidex:multidex:2.0.1' - implementation 'com.google.android.material:material:1.1.0-alpha10' + implementation 'com.google.android.material:material:1.1.0-beta01' } From 1cc8f13d54f52cab62d5368cf6e909f5dd03052f Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 5 Oct 2019 22:20:57 +0200 Subject: [PATCH 026/254] Added section icons --- app/src/main/res/drawable/ic_app_dev.xml | 10 ++++++++ app/src/main/res/drawable/ic_mainline_dev.xml | 10 ++++++++ app/src/main/res/drawable/ic_project.xml | 10 ++++++++ app/src/main/res/layout/activity_main_md2.xml | 3 ++- app/src/main/res/layout/fragment_home_md2.xml | 23 ++++++++----------- 5 files changed, 42 insertions(+), 14 deletions(-) create mode 100644 app/src/main/res/drawable/ic_app_dev.xml create mode 100644 app/src/main/res/drawable/ic_mainline_dev.xml create mode 100644 app/src/main/res/drawable/ic_project.xml diff --git a/app/src/main/res/drawable/ic_app_dev.xml b/app/src/main/res/drawable/ic_app_dev.xml new file mode 100644 index 000000000..b6491a3a5 --- /dev/null +++ b/app/src/main/res/drawable/ic_app_dev.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_mainline_dev.xml b/app/src/main/res/drawable/ic_mainline_dev.xml new file mode 100644 index 000000000..a2155e412 --- /dev/null +++ b/app/src/main/res/drawable/ic_mainline_dev.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_project.xml b/app/src/main/res/drawable/ic_project.xml new file mode 100644 index 000000000..9a78d7390 --- /dev/null +++ b/app/src/main/res/drawable/ic_project.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_md2.xml b/app/src/main/res/layout/activity_main_md2.xml index 02cd771a3..06bff9461 100644 --- a/app/src/main/res/layout/activity_main_md2.xml +++ b/app/src/main/res/layout/activity_main_md2.xml @@ -31,8 +31,9 @@ android:id="@+id/main_toolbar" style="?styleToolbar" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="?actionBarSize" app:layout_constraintBottom_toBottomOf="parent" + app:layout_scrollFlags="noScroll" tools:title="Home" /> + app:srcCompat="@drawable/ic_mainline_dev" /> + app:srcCompat="@drawable/ic_app_dev" /> @@ -353,12 +351,11 @@ + app:srcCompat="@drawable/ic_project" /> Date: Sat, 5 Oct 2019 22:51:21 +0200 Subject: [PATCH 027/254] Fixed widget order Content mustn't overlay appbar --- app/src/main/res/layout/activity_main_md2.xml | 13 +++++-------- app/src/main/res/layout/fragment_home_md2.xml | 2 +- app/src/main/res/values-night/styles_md2.xml | 4 ++-- app/src/main/res/values/dimens.xml | 2 ++ app/src/main/res/values/styles_md2.xml | 6 +++--- app/src/main/res/values/styles_md2_impl.xml | 3 ++- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/src/main/res/layout/activity_main_md2.xml b/app/src/main/res/layout/activity_main_md2.xml index 06bff9461..1fe7d72de 100644 --- a/app/src/main/res/layout/activity_main_md2.xml +++ b/app/src/main/res/layout/activity_main_md2.xml @@ -19,11 +19,15 @@ android:paddingRight="@{viewModel.insets.right}" tools:ignore="RtlHardcoded"> + + @@ -31,7 +35,6 @@ android:id="@+id/main_toolbar" style="?styleToolbar" android:layout_width="match_parent" - android:layout_height="?actionBarSize" app:layout_constraintBottom_toBottomOf="parent" app:layout_scrollFlags="noScroll" tools:title="Home" /> @@ -44,12 +47,6 @@ - - diff --git a/app/src/main/res/values-night/styles_md2.xml b/app/src/main/res/values-night/styles_md2.xml index 45fb2240c..8ea45210e 100644 --- a/app/src/main/res/values-night/styles_md2.xml +++ b/app/src/main/res/values-night/styles_md2.xml @@ -7,9 +7,9 @@ #00C853 #8000C853 #0D0D0D - #0DFFFFFF + #D9191919 #F2F2F2 - #80F2F2F2 + #D9E6E6E6 #F2F2F2 ?colorOnSurface #CC0047 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 924237a01..1f6e3b328 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -19,4 +19,6 @@ 80dp + + 56dp \ No newline at end of file diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index 8b68efc48..a260074f6 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -23,7 +23,7 @@ @drawable/bg_selectable - 60dp + @dimen/internal_action_bar_size @style/WidgetFoundation.Appbar @@ -84,9 +84,9 @@ #00C853 #8000C853 #F2F2F2 - #0D000000 + #D9E6E6E6 #F2F2F2 - #80F2F2F2 + #D9E6E6E6 #F2F2F2 #F2F2F2 #CC0047 diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index 4439d6dbf..22f6373ff 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -9,7 +9,7 @@ variant. Make sure to use style referenced by attribute defined it attrs.xml. From 6da566faff4c9c666e461457b34ea0f270f89a69 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 5 Oct 2019 22:59:28 +0200 Subject: [PATCH 028/254] Fixed overlay color for home item --- app/src/main/res/layout/item_developer.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/item_developer.xml b/app/src/main/res/layout/item_developer.xml index 30e2c5f01..8f0231e58 100644 --- a/app/src/main/res/layout/item_developer.xml +++ b/app/src/main/res/layout/item_developer.xml @@ -26,6 +26,7 @@ Date: Sat, 5 Oct 2019 23:13:17 +0200 Subject: [PATCH 029/254] Fixed fonts --- app/src/main/res/font/exo_regular.ttf | Bin 87435 -> 87735 bytes app/src/main/res/font/exo_regular_italic.ttf | Bin 93176 -> 93350 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/src/main/res/font/exo_regular.ttf b/app/src/main/res/font/exo_regular.ttf index 891916ed9b0979ac75164c292e55120d6da67bda..dea6342c57a0e972ef6fa2692379dea13b604ab3 100755 GIT binary patch literal 87735 zcmcHi2Vh*q@du8--6!3tShk8!C)rlHJLyj4bSK^E?$moPR(0>)2HTk8Lba);_ht;C z1qd~vgb;cNNq_`G_=cFTLxKYa1EwSn5Q_Em`^@fpPj|LS^8NpRKZA6-x!u{B*_qkd z*?D^kQxs*gvO`gorJZf<9aYy>cPT98LO^fp92^+Ae(EVr3Y%P{D3OyoM`pEL+xDZw z3TwYvQPOe;M*M+gMYlh$DF2&^_Dff6Shi{D`N!4b{U$}R?pw3$WV|Y=z_$ah32WA$ zy85!Whu_8DpD4<6mbI&vtsK8#cZ;ID)CX92EdW-x^-V>23!f_mYd4&-&GE_!f5zwM z0nOU=C#+ajPtqC7tp=)xP8ZQB%AqC5j!U!Z;d#$_8;&HUA=HHz}LK}At7-E_jq zryMAFwOCR1zpW@mcY??2@i9J&XX7uclA$Op&5;)GNOO3so`@%6kJzntE1xyCpZ#5{ zWxsm&oWgU@Ej;Jkf^*I(;MrsQ`3$dC`>X*u_nbmS;ffQ#cJO_`mjryl4421Ybum?C zxvLKk_h@f*4YP-~pUwA;<-hR;o5pr%JCyNp*-O0@uW_JURo~}}l?nJACj6slcwCAO zx5lLbejDK#_wgO7(cYzs_P}?DFPy*^)i2%XM^wipn)ouJ;p$f=d}<8*2PRzy0H2`u zeY3sIXfNn8+PhTI{z$siiGGdfsdK+tQh!&96#e5qv+ag()%vj3wntz z%$6bd7&%4F$9|)|pywxM`%n4KDExPt@Xuq~pJ2j2G2r9v(c{KVW)DT-dBbe~F|~(I z2(60ihhnZNS zaFyHTa=Y{M-OMM|@bKzB=;7h=nyLUl{VYqcyr%r8j*{a1ypj^f;ej{a;QO>1QcqJm zuQjPU$d`cv==%6!^>m*zGol(_*v5<3G^luvslGHBIHdUiGuH z2iPk2n!yz}mTCt)4i?s4Dfcrz?dHYTzZ_T9vfvMVUT0GRZ_Ic7GQK|kL4Q#rOJdn< zSbIp$7e*BGk|XUz&7)VPALRH!Ns3}qaup@R5r9;5**F-<#pSYPNcp(Z`dQMmwPk_9 zwX3yH*p!O8lb(E`sjavA1-|c@mf0!Ea|bppWH)u!Z_~5~n}+K;v`-)dF@mrxF{1h& z4`5`b)Q*44?fe5}hN5J;X;Q#`rrqXtyPOu96wFG*X0f>5*%+=mX^C&E&$Th!JL)MM z?%&?yJGshId≪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
  • jnU%M{dXr472tXmI+;5+Ok-E51!HpLUx{ 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 YN=(pRW*Pi3`;l)DVw3yPX?!#I3qS8~{{R30 diff --git a/app/src/main/res/font/exo_regular_italic.ttf b/app/src/main/res/font/exo_regular_italic.ttf old mode 100755 new mode 100644 index d6ea317f8b8b7d022f9473c99a72cae01f182616..e99de0b47cc688e33f02dc7836514d3ba1a6a0c5 GIT binary patch literal 111126 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
    =&c3{kC+Oem3U7uH7 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 Date: Mon, 7 Oct 2019 20:09:12 +0200 Subject: [PATCH 036/254] Added versions to home screen To overview (when updatable) - It is very hard to spot a difference in versions so versions are now regarded as commit messages (after dash [-]) when applicable - This will result in more clear, understandable text - Bleeding edge (canary) user would see: ffed229 > ffe02ed or 19.4 > ffe02ed as opposed to: 19.4-ffed229 (19404) 19.5-ffe02ed (19501) - Regular beta+ user would see: 19.4 > 19.5 To bottom of the screen - This change is with respect to regular user. They don't care which version they run as long as they know that "up-to-date" is a gold standard - It takes tons of real-estate on the screen which takes away the glance-ability from the overview. --- .../main/java/com/topjohnwu/magisk/Info.kt | 2 + .../magisk/redesign/home/HomeViewModel.kt | 22 ++++++++ app/src/main/res/layout/fragment_home_md2.xml | 55 +++++++++++++++---- 3 files changed, 68 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/Info.kt b/app/src/main/java/com/topjohnwu/magisk/Info.kt index f226ae5cf..7ff76faff 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Info.kt +++ b/app/src/main/java/com/topjohnwu/magisk/Info.kt @@ -6,8 +6,10 @@ import com.topjohnwu.superuser.ShellUtils object Info { + @JvmStatic var magiskVersionCode = -1 + @JvmStatic var magiskVersionString = "" var remote = UpdateInfo() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 2eb5b60cb..3c61fbf9f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -44,6 +44,10 @@ class HomeViewModel( MagiskState.OBSOLETE -> R.string.obsolete_md2.res() } } + val stateVersionMagisk = Info.magiskVersionString + val stateVersionManager = BuildConfig.VERSION_NAME + val stateVersionUpdateMagisk = KObservableField("") + val stateVersionUpdateManager = KObservableField("") val stateHideManagerName = R.string.manager.res().let { val result = R.string.manager.res() @@ -80,6 +84,22 @@ class HomeViewModel( info.app.isObsolete -> MagiskState.OBSOLETE else -> MagiskState.UP_TO_DATE } + + stateVersionUpdateMagisk.value = when { + info.magisk.isObsolete -> "%s > %s".format( + Info.magiskVersionString.clipVersion(), + info.magisk.version.clipVersion() + ) + else -> "" + } + + stateVersionUpdateManager.value = when { + info.app.isObsolete -> "%s > %s".format( + BuildConfig.VERSION_NAME.clipVersion(), + info.app.version.clipVersion() + ) + else -> "" + } } fun onDeletePressed() {} @@ -97,6 +117,8 @@ val ManagerJson.isUpdateChannelCorrect val ManagerJson.isObsolete get() = BuildConfig.VERSION_CODE < versionCode +fun String.clipVersion() = substringAfter('-') + inline fun > itemBindingOf( crossinline body: (ItemBinding<*>) -> Unit = {} ) = OnItemBind { itemBinding, _, item -> diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 136edee2b..df173d3fd 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -5,6 +5,10 @@ + + + + + + + app:layout_constraintTop_toBottomOf="@+id/home_magisk_version"> + + + app:layout_constraintTop_toBottomOf="@+id/home_manager_version"> - - + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/l1"> + + + + From a9b20dae33dcd693023aad5c3bfbbd334c239e02 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Tue, 8 Oct 2019 18:29:58 +0200 Subject: [PATCH 037/254] Fixed showing update information --- .../java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 3c61fbf9f..7056fbeae 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -111,7 +111,7 @@ class HomeViewModel( val MagiskJson.isInstalled get() = Info.magiskVersionCode > 0 val MagiskJson.isObsolete - get() = Info.magiskVersionCode < versionCode + get() = Info.magiskVersionCode < versionCode && isInstalled val ManagerJson.isUpdateChannelCorrect get() = versionCode > 0 val ManagerJson.isObsolete From 0e33632e79f8a9d0e1f811933b551cc8c8eb4e24 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Tue, 8 Oct 2019 18:30:23 +0200 Subject: [PATCH 038/254] Added package name when it differs from the default one --- .../com/topjohnwu/magisk/redesign/home/HomeViewModel.kt | 6 +++--- app/src/main/res/layout/fragment_home_md2.xml | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 7056fbeae..2a6dd94f0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -44,14 +44,14 @@ class HomeViewModel( MagiskState.OBSOLETE -> R.string.obsolete_md2.res() } } - val stateVersionMagisk = Info.magiskVersionString - val stateVersionManager = BuildConfig.VERSION_NAME + val statePackageManager = packageName + val statePackageOriginal = statePackageManager == BuildConfig.APPLICATION_ID val stateVersionUpdateMagisk = KObservableField("") val stateVersionUpdateManager = KObservableField("") val stateHideManagerName = R.string.manager.res().let { val result = R.string.manager.res() - if (packageName != BuildConfig.APPLICATION_ID) { + if (!statePackageOriginal) { result.replaceRandomWithSpecial(3) } else { result diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index df173d3fd..f3151efab 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -436,6 +436,15 @@ android:textAppearance="?appearanceTextCaptionVariant" tools:text="19.5 (12345)" /> + + From 4a68fd65b65639da5425bb930305564c88198d04 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Tue, 8 Oct 2019 18:51:31 +0200 Subject: [PATCH 039/254] Updated UI so magisk cannot be updated unless latest manager is installed --- app/src/main/res/layout/fragment_home_md2.xml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index f3151efab..39825bea0 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -21,16 +21,17 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" - android:paddingStart="@dimen/l1" android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l1}" - android:paddingEnd="@dimen/l1" android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/margin_fab + (int) @dimen/l1}" tools:layout_marginTop="24dp"> + android:clipToPadding="false" + android:orientation="vertical" + android:paddingStart="@dimen/l1" + android:paddingEnd="@dimen/l1"> Date: Tue, 8 Oct 2019 20:29:11 +0200 Subject: [PATCH 040/254] Added custom install dialogs --- .../magisk/model/events/dialog/DialogEvent.kt | 16 +++ .../events/dialog/MagiskInstallDialog.kt | 81 ++++++++++++ .../events/dialog/ManagerInstallDialog.kt | 36 ++++++ .../magisk/redesign/home/HomeViewModel.kt | 14 ++- .../com/topjohnwu/magisk/view/MagiskDialog.kt | 10 +- .../main/res/layout/dialog_magisk_base.xml | 115 ++++++++++++++---- app/src/main/res/layout/fragment_home_md2.xml | 4 + 7 files changed, 249 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DialogEvent.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ManagerInstallDialog.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DialogEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DialogEvent.kt new file mode 100644 index 000000000..dc41fe709 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DialogEvent.kt @@ -0,0 +1,16 @@ +package com.topjohnwu.magisk.model.events.dialog + +import android.content.Context +import com.skoumal.teanity.viewevents.ViewEvent +import com.topjohnwu.magisk.model.events.ContextExecutor +import com.topjohnwu.magisk.view.MagiskDialog + +abstract class DialogEvent : ViewEvent(), ContextExecutor { + + override fun invoke(context: Context) { + MagiskDialog(context).apply(this::build).reveal() + } + + abstract fun build(dialog: MagiskDialog) + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt new file mode 100644 index 000000000..d25f7415d --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt @@ -0,0 +1,81 @@ +package com.topjohnwu.magisk.model.events.dialog + +import com.topjohnwu.magisk.Info +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.extensions.res +import com.topjohnwu.magisk.model.events.OpenInappLinkEvent +import com.topjohnwu.magisk.view.MagiskDialog +import com.topjohnwu.magisk.view.MarkDownWindow +import com.topjohnwu.superuser.Shell +import com.topjohnwu.superuser.ShellUtils + +class MagiskInstallDialog : DialogEvent() { + + override fun build(dialog: MagiskDialog) { + with(dialog) { + + val filename = + "Magisk v${Info.remote.magisk.version}(${Info.remote.magisk.versionCode})" + applyTitle(R.string.repo_install_title.res(R.string.magisk.res())) + applyMessage(R.string.repo_install_msg.res(filename)) + setCancelable(true) + applyButton(MagiskDialog.ButtonType.POSITIVE) { + titleRes = R.string.install + preventDismiss = true + onClick { + updateForInstallMethod(dialog) + } + } + if (Info.remote.magisk.note.isEmpty()) return + applyButton(MagiskDialog.ButtonType.NEGATIVE) { + titleRes = R.string.release_notes + onClick { + if (Info.remote.magisk.note.contains("forum.xda-developers")) { + OpenInappLinkEvent(Info.remote.magisk.note).invoke(context) + } else { + MarkDownWindow.show(context, null, Info.remote.magisk.note) + } + } + } + } + } + + private fun updateForInstallMethod(dialog: MagiskDialog) { + with(dialog) { + applyTitle(R.string.select_method) + applyMessage("") + applyButton(MagiskDialog.ButtonType.POSITIVE) { + titleRes = R.string.download_zip_only + preventDismiss = false + onClick { + TODO() + } + } + applyButton(MagiskDialog.ButtonType.NEUTRAL) { + titleRes = R.string.select_patch_file + onClick { + TODO() + } + } + if (!Shell.rootAccess()) return + applyButton(MagiskDialog.ButtonType.NEGATIVE) { + titleRes = R.string.direct_install + onClick { + TODO() + } + } + if (!isABDevice()) return + applyButton(MagiskDialog.ButtonType.IDGAF) { + titleRes = R.string.install_inactive_slot + onClick { + TODO() + } + } + } + } + + private fun isABDevice() = ShellUtils + .fastCmd("grep_prop ro.build.ab_update") + .let { it.isNotEmpty() && it.toBoolean() } + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ManagerInstallDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ManagerInstallDialog.kt new file mode 100644 index 000000000..1eb563602 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ManagerInstallDialog.kt @@ -0,0 +1,36 @@ +package com.topjohnwu.magisk.model.events.dialog + +import com.topjohnwu.magisk.Info +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.extensions.res +import com.topjohnwu.magisk.model.download.DownloadService +import com.topjohnwu.magisk.model.entity.internal.Configuration +import com.topjohnwu.magisk.model.entity.internal.DownloadSubject +import com.topjohnwu.magisk.view.MagiskDialog +import com.topjohnwu.magisk.view.MarkDownWindow + +class ManagerInstallDialog : DialogEvent() { + + override fun build(dialog: MagiskDialog) { + with(dialog) { + val subject = DownloadSubject.Manager(Configuration.APK.Upgrade) + + applyTitle(R.string.repo_install_title.res(R.string.app_name.res())) + applyMessage(R.string.repo_install_msg.res(subject.title)) + + setCancelable(true) + + applyButton(MagiskDialog.ButtonType.POSITIVE) { + titleRes = R.string.install + onClick { DownloadService(context) { this.subject = subject } } + } + + if (Info.remote.app.note.isEmpty()) return + applyButton(MagiskDialog.ButtonType.NEGATIVE) { + titleRes = R.string.app_changelog + onClick { MarkDownWindow.show(context, null, Info.remote.app.note) } + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 2a6dd94f0..79862dc58 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -15,6 +15,8 @@ import com.topjohnwu.magisk.model.entity.ManagerJson import com.topjohnwu.magisk.model.entity.UpdateInfo import com.topjohnwu.magisk.model.entity.recycler.HomeItem import com.topjohnwu.magisk.model.events.OpenInappLinkEvent +import com.topjohnwu.magisk.model.events.dialog.MagiskInstallDialog +import com.topjohnwu.magisk.model.events.dialog.ManagerInstallDialog import com.topjohnwu.magisk.model.observer.Observer import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.ui.home.MagiskState @@ -50,11 +52,10 @@ class HomeViewModel( val stateVersionUpdateManager = KObservableField("") val stateHideManagerName = R.string.manager.res().let { - val result = R.string.manager.res() if (!statePackageOriginal) { - result.replaceRandomWithSpecial(3) + it.replaceRandomWithSpecial(3) } else { - result + it } } @@ -102,9 +103,14 @@ class HomeViewModel( } } - fun onDeletePressed() {} fun onLinkPressed(link: String) = OpenInappLinkEvent(link).publish() + fun onDeletePressed() {} + + fun onManagerPressed() = ManagerInstallDialog().publish() + + fun onMagiskPressed() = MagiskInstallDialog().publish() + } @Suppress("unused") diff --git a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt index a9ad818ab..fdcc01a1c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt @@ -58,10 +58,13 @@ class MagiskDialog @JvmOverloads constructor( val isEnabled = KObservableField(true) var onClickAction: OnDialogButtonClickListener = {} + var preventDismiss = false fun clicked() { onClickAction(this@MagiskDialog) - dismiss() + if (!preventDismiss) { + dismiss() + } } } @@ -86,6 +89,11 @@ class MagiskDialog @JvmOverloads constructor( set(value) { button.isEnabled.value = value } + var preventDismiss: Boolean + get() = button.preventDismiss + set(value) { + button.preventDismiss = value + } fun onClick(listener: OnDialogButtonClickListener) { button.onClickAction = listener diff --git a/app/src/main/res/layout/dialog_magisk_base.xml b/app/src/main/res/layout/dialog_magisk_base.xml index 134113f17..f18c144b6 100644 --- a/app/src/main/res/layout/dialog_magisk_base.xml +++ b/app/src/main/res/layout/dialog_magisk_base.xml @@ -19,6 +19,7 @@ style="@style/Widget.Card" android:layout_width="0dp" android:layout_height="wrap_content" + app:cardUseCompatPadding="true" app:cardElevation="@dimen/margin_generic" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" @@ -26,7 +27,7 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintWidth_default="percent" app:layout_constraintWidth_max="400dp" - app:layout_constraintWidth_percent=".9"> + app:layout_constraintWidth_percent="1"> @@ -75,12 +76,12 @@ @@ -124,7 +125,7 @@ @@ -132,13 +133,30 @@ + gone="@{data.buttonPositive.icon == 0 && data.buttonPositive.title.length == + 0}" - + + + gone="@{data.buttonNeutral.icon == 0 && data.buttonNeutral.title.length == + 0}" - + + + gone="@{data.buttonNegative.icon == 0 && data.buttonNegative.title.length == + 0}" - + + + gone="@{data.buttonIDGAF.icon == 0 && data.buttonIDGAF.title.length == 0}" - + + diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 39825bea0..4e360995b 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -109,6 +109,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" + android:onClick="@{() -> viewModel.onMagiskPressed()}" android:text="@string/update" app:icon="@drawable/ic_update_md2" app:iconGravity="textEnd" @@ -123,6 +124,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" + android:onClick="@{() -> viewModel.onMagiskPressed()}" android:text="@string/install" app:icon="@drawable/ic_install" app:iconGravity="textEnd" @@ -208,6 +210,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" + android:onClick="@{() -> viewModel.onManagerPressed()}" android:text="@string/update" app:icon="@drawable/ic_update_md2" app:iconGravity="textEnd" @@ -220,6 +223,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" + android:onClick="@{() -> viewModel.onManagerPressed()}" android:text="@string/install" app:icon="@drawable/ic_install" app:iconGravity="textEnd" From af1f5d5ab209a170deae5ae7153ed5ab6eee7301 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 10 Oct 2019 16:51:20 +0200 Subject: [PATCH 041/254] Fixed showing magisk version when not installed --- app/src/main/res/layout/fragment_home_md2.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 4e360995b..69e4a0276 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -439,6 +439,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" + gone="@{Info.magiskVersionCode < 0}" android:text="@{String.format(`%s (%s)`, Info.magiskVersionString, Info.magiskVersionCode)}" android:textAppearance="?appearanceTextCaptionVariant" tools:text="19.5 (12345)" /> From ee06aed94b4f6c6fe24b6e6a4386101723be1fd7 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 10 Oct 2019 17:34:06 +0200 Subject: [PATCH 042/254] Updated toolbar and bottom bar design implementation TBD: Both toolbars should move away from the screen when scrolling --- .../topjohnwu/magisk/redesign/MainActivity.kt | 17 +++++++++ app/src/main/res/layout/activity_main_md2.xml | 37 +++++++------------ app/src/main/res/layout/fragment_home_md2.xml | 2 +- app/src/main/res/menu/menu_bottom_nav.xml | 6 +-- app/src/main/res/values/attrs.xml | 1 + app/src/main/res/values/styles_md2.xml | 1 + app/src/main/res/values/styles_md2_impl.xml | 8 ++++ 7 files changed, 45 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index d92bd0134..b87ffaf31 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -2,6 +2,8 @@ package com.topjohnwu.magisk.redesign import android.graphics.Insets import android.os.Bundle +import android.view.ViewTreeObserver +import androidx.core.view.setPadding import androidx.fragment.app.Fragment import com.ncapdevi.fragnav.FragNavController import com.topjohnwu.magisk.Const @@ -32,6 +34,14 @@ open class MainActivity : CompatActivity( SettingsFragment::class ) + //This temporarily fixes unwanted feature of BottomNavigationView - where the view applies + //padding on itself given insets are not consumed beforehand. Unfortunately the listener + //implementation doesn't favor us against the design library, so on re-create it's often given + //upper hand. + private val navObserver = ViewTreeObserver.OnGlobalLayoutListener { + binding.mainNavigation.setPadding(0) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -49,11 +59,18 @@ open class MainActivity : CompatActivity( true } + binding.mainNavigation.viewTreeObserver.addOnGlobalLayoutListener(navObserver) + if (intent.getBooleanExtra(Const.Key.OPEN_SETTINGS, false)) { binding.mainNavigation.selectedItemId = R.id.settingsFragment } } + override fun onDestroy() { + binding.mainNavigation.viewTreeObserver.removeOnGlobalLayoutListener(navObserver) + super.onDestroy() + } + override fun onTabTransaction(fragment: Fragment?, index: Int) { super.onTabTransaction(fragment, index) diff --git a/app/src/main/res/layout/activity_main_md2.xml b/app/src/main/res/layout/activity_main_md2.xml index c31880f10..9f43a6089 100644 --- a/app/src/main/res/layout/activity_main_md2.xml +++ b/app/src/main/res/layout/activity_main_md2.xml @@ -24,12 +24,14 @@ android:layout_width="match_parent" android:layout_height="match_parent" /> - + android:layout_marginStart="@dimen/l1" + android:layout_marginTop="@{(int) @dimen/l1 + viewModel.insets.top}" + android:layout_marginEnd="@dimen/l1" + tools:layout_marginTop="40dp"> - + - + android:layout_marginStart="@dimen/l1" + android:layout_marginEnd="@dimen/l1" + android:layout_marginBottom="@{(int) @dimen/l1 + viewModel.insets.bottom}" + tools:layout_marginBottom="64dp"> - - - + diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 69e4a0276..014ffcbd5 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -21,7 +21,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" - android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l1}" + android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l2}" android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/margin_fab + (int) @dimen/l1}" tools:layout_marginTop="24dp"> diff --git a/app/src/main/res/menu/menu_bottom_nav.xml b/app/src/main/res/menu/menu_bottom_nav.xml index d1d5b41ab..31c468243 100644 --- a/app/src/main/res/menu/menu_bottom_nav.xml +++ b/app/src/main/res/menu/menu_bottom_nav.xml @@ -15,9 +15,9 @@ tools:showAsAction="always" /> + diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index f500498f3..f0e095ff0 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -30,6 +30,7 @@ @style/WidgetFoundation.Toolbar @style/WidgetFoundation.Card + @style/WidgetFoundation.Card.Elevated @style/WidgetFoundation.Card.OnPrimary @style/WidgetFoundation.Button diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index 524680d44..2de494ff7 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -27,6 +27,13 @@ variant. Make sure to use style referenced by attribute defined it attrs.xml. ?colorSurfaceVariant @dimen/l_50 0dp + true + + + + From 659914afbe0491680105237435546565d2c05da3 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 10 Oct 2019 19:08:15 +0200 Subject: [PATCH 043/254] Updated navigation icons --- .../main/res/drawable/ic_bug_filled_md2.xml | 10 ++++++++++ app/src/main/res/drawable/ic_bug_md2.xml | 14 +++++-------- .../main/res/drawable/ic_bug_outlined_md2.xml | 10 ++++++++++ .../main/res/drawable/ic_home_filled_md2.xml | 9 +++++++++ app/src/main/res/drawable/ic_home_md2.xml | 14 +++++-------- .../res/drawable/ic_home_outlined_md2.xml | 10 ++++++++++ .../res/drawable/ic_module_filled_md2.xml | 10 ++++++++++ app/src/main/res/drawable/ic_module_md2.xml | 14 +++++-------- .../res/drawable/ic_module_outlined_md2.xml | 10 ++++++++++ .../res/drawable/ic_settings_filled_md2.xml | 10 ++++++++++ app/src/main/res/drawable/ic_settings_md2.xml | 14 +++++-------- .../res/drawable/ic_settings_outlined_md2.xml | 10 ++++++++++ .../res/drawable/ic_superuser_filled_md2.xml | 20 +++++++++++++++++++ .../main/res/drawable/ic_superuser_md2.xml | 15 ++++++-------- .../drawable/ic_superuser_outlined_md2.xml | 20 +++++++++++++++++++ 15 files changed, 145 insertions(+), 45 deletions(-) create mode 100644 app/src/main/res/drawable/ic_bug_filled_md2.xml create mode 100644 app/src/main/res/drawable/ic_bug_outlined_md2.xml create mode 100644 app/src/main/res/drawable/ic_home_filled_md2.xml create mode 100644 app/src/main/res/drawable/ic_home_outlined_md2.xml create mode 100644 app/src/main/res/drawable/ic_module_filled_md2.xml create mode 100644 app/src/main/res/drawable/ic_module_outlined_md2.xml create mode 100644 app/src/main/res/drawable/ic_settings_filled_md2.xml create mode 100644 app/src/main/res/drawable/ic_settings_outlined_md2.xml create mode 100644 app/src/main/res/drawable/ic_superuser_filled_md2.xml create mode 100644 app/src/main/res/drawable/ic_superuser_outlined_md2.xml diff --git a/app/src/main/res/drawable/ic_bug_filled_md2.xml b/app/src/main/res/drawable/ic_bug_filled_md2.xml new file mode 100644 index 000000000..6849c1b2a --- /dev/null +++ b/app/src/main/res/drawable/ic_bug_filled_md2.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_bug_md2.xml b/app/src/main/res/drawable/ic_bug_md2.xml index 2c9a0a795..9eea5b0e8 100644 --- a/app/src/main/res/drawable/ic_bug_md2.xml +++ b/app/src/main/res/drawable/ic_bug_md2.xml @@ -1,10 +1,6 @@ - - - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bug_outlined_md2.xml b/app/src/main/res/drawable/ic_bug_outlined_md2.xml new file mode 100644 index 000000000..2c9a0a795 --- /dev/null +++ b/app/src/main/res/drawable/ic_bug_outlined_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_home_filled_md2.xml b/app/src/main/res/drawable/ic_home_filled_md2.xml new file mode 100644 index 000000000..62d845c72 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_filled_md2.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_home_md2.xml b/app/src/main/res/drawable/ic_home_md2.xml index 90d81fbea..cc8b40c34 100644 --- a/app/src/main/res/drawable/ic_home_md2.xml +++ b/app/src/main/res/drawable/ic_home_md2.xml @@ -1,10 +1,6 @@ - - - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_home_outlined_md2.xml b/app/src/main/res/drawable/ic_home_outlined_md2.xml new file mode 100644 index 000000000..8b7e19e47 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_outlined_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_module_filled_md2.xml b/app/src/main/res/drawable/ic_module_filled_md2.xml new file mode 100644 index 000000000..8d4c14e57 --- /dev/null +++ b/app/src/main/res/drawable/ic_module_filled_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_module_md2.xml b/app/src/main/res/drawable/ic_module_md2.xml index fd83b65c4..55d94eab3 100644 --- a/app/src/main/res/drawable/ic_module_md2.xml +++ b/app/src/main/res/drawable/ic_module_md2.xml @@ -1,10 +1,6 @@ - - - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_module_outlined_md2.xml b/app/src/main/res/drawable/ic_module_outlined_md2.xml new file mode 100644 index 000000000..fd83b65c4 --- /dev/null +++ b/app/src/main/res/drawable/ic_module_outlined_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_settings_filled_md2.xml b/app/src/main/res/drawable/ic_settings_filled_md2.xml new file mode 100644 index 000000000..6044b0f0f --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_filled_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_settings_md2.xml b/app/src/main/res/drawable/ic_settings_md2.xml index 6c20efa2f..9df992937 100644 --- a/app/src/main/res/drawable/ic_settings_md2.xml +++ b/app/src/main/res/drawable/ic_settings_md2.xml @@ -1,10 +1,6 @@ - - - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_settings_outlined_md2.xml b/app/src/main/res/drawable/ic_settings_outlined_md2.xml new file mode 100644 index 000000000..6c20efa2f --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_outlined_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_superuser_filled_md2.xml b/app/src/main/res/drawable/ic_superuser_filled_md2.xml new file mode 100644 index 000000000..b7f92dcd4 --- /dev/null +++ b/app/src/main/res/drawable/ic_superuser_filled_md2.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_superuser_md2.xml b/app/src/main/res/drawable/ic_superuser_md2.xml index b6be3b2b9..4d52c7577 100644 --- a/app/src/main/res/drawable/ic_superuser_md2.xml +++ b/app/src/main/res/drawable/ic_superuser_md2.xml @@ -1,9 +1,6 @@ - - - + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_superuser_outlined_md2.xml b/app/src/main/res/drawable/ic_superuser_outlined_md2.xml new file mode 100644 index 000000000..5fd61b8ad --- /dev/null +++ b/app/src/main/res/drawable/ic_superuser_outlined_md2.xml @@ -0,0 +1,20 @@ + + + + + + + From 700c51f95c378f2d110a75f6fb07cb25813c0a83 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 10 Oct 2019 22:00:39 +0200 Subject: [PATCH 044/254] Added animated home icons --- .../res/drawable-v21/avd_bug_from_filled.xml | 28 ++++++++++++++++++ .../res/drawable-v21/avd_bug_to_filled.xml | 28 ++++++++++++++++++ .../res/drawable-v21/avd_home_from_filled.xml | 29 +++++++++++++++++++ .../res/drawable-v21/avd_home_to_filled.xml | 29 +++++++++++++++++++ .../drawable-v21/avd_module_from_filled.xml | 28 ++++++++++++++++++ .../res/drawable-v21/avd_module_to_filled.xml | 28 ++++++++++++++++++ .../drawable-v21/avd_settings_from_filled.xml | 28 ++++++++++++++++++ .../drawable-v21/avd_settings_to_filled.xml | 28 ++++++++++++++++++ .../avd_superuser_from_filled.xml | 28 ++++++++++++++++++ .../drawable-v21/avd_superuser_to_filled.xml | 28 ++++++++++++++++++ app/src/main/res/drawable-v21/ic_bug_md2.xml | 23 +++++++++++++++ app/src/main/res/drawable-v21/ic_home_md2.xml | 23 +++++++++++++++ .../main/res/drawable-v21/ic_module_md2.xml | 23 +++++++++++++++ .../main/res/drawable-v21/ic_settings_md2.xml | 23 +++++++++++++++ .../res/drawable-v21/ic_superuser_md2.xml | 23 +++++++++++++++ .../main/res/drawable/ic_home_filled_md2.xml | 2 +- .../res/drawable/ic_home_outlined_md2.xml | 3 +- .../res/drawable/ic_superuser_filled_md2.xml | 23 ++++----------- .../drawable/ic_superuser_outlined_md2.xml | 25 +++++----------- 19 files changed, 413 insertions(+), 37 deletions(-) create mode 100644 app/src/main/res/drawable-v21/avd_bug_from_filled.xml create mode 100644 app/src/main/res/drawable-v21/avd_bug_to_filled.xml create mode 100644 app/src/main/res/drawable-v21/avd_home_from_filled.xml create mode 100644 app/src/main/res/drawable-v21/avd_home_to_filled.xml create mode 100644 app/src/main/res/drawable-v21/avd_module_from_filled.xml create mode 100644 app/src/main/res/drawable-v21/avd_module_to_filled.xml create mode 100644 app/src/main/res/drawable-v21/avd_settings_from_filled.xml create mode 100644 app/src/main/res/drawable-v21/avd_settings_to_filled.xml create mode 100644 app/src/main/res/drawable-v21/avd_superuser_from_filled.xml create mode 100644 app/src/main/res/drawable-v21/avd_superuser_to_filled.xml create mode 100644 app/src/main/res/drawable-v21/ic_bug_md2.xml create mode 100644 app/src/main/res/drawable-v21/ic_home_md2.xml create mode 100644 app/src/main/res/drawable-v21/ic_module_md2.xml create mode 100644 app/src/main/res/drawable-v21/ic_settings_md2.xml create mode 100644 app/src/main/res/drawable-v21/ic_superuser_md2.xml diff --git a/app/src/main/res/drawable-v21/avd_bug_from_filled.xml b/app/src/main/res/drawable-v21/avd_bug_from_filled.xml new file mode 100644 index 000000000..b56ed84de --- /dev/null +++ b/app/src/main/res/drawable-v21/avd_bug_from_filled.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v21/avd_bug_to_filled.xml b/app/src/main/res/drawable-v21/avd_bug_to_filled.xml new file mode 100644 index 000000000..a0022e32c --- /dev/null +++ b/app/src/main/res/drawable-v21/avd_bug_to_filled.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v21/avd_home_from_filled.xml b/app/src/main/res/drawable-v21/avd_home_from_filled.xml new file mode 100644 index 000000000..d43306504 --- /dev/null +++ b/app/src/main/res/drawable-v21/avd_home_from_filled.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v21/avd_home_to_filled.xml b/app/src/main/res/drawable-v21/avd_home_to_filled.xml new file mode 100644 index 000000000..3f9ff4cf9 --- /dev/null +++ b/app/src/main/res/drawable-v21/avd_home_to_filled.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v21/avd_module_from_filled.xml b/app/src/main/res/drawable-v21/avd_module_from_filled.xml new file mode 100644 index 000000000..3d464b059 --- /dev/null +++ b/app/src/main/res/drawable-v21/avd_module_from_filled.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v21/avd_module_to_filled.xml b/app/src/main/res/drawable-v21/avd_module_to_filled.xml new file mode 100644 index 000000000..bab708f16 --- /dev/null +++ b/app/src/main/res/drawable-v21/avd_module_to_filled.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v21/avd_settings_from_filled.xml b/app/src/main/res/drawable-v21/avd_settings_from_filled.xml new file mode 100644 index 000000000..0b5bea43c --- /dev/null +++ b/app/src/main/res/drawable-v21/avd_settings_from_filled.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v21/avd_settings_to_filled.xml b/app/src/main/res/drawable-v21/avd_settings_to_filled.xml new file mode 100644 index 000000000..a5fb8da73 --- /dev/null +++ b/app/src/main/res/drawable-v21/avd_settings_to_filled.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v21/avd_superuser_from_filled.xml b/app/src/main/res/drawable-v21/avd_superuser_from_filled.xml new file mode 100644 index 000000000..e5e63721b --- /dev/null +++ b/app/src/main/res/drawable-v21/avd_superuser_from_filled.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v21/avd_superuser_to_filled.xml b/app/src/main/res/drawable-v21/avd_superuser_to_filled.xml new file mode 100644 index 000000000..287e9a9d0 --- /dev/null +++ b/app/src/main/res/drawable-v21/avd_superuser_to_filled.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v21/ic_bug_md2.xml b/app/src/main/res/drawable-v21/ic_bug_md2.xml new file mode 100644 index 000000000..8e18eacf0 --- /dev/null +++ b/app/src/main/res/drawable-v21/ic_bug_md2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/ic_home_md2.xml b/app/src/main/res/drawable-v21/ic_home_md2.xml new file mode 100644 index 000000000..a5d90b4d9 --- /dev/null +++ b/app/src/main/res/drawable-v21/ic_home_md2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/ic_module_md2.xml b/app/src/main/res/drawable-v21/ic_module_md2.xml new file mode 100644 index 000000000..d93278f5b --- /dev/null +++ b/app/src/main/res/drawable-v21/ic_module_md2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/ic_settings_md2.xml b/app/src/main/res/drawable-v21/ic_settings_md2.xml new file mode 100644 index 000000000..9d294bff8 --- /dev/null +++ b/app/src/main/res/drawable-v21/ic_settings_md2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/ic_superuser_md2.xml b/app/src/main/res/drawable-v21/ic_superuser_md2.xml new file mode 100644 index 000000000..374959c7c --- /dev/null +++ b/app/src/main/res/drawable-v21/ic_superuser_md2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_home_filled_md2.xml b/app/src/main/res/drawable/ic_home_filled_md2.xml index 62d845c72..0dafe8a4a 100644 --- a/app/src/main/res/drawable/ic_home_filled_md2.xml +++ b/app/src/main/res/drawable/ic_home_filled_md2.xml @@ -5,5 +5,5 @@ android:viewportHeight="24"> + android:pathData="M 9 14 L 9 21 L 4 21 L 4 9 L 12 3 L 12 3 L 20 9 L 20 21 L 15 21 L 15 14 L 9 14 M 12 13.4 L 12 13.4 L 12 13.4 L 12 13.4 L 12 13.4 L 12 13.4 L 12 13.4" /> diff --git a/app/src/main/res/drawable/ic_home_outlined_md2.xml b/app/src/main/res/drawable/ic_home_outlined_md2.xml index 8b7e19e47..38bad7cc5 100644 --- a/app/src/main/res/drawable/ic_home_outlined_md2.xml +++ b/app/src/main/res/drawable/ic_home_outlined_md2.xml @@ -6,5 +6,6 @@ android:viewportHeight="24"> + android:fillType="evenOdd" + android:pathData="M 9 13 L 9 19 L 6 19 L 6 10 L 12 5.5 L 15 7.75 L 18 10 L 18 19 L 15 19 L 15 13 L 9 13 M 4 21 L 4 9 L 12 3 L 20 9 L 20 21 L 4 21 L 4 21" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_superuser_filled_md2.xml b/app/src/main/res/drawable/ic_superuser_filled_md2.xml index b7f92dcd4..dde6afed0 100644 --- a/app/src/main/res/drawable/ic_superuser_filled_md2.xml +++ b/app/src/main/res/drawable/ic_superuser_filled_md2.xml @@ -1,20 +1,9 @@ - - - - - + android:width="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + diff --git a/app/src/main/res/drawable/ic_superuser_outlined_md2.xml b/app/src/main/res/drawable/ic_superuser_outlined_md2.xml index 5fd61b8ad..3c279ccbe 100644 --- a/app/src/main/res/drawable/ic_superuser_outlined_md2.xml +++ b/app/src/main/res/drawable/ic_superuser_outlined_md2.xml @@ -1,20 +1,9 @@ - - - - - - + android:width="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + + \ No newline at end of file From ff24bc0b684c21c559d40a7d8a230b540b51748c Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 12 Oct 2019 16:10:44 +0200 Subject: [PATCH 045/254] Updated card design on homepage --- app/src/main/res/drawable/bg_card.xml | 8 + app/src/main/res/layout/fragment_home_md2.xml | 354 +++++++++--------- app/src/main/res/values/attrs.xml | 1 + app/src/main/res/values/styles_md2.xml | 1 + app/src/main/res/values/styles_md2_impl.xml | 5 + 5 files changed, 195 insertions(+), 174 deletions(-) create mode 100644 app/src/main/res/drawable/bg_card.xml diff --git a/app/src/main/res/drawable/bg_card.xml b/app/src/main/res/drawable/bg_card.xml new file mode 100644 index 000000000..57de59736 --- /dev/null +++ b/app/src/main/res/drawable/bg_card.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 014ffcbd5..77b29bc50 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -38,216 +38,222 @@ android:layout_height="wrap_content" android:paddingTop="@dimen/l1"> - - - - - - - - - - + app:layout_constraintTop_toTopOf="parent"> - + + + + + + + + + android:layout_marginTop="@dimen/l1" + android:animateLayoutChanges="true" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/home_magisk_version"> - + - + - + - + - + + - + app:layout_constraintStart_toEndOf="@+id/home_magisk_wrapper" + app:layout_constraintTop_toTopOf="parent"> - + - - - - - - - + android:layout_marginTop="@dimen/l1" + android:gravity="center" + android:text="@{viewModel.stateHideManagerName}" + android:textAppearance="?appearanceTextTitleNormal" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/home_manager_icon" + tools:text="@string/manager" /> - + app:layout_constraintEnd_toEndOf="@+id/home_manager_title" + app:layout_constraintStart_toStartOf="@+id/home_manager_title" + app:layout_constraintTop_toBottomOf="@+id/home_manager_title" /> - + + + + + + + + + + + + + - - - diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index cb82971c6..6c1bd516c 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -17,6 +17,7 @@ + diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index f0e095ff0..5c2455c3f 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -30,6 +30,7 @@ @style/WidgetFoundation.Toolbar @style/WidgetFoundation.Card + @style/WidgetFoundation.Card.Variant @style/WidgetFoundation.Card.Elevated @style/WidgetFoundation.Card.OnPrimary diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index 2de494ff7..717fa55e1 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -30,6 +30,11 @@ variant. Make sure to use style referenced by attribute defined it attrs.xml. true + + + \ No newline at end of file From 9dd272b357f3cb9d4a856454dfb1255bcaf3e4fe Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 12 Oct 2019 16:22:12 +0200 Subject: [PATCH 047/254] Fixed main cards collapsing on themselves --- app/src/main/res/layout/fragment_home_md2.xml | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 77b29bc50..0fceffdd7 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -74,12 +74,13 @@ @@ -87,8 +88,9 @@ @@ -96,8 +98,9 @@ @@ -179,12 +182,13 @@ @@ -202,8 +207,9 @@ @@ -253,8 +259,8 @@ + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/l2"> Date: Sat, 12 Oct 2019 16:30:18 +0200 Subject: [PATCH 048/254] Added refreshing upon connection restore --- .../magisk/redesign/compat/CompatViewModel.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt index d19af09d1..9c639b1c4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt @@ -1,6 +1,8 @@ package com.topjohnwu.magisk.redesign.compat import android.graphics.Insets +import androidx.annotation.CallSuper +import androidx.databinding.Observable import com.skoumal.teanity.util.KObservableField import com.topjohnwu.magisk.ui.base.MagiskViewModel import io.reactivex.disposables.Disposable @@ -10,6 +12,15 @@ abstract class CompatViewModel : MagiskViewModel() { val insets = KObservableField(Insets.NONE) private var runningTask: Disposable? = null + private val refreshCallback = object : Observable.OnPropertyChangedCallback() { + override fun onPropertyChanged(sender: Observable?, propertyId: Int) { + requestRefresh() + } + } + + init { + isConnected.addOnPropertyChangedCallback(refreshCallback) + } /** This should probably never be called manually, it's called manually via delegate. */ @Synchronized @@ -22,4 +33,10 @@ abstract class CompatViewModel : MagiskViewModel() { protected open fun refresh(): Disposable? = null + @CallSuper + override fun onCleared() { + isConnected.removeOnPropertyChangedCallback(refreshCallback) + super.onCleared() + } + } \ No newline at end of file From 51247d36c5221558ecbb40339f43e62ca81413bd Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Wed, 16 Oct 2019 15:47:41 +0200 Subject: [PATCH 049/254] Added disabled state for sections where unrooted user shouldn't have access --- .../com/topjohnwu/magisk/redesign/MainActivity.kt | 11 +++++++++++ app/src/main/res/color/color_menu_tint.xml | 1 + app/src/main/res/values-night/styles_md2.xml | 1 + app/src/main/res/values/attrs.xml | 1 + app/src/main/res/values/styles_md2.xml | 1 + 5 files changed, 15 insertions(+) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index b87ffaf31..884e45e6a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -16,6 +16,7 @@ import com.topjohnwu.magisk.ui.log.LogFragment import com.topjohnwu.magisk.ui.module.ModulesFragment import com.topjohnwu.magisk.ui.settings.SettingsFragment import com.topjohnwu.magisk.ui.superuser.SuperuserFragment +import com.topjohnwu.superuser.Shell import org.koin.androidx.viewmodel.ext.android.viewModel import kotlin.reflect.KClass @@ -66,6 +67,16 @@ open class MainActivity : CompatActivity( } } + override fun onResume() { + super.onResume() + binding.mainNavigation.menu.apply { + val isRoot = Shell.rootAccess() + findItem(R.id.modulesFragment)?.isEnabled = isRoot + findItem(R.id.superuserFragment)?.isEnabled = isRoot + findItem(R.id.logFragment)?.isEnabled = isRoot + } + } + override fun onDestroy() { binding.mainNavigation.viewTreeObserver.removeOnGlobalLayoutListener(navObserver) super.onDestroy() diff --git a/app/src/main/res/color/color_menu_tint.xml b/app/src/main/res/color/color_menu_tint.xml index 7e45559cd..030b0e573 100644 --- a/app/src/main/res/color/color_menu_tint.xml +++ b/app/src/main/res/color/color_menu_tint.xml @@ -1,5 +1,6 @@ + \ No newline at end of file diff --git a/app/src/main/res/values-night/styles_md2.xml b/app/src/main/res/values-night/styles_md2.xml index c1b767bea..aef51115d 100644 --- a/app/src/main/res/values-night/styles_md2.xml +++ b/app/src/main/res/values-night/styles_md2.xml @@ -17,6 +17,7 @@ #BABABA #80BABABA #808080 + #66808080 @color/color_text_transient @color/color_primary_transient @color/color_error_transient diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 6c1bd516c..23996c090 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -81,6 +81,7 @@ + diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index 5c2455c3f..6eeaebda3 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -100,6 +100,7 @@ #444444 #80444444 #808080 + #66808080 @color/color_text_transient @color/color_primary_transient @color/color_error_transient From 2daa131fb2e60b681f793cdf6c1af64cbbb12634 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Wed, 16 Oct 2019 16:08:07 +0200 Subject: [PATCH 050/254] Added layout behavior to dismiss toolbars when scrolling --- .../topjohnwu/magisk/redesign/MainActivity.kt | 7 + .../utils/HideTopViewOnScrollBehavior.kt | 130 ++++++++++++++++++ app/src/main/res/layout/activity_main_md2.xml | 2 + app/src/main/res/layout/fragment_home_md2.xml | 2 +- 4 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/utils/HideTopViewOnScrollBehavior.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index 884e45e6a..b46f6fa38 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -3,8 +3,11 @@ package com.topjohnwu.magisk.redesign import android.graphics.Insets import android.os.Bundle import android.view.ViewTreeObserver +import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.view.setPadding +import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment +import com.google.android.material.card.MaterialCardView import com.ncapdevi.fragnav.FragNavController import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R @@ -16,6 +19,7 @@ import com.topjohnwu.magisk.ui.log.LogFragment import com.topjohnwu.magisk.ui.module.ModulesFragment import com.topjohnwu.magisk.ui.settings.SettingsFragment import com.topjohnwu.magisk.ui.superuser.SuperuserFragment +import com.topjohnwu.magisk.utils.HideTopViewOnScrollBehavior import com.topjohnwu.superuser.Shell import org.koin.androidx.viewmodel.ext.android.viewModel import kotlin.reflect.KClass @@ -48,6 +52,9 @@ open class MainActivity : CompatActivity( setSupportActionBar(binding.mainToolbar) + binding.mainToolbarWrapper.updateLayoutParams { + behavior = HideTopViewOnScrollBehavior() + } binding.mainNavigation.setOnNavigationItemSelectedListener { when (it.itemId) { R.id.homeFragment -> Navigation.home() diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/HideTopViewOnScrollBehavior.kt b/app/src/main/java/com/topjohnwu/magisk/utils/HideTopViewOnScrollBehavior.kt new file mode 100644 index 000000000..39650e230 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/utils/HideTopViewOnScrollBehavior.kt @@ -0,0 +1,130 @@ +package com.topjohnwu.magisk.utils + +import android.animation.TimeInterpolator +import android.view.View +import android.view.ViewGroup +import android.view.ViewPropertyAnimator +import androidx.annotation.Dimension +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.view.ViewCompat +import com.google.android.material.animation.AnimationUtils +import com.google.android.material.behavior.HideBottomViewOnScrollBehavior + +class HideTopViewOnScrollBehavior : HideBottomViewOnScrollBehavior() { + + companion object { + private const val STATE_SCROLLED_DOWN = 1 + private const val STATE_SCROLLED_UP = 2 + } + + private var height = 0 + private var currentState = STATE_SCROLLED_UP + private var additionalHiddenOffsetY = 0 + private var currentAnimator: ViewPropertyAnimator? = null + + override fun onLayoutChild( + parent: CoordinatorLayout, + child: V, + layoutDirection: Int + ): Boolean { + val paramsCompat = child.layoutParams as ViewGroup.MarginLayoutParams + height = child.measuredHeight + paramsCompat.topMargin + return super.onLayoutChild(parent, child, layoutDirection) + } + + /** + * Sets an additional offset for the y position used to hide the view. + * + * @param child the child view that is hidden by this behavior + * @param offset the additional offset in pixels that should be added when the view slides away + */ + override fun setAdditionalHiddenOffsetY(child: V, @Dimension offset: Int) { + additionalHiddenOffsetY = offset + + if (currentState == STATE_SCROLLED_DOWN) { + child.translationY = (height + additionalHiddenOffsetY).toFloat() + } + } + + override fun onStartNestedScroll( + coordinatorLayout: CoordinatorLayout, + child: V, + directTargetChild: View, + target: View, + nestedScrollAxes: Int + ) = nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL + + override fun onNestedScroll( + coordinatorLayout: CoordinatorLayout, + child: V, + target: View, + dxConsumed: Int, + dyConsumed: Int, + dxUnconsumed: Int, + dyUnconsumed: Int + ) { + when { + dyConsumed > 0 -> slideUp(child) + dyConsumed < 0 -> slideDown(child) + } + } + + /** + * Perform an animation that will slide the child from it's current position to be totally on the + * screen. + */ + override fun slideDown(child: V) { + if (currentState == STATE_SCROLLED_UP) { + return + } + + currentAnimator?.let { + it.cancel() + child.clearAnimation() + } + + currentState = STATE_SCROLLED_UP + animateChildTo( + child, + 0, + ENTER_ANIMATION_DURATION.toLong(), + AnimationUtils.LINEAR_OUT_SLOW_IN_INTERPOLATOR + ) + } + + /** + * Perform an animation that will slide the child from it's current position to be totally off the + * screen. + */ + override fun slideUp(child: V) { + if (currentState == STATE_SCROLLED_DOWN) { + return + } + + currentAnimator?.let { + it.cancel() + child.clearAnimation() + } + + currentState = STATE_SCROLLED_DOWN + animateChildTo( + child, + -(height + additionalHiddenOffsetY), + EXIT_ANIMATION_DURATION.toLong(), + AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR + ) + } + + private fun animateChildTo( + child: V, + targetY: Int, + duration: Long, + interpolator: TimeInterpolator + ) = child + .animate() + .translationY(targetY.toFloat()) + .setInterpolator(interpolator) + .setDuration(duration) + .withEndAction { currentAnimator = null } + .let { currentAnimator = it } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_md2.xml b/app/src/main/res/layout/activity_main_md2.xml index 8c1d36e2c..a9873680d 100644 --- a/app/src/main/res/layout/activity_main_md2.xml +++ b/app/src/main/res/layout/activity_main_md2.xml @@ -28,6 +28,7 @@ style="?styleCardElevated" android:layout_width="match_parent" android:layout_height="wrap_content" + android:id="@+id/main_toolbar_wrapper" android:layout_marginStart="@dimen/l1" android:layout_marginTop="@{(int) @dimen/l1 + viewModel.insets.top}" android:layout_marginEnd="@dimen/l1" @@ -55,6 +56,7 @@ style="?styleCardElevated" android:layout_width="match_parent" android:layout_height="wrap_content" + app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior" android:layout_gravity="bottom" android:layout_marginStart="@dimen/l1" android:layout_marginEnd="@dimen/l1" diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 0fceffdd7..97b148e39 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -22,7 +22,7 @@ android:layout_height="match_parent" android:clipToPadding="false" android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l2}" - android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/margin_fab + (int) @dimen/l1}" + android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/l1}" tools:layout_marginTop="24dp"> Date: Wed, 16 Oct 2019 17:27:11 +0200 Subject: [PATCH 051/254] Added navigation delegation to bypass default one By making a delegate like such we protect ourselves against intrusions in views' logic --- .../magisk/model/events/ViewEvents.kt | 47 +++++++- .../model/navigation/MagiskNavigationEvent.kt | 10 +- .../topjohnwu/magisk/redesign/MainActivity.kt | 2 +- .../magisk/redesign/compat/CompatActivity.kt | 19 ++- .../magisk/redesign/compat/CompatDelegate.kt | 7 +- .../magisk/redesign/compat/CompatFragment.kt | 5 +- .../compat/CompatNavigationDelegate.kt | 112 ++++++++++++++++++ .../magisk/redesign/compat/CompatView.kt | 1 + 8 files changed, 195 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt index 206e765d1..b9a5ebd64 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt @@ -1,8 +1,15 @@ package com.topjohnwu.magisk.model.events import android.app.Activity +import androidx.appcompat.app.AppCompatActivity +import com.karumi.dexter.Dexter +import com.karumi.dexter.MultiplePermissionsReport +import com.karumi.dexter.PermissionToken +import com.karumi.dexter.listener.PermissionRequest +import com.karumi.dexter.listener.multi.MultiplePermissionsListener import com.skoumal.teanity.viewevents.ViewEvent import com.topjohnwu.magisk.model.entity.module.Repo +import com.topjohnwu.magisk.model.permissions.PermissionRequestBuilder import io.reactivex.subjects.PublishSubject @@ -19,7 +26,9 @@ class EnvFixEvent : ViewEvent() class UpdateSafetyNetEvent : ViewEvent() -class ViewActionEvent(val action: Activity.() -> Unit) : ViewEvent() +class ViewActionEvent(val action: Activity.() -> Unit) : ViewEvent(), ActivityExecutor { + override fun invoke(activity: AppCompatActivity) = activity.run(action) +} class OpenFilePickerEvent : ViewEvent() @@ -31,8 +40,40 @@ class PageChangedEvent : ViewEvent() class PermissionEvent( val permissions: List, val callback: PublishSubject -) : ViewEvent() +) : ViewEvent(), ActivityExecutor { -class BackPressEvent : ViewEvent() + private val permissionRequest = PermissionRequestBuilder().apply { + onSuccess { + callback.onNext(true) + } + onFailure { + callback.onNext(false) + callback.onError(SecurityException("User refused permissions")) + } + }.build() + + override fun invoke(activity: AppCompatActivity) = Dexter.withActivity(activity) + .withPermissions(permissions) + .withListener(object : MultiplePermissionsListener { + override fun onPermissionRationaleShouldBeShown( + permissions: MutableList, + token: PermissionToken + ) = token.continuePermissionRequest() + + override fun onPermissionsChecked( + report: MultiplePermissionsReport + ) = if (report.areAllPermissionsGranted()) { + permissionRequest.onSuccess() + } else { + permissionRequest.onFailure() + } + }).check() +} + +class BackPressEvent : ViewEvent(), ActivityExecutor { + override fun invoke(activity: AppCompatActivity) { + activity.onBackPressed() + } +} class DieEvent : ViewEvent() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt index 793c2a4c2..89be3ea61 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt @@ -3,21 +3,29 @@ package com.topjohnwu.magisk.model.navigation import android.os.Bundle import androidx.annotation.AnimRes import androidx.annotation.AnimatorRes +import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import com.skoumal.teanity.viewevents.NavigationDslMarker import com.skoumal.teanity.viewevents.ViewEvent +import com.topjohnwu.magisk.model.events.ActivityExecutor +import com.topjohnwu.magisk.redesign.compat.CompatActivity import kotlin.reflect.KClass class MagiskNavigationEvent( val navDirections: MagiskNavDirectionsBuilder, val navOptions: MagiskNavOptions, val animOptions: MagiskAnimBuilder -) : ViewEvent() { +) : ViewEvent(), ActivityExecutor { companion object { operator fun invoke(builder: Builder.() -> Unit) = Builder().apply(builder).build() } + override fun invoke(activity: AppCompatActivity) { + if (activity !is CompatActivity<*, *>) return + activity.navigation.navigateTo(this) + } + @NavigationDslMarker class Builder { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index b46f6fa38..81772bc15 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -29,6 +29,7 @@ open class MainActivity : CompatActivity( override val layoutRes = R.layout.activity_main_md2 override val viewModel by viewModel() override val navHostId: Int = R.id.main_nav_host + override val navHost: Int = R.id.main_nav_host override val defaultPosition: Int = 0 override val baseFragments: List> = listOf( @@ -38,7 +39,6 @@ open class MainActivity : CompatActivity( LogFragment::class, SettingsFragment::class ) - //This temporarily fixes unwanted feature of BottomNavigationView - where the view applies //padding on itself given insets are not consumed beforehand. Unfortunately the listener //implementation doesn't favor us against the design library, so on re-create it's often given diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt index a10b51e8e..33c5e9092 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt @@ -10,13 +10,19 @@ abstract class CompatActivity(), CompatView { override val viewRoot: View get() = binding.root + override val navigation: CompatNavigationDelegate>? by lazy { + CompatNavigationDelegate(this) + } private val delegate by lazy { CompatDelegate(this) } + internal abstract val navHost: Int + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - delegate.ensureInsets() + delegate.onCreate() + navigation?.onCreate(savedInstanceState) } override fun onResume() { @@ -25,12 +31,23 @@ abstract class CompatActivity ) { + fun onCreate() { + ensureInsets() + + } + fun onResume() { view.viewModel.requestRefresh() } @@ -33,7 +38,7 @@ class CompatDelegate internal constructor( (event as? ActivityExecutor)?.invoke(fragment.requireActivity() as AppCompatActivity) } - fun ensureInsets() { + private fun ensureInsets() { ViewCompat.setOnApplyWindowInsetsListener(view.viewRoot) { _, insets -> insets.asInsets() .also { view.peekSystemWindowInsets(it) } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt index 8089f9cd8..6683b726c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt @@ -10,13 +10,16 @@ abstract class CompatFragment(), CompatView { override val viewRoot: View get() = binding.root + override val navigation by lazy { compatActivity.navigation } private val delegate by lazy { CompatDelegate(this) } + private val compatActivity get() = requireActivity() as CompatActivity<*, *> + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - delegate.ensureInsets() + delegate.onCreate() } override fun onResume() { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt new file mode 100644 index 000000000..5a9a67463 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt @@ -0,0 +1,112 @@ +package com.topjohnwu.magisk.redesign.compat + +import android.content.Intent +import android.os.Bundle +import androidx.fragment.app.FragmentTransaction +import com.ncapdevi.fragnav.FragNavController +import com.ncapdevi.fragnav.FragNavTransactionOptions +import com.topjohnwu.magisk.model.navigation.MagiskAnimBuilder +import com.topjohnwu.magisk.model.navigation.MagiskNavigationEvent +import com.topjohnwu.magisk.model.navigation.Navigator +import timber.log.Timber + +class CompatNavigationDelegate( + private val source: Source, + private val listener: FragNavController.TransactionListener? = null +) : FragNavController.RootFragmentListener where Source : CompatActivity<*, *>, Source : Navigator { + + private val controller by lazy { + check(source.navHost != 0) { "Did you forget to override \"navHostId\"?" } + FragNavController(source.supportFragmentManager, source.navHost) + } + + val isRoot get() = controller.isRootFragment + + + //region Listener + override val numberOfRootFragments: Int + get() = source.baseFragments.size + + override fun getRootFragment(index: Int) = + source.baseFragments[index].java.newInstance() + //endregion + + + fun onCreate(savedInstanceState: Bundle?) = controller.run { + rootFragmentListener = source + transactionListener = listener + initialize(0, savedInstanceState) + } + + fun onSaveInstanceState(outState: Bundle) = + controller.onSaveInstanceState(outState) + + fun onBackPressed(): Boolean { + val fragment = controller.currentFrag as? CompatFragment<*, *> + + if (fragment?.onBackPressed() == true) { + return true + } + + return runCatching { controller.popFragment() }.fold({ true }, { false }) + } + + // --- + + fun navigateTo(event: MagiskNavigationEvent) { + val directions = event.navDirections + + controller.defaultTransactionOptions = FragNavTransactionOptions.newBuilder() + .customAnimations(event.animOptions) + .build() + + controller.currentStack + ?.indexOfFirst { it.javaClass == event.navOptions.popUpTo } + ?.takeIf { it != -1 } // invalidate if class is not found + ?.let { if (event.navOptions.inclusive) it + 1 else it } + ?.let { controller.popFragments(it) } + + when (directions.isActivity) { + true -> navigateToActivity(event) + else -> navigateToFragment(event) + } + } + + private fun navigateToActivity(event: MagiskNavigationEvent) { + val destination = event.navDirections.destination?.java ?: let { + Timber.e("Cannot navigate to null destination") + return + } + val options = event.navOptions + + Intent(source, destination) + .putExtras(event.navDirections.args) + .apply { + if (options.singleTop) addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + if (options.clearTask) addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) + } + .let { source.startActivity(it) } + } + + private fun navigateToFragment(event: MagiskNavigationEvent) { + val destination = event.navDirections.destination?.java ?: let { + Timber.e("Cannot navigate to null destination") + return + } + + source.baseFragments + .indexOfFirst { it.java.name == destination.name } + .takeIf { it > 0 } + ?.let { controller.switchTab(it) } ?: destination.newInstance() + .also { it.arguments = event.navDirections.args } + .let { controller.pushFragment(it) } + } + + private fun FragNavTransactionOptions.Builder.customAnimations(options: MagiskAnimBuilder) = + customAnimations(options.enter, options.exit, options.popEnter, options.popExit).apply { + if (!options.anySet) { + transition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatView.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatView.kt index 4eb84f0c8..6257716c7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatView.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatView.kt @@ -7,6 +7,7 @@ internal interface CompatView { val viewRoot: View val viewModel: ViewModel + val navigation: CompatNavigationDelegate<*>? fun peekSystemWindowInsets(insets: Insets) = Unit fun consumeSystemWindowInsets(insets: Insets) = Insets.NONE From 974cb1167f75fed4a20a174d0efed248c921bc45 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Wed, 16 Oct 2019 17:53:35 +0200 Subject: [PATCH 052/254] Added post-merge fixes --- app/build.gradle | 2 ++ app/src/main/AndroidManifest.xml | 3 +-- .../magisk/model/entity/recycler/HomeItems.kt | 2 +- .../magisk/model/events/OpenInappLinkEvent.kt | 1 - .../magisk/model/events/ViewEvents.kt | 1 - .../magisk/model/events/dialog/DialogEvent.kt | 2 +- .../model/navigation/MagiskNavigationEvent.kt | 4 ++-- .../topjohnwu/magisk/redesign/MainActivity.kt | 21 ++++++++----------- .../magisk/redesign/compat/CompatActivity.kt | 17 +++++++++++---- .../magisk/redesign/compat/CompatDelegate.kt | 2 +- .../magisk/redesign/compat/CompatFragment.kt | 6 +++--- .../compat/CompatNavigationDelegate.kt | 4 ++-- .../magisk/redesign/compat/CompatViewModel.kt | 6 +++--- .../magisk/redesign/home/HomeViewModel.kt | 6 +++--- .../com/topjohnwu/magisk/view/MagiskDialog.kt | 2 +- 15 files changed, 42 insertions(+), 37 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7e992561e..b9d07c8ee 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -122,6 +122,7 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha03' + implementation 'androidx.browser:browser:1.0.0' implementation 'androidx.preference:preference:1.1.0' implementation 'androidx.recyclerview:recyclerview:1.0.0' implementation 'androidx.work:work-runtime:2.2.0' @@ -129,4 +130,5 @@ dependencies { implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.core:core-ktx:1.1.0' implementation 'com.google.android.material:material:1.1.0-beta01' + implementation 'com.karumi:dexter:6.0.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8d47f905a..2a2189477 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -56,8 +56,7 @@ + android:exported="true" /> () { diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/OpenInappLinkEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/OpenInappLinkEvent.kt index 522b1c88f..6c02e267f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/OpenInappLinkEvent.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/OpenInappLinkEvent.kt @@ -6,7 +6,6 @@ import android.util.TypedValue import androidx.annotation.AttrRes import androidx.browser.customtabs.CustomTabsIntent import androidx.core.net.toUri -import com.skoumal.teanity.viewevents.ViewEvent import com.topjohnwu.magisk.R data class OpenInappLinkEvent( diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt index 02062c62b..48c25fb92 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt @@ -7,7 +7,6 @@ import com.karumi.dexter.MultiplePermissionsReport import com.karumi.dexter.PermissionToken import com.karumi.dexter.listener.PermissionRequest import com.karumi.dexter.listener.multi.MultiplePermissionsListener -import com.skoumal.teanity.viewevents.ViewEvent import com.topjohnwu.magisk.model.entity.module.Repo import com.topjohnwu.magisk.model.permissions.PermissionRequestBuilder import io.reactivex.subjects.PublishSubject diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DialogEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DialogEvent.kt index dc41fe709..ed7b67692 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DialogEvent.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DialogEvent.kt @@ -1,8 +1,8 @@ package com.topjohnwu.magisk.model.events.dialog import android.content.Context -import com.skoumal.teanity.viewevents.ViewEvent import com.topjohnwu.magisk.model.events.ContextExecutor +import com.topjohnwu.magisk.model.events.ViewEvent import com.topjohnwu.magisk.view.MagiskDialog abstract class DialogEvent : ViewEvent(), ContextExecutor { diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt index 5a84deaec..a5cf30cac 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt @@ -5,8 +5,8 @@ import androidx.annotation.AnimRes import androidx.annotation.AnimatorRes import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment -import com.topjohnwu.magisk.model.events.ViewEvent import com.topjohnwu.magisk.model.events.ActivityExecutor +import com.topjohnwu.magisk.model.events.ViewEvent import com.topjohnwu.magisk.redesign.compat.CompatActivity import kotlin.reflect.KClass @@ -25,7 +25,7 @@ class MagiskNavigationEvent( override fun invoke(activity: AppCompatActivity) { if (activity !is CompatActivity<*, *>) return - activity.navigation.navigateTo(this) + activity.navigation?.navigateTo(this) } @NavigationDslMarker diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index 81772bc15..cdabd6a83 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -14,6 +14,7 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ActivityMainMd2Binding import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.redesign.compat.CompatActivity +import com.topjohnwu.magisk.redesign.compat.CompatNavigationDelegate import com.topjohnwu.magisk.redesign.home.HomeFragment import com.topjohnwu.magisk.ui.log.LogFragment import com.topjohnwu.magisk.ui.module.ModulesFragment @@ -24,13 +25,14 @@ import com.topjohnwu.superuser.Shell import org.koin.androidx.viewmodel.ext.android.viewModel import kotlin.reflect.KClass -open class MainActivity : CompatActivity() { +open class MainActivity : CompatActivity(), + FragNavController.TransactionListener { override val layoutRes = R.layout.activity_main_md2 override val viewModel by viewModel() - override val navHostId: Int = R.id.main_nav_host override val navHost: Int = R.id.main_nav_host - override val defaultPosition: Int = 0 + + override val navigation by lazy { CompatNavigationDelegate(this, this) } override val baseFragments: List> = listOf( HomeFragment::class, @@ -39,6 +41,7 @@ open class MainActivity : CompatActivity( LogFragment::class, SettingsFragment::class ) + //This temporarily fixes unwanted feature of BottomNavigationView - where the view applies //padding on itself given insets are not consumed beforehand. Unfortunately the listener //implementation doesn't favor us against the design library, so on re-create it's often given @@ -90,21 +93,15 @@ open class MainActivity : CompatActivity( } override fun onTabTransaction(fragment: Fragment?, index: Int) { - super.onTabTransaction(fragment, index) - setDisplayHomeAsUpEnabled(false) } override fun onFragmentTransaction( fragment: Fragment?, transactionType: FragNavController.TransactionType - ) { - super.onFragmentTransaction(fragment, transactionType) - - when (transactionType) { - FragNavController.TransactionType.PUSH -> setDisplayHomeAsUpEnabled(true) - else -> Unit //dunno might be useful - } + ) = when (transactionType) { + FragNavController.TransactionType.PUSH -> setDisplayHomeAsUpEnabled(true) + else -> Unit //dunno might be useful } override fun peekSystemWindowInsets(insets: Insets) { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt index 33c5e9092..e52f8d293 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt @@ -3,17 +3,23 @@ package com.topjohnwu.magisk.redesign.compat import android.os.Bundle import android.view.View import androidx.databinding.ViewDataBinding -import com.skoumal.teanity.viewevents.ViewEvent -import com.topjohnwu.magisk.ui.base.MagiskActivity +import androidx.fragment.app.Fragment +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.base.BaseActivity +import com.topjohnwu.magisk.model.events.ViewEvent +import com.topjohnwu.magisk.model.navigation.MagiskNavigationEvent +import com.topjohnwu.magisk.model.navigation.Navigator +import kotlin.reflect.KClass abstract class CompatActivity : - MagiskActivity(), CompatView { + BaseActivity(), CompatView, Navigator { + override val themeRes = R.style.Foundation_Default override val viewRoot: View get() = binding.root override val navigation: CompatNavigationDelegate>? by lazy { CompatNavigationDelegate(this) } - + override val baseFragments = listOf>() private val delegate by lazy { CompatDelegate(this) } internal abstract val navHost: Int @@ -48,6 +54,9 @@ abstract class CompatActivity - : MagiskFragment(), CompatView { + : BaseFragment(), CompatView { override val viewRoot: View get() = binding.root override val navigation by lazy { compatActivity.navigation } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt index 5a9a67463..3fe6b5123 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt @@ -10,7 +10,7 @@ import com.topjohnwu.magisk.model.navigation.MagiskNavigationEvent import com.topjohnwu.magisk.model.navigation.Navigator import timber.log.Timber -class CompatNavigationDelegate( +class CompatNavigationDelegate( private val source: Source, private val listener: FragNavController.TransactionListener? = null ) : FragNavController.RootFragmentListener where Source : CompatActivity<*, *>, Source : Navigator { @@ -33,7 +33,7 @@ class CompatNavigationDelegate( fun onCreate(savedInstanceState: Bundle?) = controller.run { - rootFragmentListener = source + rootFragmentListener = this@CompatNavigationDelegate transactionListener = listener initialize(0, savedInstanceState) } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt index 9c639b1c4..fb4cb11d1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt @@ -3,11 +3,11 @@ package com.topjohnwu.magisk.redesign.compat import android.graphics.Insets import androidx.annotation.CallSuper import androidx.databinding.Observable -import com.skoumal.teanity.util.KObservableField -import com.topjohnwu.magisk.ui.base.MagiskViewModel +import com.topjohnwu.magisk.base.viewmodel.BaseViewModel +import com.topjohnwu.magisk.utils.KObservableField import io.reactivex.disposables.Disposable -abstract class CompatViewModel : MagiskViewModel() { +abstract class CompatViewModel : BaseViewModel() { val insets = KObservableField(Insets.NONE) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 79862dc58..4c939240e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -1,15 +1,14 @@ package com.topjohnwu.magisk.redesign.home -import com.skoumal.teanity.databinding.ComparableRvItem -import com.skoumal.teanity.extensions.subscribeK -import com.skoumal.teanity.util.KObservableField import com.topjohnwu.magisk.BuildConfig import com.topjohnwu.magisk.Info import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.repository.MagiskRepository +import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.packageName import com.topjohnwu.magisk.extensions.replaceRandomWithSpecial import com.topjohnwu.magisk.extensions.res +import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.model.entity.MagiskJson import com.topjohnwu.magisk.model.entity.ManagerJson import com.topjohnwu.magisk.model.entity.UpdateInfo @@ -20,6 +19,7 @@ import com.topjohnwu.magisk.model.events.dialog.ManagerInstallDialog import com.topjohnwu.magisk.model.observer.Observer import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.ui.home.MagiskState +import com.topjohnwu.magisk.utils.KObservableField import me.tatarka.bindingcollectionadapter2.BR import me.tatarka.bindingcollectionadapter2.ItemBinding import me.tatarka.bindingcollectionadapter2.OnItemBind diff --git a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt index fdcc01a1c..b7f1d4df1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt @@ -12,10 +12,10 @@ import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding -import com.skoumal.teanity.util.KObservableField import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.DialogMagiskBaseBinding +import com.topjohnwu.magisk.utils.KObservableField class MagiskDialog @JvmOverloads constructor( context: Context, theme: Int = 0 From 3b4cb23112ff4077c7a54181502402e953689d75 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Wed, 16 Oct 2019 18:53:38 +0200 Subject: [PATCH 053/254] Fixed error in navigation implementation --- .../java/com/topjohnwu/magisk/redesign/MainActivity.kt | 2 +- .../magisk/redesign/compat/CompatNavigationDelegate.kt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index cdabd6a83..85a60f756 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -100,7 +100,7 @@ open class MainActivity : CompatActivity( fragment: Fragment?, transactionType: FragNavController.TransactionType ) = when (transactionType) { - FragNavController.TransactionType.PUSH -> setDisplayHomeAsUpEnabled(true) + FragNavController.TransactionType.PUSH -> setDisplayHomeAsUpEnabled(!navigation.isRoot) else -> Unit //dunno might be useful } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt index 3fe6b5123..ec224af66 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt @@ -89,15 +89,15 @@ class CompatNavigationDelegate( } private fun navigateToFragment(event: MagiskNavigationEvent) { - val destination = event.navDirections.destination?.java ?: let { + val destination = event.navDirections.destination ?: let { Timber.e("Cannot navigate to null destination") return } source.baseFragments - .indexOfFirst { it.java.name == destination.name } - .takeIf { it > 0 } - ?.let { controller.switchTab(it) } ?: destination.newInstance() + .indexOfFirst { it == destination } + .takeIf { it >= 0 } + ?.let { controller.switchTab(it) } ?: destination.java.newInstance() .also { it.arguments = event.navDirections.args } .let { controller.pushFragment(it) } } From 23978ef4d200ad95d87ee6f36d25ff08d1916b8e Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Wed, 16 Oct 2019 19:04:37 +0200 Subject: [PATCH 054/254] Updated bottom padding for home fragment --- .../main/java/com/topjohnwu/magisk/redesign/MainActivity.kt | 3 +-- app/src/main/res/layout/fragment_home_md2.xml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index 85a60f756..59a2f22b7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -23,7 +23,6 @@ import com.topjohnwu.magisk.ui.superuser.SuperuserFragment import com.topjohnwu.magisk.utils.HideTopViewOnScrollBehavior import com.topjohnwu.superuser.Shell import org.koin.androidx.viewmodel.ext.android.viewModel -import kotlin.reflect.KClass open class MainActivity : CompatActivity(), FragNavController.TransactionListener { @@ -34,7 +33,7 @@ open class MainActivity : CompatActivity( override val navigation by lazy { CompatNavigationDelegate(this, this) } - override val baseFragments: List> = listOf( + override val baseFragments = listOf( HomeFragment::class, ModulesFragment::class, SuperuserFragment::class, diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 97b148e39..8af9b586f 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -22,7 +22,7 @@ android:layout_height="match_parent" android:clipToPadding="false" android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l2}" - android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/l1}" + android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/l2}" tools:layout_marginTop="24dp"> Date: Thu, 17 Oct 2019 15:37:10 +0200 Subject: [PATCH 055/254] Added env check to homepage --- .../model/events/dialog/EnvFixDialog.kt | 77 +++++++++++++++++++ .../magisk/redesign/home/HomeViewModel.kt | 32 +++++++- 2 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/events/dialog/EnvFixDialog.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/EnvFixDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/EnvFixDialog.kt new file mode 100644 index 000000000..660d9c9b3 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/EnvFixDialog.kt @@ -0,0 +1,77 @@ +package com.topjohnwu.magisk.model.events.dialog + +import android.content.Context +import android.content.DialogInterface +import android.widget.Toast +import androidx.core.net.toUri +import com.topjohnwu.magisk.Info +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.extensions.cachedFile +import com.topjohnwu.magisk.extensions.reboot +import com.topjohnwu.magisk.net.Networking +import com.topjohnwu.magisk.tasks.MagiskInstaller +import com.topjohnwu.magisk.utils.Utils +import com.topjohnwu.magisk.view.MagiskDialog +import com.topjohnwu.superuser.Shell +import com.topjohnwu.superuser.ShellUtils +import com.topjohnwu.superuser.internal.UiThreadHandler +import com.topjohnwu.superuser.io.SuFile +import org.koin.core.KoinComponent +import org.koin.core.get +import java.io.File + +class EnvFixDialog : DialogEvent() { + + override fun build(dialog: MagiskDialog) = dialog + .applyTitle(R.string.env_fix_title) + .applyMessage(R.string.env_fix_msg) + .applyButton(MagiskDialog.ButtonType.POSITIVE) { + titleRes = R.string.yes + preventDismiss = true + onClick { + dialog.applyTitle(R.string.setup_title) + .applyMessage(R.string.setup_msg) + .applyButton(MagiskDialog.ButtonType.POSITIVE) { + title = "" + } + .applyButton(MagiskDialog.ButtonType.NEGATIVE) { + title = "" + } + .cancellable(false) + fixEnv(it) + } + } + .applyButton(MagiskDialog.ButtonType.NEGATIVE) { + titleRes = R.string.no_thanks + } + .let { Unit } + + private fun fixEnv(dialog: DialogInterface) { + object : MagiskInstaller(), KoinComponent { + override fun operations(): Boolean { + val context = get() + val zip: File = context.cachedFile("magisk.zip") + + installDir = SuFile("/data/adb/magisk") + Shell.su("rm -rf /data/adb/magisk/*").exec() + + if (!ShellUtils.checkSum("MD5", zip, Info.remote.magisk.md5)) + Networking.get(Info.remote.magisk.link).execForFile(zip) + + zipUri = zip.toUri() + return extractZip() && Shell.su("fix_env").exec().isSuccess + } + + override fun onResult(success: Boolean) { + dialog.dismiss() + Utils.toast( + if (success) R.string.reboot_delay_toast else R.string.setup_fail, + Toast.LENGTH_LONG + ) + if (success) + UiThreadHandler.handler.postDelayed({ reboot() }, 5000) + } + }.exec() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 4c939240e..20ca3e50b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -5,21 +5,20 @@ import com.topjohnwu.magisk.Info import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.repository.MagiskRepository import com.topjohnwu.magisk.databinding.ComparableRvItem -import com.topjohnwu.magisk.extensions.packageName -import com.topjohnwu.magisk.extensions.replaceRandomWithSpecial -import com.topjohnwu.magisk.extensions.res -import com.topjohnwu.magisk.extensions.subscribeK +import com.topjohnwu.magisk.extensions.* import com.topjohnwu.magisk.model.entity.MagiskJson import com.topjohnwu.magisk.model.entity.ManagerJson import com.topjohnwu.magisk.model.entity.UpdateInfo import com.topjohnwu.magisk.model.entity.recycler.HomeItem import com.topjohnwu.magisk.model.events.OpenInappLinkEvent +import com.topjohnwu.magisk.model.events.dialog.EnvFixDialog import com.topjohnwu.magisk.model.events.dialog.MagiskInstallDialog import com.topjohnwu.magisk.model.events.dialog.ManagerInstallDialog import com.topjohnwu.magisk.model.observer.Observer import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.ui.home.MagiskState import com.topjohnwu.magisk.utils.KObservableField +import com.topjohnwu.superuser.Shell import me.tatarka.bindingcollectionadapter2.BR import me.tatarka.bindingcollectionadapter2.ItemBinding import me.tatarka.bindingcollectionadapter2.OnItemBind @@ -69,6 +68,8 @@ class HomeViewModel( it.bindExtra(BR.viewModel, this) } + private var shownDialog = false + override fun refresh() = repoMagisk.fetchUpdate() .onErrorReturn { Info.remote } .subscribeK { updateBy(it) } @@ -101,6 +102,8 @@ class HomeViewModel( ) else -> "" } + + ensureEnv() } fun onLinkPressed(link: String) = OpenInappLinkEvent(link).publish() @@ -111,6 +114,27 @@ class HomeViewModel( fun onMagiskPressed() = MagiskInstallDialog().publish() + private fun ensureEnv() { + val invalidStates = listOf( + MagiskState.NOT_INSTALLED, + MagiskState.LOADING + ) + + // Don't bother checking env when magisk is not installed, loading or already has been shown + if (invalidStates.any { it == stateMagisk.value } || shownDialog) { + return + } + + Shell.su("env_check") + .toSingle() + .map { it.exec() } + .filter { !it.isSuccess } + .subscribeK { + shownDialog = true + EnvFixDialog().publish() + } + } + } @Suppress("unused") From d8338f0b489255dd4576c5d3eac2aa6884478c24 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 17 Oct 2019 15:47:11 +0200 Subject: [PATCH 056/254] Fixed event duplication --- app/src/main/java/com/topjohnwu/magisk/base/BaseFragment.kt | 2 -- .../com/topjohnwu/magisk/redesign/compat/CompatActivity.kt | 4 +--- .../com/topjohnwu/magisk/redesign/compat/CompatFragment.kt | 2 -- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/base/BaseFragment.kt b/app/src/main/java/com/topjohnwu/magisk/base/BaseFragment.kt index 368bb4e91..8c0f43b59 100644 --- a/app/src/main/java/com/topjohnwu/magisk/base/BaseFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/base/BaseFragment.kt @@ -4,7 +4,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.annotation.CallSuper import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import androidx.fragment.app.Fragment @@ -39,7 +38,6 @@ abstract class BaseFragment Date: Thu, 17 Oct 2019 15:52:52 +0200 Subject: [PATCH 057/254] Fixed dialog automatically dismissing itself --- .../topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt index d25f7415d..ecd7d800f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt @@ -46,8 +46,8 @@ class MagiskInstallDialog : DialogEvent() { applyMessage("") applyButton(MagiskDialog.ButtonType.POSITIVE) { titleRes = R.string.download_zip_only - preventDismiss = false onClick { + preventDismiss = false TODO() } } From e0e27774adc799fc7c2630ce9be629a22fb45c18 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 17 Oct 2019 18:57:00 +0200 Subject: [PATCH 058/254] Added remaining stubs for the redesign --- app/src/main/java/a/i.java | 7 ---- app/src/main/java/a/i.kt | 7 ++++ .../java/com/topjohnwu/magisk/di/Modules.kt | 3 +- .../com/topjohnwu/magisk/di/RedesignModule.kt | 28 ++++++++++++++++ .../topjohnwu/magisk/di/ViewModelsModule.kt | 7 ---- .../magisk/model/navigation/Navigation.kt | 32 ++++++++++++++++--- .../topjohnwu/magisk/redesign/MainActivity.kt | 13 ++++---- .../magisk/redesign/flash/FlashFragment.kt | 13 ++++++++ .../magisk/redesign/flash/FlashViewModel.kt | 5 +++ .../magisk/redesign/log/LogFragment.kt | 13 ++++++++ .../magisk/redesign/log/LogViewModel.kt | 5 +++ .../magisk/redesign/module/ModuleFragment.kt | 13 ++++++++ .../magisk/redesign/module/ModuleViewModel.kt | 5 +++ .../redesign/request/RequestActivity.kt | 14 ++++++++ .../redesign/request/RequestViewModel.kt | 5 +++ .../redesign/safetynet/SafetynetFragment.kt | 13 ++++++++ .../redesign/safetynet/SafetynetViewModel.kt | 5 +++ .../redesign/settings/SettingsFragment.kt | 13 ++++++++ .../redesign/settings/SettingsViewModel.kt | 5 +++ .../redesign/superuser/SuperuserFragment.kt | 13 ++++++++ .../redesign/superuser/SuperuserViewModel.kt | 5 +++ .../magisk/redesign/theme/ThemeFragment.kt | 13 ++++++++ .../magisk/redesign/theme/ThemeViewModel.kt | 5 +++ .../main/res/layout/activity_request_md2.xml | 23 +++++++++++++ .../main/res/layout/fragment_flash_md2.xml | 23 +++++++++++++ app/src/main/res/layout/fragment_log_md2.xml | 23 +++++++++++++ .../main/res/layout/fragment_module_md2.xml | 23 +++++++++++++ .../res/layout/fragment_safetynet_md2.xml | 23 +++++++++++++ .../main/res/layout/fragment_settings_md2.xml | 23 +++++++++++++ .../res/layout/fragment_superuser_md2.xml | 23 +++++++++++++ .../main/res/layout/fragment_theme_md2.xml | 23 +++++++++++++ 31 files changed, 401 insertions(+), 25 deletions(-) delete mode 100644 app/src/main/java/a/i.java create mode 100644 app/src/main/java/a/i.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/flash/FlashFragment.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/flash/FlashViewModel.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/request/RequestActivity.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/request/RequestViewModel.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetFragment.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetViewModel.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeFragment.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt create mode 100644 app/src/main/res/layout/activity_request_md2.xml create mode 100644 app/src/main/res/layout/fragment_flash_md2.xml create mode 100644 app/src/main/res/layout/fragment_log_md2.xml create mode 100644 app/src/main/res/layout/fragment_module_md2.xml create mode 100644 app/src/main/res/layout/fragment_safetynet_md2.xml create mode 100644 app/src/main/res/layout/fragment_settings_md2.xml create mode 100644 app/src/main/res/layout/fragment_superuser_md2.xml create mode 100644 app/src/main/res/layout/fragment_theme_md2.xml diff --git a/app/src/main/java/a/i.java b/app/src/main/java/a/i.java deleted file mode 100644 index 0f704618c..000000000 --- a/app/src/main/java/a/i.java +++ /dev/null @@ -1,7 +0,0 @@ -package a; - -import com.topjohnwu.magisk.redesign.MainActivity; - -public class i extends MainActivity { - /* stub */ -} diff --git a/app/src/main/java/a/i.kt b/app/src/main/java/a/i.kt new file mode 100644 index 000000000..b02385431 --- /dev/null +++ b/app/src/main/java/a/i.kt @@ -0,0 +1,7 @@ +package a + +import com.topjohnwu.magisk.redesign.MainActivity + +class i : MainActivity() { + /* stub */ +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/di/Modules.kt b/app/src/main/java/com/topjohnwu/magisk/di/Modules.kt index 8fd05268e..45bb22ef9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/Modules.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/Modules.kt @@ -5,5 +5,6 @@ val koinModules = listOf( networkingModule, databaseModule, repositoryModule, - viewModelModules + viewModelModules, + redesignModule ) diff --git a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt new file mode 100644 index 000000000..da9203782 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt @@ -0,0 +1,28 @@ +package com.topjohnwu.magisk.di + +import com.topjohnwu.magisk.redesign.MainViewModel +import com.topjohnwu.magisk.redesign.flash.FlashViewModel +import com.topjohnwu.magisk.redesign.home.HomeViewModel +import com.topjohnwu.magisk.redesign.log.LogViewModel +import com.topjohnwu.magisk.redesign.module.ModuleViewModel +import com.topjohnwu.magisk.redesign.request.RequestViewModel +import com.topjohnwu.magisk.redesign.safetynet.SafetynetViewModel +import com.topjohnwu.magisk.redesign.settings.SettingsViewModel +import com.topjohnwu.magisk.redesign.superuser.SuperuserViewModel +import com.topjohnwu.magisk.redesign.theme.ThemeViewModel +import org.koin.androidx.viewmodel.dsl.viewModel +import org.koin.dsl.module + +val redesignModule = module { + viewModel { FlashViewModel() } + viewModel { HomeViewModel(get()) } + viewModel { LogViewModel() } + viewModel { ModuleViewModel() } + viewModel { RequestViewModel() } + viewModel { SafetynetViewModel() } + viewModel { SettingsViewModel() } + viewModel { SuperuserViewModel() } + viewModel { ThemeViewModel() } + + viewModel { MainViewModel() } +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt index daaef422f..b76c897f0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt @@ -11,8 +11,6 @@ import com.topjohnwu.magisk.ui.superuser.SuperuserViewModel import com.topjohnwu.magisk.ui.surequest.SuRequestViewModel import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module -import com.topjohnwu.magisk.redesign.MainViewModel as RedesignViewModel -import com.topjohnwu.magisk.redesign.home.HomeViewModel as RedesignHomeViewModel val viewModelModules = module { @@ -26,9 +24,4 @@ val viewModelModules = module { FlashViewModel(action, file, additional, get()) } viewModel { SuRequestViewModel(get(), get(), get(SUTimeout), get()) } - - // redesign - - viewModel { RedesignViewModel() } - viewModel { RedesignHomeViewModel(get()) } } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt index 249a7068f..af53b1662 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt @@ -16,6 +16,10 @@ import com.topjohnwu.magisk.ui.settings.SettingsFragment import com.topjohnwu.magisk.ui.superuser.SuperuserFragment import com.topjohnwu.magisk.redesign.MainActivity as RedesignActivity import com.topjohnwu.magisk.redesign.home.HomeFragment as RedesignHomeFragment +import com.topjohnwu.magisk.redesign.log.LogFragment as RedesignLogFragment +import com.topjohnwu.magisk.redesign.module.ModuleFragment as RedesignModulesFragment +import com.topjohnwu.magisk.redesign.settings.SettingsFragment as RedesignSettingsFragment +import com.topjohnwu.magisk.redesign.superuser.SuperuserFragment as RedesignSuperuserFragment object Navigation { @@ -35,11 +39,21 @@ object Navigation { } fun superuser() = MagiskNavigationEvent { - navDirections { destination = SuperuserFragment::class } + navDirections { + destination = when { + Config.redesign -> RedesignSuperuserFragment::class + else -> SuperuserFragment::class + } + } } fun modules() = MagiskNavigationEvent { - navDirections { destination = ModulesFragment::class } + navDirections { + destination = when { + Config.redesign -> RedesignModulesFragment::class + else -> ModulesFragment::class + } + } } fun repos() = MagiskNavigationEvent { @@ -51,11 +65,21 @@ object Navigation { } fun log() = MagiskNavigationEvent { - navDirections { destination = LogFragment::class } + navDirections { + destination = when { + Config.redesign -> RedesignLogFragment::class + else -> LogFragment::class + } + } } fun settings() = MagiskNavigationEvent { - navDirections { destination = SettingsFragment::class } + navDirections { + destination = when { + Config.redesign -> RedesignSettingsFragment::class + else -> SettingsFragment::class + } + } } fun fromSection(section: String) = when (section) { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index 59a2f22b7..37bbbee26 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -16,13 +16,14 @@ import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.redesign.compat.CompatActivity import com.topjohnwu.magisk.redesign.compat.CompatNavigationDelegate import com.topjohnwu.magisk.redesign.home.HomeFragment -import com.topjohnwu.magisk.ui.log.LogFragment -import com.topjohnwu.magisk.ui.module.ModulesFragment -import com.topjohnwu.magisk.ui.settings.SettingsFragment -import com.topjohnwu.magisk.ui.superuser.SuperuserFragment +import com.topjohnwu.magisk.redesign.log.LogFragment +import com.topjohnwu.magisk.redesign.module.ModuleFragment +import com.topjohnwu.magisk.redesign.settings.SettingsFragment +import com.topjohnwu.magisk.redesign.superuser.SuperuserFragment import com.topjohnwu.magisk.utils.HideTopViewOnScrollBehavior import com.topjohnwu.superuser.Shell import org.koin.androidx.viewmodel.ext.android.viewModel +import kotlin.reflect.KClass open class MainActivity : CompatActivity(), FragNavController.TransactionListener { @@ -33,9 +34,9 @@ open class MainActivity : CompatActivity( override val navigation by lazy { CompatNavigationDelegate(this, this) } - override val baseFragments = listOf( + override val baseFragments: List> = listOf( HomeFragment::class, - ModulesFragment::class, + ModuleFragment::class, SuperuserFragment::class, LogFragment::class, SettingsFragment::class diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/flash/FlashFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/flash/FlashFragment.kt new file mode 100644 index 000000000..63366c484 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/flash/FlashFragment.kt @@ -0,0 +1,13 @@ +package com.topjohnwu.magisk.redesign.flash + +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.databinding.FragmentFlashMd2Binding +import com.topjohnwu.magisk.redesign.compat.CompatFragment +import org.koin.androidx.viewmodel.ext.android.viewModel + +class FlashFragment : CompatFragment() { + + override val layoutRes = R.layout.fragment_flash_md2 + override val viewModel by viewModel() + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/flash/FlashViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/flash/FlashViewModel.kt new file mode 100644 index 000000000..ff0fbc1cf --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/flash/FlashViewModel.kt @@ -0,0 +1,5 @@ +package com.topjohnwu.magisk.redesign.flash + +import com.topjohnwu.magisk.redesign.compat.CompatViewModel + +class FlashViewModel : CompatViewModel() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt new file mode 100644 index 000000000..799331eb2 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt @@ -0,0 +1,13 @@ +package com.topjohnwu.magisk.redesign.log + +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.databinding.FragmentLogMd2Binding +import com.topjohnwu.magisk.redesign.compat.CompatFragment +import org.koin.androidx.viewmodel.ext.android.viewModel + +class LogFragment : CompatFragment() { + + override val layoutRes = R.layout.fragment_log_md2 + override val viewModel by viewModel() + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt new file mode 100644 index 000000000..1b3ac4dbe --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt @@ -0,0 +1,5 @@ +package com.topjohnwu.magisk.redesign.log + +import com.topjohnwu.magisk.redesign.compat.CompatViewModel + +class LogViewModel : CompatViewModel() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt new file mode 100644 index 000000000..bd963fb4f --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt @@ -0,0 +1,13 @@ +package com.topjohnwu.magisk.redesign.module + +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.databinding.FragmentModuleMd2Binding +import com.topjohnwu.magisk.redesign.compat.CompatFragment +import org.koin.androidx.viewmodel.ext.android.viewModel + +class ModuleFragment : CompatFragment() { + + override val layoutRes = R.layout.fragment_module_md2 + override val viewModel by viewModel() + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt new file mode 100644 index 000000000..8ae35ecb0 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -0,0 +1,5 @@ +package com.topjohnwu.magisk.redesign.module + +import com.topjohnwu.magisk.redesign.compat.CompatViewModel + +class ModuleViewModel : CompatViewModel() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/request/RequestActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/request/RequestActivity.kt new file mode 100644 index 000000000..8e8303bfb --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/request/RequestActivity.kt @@ -0,0 +1,14 @@ +package com.topjohnwu.magisk.redesign.request + +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.databinding.ActivityRequestMd2Binding +import com.topjohnwu.magisk.redesign.compat.CompatActivity +import org.koin.androidx.viewmodel.ext.android.viewModel + +class RequestActivity : CompatActivity() { + + override val navHost = TODO() + override val layoutRes = R.layout.activity_request_md2 + override val viewModel by viewModel() + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/request/RequestViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/request/RequestViewModel.kt new file mode 100644 index 000000000..92920eea8 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/request/RequestViewModel.kt @@ -0,0 +1,5 @@ +package com.topjohnwu.magisk.redesign.request + +import com.topjohnwu.magisk.redesign.compat.CompatViewModel + +class RequestViewModel : CompatViewModel() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetFragment.kt new file mode 100644 index 000000000..419bbcd41 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetFragment.kt @@ -0,0 +1,13 @@ +package com.topjohnwu.magisk.redesign.safetynet + +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.databinding.FragmentSafetynetMd2Binding +import com.topjohnwu.magisk.redesign.compat.CompatFragment +import org.koin.androidx.viewmodel.ext.android.viewModel + +class SafetynetFragment : CompatFragment() { + + override val layoutRes = R.layout.fragment_safetynet_md2 + override val viewModel by viewModel() + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetViewModel.kt new file mode 100644 index 000000000..637f3cff9 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetViewModel.kt @@ -0,0 +1,5 @@ +package com.topjohnwu.magisk.redesign.safetynet + +import com.topjohnwu.magisk.redesign.compat.CompatViewModel + +class SafetynetViewModel : CompatViewModel() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt new file mode 100644 index 000000000..1135e1ee5 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt @@ -0,0 +1,13 @@ +package com.topjohnwu.magisk.redesign.settings + +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.databinding.FragmentSettingsMd2Binding +import com.topjohnwu.magisk.redesign.compat.CompatFragment +import org.koin.androidx.viewmodel.ext.android.viewModel + +class SettingsFragment : CompatFragment() { + + override val layoutRes = R.layout.fragment_settings_md2 + override val viewModel by viewModel() + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt new file mode 100644 index 000000000..76b92fe19 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt @@ -0,0 +1,5 @@ +package com.topjohnwu.magisk.redesign.settings + +import com.topjohnwu.magisk.redesign.compat.CompatViewModel + +class SettingsViewModel : CompatViewModel() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt new file mode 100644 index 000000000..16f4ff578 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt @@ -0,0 +1,13 @@ +package com.topjohnwu.magisk.redesign.superuser + +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.databinding.FragmentSuperuserMd2Binding +import com.topjohnwu.magisk.redesign.compat.CompatFragment +import org.koin.androidx.viewmodel.ext.android.viewModel + +class SuperuserFragment : CompatFragment() { + + override val layoutRes = R.layout.fragment_superuser_md2 + override val viewModel by viewModel() + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt new file mode 100644 index 000000000..f5f7e57f7 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt @@ -0,0 +1,5 @@ +package com.topjohnwu.magisk.redesign.superuser + +import com.topjohnwu.magisk.redesign.compat.CompatViewModel + +class SuperuserViewModel : CompatViewModel() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeFragment.kt new file mode 100644 index 000000000..830846b49 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeFragment.kt @@ -0,0 +1,13 @@ +package com.topjohnwu.magisk.redesign.theme + +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.databinding.FragmentThemeMd2Binding +import com.topjohnwu.magisk.redesign.compat.CompatFragment +import org.koin.androidx.viewmodel.ext.android.viewModel + +class ThemeFragment : CompatFragment() { + + override val layoutRes = R.layout.fragment_theme_md2 + override val viewModel by viewModel() + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt new file mode 100644 index 000000000..171418aeb --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt @@ -0,0 +1,5 @@ +package com.topjohnwu.magisk.redesign.theme + +import com.topjohnwu.magisk.redesign.compat.CompatViewModel + +class ThemeViewModel : CompatViewModel() \ No newline at end of file diff --git a/app/src/main/res/layout/activity_request_md2.xml b/app/src/main/res/layout/activity_request_md2.xml new file mode 100644 index 000000000..7ab7d92e8 --- /dev/null +++ b/app/src/main/res/layout/activity_request_md2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_flash_md2.xml b/app/src/main/res/layout/fragment_flash_md2.xml new file mode 100644 index 000000000..d7922085b --- /dev/null +++ b/app/src/main/res/layout/fragment_flash_md2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_log_md2.xml b/app/src/main/res/layout/fragment_log_md2.xml new file mode 100644 index 000000000..7c4a5980c --- /dev/null +++ b/app/src/main/res/layout/fragment_log_md2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_module_md2.xml b/app/src/main/res/layout/fragment_module_md2.xml new file mode 100644 index 000000000..aec90e437 --- /dev/null +++ b/app/src/main/res/layout/fragment_module_md2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_safetynet_md2.xml b/app/src/main/res/layout/fragment_safetynet_md2.xml new file mode 100644 index 000000000..6afafba71 --- /dev/null +++ b/app/src/main/res/layout/fragment_safetynet_md2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings_md2.xml b/app/src/main/res/layout/fragment_settings_md2.xml new file mode 100644 index 000000000..640519ada --- /dev/null +++ b/app/src/main/res/layout/fragment_settings_md2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_superuser_md2.xml b/app/src/main/res/layout/fragment_superuser_md2.xml new file mode 100644 index 000000000..9bc1e4587 --- /dev/null +++ b/app/src/main/res/layout/fragment_superuser_md2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_theme_md2.xml b/app/src/main/res/layout/fragment_theme_md2.xml new file mode 100644 index 000000000..5d47e2e50 --- /dev/null +++ b/app/src/main/res/layout/fragment_theme_md2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file From 0f4326151f447f983bc2d27aa8dedb2e501a43d0 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 17 Oct 2019 19:26:25 +0200 Subject: [PATCH 059/254] Added titles --- .../java/com/topjohnwu/magisk/redesign/log/LogFragment.kt | 6 ++++++ .../com/topjohnwu/magisk/redesign/module/ModuleFragment.kt | 6 ++++++ .../magisk/redesign/superuser/SuperuserFragment.kt | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt index 799331eb2..b5e670c24 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt @@ -10,4 +10,10 @@ class LogFragment : CompatFragment() { override val layoutRes = R.layout.fragment_log_md2 override val viewModel by viewModel() + override fun onStart() { + super.onStart() + + activity.title = resources.getString(R.string.section_log) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt index bd963fb4f..51117413f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt @@ -10,4 +10,10 @@ class ModuleFragment : CompatFragment override val layoutRes = R.layout.fragment_module_md2 override val viewModel by viewModel() + override fun onStart() { + super.onStart() + + activity.title = resources.getString(R.string.section_modules) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt index 16f4ff578..cbaa8f459 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt @@ -10,4 +10,10 @@ class SuperuserFragment : CompatFragment() + override fun onStart() { + super.onStart() + + activity.title = resources.getString(R.string.section_superuser) + } + } \ No newline at end of file From 28fcbbcf7bc984e842a4db84a9b565866cf86570 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 17 Oct 2019 19:26:35 +0200 Subject: [PATCH 060/254] Added basic preferences to settings --- .../magisk/model/events/ViewEvents.kt | 12 ++- .../redesign/settings/SettingsFragment.kt | 9 ++ .../redesign/settings/SettingsViewModel.kt | 27 +++++- .../main/res/layout/fragment_settings_md2.xml | 88 ++++++++++++++++++- 4 files changed, 131 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt index 48c25fb92..9c3c725da 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt @@ -85,4 +85,14 @@ class BackPressEvent : ViewEvent(), ActivityExecutor { } } -class DieEvent : ViewEvent() +class DieEvent : ViewEvent(), ActivityExecutor { + override fun invoke(activity: AppCompatActivity) { + activity.finish() + } +} + +class RecreateEvent : ViewEvent(), ActivityExecutor { + override fun invoke(activity: AppCompatActivity) { + activity.recreate() + } +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt index 1135e1ee5..6f665624b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt @@ -1,5 +1,6 @@ package com.topjohnwu.magisk.redesign.settings +import android.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentSettingsMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment @@ -10,4 +11,12 @@ class SettingsFragment : CompatFragment() + override fun consumeSystemWindowInsets(insets: Insets) = insets + + override fun onStart() { + super.onStart() + + activity.title = resources.getString(R.string.section_settings) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt index 76b92fe19..0014b8cd8 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt @@ -1,5 +1,30 @@ package com.topjohnwu.magisk.redesign.settings +import com.topjohnwu.magisk.Config +import com.topjohnwu.magisk.extensions.addOnPropertyChangedCallback +import com.topjohnwu.magisk.extensions.toggle +import com.topjohnwu.magisk.model.events.DieEvent +import com.topjohnwu.magisk.model.events.RecreateEvent import com.topjohnwu.magisk.redesign.compat.CompatViewModel +import com.topjohnwu.magisk.utils.KObservableField -class SettingsViewModel : CompatViewModel() \ No newline at end of file +class SettingsViewModel : CompatViewModel() { + + val redesign = KObservableField(Config.redesign) + val darkTheme = KObservableField(Config.darkTheme) + + init { + //todo make observable preference + redesign.addOnPropertyChangedCallback { + Config.redesign = redesign.value + DieEvent().publish() + } + darkTheme.addOnPropertyChangedCallback { + Config.darkTheme = darkTheme.value + RecreateEvent().publish() + } + } + + fun toggle(item: KObservableField) = item.toggle() + +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings_md2.xml b/app/src/main/res/layout/fragment_settings_md2.xml index 640519ada..d989ef96c 100644 --- a/app/src/main/res/layout/fragment_settings_md2.xml +++ b/app/src/main/res/layout/fragment_settings_md2.xml @@ -1,5 +1,7 @@ - + @@ -12,11 +14,91 @@ + android:clipToPadding="false" + android:fillViewport="true" + android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l2}" + android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/l2}" + tools:layout_marginTop="24dp"> + android:layout_height="wrap_content"> + + + + + + + + + + + + + + + + + + + + + + + + + + From 96ef9cdbeec2ef5d89a1738dbe545b48d56fc83a Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 18 Oct 2019 16:39:08 +0200 Subject: [PATCH 061/254] Fixed insets not being implicitly asked for by the framework resulting in no coverage for other than main fragments --- .../magisk/redesign/compat/CompatDelegate.kt | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt index 6ac1f00e4..cd4792956 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt @@ -1,6 +1,7 @@ package com.topjohnwu.magisk.redesign.compat import android.graphics.Insets +import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat @@ -11,6 +12,7 @@ import com.topjohnwu.magisk.model.events.FragmentExecutor import com.topjohnwu.magisk.model.events.ViewEvent import timber.log.Timber + class CompatDelegate internal constructor( private val view: CompatView<*> ) { @@ -43,8 +45,18 @@ class CompatDelegate internal constructor( insets.asInsets() .also { view.peekSystemWindowInsets(it) } .let { view.consumeSystemWindowInsets(it) } - .also { if (it != Insets.NONE) view.viewModel.insets.value = it } - .subtractBy(insets) + ?.also { view.viewModel.insets.value = it } + ?.subtractBy(insets) ?: insets + } + if (ViewCompat.isAttachedToWindow(view.viewRoot)) { + ViewCompat.requestApplyInsets(view.viewRoot) + } else { + view.viewRoot.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener { + override fun onViewDetachedFromWindow(v: View) = Unit + override fun onViewAttachedToWindow(v: View) { + ViewCompat.requestApplyInsets(v) + } + }) } } From 512f533a801d535e2dd36e42f1f7277bbb76fb12 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 18 Oct 2019 17:04:41 +0200 Subject: [PATCH 062/254] Added hide fragment for future use --- .../com/topjohnwu/magisk/di/RedesignModule.kt | 2 + .../magisk/model/navigation/Navigation.kt | 8 ++- .../topjohnwu/magisk/redesign/MainActivity.kt | 30 ++++++++- .../magisk/redesign/compat/CompatView.kt | 2 +- .../magisk/redesign/hide/HideFragment.kt | 20 ++++++ .../magisk/redesign/hide/HideViewModel.kt | 5 ++ .../redesign/superuser/SuperuserFragment.kt | 3 + .../redesign/superuser/SuperuserViewModel.kt | 7 ++- app/src/main/res/layout/fragment_hide_md2.xml | 23 +++++++ .../res/layout/fragment_superuser_md2.xml | 62 ++++++++++++++++++- 10 files changed, 153 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt create mode 100644 app/src/main/res/layout/fragment_hide_md2.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt index da9203782..1bd14e65e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt @@ -2,6 +2,7 @@ package com.topjohnwu.magisk.di import com.topjohnwu.magisk.redesign.MainViewModel import com.topjohnwu.magisk.redesign.flash.FlashViewModel +import com.topjohnwu.magisk.redesign.hide.HideViewModel import com.topjohnwu.magisk.redesign.home.HomeViewModel import com.topjohnwu.magisk.redesign.log.LogViewModel import com.topjohnwu.magisk.redesign.module.ModuleViewModel @@ -15,6 +16,7 @@ import org.koin.dsl.module val redesignModule = module { viewModel { FlashViewModel() } + viewModel { HideViewModel() } viewModel { HomeViewModel(get()) } viewModel { LogViewModel() } viewModel { ModuleViewModel() } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt index af53b1662..15a03c094 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt @@ -15,6 +15,7 @@ import com.topjohnwu.magisk.ui.module.ReposFragment import com.topjohnwu.magisk.ui.settings.SettingsFragment import com.topjohnwu.magisk.ui.superuser.SuperuserFragment import com.topjohnwu.magisk.redesign.MainActivity as RedesignActivity +import com.topjohnwu.magisk.redesign.hide.HideFragment as RedesignHideFragment import com.topjohnwu.magisk.redesign.home.HomeFragment as RedesignHomeFragment import com.topjohnwu.magisk.redesign.log.LogFragment as RedesignLogFragment import com.topjohnwu.magisk.redesign.module.ModuleFragment as RedesignModulesFragment @@ -61,7 +62,12 @@ object Navigation { } fun hide() = MagiskNavigationEvent { - navDirections { destination = MagiskHideFragment::class } + navDirections { + destination = when { + Config.redesign -> RedesignHideFragment::class + else -> MagiskHideFragment::class + } + } } fun log() = MagiskNavigationEvent { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index 37bbbee26..1a0a43521 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -2,11 +2,15 @@ package com.topjohnwu.magisk.redesign import android.graphics.Insets import android.os.Bundle +import android.view.MenuItem +import android.view.ViewGroup import android.view.ViewTreeObserver import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.view.isVisible import androidx.core.view.setPadding import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment +import androidx.interpolator.view.animation.FastOutSlowInInterpolator import com.google.android.material.card.MaterialCardView import com.ncapdevi.fragnav.FragNavController import com.topjohnwu.magisk.Const @@ -92,6 +96,14 @@ open class MainActivity : CompatActivity( super.onDestroy() } + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + android.R.id.home -> onBackPressed() + else -> return super.onOptionsItemSelected(item) + } + return true + } + override fun onTabTransaction(fragment: Fragment?, index: Int) { setDisplayHomeAsUpEnabled(false) } @@ -99,9 +111,21 @@ open class MainActivity : CompatActivity( override fun onFragmentTransaction( fragment: Fragment?, transactionType: FragNavController.TransactionType - ) = when (transactionType) { - FragNavController.TransactionType.PUSH -> setDisplayHomeAsUpEnabled(!navigation.isRoot) - else -> Unit //dunno might be useful + ) { + setDisplayHomeAsUpEnabled(!navigation.isRoot) + + val lapam = binding.mainBottomBar.layoutParams as ViewGroup.MarginLayoutParams + val height = binding.mainBottomBar.measuredHeight + val verticalMargin = lapam.let { it.topMargin + it.bottomMargin } + val maxTranslation = height + verticalMargin + val translation = if (navigation.isRoot) 0 else maxTranslation + + binding.mainBottomBar.animate() + .translationY(translation.toFloat()) + .setInterpolator(FastOutSlowInInterpolator()) + .withStartAction { if (translation == 0) binding.mainBottomBar.isVisible = true } + .withEndAction { if (translation > 0) binding.mainBottomBar.isVisible = false } + .start() } override fun peekSystemWindowInsets(insets: Insets) { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatView.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatView.kt index 6257716c7..941fadcc6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatView.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatView.kt @@ -10,6 +10,6 @@ internal interface CompatView { val navigation: CompatNavigationDelegate<*>? fun peekSystemWindowInsets(insets: Insets) = Unit - fun consumeSystemWindowInsets(insets: Insets) = Insets.NONE + fun consumeSystemWindowInsets(insets: Insets): Insets? = null } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt new file mode 100644 index 000000000..d6d9459b4 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt @@ -0,0 +1,20 @@ +package com.topjohnwu.magisk.redesign.hide + +import android.content.Context +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.databinding.FragmentHideMd2Binding +import com.topjohnwu.magisk.redesign.compat.CompatFragment +import org.koin.androidx.viewmodel.ext.android.viewModel + +class HideFragment : CompatFragment() { + + override val layoutRes = R.layout.fragment_hide_md2 + override val viewModel by viewModel() + + override fun onAttach(context: Context) { + super.onAttach(context) + + activity.setTitle(R.string.magiskhide) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt new file mode 100644 index 000000000..683d5007d --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt @@ -0,0 +1,5 @@ +package com.topjohnwu.magisk.redesign.hide + +import com.topjohnwu.magisk.redesign.compat.CompatViewModel + +class HideViewModel : CompatViewModel() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt index cbaa8f459..1e3d3a772 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt @@ -1,5 +1,6 @@ package com.topjohnwu.magisk.redesign.superuser +import android.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentSuperuserMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment @@ -10,6 +11,8 @@ class SuperuserFragment : CompatFragment() + override fun consumeSystemWindowInsets(insets: Insets) = insets + override fun onStart() { super.onStart() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt index f5f7e57f7..868d200af 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt @@ -1,5 +1,10 @@ package com.topjohnwu.magisk.redesign.superuser +import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.redesign.compat.CompatViewModel -class SuperuserViewModel : CompatViewModel() \ No newline at end of file +class SuperuserViewModel : CompatViewModel() { + + fun hidePressed() = Navigation.hide().publish() + +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_hide_md2.xml b/app/src/main/res/layout/fragment_hide_md2.xml new file mode 100644 index 000000000..30bddc477 --- /dev/null +++ b/app/src/main/res/layout/fragment_hide_md2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_superuser_md2.xml b/app/src/main/res/layout/fragment_superuser_md2.xml index 9bc1e4587..d8bb7c4c3 100644 --- a/app/src/main/res/layout/fragment_superuser_md2.xml +++ b/app/src/main/res/layout/fragment_superuser_md2.xml @@ -1,5 +1,7 @@ - + @@ -12,11 +14,65 @@ + android:clipToPadding="false" + android:fillViewport="true" + android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l2}" + android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/l2}" + tools:layout_marginTop="24dp"> + android:layout_height="wrap_content"> + + + + + + + + + + + + + + + + From a539ffb188b549cafcf2aef698776d1a397a2cfe Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 18 Oct 2019 18:15:22 +0200 Subject: [PATCH 063/254] Updated styles due to low accessibility --- app/src/main/res/values-night/styles_md2.xml | 4 ++-- app/src/main/res/values/styles_md2.xml | 2 +- app/src/main/res/values/styles_md2_impl.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-night/styles_md2.xml b/app/src/main/res/values-night/styles_md2.xml index aef51115d..402be7ab1 100644 --- a/app/src/main/res/values-night/styles_md2.xml +++ b/app/src/main/res/values-night/styles_md2.xml @@ -7,14 +7,14 @@ #00C853 #8000C853 #0D0D0D - #D9191919 + #1F1F1F #F2F2F2 #D9E6E6E6 #F2F2F2 ?colorOnSurface #CC0047 #F2F2F2 - #BABABA + #D8D8D8 #80BABABA #808080 #66808080 diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index 6eeaebda3..e61597ea5 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -90,7 +90,7 @@ #00C853 #8000C853 #F2F2F2 - #D9E6E6E6 + #D9D9D9D9 #F2F2F2 #D9E6E6E6 #F2F2F2 diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index 717fa55e1..7654b3526 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -33,7 +33,7 @@ variant. Make sure to use style referenced by attribute defined it attrs.xml. \ No newline at end of file diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index e61597ea5..7e7c9b42b 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -90,7 +90,7 @@ #00C853 #8000C853 #F2F2F2 - #D9D9D9D9 + #E8E8E8 #F2F2F2 #D9E6E6E6 #F2F2F2 diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index 7654b3526..f570f079a 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -38,7 +38,7 @@ variant. Make sure to use style referenced by attribute defined it attrs.xml. + + \ No newline at end of file From c44a942fb75830f435d010f4e898ea9c4f7efff3 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 19 Oct 2019 22:28:01 +0200 Subject: [PATCH 070/254] Added entry for safetynet attestation --- .../magisk/model/navigation/Navigation.kt | 5 ++ .../redesign/safetynet/SafetynetFragment.kt | 5 ++ .../redesign/superuser/SuperuserViewModel.kt | 1 + .../res/layout/fragment_superuser_md2.xml | 50 +++++++++++++++++++ app/src/main/res/values/strings_md2.xml | 2 + 5 files changed, 63 insertions(+) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt index 15a03c094..6e2b76aba 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt @@ -6,6 +6,7 @@ import android.os.Build import com.topjohnwu.magisk.ClassMap import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.Const +import com.topjohnwu.magisk.redesign.safetynet.SafetynetFragment import com.topjohnwu.magisk.ui.MainActivity import com.topjohnwu.magisk.ui.hide.MagiskHideFragment import com.topjohnwu.magisk.ui.home.HomeFragment @@ -70,6 +71,10 @@ object Navigation { } } + fun safetynet() = MagiskNavigationEvent { + navDirections { destination = SafetynetFragment::class } + } + fun log() = MagiskNavigationEvent { navDirections { destination = when { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetFragment.kt index 419bbcd41..44e83d184 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetFragment.kt @@ -10,4 +10,9 @@ class SafetynetFragment : CompatFragment() + override fun onStart() { + super.onStart() + activity.setTitle(R.string.safetyNet) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt index 3baf7b305..82ac3c0de 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt @@ -66,6 +66,7 @@ class SuperuserViewModel( // --- + fun safetynetPressed() = Navigation.safetynet().publish() fun hidePressed() = Navigation.hide().publish() fun deletePressed(item: PolicyRvItem) { diff --git a/app/src/main/res/layout/fragment_superuser_md2.xml b/app/src/main/res/layout/fragment_superuser_md2.xml index f019e71a4..8c690eba3 100644 --- a/app/src/main/res/layout/fragment_superuser_md2.xml +++ b/app/src/main/res/layout/fragment_superuser_md2.xml @@ -77,6 +77,56 @@ + + + + + + + + + + + + + + Source XDA + SafetyNet + \ No newline at end of file From b910db322b2f40cbe6bd89cc7afc1069eadd1a86 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sun, 20 Oct 2019 10:54:55 +0200 Subject: [PATCH 071/254] Fixed snackbar behavior in contrast with bottom navigation --- .../topjohnwu/magisk/redesign/MainActivity.kt | 4 + .../utils/HideBottomViewOnScrollBehavior.kt | 77 +++++++++++++++++++ app/src/main/res/layout/activity_main_md2.xml | 1 - 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/utils/HideBottomViewOnScrollBehavior.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index 1a0a43521..6b59776a0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -24,6 +24,7 @@ import com.topjohnwu.magisk.redesign.log.LogFragment import com.topjohnwu.magisk.redesign.module.ModuleFragment import com.topjohnwu.magisk.redesign.settings.SettingsFragment import com.topjohnwu.magisk.redesign.superuser.SuperuserFragment +import com.topjohnwu.magisk.utils.HideBottomViewOnScrollBehavior import com.topjohnwu.magisk.utils.HideTopViewOnScrollBehavior import com.topjohnwu.superuser.Shell import org.koin.androidx.viewmodel.ext.android.viewModel @@ -62,6 +63,9 @@ open class MainActivity : CompatActivity( binding.mainToolbarWrapper.updateLayoutParams { behavior = HideTopViewOnScrollBehavior() } + binding.mainBottomBar.updateLayoutParams { + behavior = HideBottomViewOnScrollBehavior() + } binding.mainNavigation.setOnNavigationItemSelectedListener { when (it.itemId) { R.id.homeFragment -> Navigation.home() diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/HideBottomViewOnScrollBehavior.kt b/app/src/main/java/com/topjohnwu/magisk/utils/HideBottomViewOnScrollBehavior.kt new file mode 100644 index 000000000..521a1fd5d --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/utils/HideBottomViewOnScrollBehavior.kt @@ -0,0 +1,77 @@ +package com.topjohnwu.magisk.utils + +import android.view.View +import android.view.ViewGroup +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.view.isVisible +import androidx.core.view.updateLayoutParams +import androidx.interpolator.view.animation.FastOutSlowInInterpolator +import com.google.android.material.behavior.HideBottomViewOnScrollBehavior +import com.google.android.material.snackbar.Snackbar +import com.topjohnwu.magisk.R +import kotlin.math.roundToInt + +class HideBottomViewOnScrollBehavior : HideBottomViewOnScrollBehavior() { + + override fun layoutDependsOn(parent: CoordinatorLayout, child: T, dependency: View) = + super.layoutDependsOn(parent, child, dependency) or (dependency is Snackbar.SnackbarLayout) + + override fun onDependentViewChanged( + parent: CoordinatorLayout, + child: T, + dependency: View + ) = when (dependency) { + is Snackbar.SnackbarLayout -> onDependentViewChanged(parent, child, dependency) + else -> super.onDependentViewChanged(parent, child, dependency) + } + + override fun onDependentViewRemoved( + parent: CoordinatorLayout, + child: T, + dependency: View + ) = when (dependency) { + is Snackbar.SnackbarLayout -> onDependentViewRemoved(parent, child, dependency) + else -> super.onDependentViewRemoved(parent, child, dependency) + } + + //--- + + private fun onDependentViewChanged( + parent: CoordinatorLayout, + child: T, + dependency: Snackbar.SnackbarLayout + ): Boolean { + val viewMargin = (child.layoutParams as ViewGroup.MarginLayoutParams).bottomMargin + val additionalMargin = dependency.resources.getDimension(R.dimen.l1).roundToInt() + val translation = dependency.height + additionalMargin + + dependency.updateLayoutParams { + bottomMargin = viewMargin + } + + // checks whether the navigation is not hidden via scroll + if (child.isVisible && child.translationY <= 0) { + child.translationY(-translation.toFloat()) + } + return false + } + + private fun onDependentViewRemoved( + parent: CoordinatorLayout, + child: T, + dependency: Snackbar.SnackbarLayout + ) { + // checks whether the navigation is not hidden via scroll + if (child.isVisible && child.translationY <= 0) { + child.translationY(0f) + } + } + + //--- + + private fun View.translationY(destination: Float) = animate() + .translationY(destination) + .setInterpolator(FastOutSlowInInterpolator()) + .start() + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_md2.xml b/app/src/main/res/layout/activity_main_md2.xml index a9873680d..84b29e78c 100644 --- a/app/src/main/res/layout/activity_main_md2.xml +++ b/app/src/main/res/layout/activity_main_md2.xml @@ -56,7 +56,6 @@ style="?styleCardElevated" android:layout_width="match_parent" android:layout_height="wrap_content" - app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior" android:layout_gravity="bottom" android:layout_marginStart="@dimen/l1" android:layout_marginEnd="@dimen/l1" From 44f7c9a5459fe42520021f7602a4927e90d6d48f Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sun, 20 Oct 2019 11:14:49 +0200 Subject: [PATCH 072/254] Added animations for toolbar transitions --- .../java/com/topjohnwu/magisk/extensions/XView.kt | 11 ++++++++++- .../com/topjohnwu/magisk/redesign/MainActivity.kt | 4 +++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/XView.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/XView.kt index b34338d3d..dc7773f4a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/XView.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/XView.kt @@ -1,7 +1,11 @@ package com.topjohnwu.magisk.extensions import android.view.View +import android.view.ViewGroup import android.view.ViewTreeObserver +import androidx.interpolator.view.animation.FastOutSlowInInterpolator +import androidx.transition.AutoTransition +import androidx.transition.TransitionManager fun View.setOnViewReadyListener(callback: () -> Unit) = addOnGlobalLayoutListener(true, callback) @@ -11,4 +15,9 @@ fun View.addOnGlobalLayoutListener(oneShot: Boolean = false, callback: () -> Uni if (oneShot) viewTreeObserver.removeOnGlobalLayoutListener(this) callback() } - }) \ No newline at end of file + }) + +fun ViewGroup.startAnimations() { + val transition = AutoTransition().setInterpolator(FastOutSlowInInterpolator()) + TransitionManager.beginDelayedTransition(this, transition) +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index 6b59776a0..02871a3af 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -16,6 +16,7 @@ import com.ncapdevi.fragnav.FragNavController import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ActivityMainMd2Binding +import com.topjohnwu.magisk.extensions.startAnimations import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.redesign.compat.CompatActivity import com.topjohnwu.magisk.redesign.compat.CompatNavigationDelegate @@ -136,7 +137,8 @@ open class MainActivity : CompatActivity( viewModel.insets.value = insets } - fun setDisplayHomeAsUpEnabled(isEnabled: Boolean) { + private fun setDisplayHomeAsUpEnabled(isEnabled: Boolean) { + binding.mainToolbar.startAnimations() when { isEnabled -> binding.mainToolbar.setNavigationIcon(R.drawable.ic_back_md2) else -> binding.mainToolbar.navigationIcon = null From ba588d109719d35e497db5b0cf8571f5090d56dc Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sun, 20 Oct 2019 11:24:45 +0200 Subject: [PATCH 073/254] Updated position of quick links on superuser screen --- .../res/layout/fragment_superuser_md2.xml | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/layout/fragment_superuser_md2.xml b/app/src/main/res/layout/fragment_superuser_md2.xml index 8c690eba3..ecdbae57a 100644 --- a/app/src/main/res/layout/fragment_superuser_md2.xml +++ b/app/src/main/res/layout/fragment_superuser_md2.xml @@ -23,14 +23,17 @@ tools:layout_marginTop="24dp" tools:paddingTop="@dimen/l1"> - @@ -103,9 +107,9 @@ + + - + From c954a4f7bcc13b93df81d595a7baad2ba213abcf Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sun, 20 Oct 2019 11:29:04 +0200 Subject: [PATCH 074/254] Updated icons and texts for magisk hide and safetynet --- app/src/main/res/drawable/ic_hide_md2.xml | 10 ++++++++++ app/src/main/res/drawable/ic_safetynet_md2.xml | 10 ++++++++++ app/src/main/res/layout/fragment_superuser_md2.xml | 6 +++--- app/src/main/res/values/strings_md2.xml | 2 ++ 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable/ic_hide_md2.xml create mode 100644 app/src/main/res/drawable/ic_safetynet_md2.xml diff --git a/app/src/main/res/drawable/ic_hide_md2.xml b/app/src/main/res/drawable/ic_hide_md2.xml new file mode 100644 index 000000000..c87e19a46 --- /dev/null +++ b/app/src/main/res/drawable/ic_hide_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_safetynet_md2.xml b/app/src/main/res/drawable/ic_safetynet_md2.xml new file mode 100644 index 000000000..dec5d71b6 --- /dev/null +++ b/app/src/main/res/drawable/ic_safetynet_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_superuser_md2.xml b/app/src/main/res/layout/fragment_superuser_md2.xml index ecdbae57a..d3f467dd1 100644 --- a/app/src/main/res/layout/fragment_superuser_md2.xml +++ b/app/src/main/res/layout/fragment_superuser_md2.xml @@ -51,12 +51,12 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/ic_magiskhide" /> + app:srcCompat="@drawable/ic_hide_md2" /> + app:srcCompat="@drawable/ic_safetynet_md2" /> XDA SafetyNet + + Hide \ No newline at end of file From 6d03798314aee37afb792bb9622642470aa9a6d3 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sun, 20 Oct 2019 12:40:26 +0200 Subject: [PATCH 075/254] Added internal download pseudo broadcasts --- .../topjohnwu/magisk/di/ApplicationModule.kt | 2 ++ .../model/download/RemoteFileService.kt | 30 +++++++++++++------ .../model/entity/internal/DownloadSubject.kt | 6 ++-- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt index 437c69c3a..979e6c304 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt @@ -6,6 +6,7 @@ import android.app.Application import android.content.Context import android.os.Build import android.os.Bundle +import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.preference.PreferenceManager import com.topjohnwu.magisk.utils.RxBus import org.koin.core.qualifier.named @@ -23,6 +24,7 @@ val applicationModule = module { single { PreferenceManager.getDefaultSharedPreferences(get(Protected)) } single { ActivityTracker() } factory { get().foreground ?: NullActivity } + single { LocalBroadcastManager.getInstance(get()) } } private fun createDEContext(context: Context): Context { diff --git a/app/src/main/java/com/topjohnwu/magisk/model/download/RemoteFileService.kt b/app/src/main/java/com/topjohnwu/magisk/model/download/RemoteFileService.kt index 1c5fea005..614b76526 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/download/RemoteFileService.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/download/RemoteFileService.kt @@ -3,6 +3,8 @@ package com.topjohnwu.magisk.model.download import android.app.Activity import android.content.Intent import androidx.core.app.NotificationCompat +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.network.GithubRawServices import com.topjohnwu.magisk.di.NullActivity @@ -17,6 +19,7 @@ import com.topjohnwu.superuser.ShellUtils import io.reactivex.Completable import okhttp3.ResponseBody import org.koin.android.ext.android.inject +import org.koin.core.KoinComponent import timber.log.Timber import java.io.InputStream @@ -41,8 +44,8 @@ abstract class RemoteFileService : NotificationService() { Timber.e(it) finishNotify(subject.hashCode()) { notification -> notification.setContentText(getString(R.string.download_file_error)) - .setSmallIcon(android.R.drawable.stat_notify_error) - .setOngoing(false) + .setSmallIcon(android.R.drawable.stat_notify_error) + .setOngoing(false) } }) { val newId = finishNotify(subject) @@ -62,12 +65,12 @@ abstract class RemoteFileService : NotificationService() { } private fun download(subject: DownloadSubject) = service.fetchFile(subject.url) - .map { it.toStream(subject.hashCode()) } + .map { it.toStream(subject.hashCode(), subject) } .flatMapCompletable { stream -> when (subject) { is Module -> service.fetchInstaller() - .doOnSuccess { stream.toModule(subject.file, it.byteStream()) } - .ignoreElement() + .doOnSuccess { stream.toModule(subject.file, it.byteStream()) } + .ignoreElement() else -> Completable.fromAction { stream.writeTo(subject.file) } } }.doOnComplete { @@ -75,7 +78,7 @@ abstract class RemoteFileService : NotificationService() { handleAPK(subject) } - private fun ResponseBody.toStream(id: Int): InputStream { + private fun ResponseBody.toStream(id: Int, subject: DownloadSubject): InputStream { val maxRaw = contentLength() val max = maxRaw / 1_000_000f @@ -83,9 +86,10 @@ abstract class RemoteFileService : NotificationService() { val progress = it / 1_000_000f update(id) { notification -> if (maxRaw > 0) { + send(progress / max, subject) notification - .setProgress(maxRaw.toInt(), it.toInt(), false) - .setContentText("%.2f / %.2f MB".format(progress, max)) + .setProgress(maxRaw.toInt(), it.toInt(), false) + .setContentText("%.2f / %.2f MB".format(progress, max)) } else { notification.setContentText("%.2f MB / ??".format(progress)) } @@ -94,6 +98,7 @@ abstract class RemoteFileService : NotificationService() { } private fun finishNotify(subject: DownloadSubject) = finishNotify(subject.hashCode()) { + send(1f, subject) it.addActions(subject) .setContentText(getString(R.string.download_complete)) .setSmallIcon(android.R.drawable.stat_sys_download_done) @@ -111,8 +116,15 @@ abstract class RemoteFileService : NotificationService() { protected abstract fun NotificationCompat.Builder.addActions(subject: DownloadSubject) : NotificationCompat.Builder - companion object { + companion object : KoinComponent { const val ARG_URL = "arg_url" + + private val internalProgressBroadcast = MutableLiveData>() + val progressBroadcast: LiveData> get() = internalProgressBroadcast + + fun send(progress: Float, subject: DownloadSubject) { + internalProgressBroadcast.postValue(progress to subject) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/internal/DownloadSubject.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/internal/DownloadSubject.kt index 293d1064c..401253120 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/internal/DownloadSubject.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/internal/DownloadSubject.kt @@ -59,7 +59,7 @@ sealed class DownloadSubject : Parcelable { val magisk: MagiskJson = Info.remote.magisk @Parcelize - protected data class Flash( + data class Flash( override val configuration: Configuration ) : Magisk() { override val url: String get() = magisk.link @@ -72,7 +72,7 @@ sealed class DownloadSubject : Parcelable { } @Parcelize - protected class Uninstall : Magisk() { + class Uninstall : Magisk() { override val configuration: Configuration get() = Configuration.Uninstall override val url: String get() = Info.remote.uninstaller.link @@ -83,7 +83,7 @@ sealed class DownloadSubject : Parcelable { } @Parcelize - protected class Download : Magisk() { + class Download : Magisk() { override val configuration: Configuration get() = Configuration.Download override val url: String get() = magisk.link From 236ad576082af0a28a8f9c1f8ee9578feb0d2666 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sun, 20 Oct 2019 12:40:50 +0200 Subject: [PATCH 076/254] Added showing download progress in the home ui --- .../magisk/redesign/home/HomeFragment.kt | 16 ++++++++++-- .../magisk/redesign/home/HomeViewModel.kt | 3 +++ .../res/drawable/progress_determinate.xml | 26 +++++++++++++++++++ app/src/main/res/layout/fragment_home_md2.xml | 17 +++++++++++- app/src/main/res/values/attrs.xml | 4 +++ app/src/main/res/values/styles_md2.xml | 4 +++ app/src/main/res/values/styles_md2_impl.xml | 12 +++++++++ 7 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable/progress_determinate.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt index 3bf76be98..674ee0fdf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt @@ -1,10 +1,15 @@ package com.topjohnwu.magisk.redesign.home import android.graphics.Insets +import androidx.lifecycle.Observer import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentHomeMd2Binding +import com.topjohnwu.magisk.model.download.RemoteFileService +import com.topjohnwu.magisk.model.entity.internal.DownloadSubject import com.topjohnwu.magisk.redesign.compat.CompatFragment import org.koin.androidx.viewmodel.ext.android.viewModel +import timber.log.Timber +import kotlin.math.roundToInt class HomeFragment : CompatFragment() { @@ -15,8 +20,15 @@ class HomeFragment : CompatFragment() { override fun onStart() { super.onStart() - + RemoteFileService.progressBroadcast.observe(this, Observer { + when (it.second) { + is DownloadSubject.Magisk.Download, + is DownloadSubject.Magisk.Flash -> viewModel.stateMagiskProgress.value = + it.first.times(100f).roundToInt().also { Timber.i("Progress: $it") } + is DownloadSubject.Manager -> viewModel.stateManagerProgress.value = + it.first.times(100f).roundToInt().also { Timber.i("Progress: $it") } + } + }) activity.title = resources.getString(R.string.section_home) } - } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 20ca3e50b..e37b0dbed 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -50,6 +50,9 @@ class HomeViewModel( val stateVersionUpdateMagisk = KObservableField("") val stateVersionUpdateManager = KObservableField("") + val stateMagiskProgress = KObservableField(0) + val stateManagerProgress = KObservableField(0) + val stateHideManagerName = R.string.manager.res().let { if (!statePackageOriginal) { it.replaceRandomWithSpecial(3) diff --git a/app/src/main/res/drawable/progress_determinate.xml b/app/src/main/res/drawable/progress_determinate.xml new file mode 100644 index 000000000..95b275b5d --- /dev/null +++ b/app/src/main/res/drawable/progress_determinate.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 73a80790b..c9db30fb8 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -148,6 +148,14 @@ + + - + + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 4d9d21dce..637df5635 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -44,6 +44,10 @@ + + + + diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index e3a69cd08..0a26fa01b 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -53,6 +53,10 @@ @style/WidgetFoundation.Checkbox + @style/WidgetFoundation.ProgressBar + @style/WidgetFoundation.ProgressBar.Indeterminate + + @style/AppearanceFoundation.Display diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index 106ea8370..1ecc8dca5 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -131,4 +131,16 @@ variant. Make sure to use style referenced by attribute defined it attrs.xml. ?colorPrimary + + + + \ No newline at end of file From 47e236788cbcd0f0d028d652ab36d126760792d7 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sun, 20 Oct 2019 16:47:02 +0200 Subject: [PATCH 077/254] Added uninstall dialog --- .../model/events/dialog/UninstallDialog.kt | 55 +++++++++++++++++++ .../magisk/redesign/home/HomeViewModel.kt | 3 +- 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/events/dialog/UninstallDialog.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/UninstallDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/UninstallDialog.kt new file mode 100644 index 000000000..7aecaaa51 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/UninstallDialog.kt @@ -0,0 +1,55 @@ +package com.topjohnwu.magisk.model.events.dialog + +import android.widget.Toast +import com.topjohnwu.magisk.Info +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.model.download.DownloadService +import com.topjohnwu.magisk.model.entity.internal.Configuration +import com.topjohnwu.magisk.model.entity.internal.DownloadSubject +import com.topjohnwu.magisk.utils.Utils +import com.topjohnwu.magisk.view.MagiskDialog +import com.topjohnwu.superuser.Shell + +class UninstallDialog : DialogEvent() { + + override fun build(dialog: MagiskDialog) { + dialog.applyTitle(R.string.uninstall_magisk_title) + .applyMessage(R.string.uninstall_magisk_msg) + .applyButton(MagiskDialog.ButtonType.POSITIVE) { + titleRes = R.string.restore_img + preventDismiss = true + onClick { restore(dialog) } + } + if (Info.remote.uninstaller.link.isNotEmpty()) { + dialog.applyButton(MagiskDialog.ButtonType.NEGATIVE) { + titleRes = R.string.complete_uninstall + onClick { completeUninstall() } + } + } + } + + private fun restore(dialog: MagiskDialog) { + dialog.applyTitle(R.string.restore_img) + .applyMessage(R.string.restore_img_msg) + .applyButton(MagiskDialog.ButtonType.POSITIVE) { + title = "" + } + .cancellable(false) + + Shell.su("restore_imgs").submit { result -> + dialog.dismiss() + if (result.isSuccess) { + Utils.toast(R.string.restore_done, Toast.LENGTH_SHORT) + } else { + Utils.toast(R.string.restore_fail, Toast.LENGTH_LONG) + } + } + } + + private fun completeUninstall() { + DownloadService(dialog.context) { + subject = DownloadSubject.Magisk(Configuration.Uninstall) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index e37b0dbed..26e74b2a8 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -14,6 +14,7 @@ import com.topjohnwu.magisk.model.events.OpenInappLinkEvent import com.topjohnwu.magisk.model.events.dialog.EnvFixDialog import com.topjohnwu.magisk.model.events.dialog.MagiskInstallDialog import com.topjohnwu.magisk.model.events.dialog.ManagerInstallDialog +import com.topjohnwu.magisk.model.events.dialog.UninstallDialog import com.topjohnwu.magisk.model.observer.Observer import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.ui.home.MagiskState @@ -111,7 +112,7 @@ class HomeViewModel( fun onLinkPressed(link: String) = OpenInappLinkEvent(link).publish() - fun onDeletePressed() {} + fun onDeletePressed() = UninstallDialog().publish() fun onManagerPressed() = ManagerInstallDialog().publish() From 7f0a87742a2561c94d6fc3a53d1cc04be2e8776a Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sun, 20 Oct 2019 17:26:00 +0200 Subject: [PATCH 078/254] Fixed design issues in dialogs Dark theme not being properly implemented Icons were not set --- .../magisk/utils/DataBindingAdapters.kt | 6 + .../main/res/layout/dialog_magisk_base.xml | 155 +----------------- 2 files changed, 11 insertions(+), 150 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index be15e5fce..75032ff20 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -27,6 +27,7 @@ import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager.widget.ViewPager +import com.google.android.material.button.MaterialButton import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.navigation.NavigationView import com.topjohnwu.magisk.R @@ -377,4 +378,9 @@ fun View.rotationTo(value: Int) { .rotation(value.toFloat()) .setInterpolator(FastOutSlowInInterpolator()) .start() +} + +@BindingAdapter("app:icon") +fun MaterialButton.setIconRes(res: Int) { + setIconResource(res) } \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_magisk_base.xml b/app/src/main/res/layout/dialog_magisk_base.xml index f18c144b6..0823d5323 100644 --- a/app/src/main/res/layout/dialog_magisk_base.xml +++ b/app/src/main/res/layout/dialog_magisk_base.xml @@ -16,7 +16,7 @@ android:layout_height="match_parent"> - - gone="@{data.buttonPositive.icon == 0 && data.buttonPositive.title.length == - 0}" - - - - - gone="@{data.buttonNeutral.icon == 0 && data.buttonNeutral.title.length == - 0}" - - - - - gone="@{data.buttonNegative.icon == 0 && data.buttonNegative.title.length == - 0}" - - - - - gone="@{data.buttonIDGAF.icon == 0 && data.buttonIDGAF.title.length == 0}" - - - - From 27fb0474d503b5ca2557a0ff24233498950af9b8 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sun, 20 Oct 2019 17:27:39 +0200 Subject: [PATCH 079/254] Added more standard night-mode system --- app/src/main/java/com/topjohnwu/magisk/Config.kt | 7 +++++++ .../main/java/com/topjohnwu/magisk/base/BaseActivity.kt | 9 ++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/Config.kt b/app/src/main/java/com/topjohnwu/magisk/Config.kt index 932467dd7..09c28fb45 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Config.kt +++ b/app/src/main/java/com/topjohnwu/magisk/Config.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.SharedPreferences import android.os.Environment import android.util.Xml +import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.edit import com.topjohnwu.magisk.data.database.SettingsDao import com.topjohnwu.magisk.data.database.StringDao @@ -45,6 +46,7 @@ object Config : PreferenceModel, DBConfig { const val CUSTOM_CHANNEL = "custom_channel" const val LOCALE = "locale" const val DARK_THEME = "dark_theme" + const val DARK_THEME_EXTENDED = "dark_theme_extended" const val REPO_ORDER = "repo_order" const val SHOW_SYSTEM_APP = "show_system" const val DOWNLOAD_PATH = "download_path" @@ -110,7 +112,12 @@ object Config : PreferenceModel, DBConfig { var updateChannel by preferenceStrInt(Key.UPDATE_CHANNEL, defaultChannel) var redesign by preference(Key.REDESIGN, false) + @Deprecated("Use extended dark theme") var darkTheme by preference(Key.DARK_THEME, true) + var darkThemeExtended by preference( + Key.DARK_THEME_EXTENDED, + AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM + ) var suReAuth by preference(Key.SU_REAUTH, false) var checkUpdate by preference(Key.CHECK_UPDATES, true) var magiskHide by preference(Key.MAGISKHIDE, true) diff --git a/app/src/main/java/com/topjohnwu/magisk/base/BaseActivity.kt b/app/src/main/java/com/topjohnwu/magisk/base/BaseActivity.kt index fd32472c5..9c7b22081 100644 --- a/app/src/main/java/com/topjohnwu/magisk/base/BaseActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/base/BaseActivity.kt @@ -39,10 +39,13 @@ abstract class BaseActivity() } init { - val theme = if (Config.darkTheme) { - AppCompatDelegate.MODE_NIGHT_YES + val theme = if (Config.redesign) { + Config.darkThemeExtended } else { - AppCompatDelegate.MODE_NIGHT_NO + when { + Config.darkTheme -> AppCompatDelegate.MODE_NIGHT_YES + else -> AppCompatDelegate.MODE_NIGHT_NO + } } AppCompatDelegate.setDefaultNightMode(theme) } From dc09ec7598c1ac4947cc02f816ddb42fecb58bed Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sun, 20 Oct 2019 17:28:18 +0200 Subject: [PATCH 080/254] Added theme mode picker dialog Redesigned settings' selector for dark mode a bit --- .../model/events/dialog/DarkThemeDialog.kt | 50 +++++++++++++++ .../redesign/settings/SettingsViewModel.kt | 8 +-- app/src/main/res/drawable/ic_day.xml | 10 +++ app/src/main/res/drawable/ic_day_night.xml | 10 +++ app/src/main/res/drawable/ic_night.xml | 10 +++ .../main/res/layout/fragment_settings_md2.xml | 62 ++++++++++++------- app/src/main/res/values/strings_md2.xml | 6 ++ app/src/main/res/values/styles_md2_impl.xml | 6 ++ 8 files changed, 134 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DarkThemeDialog.kt create mode 100644 app/src/main/res/drawable/ic_day.xml create mode 100644 app/src/main/res/drawable/ic_day_night.xml create mode 100644 app/src/main/res/drawable/ic_night.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DarkThemeDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DarkThemeDialog.kt new file mode 100644 index 000000000..0c62622df --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DarkThemeDialog.kt @@ -0,0 +1,50 @@ +package com.topjohnwu.magisk.model.events.dialog + +import android.app.Activity +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.app.AppCompatDelegate +import com.topjohnwu.magisk.Config +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.model.events.ActivityExecutor +import com.topjohnwu.magisk.view.MagiskDialog +import java.lang.ref.WeakReference + +class DarkThemeDialog : DialogEvent(), ActivityExecutor { + + private var activity: WeakReference? = null + + override fun invoke(activity: AppCompatActivity) { + this.activity = WeakReference(activity) + } + + override fun build(dialog: MagiskDialog) { + dialog.applyTitle(R.string.settings_dark_mode_title) + .applyMessage(R.string.settings_dark_mode_message) + .applyButton(MagiskDialog.ButtonType.POSITIVE) { + titleRes = R.string.settings_dark_mode_light + icon = R.drawable.ic_day + onClick { selectTheme(AppCompatDelegate.MODE_NIGHT_NO) } + } + .applyButton(MagiskDialog.ButtonType.NEUTRAL) { + titleRes = R.string.settings_dark_mode_system + icon = R.drawable.ic_day_night + onClick { selectTheme(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) } + } + .applyButton(MagiskDialog.ButtonType.NEGATIVE) { + titleRes = R.string.settings_dark_mode_dark + icon = R.drawable.ic_night + onClick { selectTheme(AppCompatDelegate.MODE_NIGHT_YES) } + } + .onDismiss { + activity?.clear() + activity = null + } + } + + private fun selectTheme(mode: Int) { + Config.darkThemeExtended = mode + activity?.get()?.recreate() + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt index 0014b8cd8..dca920e12 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt @@ -4,14 +4,13 @@ import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.extensions.addOnPropertyChangedCallback import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.model.events.DieEvent -import com.topjohnwu.magisk.model.events.RecreateEvent +import com.topjohnwu.magisk.model.events.dialog.DarkThemeDialog import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.utils.KObservableField class SettingsViewModel : CompatViewModel() { val redesign = KObservableField(Config.redesign) - val darkTheme = KObservableField(Config.darkTheme) init { //todo make observable preference @@ -19,12 +18,9 @@ class SettingsViewModel : CompatViewModel() { Config.redesign = redesign.value DieEvent().publish() } - darkTheme.addOnPropertyChangedCallback { - Config.darkTheme = darkTheme.value - RecreateEvent().publish() - } } fun toggle(item: KObservableField) = item.toggle() + fun darkModePressed() = DarkThemeDialog().publish() } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_day.xml b/app/src/main/res/drawable/ic_day.xml new file mode 100644 index 000000000..2899017da --- /dev/null +++ b/app/src/main/res/drawable/ic_day.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_day_night.xml b/app/src/main/res/drawable/ic_day_night.xml new file mode 100644 index 000000000..8452fab77 --- /dev/null +++ b/app/src/main/res/drawable/ic_day_night.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_night.xml b/app/src/main/res/drawable/ic_night.xml new file mode 100644 index 000000000..c31bd0593 --- /dev/null +++ b/app/src/main/res/drawable/ic_night.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings_md2.xml b/app/src/main/res/layout/fragment_settings_md2.xml index d989ef96c..ace4a82b3 100644 --- a/app/src/main/res/layout/fragment_settings_md2.xml +++ b/app/src/main/res/layout/fragment_settings_md2.xml @@ -18,7 +18,8 @@ android:fillViewport="true" android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l2}" android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/l2}" - tools:layout_marginTop="24dp"> + tools:layout_marginTop="24dp" + tools:paddingTop="@dimen/l1"> - + android:orientation="vertical"> + + + + + android:background="@null" + android:gravity="start|center_vertical" + android:singleLine="true" + android:text="@string/settings_dark_mode_title" + android:textAppearance="?appearanceTextBodyNormal" + android:textStyle="bold" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@+id/settings_card_dark_pointer" + app:layout_constraintStart_toEndOf="@+id/settings_card_dark_icon" + app:layout_constraintTop_toTopOf="parent" /> - - - + @@ -65,10 +84,9 @@ style="?styleCardNormal" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginLeft="@dimen/l2" - android:layout_marginTop="@dimen/l1" - android:layout_marginRight="@dimen/l2" - android:layout_marginBottom="@dimen/l2" + android:layout_marginLeft="@dimen/l1" + android:layout_marginRight="@dimen/l1" + android:layout_marginBottom="@dimen/l1" android:onClick="@{() -> viewModel.toggle(viewModel.redesign)}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/settings_card_dark" diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index 9a21d50fc..17dd1ab75 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -29,4 +29,10 @@ Hide + Theme Mode + Select mode which best suits your style! + Always Light + Follow System + Always Dark + \ No newline at end of file diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index 1ecc8dca5..75d824623 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -53,6 +53,8 @@ variant. Make sure to use style referenced by attribute defined it attrs.xml. + + + + + + \ No newline at end of file From da707afa3f2f798bd619d2c45bd63c645501c39a Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 26 Oct 2019 17:40:29 +0200 Subject: [PATCH 104/254] Updated install ui to better fit app's theme --- .../com/topjohnwu/magisk/utils/DataBindingAdapters.kt | 6 ++++++ app/src/main/res/layout/fragment_install_md2.xml | 10 ++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index 7ac30dd3d..fff3d12de 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -40,6 +40,7 @@ import io.reactivex.Observable import io.reactivex.disposables.Disposable import java.util.concurrent.TimeUnit import kotlin.math.hypot +import kotlin.math.roundToInt @BindingAdapter("onNavigationClick") @@ -389,4 +390,9 @@ fun MaterialButton.setIconRes(res: Int) { @BindingAdapter("cardElevation") fun MaterialCardView.setCardElevationBound(elevation: Float) { cardElevation = elevation +} + +@BindingAdapter("strokeWidth") +fun MaterialCardView.setCardStrokeWidthBound(stroke: Float) { + strokeWidth = stroke.roundToInt() } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_install_md2.xml b/app/src/main/res/layout/fragment_install_md2.xml index 6ffdd0ccc..f05d10529 100644 --- a/app/src/main/res/layout/fragment_install_md2.xml +++ b/app/src/main/res/layout/fragment_install_md2.xml @@ -33,13 +33,12 @@ android:paddingTop="@dimen/l1"> + app:strokeWidth="@{viewModel.step != 0 ? 0f : @dimen/l_125}"> + app:strokeWidth="@{viewModel.step != 1 ? 0f : @dimen/l_125}"> Date: Sat, 26 Oct 2019 20:59:30 +0200 Subject: [PATCH 105/254] Added device info card --- .../main/java/com/topjohnwu/magisk/Config.kt | 1 + .../topjohnwu/magisk/extensions/XAndroid.kt | 33 ++- .../com/topjohnwu/magisk/extensions/XJava.kt | 7 +- .../com/topjohnwu/magisk/extensions/XSU.kt | 4 +- .../magisk/redesign/home/HomeViewModel.kt | 1 + app/src/main/res/drawable/ic_device.xml | 10 + app/src/main/res/layout/fragment_home_md2.xml | 223 +++++++++++++++++- app/src/main/res/values/strings_md2.xml | 11 + 8 files changed, 281 insertions(+), 9 deletions(-) create mode 100644 app/src/main/res/drawable/ic_device.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/Config.kt b/app/src/main/java/com/topjohnwu/magisk/Config.kt index 09c28fb45..27dce273d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Config.kt +++ b/app/src/main/java/com/topjohnwu/magisk/Config.kt @@ -121,6 +121,7 @@ object Config : PreferenceModel, DBConfig { var suReAuth by preference(Key.SU_REAUTH, false) var checkUpdate by preference(Key.CHECK_UPDATES, true) var magiskHide by preference(Key.MAGISKHIDE, true) + @JvmStatic var coreOnly by preference(Key.COREONLY, false) var showSystemApp by preference(Key.SHOW_SYSTEM_APP, false) diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/XAndroid.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/XAndroid.kt index f166574b9..066f1835b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/XAndroid.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/XAndroid.kt @@ -24,8 +24,10 @@ import com.topjohnwu.magisk.utils.DynamicClassLoader import com.topjohnwu.magisk.utils.FileProvider import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.magisk.utils.currentLocale +import com.topjohnwu.superuser.ShellUtils import java.io.File import java.io.FileNotFoundException +import java.text.SimpleDateFormat import java.util.* val packageName: String get() = get().packageName @@ -280,4 +282,33 @@ fun Context.unwrap(): Context { fun Context.hasPermissions(vararg permissions: String) = permissions.all { ContextCompat.checkSelfPermission(this, it) == PERMISSION_GRANTED -} \ No newline at end of file +} + +private val securityLevelFormatter get() = SimpleDateFormat("yyyy-MM-dd", currentLocale) + +/** Friendly reminder to seek newer roms or install oem updates. */ +val isDeviceSecure: Boolean + get() { + val latestPermittedTime = Calendar.getInstance().apply { + time = securityLevelDate + add(Calendar.MONTH, 2) + }.time.time + return now in 0..latestPermittedTime + } +val securityLevelDate get() = securityLevelFormatter.parseOrNull(securityLevel) ?: Date(0) +val securityLevel + get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + Build.VERSION.SECURITY_PATCH + } else { + null + } ?: "1970-01-01" //never + +val isSAR + get() = ShellUtils + .fastCmd("grep_prop ro.build.system_root_image") + .let { it.isNotEmpty() && it.toBoolean() } + +val isAB + get() = ShellUtils + .fastCmd("grep_prop ro.build.ab_update") + .let { it.isNotEmpty() && it.toBoolean() } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/XJava.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/XJava.kt index 1f8c7c007..51c55c048 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/XJava.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/XJava.kt @@ -3,9 +3,11 @@ package com.topjohnwu.magisk.extensions import android.net.Uri import android.os.Build import androidx.core.net.toFile +import timber.log.Timber import java.io.File import java.io.InputStream import java.io.OutputStream +import java.text.SimpleDateFormat import java.util.* import java.util.zip.ZipEntry import java.util.zip.ZipInputStream @@ -100,4 +102,7 @@ fun Locale.toLangTag(): String { tag.append('-').append(variant) return tag.toString() } -} \ No newline at end of file +} + +fun SimpleDateFormat.parseOrNull(date: String) = + runCatching { parse(date) }.onFailure { Timber.e(it) }.getOrNull() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/XSU.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/XSU.kt index d60e9227a..1e5aef1d9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/XSU.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/XSU.kt @@ -11,4 +11,6 @@ fun reboot(reason: String = if (Info.recovery) "recovery" else "") { } fun File.suOutputStream() = SuFileOutputStream(this) -fun File.suInputStream() = SuFileInputStream(this) \ No newline at end of file +fun File.suInputStream() = SuFileInputStream(this) + +val hasRoot get() = Shell.rootAccess() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 1105ff2ea..37cec4cb0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -62,6 +62,7 @@ class HomeViewModel( val stateMagiskExpanded = KObservableField(false) val stateManagerExpanded = KObservableField(false) + val stateDeviceExpanded = KObservableField(false) val stateHideManagerName = R.string.manager.res().let { if (!statePackageOriginal) { diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml new file mode 100644 index 000000000..5b90a6084 --- /dev/null +++ b/app/src/main/res/drawable/ic_device.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index cfa5bb1af..2f45f806c 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -5,14 +5,22 @@ + + + + + + + + @@ -31,13 +39,204 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:clipToPadding="false" - android:orientation="vertical"> + android:orientation="vertical" + android:paddingTop="@dimen/l1"> + android:clipToPadding="false"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/home_device_wrapper" + app:layout_constraintWidth_max="200dp"> + + + + app:layout_constraintTop_toBottomOf="@+id/home_device_wrapper" + app:layout_constraintWidth_max="200dp"> + + Magisk System + Yes + No + No connection available Home @@ -28,6 +31,14 @@ Source XDA + Security + System + A/B + SAR + + Secure + Outdated + Version Code Mode From ee7d297ca8eaa7c3b4e31ed53696f39691389484 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 26 Oct 2019 21:14:01 +0200 Subject: [PATCH 106/254] Partially reverted developer section changes --- .../magisk/model/entity/recycler/HomeItems.kt | 2 +- .../magisk/redesign/home/HomeFragment.kt | 7 ---- app/src/main/res/layout/fragment_home_md2.xml | 36 +++++++++++++------ 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt index fb049d9ba..72512ba33 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt @@ -106,7 +106,7 @@ sealed class DeveloperItem : ComparableRvItem() { object App : DeveloperItem() { override val items = listOf(HomeItem.PayPal.App, HomeItem.Twitter.App) - override val icon = R.drawable.ic_mainline_dev + override val icon = R.drawable.ic_app_dev override val name = R.string.home_links_app } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt index 3bb316104..d2b5b1685 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt @@ -1,9 +1,6 @@ package com.topjohnwu.magisk.redesign.home import android.graphics.Insets -import android.os.Bundle -import android.view.View -import androidx.recyclerview.widget.LinearSnapHelper import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentHomeMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment @@ -21,8 +18,4 @@ class HomeFragment : CompatFragment() { activity.title = resources.getString(R.string.section_home) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - LinearSnapHelper().attachToRecyclerView(binding.homeSupportList) - } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 2f45f806c..d53407ca3 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -698,19 +698,35 @@ - + android:layout_marginEnd="@dimen/l1" /> + + + + From b910a92731d30c1de2855208b47f0fa55a6dada9 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sun, 27 Oct 2019 11:00:16 +0100 Subject: [PATCH 107/254] Fixed ui issues in unrooted state --- app/src/main/res/layout/fragment_home_md2.xml | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index d53407ca3..ff0b1b353 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -61,15 +61,19 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - + android:layout_height="match_parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + app:constraint_referenced_ids="home_device_extra_build_style_title,home_device_extra_build_style_value,home_device_extra_build_type_title,home_device_extra_build_type_value" + tools:visibility="gone" /> - + @@ -412,7 +419,7 @@ gone="@{Info.magiskVersionCode < 0}" android:layout_width="wrap_content" android:layout_height="wrap_content" - app:constraint_referenced_ids="home_magisk_extra_version_title,home_magisk_extra_version_value,home_magisk_extra_code_title,home_magisk_extra_code_value" /> + app:constraint_referenced_ids="home_magisk_extra_version_title,home_magisk_extra_version_value,home_magisk_extra_code_title,home_magisk_extra_code_value,home_magisk_extra_mode_title,home_magisk_extra_mode_value,home_magisk_extra_connection_title,home_magisk_extra_connection_value" /> @@ -561,16 +568,13 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:clipToPadding="false" - android:paddingStart="@dimen/l1" - android:paddingEnd="@dimen/l1" - android:paddingBottom="@dimen/l1" + android:padding="@dimen/l1" android:visibility="gone" tools:visibility="visible"> From 7d6eebdae3e2199c4ec9cd67b65912055b1308d9 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Tue, 29 Oct 2019 16:50:01 +0100 Subject: [PATCH 108/254] Fixed unreasonable change resulting in major breakage all around the app --- .../magisk/base/viewmodel/BaseViewModel.kt | 8 +--- .../magisk/utils/KObservableField.kt | 37 ++++++++++++++++--- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/BaseViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/BaseViewModel.kt index 987f1bf6d..13697e12b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/BaseViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/BaseViewModel.kt @@ -5,7 +5,7 @@ import com.topjohnwu.magisk.extensions.doOnSubscribeUi import com.topjohnwu.magisk.model.events.BackPressEvent import com.topjohnwu.magisk.model.events.PermissionEvent import com.topjohnwu.magisk.model.events.ViewActionEvent -import com.topjohnwu.magisk.utils.KObservableField +import com.topjohnwu.magisk.model.observer.Observer import io.reactivex.Observable import io.reactivex.subjects.PublishSubject import com.topjohnwu.magisk.Info.isConnected as gIsConnected @@ -15,11 +15,7 @@ abstract class BaseViewModel( initialState: State = State.LOADING ) : LoadingViewModel(initialState) { - val isConnected = object : KObservableField(gIsConnected.value, gIsConnected) { - override fun get(): Boolean { - return gIsConnected.value - } - } + val isConnected = Observer(gIsConnected) { gIsConnected.value } fun withView(action: Activity.() -> Unit) { ViewActionEvent(action).publish() diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/KObservableField.kt b/app/src/main/java/com/topjohnwu/magisk/utils/KObservableField.kt index cda0e5eb0..b9ae8f251 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/KObservableField.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/KObservableField.kt @@ -2,18 +2,30 @@ package com.topjohnwu.magisk.utils import androidx.databinding.Observable import androidx.databinding.ObservableField +import com.topjohnwu.magisk.model.observer.Observer import java.io.Serializable /** * Kotlin version of [ObservableField]. * You can define if wrapped type is Nullable or not. * You can use kotlin get/set syntax for value + * + * ## Notes + * This stays final for fuck's sake. Too many things depend on it, so you just cannot go around and + * change it randomly. Even though you think you're improving the design, you might be fucking this + * up in unimaginable ways. So DON'T TOUCH THIS. + * + * In order to have value-less observer you need - you guessed it - **a fucking [Observer]**! */ -open class KObservableField : ObservableField, Serializable { +class KObservableField : ObservableField, Serializable { var value: T - get() = get() - set(value) { set(value) } + set(value) { + if (field != value) { + field = value + notifyChange() + } + } constructor(init: T) { value = init @@ -23,8 +35,23 @@ open class KObservableField : ObservableField, Serializable { value = init } - @Suppress("UNCHECKED_CAST") + @Deprecated( + message = "Needed for data binding, use KObservableField.value syntax from code", + replaceWith = ReplaceWith("value") + ) override fun get(): T { - return super.get() as T + return value + } + + @Deprecated( + message = "Needed for data binding, use KObservableField.value = ... syntax from code", + replaceWith = ReplaceWith("value = newValue") + ) + override fun set(newValue: T) { + value = newValue + } + + override fun toString(): String { + return "KObservableField(value=$value)" } } From 93c422dce6bc7777e8f179b40276d6f0ea127b1e Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Tue, 29 Oct 2019 16:52:42 +0100 Subject: [PATCH 109/254] Added post-merge fixes --- app/build.gradle | 2 +- .../main/java/com/topjohnwu/magisk/Hacks.kt | 13 ++++++++----- .../com/topjohnwu/magisk/extensions/XView.kt | 2 +- .../magisk/model/events/ViewEvents.kt | 2 +- .../magisk/model/events/dialog/EnvFixDialog.kt | 2 +- .../model/events/dialog/MagiskInstallDialog.kt | 2 +- .../events/dialog/SuperuserRevokeDialog.kt | 2 +- .../magisk/model/navigation/Navigation.kt | 4 ++-- .../magisk/redesign/compat/CompatActivity.kt | 4 ++-- .../magisk/redesign/compat/CompatFragment.kt | 4 ++-- .../compat/CompatNavigationDelegate.kt | 18 +++++++++++++----- .../magisk/redesign/home/HomeViewModel.kt | 6 +++--- app/src/main/res/anim/fragment_enter.xml | 15 +++++++++++++++ app/src/main/res/anim/fragment_enter_pop.xml | 15 +++++++++++++++ app/src/main/res/anim/fragment_exit.xml | 15 +++++++++++++++ app/src/main/res/anim/fragment_exit_pop.xml | 15 +++++++++++++++ app/src/main/res/layout/activity_main_md2.xml | 18 ------------------ app/src/main/res/layout/fragment_home_md2.xml | 10 +++++----- .../main/res/layout/fragment_safetynet_md2.xml | 2 +- app/src/main/res/values/strings_md2.xml | 1 - 20 files changed, 102 insertions(+), 50 deletions(-) create mode 100644 app/src/main/res/anim/fragment_enter.xml create mode 100644 app/src/main/res/anim/fragment_enter_pop.xml create mode 100644 app/src/main/res/anim/fragment_exit.xml create mode 100644 app/src/main/res/anim/fragment_exit_pop.xml diff --git a/app/build.gradle b/app/build.gradle index e522687cc..4934b8ba9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -127,7 +127,7 @@ dependencies { implementation 'androidx.recyclerview:recyclerview:1.1.0-rc01' implementation 'androidx.fragment:fragment-ktx:1.2.0-rc01' implementation 'androidx.work:work-runtime:2.2.0' - implementation 'androidx.transition:transition:1.3.0-rc01' + implementation 'androidx.transition:transition:1.2.0' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.core:core-ktx:1.1.0' implementation 'com.google.android.material:material:1.1.0-beta01' diff --git a/app/src/main/java/com/topjohnwu/magisk/Hacks.kt b/app/src/main/java/com/topjohnwu/magisk/Hacks.kt index 0245f9591..c71e79eae 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Hacks.kt +++ b/app/src/main/java/com/topjohnwu/magisk/Hacks.kt @@ -26,13 +26,14 @@ import com.topjohnwu.magisk.ui.surequest.SuRequestActivity import com.topjohnwu.magisk.utils.currentLocale import com.topjohnwu.magisk.utils.defaultLocale import java.util.* +import com.topjohnwu.magisk.redesign.MainActivity as RedesignActivity fun AssetManager.addAssetPath(path: String) { DynAPK.addAssetPath(this, path) } -fun Context.wrap(global: Boolean = true): Context - = if (global) GlobalResContext(this) else ResContext(this) +fun Context.wrap(global: Boolean = true): Context = + if (global) GlobalResContext(this) else ResContext(this) fun Context.wrapJob(): Context = object : GlobalResContext(this) { @@ -74,7 +75,7 @@ fun Context.intent(c: Class<*>): Intent { } fun resolveRes(idx: Int): Int { - return Info.stub?.resourceMap?.get(idx) ?: when(idx) { + return Info.stub?.resourceMap?.get(idx) ?: when (idx) { DynAPK.NOTIFICATION -> R.drawable.ic_magisk_outline DynAPK.DOWNLOAD -> R.drawable.sc_cloud_download DynAPK.SUPERUSER -> R.drawable.sc_superuser @@ -167,7 +168,8 @@ private class JobSchedulerWrapper(private val base: JobScheduler) : JobScheduler val name = service.className val component = ComponentName( service.packageName, - Info.stub!!.componentMap[name] ?: name) + Info.stub!!.componentMap[name] ?: name + ) // Clone the JobInfo except component val builder = JobInfo.Builder(id, component) @@ -217,7 +219,8 @@ object ClassMap { UpdateCheckService::class.java to a.g::class.java, GeneralReceiver::class.java to a.h::class.java, DownloadService::class.java to a.j::class.java, - SuRequestActivity::class.java to a.m::class.java + SuRequestActivity::class.java to a.m::class.java, + RedesignActivity::class.java to a.i::class.java ) operator fun get(c: Class<*>) = map.getOrElse(c) { throw IllegalArgumentException() } diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/XView.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/XView.kt index dc7773f4a..16183dd61 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/XView.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/XView.kt @@ -18,6 +18,6 @@ fun View.addOnGlobalLayoutListener(oneShot: Boolean = false, callback: () -> Uni }) fun ViewGroup.startAnimations() { - val transition = AutoTransition().setInterpolator(FastOutSlowInInterpolator()) + val transition = AutoTransition().setInterpolator(FastOutSlowInInterpolator()).setDuration(400) TransitionManager.beginDelayedTransition(this, transition) } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt index ef5eeb494..2d3342a64 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt @@ -123,7 +123,7 @@ class UpdateSafetyNetEvent : ViewEvent(), ContextExecutor, KoinComponent, Safety onClick { downloadInternal() } } .applyButton(MagiskDialog.ButtonType.NEGATIVE) { - titleRes = R.string.no_thanks + titleRes = android.R.string.no onClick { rxBus.post(SafetyNetResult(-2)) } } .reveal() diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/EnvFixDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/EnvFixDialog.kt index 660d9c9b3..6ea2b5aaf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/EnvFixDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/EnvFixDialog.kt @@ -42,7 +42,7 @@ class EnvFixDialog : DialogEvent() { } } .applyButton(MagiskDialog.ButtonType.NEGATIVE) { - titleRes = R.string.no_thanks + titleRes = android.R.string.no } .let { Unit } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt index fff996862..87522ee98 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt @@ -95,7 +95,7 @@ class MagiskInstallDialog : DialogEvent() { } } .applyButton(MagiskDialog.ButtonType.NEGATIVE) { - titleRes = R.string.no_thanks + titleRes = android.R.string.no } } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/SuperuserRevokeDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/SuperuserRevokeDialog.kt index b5121d9f8..39e24d36a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/SuperuserRevokeDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/SuperuserRevokeDialog.kt @@ -17,7 +17,7 @@ class SuperuserRevokeDialog( onClick { callbacks.listenerOnSuccess() } } .applyButton(MagiskDialog.ButtonType.NEGATIVE) { - titleRes = R.string.no_thanks + titleRes = android.R.string.no } } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt index bf7b3c0ed..a41c58f79 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt @@ -3,9 +3,9 @@ package com.topjohnwu.magisk.model.navigation import android.content.Context import android.content.Intent import android.os.Build -import com.topjohnwu.magisk.ClassMap import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.Const +import com.topjohnwu.magisk.intent import com.topjohnwu.magisk.redesign.install.InstallFragment import com.topjohnwu.magisk.redesign.safetynet.SafetynetFragment import com.topjohnwu.magisk.ui.MainActivity @@ -115,7 +115,7 @@ object Navigation { Config.redesign -> RedesignActivity::class.java else -> MainActivity::class.java } - Intent(context, ClassMap[destination]) + context.intent(destination) .putExtra(Const.Key.OPEN_SECTION, launchIntent.getStringExtra(Const.Key.OPEN_SECTION)) .putExtra( Const.Key.OPEN_SETTINGS, diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt index f0cb17d5d..c0b58d567 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt @@ -7,10 +7,10 @@ import android.view.ViewGroup import androidx.databinding.OnRebindCallback import androidx.databinding.ViewDataBinding import androidx.fragment.app.Fragment -import androidx.transition.TransitionManager import com.topjohnwu.magisk.R import com.topjohnwu.magisk.base.BaseActivity import com.topjohnwu.magisk.extensions.snackbar +import com.topjohnwu.magisk.extensions.startAnimations import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.model.events.ViewEvent import com.topjohnwu.magisk.model.navigation.MagiskNavigationEvent @@ -40,7 +40,7 @@ abstract class CompatActivity() { override fun onPreBind(binding: Binding): Boolean { - TransitionManager.beginDelayedTransition(binding.root as ViewGroup) + (binding.root as? ViewGroup)?.startAnimations() return super.onPreBind(binding) } }) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt index af70a6f91..b25d324d5 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt @@ -5,8 +5,8 @@ import android.view.View import android.view.ViewGroup import androidx.databinding.OnRebindCallback import androidx.databinding.ViewDataBinding -import androidx.transition.TransitionManager import com.topjohnwu.magisk.base.BaseFragment +import com.topjohnwu.magisk.extensions.startAnimations import com.topjohnwu.magisk.model.events.ViewEvent abstract class CompatFragment @@ -24,7 +24,7 @@ abstract class CompatFragment() { override fun onPreBind(binding: Binding): Boolean { - TransitionManager.beginDelayedTransition(binding.root as ViewGroup) + (binding.root as? ViewGroup)?.startAnimations() return super.onPreBind(binding) } }) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt index fba81411e..6a7054960 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt @@ -2,9 +2,9 @@ package com.topjohnwu.magisk.redesign.compat import android.content.Intent import android.os.Bundle -import androidx.fragment.app.FragmentTransaction import com.ncapdevi.fragnav.FragNavController import com.ncapdevi.fragnav.FragNavTransactionOptions +import com.topjohnwu.magisk.R import com.topjohnwu.magisk.model.navigation.MagiskAnimBuilder import com.topjohnwu.magisk.model.navigation.MagiskNavigationEvent import com.topjohnwu.magisk.model.navigation.Navigator @@ -106,10 +106,18 @@ class CompatNavigationDelegate( } private fun FragNavTransactionOptions.Builder.customAnimations(options: MagiskAnimBuilder) = - customAnimations(options.enter, options.exit, options.popEnter, options.popExit).apply { - if (!options.anySet) { - transition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) - } + apply { + if (!options.anySet) customAnimations( + R.anim.fragment_enter, + R.anim.fragment_exit, + R.anim.fragment_enter_pop, + R.anim.fragment_exit_pop + ) else customAnimations( + options.enter, + options.exit, + options.popEnter, + options.popExit + ) } } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 37cec4cb0..72496892e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -111,7 +111,7 @@ class HomeViewModel( stateVersionUpdateMagisk.value = when { info.magisk.isObsolete -> "%s > %s".format( - Info.magiskVersionString.clipVersion(), + Info.env.magiskVersionString.clipVersion(), info.magisk.version.clipVersion() ) else -> "" @@ -168,9 +168,9 @@ class HomeViewModel( @Suppress("unused") val MagiskJson.isInstalled - get() = Info.magiskVersionCode > 0 + get() = Info.env.magiskVersionCode > 0 val MagiskJson.isObsolete - get() = Info.magiskVersionCode < versionCode && isInstalled + get() = Info.env.magiskVersionCode < versionCode && isInstalled val ManagerJson.isUpdateChannelCorrect get() = versionCode > 0 val ManagerJson.isObsolete diff --git a/app/src/main/res/anim/fragment_enter.xml b/app/src/main/res/anim/fragment_enter.xml new file mode 100644 index 000000000..affbb54b9 --- /dev/null +++ b/app/src/main/res/anim/fragment_enter.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/fragment_enter_pop.xml b/app/src/main/res/anim/fragment_enter_pop.xml new file mode 100644 index 000000000..6a1d9f37c --- /dev/null +++ b/app/src/main/res/anim/fragment_enter_pop.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/fragment_exit.xml b/app/src/main/res/anim/fragment_exit.xml new file mode 100644 index 000000000..59ca28476 --- /dev/null +++ b/app/src/main/res/anim/fragment_exit.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/fragment_exit_pop.xml b/app/src/main/res/anim/fragment_exit_pop.xml new file mode 100644 index 000000000..c39aaf6fb --- /dev/null +++ b/app/src/main/res/anim/fragment_exit_pop.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_md2.xml b/app/src/main/res/layout/activity_main_md2.xml index e299f10e3..64bfeba23 100644 --- a/app/src/main/res/layout/activity_main_md2.xml +++ b/app/src/main/res/layout/activity_main_md2.xml @@ -42,24 +42,6 @@ - - @@ -613,7 +613,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/home_manager_extra_code_title" /> - + Manager - Magisk System Yes From 9e66310c2842b808d0b71de7ca1330bff76248d4 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Tue, 29 Oct 2019 16:58:46 +0100 Subject: [PATCH 110/254] Updated fragment container --- app/src/main/res/layout/activity_main_md2.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_main_md2.xml b/app/src/main/res/layout/activity_main_md2.xml index 64bfeba23..d5593e444 100644 --- a/app/src/main/res/layout/activity_main_md2.xml +++ b/app/src/main/res/layout/activity_main_md2.xml @@ -19,7 +19,7 @@ android:paddingRight="@{viewModel.insets.right}" tools:ignore="RtlHardcoded"> - From 588e94c11d4aa8461b25ebd31854973c2e3191f6 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Wed, 30 Oct 2019 17:11:42 +0100 Subject: [PATCH 111/254] Updated locations of certain elements Settings are now only on home screen as it directly relates to what user might want to do. It is highly unlikely that they would jump from any other screen to settings. Log is no longer main destination as it's not used very widely; it's been moved to Superuser screen. This screen now encapsulates all root-related stuff. Home screen is now strictly info-based, except install buttons, of course. --- .../topjohnwu/magisk/redesign/MainActivity.kt | 11 ++--------- .../magisk/redesign/compat/CompatFragment.kt | 2 ++ .../magisk/redesign/home/HomeFragment.kt | 14 ++++++++++++++ .../redesign/superuser/SuperuserFragment.kt | 15 ++++++++++++++- app/src/main/res/layout/activity_main_md2.xml | 2 +- app/src/main/res/menu/menu_bottom_nav.xml | 18 +++--------------- app/src/main/res/menu/menu_home_md2.xml | 11 +++++++++++ app/src/main/res/menu/menu_superuser_md2.xml | 11 +++++++++++ 8 files changed, 58 insertions(+), 26 deletions(-) create mode 100644 app/src/main/res/menu/menu_home_md2.xml create mode 100644 app/src/main/res/menu/menu_superuser_md2.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index 6563bb886..75571b3e6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -21,9 +21,7 @@ import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.redesign.compat.CompatActivity import com.topjohnwu.magisk.redesign.compat.CompatNavigationDelegate import com.topjohnwu.magisk.redesign.home.HomeFragment -import com.topjohnwu.magisk.redesign.log.LogFragment import com.topjohnwu.magisk.redesign.module.ModuleFragment -import com.topjohnwu.magisk.redesign.settings.SettingsFragment import com.topjohnwu.magisk.redesign.superuser.SuperuserFragment import com.topjohnwu.magisk.utils.HideBottomViewOnScrollBehavior import com.topjohnwu.magisk.utils.HideTopViewOnScrollBehavior @@ -43,9 +41,7 @@ open class MainActivity : CompatActivity( override val baseFragments: List> = listOf( HomeFragment::class, ModuleFragment::class, - SuperuserFragment::class, - LogFragment::class, - SettingsFragment::class + SuperuserFragment::class ) //This temporarily fixes unwanted feature of BottomNavigationView - where the view applies @@ -72,8 +68,6 @@ open class MainActivity : CompatActivity( R.id.homeFragment -> Navigation.home() R.id.modulesFragment -> Navigation.modules() R.id.superuserFragment -> Navigation.superuser() - R.id.logFragment -> Navigation.log() - R.id.settingsFragment -> Navigation.settings() else -> throw NotImplementedError("Id ${it.itemId} is not defined as selectable") }.dispatchOnSelf() true @@ -82,7 +76,7 @@ open class MainActivity : CompatActivity( binding.mainNavigation.viewTreeObserver.addOnGlobalLayoutListener(navObserver) if (intent.getBooleanExtra(Const.Key.OPEN_SETTINGS, false)) { - binding.mainNavigation.selectedItemId = R.id.settingsFragment + Navigation.settings().dispatchOnSelf() } if (savedInstanceState != null) { @@ -97,7 +91,6 @@ open class MainActivity : CompatActivity( val isRoot = Shell.rootAccess() findItem(R.id.modulesFragment)?.isEnabled = isRoot findItem(R.id.superuserFragment)?.isEnabled = isRoot - findItem(R.id.logFragment)?.isEnabled = isRoot } } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt index b25d324d5..a773770c1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt @@ -42,4 +42,6 @@ abstract class CompatFragment() { override fun onStart() { super.onStart() activity.title = resources.getString(R.string.section_home) + setHasOptionsMenu(true) } + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.menu_home_md2, menu) + } + + override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { + R.id.action_settings -> Navigation.settings().dispatchOnSelf() + else -> null + }?.let { true } ?: super.onOptionsItemSelected(item) + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt index 1e3d3a772..8575aa357 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt @@ -1,8 +1,12 @@ package com.topjohnwu.magisk.redesign.superuser import android.graphics.Insets +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentSuperuserMd2Binding +import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.redesign.compat.CompatFragment import org.koin.androidx.viewmodel.ext.android.viewModel @@ -15,8 +19,17 @@ class SuperuserFragment : CompatFragment Navigation.log().dispatchOnSelf() + else -> null + }?.let { true } ?: super.onOptionsItemSelected(item) + } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_md2.xml b/app/src/main/res/layout/activity_main_md2.xml index d5593e444..703ca8054 100644 --- a/app/src/main/res/layout/activity_main_md2.xml +++ b/app/src/main/res/layout/activity_main_md2.xml @@ -47,7 +47,7 @@ style="?styleCardElevated" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="bottom" + android:layout_gravity="bottom|center_horizontal" android:layout_marginStart="@dimen/l1" android:layout_marginEnd="@dimen/l1" android:layout_marginBottom="@{(int) @dimen/l1 + viewModel.insets.bottom}" diff --git a/app/src/main/res/menu/menu_bottom_nav.xml b/app/src/main/res/menu/menu_bottom_nav.xml index 31c468243..dd797ea46 100644 --- a/app/src/main/res/menu/menu_bottom_nav.xml +++ b/app/src/main/res/menu/menu_bottom_nav.xml @@ -8,12 +8,6 @@ android:title="@string/section_home" tools:showAsAction="always" /> - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_home_md2.xml b/app/src/main/res/menu/menu_home_md2.xml new file mode 100644 index 000000000..0825147da --- /dev/null +++ b/app/src/main/res/menu/menu_home_md2.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_superuser_md2.xml b/app/src/main/res/menu/menu_superuser_md2.xml new file mode 100644 index 000000000..c5e26ffd2 --- /dev/null +++ b/app/src/main/res/menu/menu_superuser_md2.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file From 86551909fccf2f900c151440844a2c3f87ce4d40 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Wed, 30 Oct 2019 17:54:43 +0100 Subject: [PATCH 112/254] Added safe mode notice to modules screen --- .../magisk/redesign/module/ModuleFragment.kt | 3 ++ .../magisk/redesign/module/ModuleViewModel.kt | 13 ++++- .../main/res/layout/fragment_module_md2.xml | 49 +++++++++++++++++-- app/src/main/res/values/strings_md2.xml | 2 + 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt index 51117413f..c252eaf18 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt @@ -1,5 +1,6 @@ package com.topjohnwu.magisk.redesign.module +import android.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentModuleMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment @@ -10,6 +11,8 @@ class ModuleFragment : CompatFragment override val layoutRes = R.layout.fragment_module_md2 override val viewModel by viewModel() + override fun consumeSystemWindowInsets(insets: Insets) = insets + override fun onStart() { super.onStart() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index 8ae35ecb0..35979b2e7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -1,5 +1,16 @@ package com.topjohnwu.magisk.redesign.module +import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.model.entity.recycler.ModuleRvItem import com.topjohnwu.magisk.redesign.compat.CompatViewModel +import com.topjohnwu.magisk.redesign.home.itemBindingOf +import com.topjohnwu.magisk.redesign.superuser.diffListOf -class ModuleViewModel : CompatViewModel() \ No newline at end of file +class ModuleViewModel : CompatViewModel() { + + val items = diffListOf() + val itemBinding = itemBindingOf { + it.bindExtra(BR.viewModel, this) + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_module_md2.xml b/app/src/main/res/layout/fragment_module_md2.xml index aec90e437..36d00c488 100644 --- a/app/src/main/res/layout/fragment_module_md2.xml +++ b/app/src/main/res/layout/fragment_module_md2.xml @@ -1,8 +1,12 @@ - + + + @@ -11,12 +15,51 @@ + android:fillViewport="true" + android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size}" + android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/l2}" + tools:paddingTop="24dp"> + android:layout_height="wrap_content"> + + + + + + + + + + diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index 39e731cdb..6f01e8357 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -68,4 +68,6 @@ Next Let\'s go + You\'re in safe mode. None of user modules will work.\nThis message will disappear once safe mode is disabled. + \ No newline at end of file From 722fba7805fe23cf8b9ee45aceb553bd50e27e74 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Wed, 30 Oct 2019 21:09:00 +0100 Subject: [PATCH 113/254] Updated bottom nav width to not spread useless spaces --- app/src/main/res/layout/activity_main_md2.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_main_md2.xml b/app/src/main/res/layout/activity_main_md2.xml index 703ca8054..839ed6d13 100644 --- a/app/src/main/res/layout/activity_main_md2.xml +++ b/app/src/main/res/layout/activity_main_md2.xml @@ -45,7 +45,7 @@ Date: Wed, 30 Oct 2019 21:58:42 +0100 Subject: [PATCH 114/254] Added implementation of hide screen Very much wip and doesn't work at all --- .../com/topjohnwu/magisk/di/RedesignModule.kt | 2 +- .../com/topjohnwu/magisk/extensions/RxJava.kt | 33 ++--- .../magisk/model/entity/HideAppInfo.kt | 10 ++ .../model/entity/recycler/HideRvItem.kt | 51 ++++++++ .../magisk/redesign/hide/HideFragment.kt | 3 + .../magisk/redesign/hide/HideViewModel.kt | 121 +++++++++++++++++- .../res/drawable/ic_radio_check_button.xml | 31 +++++ app/src/main/res/layout/fragment_hide_md2.xml | 27 ++-- app/src/main/res/layout/item_hide_md2.xml | 118 +++++++++++++++++ .../main/res/layout/item_hide_process_md2.xml | 56 ++++++++ 10 files changed, 426 insertions(+), 26 deletions(-) create mode 100644 app/src/main/res/layout/item_hide_md2.xml create mode 100644 app/src/main/res/layout/item_hide_process_md2.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt index b4f3bac25..36effd49a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt @@ -17,7 +17,7 @@ import org.koin.dsl.module val redesignModule = module { viewModel { FlashViewModel() } - viewModel { HideViewModel() } + viewModel { HideViewModel(get(), get()) } viewModel { HomeViewModel(get()) } viewModel { LogViewModel() } viewModel { ModuleViewModel() } diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/RxJava.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/RxJava.kt index a4eefb0e9..69c74c9f2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/RxJava.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/RxJava.kt @@ -43,35 +43,35 @@ typealias OnErrorListener = (Throwable) -> Unit /*=== ALIASES FOR OBSERVABLES ===*/ fun Observable.subscribeK( - onError: OnErrorListener = { it.printStackTrace() }, - onComplete: OnCompleteListener = {}, - onNext: OnSuccessListener = {} + onError: OnErrorListener = { it.printStackTrace() }, + onComplete: OnCompleteListener = {}, + onNext: OnSuccessListener = {} ) = applySchedulers() .subscribe(onNext, onError, onComplete) fun Single.subscribeK( - onError: OnErrorListener = { it.printStackTrace() }, - onNext: OnSuccessListener = {} + onError: OnErrorListener = { it.printStackTrace() }, + onNext: OnSuccessListener = {} ) = applySchedulers() .subscribe(onNext, onError) fun Maybe.subscribeK( - onError: OnErrorListener = { it.printStackTrace() }, - onComplete: OnCompleteListener = {}, - onNext: OnSuccessListener = {} + onError: OnErrorListener = { it.printStackTrace() }, + onComplete: OnCompleteListener = {}, + onNext: OnSuccessListener = {} ) = applySchedulers() .subscribe(onNext, onError, onComplete) fun Flowable.subscribeK( - onError: OnErrorListener = { it.printStackTrace() }, - onComplete: OnCompleteListener = {}, - onNext: OnSuccessListener = {} + onError: OnErrorListener = { it.printStackTrace() }, + onComplete: OnCompleteListener = {}, + onNext: OnSuccessListener = {} ) = applySchedulers() .subscribe(onNext, onError, onComplete) fun Completable.subscribeK( - onError: OnErrorListener = { it.printStackTrace() }, - onComplete: OnCompleteListener = {} + onError: OnErrorListener = { it.printStackTrace() }, + onComplete: OnCompleteListener = {} ) = applySchedulers() .subscribe(onComplete, onError) @@ -197,5 +197,8 @@ fun ObservableField.toObservable(): Observable { fun T.toSingle() = Single.just(this) -fun zip(t1: Single, t2: Single, zipper: (T1, T2) -> R) = - Single.zip(t1, t2, BiFunction { rt1, rt2 -> zipper(rt1, rt2) }) +inline fun zip( + t1: Single, + t2: Single, + crossinline zipper: (T1, T2) -> R +) = Single.zip(t1, t2, BiFunction { rt1, rt2 -> zipper(rt1, rt2) }) \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/HideAppInfo.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/HideAppInfo.kt index 5d6b3f7dd..6cbc24c5c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/HideAppInfo.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/HideAppInfo.kt @@ -14,3 +14,13 @@ class HideAppInfo( val processes = info.packageInfo?.processes?.distinct() ?: listOf(info.packageName) } + +data class StatefulProcess( + val name: String, + val isHidden: Boolean +) + +class ProcessHideApp( + val info: HideAppInfo, + val processes: List +) \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt index bf7a0d2a3..ceb0390d1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt @@ -1,18 +1,69 @@ package com.topjohnwu.magisk.model.entity.recycler +import android.view.View +import android.view.ViewGroup import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.addOnPropertyChangedCallback import com.topjohnwu.magisk.extensions.inject +import com.topjohnwu.magisk.extensions.startAnimations import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.model.entity.HideAppInfo import com.topjohnwu.magisk.model.entity.HideTarget +import com.topjohnwu.magisk.model.entity.ProcessHideApp +import com.topjohnwu.magisk.model.entity.StatefulProcess import com.topjohnwu.magisk.model.entity.state.IndeterminateState import com.topjohnwu.magisk.model.events.HideProcessEvent import com.topjohnwu.magisk.utils.DiffObservableList import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.RxBus +class HideItem(val item: ProcessHideApp) : ComparableRvItem() { + + override val layoutRes = R.layout.item_hide_md2 + + val items = item.processes.map { HideProcessItem(it) } + + val isExpanded = KObservableField(false) + val itemsChecked = KObservableField(0) + val isHidden get() = itemsChecked.value == items.size + + init { + items.forEach { it.isHidden.addOnPropertyChangedCallback { recalculateChecked() } } + } + + fun collapse(v: View) { + (v.parent.parent as? ViewGroup)?.startAnimations() + isExpanded.value = false + } + + fun expand(v: View) { + (v.parent as? ViewGroup)?.startAnimations() + isExpanded.value = true + } + + private fun recalculateChecked() { + itemsChecked.value = items.count { it.isHidden.value } + } + + override fun contentSameAs(other: HideItem): Boolean = item == other.item + override fun itemSameAs(other: HideItem): Boolean = item.info == other.item.info + +} + +class HideProcessItem(val item: StatefulProcess) : ComparableRvItem() { + + override val layoutRes = R.layout.item_hide_process_md2 + + val isHidden = KObservableField(item.isHidden) + + fun toggle() = isHidden.toggle() + + override fun contentSameAs(other: HideProcessItem) = item == other.item + override fun itemSameAs(other: HideProcessItem) = item.name == other.item.name + +} + class HideRvItem(val item: HideAppInfo, targets: List) : ComparableRvItem() { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt index d6d9459b4..55af466ff 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt @@ -1,6 +1,7 @@ package com.topjohnwu.magisk.redesign.hide import android.content.Context +import android.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentHideMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment @@ -11,6 +12,8 @@ class HideFragment : CompatFragment() { override val layoutRes = R.layout.fragment_hide_md2 override val viewModel by viewModel() + override fun consumeSystemWindowInsets(insets: Insets) = insets + override fun onAttach(context: Context) { super.onAttach(context) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt index 683d5007d..a9be0ade7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt @@ -1,5 +1,124 @@ package com.topjohnwu.magisk.redesign.hide +import android.content.pm.ApplicationInfo +import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.data.repository.MagiskRepository +import com.topjohnwu.magisk.extensions.subscribeK +import com.topjohnwu.magisk.extensions.toSingle +import com.topjohnwu.magisk.model.entity.HideAppInfo +import com.topjohnwu.magisk.model.entity.HideTarget +import com.topjohnwu.magisk.model.entity.ProcessHideApp +import com.topjohnwu.magisk.model.entity.StatefulProcess +import com.topjohnwu.magisk.model.entity.recycler.HideItem +import com.topjohnwu.magisk.model.entity.recycler.HideProcessItem +import com.topjohnwu.magisk.model.entity.recycler.HideProcessRvItem +import com.topjohnwu.magisk.model.events.HideProcessEvent import com.topjohnwu.magisk.redesign.compat.CompatViewModel +import com.topjohnwu.magisk.redesign.home.itemBindingOf +import com.topjohnwu.magisk.redesign.superuser.diffListOf +import com.topjohnwu.magisk.utils.KObservableField +import com.topjohnwu.magisk.utils.RxBus +import com.topjohnwu.magisk.utils.currentLocale +import io.reactivex.disposables.Disposable +import java.util.* -class HideViewModel : CompatViewModel() \ No newline at end of file +class HideViewModel( + private val magiskRepo: MagiskRepository, + rxBus: RxBus +) : CompatViewModel() { + + @Volatile + private var cache = listOf() + set(value) { + field = Collections.synchronizedList(value) + } + private var queryJob: Disposable? = null + set(value) { + field?.dispose() + field = value + } + + val query = KObservableField("") + val isShowSystem = KObservableField(true) + val items = diffListOf() + val itemBinding = itemBindingOf { + it.bindExtra(BR.viewModel, this) + } + val itemInternalBinding = itemBindingOf { + it.bindExtra(BR.viewModel, this) + } + + init { + rxBus.register() + .subscribeK { toggleItem(it.item) } + .add() + } + + override fun refresh() = magiskRepo.fetchApps() + .map { it to magiskRepo.fetchHideTargets().blockingGet() } + .map { pair -> pair.first.map { mergeAppTargets(it, pair.second) } } + .flattenAsFlowable { it } + .map { HideItem(it) } + .toList() + .map { it.sort() } + .subscribeK { + cache = it + queryIfNecessary() + } + + override fun onCleared() { + queryJob?.dispose() + super.onCleared() + } + + // --- + + private fun mergeAppTargets(a: HideAppInfo, ts: List): ProcessHideApp { + val relevantTargets = ts.filter { it.packageName == a.info.packageName } + val processes = a.processes + .map { StatefulProcess(it, relevantTargets.any { i -> it == i.process }) } + return ProcessHideApp(a, processes) + } + + private fun List.sort() = sortedWith(compareBy( + { it.isHidden }, + { it.item.info.name.toLowerCase(currentLocale) }, + { it.item.info.info.packageName } + )) + + // --- + + /** We don't need to re-query when the app count matches. */ + private fun queryIfNecessary() { + if (items.size != cache.size) { + query() + } + } + + private fun query( + query: String = this.query.value, + showSystem: Boolean = isShowSystem.value + ) = cache.toSingle() + .flattenAsFlowable { it } + .parallel() + .filter { showSystem || it.item.info.info.flags and ApplicationInfo.FLAG_SYSTEM == 0 } + .filter { + val inName = it.item.info.name.contains(query, true) + val inPackage = it.item.info.info.packageName.contains(query, true) + val inProcesses = it.item.processes.any { it.name.contains(query, true) } + inName || inPackage || inProcesses + } + .sequential() + .toList() + .map { it to items.calculateDiff(it) } + .subscribeK { items.update(it.first, it.second) } + .let { queryJob = it } + + // --- + + private fun toggleItem(item: HideProcessRvItem) = magiskRepo + .toggleHide(item.isHidden.value, item.packageName, item.process) + .subscribeK() + .add() + +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_radio_check_button.xml b/app/src/main/res/drawable/ic_radio_check_button.xml index 9c6c7ef92..22e623203 100644 --- a/app/src/main/res/drawable/ic_radio_check_button.xml +++ b/app/src/main/res/drawable/ic_radio_check_button.xml @@ -22,6 +22,27 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_hide_md2.xml b/app/src/main/res/layout/fragment_hide_md2.xml index 30bddc477..a3431b8ff 100644 --- a/app/src/main/res/layout/fragment_hide_md2.xml +++ b/app/src/main/res/layout/fragment_hide_md2.xml @@ -1,23 +1,32 @@ - + + + - - - - - + android:clipToPadding="false" + android:orientation="vertical" + android:paddingStart="@dimen/l1" + android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l1}" + android:paddingEnd="@dimen/l1" + android:paddingBottom="@{viewModel.insets.bottom}" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + tools:listitem="@layout/item_hide_md2" + tools:paddingTop="40dp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_hide_md2.xml b/app/src/main/res/layout/item_hide_md2.xml new file mode 100644 index 000000000..f076fdb93 --- /dev/null +++ b/app/src/main/res/layout/item_hide_md2.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_hide_process_md2.xml b/app/src/main/res/layout/item_hide_process_md2.xml new file mode 100644 index 000000000..fb08d69f9 --- /dev/null +++ b/app/src/main/res/layout/item_hide_process_md2.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 6aa22267f46e499555c4f16d196d3425cb34efdf Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 31 Oct 2019 20:34:07 +0100 Subject: [PATCH 115/254] Updated Hide screen to be fully functioning ...although still misses search :( --- .../com/topjohnwu/magisk/di/RedesignModule.kt | 2 +- .../magisk/model/entity/HideAppInfo.kt | 1 + .../model/entity/recycler/HideRvItem.kt | 24 +++- .../magisk/redesign/hide/HideFragment.kt | 14 ++- .../magisk/redesign/hide/HideViewModel.kt | 105 ++++++++---------- .../magisk/utils/DataBindingAdapters.kt | 5 + .../magisk/utils/DiffObservableList.kt | 6 +- .../utils/FilterableDiffObservableList.kt | 85 ++++++++++++++ app/src/main/res/layout/item_hide_md2.xml | 5 + .../main/res/layout/item_hide_process_md2.xml | 6 +- app/src/main/res/menu/menu_hide_item.xml | 9 ++ app/src/main/res/menu/menu_hide_md2.xml | 9 ++ 12 files changed, 202 insertions(+), 69 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/utils/FilterableDiffObservableList.kt create mode 100644 app/src/main/res/menu/menu_hide_item.xml create mode 100644 app/src/main/res/menu/menu_hide_md2.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt index 36effd49a..631e7b0dc 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt @@ -17,7 +17,7 @@ import org.koin.dsl.module val redesignModule = module { viewModel { FlashViewModel() } - viewModel { HideViewModel(get(), get()) } + viewModel { HideViewModel(get()) } viewModel { HomeViewModel(get()) } viewModel { LogViewModel() } viewModel { ModuleViewModel() } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/HideAppInfo.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/HideAppInfo.kt index 6cbc24c5c..73d1410ea 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/HideAppInfo.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/HideAppInfo.kt @@ -17,6 +17,7 @@ class HideAppInfo( data class StatefulProcess( val name: String, + val packageName: String, val isHidden: Boolean ) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt index ceb0390d1..9e50a8cc9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt @@ -1,5 +1,6 @@ package com.topjohnwu.magisk.model.entity.recycler +import android.view.MenuItem import android.view.View import android.view.ViewGroup import com.topjohnwu.magisk.R @@ -14,6 +15,7 @@ import com.topjohnwu.magisk.model.entity.ProcessHideApp import com.topjohnwu.magisk.model.entity.StatefulProcess import com.topjohnwu.magisk.model.entity.state.IndeterminateState import com.topjohnwu.magisk.model.events.HideProcessEvent +import com.topjohnwu.magisk.redesign.hide.HideViewModel import com.topjohnwu.magisk.utils.DiffObservableList import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.RxBus @@ -22,14 +24,18 @@ class HideItem(val item: ProcessHideApp) : ComparableRvItem() { override val layoutRes = R.layout.item_hide_md2 + val packageName = item.info.info.packageName.orEmpty() val items = item.processes.map { HideProcessItem(it) } val isExpanded = KObservableField(false) val itemsChecked = KObservableField(0) - val isHidden get() = itemsChecked.value == items.size + + /** [toggle] depends on this functionality */ + private val isHidden get() = itemsChecked.value == items.size init { items.forEach { it.isHidden.addOnPropertyChangedCallback { recalculateChecked() } } + recalculateChecked() } fun collapse(v: View) { @@ -42,6 +48,17 @@ class HideItem(val item: ProcessHideApp) : ComparableRvItem() { isExpanded.value = true } + fun toggle(menuItem: MenuItem, viewModel: HideViewModel): Boolean { + if (menuItem.itemId != R.id.action_toggle) return false + // contract implies that isHidden == all checked + if (!isHidden) { + items.filterNot { it.isHidden.value } + } else { + items + }.forEach { it.toggle(viewModel) } + return true + } + private fun recalculateChecked() { itemsChecked.value = items.count { it.isHidden.value } } @@ -57,7 +74,10 @@ class HideProcessItem(val item: StatefulProcess) : ComparableRvItem() { override fun onAttach(context: Context) { super.onAttach(context) - activity.setTitle(R.string.magiskhide) + setHasOptionsMenu(true) + } + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.menu_hide_md2, menu) + menu.findItem(R.id.action_show_system)?.isChecked = viewModel.isShowSystem + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return viewModel.menuItemPressed(item) } } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt index a9be0ade7..f78cb65f0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt @@ -1,46 +1,37 @@ package com.topjohnwu.magisk.redesign.hide import android.content.pm.ApplicationInfo +import android.view.MenuItem import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.repository.MagiskRepository +import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.subscribeK -import com.topjohnwu.magisk.extensions.toSingle import com.topjohnwu.magisk.model.entity.HideAppInfo import com.topjohnwu.magisk.model.entity.HideTarget import com.topjohnwu.magisk.model.entity.ProcessHideApp import com.topjohnwu.magisk.model.entity.StatefulProcess import com.topjohnwu.magisk.model.entity.recycler.HideItem import com.topjohnwu.magisk.model.entity.recycler.HideProcessItem -import com.topjohnwu.magisk.model.entity.recycler.HideProcessRvItem -import com.topjohnwu.magisk.model.events.HideProcessEvent import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.redesign.home.itemBindingOf -import com.topjohnwu.magisk.redesign.superuser.diffListOf +import com.topjohnwu.magisk.utils.DiffObservableList +import com.topjohnwu.magisk.utils.FilterableDiffObservableList import com.topjohnwu.magisk.utils.KObservableField -import com.topjohnwu.magisk.utils.RxBus import com.topjohnwu.magisk.utils.currentLocale -import io.reactivex.disposables.Disposable -import java.util.* class HideViewModel( - private val magiskRepo: MagiskRepository, - rxBus: RxBus + private val magiskRepo: MagiskRepository ) : CompatViewModel() { - @Volatile - private var cache = listOf() + var isShowSystem = false set(value) { - field = Collections.synchronizedList(value) - } - private var queryJob: Disposable? = null - set(value) { - field?.dispose() field = value + query() } val query = KObservableField("") - val isShowSystem = KObservableField(true) - val items = diffListOf() + val items = filterableListOf() val itemBinding = itemBindingOf { it.bindExtra(BR.viewModel, this) } @@ -48,12 +39,6 @@ class HideViewModel( it.bindExtra(BR.viewModel, this) } - init { - rxBus.register() - .subscribeK { toggleItem(it.item) } - .add() - } - override fun refresh() = magiskRepo.fetchApps() .map { it to magiskRepo.fetchHideTargets().blockingGet() } .map { pair -> pair.first.map { mergeAppTargets(it, pair.second) } } @@ -61,64 +46,66 @@ class HideViewModel( .map { HideItem(it) } .toList() .map { it.sort() } + .map { it to items.calculateDiff(it) } .subscribeK { - cache = it - queryIfNecessary() + items.update(it.first, it.second) + query() } - override fun onCleared() { - queryJob?.dispose() - super.onCleared() - } - // --- private fun mergeAppTargets(a: HideAppInfo, ts: List): ProcessHideApp { val relevantTargets = ts.filter { it.packageName == a.info.packageName } + val packageName = a.info.packageName val processes = a.processes - .map { StatefulProcess(it, relevantTargets.any { i -> it == i.process }) } + .map { StatefulProcess(it, packageName, relevantTargets.any { i -> it == i.process }) } return ProcessHideApp(a, processes) } - private fun List.sort() = sortedWith(compareBy( - { it.isHidden }, - { it.item.info.name.toLowerCase(currentLocale) }, - { it.item.info.info.packageName } - )) + private fun List.sort() = compareByDescending { it.itemsChecked.value } + .thenBy { it.item.info.name.toLowerCase(currentLocale) } + .thenBy { it.item.info.info.packageName } + .let { sortedWith(it) } // --- - /** We don't need to re-query when the app count matches. */ - private fun queryIfNecessary() { - if (items.size != cache.size) { - query() - } - } - private fun query( query: String = this.query.value, - showSystem: Boolean = isShowSystem.value - ) = cache.toSingle() - .flattenAsFlowable { it } - .parallel() - .filter { showSystem || it.item.info.info.flags and ApplicationInfo.FLAG_SYSTEM == 0 } - .filter { + showSystem: Boolean = isShowSystem + ) = items.filter { + fun filterSystem(): Boolean { + return showSystem || it.item.info.info.flags and ApplicationInfo.FLAG_SYSTEM == 0 + } + + fun filterQuery(): Boolean { val inName = it.item.info.name.contains(query, true) val inPackage = it.item.info.info.packageName.contains(query, true) val inProcesses = it.item.processes.any { it.name.contains(query, true) } - inName || inPackage || inProcesses + return inName || inPackage || inProcesses } - .sequential() - .toList() - .map { it to items.calculateDiff(it) } - .subscribeK { items.update(it.first, it.second) } - .let { queryJob = it } + + filterSystem() && filterQuery() + } // --- - private fun toggleItem(item: HideProcessRvItem) = magiskRepo - .toggleHide(item.isHidden.value, item.packageName, item.process) + fun menuItemPressed(menuItem: MenuItem) = when (menuItem.itemId) { + R.id.action_show_system -> isShowSystem = (!menuItem.isChecked) + .also { menuItem.isChecked = it } + else -> null + }?.let { true } ?: false + + fun toggleItem(item: HideProcessItem) = magiskRepo + .toggleHide(item.isHidden.value, item.item.packageName, item.item.name) + // might wanna reorder the list to display the item at the top .subscribeK() .add() -} \ No newline at end of file +} + +inline fun > filterableListOf( + vararg newItems: T +) = FilterableDiffObservableList(object : DiffObservableList.Callback { + override fun areItemsTheSame(oldItem: T, newItem: T) = oldItem.genericItemSameAs(newItem) + override fun areContentsTheSame(oldItem: T, newItem: T) = oldItem.genericContentSameAs(newItem) +}).also { it.update(newItems.toList()) } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index b65a58fff..9d8c0d3d5 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -403,4 +403,9 @@ fun MaterialCardView.setCardElevationBound(elevation: Float) { @BindingAdapter("strokeWidth") fun MaterialCardView.setCardStrokeWidthBound(stroke: Float) { strokeWidth = stroke.roundToInt() +} + +@BindingAdapter("onMenuClick") +fun Toolbar.setOnMenuClickListener(listener: Toolbar.OnMenuItemClickListener) { + setOnMenuItemClickListener(listener) } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DiffObservableList.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DiffObservableList.kt index c7c61d968..b658d08fe 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DiffObservableList.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DiffObservableList.kt @@ -18,9 +18,9 @@ open class DiffObservableList( ) : AbstractList(), ObservableList { private val LIST_LOCK = Object() - private var list: MutableList = ArrayList() + protected var list: MutableList = ArrayList() private val listeners = ListChangeRegistry() - private val listCallback = ObservableListUpdateCallback() + protected val listCallback = ObservableListUpdateCallback() override val size: Int get() = list.size @@ -38,7 +38,7 @@ open class DiffObservableList( return doCalculateDiff(frozenList, newItems) } - private fun doCalculateDiff(oldItems: List, newItems: List?): DiffUtil.DiffResult { + protected fun doCalculateDiff(oldItems: List, newItems: List?): DiffUtil.DiffResult { return DiffUtil.calculateDiff(object : DiffUtil.Callback() { override fun getOldListSize() = oldItems.size diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/FilterableDiffObservableList.kt b/app/src/main/java/com/topjohnwu/magisk/utils/FilterableDiffObservableList.kt new file mode 100644 index 000000000..80e10f968 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/utils/FilterableDiffObservableList.kt @@ -0,0 +1,85 @@ +package com.topjohnwu.magisk.utils + +import android.os.Handler +import android.os.HandlerThread +import android.os.Looper +import java.util.* + +class FilterableDiffObservableList( + callback: Callback +) : DiffObservableList(callback) { + + var filter: ((T) -> Boolean)? = null + set(value) { + field = value + queueUpdate() + } + @Volatile + private var sublist: MutableList = super.list + + // --- + + private val ui by lazy { Handler(Looper.getMainLooper()) } + private val handler = Handler(HandlerThread("List${hashCode()}").apply { start() }.looper) + private val updater = Runnable { + val filter = filter ?: { true } + val newList = super.list.filter(filter) + val diff = synchronized(this) { doCalculateDiff(sublist, newList) } + ui.post { + sublist = Collections.synchronizedList(newList) + diff.dispatchUpdatesTo(listCallback) + } + } + + private fun queueUpdate() { + handler.removeCallbacks(updater) + handler.post(updater) + } + + fun hasFilter() = filter != null + + fun filter(switch: (T) -> Boolean) { + filter = switch + } + + fun reset() { + filter = null + } + + // --- + + override fun get(index: Int): T { + return sublist.get(index) + } + + override fun add(element: T): Boolean { + return sublist.add(element) + } + + override fun add(index: Int, element: T) { + sublist.add(index, element) + } + + override fun addAll(elements: Collection): Boolean { + return sublist.addAll(elements) + } + + override fun addAll(index: Int, elements: Collection): Boolean { + return sublist.addAll(index, elements) + } + + override fun remove(element: T): Boolean { + return sublist.remove(element) + } + + override fun removeAt(index: Int): T { + return sublist.removeAt(index) + } + + override fun set(index: Int, element: T): T { + return sublist.set(index, element) + } + + override val size: Int + get() = sublist.size +} \ No newline at end of file diff --git a/app/src/main/res/layout/item_hide_md2.xml b/app/src/main/res/layout/item_hide_md2.xml index f076fdb93..dd02ade2f 100644 --- a/app/src/main/res/layout/item_hide_md2.xml +++ b/app/src/main/res/layout/item_hide_md2.xml @@ -59,6 +59,8 @@ diff --git a/app/src/main/res/layout/item_hide_process_md2.xml b/app/src/main/res/layout/item_hide_process_md2.xml index fb08d69f9..79be5fc5a 100644 --- a/app/src/main/res/layout/item_hide_process_md2.xml +++ b/app/src/main/res/layout/item_hide_process_md2.xml @@ -17,6 +17,8 @@ @@ -41,10 +43,8 @@ style="?styleImageSmall" isSelected="@{item.isHidden}" android:layout_marginTop="@dimen/l_50" - android:layout_marginEnd="@dimen/l1" + android:layout_marginEnd="@dimen/l_75" android:layout_marginBottom="@dimen/l_50" - android:background="?selectableItemBackgroundBorderless" - android:onClick="@{() -> item.toggle()}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/menu/menu_hide_item.xml b/app/src/main/res/menu/menu_hide_item.xml new file mode 100644 index 000000000..6973f2634 --- /dev/null +++ b/app/src/main/res/menu/menu_hide_item.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_hide_md2.xml b/app/src/main/res/menu/menu_hide_md2.xml new file mode 100644 index 000000000..9514ec2bc --- /dev/null +++ b/app/src/main/res/menu/menu_hide_md2.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file From 5e089451af41e3c5752680eeaa120cf5f88262b4 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 31 Oct 2019 20:53:37 +0100 Subject: [PATCH 116/254] Added loaders to superuser and hide --- .../magisk/redesign/hide/HideViewModel.kt | 1 + app/src/main/res/layout/fragment_hide_md2.xml | 56 ++++++++++++++----- .../res/layout/fragment_superuser_md2.xml | 46 +++++++++++---- 3 files changed, 78 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt index f78cb65f0..15927cf7d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt @@ -47,6 +47,7 @@ class HideViewModel( .toList() .map { it.sort() } .map { it to items.calculateDiff(it) } + .applyViewModel(this) .subscribeK { items.update(it.first, it.second) query() diff --git a/app/src/main/res/layout/fragment_hide_md2.xml b/app/src/main/res/layout/fragment_hide_md2.xml index a3431b8ff..e9619e9c6 100644 --- a/app/src/main/res/layout/fragment_hide_md2.xml +++ b/app/src/main/res/layout/fragment_hide_md2.xml @@ -13,20 +13,48 @@ - + android:layout_height="match_parent"> + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_superuser_md2.xml b/app/src/main/res/layout/fragment_superuser_md2.xml index 99ca82e87..89f00bcd8 100644 --- a/app/src/main/res/layout/fragment_superuser_md2.xml +++ b/app/src/main/res/layout/fragment_superuser_md2.xml @@ -26,19 +26,19 @@ + android:orientation="vertical" + android:paddingTop="@dimen/l1"> + + + + + + + + From db2e48b49f71ddec24b1aa3d47c397d5e369f2e7 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 31 Oct 2019 20:58:17 +0100 Subject: [PATCH 117/254] Added manager mode recognition --- app/src/main/res/layout/fragment_home_md2.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index ca90de768..1ea204b03 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -11,6 +11,8 @@ + + @@ -613,11 +615,10 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/home_manager_extra_code_title" /> - - Date: Fri, 1 Nov 2019 17:55:25 +0100 Subject: [PATCH 118/254] Fixed inconsistent icon sizes --- app/src/main/res/layout/dialog_magisk_base.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/layout/dialog_magisk_base.xml b/app/src/main/res/layout/dialog_magisk_base.xml index 0823d5323..72da0179f 100644 --- a/app/src/main/res/layout/dialog_magisk_base.xml +++ b/app/src/main/res/layout/dialog_magisk_base.xml @@ -19,8 +19,8 @@ style="?styleCardElevated" android:layout_width="0dp" android:layout_height="wrap_content" - app:cardUseCompatPadding="true" app:cardElevation="@dimen/margin_generic" + app:cardUseCompatPadding="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" @@ -56,13 +56,13 @@ app:layout_constraintTop_toTopOf="parent"> + tools:src="@drawable/ic_delete_md2" /> + tools:src="@drawable/ic_delete_md2" /> From fe5c65d798242d1225816cec252fd7aa0ddd7aff Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 1 Nov 2019 17:58:42 +0100 Subject: [PATCH 119/254] Fixed use of RxBus for toggling policies --- .../model/entity/recycler/PolicyRvItem.kt | 53 +++++++++++++++++-- .../redesign/superuser/SuperuserViewModel.kt | 23 ++++---- app/src/main/res/layout/item_policy_md2.xml | 8 +-- 3 files changed, 62 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt index 53a61e0e4..1906573a3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt @@ -3,7 +3,6 @@ package com.topjohnwu.magisk.model.entity.recycler import android.graphics.drawable.Drawable import android.view.View import android.view.ViewGroup -import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.addOnPropertyChangedCallback @@ -12,6 +11,7 @@ import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.model.entity.MagiskPolicy import com.topjohnwu.magisk.model.events.PolicyEnableEvent import com.topjohnwu.magisk.model.events.PolicyUpdateEvent +import com.topjohnwu.magisk.redesign.superuser.SuperuserViewModel import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.RxBus import com.topjohnwu.magisk.utils.rotationTo @@ -19,10 +19,7 @@ import com.topjohnwu.magisk.utils.setRevealed class PolicyRvItem(val item: MagiskPolicy, val icon: Drawable) : ComparableRvItem() { - override val layoutRes: Int = when { - Config.redesign -> R.layout.item_policy_md2 - else -> R.layout.item_policy - } + override val layoutRes = R.layout.item_policy val isExpanded = KObservableField(false) val isEnabled = KObservableField(item.policy == MagiskPolicy.ALLOW) @@ -74,4 +71,50 @@ class PolicyRvItem(val item: MagiskPolicy, val icon: Drawable) : ComparableRvIte override fun contentSameAs(other: PolicyRvItem): Boolean = itemSameAs(other) override fun itemSameAs(other: PolicyRvItem): Boolean = item.uid == other.item.uid +} + +class PolicyItem(val item: MagiskPolicy, val icon: Drawable) : ComparableRvItem() { + override val layoutRes = R.layout.item_policy_md2 + + val isExpanded = KObservableField(false) + val isEnabled = KObservableField(item.policy == MagiskPolicy.ALLOW) + val shouldNotify = KObservableField(item.notification) + val shouldLog = KObservableField(item.logging) + + private val updatedPolicy + get() = item.copy( + policy = if (isEnabled.value) MagiskPolicy.ALLOW else MagiskPolicy.DENY, + notification = shouldNotify.value, + logging = shouldLog.value + ) + + fun toggle(viewModel: SuperuserViewModel) { + if (isExpanded.value) { + return + } + isEnabled.toggle() + viewModel.togglePolicy(this, isEnabled.value) + } + + fun toggle(view: View) { + isExpanded.toggle() + view.rotationTo(if (isExpanded.value) 225 else 180) + (view.parent as ViewGroup) + .findViewById(R.id.expand_layout) + .setRevealed(isExpanded.value) + } + + fun toggleNotify(viewModel: SuperuserViewModel) { + shouldNotify.toggle() + viewModel.updatePolicy(PolicyUpdateEvent.Notification(updatedPolicy)) + } + + fun toggleLog(viewModel: SuperuserViewModel) { + shouldLog.toggle() + viewModel.updatePolicy(PolicyUpdateEvent.Log(updatedPolicy)) + } + + override fun contentSameAs(other: PolicyItem) = itemSameAs(other) + override fun itemSameAs(other: PolicyItem) = item.uid == other.item.uid + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt index 82ac3c0de..5308ed35d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt @@ -10,8 +10,7 @@ import com.topjohnwu.magisk.extensions.applySchedulers import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.model.entity.MagiskPolicy -import com.topjohnwu.magisk.model.entity.recycler.PolicyRvItem -import com.topjohnwu.magisk.model.events.PolicyEnableEvent +import com.topjohnwu.magisk.model.entity.recycler.PolicyItem import com.topjohnwu.magisk.model.events.PolicyUpdateEvent import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.model.events.dialog.FingerprintDialog @@ -22,6 +21,7 @@ import com.topjohnwu.magisk.redesign.home.itemBindingOf import com.topjohnwu.magisk.utils.DiffObservableList import com.topjohnwu.magisk.utils.FingerprintHelper import com.topjohnwu.magisk.utils.RxBus +import com.topjohnwu.magisk.utils.currentLocale import io.reactivex.Single class SuperuserViewModel( @@ -31,15 +31,12 @@ class SuperuserViewModel( private val resources: Resources ) : CompatViewModel() { - val items = diffListOf() - val itemBinding = itemBindingOf { + val items = diffListOf() + val itemBinding = itemBindingOf { it.bindExtra(BR.viewModel, this) } init { - rxBus.register() - .subscribeK { togglePolicy(it.item, it.enable) } - .add() rxBus.register() .subscribeK { updatePolicy(it) } .add() @@ -50,11 +47,11 @@ class SuperuserViewModel( override fun refresh() = db.fetchAll() .flattenAsFlowable { it } .parallel() - .map { PolicyRvItem(it, it.applicationInfo.loadIcon(packageManager)) } + .map { PolicyItem(it, it.applicationInfo.loadIcon(packageManager)) } .sequential() .sorted { o1, o2 -> - compareBy( - { it.item.appName.toLowerCase() }, + compareBy( + { it.item.appName.toLowerCase(currentLocale) }, { it.item.packageName } ).compare(o1, o2) } @@ -69,7 +66,7 @@ class SuperuserViewModel( fun safetynetPressed() = Navigation.safetynet().publish() fun hidePressed() = Navigation.hide().publish() - fun deletePressed(item: PolicyRvItem) { + fun deletePressed(item: PolicyItem) { fun updateState() = deletePolicy(item.item) .subscribeK { items.removeAll { it.itemSameAs(item) } } .add() @@ -88,7 +85,7 @@ class SuperuserViewModel( //--- - private fun updatePolicy(it: PolicyUpdateEvent) = when (it) { + fun updatePolicy(it: PolicyUpdateEvent) = when (it) { is PolicyUpdateEvent.Notification -> updatePolicy(it.item).map { when { it.notification -> R.string.su_snack_notif_on @@ -105,7 +102,7 @@ class SuperuserViewModel( .subscribeK { SnackbarEvent(it).publish() } .add() - private fun togglePolicy(item: PolicyRvItem, enable: Boolean) { + fun togglePolicy(item: PolicyItem, enable: Boolean) { fun updateState() { val policy = if (enable) MagiskPolicy.ALLOW else MagiskPolicy.DENY val app = item.item.copy(policy = policy) diff --git a/app/src/main/res/layout/item_policy_md2.xml b/app/src/main/res/layout/item_policy_md2.xml index 2d69bec7e..215a2bac6 100644 --- a/app/src/main/res/layout/item_policy_md2.xml +++ b/app/src/main/res/layout/item_policy_md2.xml @@ -7,7 +7,7 @@ + type="com.topjohnwu.magisk.model.entity.recycler.PolicyItem" /> @@ -93,7 +93,7 @@ android:id="@+id/bell" style="?styleIconNormal" isSelected="@{item.shouldNotify}" - android:onClick="@{() -> item.toggleNotify()}" + android:onClick="@{() -> item.toggleNotify(viewModel)}" app:layout_constraintBottom_toTopOf="@+id/delete" app:layout_constraintEnd_toStartOf="@+id/bug" app:layout_constraintHorizontal_chainStyle="packed" @@ -107,7 +107,7 @@ android:id="@+id/bug" style="?styleIconNormal" isSelected="@{item.shouldLog}" - android:onClick="@{() -> item.toggleLog()}" + android:onClick="@{() -> item.toggleLog(viewModel)}" app:layout_constraintBottom_toBottomOf="@+id/bell" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/bell" From 6720725d2752a1ef4810e77baf7d5fbeaecee3b4 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 1 Nov 2019 18:12:52 +0100 Subject: [PATCH 120/254] Added clarifying tooltips and captions --- .../magisk/utils/DataBindingAdapters.kt | 10 +++++--- app/src/main/res/layout/item_policy_md2.xml | 25 +++++++++++++++---- app/src/main/res/values/strings_md2.xml | 4 +++ 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index 9d8c0d3d5..7e8a4dee2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -14,10 +14,7 @@ import androidx.annotation.DrawableRes import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.Toolbar import androidx.core.animation.doOnEnd -import androidx.core.view.isInvisible -import androidx.core.view.isVisible -import androidx.core.view.postDelayed -import androidx.core.view.updateLayoutParams +import androidx.core.view.* import androidx.databinding.BindingAdapter import androidx.databinding.InverseBindingAdapter import androidx.databinding.InverseBindingListener @@ -408,4 +405,9 @@ fun MaterialCardView.setCardStrokeWidthBound(stroke: Float) { @BindingAdapter("onMenuClick") fun Toolbar.setOnMenuClickListener(listener: Toolbar.OnMenuItemClickListener) { setOnMenuItemClickListener(listener) +} + +@BindingAdapter("tooltipText") +fun View.setTooltipTextCompat(text: String) { + ViewCompat.setTooltipText(this, text) } \ No newline at end of file diff --git a/app/src/main/res/layout/item_policy_md2.xml b/app/src/main/res/layout/item_policy_md2.xml index 215a2bac6..710fdfc59 100644 --- a/app/src/main/res/layout/item_policy_md2.xml +++ b/app/src/main/res/layout/item_policy_md2.xml @@ -23,7 +23,8 @@ android:alpha="@{item.isEnabled() ? 1f : .5f}" android:onClick="@{() -> item.toggle(viewModel)}" tools:layout_marginBottom="@dimen/l1" - tools:layout_marginEnd="@dimen/l1"> + tools:layout_marginEnd="@dimen/l1" + tools:layout_width="200dp"> + app:layout_constraintTop_toBottomOf="@+id/package_name" + tools:visibility="visible"> - + app:rippleColor="?colorError" /> diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index 6f01e8357..278e3cb14 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -70,4 +70,8 @@ You\'re in safe mode. None of user modules will work.\nThis message will disappear once safe mode is disabled. + Toggles logging + Toggles “toast” notifications + Revoke + \ No newline at end of file From 7d5555f82e81c72973ea9ecd3643d41eaa3c4f01 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 1 Nov 2019 19:02:30 +0100 Subject: [PATCH 121/254] Added safety notice and support section description --- .../main/java/com/topjohnwu/magisk/Config.kt | 2 + .../magisk/redesign/home/HomeViewModel.kt | 8 ++ app/src/main/res/layout/fragment_home_md2.xml | 81 ++++++++++++++----- app/src/main/res/layout/item_developer.xml | 2 +- app/src/main/res/values/strings_md2.xml | 5 ++ 5 files changed, 79 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/Config.kt b/app/src/main/java/com/topjohnwu/magisk/Config.kt index a988c7284..2d159e1e1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Config.kt +++ b/app/src/main/java/com/topjohnwu/magisk/Config.kt @@ -52,6 +52,7 @@ object Config : PreferenceModel, DBConfig { const val SHOW_SYSTEM_APP = "show_system" const val DOWNLOAD_PATH = "download_path" const val REDESIGN = "redesign" + const val SAFETY = "safety_notice" // system state const val MAGISKHIDE = "magiskhide" @@ -117,6 +118,7 @@ object Config : PreferenceModel, DBConfig { var suNotification by preferenceStrInt(Key.SU_NOTIFICATION, Value.NOTIFICATION_TOAST) var updateChannel by preferenceStrInt(Key.UPDATE_CHANNEL, defaultChannel) + var safetyNotice by preference(Key.SAFETY, true) var redesign by preference(Key.REDESIGN, false) @Deprecated("Use extended dark theme") var darkTheme by preference(Key.DARK_THEME, true) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 72496892e..86078999a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -2,6 +2,7 @@ package com.topjohnwu.magisk.redesign.home import android.Manifest import com.topjohnwu.magisk.BuildConfig +import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.Info import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.repository.MagiskRepository @@ -34,6 +35,8 @@ class HomeViewModel( private val repoMagisk: MagiskRepository ) : CompatViewModel() { + val isNoticeVisible = KObservableField(Config.safetyNotice) + val stateMagisk = KObservableField(MagiskState.LOADING) val stateManager = KObservableField(MagiskState.LOADING) val stateTextMagisk = Observer(stateMagisk) { @@ -143,6 +146,11 @@ class HomeViewModel( fun toggle(kof: KObservableField) = kof.toggle() + fun hideNotice() { + Config.safetyNotice = false + isNoticeVisible.value = false + } + private fun ensureEnv() { val invalidStates = listOf( MagiskState.NOT_INSTALLED, diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 1ea204b03..5e6f141a8 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -44,6 +44,46 @@ android:orientation="vertical" android:paddingTop="@dimen/l1"> + + + + + + + + + + + + - + android:layout_marginTop="@dimen/l2" + android:layout_marginEnd="@dimen/l1" + android:text="@string/home_support_title" + android:textAppearance="?appearanceTextTitleNormal" /> - + android:layout_marginTop="@dimen/l_50" + android:layout_marginEnd="@dimen/l1" + android:text="@string/home_support_content" + android:textAppearance="?appearanceTextCaptionVariant" /> - + android:clipToPadding="false" + android:orientation="horizontal" + android:overScrollMode="ifContentScrolls" + android:paddingStart="@dimen/l1" + app:layoutManager="androidx.recyclerview.widget.StaggeredGridLayoutManager" + app:spanCount="2" + tools:itemCount="3" + tools:listitem="@layout/item_developer" /> diff --git a/app/src/main/res/layout/item_developer.xml b/app/src/main/res/layout/item_developer.xml index 420b7831e..e4a8baa04 100644 --- a/app/src/main/res/layout/item_developer.xml +++ b/app/src/main/res/layout/item_developer.xml @@ -24,6 +24,7 @@ android:id="@+id/developer_icon" style="?styleIconNormal" android:padding="@dimen/l_50" + android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:srcCompat="@{item.icon}" @@ -34,7 +35,6 @@ style="?styleCardNormal" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/l1" app:layout_constrainedWidth="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index 278e3cb14..71c9a28fd 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -30,6 +30,11 @@ Source XDA + Always make sure you\'re using open-source Magisk Manager. Manager of unknown source can perform malicious actions. + Hide + Support Us + Magisk is, and always will be, free and open-source. You can however show us that you care by sending a small donation. + Security System A/B From 8e412bee5fa07dd051bc97706c5cdab379bb8509 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 1 Nov 2019 19:15:05 +0100 Subject: [PATCH 122/254] Updated radio button sizes --- app/src/main/res/drawable/avd_circle_from_filled.xml | 4 ++-- app/src/main/res/drawable/avd_circle_to_filled.xml | 4 ++-- app/src/main/res/drawable/ic_radio_check_button.xml | 12 ++++++------ app/src/main/res/layout/fragment_install_md2.xml | 4 ++++ 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/drawable/avd_circle_from_filled.xml b/app/src/main/res/drawable/avd_circle_from_filled.xml index 7038cbba7..07278882a 100644 --- a/app/src/main/res/drawable/avd_circle_from_filled.xml +++ b/app/src/main/res/drawable/avd_circle_from_filled.xml @@ -4,8 +4,8 @@ Date: Fri, 1 Nov 2019 21:10:00 +0100 Subject: [PATCH 123/254] Updated policy colors and internal ids --- .../model/entity/recycler/PolicyRvItem.kt | 19 +------- .../color/color_state_primary_transient.xml | 7 +++ app/src/main/res/layout/item_policy_md2.xml | 43 ++++++++++--------- 3 files changed, 31 insertions(+), 38 deletions(-) create mode 100644 app/src/main/res/color/color_state_primary_transient.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt index 1906573a3..fbb3b4e8b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt @@ -27,23 +27,6 @@ class PolicyRvItem(val item: MagiskPolicy, val icon: Drawable) : ComparableRvIte val shouldLog = KObservableField(item.logging) fun toggle() = isExpanded.toggle() - fun toggleNotify() = shouldNotify.toggle() - fun toggleLog() = shouldLog.toggle() - - fun toggleEnabled() { - if (isExpanded.value) { - return - } - isEnabled.toggle() - } - - fun toggle(view: View) { - toggle() - view.rotationTo(if (isExpanded.value) 225 else 180) - (view.parent as ViewGroup) - .findViewById(R.id.expand_layout) - .setRevealed(isExpanded.value) - } private val rxBus: RxBus by inject() @@ -100,7 +83,7 @@ class PolicyItem(val item: MagiskPolicy, val icon: Drawable) : ComparableRvItem< isExpanded.toggle() view.rotationTo(if (isExpanded.value) 225 else 180) (view.parent as ViewGroup) - .findViewById(R.id.expand_layout) + .findViewById(R.id.policy_expand_container) .setRevealed(isExpanded.value) } diff --git a/app/src/main/res/color/color_state_primary_transient.xml b/app/src/main/res/color/color_state_primary_transient.xml new file mode 100644 index 000000000..f979fd372 --- /dev/null +++ b/app/src/main/res/color/color_state_primary_transient.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_policy_md2.xml b/app/src/main/res/layout/item_policy_md2.xml index 710fdfc59..c330d9146 100644 --- a/app/src/main/res/layout/item_policy_md2.xml +++ b/app/src/main/res/layout/item_policy_md2.xml @@ -33,7 +33,7 @@ android:paddingBottom="@dimen/l2"> + app:tint="@color/color_state_primary_transient" /> + app:tint="@color/color_state_primary_transient" /> From 064523ef258130651d39496b0bae1fbce5b2a1f1 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 1 Nov 2019 21:15:02 +0100 Subject: [PATCH 124/254] Updated checkbox height --- app/src/main/res/layout/item_hide_process_md2.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/item_hide_process_md2.xml b/app/src/main/res/layout/item_hide_process_md2.xml index 79be5fc5a..c61aa76fd 100644 --- a/app/src/main/res/layout/item_hide_process_md2.xml +++ b/app/src/main/res/layout/item_hide_process_md2.xml @@ -41,9 +41,11 @@ Date: Fri, 1 Nov 2019 21:30:29 +0100 Subject: [PATCH 125/254] Removed unused icons --- .../magisk/model/entity/recycler/HomeItems.kt | 9 ++------- app/src/main/res/drawable/ic_app_dev.xml | 10 ---------- app/src/main/res/drawable/ic_mainline_dev.xml | 10 ---------- app/src/main/res/drawable/ic_project.xml | 10 ---------- app/src/main/res/layout/item_developer.xml | 13 +------------ 5 files changed, 3 insertions(+), 49 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_app_dev.xml delete mode 100644 app/src/main/res/drawable/ic_mainline_dev.xml delete mode 100644 app/src/main/res/drawable/ic_project.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt index 72512ba33..885499c33 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt @@ -79,7 +79,6 @@ sealed class HomeItem : ComparableRvItem() { sealed class DeveloperItem : ComparableRvItem() { abstract val items: List - abstract val icon: Int abstract val name: Int override val layoutRes = R.layout.item_developer @@ -89,31 +88,27 @@ sealed class DeveloperItem : ComparableRvItem() { override fun equals(other: Any?): Boolean { if (other !is DeveloperItem) return false - return icon == other.icon && name == other.name && items == other.items + return name == other.name && items == other.items } - override fun hashCode() = - icon.hashCode() + name.hashCode() + items.hashCode() + layoutRes.hashCode() + override fun hashCode() = name.hashCode() + items.hashCode() + layoutRes.hashCode() //region Children object Mainline : DeveloperItem() { override val items = listOf(HomeItem.PayPal.Mainline, HomeItem.Patreon, HomeItem.Twitter.Mainline) - override val icon = R.drawable.ic_mainline_dev override val name = R.string.home_links_mainline } object App : DeveloperItem() { override val items = listOf(HomeItem.PayPal.App, HomeItem.Twitter.App) - override val icon = R.drawable.ic_app_dev override val name = R.string.home_links_app } object Project : DeveloperItem() { override val items = listOf(HomeItem.Github, HomeItem.Xda) - override val icon = R.drawable.ic_project override val name = R.string.home_links_project } //endregion diff --git a/app/src/main/res/drawable/ic_app_dev.xml b/app/src/main/res/drawable/ic_app_dev.xml deleted file mode 100644 index b6491a3a5..000000000 --- a/app/src/main/res/drawable/ic_app_dev.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_mainline_dev.xml b/app/src/main/res/drawable/ic_mainline_dev.xml deleted file mode 100644 index a2155e412..000000000 --- a/app/src/main/res/drawable/ic_mainline_dev.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_project.xml b/app/src/main/res/drawable/ic_project.xml deleted file mode 100644 index 9a78d7390..000000000 --- a/app/src/main/res/drawable/ic_project.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_developer.xml b/app/src/main/res/layout/item_developer.xml index e4a8baa04..3af38b3f4 100644 --- a/app/src/main/res/layout/item_developer.xml +++ b/app/src/main/res/layout/item_developer.xml @@ -20,17 +20,6 @@ android:layout_height="wrap_content" tools:layout_gravity="center|start"> - - Date: Sat, 2 Nov 2019 15:59:07 +0100 Subject: [PATCH 126/254] Removed button patterns defying MD --- .../main/res/layout/dialog_magisk_base.xml | 144 +++++++++++------- 1 file changed, 87 insertions(+), 57 deletions(-) diff --git a/app/src/main/res/layout/dialog_magisk_base.xml b/app/src/main/res/layout/dialog_magisk_base.xml index 72da0179f..b55042809 100644 --- a/app/src/main/res/layout/dialog_magisk_base.xml +++ b/app/src/main/res/layout/dialog_magisk_base.xml @@ -59,9 +59,9 @@ style="?styleIconPrimary" gone="@{data.icon == 0}" srcCompat="@{data.icon}" - android:padding="0dp" android:layout_gravity="center" android:layout_marginTop="@dimen/l1" + android:padding="0dp" tools:src="@drawable/ic_delete_md2" /> - + android:fillViewport="true" + android:scrollbarAlwaysDrawVerticalTrack="true" + app:layout_constraintTop_toBottomOf="@+id/dialog_base_space"> - + - + - + + + + + + + + + + + From dad52724db29e34e21d487d6d489fde7d58e8e24 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 2 Nov 2019 18:12:22 +0100 Subject: [PATCH 127/254] Updated hide fragment with more robust filtering UI --- .../magisk/redesign/hide/HideFragment.kt | 17 +- .../magisk/redesign/hide/HideViewModel.kt | 46 ++++-- .../magisk/utils/DataBindingAdapters.kt | 19 +++ app/src/main/res/drawable/ic_filter.xml | 12 ++ app/src/main/res/drawable/ic_search_md2.xml | 18 +++ app/src/main/res/drawable/ic_up_md2.xml | 10 ++ app/src/main/res/layout/fragment_hide_md2.xml | 149 ++++++++++++++++-- app/src/main/res/menu/menu_hide_md2.xml | 9 -- app/src/main/res/values/strings_md2.xml | 2 + 9 files changed, 242 insertions(+), 40 deletions(-) create mode 100644 app/src/main/res/drawable/ic_filter.xml create mode 100644 app/src/main/res/drawable/ic_search_md2.xml create mode 100644 app/src/main/res/drawable/ic_up_md2.xml delete mode 100644 app/src/main/res/menu/menu_hide_md2.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt index 9ddf7452f..a42f2e9b4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt @@ -2,9 +2,8 @@ package com.topjohnwu.magisk.redesign.hide import android.content.Context import android.graphics.Insets -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem +import android.os.Bundle +import android.view.View import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentHideMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment @@ -20,16 +19,14 @@ class HideFragment : CompatFragment() { override fun onAttach(context: Context) { super.onAttach(context) activity.setTitle(R.string.magiskhide) - setHasOptionsMenu(true) } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.menu_hide_md2, menu) - menu.findItem(R.id.action_show_system)?.isChecked = viewModel.isShowSystem - } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return viewModel.menuItemPressed(item) + binding.hideActionScrollUp.setOnClickListener { + binding.hideScrollContainer.fullScroll(View.FOCUS_UP) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt index 15927cf7d..260d34313 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt @@ -1,12 +1,14 @@ package com.topjohnwu.magisk.redesign.hide import android.content.pm.ApplicationInfo -import android.view.MenuItem +import android.os.Handler +import android.os.Looper +import androidx.databinding.Bindable import com.topjohnwu.magisk.BR -import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.repository.MagiskRepository import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.subscribeK +import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.model.entity.HideAppInfo import com.topjohnwu.magisk.model.entity.HideTarget import com.topjohnwu.magisk.model.entity.ProcessHideApp @@ -19,18 +21,31 @@ import com.topjohnwu.magisk.utils.DiffObservableList import com.topjohnwu.magisk.utils.FilterableDiffObservableList import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.currentLocale +import io.reactivex.Single +import io.reactivex.android.schedulers.AndroidSchedulers class HideViewModel( private val magiskRepo: MagiskRepository ) : CompatViewModel() { + private val queryHandler = Handler(Looper.getMainLooper()) + private val queryRunnable = Runnable { query() } + var isShowSystem = false + @Bindable get set(value) { field = value + notifyPropertyChanged(BR.showSystem) query() } - val query = KObservableField("") + var query = "" + @Bindable get + set(value) { + field = value + notifyPropertyChanged(BR.query) + submitQuery() + } val items = filterableListOf() val itemBinding = itemBindingOf { it.bindExtra(BR.viewModel, this) @@ -39,6 +54,8 @@ class HideViewModel( it.bindExtra(BR.viewModel, this) } + val isFilterExpanded = KObservableField(false) + override fun refresh() = magiskRepo.fetchApps() .map { it to magiskRepo.fetchHideTargets().blockingGet() } .map { pair -> pair.first.map { mergeAppTargets(it, pair.second) } } @@ -70,8 +87,13 @@ class HideViewModel( // --- + private fun submitQuery() { + queryHandler.removeCallbacks(queryRunnable) + queryHandler.postDelayed(queryRunnable, 1000) + } + private fun query( - query: String = this.query.value, + query: String = this.query, showSystem: Boolean = isShowSystem ) = items.filter { fun filterSystem(): Boolean { @@ -90,18 +112,22 @@ class HideViewModel( // --- - fun menuItemPressed(menuItem: MenuItem) = when (menuItem.itemId) { - R.id.action_show_system -> isShowSystem = (!menuItem.isChecked) - .also { menuItem.isChecked = it } - else -> null - }?.let { true } ?: false - fun toggleItem(item: HideProcessItem) = magiskRepo .toggleHide(item.isHidden.value, item.item.packageName, item.item.name) // might wanna reorder the list to display the item at the top .subscribeK() .add() + fun toggle(item: KObservableField) = item.toggle() + + fun resetQuery() { + query = "" + } + + fun hideFilter() { + isFilterExpanded.value = false + } + } inline fun > filterableListOf( diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index 7e8a4dee2..3eaec43fa 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -15,6 +15,7 @@ import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.Toolbar import androidx.core.animation.doOnEnd import androidx.core.view.* +import androidx.core.widget.NestedScrollView import androidx.databinding.BindingAdapter import androidx.databinding.InverseBindingAdapter import androidx.databinding.InverseBindingListener @@ -26,6 +27,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.viewpager.widget.ViewPager import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView +import com.google.android.material.chip.Chip import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.navigation.NavigationView import com.google.android.material.textfield.TextInputLayout @@ -410,4 +412,21 @@ fun Toolbar.setOnMenuClickListener(listener: Toolbar.OnMenuItemClickListener) { @BindingAdapter("tooltipText") fun View.setTooltipTextCompat(text: String) { ViewCompat.setTooltipText(this, text) +} + +@BindingAdapter("onCloseClicked") +fun Chip.setOnCloseClickedListenerBinding(listener: View.OnClickListener) { + setOnCloseIconClickListener(listener) +} + +@BindingAdapter("onScrollStateChanged") +fun NestedScrollView.setOnScrollStateChangeListener(listener: Runnable) { + setOnScrollChangeListener { _: NestedScrollView?, _: Int, _: Int, _: Int, _: Int -> + if (!handler.hasCallbacks(listener)) { + listener.run() + } else { + handler.removeCallbacksAndMessages(null) + } + handler.postDelayed(listener, 1000) + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_filter.xml b/app/src/main/res/drawable/ic_filter.xml new file mode 100644 index 000000000..f327b4a79 --- /dev/null +++ b/app/src/main/res/drawable/ic_filter.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_search_md2.xml b/app/src/main/res/drawable/ic_search_md2.xml new file mode 100644 index 000000000..626a6c3ce --- /dev/null +++ b/app/src/main/res/drawable/ic_search_md2.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_up_md2.xml b/app/src/main/res/drawable/ic_up_md2.xml new file mode 100644 index 000000000..60b1ea4b8 --- /dev/null +++ b/app/src/main/res/drawable/ic_up_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_hide_md2.xml b/app/src/main/res/layout/fragment_hide_md2.xml index e9619e9c6..7084e8adf 100644 --- a/app/src/main/res/layout/fragment_hide_md2.xml +++ b/app/src/main/res/layout/fragment_hide_md2.xml @@ -17,22 +17,137 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + tools:paddingTop="40dp"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_hide_md2.xml b/app/src/main/res/menu/menu_hide_md2.xml deleted file mode 100644 index 9514ec2bc..000000000 --- a/app/src/main/res/menu/menu_hide_md2.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index 71c9a28fd..d08aa471a 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -79,4 +79,6 @@ Toggles “toast” notifications Revoke + Filter by name + \ No newline at end of file From 169e9ab5ad132f7e6980240318d9d24f6700062e Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 4 Nov 2019 15:58:40 +0100 Subject: [PATCH 128/254] Updated hide fragment layout and design of the filter window --- app/src/main/AndroidManifest.xml | 1 + .../magisk/redesign/hide/HideFragment.kt | 16 +++++++++++----- app/src/main/res/drawable/ic_up_md2.xml | 18 +++++++++++------- app/src/main/res/layout/fragment_hide_md2.xml | 15 ++------------- app/src/main/res/menu/menu_hide_md2.xml | 9 +++++++++ app/src/main/res/values/strings_md2.xml | 1 + 6 files changed, 35 insertions(+), 25 deletions(-) create mode 100644 app/src/main/res/menu/menu_hide_md2.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7c5ba0f2e..a9852a70b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -56,6 +56,7 @@ () { override fun onAttach(context: Context) { super.onAttach(context) activity.setTitle(R.string.magiskhide) + setHasOptionsMenu(true) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.menu_hide_md2, menu) + } - binding.hideActionScrollUp.setOnClickListener { - binding.hideScrollContainer.fullScroll(View.FOCUS_UP) + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.action_focus_up -> binding.hideScrollContainer.fullScroll(View.FOCUS_UP) } + return super.onOptionsItemSelected(item) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_up_md2.xml b/app/src/main/res/drawable/ic_up_md2.xml index 60b1ea4b8..cb26da310 100644 --- a/app/src/main/res/drawable/ic_up_md2.xml +++ b/app/src/main/res/drawable/ic_up_md2.xml @@ -1,10 +1,14 @@ - - - \ No newline at end of file + android:viewportWidth="512" + android:viewportHeight="512"> + + + + diff --git a/app/src/main/res/layout/fragment_hide_md2.xml b/app/src/main/res/layout/fragment_hide_md2.xml index 7084e8adf..81582b8d2 100644 --- a/app/src/main/res/layout/fragment_hide_md2.xml +++ b/app/src/main/res/layout/fragment_hide_md2.xml @@ -36,7 +36,7 @@ @@ -99,6 +99,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/l1" + app:cardCornerRadius="24dp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@+id/hide_filter_barrier" @@ -170,18 +171,6 @@ - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_hide_md2.xml b/app/src/main/res/menu/menu_hide_md2.xml new file mode 100644 index 000000000..8b4ab146d --- /dev/null +++ b/app/src/main/res/menu/menu_hide_md2.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index d08aa471a..406a0cfbd 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -80,5 +80,6 @@ Revoke Filter by name + Scroll up \ No newline at end of file From f1427e9279201457a25826d37e0a398663403b4e Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 4 Nov 2019 16:45:54 +0100 Subject: [PATCH 129/254] Updated hide item layout --- .../model/entity/recycler/HideRvItem.kt | 8 +- app/src/main/res/drawable/ic_close.xml | 12 ++ app/src/main/res/layout/item_hide_md2.xml | 151 ++++++++++-------- 3 files changed, 95 insertions(+), 76 deletions(-) create mode 100644 app/src/main/res/drawable/ic_close.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt index 9e50a8cc9..056a45058 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt @@ -1,6 +1,5 @@ package com.topjohnwu.magisk.model.entity.recycler -import android.view.MenuItem import android.view.View import android.view.ViewGroup import com.topjohnwu.magisk.R @@ -43,13 +42,12 @@ class HideItem(val item: ProcessHideApp) : ComparableRvItem() { isExpanded.value = false } - fun expand(v: View) { + fun toggle(v: View) { (v.parent as? ViewGroup)?.startAnimations() - isExpanded.value = true + isExpanded.toggle() } - fun toggle(menuItem: MenuItem, viewModel: HideViewModel): Boolean { - if (menuItem.itemId != R.id.action_toggle) return false + fun toggle(viewModel: HideViewModel): Boolean { // contract implies that isHidden == all checked if (!isHidden) { items.filterNot { it.isHidden.value } diff --git a/app/src/main/res/drawable/ic_close.xml b/app/src/main/res/drawable/ic_close.xml new file mode 100644 index 000000000..d76e3bf7a --- /dev/null +++ b/app/src/main/res/drawable/ic_close.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_hide_md2.xml b/app/src/main/res/layout/item_hide_md2.xml index dd02ade2f..539b60c17 100644 --- a/app/src/main/res/layout/item_hide_md2.xml +++ b/app/src/main/res/layout/item_hide_md2.xml @@ -5,6 +5,8 @@ + + @@ -22,91 +24,98 @@ tools:layout_gravity="center" tools:layout_marginBottom="@dimen/l1"> - - - - - - - - - - - - - + android:layout_height="wrap_content" + android:background="?selectableItemBackground" + android:onClick="@{(v) -> item.toggle(v)}"> + + + + + + + + + + + + From 016e28383b02b957b7a80aaad1d26519bc0ff7c4 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 4 Nov 2019 16:58:39 +0100 Subject: [PATCH 130/254] Added animated progressbar --- .../magisk/model/entity/recycler/HideRvItem.kt | 5 +++++ .../topjohnwu/magisk/utils/DataBindingAdapters.kt | 14 ++++++++++++++ app/src/main/res/layout/item_hide_md2.xml | 3 +-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt index 056a45058..6a32beb51 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt @@ -14,10 +14,12 @@ import com.topjohnwu.magisk.model.entity.ProcessHideApp import com.topjohnwu.magisk.model.entity.StatefulProcess import com.topjohnwu.magisk.model.entity.state.IndeterminateState import com.topjohnwu.magisk.model.events.HideProcessEvent +import com.topjohnwu.magisk.model.observer.Observer import com.topjohnwu.magisk.redesign.hide.HideViewModel import com.topjohnwu.magisk.utils.DiffObservableList import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.RxBus +import kotlin.math.roundToInt class HideItem(val item: ProcessHideApp) : ComparableRvItem() { @@ -28,6 +30,9 @@ class HideItem(val item: ProcessHideApp) : ComparableRvItem() { val isExpanded = KObservableField(false) val itemsChecked = KObservableField(0) + val itemsCheckedPercent = Observer(itemsChecked) { + (itemsChecked.value.toFloat() / items.size * 100).roundToInt() + } /** [toggle] depends on this functionality */ private val isHidden get() = itemsChecked.value == items.size diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index 3eaec43fa..210311a05 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -1,11 +1,13 @@ package com.topjohnwu.magisk.utils import android.animation.Animator +import android.animation.ValueAnimator import android.graphics.drawable.Drawable import android.os.Build import android.view.View import android.view.ViewAnimationUtils import android.view.ViewGroup +import android.widget.ProgressBar import android.widget.TextSwitcher import android.widget.TextView import android.widget.ViewSwitcher @@ -429,4 +431,16 @@ fun NestedScrollView.setOnScrollStateChangeListener(listener: Runnable) { } handler.postDelayed(listener, 1000) } +} + +@BindingAdapter("progressAnimated") +fun ProgressBar.setProgressAnimated(newProgress: Int) { + val animator = tag as? ValueAnimator + animator?.cancel() + + ValueAnimator.ofInt(progress, newProgress).apply { + interpolator = FastOutSlowInInterpolator() + addUpdateListener { progress = it.animatedValue as Int } + tag = this + }.start() } \ No newline at end of file diff --git a/app/src/main/res/layout/item_hide_md2.xml b/app/src/main/res/layout/item_hide_md2.xml index 539b60c17..08c3b0d51 100644 --- a/app/src/main/res/layout/item_hide_md2.xml +++ b/app/src/main/res/layout/item_hide_md2.xml @@ -124,8 +124,7 @@ style="?styleProgressDeterminate" android:layout_width="match_parent" android:layout_gravity="top" - android:max="@{item.items.size()}" - android:progress="@{item.itemsChecked}" /> + progressAnimated="@{item.itemsCheckedPercent}" /> From 8f5f8db71745b538d3526772b95c53d470684f46 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 4 Nov 2019 17:39:17 +0100 Subject: [PATCH 131/254] Fixed dark mode colors --- app/src/main/res/drawable/ic_check_md2.xml | 12 ++++++++++++ app/src/main/res/drawable/ic_up_md2.xml | 4 +++- app/src/main/res/layout/fragment_hide_md2.xml | 12 +++++++++--- 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/drawable/ic_check_md2.xml diff --git a/app/src/main/res/drawable/ic_check_md2.xml b/app/src/main/res/drawable/ic_check_md2.xml new file mode 100644 index 000000000..ff6645704 --- /dev/null +++ b/app/src/main/res/drawable/ic_check_md2.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_up_md2.xml b/app/src/main/res/drawable/ic_up_md2.xml index cb26da310..607a43c89 100644 --- a/app/src/main/res/drawable/ic_up_md2.xml +++ b/app/src/main/res/drawable/ic_up_md2.xml @@ -1,4 +1,5 @@ diff --git a/app/src/main/res/layout/fragment_hide_md2.xml b/app/src/main/res/layout/fragment_hide_md2.xml index 81582b8d2..a8fb28860 100644 --- a/app/src/main/res/layout/fragment_hide_md2.xml +++ b/app/src/main/res/layout/fragment_hide_md2.xml @@ -71,7 +71,10 @@ android:layout_height="wrap_content" android:checked="@={viewModel.showSystem}" android:text="@string/show_system_app" - android:textAppearance="?appearanceTextCaptionNormal" /> + android:textAppearance="?appearanceTextCaptionNormal" + app:checkedIcon="@drawable/ic_check_md2" + app:chipBackgroundColor="?colorSurfaceVariant" + tools:checked="true" /> + android:textAppearance="?appearanceTextCaptionNormal" + app:chipBackgroundColor="?colorSurfaceVariant" /> @@ -122,7 +126,9 @@ android:paddingEnd="@dimen/l1" android:singleLine="true" android:text="@={viewModel.query}" - android:textAppearance="?appearanceTextBodyNormal" /> + android:textAppearance="?appearanceTextBodyNormal" + android:textColor="?colorTextTransient" + android:textColorHint="?colorOnSurfaceVariant" /> From b18b044b6308a1862ae49854ca734e97c8e8f8c8 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 4 Nov 2019 17:39:51 +0100 Subject: [PATCH 132/254] Updated filter card to be more compact --- app/src/main/res/layout/fragment_hide_md2.xml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/layout/fragment_hide_md2.xml b/app/src/main/res/layout/fragment_hide_md2.xml index a8fb28860..bd68014c8 100644 --- a/app/src/main/res/layout/fragment_hide_md2.xml +++ b/app/src/main/res/layout/fragment_hide_md2.xml @@ -36,10 +36,10 @@ + android:layout_marginEnd="@dimen/l1" + app:cardCornerRadius="24dp"> @@ -121,7 +127,7 @@ android:background="@null" android:hint="@string/hide_filter_hint" android:inputType="textUri" - android:minHeight="48dp" + android:minHeight="36dp" android:paddingStart="0dp" android:paddingEnd="@dimen/l1" android:singleLine="true" From b0e7c65504e92cad80bf3398c763fb1b66389369 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 4 Nov 2019 17:40:13 +0100 Subject: [PATCH 133/254] Added icon for "all processes hidden" state --- app/src/main/res/drawable/ic_hide_md2.xml | 2 ++ app/src/main/res/drawable/ic_hide_select_md2.xml | 5 +++++ app/src/main/res/drawable/ic_show_md2.xml | 12 ++++++++++++ app/src/main/res/layout/item_hide_md2.xml | 3 ++- 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/ic_hide_select_md2.xml create mode 100644 app/src/main/res/drawable/ic_show_md2.xml diff --git a/app/src/main/res/drawable/ic_hide_md2.xml b/app/src/main/res/drawable/ic_hide_md2.xml index c87e19a46..1930df665 100644 --- a/app/src/main/res/drawable/ic_hide_md2.xml +++ b/app/src/main/res/drawable/ic_hide_md2.xml @@ -1,10 +1,12 @@ \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_hide_select_md2.xml b/app/src/main/res/drawable/ic_hide_select_md2.xml new file mode 100644 index 000000000..cb83a097c --- /dev/null +++ b/app/src/main/res/drawable/ic_hide_select_md2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_show_md2.xml b/app/src/main/res/drawable/ic_show_md2.xml new file mode 100644 index 000000000..76e8c2ae0 --- /dev/null +++ b/app/src/main/res/drawable/ic_show_md2.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_hide_md2.xml b/app/src/main/res/layout/item_hide_md2.xml index 08c3b0d51..5ae34ba4d 100644 --- a/app/src/main/res/layout/item_hide_md2.xml +++ b/app/src/main/res/layout/item_hide_md2.xml @@ -50,6 +50,7 @@ + app:srcCompat="@drawable/ic_hide_select_md2" /> Date: Tue, 5 Nov 2019 16:19:41 +0100 Subject: [PATCH 134/254] Fixed red tint regarding system security not being spanned across the whole card --- app/src/main/res/layout/fragment_home_md2.xml | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 5e6f141a8..7afbc73a4 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -109,6 +109,18 @@ android:background="@drawable/bg_card" android:orientation="horizontal"> + + - - Date: Tue, 5 Nov 2019 19:38:02 +0100 Subject: [PATCH 135/254] Added primitive implementation of modules screen --- .../model/entity/recycler/ModuleRvItem.kt | 36 ++++++ .../magisk/redesign/module/ModuleViewModel.kt | 39 ++++++- .../magisk/utils/DataBindingAdapters.kt | 7 ++ app/src/main/res/drawable/ic_download_md2.xml | 12 ++ .../main/res/layout/fragment_module_md2.xml | 107 ++++++++++++++++-- app/src/main/res/layout/item_module_md2.xml | 106 +++++++++++++++++ app/src/main/res/layout/item_policy_md2.xml | 2 +- app/src/main/res/values/strings_md2.xml | 1 + 8 files changed, 299 insertions(+), 11 deletions(-) create mode 100644 app/src/main/res/drawable/ic_download_md2.xml create mode 100644 app/src/main/res/layout/item_module_md2.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt index 1af52be7b..2f160e3b2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt @@ -1,6 +1,8 @@ package com.topjohnwu.magisk.model.entity.recycler import android.content.res.Resources +import android.view.View +import android.view.ViewGroup import androidx.annotation.StringRes import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem @@ -9,7 +11,10 @@ import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.model.entity.module.Module import com.topjohnwu.magisk.model.entity.module.Repo +import com.topjohnwu.magisk.redesign.module.ModuleViewModel import com.topjohnwu.magisk.utils.KObservableField +import com.topjohnwu.magisk.utils.rotationTo +import com.topjohnwu.magisk.utils.setRevealed class ModuleRvItem(val item: Module) : ComparableRvItem() { @@ -72,4 +77,35 @@ class RepoRvItem(val item: Repo) : ComparableRvItem() { override fun contentSameAs(other: RepoRvItem): Boolean = item == other.item override fun itemSameAs(other: RepoRvItem): Boolean = item.id == other.item.id +} + +class ModuleItem(val item: Module) : ComparableRvItem() { + + override val layoutRes = R.layout.item_module_md2 + + val isExpanded = KObservableField(false) + val isEnabled = KObservableField(item.enable) + + val isModified get() = item.enable != isEnabled.value + + fun toggle(viewModel: ModuleViewModel) { + isEnabled.toggle() + viewModel.moveToState(this) + } + + fun toggle(view: View) { + isExpanded.toggle() + view.rotationTo(if (isExpanded.value) 225 else 180) + (view.parent as ViewGroup) + .findViewById(R.id.module_expand_container) + .setRevealed(isExpanded.value) + } + + override fun contentSameAs(other: ModuleItem): Boolean = item.version == other.item.version + && item.versionCode == other.item.versionCode + && item.description == other.item.description + && item.name == other.item.name + + override fun itemSameAs(other: ModuleItem): Boolean = item.id == other.item.id + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index 35979b2e7..0b65aabe4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -1,16 +1,49 @@ package com.topjohnwu.magisk.redesign.module import com.topjohnwu.magisk.BR -import com.topjohnwu.magisk.model.entity.recycler.ModuleRvItem +import com.topjohnwu.magisk.extensions.subscribeK +import com.topjohnwu.magisk.model.entity.module.Module +import com.topjohnwu.magisk.model.entity.recycler.ModuleItem import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.redesign.home.itemBindingOf import com.topjohnwu.magisk.redesign.superuser.diffListOf +import io.reactivex.Single class ModuleViewModel : CompatViewModel() { - val items = diffListOf() - val itemBinding = itemBindingOf { + val items = diffListOf() + val itemsPending = diffListOf() + val itemBinding = itemBindingOf { it.bindExtra(BR.viewModel, this) } + override fun refresh() = Single.fromCallable { Module.loadModules() } + .map { it.map { ModuleItem(it) } } + .map { it to items.calculateDiff(it) } + .subscribeK { + items.update(it.first, it.second) + items.forEach { moveToState(it) } + } + + fun moveToState(item: ModuleItem) { + val isActive = items.indexOfFirst { it.itemSameAs(item) } != -1 + val isPending = itemsPending.indexOfFirst { it.itemSameAs(item) } != -1 + + when { + isActive && isPending -> if (item.isModified) { + items.remove(item) + } else { + itemsPending.remove(item) + } + isActive && item.isModified -> { + items.remove(item) + itemsPending.add(item) + } + isPending && !item.isModified -> { + itemsPending.remove(item) + items.add(item) + } + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index 210311a05..346efcc3f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -443,4 +443,11 @@ fun ProgressBar.setProgressAnimated(newProgress: Int) { addUpdateListener { progress = it.animatedValue as Int } tag = this }.start() +} + +@BindingAdapter("android:rotation") +fun View.setRotationNotAnimated(rotation: Int) { + if (animation != null) { + this.rotation = rotation.toFloat() + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_download_md2.xml b/app/src/main/res/drawable/ic_download_md2.xml new file mode 100644 index 000000000..5d3c38484 --- /dev/null +++ b/app/src/main/res/drawable/ic_download_md2.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_module_md2.xml b/app/src/main/res/layout/fragment_module_md2.xml index 36d00c488..35fecd63a 100644 --- a/app/src/main/res/layout/fragment_module_md2.xml +++ b/app/src/main/res/layout/fragment_module_md2.xml @@ -5,6 +5,8 @@ + + - + android:layout_height="wrap_content" + android:orientation="vertical"> + + + + + + + + + + + + + android:paddingStart="@dimen/l1" + android:paddingEnd="0dp" + app:layoutManager="androidx.recyclerview.widget.StaggeredGridLayoutManager" + app:layout_constraintTop_toBottomOf="@+id/module_notice" + app:spanCount="2" + tools:itemCount="3" + tools:listitem="@layout/item_module_md2" /> - + + + diff --git a/app/src/main/res/layout/item_module_md2.xml b/app/src/main/res/layout/item_module_md2.xml new file mode 100644 index 000000000..3e43f20e6 --- /dev/null +++ b/app/src/main/res/layout/item_module_md2.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_policy_md2.xml b/app/src/main/res/layout/item_policy_md2.xml index c330d9146..2cafbe1a2 100644 --- a/app/src/main/res/layout/item_policy_md2.xml +++ b/app/src/main/res/layout/item_policy_md2.xml @@ -151,7 +151,7 @@ isSelected="@{item.isExpanded}" android:layout_gravity="top|end" android:onClick="@{(view) -> item.toggle(view)}" - android:rotation="180" + android:rotation="@{item.isExpanded ? 225 : 180}" app:srcCompat="@drawable/ic_more_collapse" /> diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index 406a0cfbd..1c132269e 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -74,6 +74,7 @@ Let\'s go You\'re in safe mode. None of user modules will work.\nThis message will disappear once safe mode is disabled. + %1$s by %2$s Toggles logging Toggles “toast” notifications From 1c8988d3f722882108dc371523ff985028605cbd Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Tue, 5 Nov 2019 19:39:06 +0100 Subject: [PATCH 136/254] Updated "night" style of elevated card --- app/src/main/res/values-night/styles_md2_impl.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-night/styles_md2_impl.xml b/app/src/main/res/values-night/styles_md2_impl.xml index 6ca9756ba..c7c2e1458 100644 --- a/app/src/main/res/values-night/styles_md2_impl.xml +++ b/app/src/main/res/values-night/styles_md2_impl.xml @@ -3,8 +3,9 @@ \ No newline at end of file From c7cad7e4aad51c4c463cc4b313f664a1a5942b7b Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Wed, 6 Nov 2019 17:09:00 +0100 Subject: [PATCH 137/254] Updated modules so they are properly arranged to respective sections Small updates to module UI --- .../model/entity/recycler/ModuleRvItem.kt | 29 ++++--- .../magisk/redesign/module/ModuleViewModel.kt | 82 ++++++++++++++----- .../main/res/drawable/ic_delete_restore.xml | 5 ++ app/src/main/res/layout/item_module_md2.xml | 64 +++++++-------- 4 files changed, 112 insertions(+), 68 deletions(-) create mode 100644 app/src/main/res/drawable/ic_delete_restore.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt index 2f160e3b2..242bb8521 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt @@ -1,8 +1,6 @@ package com.topjohnwu.magisk.model.entity.recycler import android.content.res.Resources -import android.view.View -import android.view.ViewGroup import androidx.annotation.StringRes import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem @@ -13,8 +11,6 @@ import com.topjohnwu.magisk.model.entity.module.Module import com.topjohnwu.magisk.model.entity.module.Repo import com.topjohnwu.magisk.redesign.module.ModuleViewModel import com.topjohnwu.magisk.utils.KObservableField -import com.topjohnwu.magisk.utils.rotationTo -import com.topjohnwu.magisk.utils.setRevealed class ModuleRvItem(val item: Module) : ComparableRvItem() { @@ -83,22 +79,29 @@ class ModuleItem(val item: Module) : ComparableRvItem() { override val layoutRes = R.layout.item_module_md2 - val isExpanded = KObservableField(false) val isEnabled = KObservableField(item.enable) + val isRemoved = KObservableField(item.remove) + val isUpdated get() = item.updated - val isModified get() = item.enable != isEnabled.value + val isModified get() = item.remove || item.updated + + init { + isEnabled.addOnPropertyChangedCallback { + item.enable = it ?: return@addOnPropertyChangedCallback + } + isRemoved.addOnPropertyChangedCallback { + item.remove = it ?: return@addOnPropertyChangedCallback + } + } fun toggle(viewModel: ModuleViewModel) { isEnabled.toggle() - viewModel.moveToState(this) + viewModel.updateState() } - fun toggle(view: View) { - isExpanded.toggle() - view.rotationTo(if (isExpanded.value) 225 else 180) - (view.parent as ViewGroup) - .findViewById(R.id.module_expand_container) - .setRevealed(isExpanded.value) + fun delete(viewModel: ModuleViewModel) { + isRemoved.toggle() + viewModel.updateState() } override fun contentSameAs(other: ModuleItem): Boolean = item.version == other.item.version diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index 0b65aabe4..be59a5f17 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -1,5 +1,7 @@ package com.topjohnwu.magisk.redesign.module +import androidx.annotation.WorkerThread +import androidx.recyclerview.widget.DiffUtil import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.model.entity.module.Module @@ -7,6 +9,8 @@ import com.topjohnwu.magisk.model.entity.recycler.ModuleItem import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.redesign.home.itemBindingOf import com.topjohnwu.magisk.redesign.superuser.diffListOf +import com.topjohnwu.magisk.utils.DiffObservableList +import com.topjohnwu.magisk.utils.currentLocale import io.reactivex.Single class ModuleViewModel : CompatViewModel() { @@ -19,31 +23,65 @@ class ModuleViewModel : CompatViewModel() { override fun refresh() = Single.fromCallable { Module.loadModules() } .map { it.map { ModuleItem(it) } } - .map { it to items.calculateDiff(it) } - .subscribeK { - items.update(it.first, it.second) - items.forEach { moveToState(it) } - } + .map { it.order() } + .subscribeK { it.forEach { it.update() } } - fun moveToState(item: ModuleItem) { - val isActive = items.indexOfFirst { it.itemSameAs(item) } != -1 - val isPending = itemsPending.indexOfFirst { it.itemSameAs(item) } != -1 - - when { - isActive && isPending -> if (item.isModified) { - items.remove(item) - } else { - itemsPending.remove(item) - } - isActive && item.isModified -> { - items.remove(item) - itemsPending.add(item) - } - isPending && !item.isModified -> { - itemsPending.remove(item) - items.add(item) + @WorkerThread + private fun List.order() = sortedBy { it.item.name.toLowerCase(currentLocale) } + .groupBy { + when { + it.isModified -> ModuleState.Modified + else -> ModuleState.Normal } } + .map { + val diff = when (it.key) { + ModuleState.Modified -> itemsPending + ModuleState.Normal -> items + }.calculateDiff(it.value) + ResultEnclosure(it.key, it.value, diff) + } + .ensureAllStates() + + private fun List.ensureAllStates(): List { + val me = this as? MutableList ?: this.toMutableList() + ModuleState.values().forEach { + if (me.none { rit -> it == rit.state }) { + me.add(ResultEnclosure(it, listOf(), null)) + } + } + return me + } + + fun updateState() { + // I don't feel like bothering with moving every single item to its updated state, + // so this kind of wasteful operation helps with that + Single.fromCallable { items + itemsPending } + .map { it.order() } + .subscribeK { it.forEach { it.update() } } + } + + private enum class ModuleState { + Modified, Normal + } + + private data class ResultEnclosure( + val state: ModuleState, + val list: List, + val diff: DiffUtil.DiffResult? + ) + + private fun ResultEnclosure.update() = when (state) { + ModuleState.Modified -> itemsPending + ModuleState.Normal -> items + }.update(list, diff) + + private fun DiffObservableList.update(list: List, diff: DiffUtil.DiffResult?) { + diff ?: let { + update(list) + return + } + update(list, diff) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_delete_restore.xml b/app/src/main/res/drawable/ic_delete_restore.xml new file mode 100644 index 000000000..9ad463424 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_restore.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_module_md2.xml b/app/src/main/res/layout/item_module_md2.xml index 3e43f20e6..6ee1813b6 100644 --- a/app/src/main/res/layout/item_module_md2.xml +++ b/app/src/main/res/layout/item_module_md2.xml @@ -5,6 +5,8 @@ + + + + @@ -71,35 +86,18 @@ tools:lines="4" tools:text="@tools:sample/lorem/random" /> + + - - - - - - - - From f941f5c0b097d6d454c3d2380d703d4c908552f7 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Wed, 6 Nov 2019 17:37:18 +0100 Subject: [PATCH 138/254] Fixed observer not being called immediately --- .../model/entity/recycler/ModuleRvItem.kt | 58 +++++++++++++------ app/src/main/res/layout/item_module_md2.xml | 12 ++-- 2 files changed, 46 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt index 242bb8521..41d768b7c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt @@ -2,6 +2,10 @@ package com.topjohnwu.magisk.model.entity.recycler import android.content.res.Resources import androidx.annotation.StringRes +import androidx.databinding.Bindable +import androidx.databinding.Observable +import androidx.databinding.PropertyChangeRegistry +import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.addOnPropertyChangedCallback @@ -75,32 +79,34 @@ class RepoRvItem(val item: Repo) : ComparableRvItem() { override fun itemSameAs(other: RepoRvItem): Boolean = item.id == other.item.id } -class ModuleItem(val item: Module) : ComparableRvItem() { +class ModuleItem(val item: Module) : ObservableItem(), Observable { override val layoutRes = R.layout.item_module_md2 - val isEnabled = KObservableField(item.enable) - val isRemoved = KObservableField(item.remove) + @get:Bindable + var isEnabled = item.enable + set(value) { + field = value + item.enable = value + notifyChange(BR.enabled) + } + @get:Bindable + var isRemoved = item.remove + set(value) { + field = value + item.remove = value + notifyChange(BR.removed) + } + val isUpdated get() = item.updated + val isModified get() = isRemoved || item.updated - val isModified get() = item.remove || item.updated - - init { - isEnabled.addOnPropertyChangedCallback { - item.enable = it ?: return@addOnPropertyChangedCallback - } - isRemoved.addOnPropertyChangedCallback { - item.remove = it ?: return@addOnPropertyChangedCallback - } - } - - fun toggle(viewModel: ModuleViewModel) { - isEnabled.toggle() - viewModel.updateState() + fun toggle() { + isEnabled = !isEnabled } fun delete(viewModel: ModuleViewModel) { - isRemoved.toggle() + isRemoved = !isRemoved viewModel.updateState() } @@ -111,4 +117,20 @@ class ModuleItem(val item: Module) : ComparableRvItem() { override fun itemSameAs(other: ModuleItem): Boolean = item.id == other.item.id +} + +abstract class ObservableItem : ComparableRvItem(), Observable { + + private val list = PropertyChangeRegistry() + + override fun removeOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) { + list.remove(callback ?: return) + } + + override fun addOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) { + list.add(callback ?: return) + } + + protected fun notifyChange(id: Int) = list.notifyChange(this, id) + } \ No newline at end of file diff --git a/app/src/main/res/layout/item_module_md2.xml b/app/src/main/res/layout/item_module_md2.xml index 6ee1813b6..76fac6fb2 100644 --- a/app/src/main/res/layout/item_module_md2.xml +++ b/app/src/main/res/layout/item_module_md2.xml @@ -21,11 +21,11 @@ @@ -38,8 +38,8 @@ Date: Wed, 6 Nov 2019 18:52:58 +0100 Subject: [PATCH 139/254] Partially reverted removing "moveToState" --- .../model/entity/recycler/ModuleRvItem.kt | 2 +- .../magisk/redesign/module/ModuleViewModel.kt | 18 ++++++++++++------ app/src/main/res/layout/item_module_md2.xml | 3 ++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt index 41d768b7c..e848bbc91 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt @@ -107,7 +107,7 @@ class ModuleItem(val item: Module) : ObservableItem(), Observable { fun delete(viewModel: ModuleViewModel) { isRemoved = !isRemoved - viewModel.updateState() + viewModel.moveToState(this) } override fun contentSameAs(other: ModuleItem): Boolean = item.version == other.item.version diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index be59a5f17..55d4cbf7a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -53,12 +53,18 @@ class ModuleViewModel : CompatViewModel() { return me } - fun updateState() { - // I don't feel like bothering with moving every single item to its updated state, - // so this kind of wasteful operation helps with that - Single.fromCallable { items + itemsPending } - .map { it.order() } - .subscribeK { it.forEach { it.update() } } + fun moveToState(item: ModuleItem) { + items.removeAll { it.itemSameAs(item) } + itemsPending.removeAll { it.itemSameAs(item) } + + if (item.isModified) { + itemsPending + } else { + items + }.apply { + add(item) + sortWith(compareBy { it.item.name.toLowerCase(currentLocale) }) + } } private enum class ModuleState { diff --git a/app/src/main/res/layout/item_module_md2.xml b/app/src/main/res/layout/item_module_md2.xml index 76fac6fb2..6463a6c6c 100644 --- a/app/src/main/res/layout/item_module_md2.xml +++ b/app/src/main/res/layout/item_module_md2.xml @@ -93,7 +93,8 @@ android:alpha=".5" android:onClick="@{(v) -> item.delete(viewModel)}" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="@+id/module_version_author" + app:layout_constraintTop_toTopOf="@+id/module_title" app:srcCompat="@drawable/ic_delete_restore" /> From f83f92d3fa7df9db752a6f6e6a15f677d905ad9a Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 8 Nov 2019 19:03:43 +0100 Subject: [PATCH 140/254] Updated modules screen so it displays all the content in one recyclerview Added "endless" scrolling support - this is done in order to display everything very swiftly and load as user needs it - for the most part we'll download only ~10 items and load the rest as scroll progresses, this accomplishes the illusion that whole list is being populated Added sections and updated repo view --- .../topjohnwu/magisk/data/database/Repo.kt | 29 +++ .../magisk/data/database/RepoDatabase.kt | 5 +- .../com/topjohnwu/magisk/di/DatabaseModule.kt | 2 + .../com/topjohnwu/magisk/di/RedesignModule.kt | 2 +- .../model/entity/recycler/ModuleRvItem.kt | 27 +++ .../magisk/redesign/home/HomeViewModel.kt | 2 +- .../magisk/redesign/module/ModuleFragment.kt | 27 ++- .../magisk/redesign/module/ModuleViewModel.kt | 225 ++++++++++++++---- .../redesign/superuser/SuperuserViewModel.kt | 2 +- .../magisk/utils/DataBindingAdapters.kt | 5 + .../utils/EndlessRecyclerScrollListener.kt | 113 +++++++++ .../main/res/layout/fragment_module_md2.xml | 152 ++---------- app/src/main/res/layout/item_repo_md2.xml | 115 +++++++++ app/src/main/res/layout/item_section_md2.xml | 48 ++++ app/src/main/res/values/strings_md2.xml | 3 + 15 files changed, 569 insertions(+), 188 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/utils/EndlessRecyclerScrollListener.kt create mode 100644 app/src/main/res/layout/item_repo_md2.xml create mode 100644 app/src/main/res/layout/item_section_md2.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt new file mode 100644 index 000000000..3c42c9d2e --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt @@ -0,0 +1,29 @@ +@file:JvmMultifileClass + +package com.topjohnwu.magisk.data.database + +import androidx.room.Dao +import androidx.room.Query +import com.topjohnwu.magisk.model.entity.module.Repo + +interface RepoBase { + + fun getRepos(offset: Int, limit: Int = 10): List + +} + +@Dao +interface RepoByUpdatedDao : RepoBase { + + @Query("SELECT * FROM repos ORDER BY last_update DESC LIMIT :limit OFFSET :offset") + override fun getRepos(offset: Int, limit: Int): List + +} + +@Dao +interface RepoByNameDao : RepoBase { + + @Query("SELECT * FROM repos ORDER BY name COLLATE NOCASE LIMIT :limit OFFSET :offset") + override fun getRepos(offset: Int, limit: Int): List + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/RepoDatabase.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/RepoDatabase.kt index c7ad3a00e..5206172d5 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/database/RepoDatabase.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/database/RepoDatabase.kt @@ -7,5 +7,8 @@ import com.topjohnwu.magisk.model.entity.module.Repo @Database(version = 6, entities = [Repo::class, RepoEtag::class]) abstract class RepoDatabase : RoomDatabase() { - abstract fun repoDao() : RepoDao + abstract fun repoDao(): RepoDao + abstract fun repoByUpdatedDao(): RepoByUpdatedDao + abstract fun repoByNameDao(): RepoByNameDao + } diff --git a/app/src/main/java/com/topjohnwu/magisk/di/DatabaseModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/DatabaseModule.kt index 5a5cbeb47..0af41f5e2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/DatabaseModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/DatabaseModule.kt @@ -14,6 +14,8 @@ val databaseModule = module { single { StringDao() } single { createRepoDatabase(get()) } single { get().repoDao() } + single { get().repoByNameDao() } + single { get().repoByUpdatedDao() } single { RepoUpdater(get(), get()) } } diff --git a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt index 631e7b0dc..89cd8efdf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt @@ -20,7 +20,7 @@ val redesignModule = module { viewModel { HideViewModel(get()) } viewModel { HomeViewModel(get()) } viewModel { LogViewModel() } - viewModel { ModuleViewModel() } + viewModel { ModuleViewModel(get(), get(), get()) } viewModel { RequestViewModel() } viewModel { SafetynetViewModel(get()) } viewModel { SettingsViewModel() } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt index e848bbc91..941f356a0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt @@ -5,6 +5,8 @@ import androidx.annotation.StringRes import androidx.databinding.Bindable import androidx.databinding.Observable import androidx.databinding.PropertyChangeRegistry +import androidx.databinding.ViewDataBinding +import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem @@ -79,6 +81,31 @@ class RepoRvItem(val item: Repo) : ComparableRvItem() { override fun itemSameAs(other: RepoRvItem): Boolean = item.id == other.item.id } +class SectionTitle( + val title: Int, + val button: Int = 0, + val icon: Int = 0 +) : ComparableRvItem() { + override val layoutRes = R.layout.item_section_md2 + + override fun onBindingBound(binding: ViewDataBinding) { + super.onBindingBound(binding) + val params = binding.root.layoutParams as StaggeredGridLayoutManager.LayoutParams + params.isFullSpan = true + } + + override fun itemSameAs(other: SectionTitle): Boolean = this === other + override fun contentSameAs(other: SectionTitle): Boolean = this === other +} + +class RepoItem(val item: Repo) : ComparableRvItem() { + + override val layoutRes: Int = R.layout.item_repo_md2 + + override fun contentSameAs(other: RepoItem): Boolean = item == other.item + override fun itemSameAs(other: RepoItem): Boolean = item.id == other.item.id +} + class ModuleItem(val item: Module) : ObservableItem(), Observable { override val layoutRes = R.layout.item_module_md2 diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 86078999a..599380636 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -186,7 +186,7 @@ val ManagerJson.isObsolete fun String.clipVersion() = substringAfter('-') -inline fun > itemBindingOf( +inline fun > itemBindingOf( crossinline body: (ItemBinding<*>) -> Unit = {} ) = OnItemBind { itemBinding, _, item -> item.bind(itemBinding) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt index c252eaf18..5dcd3d5d3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt @@ -1,9 +1,13 @@ package com.topjohnwu.magisk.redesign.module import android.graphics.Insets +import android.os.Bundle +import android.view.View +import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentModuleMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment +import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener import org.koin.androidx.viewmodel.ext.android.viewModel class ModuleFragment : CompatFragment() { @@ -11,12 +15,33 @@ class ModuleFragment : CompatFragment override val layoutRes = R.layout.fragment_module_md2 override val viewModel by viewModel() + private lateinit var listener: EndlessRecyclerScrollListener + override fun consumeSystemWindowInsets(insets: Insets) = insets override fun onStart() { super.onStart() - activity.title = resources.getString(R.string.section_modules) } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setEndlessScroller() + } + + override fun onDestroyView() { + if (this::listener.isInitialized) { + binding.moduleRemote.removeOnScrollListener(listener) + } + super.onDestroyView() + } + + private fun setEndlessScroller() { + val lama = binding.moduleRemote.layoutManager as? StaggeredGridLayoutManager ?: return + lama.isAutoMeasureEnabled = false + + listener = EndlessRecyclerScrollListener(lama, viewModel::loadRemote) + binding.moduleRemote.addOnScrollListener(listener) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index 55d4cbf7a..8397c1ec4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -1,93 +1,226 @@ package com.topjohnwu.magisk.redesign.module +import androidx.annotation.UiThread import androidx.annotation.WorkerThread -import androidx.recyclerview.widget.DiffUtil +import androidx.databinding.ViewDataBinding import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.Config +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.data.database.RepoByNameDao +import com.topjohnwu.magisk.data.database.RepoByUpdatedDao +import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.model.entity.module.Module +import com.topjohnwu.magisk.model.entity.module.Repo import com.topjohnwu.magisk.model.entity.recycler.ModuleItem +import com.topjohnwu.magisk.model.entity.recycler.RepoItem +import com.topjohnwu.magisk.model.entity.recycler.SectionTitle import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.redesign.home.itemBindingOf import com.topjohnwu.magisk.redesign.superuser.diffListOf -import com.topjohnwu.magisk.utils.DiffObservableList +import com.topjohnwu.magisk.tasks.RepoUpdater import com.topjohnwu.magisk.utils.currentLocale +import io.reactivex.Completable import io.reactivex.Single +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter -class ModuleViewModel : CompatViewModel() { +class ModuleViewModel( + private val repoName: RepoByNameDao, + private val repoUpdated: RepoByUpdatedDao, + private val repoUpdater: RepoUpdater +) : CompatViewModel() { - val items = diffListOf() - val itemsPending = diffListOf() - val itemBinding = itemBindingOf { + val adapter = adapterOf>() + val items = diffListOf>() + val itemBinding = itemBindingOf> { it.bindExtra(BR.viewModel, this) } + companion object { + private val sectionRemote = SectionTitle(R.string.module_section_remote) + private val sectionActive = SectionTitle(R.string.module_section_active) + private val sectionPending = + SectionTitle(R.string.module_section_pending, R.string.reboot, R.drawable.ic_restart) + } + + // --- + + private val itemsPending + @WorkerThread get() = items.asSequence() + .filterIsInstance() + .filter { it.isModified } + .toList() + private val itemsActive + @WorkerThread get() = items.asSequence() + .filterIsInstance() + .filter { !it.isModified } + .toList() + private val itemsRemote + @WorkerThread get() = items.filterIsInstance() + + private var remoteJob: Disposable? = null + private val dao + get() = when (Config.repoOrder) { + Config.Value.ORDER_DATE -> repoUpdated + Config.Value.ORDER_NAME -> repoName + else -> throw IllegalArgumentException() + } + + // --- + override fun refresh() = Single.fromCallable { Module.loadModules() } .map { it.map { ModuleItem(it) } } .map { it.order() } - .subscribeK { it.forEach { it.update() } } + .map { + val pending = it.getValue(ModuleState.Modified) + val active = it.getValue(ModuleState.Normal) + build(pending = pending, active = active) + } + .map { it to items.calculateDiff(it) } + .subscribeK { + items.update(it.first, it.second) + if (!items.contains(sectionRemote)) { + loadRemote() + } + } + + @Synchronized + fun loadRemote() { + // check for existing jobs + val size = itemsRemote.size + if (remoteJob?.isDisposed?.not() == true || size % 10 != 0) { + return + } + remoteJob = loadRepos(offset = size) + .map { it.map { RepoItem(it) } } + .applyViewModel(this) + .subscribeK { + if (!items.contains(sectionRemote)) { + items.add(sectionRemote) + } + items.addAll(it) + } + } + + private fun loadRepos( + offset: Int = 0, + downloadRepos: Boolean = offset == 0 + ): Single> = Single.fromCallable { dao.getRepos(offset) }.flatMap { + when { + // in case we find result empty and offset is initial we need to refresh the repos. + downloadRepos && it.isEmpty() && offset == 0 -> downloadRepos() + .andThen(loadRepos(downloadRepos = false)) + else -> Single.just(it) + } + } + + private fun downloadRepos() = Single.just(Unit) + .flatMap { repoUpdater() } + .ignoreElement() + + // --- @WorkerThread - private fun List.order() = sortedBy { it.item.name.toLowerCase(currentLocale) } + private fun List.order() = asSequence() + .sortedBy { it.item.name.toLowerCase(currentLocale) } .groupBy { when { it.isModified -> ModuleState.Modified else -> ModuleState.Normal } } - .map { - val diff = when (it.key) { - ModuleState.Modified -> itemsPending - ModuleState.Normal -> items - }.calculateDiff(it.value) - ResultEnclosure(it.key, it.value, diff) - } .ensureAllStates() - private fun List.ensureAllStates(): List { - val me = this as? MutableList ?: this.toMutableList() + private fun Map>.ensureAllStates(): Map> { + val me = this as? MutableMap> ?: this.toMutableMap() ModuleState.values().forEach { - if (me.none { rit -> it == rit.state }) { - me.add(ResultEnclosure(it, listOf(), null)) + if (me.none { rit -> it == rit.key }) { + me[it] = listOf() } } return me } - fun moveToState(item: ModuleItem) { - items.removeAll { it.itemSameAs(item) } - itemsPending.removeAll { it.itemSameAs(item) } + // --- - if (item.isModified) { - itemsPending - } else { - items - }.apply { - add(item) - sortWith(compareBy { it.item.name.toLowerCase(currentLocale) }) - } + @UiThread + fun moveToState(item: ModuleItem) { + items.removeAll { it.genericItemSameAs(item) } + + val isPending = item.isModified + + Single.fromCallable { if (isPending) itemsPending else itemsActive } + .map { (listOf(item) + it).toMutableList() } + .map { it.apply { sortWith(compareBy { it.item.name.toLowerCase(currentLocale) }) } } + .map { + if (isPending) build(pending = it) + else build(active = it) + } + .map { it to items.calculateDiff(it) } + .observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess { items.update(it.first, it.second) } + .ignoreElement() + .andThen(cleanup()) + .subscribeK() } + // --- + + private fun cleanup() = Completable + .concat(listOf(cleanPending(), cleanActive(), cleanRemote())) + + private fun cleanPending() = Single.fromCallable { itemsPending } + .filter { it.isEmpty() } + .observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess { items.remove(sectionPending) } + .ignoreElement() + + private fun cleanActive() = Single.fromCallable { itemsActive } + .filter { it.isEmpty() } + .observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess { items.remove(sectionActive) } + .ignoreElement() + + private fun cleanRemote() = Single.fromCallable { itemsRemote } + .filter { it.isEmpty() } + .observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess { items.remove(sectionRemote) } + .ignoreElement() + + // --- + private enum class ModuleState { Modified, Normal } - private data class ResultEnclosure( - val state: ModuleState, - val list: List, - val diff: DiffUtil.DiffResult? - ) + // --- - private fun ResultEnclosure.update() = when (state) { - ModuleState.Modified -> itemsPending - ModuleState.Normal -> items - }.update(list, diff) + /** Callable only from worker thread because of expensive list filtering */ + @WorkerThread + private fun build( + pending: List = itemsPending, + active: List = itemsActive, + remote: List = itemsRemote + ) = pending.prependIfNotEmpty { sectionPending } + + active.prependIfNotEmpty { sectionActive } + + remote.prependIfNotEmpty { sectionRemote } - private fun DiffObservableList.update(list: List, diff: DiffUtil.DiffResult?) { - diff ?: let { - update(list) - return - } - update(list, diff) + private fun List.prependIfNotEmpty(item: () -> T) = + if (isNotEmpty()) listOf(item()) + this else this + +} + +fun > adapterOf() = object : BindingRecyclerViewAdapter() { + override fun onBindBinding( + binding: ViewDataBinding, + variableId: Int, + layoutRes: Int, + position: Int, + item: T + ) { + super.onBindBinding(binding, variableId, layoutRes, position, item) + item.onBindingBound(binding) } - } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt index 5308ed35d..471bb8393 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt @@ -135,7 +135,7 @@ class SuperuserViewModel( } -inline fun > diffListOf( +inline fun > diffListOf( vararg newItems: T ) = DiffObservableList(object : DiffObservableList.Callback { override fun areItemsTheSame(oldItem: T, newItem: T) = oldItem.genericItemSameAs(newItem) diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index 346efcc3f..eebc0ed0e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -450,4 +450,9 @@ fun View.setRotationNotAnimated(rotation: Int) { if (animation != null) { this.rotation = rotation.toFloat() } +} + +@BindingAdapter("android:text") +fun TextView.setTextSafe(text: Int) { + if (text == 0) this.text = null else setText(text) } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/EndlessRecyclerScrollListener.kt b/app/src/main/java/com/topjohnwu/magisk/utils/EndlessRecyclerScrollListener.kt new file mode 100644 index 000000000..869f12444 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/utils/EndlessRecyclerScrollListener.kt @@ -0,0 +1,113 @@ +package com.topjohnwu.magisk.utils + +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.StaggeredGridLayoutManager + +class EndlessRecyclerScrollListener( + private val layoutManager: RecyclerView.LayoutManager, + private val loadMore: (page: Int, totalItemsCount: Int, view: RecyclerView?) -> Unit, + private val direction: Direction = Direction.BOTTOM, + visibleRowsThreshold: Int = VISIBLE_THRESHOLD +) : RecyclerView.OnScrollListener() { + + constructor( + layoutManager: RecyclerView.LayoutManager, + loadMore: () -> Unit, + direction: Direction = Direction.BOTTOM, + visibleRowsThreshold: Int = VISIBLE_THRESHOLD + ) : this(layoutManager, { _, _, _ -> loadMore() }, direction, visibleRowsThreshold) + + enum class Direction { + TOP, BOTTOM + } + + companion object { + private const val VISIBLE_THRESHOLD = 5 + private const val STARTING_PAGE_INDEX = 0 + } + + // The minimum amount of items to have above/below your current scroll position + // before loading more. + private val visibleThreshold = when (layoutManager) { + is LinearLayoutManager -> visibleRowsThreshold + is GridLayoutManager -> visibleRowsThreshold * layoutManager.spanCount + is StaggeredGridLayoutManager -> visibleRowsThreshold * layoutManager.spanCount + else -> throw IllegalArgumentException("Only LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager are supported") + } + + // The current offset index of data you have loaded + private var currentPage = 0 + // The total number of items in the dataset after the last load + private var previousTotalItemCount = 0 + // True if we are still waiting for the last set of data to load. + private var loading = true + + // This happens many times a second during a scroll, so be wary of the code you place here. + // We are given a few useful parameters to help us work out if we need to load some more data, + // but first we check if we are waiting for the previous load to finish. + override fun onScrolled(view: RecyclerView, dx: Int, dy: Int) { + if (dx == 0 && dy == 0) return + val totalItemCount = layoutManager.itemCount + + val visibleItemPosition = if (direction == Direction.BOTTOM) { + when (layoutManager) { + is StaggeredGridLayoutManager -> layoutManager.findLastVisibleItemPositions(null).max() + ?: 0 + is GridLayoutManager -> layoutManager.findLastVisibleItemPosition() + is LinearLayoutManager -> layoutManager.findLastVisibleItemPosition() + else -> throw IllegalArgumentException("Only LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager are supported") + } + } else { + when (layoutManager) { + is StaggeredGridLayoutManager -> layoutManager.findFirstVisibleItemPositions(null).min() + ?: 0 + is GridLayoutManager -> layoutManager.findFirstVisibleItemPosition() + is LinearLayoutManager -> layoutManager.findFirstVisibleItemPosition() + else -> throw IllegalArgumentException("Only LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager are supported") + } + } + + // If the total item count is zero and the previous isn't, assume the + // list is invalidated and should be reset back to initial state + if (totalItemCount < previousTotalItemCount) { + currentPage = + STARTING_PAGE_INDEX + previousTotalItemCount = totalItemCount + if (totalItemCount == 0) { + loading = true + } + } + + // If it’s still loading, we check to see if the dataset count has + // changed, if so we conclude it has finished loading and update the current page + // number and total item count. + if (loading && totalItemCount > previousTotalItemCount) { + loading = false + previousTotalItemCount = totalItemCount + } + + // If it isn’t currently loading, we check to see if we have breached + // the visibleThreshold and need to reload more data. + // If we do need to reload some more data, we execute onLoadMore to fetch the data. + // threshold should reflect how many total columns there are too + if (!loading && shouldLoadMoreItems(visibleItemPosition, totalItemCount)) { + currentPage++ + loadMore(currentPage, totalItemCount, view) + loading = true + } + } + + private fun shouldLoadMoreItems(visibleItemPosition: Int, itemCount: Int) = when (direction) { + Direction.TOP -> visibleItemPosition < visibleThreshold + Direction.BOTTOM -> visibleItemPosition + visibleThreshold > itemCount + } + + // Call this method whenever performing new searches + fun resetState() { + currentPage = STARTING_PAGE_INDEX + previousTotalItemCount = 0 + loading = true + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_module_md2.xml b/app/src/main/res/layout/fragment_module_md2.xml index 35fecd63a..e552171c9 100644 --- a/app/src/main/res/layout/fragment_module_md2.xml +++ b/app/src/main/res/layout/fragment_module_md2.xml @@ -15,145 +15,23 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:orientation="vertical" + android:paddingStart="@dimen/l1" + android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l1}" + android:paddingEnd="0dp" + android:paddingBottom="@{viewModel.insets.bottom}" + app:layoutManager="androidx.recyclerview.widget.StaggeredGridLayoutManager" + app:spanCount="2" + tools:listitem="@layout/item_module_md2" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_repo_md2.xml b/app/src/main/res/layout/item_repo_md2.xml new file mode 100644 index 000000000..b3cba72e8 --- /dev/null +++ b/app/src/main/res/layout/item_repo_md2.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_section_md2.xml b/app/src/main/res/layout/item_section_md2.xml new file mode 100644 index 000000000..eb9b8e4cb --- /dev/null +++ b/app/src/main/res/layout/item_section_md2.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index 1c132269e..116517ac8 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -75,6 +75,9 @@ You\'re in safe mode. None of user modules will work.\nThis message will disappear once safe mode is disabled. %1$s by %2$s + Pending changes + Active + Remote Toggles logging Toggles “toast” notifications From bc5cbe9fba72a47f9c27c2683c54d8904fa0e70b Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 8 Nov 2019 19:19:19 +0100 Subject: [PATCH 141/254] Updated module item design to follow suit with the rest of the app --- app/src/main/res/layout/item_module_md2.xml | 38 ++++++++++++++------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/layout/item_module_md2.xml b/app/src/main/res/layout/item_module_md2.xml index 6463a6c6c..535a1bda6 100644 --- a/app/src/main/res/layout/item_module_md2.xml +++ b/app/src/main/res/layout/item_module_md2.xml @@ -32,8 +32,7 @@ + android:layout_height="wrap_content"> @@ -66,14 +66,16 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/l1" + android:layout_marginEnd="@dimen/l1" android:text="@{@string/module_version_author(item.item.version, item.item.author)}" android:textAppearance="?appearanceTextCaptionVariant" - app:layout_constraintEnd_toStartOf="@+id/module_remove" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/module_state_icon" app:layout_constraintTop_toBottomOf="@+id/module_title" tools:text="v1 by topjohnwu" /> - + + + app:layout_constraintTop_toBottomOf="@+id/module_divider" + tools:icon="@drawable/ic_delete_md2" + tools:text="Remove" /> From 6c845743667e108d901f60106756fdf45d30f48e Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 11 Nov 2019 16:22:33 +0100 Subject: [PATCH 142/254] Added loading item to modules --- .../model/entity/recycler/ModuleRvItem.kt | 13 +++++++ .../magisk/redesign/module/ModuleViewModel.kt | 9 ++++- app/src/main/res/layout/item_loading.xml | 38 +++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/layout/item_loading.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt index 941f356a0..a261e002d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt @@ -146,6 +146,19 @@ class ModuleItem(val item: Module) : ObservableItem(), Observable { } +object LoadingItem : ComparableRvItem() { + override val layoutRes = R.layout.item_loading + + override fun onBindingBound(binding: ViewDataBinding) { + super.onBindingBound(binding) + val params = binding.root.layoutParams as? StaggeredGridLayoutManager.LayoutParams ?: return + params.isFullSpan = true + } + + override fun contentSameAs(other: LoadingItem) = this == other + override fun itemSameAs(other: LoadingItem) = this === other +} + abstract class ObservableItem : ComparableRvItem(), Observable { private val list = PropertyChangeRegistry() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index 8397c1ec4..6a290bc30 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -12,6 +12,7 @@ import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.model.entity.module.Module import com.topjohnwu.magisk.model.entity.module.Repo +import com.topjohnwu.magisk.model.entity.recycler.LoadingItem import com.topjohnwu.magisk.model.entity.recycler.ModuleItem import com.topjohnwu.magisk.model.entity.recycler.RepoItem import com.topjohnwu.magisk.model.entity.recycler.SectionTitle @@ -25,6 +26,7 @@ import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter +import timber.log.Timber class ModuleViewModel( private val repoName: RepoByNameDao, @@ -96,12 +98,17 @@ class ModuleViewModel( remoteJob = loadRepos(offset = size) .map { it.map { RepoItem(it) } } .applyViewModel(this) - .subscribeK { + .subscribeK(onError = { + Timber.e(it) + items.remove(LoadingItem) + }) { + items.remove(LoadingItem) if (!items.contains(sectionRemote)) { items.add(sectionRemote) } items.addAll(it) } + items.add(LoadingItem) } private fun loadRepos( diff --git a/app/src/main/res/layout/item_loading.xml b/app/src/main/res/layout/item_loading.xml new file mode 100644 index 000000000..c10346364 --- /dev/null +++ b/app/src/main/res/layout/item_loading.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From a12eb3fc6fdc0e8e6bb1927f9c17809accc92bd2 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 11 Nov 2019 17:59:09 +0100 Subject: [PATCH 143/254] Fixed incorrect indeterminate progressbar color --- app/src/main/res/values-v21/styles_md2_impl.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 app/src/main/res/values-v21/styles_md2_impl.xml diff --git a/app/src/main/res/values-v21/styles_md2_impl.xml b/app/src/main/res/values-v21/styles_md2_impl.xml new file mode 100644 index 000000000..89ef37cc0 --- /dev/null +++ b/app/src/main/res/values-v21/styles_md2_impl.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file From d6d82edff59d427b88b46a74cd1d3675de323696 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 11 Nov 2019 17:59:44 +0100 Subject: [PATCH 144/254] Fixed file service not broadcasting indeterminate states --- .../com/topjohnwu/magisk/model/download/RemoteFileService.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/download/RemoteFileService.kt b/app/src/main/java/com/topjohnwu/magisk/model/download/RemoteFileService.kt index 181290e0f..b613dc0cf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/download/RemoteFileService.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/download/RemoteFileService.kt @@ -87,6 +87,7 @@ abstract class RemoteFileService : NotificationService() { .setProgress(maxRaw.toInt(), it.toInt(), false) .setContentText("%.2f / %.2f MB".format(progress, max)) } else { + send(-1f, subject) notification.setContentText("%.2f MB / ??".format(progress)) } } From 027a5695f290a01c9814020bcd6dc553580c6f84 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 11 Nov 2019 18:00:36 +0100 Subject: [PATCH 145/254] Added progressbars to repo items --- .../model/entity/recycler/ModuleRvItem.kt | 2 ++ .../magisk/redesign/module/ModuleViewModel.kt | 22 +++++++++++++++++++ app/src/main/res/layout/item_repo_md2.xml | 19 ++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt index a261e002d..3f363c96a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt @@ -102,6 +102,8 @@ class RepoItem(val item: Repo) : ComparableRvItem() { override val layoutRes: Int = R.layout.item_repo_md2 + val progress = KObservableField(0) + override fun contentSameAs(other: RepoItem): Boolean = item == other.item override fun itemSameAs(other: RepoItem): Boolean = item.id == other.item.id } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index 6a290bc30..cee5e68a3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -10,12 +10,15 @@ import com.topjohnwu.magisk.data.database.RepoByNameDao import com.topjohnwu.magisk.data.database.RepoByUpdatedDao import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.subscribeK +import com.topjohnwu.magisk.model.download.RemoteFileService +import com.topjohnwu.magisk.model.entity.internal.DownloadSubject import com.topjohnwu.magisk.model.entity.module.Module import com.topjohnwu.magisk.model.entity.module.Repo import com.topjohnwu.magisk.model.entity.recycler.LoadingItem import com.topjohnwu.magisk.model.entity.recycler.ModuleItem import com.topjohnwu.magisk.model.entity.recycler.RepoItem import com.topjohnwu.magisk.model.entity.recycler.SectionTitle +import com.topjohnwu.magisk.model.events.dialog.ModuleInstallDialog import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.redesign.home.itemBindingOf import com.topjohnwu.magisk.redesign.superuser.diffListOf @@ -27,6 +30,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter import timber.log.Timber +import kotlin.math.roundToInt class ModuleViewModel( private val repoName: RepoByNameDao, @@ -72,6 +76,19 @@ class ModuleViewModel( // --- + init { + RemoteFileService.reset() + RemoteFileService.progressBroadcast.observeForever { + val (progress, subject) = it ?: return@observeForever + if (subject !is DownloadSubject.Module) { + return@observeForever + } + update(subject.module, progress.times(100).roundToInt()) + } + } + + // --- + override fun refresh() = Single.fromCallable { Module.loadModules() } .map { it.map { ModuleItem(it) } } .map { it.order() } @@ -150,6 +167,11 @@ class ModuleViewModel( return me } + private fun update(repo: Repo, progress: Int) = Single.fromCallable { itemsRemote } + .map { it.first { it.item.id == repo.id } } + .subscribeK { it.progress.value = progress } + .add() + // --- @UiThread diff --git a/app/src/main/res/layout/item_repo_md2.xml b/app/src/main/res/layout/item_repo_md2.xml index b3cba72e8..592feb068 100644 --- a/app/src/main/res/layout/item_repo_md2.xml +++ b/app/src/main/res/layout/item_repo_md2.xml @@ -105,10 +105,29 @@ + + + + + + From 82120cf47fbf94f1d6212cfb6f9afcf4240ebf6e Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 11 Nov 2019 18:01:23 +0100 Subject: [PATCH 146/254] Added processing of the download states --- .../events/dialog/ModuleInstallDialog.kt | 35 +++++++++++++++++++ .../magisk/redesign/module/ModuleViewModel.kt | 4 +++ app/src/main/res/layout/item_repo_md2.xml | 1 + 3 files changed, 40 insertions(+) create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ModuleInstallDialog.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ModuleInstallDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ModuleInstallDialog.kt new file mode 100644 index 000000000..4a91de88f --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ModuleInstallDialog.kt @@ -0,0 +1,35 @@ +package com.topjohnwu.magisk.model.events.dialog + +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.model.download.DownloadService +import com.topjohnwu.magisk.model.entity.internal.Configuration +import com.topjohnwu.magisk.model.entity.internal.DownloadSubject +import com.topjohnwu.magisk.model.entity.module.Repo +import com.topjohnwu.magisk.view.MagiskDialog + +class ModuleInstallDialog(private val item: Repo) : DialogEvent() { + + override fun build(dialog: MagiskDialog) { + with(dialog) { + + fun download(install: Boolean) = DownloadService(context) { + val config = if (install) Configuration.Flash.Primary else Configuration.Download + subject = DownloadSubject.Module(item, config) + } + + applyTitle(context.getString(R.string.repo_install_title, item.name)) + .applyMessage(context.getString(R.string.repo_install_msg, item.downloadFilename)) + .cancellable(true) + .applyButton(MagiskDialog.ButtonType.POSITIVE) { + titleRes = R.string.install + onClick { download(true) } + } + .applyButton(MagiskDialog.ButtonType.NEGATIVE) { + titleRes = R.string.download + onClick { download(false) } + } + .reveal() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index cee5e68a3..10f258e1d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -195,6 +195,10 @@ class ModuleViewModel( .subscribeK() } + fun download(item: RepoItem) { + ModuleInstallDialog(item.item).publish() + } + // --- private fun cleanup() = Completable diff --git a/app/src/main/res/layout/item_repo_md2.xml b/app/src/main/res/layout/item_repo_md2.xml index 592feb068..5fa385fec 100644 --- a/app/src/main/res/layout/item_repo_md2.xml +++ b/app/src/main/res/layout/item_repo_md2.xml @@ -96,6 +96,7 @@ android:id="@+id/module_download" style="?styleIconPrimary" android:contentDescription="@string/download" + android:onClick="@{() -> viewModel.download(item)}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/module_divider" From 495e7344288db2803f2d0249f358e5d0a48632fe Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 11 Nov 2019 19:36:40 +0100 Subject: [PATCH 147/254] Updated module sections so it looks more consistent --- .../model/entity/recycler/ModuleRvItem.kt | 4 +- .../magisk/redesign/module/ModuleViewModel.kt | 116 ++++-------------- app/src/main/res/layout/item_module_md2.xml | 7 +- app/src/main/res/layout/item_section_md2.xml | 8 +- app/src/main/res/values/strings_md2.xml | 4 +- 5 files changed, 40 insertions(+), 99 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt index 3f363c96a..885f13b0e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt @@ -88,6 +88,8 @@ class SectionTitle( ) : ComparableRvItem() { override val layoutRes = R.layout.item_section_md2 + val hasButton = KObservableField(button != 0 || icon != 0) + override fun onBindingBound(binding: ViewDataBinding) { super.onBindingBound(binding) val params = binding.root.layoutParams as StaggeredGridLayoutManager.LayoutParams @@ -136,7 +138,7 @@ class ModuleItem(val item: Module) : ObservableItem(), Observable { fun delete(viewModel: ModuleViewModel) { isRemoved = !isRemoved - viewModel.moveToState(this) + viewModel.moveToState() } override fun contentSameAs(other: ModuleItem): Boolean = item.version == other.item.version diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index 10f258e1d..e5171c7f2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -1,6 +1,5 @@ package com.topjohnwu.magisk.redesign.module -import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.databinding.ViewDataBinding import com.topjohnwu.magisk.BR @@ -9,6 +8,7 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.database.RepoByNameDao import com.topjohnwu.magisk.data.database.RepoByUpdatedDao import com.topjohnwu.magisk.databinding.ComparableRvItem +import com.topjohnwu.magisk.extensions.reboot import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.model.download.RemoteFileService import com.topjohnwu.magisk.model.entity.internal.DownloadSubject @@ -24,9 +24,7 @@ import com.topjohnwu.magisk.redesign.home.itemBindingOf import com.topjohnwu.magisk.redesign.superuser.diffListOf import com.topjohnwu.magisk.tasks.RepoUpdater import com.topjohnwu.magisk.utils.currentLocale -import io.reactivex.Completable import io.reactivex.Single -import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter import timber.log.Timber @@ -46,22 +44,18 @@ class ModuleViewModel( companion object { private val sectionRemote = SectionTitle(R.string.module_section_remote) - private val sectionActive = SectionTitle(R.string.module_section_active) - private val sectionPending = - SectionTitle(R.string.module_section_pending, R.string.reboot, R.drawable.ic_restart) + private val sectionActive = SectionTitle( + R.string.module_section_installed, + R.string.reboot, + R.drawable.ic_restart + ).also { it.hasButton.value = false } } // --- - private val itemsPending + private val itemsInstalled @WorkerThread get() = items.asSequence() .filterIsInstance() - .filter { it.isModified } - .toList() - private val itemsActive - @WorkerThread get() = items.asSequence() - .filterIsInstance() - .filter { !it.isModified } .toList() private val itemsRemote @WorkerThread get() = items.filterIsInstance() @@ -92,29 +86,25 @@ class ModuleViewModel( override fun refresh() = Single.fromCallable { Module.loadModules() } .map { it.map { ModuleItem(it) } } .map { it.order() } - .map { - val pending = it.getValue(ModuleState.Modified) - val active = it.getValue(ModuleState.Normal) - build(pending = pending, active = active) - } + .map { build(active = it) } .map { it to items.calculateDiff(it) } .subscribeK { items.update(it.first, it.second) if (!items.contains(sectionRemote)) { loadRemote() } + moveToState() } @Synchronized fun loadRemote() { // check for existing jobs - val size = itemsRemote.size - if (remoteJob?.isDisposed?.not() == true || size % 10 != 0) { + if (remoteJob?.isDisposed?.not() == true) { return } - remoteJob = loadRepos(offset = size) + remoteJob = Single.fromCallable { itemsRemote.size } + .flatMap { loadRepos(offset = it) } .map { it.map { RepoItem(it) } } - .applyViewModel(this) .subscribeK(onError = { Timber.e(it) items.remove(LoadingItem) @@ -125,6 +115,7 @@ class ModuleViewModel( } items.addAll(it) } + // do on subscribe doesn't perform the action on main thread, so this is perfectly fine items.add(LoadingItem) } @@ -149,23 +140,7 @@ class ModuleViewModel( @WorkerThread private fun List.order() = asSequence() .sortedBy { it.item.name.toLowerCase(currentLocale) } - .groupBy { - when { - it.isModified -> ModuleState.Modified - else -> ModuleState.Normal - } - } - .ensureAllStates() - - private fun Map>.ensureAllStates(): Map> { - val me = this as? MutableMap> ?: this.toMutableMap() - ModuleState.values().forEach { - if (me.none { rit -> it == rit.key }) { - me[it] = listOf() - } - } - return me - } + .toList() private fun update(repo: Repo, progress: Int) = Single.fromCallable { itemsRemote } .map { it.first { it.item.id == repo.id } } @@ -174,58 +149,15 @@ class ModuleViewModel( // --- - @UiThread - fun moveToState(item: ModuleItem) { - items.removeAll { it.genericItemSameAs(item) } + fun moveToState() = Single.fromCallable { itemsInstalled.any { it.isModified } } + .subscribeK { sectionActive.hasButton.value = it } + .add() - val isPending = item.isModified + fun download(item: RepoItem) = ModuleInstallDialog(item.item).publish() - Single.fromCallable { if (isPending) itemsPending else itemsActive } - .map { (listOf(item) + it).toMutableList() } - .map { it.apply { sortWith(compareBy { it.item.name.toLowerCase(currentLocale) }) } } - .map { - if (isPending) build(pending = it) - else build(active = it) - } - .map { it to items.calculateDiff(it) } - .observeOn(AndroidSchedulers.mainThread()) - .doOnSuccess { items.update(it.first, it.second) } - .ignoreElement() - .andThen(cleanup()) - .subscribeK() - } - - fun download(item: RepoItem) { - ModuleInstallDialog(item.item).publish() - } - - // --- - - private fun cleanup() = Completable - .concat(listOf(cleanPending(), cleanActive(), cleanRemote())) - - private fun cleanPending() = Single.fromCallable { itemsPending } - .filter { it.isEmpty() } - .observeOn(AndroidSchedulers.mainThread()) - .doOnSuccess { items.remove(sectionPending) } - .ignoreElement() - - private fun cleanActive() = Single.fromCallable { itemsActive } - .filter { it.isEmpty() } - .observeOn(AndroidSchedulers.mainThread()) - .doOnSuccess { items.remove(sectionActive) } - .ignoreElement() - - private fun cleanRemote() = Single.fromCallable { itemsRemote } - .filter { it.isEmpty() } - .observeOn(AndroidSchedulers.mainThread()) - .doOnSuccess { items.remove(sectionRemote) } - .ignoreElement() - - // --- - - private enum class ModuleState { - Modified, Normal + fun sectionPressed(item: SectionTitle) = when (item) { + sectionActive -> reboot() + else -> Unit } // --- @@ -233,11 +165,9 @@ class ModuleViewModel( /** Callable only from worker thread because of expensive list filtering */ @WorkerThread private fun build( - pending: List = itemsPending, - active: List = itemsActive, + active: List = itemsInstalled, remote: List = itemsRemote - ) = pending.prependIfNotEmpty { sectionPending } + - active.prependIfNotEmpty { sectionActive } + + ) = active.prependIfNotEmpty { sectionActive } + remote.prependIfNotEmpty { sectionRemote } private fun List.prependIfNotEmpty(item: () -> T) = diff --git a/app/src/main/res/layout/item_module_md2.xml b/app/src/main/res/layout/item_module_md2.xml index 535a1bda6..eef049029 100644 --- a/app/src/main/res/layout/item_module_md2.xml +++ b/app/src/main/res/layout/item_module_md2.xml @@ -32,13 +32,14 @@ + android:layout_height="wrap_content" + android:animateLayoutChanges="true"> + + You\'re in safe mode. None of user modules will work.\nThis message will disappear once safe mode is disabled. %1$s by %2$s Pending changes - Active + Installed Remote + Remove + Restore Toggles logging Toggles “toast” notifications From 265dca372363faeed177b09356e9bfd0acdf98ab Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Tue, 12 Nov 2019 15:58:32 +0100 Subject: [PATCH 148/254] Removed intermediate loading item - adding intermediate items causes recyclerview renderer to display artifacts (copies of some views) --- .../model/entity/recycler/ModuleRvItem.kt | 13 ------- .../magisk/redesign/module/ModuleViewModel.kt | 5 --- app/src/main/res/layout/item_loading.xml | 38 ------------------- 3 files changed, 56 deletions(-) delete mode 100644 app/src/main/res/layout/item_loading.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt index 885f13b0e..cfd5a4003 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt @@ -150,19 +150,6 @@ class ModuleItem(val item: Module) : ObservableItem(), Observable { } -object LoadingItem : ComparableRvItem() { - override val layoutRes = R.layout.item_loading - - override fun onBindingBound(binding: ViewDataBinding) { - super.onBindingBound(binding) - val params = binding.root.layoutParams as? StaggeredGridLayoutManager.LayoutParams ?: return - params.isFullSpan = true - } - - override fun contentSameAs(other: LoadingItem) = this == other - override fun itemSameAs(other: LoadingItem) = this === other -} - abstract class ObservableItem : ComparableRvItem(), Observable { private val list = PropertyChangeRegistry() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index e5171c7f2..155ab4a78 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -14,7 +14,6 @@ import com.topjohnwu.magisk.model.download.RemoteFileService import com.topjohnwu.magisk.model.entity.internal.DownloadSubject import com.topjohnwu.magisk.model.entity.module.Module import com.topjohnwu.magisk.model.entity.module.Repo -import com.topjohnwu.magisk.model.entity.recycler.LoadingItem import com.topjohnwu.magisk.model.entity.recycler.ModuleItem import com.topjohnwu.magisk.model.entity.recycler.RepoItem import com.topjohnwu.magisk.model.entity.recycler.SectionTitle @@ -107,16 +106,12 @@ class ModuleViewModel( .map { it.map { RepoItem(it) } } .subscribeK(onError = { Timber.e(it) - items.remove(LoadingItem) }) { - items.remove(LoadingItem) if (!items.contains(sectionRemote)) { items.add(sectionRemote) } items.addAll(it) } - // do on subscribe doesn't perform the action on main thread, so this is perfectly fine - items.add(LoadingItem) } private fun loadRepos( diff --git a/app/src/main/res/layout/item_loading.xml b/app/src/main/res/layout/item_loading.xml deleted file mode 100644 index c10346364..000000000 --- a/app/src/main/res/layout/item_loading.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From b2b81a5d0f5f5d8178892463b912a7da830069c3 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Tue, 12 Nov 2019 16:45:28 +0100 Subject: [PATCH 149/254] Fixed "enabled" state for download action button --- app/src/main/res/layout/item_repo_md2.xml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/layout/item_repo_md2.xml b/app/src/main/res/layout/item_repo_md2.xml index 5fa385fec..282031111 100644 --- a/app/src/main/res/layout/item_repo_md2.xml +++ b/app/src/main/res/layout/item_repo_md2.xml @@ -95,6 +95,7 @@ - - + + Date: Tue, 12 Nov 2019 17:23:27 +0100 Subject: [PATCH 150/254] Fixed slow scrolling and list updates on hide screen --- .../magisk/redesign/hide/HideFragment.kt | 11 +- .../magisk/redesign/module/ModuleFragment.kt | 3 +- app/src/main/res/layout/fragment_hide_md2.xml | 243 ++++++++---------- app/src/main/res/layout/item_hide_md2.xml | 2 +- 4 files changed, 126 insertions(+), 133 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt index de2ad1975..9b85ca37e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt @@ -2,6 +2,7 @@ package com.topjohnwu.magisk.redesign.hide import android.content.Context import android.graphics.Insets +import android.os.Bundle import android.view.Menu import android.view.MenuInflater import android.view.MenuItem @@ -24,13 +25,21 @@ class HideFragment : CompatFragment() { setHasOptionsMenu(true) } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val lama = binding.hideContent.layoutManager ?: return + lama.isAutoMeasureEnabled = false + } + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.menu_hide_md2, menu) } override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { - R.id.action_focus_up -> binding.hideScrollContainer.fullScroll(View.FOCUS_UP) + R.id.action_focus_up -> binding.hideContent + .also { it.scrollToPosition(10) } + .also { it.smoothScrollToPosition(0) } } return super.onOptionsItemSelected(item) } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt index 5dcd3d5d3..5cb682805 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt @@ -3,7 +3,6 @@ package com.topjohnwu.magisk.redesign.module import android.graphics.Insets import android.os.Bundle import android.view.View -import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentModuleMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment @@ -37,7 +36,7 @@ class ModuleFragment : CompatFragment } private fun setEndlessScroller() { - val lama = binding.moduleRemote.layoutManager as? StaggeredGridLayoutManager ?: return + val lama = binding.moduleRemote.layoutManager ?: return lama.isAutoMeasureEnabled = false listener = EndlessRecyclerScrollListener(lama, viewModel::loadRemote) diff --git a/app/src/main/res/layout/fragment_hide_md2.xml b/app/src/main/res/layout/fragment_hide_md2.xml index bd68014c8..61493935d 100644 --- a/app/src/main/res/layout/fragment_hide_md2.xml +++ b/app/src/main/res/layout/fragment_hide_md2.xml @@ -17,150 +17,135 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + android:layout_height="match_parent" + android:clipToPadding="false" + android:orientation="vertical" + android:paddingStart="@dimen/l1" + android:paddingEnd="@dimen/l1" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + tools:listitem="@layout/item_hide_md2" + tools:paddingTop="40dp" /> - + + + android:layout_height="wrap_content"> + + + + + + + + + + + + + android:layout_marginStart="@dimen/l_50" + android:layout_marginEnd="@dimen/l_50" + android:layout_marginBottom="@dimen/l_50" + android:visibility="gone" + app:cardCornerRadius="18dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@+id/hide_filter_barrier" + tools:visibility="visible"> - + + - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="wrap_content" + android:layout_marginStart="48dp" + android:background="@null" + android:hint="@string/hide_filter_hint" + android:inputType="textUri" + android:minHeight="36dp" + android:paddingStart="0dp" + android:paddingEnd="@dimen/l1" + android:singleLine="true" + android:text="@={viewModel.query}" + android:textAppearance="?appearanceTextBodyNormal" + android:textColor="?colorTextTransient" + android:textColorHint="?colorOnSurfaceVariant" /> - + - - - + + android:progress="@{item.itemsCheckedPercent}" /> From 54930024f5210150459b692b6f716f4d47492a33 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Tue, 12 Nov 2019 18:01:24 +0100 Subject: [PATCH 151/254] Added biometric dialog instead of fingerprint one --- app/build.gradle | 1 + .../model/events/dialog/BiometricDialog.kt | 54 +++++++++++++++++++ .../model/events/dialog/FingerprintDialog.kt | 10 +++- .../redesign/superuser/SuperuserViewModel.kt | 6 +-- 4 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt diff --git a/app/build.gradle b/app/build.gradle index 4934b8ba9..401a9f1b9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -130,6 +130,7 @@ dependencies { implementation 'androidx.transition:transition:1.2.0' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.core:core-ktx:1.1.0' + implementation 'androidx.biometric:biometric:1.0.0' implementation 'com.google.android.material:material:1.1.0-beta01' implementation 'com.karumi:dexter:6.0.0' } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt new file mode 100644 index 000000000..b22b99562 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt @@ -0,0 +1,54 @@ +package com.topjohnwu.magisk.model.events.dialog + +import android.os.Handler +import androidx.appcompat.app.AppCompatActivity +import androidx.biometric.BiometricPrompt +import com.topjohnwu.magisk.model.events.ActivityExecutor +import com.topjohnwu.magisk.model.events.ViewEvent + +class BiometricDialog( + builder: Builder.() -> Unit +) : ViewEvent(), ActivityExecutor { + + private var listenerOnFailure: GenericDialogListener = {} + private var listenerOnSuccess: GenericDialogListener = {} + + init { + builder(Builder()) + } + + override fun invoke(activity: AppCompatActivity) { + val handler = Handler() + val prompt = BiometricPrompt.PromptInfo.Builder() + .setNegativeButtonText(activity.getString(android.R.string.cancel)) + .build() + + val callback = object : BiometricPrompt.AuthenticationCallback() { + override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { + listenerOnFailure() + } + + override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) { + listenerOnSuccess() + } + + override fun onAuthenticationFailed() { + listenerOnFailure() + } + } + BiometricPrompt(activity, { handler.post(it) }, callback) + .authenticate(prompt/*launch with no crypto for now*/) + } + + inner class Builder internal constructor() { + + fun onFailure(listener: GenericDialogListener) { + listenerOnFailure = listener + } + + fun onSuccess(listener: GenericDialogListener) { + listenerOnSuccess = listener + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/FingerprintDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/FingerprintDialog.kt index ddc763962..cd7ff25aa 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/FingerprintDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/FingerprintDialog.kt @@ -6,7 +6,15 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.utils.FingerprintHelper import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.magisk.view.MagiskDialog +import timber.log.Timber +@Deprecated( + "Use Biometrics instead", + ReplaceWith( + "BiometricDialog", + imports = ["com.topjohnwu.magisk.model.events.dialog.BiometricDialog"] + ) +) class FingerprintDialog( builder: Builder.() -> Unit ) : DialogEvent() { @@ -15,7 +23,7 @@ class FingerprintDialog( private var helper: Helper? = null get() { if (field == null) { - runCatching { field = Helper() } + runCatching { field = Helper() }.onFailure { Timber.e(it) } } return field } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt index 471bb8393..ee20a1f37 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt @@ -13,7 +13,7 @@ import com.topjohnwu.magisk.model.entity.MagiskPolicy import com.topjohnwu.magisk.model.entity.recycler.PolicyItem import com.topjohnwu.magisk.model.events.PolicyUpdateEvent import com.topjohnwu.magisk.model.events.SnackbarEvent -import com.topjohnwu.magisk.model.events.dialog.FingerprintDialog +import com.topjohnwu.magisk.model.events.dialog.BiometricDialog import com.topjohnwu.magisk.model.events.dialog.SuperuserRevokeDialog import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.redesign.compat.CompatViewModel @@ -72,7 +72,7 @@ class SuperuserViewModel( .add() if (FingerprintHelper.useFingerprint()) { - FingerprintDialog { + BiometricDialog { onSuccess { updateState() } }.publish() } else { @@ -116,7 +116,7 @@ class SuperuserViewModel( } if (FingerprintHelper.useFingerprint()) { - FingerprintDialog { + BiometricDialog { onSuccess { updateState() } onFailure { item.isEnabled.toggle() } }.publish() From e1bda4ee8ba94e03078cbbde2059c6eb5e8be1ec Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Wed, 13 Nov 2019 18:29:30 +0100 Subject: [PATCH 152/254] Added new filter for hide section Parts of which will be reused in modules down the line --- .../magisk/redesign/hide/HideFragment.kt | 90 ++++++++++- app/src/main/res/layout/fragment_hide_md2.xml | 131 ++++------------ .../main/res/layout/include_hide_filter.xml | 140 ++++++++++++++++++ app/src/main/res/values/strings_md2.xml | 2 + 4 files changed, 256 insertions(+), 107 deletions(-) create mode 100644 app/src/main/res/layout/include_hide_filter.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt index 9b85ca37e..c375599d0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt @@ -1,5 +1,8 @@ package com.topjohnwu.magisk.redesign.hide +import android.animation.Animator +import android.animation.AnimatorSet +import android.animation.ObjectAnimator import android.content.Context import android.graphics.Insets import android.os.Bundle @@ -7,10 +10,20 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View +import androidx.core.animation.addListener +import androidx.core.view.isInvisible +import androidx.core.view.isVisible +import androidx.core.view.marginBottom +import androidx.core.view.marginEnd +import androidx.interpolator.view.animation.FastOutSlowInInterpolator +import com.google.android.material.circularreveal.CircularRevealCompat +import com.google.android.material.circularreveal.CircularRevealWidget +import com.google.android.material.floatingactionbutton.FloatingActionButton import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentHideMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment import org.koin.androidx.viewmodel.ext.android.viewModel +import kotlin.math.hypot class HideFragment : CompatFragment() { @@ -27,6 +40,14 @@ class HideFragment : CompatFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + + binding.hideFilterToggle.setOnClickListener { + MotionRevealHelper.withViews(binding.hideFilter, binding.hideFilterToggle, true) + } + binding.hideFilterInclude.hideFilterDone.setOnClickListener { + MotionRevealHelper.withViews(binding.hideFilter, binding.hideFilterToggle, false) + } + val lama = binding.hideContent.layoutManager ?: return lama.isAutoMeasureEnabled = false } @@ -44,4 +65,71 @@ class HideFragment : CompatFragment() { return super.onOptionsItemSelected(item) } -} \ No newline at end of file +} + +object MotionRevealHelper { + + fun withViews( + revealable: CV, + fab: FloatingActionButton, + expanded: Boolean + ) where CV : CircularRevealWidget, CV : View { + revealable.revealInfo = revealable.createRevealInfo(!expanded) + + val revealInfo = revealable.createRevealInfo(expanded) + val revealAnim = revealable.createRevealAnim(revealInfo) + val moveAnim = fab.createMoveAnim(revealInfo) + + AnimatorSet().also { + if (expanded) { + it.play(revealAnim).after(moveAnim) + } else { + it.play(moveAnim).after(revealAnim) + } + }.start() + } + + private fun CV.createRevealAnim( + revealInfo: CircularRevealWidget.RevealInfo + ): Animator where CV : CircularRevealWidget, CV : View = + CircularRevealCompat.createCircularReveal( + this, + revealInfo.centerX, + revealInfo.centerY, + revealInfo.radius + ).apply { + addListener(onStart = { + isVisible = true + }, onEnd = { + if (revealInfo.radius == 0f) { + isInvisible = true + } + }) + } + + private fun FloatingActionButton.createMoveAnim( + revealInfo: CircularRevealWidget.RevealInfo + ): Animator = AnimatorSet().also { + it.interpolator = FastOutSlowInInterpolator() + it.addListener(onStart = { show() }, onEnd = { if (revealInfo.radius != 0f) hide() }) + + val maxX = revealInfo.centerX - marginEnd - measuredWidth / 2f + val targetX = if (revealInfo.radius == 0f) 0f else -maxX + val moveX = ObjectAnimator.ofFloat(this, View.TRANSLATION_X, targetX) + + val maxY = revealInfo.centerY - marginBottom - measuredHeight / 2f + val targetY = if (revealInfo.radius == 0f) 0f else -maxY + val moveY = ObjectAnimator.ofFloat(this, View.TRANSLATION_Y, targetY) + + it.playTogether(moveX, moveY) + } + + private fun View.createRevealInfo(expanded: Boolean): CircularRevealWidget.RevealInfo { + val cX = measuredWidth / 2f + val cY = measuredHeight / 2f - paddingBottom + return CircularRevealWidget.RevealInfo(cX, cY, if (expanded) hypot(cX, cY) else 0f) + } + +} + + diff --git a/app/src/main/res/layout/fragment_hide_md2.xml b/app/src/main/res/layout/fragment_hide_md2.xml index 61493935d..cfab09d06 100644 --- a/app/src/main/res/layout/fragment_hide_md2.xml +++ b/app/src/main/res/layout/fragment_hide_md2.xml @@ -23,129 +23,48 @@ invisibleUnless="@{viewModel.loaded || !viewModel.items.empty}" itemBinding="@{viewModel.itemBinding}" items="@{viewModel.items}" - nestedScrollingEnabled="@{false}" android:layout_width="match_parent" - android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l1}" - android:paddingBottom="@{viewModel.insets.bottom}" android:layout_height="match_parent" android:clipToPadding="false" android:orientation="vertical" android:paddingStart="@dimen/l1" + android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l1}" android:paddingEnd="@dimen/l1" + android:paddingBottom="@{viewModel.insets.bottom}" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:listitem="@layout/item_hide_md2" tools:paddingTop="40dp" /> - + app:backgroundTint="?colorSurface" + app:srcCompat="@drawable/ic_filter" + app:tint="?colorPrimary" + tools:layout_marginBottom="64dp" /> - + + + android:layout_height="wrap_content" /> - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index ec7a0792c..a37dd2ed1 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -87,5 +87,7 @@ Filter by name Scroll up + Filters + Search \ No newline at end of file From eec5b37da1e35b21dc487b963570034e850c7ff9 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 14 Nov 2019 15:12:53 +0100 Subject: [PATCH 153/254] Fixed inconsistent animations in hide --- .../topjohnwu/magisk/redesign/compat/CompatFragment.kt | 8 ++++++-- .../com/topjohnwu/magisk/redesign/hide/HideFragment.kt | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt index a773770c1..f7eb35d72 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt @@ -24,8 +24,8 @@ abstract class CompatFragment() { override fun onPreBind(binding: Binding): Boolean { - (binding.root as? ViewGroup)?.startAnimations() - return super.onPreBind(binding) + this@CompatFragment.onPreBind(binding) + return true } }) @@ -42,6 +42,10 @@ abstract class CompatFragment() { return super.onOptionsItemSelected(item) } + override fun onPreBind(binding: FragmentHideMd2Binding) = Unit + } object MotionRevealHelper { From c69dcf3e208ac049eac41a8f3301970edbc76058 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 14 Nov 2019 15:19:48 +0100 Subject: [PATCH 154/254] Added hiding keyboard when "done" button pressed --- .../magisk/redesign/compat/CompatActivity.kt | 11 +++++++++++ .../magisk/redesign/compat/CompatFragment.kt | 5 +++++ .../topjohnwu/magisk/redesign/hide/HideFragment.kt | 2 ++ 3 files changed, 18 insertions(+) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt index c0b58d567..42a9e6f59 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt @@ -1,9 +1,12 @@ package com.topjohnwu.magisk.redesign.compat +import android.app.Activity import android.content.Intent import android.os.Bundle import android.view.View import android.view.ViewGroup +import android.view.inputmethod.InputMethodManager +import androidx.core.content.getSystemService import androidx.databinding.OnRebindCallback import androidx.databinding.ViewDataBinding import androidx.fragment.app.Fragment @@ -17,6 +20,7 @@ import com.topjohnwu.magisk.model.navigation.MagiskNavigationEvent import com.topjohnwu.magisk.model.navigation.Navigator import kotlin.reflect.KClass + abstract class CompatActivity : BaseActivity(), CompatView, Navigator { @@ -78,4 +82,11 @@ abstract class CompatActivity() + ?.hideSoftInputFromWindow(view.windowToken, 0) + view.clearFocus() } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt index f7eb35d72..6c9c90352 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt @@ -5,6 +5,7 @@ import android.view.View import android.view.ViewGroup import androidx.databinding.OnRebindCallback import androidx.databinding.ViewDataBinding +import androidx.fragment.app.Fragment import com.topjohnwu.magisk.base.BaseFragment import com.topjohnwu.magisk.extensions.startAnimations import com.topjohnwu.magisk.model.events.ViewEvent @@ -48,4 +49,8 @@ abstract class CompatFragment() { MotionRevealHelper.withViews(binding.hideFilter, binding.hideFilterToggle, true) } binding.hideFilterInclude.hideFilterDone.setOnClickListener { + hideKeyboard() MotionRevealHelper.withViews(binding.hideFilter, binding.hideFilterToggle, false) } From 9d1d1710ebc94cf32b5d8fa2b0a4d83c2ed54fbf Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 14 Nov 2019 18:56:03 +0100 Subject: [PATCH 155/254] Added new search functionality to module screen --- .../topjohnwu/magisk/data/database/Repo.kt | 34 ++++- .../topjohnwu/magisk/redesign/MainActivity.kt | 29 ++-- .../magisk/redesign/compat/CompatFragment.kt | 2 +- .../magisk/redesign/compat/Queryable.kt | 26 ++++ .../magisk/redesign/hide/HideViewModel.kt | 18 +-- .../magisk/redesign/module/ModuleFragment.kt | 35 ++++- .../magisk/redesign/module/ModuleViewModel.kt | 76 ++++++++-- app/src/main/res/drawable/bg_shadow.xml | 8 ++ .../main/res/layout/fragment_module_md2.xml | 72 +++++++--- .../main/res/layout/include_module_filter.xml | 131 ++++++++++++++++++ .../main/res/values-v21/styles_md2_impl.xml | 7 + app/src/main/res/values/attrs.xml | 1 + app/src/main/res/values/styles_md2.xml | 6 +- app/src/main/res/values/styles_md2_impl.xml | 6 + 14 files changed, 395 insertions(+), 56 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/compat/Queryable.kt create mode 100644 app/src/main/res/drawable/bg_shadow.xml create mode 100644 app/src/main/res/layout/include_module_filter.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt index 3c42c9d2e..457f969b3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt @@ -8,7 +8,12 @@ import com.topjohnwu.magisk.model.entity.module.Repo interface RepoBase { - fun getRepos(offset: Int, limit: Int = 10): List + fun getRepos(offset: Int, limit: Int = LIMIT): List + fun searchRepos(query: String, offset: Int, limit: Int = LIMIT): List + + companion object { + const val LIMIT = 10 + } } @@ -18,6 +23,19 @@ interface RepoByUpdatedDao : RepoBase { @Query("SELECT * FROM repos ORDER BY last_update DESC LIMIT :limit OFFSET :offset") override fun getRepos(offset: Int, limit: Int): List + @Query( + """SELECT * + FROM repos + WHERE + (author LIKE '%' || :query || '%') || + (name LIKE '%' || :query || '%') || + (description LIKE '%' || :query || '%') + ORDER BY last_update DESC + LIMIT :limit + OFFSET :offset""" + ) + override fun searchRepos(query: String, offset: Int, limit: Int): List + } @Dao @@ -26,4 +44,18 @@ interface RepoByNameDao : RepoBase { @Query("SELECT * FROM repos ORDER BY name COLLATE NOCASE LIMIT :limit OFFSET :offset") override fun getRepos(offset: Int, limit: Int): List + @Query( + """SELECT * + FROM repos + WHERE + (author LIKE '%' || :query || '%') || + (name LIKE '%' || :query || '%') || + (description LIKE '%' || :query || '%') + ORDER BY name COLLATE NOCASE + LIMIT :limit + OFFSET :offset""" + ) + override fun searchRepos(query: String, offset: Int, limit: Int): List + + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index 75571b3e6..e448acdcc 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -116,19 +116,7 @@ open class MainActivity : CompatActivity( transactionType: FragNavController.TransactionType ) { setDisplayHomeAsUpEnabled(!navigation.isRoot) - - val lapam = binding.mainBottomBar.layoutParams as ViewGroup.MarginLayoutParams - val height = binding.mainBottomBar.measuredHeight - val verticalMargin = lapam.let { it.topMargin + it.bottomMargin } - val maxTranslation = height + verticalMargin - val translation = if (navigation.isRoot) 0 else maxTranslation - - binding.mainBottomBar.animate() - .translationY(translation.toFloat()) - .setInterpolator(FastOutSlowInInterpolator()) - .withStartAction { if (navigation.isRoot) binding.mainBottomBar.isVisible = true } - .withEndAction { if (!navigation.isRoot) binding.mainBottomBar.isVisible = false } - .start() + requestNavigationHidden(!navigation.isRoot) } override fun peekSystemWindowInsets(insets: Insets) { @@ -143,4 +131,19 @@ open class MainActivity : CompatActivity( } } + internal fun requestNavigationHidden(hide: Boolean = true) { + val lapam = binding.mainBottomBar.layoutParams as ViewGroup.MarginLayoutParams + val height = binding.mainBottomBar.measuredHeight + val verticalMargin = lapam.let { it.topMargin + it.bottomMargin } + val maxTranslation = height + verticalMargin + val translation = if (!hide) 0 else maxTranslation + + binding.mainBottomBar.animate() + .translationY(translation.toFloat()) + .setInterpolator(FastOutSlowInInterpolator()) + .withStartAction { if (!hide) binding.mainBottomBar.isVisible = true } + .withEndAction { if (hide) binding.mainBottomBar.isVisible = false } + .start() + } + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt index 6c9c90352..c4b942736 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt @@ -18,7 +18,7 @@ abstract class CompatFragment + protected val compatActivity get() = requireActivity() as CompatActivity<*, *> override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/Queryable.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/Queryable.kt new file mode 100644 index 000000000..68c785b61 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/Queryable.kt @@ -0,0 +1,26 @@ +package com.topjohnwu.magisk.redesign.compat + +import android.os.Handler +import android.os.Looper + +interface Queryable { + + val queryDelay: Long + val queryHandler: Handler + val queryRunnable: Runnable + + fun submitQuery() + + companion object { + fun impl(delay: Long = 1000L) = object : Queryable { + override val queryDelay = delay + override val queryHandler = Handler(Looper.getMainLooper()) + override val queryRunnable = Runnable { TODO() } + + override fun submitQuery() { + queryHandler.removeCallbacks(queryRunnable) + queryHandler.postDelayed(queryRunnable, queryDelay) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt index 260d34313..9e7b43d20 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt @@ -1,8 +1,6 @@ package com.topjohnwu.magisk.redesign.hide import android.content.pm.ApplicationInfo -import android.os.Handler -import android.os.Looper import androidx.databinding.Bindable import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.data.repository.MagiskRepository @@ -16,20 +14,18 @@ import com.topjohnwu.magisk.model.entity.StatefulProcess import com.topjohnwu.magisk.model.entity.recycler.HideItem import com.topjohnwu.magisk.model.entity.recycler.HideProcessItem import com.topjohnwu.magisk.redesign.compat.CompatViewModel +import com.topjohnwu.magisk.redesign.compat.Queryable import com.topjohnwu.magisk.redesign.home.itemBindingOf import com.topjohnwu.magisk.utils.DiffObservableList import com.topjohnwu.magisk.utils.FilterableDiffObservableList import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.currentLocale -import io.reactivex.Single -import io.reactivex.android.schedulers.AndroidSchedulers class HideViewModel( private val magiskRepo: MagiskRepository -) : CompatViewModel() { +) : CompatViewModel(), Queryable by Queryable.impl(1000) { - private val queryHandler = Handler(Looper.getMainLooper()) - private val queryRunnable = Runnable { query() } + override val queryRunnable = Runnable { query() } var isShowSystem = false @Bindable get @@ -67,7 +63,7 @@ class HideViewModel( .applyViewModel(this) .subscribeK { items.update(it.first, it.second) - query() + submitQuery() } // --- @@ -87,9 +83,9 @@ class HideViewModel( // --- - private fun submitQuery() { + override fun submitQuery() { queryHandler.removeCallbacks(queryRunnable) - queryHandler.postDelayed(queryRunnable, 1000) + queryHandler.postDelayed(queryRunnable, queryDelay) } private fun query( @@ -130,7 +126,7 @@ class HideViewModel( } -inline fun > filterableListOf( +inline fun > filterableListOf( vararg newItems: T ) = FilterableDiffObservableList(object : DiffObservableList.Callback { override fun areItemsTheSame(oldItem: T, newItem: T) = oldItem.genericItemSameAs(newItem) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt index 5cb682805..181ca3d54 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt @@ -5,7 +5,10 @@ import android.os.Bundle import android.view.View import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentModuleMd2Binding +import com.topjohnwu.magisk.redesign.MainActivity import com.topjohnwu.magisk.redesign.compat.CompatFragment +import com.topjohnwu.magisk.redesign.compat.hideKeyboard +import com.topjohnwu.magisk.redesign.hide.MotionRevealHelper import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener import org.koin.androidx.viewmodel.ext.android.viewModel @@ -14,7 +17,7 @@ class ModuleFragment : CompatFragment override val layoutRes = R.layout.fragment_module_md2 override val viewModel by viewModel() - private lateinit var listener: EndlessRecyclerScrollListener + private val listeners = hashSetOf() override fun consumeSystemWindowInsets(insets: Insets) = insets @@ -26,21 +29,45 @@ class ModuleFragment : CompatFragment override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setEndlessScroller() + setEndlessSearch() + + binding.moduleFilterToggle.setOnClickListener { + (activity as? MainActivity)?.requestNavigationHidden() + MotionRevealHelper.withViews(binding.moduleFilter, binding.moduleFilterToggle, true) + } + binding.moduleFilterInclude.moduleFilterDone.setOnClickListener { + (activity as? MainActivity)?.requestNavigationHidden(false) + hideKeyboard() + MotionRevealHelper.withViews(binding.moduleFilter, binding.moduleFilterToggle, false) + } } override fun onDestroyView() { - if (this::listener.isInitialized) { - binding.moduleRemote.removeOnScrollListener(listener) + listeners.forEach { + binding.moduleRemote.removeOnScrollListener(it) + binding.moduleFilterInclude.moduleFilterList.removeOnScrollListener(it) } super.onDestroyView() } + override fun onPreBind(binding: FragmentModuleMd2Binding) = Unit + private fun setEndlessScroller() { val lama = binding.moduleRemote.layoutManager ?: return lama.isAutoMeasureEnabled = false - listener = EndlessRecyclerScrollListener(lama, viewModel::loadRemote) + val listener = EndlessRecyclerScrollListener(lama, viewModel::loadRemote) binding.moduleRemote.addOnScrollListener(listener) + listeners.add(listener) + } + + private fun setEndlessSearch() { + val lama = binding.moduleFilterInclude.moduleFilterList.layoutManager ?: return + lama.isAutoMeasureEnabled = false + + val listener = EndlessRecyclerScrollListener(lama, viewModel::loadMoreQuery) + binding.moduleFilterInclude.moduleFilterList.addOnScrollListener(listener) + listeners.add(listener) } } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index 155ab4a78..3c5595701 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -1,6 +1,7 @@ package com.topjohnwu.magisk.redesign.module import androidx.annotation.WorkerThread +import androidx.databinding.Bindable import androidx.databinding.ViewDataBinding import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.Config @@ -19,11 +20,14 @@ import com.topjohnwu.magisk.model.entity.recycler.RepoItem import com.topjohnwu.magisk.model.entity.recycler.SectionTitle import com.topjohnwu.magisk.model.events.dialog.ModuleInstallDialog import com.topjohnwu.magisk.redesign.compat.CompatViewModel +import com.topjohnwu.magisk.redesign.compat.Queryable import com.topjohnwu.magisk.redesign.home.itemBindingOf import com.topjohnwu.magisk.redesign.superuser.diffListOf import com.topjohnwu.magisk.tasks.RepoUpdater +import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.currentLocale import io.reactivex.Single +import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter import timber.log.Timber @@ -33,7 +37,27 @@ class ModuleViewModel( private val repoName: RepoByNameDao, private val repoUpdated: RepoByUpdatedDao, private val repoUpdater: RepoUpdater -) : CompatViewModel() { +) : CompatViewModel(), Queryable by Queryable.impl(1000) { + + override val queryRunnable = Runnable { query() } + + var query = "" + @Bindable get + set(value) { + if (field == value) return + field = value + notifyPropertyChanged(BR.query) + submitQuery() + // Yes we do lie about the search being loaded + searchLoading.value = true + } + + private var queryJob: Disposable? = null + val searchLoading = KObservableField(false) + val itemsSearch = diffListOf() + val itemSearchBinding = itemBindingOf { + it.bindExtra(BR.viewModel, this) + } val adapter = adapterOf>() val items = diffListOf>() @@ -102,7 +126,7 @@ class ModuleViewModel( return } remoteJob = Single.fromCallable { itemsRemote.size } - .flatMap { loadRepos(offset = it) } + .flatMap { loadRemoteInternal(offset = it) } .map { it.map { RepoItem(it) } } .subscribeK(onError = { Timber.e(it) @@ -114,14 +138,49 @@ class ModuleViewModel( } } - private fun loadRepos( + // --- + + override fun submitQuery() { + queryHandler.removeCallbacks(queryRunnable) + queryHandler.postDelayed(queryRunnable, queryDelay) + } + + private fun queryInternal(query: String, offset: Int): Single> { + if (query.isBlank()) { + return Single.just(listOf()) + .doOnSubscribe { itemsSearch.clear() } + .subscribeOn(AndroidSchedulers.mainThread()) + } + return Single.fromCallable { dao.searchRepos(query, offset) } + .map { it.map { RepoItem(it) } } + } + + private fun query(query: String = this.query, offset: Int = 0) { + queryJob?.dispose() + queryJob = queryInternal(query, offset) + .map { it to itemsSearch.calculateDiff(it) } + .observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess { searchLoading.value = false } + .subscribeK { itemsSearch.update(it.first, it.second) } + } + + @Synchronized + fun loadMoreQuery() { + if (queryJob?.isDisposed == false) return + queryJob = queryInternal(query, itemsSearch.size) + .subscribeK { itemsSearch.addAll(it) } + } + + // --- + + private fun loadRemoteInternal( offset: Int = 0, downloadRepos: Boolean = offset == 0 ): Single> = Single.fromCallable { dao.getRepos(offset) }.flatMap { when { // in case we find result empty and offset is initial we need to refresh the repos. downloadRepos && it.isEmpty() && offset == 0 -> downloadRepos() - .andThen(loadRepos(downloadRepos = false)) + .andThen(loadRemoteInternal(downloadRepos = false)) else -> Single.just(it) } } @@ -137,10 +196,11 @@ class ModuleViewModel( .sortedBy { it.item.name.toLowerCase(currentLocale) } .toList() - private fun update(repo: Repo, progress: Int) = Single.fromCallable { itemsRemote } - .map { it.first { it.item.id == repo.id } } - .subscribeK { it.progress.value = progress } - .add() + private fun update(repo: Repo, progress: Int) = + Single.fromCallable { itemsRemote + itemsSearch } + .map { it.first { it.item.id == repo.id } } + .subscribeK { it.progress.value = progress } + .add() // --- diff --git a/app/src/main/res/drawable/bg_shadow.xml b/app/src/main/res/drawable/bg_shadow.xml new file mode 100644 index 000000000..4f7bd989b --- /dev/null +++ b/app/src/main/res/drawable/bg_shadow.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_module_md2.xml b/app/src/main/res/layout/fragment_module_md2.xml index e552171c9..814777139 100644 --- a/app/src/main/res/layout/fragment_module_md2.xml +++ b/app/src/main/res/layout/fragment_module_md2.xml @@ -15,23 +15,61 @@ - + android:layout_height="match_parent"> + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/include_module_filter.xml b/app/src/main/res/layout/include_module_filter.xml new file mode 100644 index 000000000..c1c3d2b57 --- /dev/null +++ b/app/src/main/res/layout/include_module_filter.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-v21/styles_md2_impl.xml b/app/src/main/res/values-v21/styles_md2_impl.xml index 89ef37cc0..ce1e57cba 100644 --- a/app/src/main/res/values-v21/styles_md2_impl.xml +++ b/app/src/main/res/values-v21/styles_md2_impl.xml @@ -8,4 +8,11 @@ ?colorPrimary + + \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index d22750e35..0e48fce00 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -50,6 +50,7 @@ + diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index b90f0c985..36263fc3b 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -56,7 +56,11 @@ @style/WidgetFoundation.RadioButton @style/WidgetFoundation.ProgressBar - @style/WidgetFoundation.ProgressBar.Indeterminate + + @style/WidgetFoundation.ProgressBar.Indeterminate + + + @style/WidgetFoundation.ProgressBar.Indeterminate.Circular diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index a1eda00ae..aa7e3e3fa 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -162,4 +162,10 @@ variant. Make sure to use style referenced by attribute defined it attrs.xml. 100dp + + \ No newline at end of file From 2105cacce31e8f9698f8b69ec873650e3bc593b2 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 14 Nov 2019 19:10:49 +0100 Subject: [PATCH 156/254] Fixed fab background color in dark mode Now it's recognizable from the background --- app/src/main/res/layout/fragment_hide_md2.xml | 2 +- app/src/main/res/layout/fragment_module_md2.xml | 2 +- app/src/main/res/values-night/styles_md2.xml | 1 + app/src/main/res/values-night/styles_md2_impl.xml | 11 ----------- app/src/main/res/values/attrs.xml | 1 + app/src/main/res/values/styles_md2.xml | 1 + app/src/main/res/values/styles_md2_impl.xml | 2 +- 7 files changed, 6 insertions(+), 14 deletions(-) delete mode 100644 app/src/main/res/values-night/styles_md2_impl.xml diff --git a/app/src/main/res/layout/fragment_hide_md2.xml b/app/src/main/res/layout/fragment_hide_md2.xml index cfab09d06..ecadb72f2 100644 --- a/app/src/main/res/layout/fragment_hide_md2.xml +++ b/app/src/main/res/layout/fragment_hide_md2.xml @@ -43,7 +43,7 @@ android:layout_marginStart="@dimen/l1" android:layout_marginEnd="@dimen/l1" android:layout_marginBottom="@{viewModel.insets.bottom + (int) @dimen/l1}" - app:backgroundTint="?colorSurface" + app:backgroundTint="?colorSurfaceSurfaceVariant" app:srcCompat="@drawable/ic_filter" app:tint="?colorPrimary" tools:layout_marginBottom="64dp" /> diff --git a/app/src/main/res/layout/fragment_module_md2.xml b/app/src/main/res/layout/fragment_module_md2.xml index 814777139..ece026ef5 100644 --- a/app/src/main/res/layout/fragment_module_md2.xml +++ b/app/src/main/res/layout/fragment_module_md2.xml @@ -46,7 +46,7 @@ android:layout_marginStart="@dimen/l1" android:layout_marginEnd="@dimen/l1" android:layout_marginBottom="@{viewModel.insets.bottom + (int) @dimen/l1}" - app:backgroundTint="?colorSurface" + app:backgroundTint="?colorSurfaceSurfaceVariant" app:srcCompat="@drawable/ic_filter" app:tint="?colorPrimary" tools:layout_marginBottom="64dp" /> diff --git a/app/src/main/res/values-night/styles_md2.xml b/app/src/main/res/values-night/styles_md2.xml index 402be7ab1..877e29a6a 100644 --- a/app/src/main/res/values-night/styles_md2.xml +++ b/app/src/main/res/values-night/styles_md2.xml @@ -8,6 +8,7 @@ #8000C853 #0D0D0D #1F1F1F + ?colorSurfaceVariant #F2F2F2 #D9E6E6E6 #F2F2F2 diff --git a/app/src/main/res/values-night/styles_md2_impl.xml b/app/src/main/res/values-night/styles_md2_impl.xml deleted file mode 100644 index c7c2e1458..000000000 --- a/app/src/main/res/values-night/styles_md2_impl.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 0e48fce00..d07108b6c 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -96,6 +96,7 @@ + diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index 36263fc3b..adbef56d6 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -103,6 +103,7 @@ #8000C853 #F2F2F2 #E8E8E8 + ?colorSurface #F2F2F2 #D9E6E6E6 #F2F2F2 diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index aa7e3e3fa..08399bcdf 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -37,7 +37,7 @@ variant. Make sure to use style referenced by attribute defined it attrs.xml. + + + + + + @@ -84,7 +84,7 @@ variant. Make sure to use style referenced by attribute defined it attrs.xml. \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 07957fced..a8dd8f25f 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -87,12 +87,6 @@ - - - - - - diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index b38de20a5..356d2abaf 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -103,28 +103,9 @@ \ No newline at end of file diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index daff156e1..3c3cd8756 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -137,19 +137,19 @@ variant. Make sure to use style referenced by attribute defined it attrs.xml. + + + + + \ No newline at end of file From 6379108a7551422161fcbabae77caeeb1f1c524e Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Wed, 20 Nov 2019 22:42:44 +0100 Subject: [PATCH 179/254] Added new log screen --- .../magisk/data/repository/LogRepository.kt | 6 +- .../com/topjohnwu/magisk/di/RedesignModule.kt | 2 +- .../com/topjohnwu/magisk/extensions/XTime.kt | 7 ++ .../magisk/model/entity/recycler/LogRvItem.kt | 36 ++++++ .../magisk/redesign/log/LogFragment.kt | 5 + .../magisk/redesign/log/LogViewModel.kt | 30 ++++- .../res/drawable/bg_line_bottom_rounded.xml | 11 ++ .../main/res/drawable/bg_line_top_rounded.xml | 11 ++ app/src/main/res/drawable/ic_close_md2.xml | 10 ++ app/src/main/res/layout/fragment_log_md2.xml | 24 ++-- .../main/res/layout/item_log_access_md2.xml | 104 ++++++++++++++++++ .../main/res/layout/item_log_track_md2.xml | 72 ++++++++++++ app/src/main/res/values/styles_md2.xml | 2 +- 13 files changed, 306 insertions(+), 14 deletions(-) create mode 100644 app/src/main/res/drawable/bg_line_bottom_rounded.xml create mode 100644 app/src/main/res/drawable/bg_line_top_rounded.xml create mode 100644 app/src/main/res/drawable/ic_close_md2.xml create mode 100644 app/src/main/res/layout/item_log_access_md2.xml create mode 100644 app/src/main/res/layout/item_log_track_md2.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt b/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt index 733eb85b9..1ea6fedb9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt @@ -14,8 +14,10 @@ class LogRepository( private val logDao: LogDao ) { - fun fetchLogs() = logDao.fetchAll() - .map { it.sortByDescending { it.date.time }; it } + fun fetchLogsNowrap() = logDao.fetchAll() + .map { it.sortedByDescending { it.date.time } } + + fun fetchLogs() = fetchLogsNowrap() .map { it.wrap() } fun fetchMagiskLogs() = "tail -n 5000 ${Const.MAGISK_LOG}".suRaw() diff --git a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt index 89cd8efdf..f01dcb4e3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt @@ -19,7 +19,7 @@ val redesignModule = module { viewModel { FlashViewModel() } viewModel { HideViewModel(get()) } viewModel { HomeViewModel(get()) } - viewModel { LogViewModel() } + viewModel { LogViewModel(get()) } viewModel { ModuleViewModel(get(), get(), get()) } viewModel { RequestViewModel() } viewModel { SafetynetViewModel(get()) } diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/XTime.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/XTime.kt index c3fa76291..ce822d5f2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/XTime.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/XTime.kt @@ -18,3 +18,10 @@ val timeFormatFull by lazy { SimpleDateFormat("yyyy/MM/dd_HH:mm:ss", currentLoca val timeFormatStandard by lazy { SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", currentLocale) } val timeFormatMedium by lazy { DateFormat.getDateInstance(DateFormat.MEDIUM, currentLocale) } val timeFormatTime by lazy { SimpleDateFormat("h:mm a", currentLocale) } +val timeDateFormat by lazy { + DateFormat.getDateTimeInstance( + DateFormat.DEFAULT, + DateFormat.DEFAULT, + currentLocale + ) +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt index ad278ef80..d1de32e3d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt @@ -1,7 +1,10 @@ package com.topjohnwu.magisk.model.entity.recycler +import androidx.databinding.Bindable +import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem +import com.topjohnwu.magisk.extensions.timeDateFormat import com.topjohnwu.magisk.extensions.timeFormatMedium import com.topjohnwu.magisk.extensions.toTime import com.topjohnwu.magisk.extensions.toggle @@ -74,4 +77,37 @@ class MagiskLogRvItem : ComparableRvItem() { override fun contentSameAs(other: MagiskLogRvItem): Boolean = false override fun itemSameAs(other: MagiskLogRvItem): Boolean = false +} + +// --- + +class LogItem(val item: MagiskLog) : ObservableItem() { + + override val layoutRes = R.layout.item_log_access_md2 + + val date = item.date.time.toTime(timeDateFormat) + var isTop = false + @Bindable get + set(value) { + field = value + notifyChange(BR.top) + } + var isBottom = false + @Bindable get + set(value) { + field = value + notifyChange(BR.bottom) + } + + override fun itemSameAs(other: LogItem) = item.appName == other.item.appName + + override fun contentSameAs(other: LogItem) = item.fromUid == other.item.fromUid && + item.toUid == other.item.toUid && + item.fromPid == other.item.fromPid && + item.packageName == other.item.packageName && + item.command == other.item.command && + item.action == other.item.action && + item.date == other.item.date && + isTop == other.isTop && + isBottom == other.isBottom } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt index b5e670c24..2a4537fd3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt @@ -1,5 +1,6 @@ package com.topjohnwu.magisk.redesign.log +import android.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentLogMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment @@ -10,10 +11,14 @@ class LogFragment : CompatFragment() { override val layoutRes = R.layout.fragment_log_md2 override val viewModel by viewModel() + override fun consumeSystemWindowInsets(insets: Insets) = insets + override fun onStart() { super.onStart() activity.title = resources.getString(R.string.section_log) } + override fun onPreBind(binding: FragmentLogMd2Binding) = Unit + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt index 1b3ac4dbe..dadbd3684 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt @@ -1,5 +1,33 @@ package com.topjohnwu.magisk.redesign.log +import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.data.repository.LogRepository +import com.topjohnwu.magisk.extensions.subscribeK +import com.topjohnwu.magisk.model.entity.recycler.LogItem import com.topjohnwu.magisk.redesign.compat.CompatViewModel +import com.topjohnwu.magisk.redesign.home.itemBindingOf +import com.topjohnwu.magisk.redesign.superuser.diffListOf -class LogViewModel : CompatViewModel() \ No newline at end of file +class LogViewModel( + private val repo: LogRepository +) : CompatViewModel() { + + val items = diffListOf() + val itemBinding = itemBindingOf { + it.bindExtra(BR.viewModel, this) + } + + override fun refresh() = repo.fetchLogsNowrap() + .map { it.map { LogItem(it) } } + .map { it to items.calculateDiff(it) } + .subscribeK { + items.firstOrNull()?.isTop = false + items.lastOrNull()?.isBottom = false + + items.update(it.first, it.second) + + items.firstOrNull()?.isTop = true + items.lastOrNull()?.isBottom = true + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_line_bottom_rounded.xml b/app/src/main/res/drawable/bg_line_bottom_rounded.xml new file mode 100644 index 000000000..7ead075af --- /dev/null +++ b/app/src/main/res/drawable/bg_line_bottom_rounded.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_line_top_rounded.xml b/app/src/main/res/drawable/bg_line_top_rounded.xml new file mode 100644 index 000000000..589b19ca4 --- /dev/null +++ b/app/src/main/res/drawable/bg_line_top_rounded.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_close_md2.xml b/app/src/main/res/drawable/ic_close_md2.xml new file mode 100644 index 000000000..78e1de996 --- /dev/null +++ b/app/src/main/res/drawable/ic_close_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_log_md2.xml b/app/src/main/res/layout/fragment_log_md2.xml index 7c4a5980c..4fb807940 100644 --- a/app/src/main/res/layout/fragment_log_md2.xml +++ b/app/src/main/res/layout/fragment_log_md2.xml @@ -1,5 +1,7 @@ - + @@ -9,15 +11,19 @@ - - - - - + android:clipToPadding="false" + android:orientation="vertical" + android:paddingStart="@dimen/l1" + android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size}" + android:paddingEnd="@dimen/l1" + android:paddingBottom="@{viewModel.insets.bottom}" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + tools:listitem="@layout/item_log_access_md2" + tools:paddingTop="40dp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_log_access_md2.xml b/app/src/main/res/layout/item_log_access_md2.xml new file mode 100644 index 000000000..6fdcae553 --- /dev/null +++ b/app/src/main/res/layout/item_log_access_md2.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_log_track_md2.xml b/app/src/main/res/layout/item_log_track_md2.xml new file mode 100644 index 000000000..f245feda3 --- /dev/null +++ b/app/src/main/res/layout/item_log_track_md2.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index 356d2abaf..4d0ee6142 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -105,7 +105,7 @@ \ No newline at end of file From 8a86b30fd1d83b7570ce4773a070077aa380421c Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 21 Nov 2019 14:24:14 +0100 Subject: [PATCH 180/254] Fixed core UI elements not behaving properly after recreating --- .../topjohnwu/magisk/redesign/MainActivity.kt | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index 57fa4a609..c938aaeb5 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -85,6 +85,10 @@ open class MainActivity : CompatActivity( if (savedInstanceState != null) { onTabTransaction(null, -1) onFragmentTransaction(null, FragNavController.TransactionType.PUSH) + + if (!navigation.isRoot) { + requestNavigationHidden(animate = false) + } } } @@ -118,6 +122,11 @@ open class MainActivity : CompatActivity( fragment: Fragment?, transactionType: FragNavController.TransactionType ) { + binding.mainToolbarWrapper.animate() + .translationY(0f) + .setInterpolator(FastOutSlowInInterpolator()) + .start() + setDisplayHomeAsUpEnabled(!navigation.isRoot) requestNavigationHidden(!navigation.isRoot) } @@ -134,13 +143,19 @@ open class MainActivity : CompatActivity( } } - internal fun requestNavigationHidden(hide: Boolean = true) { + internal fun requestNavigationHidden(hide: Boolean = true, animate: Boolean = true) { val lapam = binding.mainBottomBar.layoutParams as ViewGroup.MarginLayoutParams val height = binding.mainBottomBar.measuredHeight val verticalMargin = lapam.let { it.topMargin + it.bottomMargin } val maxTranslation = height + verticalMargin val translation = if (!hide) 0 else maxTranslation + if (!animate) { + binding.mainBottomBar.translationY = translation.toFloat() + binding.mainBottomBar.isVisible = !hide + return + } + binding.mainBottomBar.animate() .translationY(translation.toFloat()) .setInterpolator(FastOutSlowInInterpolator()) From 94f0c61619994b3b988845bab0b6fcd7403b8087 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 21 Nov 2019 14:30:12 +0100 Subject: [PATCH 181/254] Added ignoring emulators for env_fix dialog --- .../com/topjohnwu/magisk/redesign/home/HomeViewModel.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 9a7a724b3..2068f8bf6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -1,6 +1,7 @@ package com.topjohnwu.magisk.redesign.home import android.Manifest +import android.os.Build import com.topjohnwu.magisk.BuildConfig import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.Info @@ -158,7 +159,13 @@ class HomeViewModel( ) // Don't bother checking env when magisk is not installed, loading or already has been shown - if (invalidStates.any { it == stateMagisk.value } || shownDialog) { + if ( + invalidStates.any { it == stateMagisk.value } || + shownDialog || + // don't care for emulators either + Build.DEVICE.orEmpty().contains("generic") || + Build.PRODUCT.orEmpty().contains("generic") + ) { return } From 67c50d75047bdd95881fa57d0b58082f53a34743 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 21 Nov 2019 17:31:37 +0100 Subject: [PATCH 182/254] Added magisk log screen --- .../topjohnwu/magisk/redesign/MainActivity.kt | 5 + .../magisk/redesign/log/LogFragment.kt | 54 ++++++++++- .../magisk/redesign/log/LogViewModel.kt | 92 +++++++++++++++++-- app/src/main/res/drawable/ic_folder_list.xml | 10 ++ app/src/main/res/drawable/ic_save_md2.xml | 10 ++ app/src/main/res/layout/fragment_log_md2.xml | 63 ++++++++++--- .../main/res/layout/include_log_magisk.xml | 34 +++++++ app/src/main/res/menu/menu_log_md2.xml | 17 ++++ 8 files changed, 262 insertions(+), 23 deletions(-) create mode 100644 app/src/main/res/drawable/ic_folder_list.xml create mode 100644 app/src/main/res/drawable/ic_save_md2.xml create mode 100644 app/src/main/res/layout/include_log_magisk.xml create mode 100644 app/src/main/res/menu/menu_log_md2.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index c938aaeb5..8d0e43c2e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -164,4 +164,9 @@ open class MainActivity : CompatActivity( .start() } + fun invalidateToolbar() { + //binding.mainToolbar.startAnimations() + binding.mainToolbar.invalidate() + } + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt index 2a4537fd3..9af2d842c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt @@ -1,9 +1,17 @@ package com.topjohnwu.magisk.redesign.log import android.graphics.Insets +import android.os.Bundle +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import android.view.View +import androidx.core.view.isVisible import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentLogMd2Binding +import com.topjohnwu.magisk.redesign.MainActivity import com.topjohnwu.magisk.redesign.compat.CompatFragment +import com.topjohnwu.magisk.redesign.hide.MotionRevealHelper import org.koin.androidx.viewmodel.ext.android.viewModel class LogFragment : CompatFragment() { @@ -11,14 +19,58 @@ class LogFragment : CompatFragment() { override val layoutRes = R.layout.fragment_log_md2 override val viewModel by viewModel() + private var actionSave: MenuItem? = null + private var isMagiskLogVisible + get() = binding.logFilter.isVisible + set(value) { + MotionRevealHelper.withViews(binding.logFilter, binding.logFilterToggle, value) + actionSave?.isVisible = value + (activity as MainActivity).invalidateToolbar() + } + override fun consumeSystemWindowInsets(insets: Insets) = insets override fun onStart() { super.onStart() - + setHasOptionsMenu(true) activity.title = resources.getString(R.string.section_log) } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.logFilterToggle.setOnClickListener { + isMagiskLogVisible = true + } + } + + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + super.onCreateOptionsMenu(menu, inflater) + inflater.inflate(R.menu.menu_log_md2, menu) + actionSave = menu.findItem(R.id.action_save)?.also { + it.isVisible = isMagiskLogVisible + } + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.action_save -> viewModel.saveMagiskLog() + R.id.action_clear -> + if (isMagiskLogVisible) viewModel.clearMagiskLog() + else viewModel.clearLog() + } + return super.onOptionsItemSelected(item) + } + + override fun onPreBind(binding: FragmentLogMd2Binding) = Unit + override fun onBackPressed(): Boolean { + if (binding.logFilter.isVisible) { + isMagiskLogVisible = false + return true + } + return super.onBackPressed() + } + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt index dadbd3684..b8e94c177 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt @@ -1,33 +1,107 @@ package com.topjohnwu.magisk.redesign.log import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.Config +import com.topjohnwu.magisk.Const +import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.repository.LogRepository +import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.subscribeK +import com.topjohnwu.magisk.model.binding.BindingAdapter +import com.topjohnwu.magisk.model.entity.recycler.ConsoleRvItem import com.topjohnwu.magisk.model.entity.recycler.LogItem +import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.redesign.home.itemBindingOf import com.topjohnwu.magisk.redesign.superuser.diffListOf +import com.topjohnwu.superuser.Shell +import io.reactivex.Completable +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers +import timber.log.Timber +import java.io.File +import java.util.* class LogViewModel( private val repo: LogRepository ) : CompatViewModel() { + // --- main view + val items = diffListOf() val itemBinding = itemBindingOf { it.bindExtra(BR.viewModel, this) } - override fun refresh() = repo.fetchLogsNowrap() - .map { it.map { LogItem(it) } } - .map { it to items.calculateDiff(it) } - .subscribeK { - items.firstOrNull()?.isTop = false - items.lastOrNull()?.isBottom = false + // --- console - items.update(it.first, it.second) + val consoleAdapter = BindingAdapter() + val itemsConsole = diffListOf>() + val itemConsoleBinding = itemBindingOf> {} - items.firstOrNull()?.isTop = true - items.lastOrNull()?.isBottom = true + override fun refresh(): Disposable { + val logs = repo.fetchLogsNowrap() + .map { it.map { LogItem(it) } } + .observeOn(Schedulers.computation()) + .map { it to items.calculateDiff(it) } + .observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess { + items.firstOrNull()?.isTop = false + items.lastOrNull()?.isBottom = false + + items.update(it.first, it.second) + + items.firstOrNull()?.isTop = true + items.lastOrNull()?.isBottom = true + } + .ignoreElement() + + val console = repo.fetchMagiskLogs() + .map { it.map { ConsoleRvItem(it) } } + .observeOn(Schedulers.computation()) + .map { it to itemsConsole.calculateDiff(it) } + .observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess { itemsConsole.update(it.first, it.second) } + .ignoreElement() + + return Completable.merge(listOf(logs, console)).subscribeK() + } + + fun saveMagiskLog() { + val now = Calendar.getInstance() + val filename = "magisk_log_%04d%02d%02d_%02d%02d%02d.log".format( + now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1, + now.get(Calendar.DAY_OF_MONTH), now.get(Calendar.HOUR_OF_DAY), + now.get(Calendar.MINUTE), now.get(Calendar.SECOND) + ) + + val logFile = File(Config.downloadDirectory, filename) + runCatching { + logFile.createNewFile() + }.onFailure { + Timber.e(it) + return } + Shell.su("cat ${Const.MAGISK_LOG} > $logFile").submit { + SnackbarEvent(logFile.path).publish() + } + } + + fun clearMagiskLog() = repo.clearMagiskLogs() + .ignoreElement() + .subscribeK { + SnackbarEvent(R.string.logs_cleared).publish() + requestRefresh() + } + .add() + + fun clearLog() = repo.clearLogs() + .subscribeK { + SnackbarEvent(R.string.logs_cleared).publish() + requestRefresh() + } + .add() + } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_folder_list.xml b/app/src/main/res/drawable/ic_folder_list.xml new file mode 100644 index 000000000..7c13a421c --- /dev/null +++ b/app/src/main/res/drawable/ic_folder_list.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_save_md2.xml b/app/src/main/res/drawable/ic_save_md2.xml new file mode 100644 index 000000000..81d0e3b04 --- /dev/null +++ b/app/src/main/res/drawable/ic_save_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_log_md2.xml b/app/src/main/res/layout/fragment_log_md2.xml index 4fb807940..13e333407 100644 --- a/app/src/main/res/layout/fragment_log_md2.xml +++ b/app/src/main/res/layout/fragment_log_md2.xml @@ -11,19 +11,56 @@ - + android:layout_height="match_parent"> + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/include_log_magisk.xml b/app/src/main/res/layout/include_log_magisk.xml new file mode 100644 index 000000000..5995f80bc --- /dev/null +++ b/app/src/main/res/layout/include_log_magisk.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_log_md2.xml b/app/src/main/res/menu/menu_log_md2.xml new file mode 100644 index 000000000..0356092b2 --- /dev/null +++ b/app/src/main/res/menu/menu_log_md2.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file From 550f6aff7ebc6364addc44446e8c0f3031cdf1de Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 21 Nov 2019 17:35:29 +0100 Subject: [PATCH 183/254] Updated showing / hiding filters --- .../magisk/redesign/hide/HideFragment.kt | 16 +++++++++++----- .../magisk/redesign/module/ModuleFragment.kt | 19 ++++++++++++------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt index 2202166ba..53a836e14 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt @@ -33,6 +33,13 @@ class HideFragment : CompatFragment() { override val layoutRes = R.layout.fragment_hide_md2 override val viewModel by viewModel() + private var isFilterVisible + get() = binding.hideFilter.isVisible + set(value) { + if (!value) hideKeyboard() + MotionRevealHelper.withViews(binding.hideFilter, binding.hideFilterToggle, value) + } + override fun consumeSystemWindowInsets(insets: Insets) = insets override fun onAttach(context: Context) { @@ -45,11 +52,10 @@ class HideFragment : CompatFragment() { super.onViewCreated(view, savedInstanceState) binding.hideFilterToggle.setOnClickListener { - MotionRevealHelper.withViews(binding.hideFilter, binding.hideFilterToggle, true) + isFilterVisible = true } binding.hideFilterInclude.hideFilterDone.setOnClickListener { - hideKeyboard() - MotionRevealHelper.withViews(binding.hideFilter, binding.hideFilterToggle, false) + isFilterVisible = false } binding.hideContent.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { @@ -64,8 +70,8 @@ class HideFragment : CompatFragment() { override fun onPreBind(binding: FragmentHideMd2Binding) = Unit override fun onBackPressed(): Boolean { - if (binding.hideFilter.isVisible) { - binding.hideFilterInclude.hideFilterDone.performClick() + if (isFilterVisible) { + isFilterVisible = false return true } return super.onBackPressed() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt index 3667cdc0a..43062c63e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt @@ -29,6 +29,14 @@ class ModuleFragment : CompatFragment private val listeners = hashSetOf() + private var isFilterVisible + get() = binding.moduleFilter.isVisible + set(value) { + if (!value) hideKeyboard() + (activity as? MainActivity)?.requestNavigationHidden(value) + MotionRevealHelper.withViews(binding.moduleFilter, binding.moduleFilterToggle, value) + } + override fun consumeSystemWindowInsets(insets: Insets) = insets override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -48,13 +56,10 @@ class ModuleFragment : CompatFragment setEndlessSearch() binding.moduleFilterToggle.setOnClickListener { - (activity as? MainActivity)?.requestNavigationHidden() - MotionRevealHelper.withViews(binding.moduleFilter, binding.moduleFilterToggle, true) + isFilterVisible = true } binding.moduleFilterInclude.moduleFilterDone.setOnClickListener { - (activity as? MainActivity)?.requestNavigationHidden(false) - hideKeyboard() - MotionRevealHelper.withViews(binding.moduleFilter, binding.moduleFilterToggle, false) + isFilterVisible = false } binding.moduleFilterInclude.moduleFilterList.addOnScrollListener(object : RecyclerView.OnScrollListener() { @@ -73,8 +78,8 @@ class ModuleFragment : CompatFragment } override fun onBackPressed(): Boolean { - if (binding.moduleFilter.isVisible) { - binding.moduleFilterInclude.moduleFilterDone.performClick() + if (isFilterVisible) { + isFilterVisible = false return true } return super.onBackPressed() From e82bc1b7bc3431e98d41eb0eb20559ffb96277bb Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 21 Nov 2019 18:07:13 +0100 Subject: [PATCH 184/254] Fixed issues after merge --- .../topjohnwu/magisk/data/database/RepoDao.kt | 2 + .../magisk/data/database/RepoDatabase.kt | 14 ---- .../com/topjohnwu/magisk/extensions/RxJava.kt | 2 +- .../magisk/model/entity/recycler/LogRvItem.kt | 4 +- .../events/InstallExternalModuleEvent.kt | 2 +- .../magisk/model/events/ViewEvents.kt | 5 +- .../model/events/dialog/BiometricDialog.kt | 28 ++----- .../model/events/dialog/FingerprintDialog.kt | 82 ------------------- .../magisk/model/navigation/Navigation.kt | 10 +-- .../magisk/redesign/hide/HideViewModel.kt | 3 - .../magisk/redesign/log/LogViewModel.kt | 2 +- .../redesign/superuser/SuperuserViewModel.kt | 6 +- 12 files changed, 23 insertions(+), 137 deletions(-) delete mode 100644 app/src/main/java/com/topjohnwu/magisk/data/database/RepoDatabase.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/model/events/dialog/FingerprintDialog.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/RepoDao.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/RepoDao.kt index 21a10f488..3ed769366 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/database/RepoDao.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/database/RepoDao.kt @@ -8,6 +8,8 @@ import com.topjohnwu.magisk.model.entity.module.Repo abstract class RepoDatabase : RoomDatabase() { abstract fun repoDao() : RepoDao + abstract fun repoByUpdatedDao(): RepoByUpdatedDao + abstract fun repoByNameDao(): RepoByNameDao } @Dao diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/RepoDatabase.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/RepoDatabase.kt deleted file mode 100644 index 5206172d5..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/data/database/RepoDatabase.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.topjohnwu.magisk.data.database - -import androidx.room.Database -import androidx.room.RoomDatabase -import com.topjohnwu.magisk.model.entity.module.Repo - -@Database(version = 6, entities = [Repo::class, RepoEtag::class]) -abstract class RepoDatabase : RoomDatabase() { - - abstract fun repoDao(): RepoDao - abstract fun repoByUpdatedDao(): RepoByUpdatedDao - abstract fun repoByNameDao(): RepoByNameDao - -} diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/RxJava.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/RxJava.kt index 0bfc01f67..0d0ef1839 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/RxJava.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/RxJava.kt @@ -54,7 +54,7 @@ fun Single.subscribeK( onError: OnErrorListener = { it.printStackTrace() }, onNext: OnSuccessListener = {} ) = applySchedulers() - .subscribe(onSuccess, onError) + .subscribe(onNext, onError) fun Maybe.subscribeK( onError: OnErrorListener = { it.printStackTrace() }, diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt index b1f8fd634..c4aef525a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt @@ -81,7 +81,7 @@ class LogItem(val item: MagiskLog) : ObservableItem() { override val layoutRes = R.layout.item_log_access_md2 - val date = item.date.time.toTime(timeDateFormat) + val date = item.time.toTime(timeDateFormat) var isTop = false @Bindable get set(value) { @@ -103,7 +103,7 @@ class LogItem(val item: MagiskLog) : ObservableItem() { item.packageName == other.item.packageName && item.command == other.item.command && item.action == other.item.action && - item.date == other.item.date && + item.time == other.item.time && isTop == other.isTop && isBottom == other.isBottom } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt index 02d2f3819..aed2ac426 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt @@ -27,7 +27,7 @@ class InstallExternalModuleEvent : ViewEvent(), ActivityExecutor { fun onActivityResult(context: Context, requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == Const.ID.FETCH_ZIP && resultCode == Activity.RESULT_OK && data != null) { // Get the URI of the selected file - val intent = context.intent(FlashActivity::class.java) + val intent = context.intent() intent.setData(data.data).putExtra(Const.Key.FLASH_ACTION, Const.Value.FLASH_ZIP) context.startActivity(intent) } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt index 7b1999d93..94305b615 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt @@ -1,5 +1,6 @@ package com.topjohnwu.magisk.model.events +import android.app.Activity import android.content.Context import android.content.Intent import androidx.appcompat.app.AppCompatActivity @@ -10,11 +11,11 @@ import com.karumi.dexter.listener.PermissionRequest import com.karumi.dexter.listener.multi.MultiplePermissionsListener import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.base.BaseActivity import com.topjohnwu.magisk.data.repository.MagiskRepository import com.topjohnwu.magisk.extensions.DynamicClassLoader import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.extensions.writeTo -import com.topjohnwu.magisk.base.BaseActivity import com.topjohnwu.magisk.model.entity.module.Repo import com.topjohnwu.magisk.model.permissions.PermissionRequestBuilder import com.topjohnwu.magisk.utils.RxBus @@ -136,7 +137,7 @@ class UpdateSafetyNetEvent : ViewEvent(), ContextExecutor, KoinComponent, Safety } class ViewActionEvent(val action: BaseActivity<*, *>.() -> Unit) : ViewEvent(), ActivityExecutor { - override fun invoke(activity: AppCompatActivity) = activity.run(action) + override fun invoke(activity: AppCompatActivity) = (activity as BaseActivity<*, *>).run(action) } class OpenFilePickerEvent : ViewEvent() diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt index b22b99562..a47a06309 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt @@ -1,10 +1,9 @@ package com.topjohnwu.magisk.model.events.dialog -import android.os.Handler import androidx.appcompat.app.AppCompatActivity -import androidx.biometric.BiometricPrompt import com.topjohnwu.magisk.model.events.ActivityExecutor import com.topjohnwu.magisk.model.events.ViewEvent +import com.topjohnwu.magisk.utils.BiometricHelper class BiometricDialog( builder: Builder.() -> Unit @@ -18,26 +17,11 @@ class BiometricDialog( } override fun invoke(activity: AppCompatActivity) { - val handler = Handler() - val prompt = BiometricPrompt.PromptInfo.Builder() - .setNegativeButtonText(activity.getString(android.R.string.cancel)) - .build() - - val callback = object : BiometricPrompt.AuthenticationCallback() { - override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { - listenerOnFailure() - } - - override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) { - listenerOnSuccess() - } - - override fun onAuthenticationFailed() { - listenerOnFailure() - } - } - BiometricPrompt(activity, { handler.post(it) }, callback) - .authenticate(prompt/*launch with no crypto for now*/) + BiometricHelper.authenticate( + activity, + onError = listenerOnFailure, + onSuccess = listenerOnSuccess + ) } inner class Builder internal constructor() { diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/FingerprintDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/FingerprintDialog.kt deleted file mode 100644 index cd7ff25aa..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/FingerprintDialog.kt +++ /dev/null @@ -1,82 +0,0 @@ -package com.topjohnwu.magisk.model.events.dialog - -import android.hardware.fingerprint.FingerprintManager -import android.widget.Toast -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.utils.FingerprintHelper -import com.topjohnwu.magisk.utils.Utils -import com.topjohnwu.magisk.view.MagiskDialog -import timber.log.Timber - -@Deprecated( - "Use Biometrics instead", - ReplaceWith( - "BiometricDialog", - imports = ["com.topjohnwu.magisk.model.events.dialog.BiometricDialog"] - ) -) -class FingerprintDialog( - builder: Builder.() -> Unit -) : DialogEvent() { - - private val callbacks = Builder().apply(builder) - private var helper: Helper? = null - get() { - if (field == null) { - runCatching { field = Helper() }.onFailure { Timber.e(it) } - } - return field - } - - override fun build(dialog: MagiskDialog) { - dialog.applyIcon(R.drawable.ic_fingerprint) - .applyTitle(R.string.auth_fingerprint) - .cancellable(false) //possible fix for devices that have flawed under-screen sensor implementation - .applyButton(MagiskDialog.ButtonType.POSITIVE) { - titleRes = android.R.string.cancel - onClick { - callbacks.listenerOnFailure() - helper?.cancel() - } - } - .onShow { - helper?.authenticate() ?: it.let { - callbacks.listenerOnFailure() - Utils.toast(R.string.auth_fail, Toast.LENGTH_SHORT) - it.dismiss() - } - } - } - - inner class Builder internal constructor() { - internal var listenerOnFailure: GenericDialogListener = {} - internal var listenerOnSuccess: GenericDialogListener = {} - - fun onFailure(listener: GenericDialogListener) { - listenerOnFailure = listener - } - - fun onSuccess(listener: GenericDialogListener) { - listenerOnSuccess = listener - } - } - - private inner class Helper @Throws(Exception::class) constructor() : FingerprintHelper() { - override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { - dialog.applyMessage(errString) - } - - override fun onAuthenticationHelp(helpCode: Int, helpString: CharSequence) { - dialog.applyMessage(helpString) - } - - override fun onAuthenticationFailed() { - dialog.applyMessage(R.string.auth_fail) - } - - override fun onAuthenticationSucceeded(result: FingerprintManager.AuthenticationResult) { - callbacks.listenerOnSuccess() - dialog.dismiss() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt index a41c58f79..18d6794af 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt @@ -111,12 +111,10 @@ object Navigation { // redesign starts here fun start(launchIntent: Intent, context: Context) { - val destination = when { - Config.redesign -> RedesignActivity::class.java - else -> MainActivity::class.java - } - context.intent(destination) - .putExtra(Const.Key.OPEN_SECTION, launchIntent.getStringExtra(Const.Key.OPEN_SECTION)) + when { + Config.redesign -> context.intent() + else -> context.intent() + }.putExtra(Const.Key.OPEN_SECTION, launchIntent.getStringExtra(Const.Key.OPEN_SECTION)) .putExtra( Const.Key.OPEN_SETTINGS, launchIntent.action == ACTION_APPLICATION_PREFERENCES diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt index 6cc893626..d48d43556 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt @@ -114,9 +114,6 @@ class HideViewModel( fun toggleItem(item: HideProcessItem) = magiskRepo .toggleHide(item.isHidden.value, item.item.packageName, item.item.name) - // might wanna reorder the list to display the item at the top - .subscribeK() - .add() fun toggle(item: KObservableField) = item.toggle() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt index b8e94c177..2865c62dd 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt @@ -58,6 +58,7 @@ class LogViewModel( .ignoreElement() val console = repo.fetchMagiskLogs() + .toList() .map { it.map { ConsoleRvItem(it) } } .observeOn(Schedulers.computation()) .map { it to itemsConsole.calculateDiff(it) } @@ -90,7 +91,6 @@ class LogViewModel( } fun clearMagiskLog() = repo.clearMagiskLogs() - .ignoreElement() .subscribeK { SnackbarEvent(R.string.logs_cleared).publish() requestRefresh() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt index ee20a1f37..184489b75 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt @@ -18,8 +18,8 @@ import com.topjohnwu.magisk.model.events.dialog.SuperuserRevokeDialog import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.redesign.home.itemBindingOf +import com.topjohnwu.magisk.utils.BiometricHelper import com.topjohnwu.magisk.utils.DiffObservableList -import com.topjohnwu.magisk.utils.FingerprintHelper import com.topjohnwu.magisk.utils.RxBus import com.topjohnwu.magisk.utils.currentLocale import io.reactivex.Single @@ -71,7 +71,7 @@ class SuperuserViewModel( .subscribeK { items.removeAll { it.itemSameAs(item) } } .add() - if (FingerprintHelper.useFingerprint()) { + if (BiometricHelper.isEnabled) { BiometricDialog { onSuccess { updateState() } }.publish() @@ -115,7 +115,7 @@ class SuperuserViewModel( .add() } - if (FingerprintHelper.useFingerprint()) { + if (BiometricHelper.isEnabled) { BiometricDialog { onSuccess { updateState() } onFailure { item.isEnabled.toggle() } From 42606162b26f72cfe59ce2ae486c627a454530bc Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 21 Nov 2019 18:21:08 +0100 Subject: [PATCH 185/254] Fixed text color in logs not changing with theme --- .../model/entity/recycler/ConsoleRvItem.kt | 6 ++++- .../magisk/redesign/log/LogViewModel.kt | 4 +-- app/src/main/res/layout/item_console_md2.xml | 27 +++++++++++++++++++ 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/layout/item_console_md2.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ConsoleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ConsoleRvItem.kt index e890f9f2d..d5d391945 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ConsoleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ConsoleRvItem.kt @@ -6,7 +6,7 @@ import androidx.databinding.ViewDataBinding import androidx.recyclerview.widget.RecyclerView import com.topjohnwu.magisk.R -class ConsoleRvItem(val item: String) : LenientRvItem() { +open class ConsoleRvItem(val item: String) : LenientRvItem() { override val layoutRes: Int = R.layout.item_console override fun onBindingBound(binding: ViewDataBinding, recyclerView: RecyclerView) { @@ -23,4 +23,8 @@ class ConsoleRvItem(val item: String) : LenientRvItem() { override fun contentSameAs(other: ConsoleRvItem) = itemSameAs(other) override fun itemSameAs(other: ConsoleRvItem) = item == other.item +} + +class ConsoleItem(item: String) : ConsoleRvItem(item) { + override val layoutRes = R.layout.item_console_md2 } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt index 2865c62dd..5c69c2239 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt @@ -8,7 +8,7 @@ import com.topjohnwu.magisk.data.repository.LogRepository import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.model.binding.BindingAdapter -import com.topjohnwu.magisk.model.entity.recycler.ConsoleRvItem +import com.topjohnwu.magisk.model.entity.recycler.ConsoleItem import com.topjohnwu.magisk.model.entity.recycler.LogItem import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.redesign.compat.CompatViewModel @@ -58,8 +58,8 @@ class LogViewModel( .ignoreElement() val console = repo.fetchMagiskLogs() + .map { ConsoleItem(it) } .toList() - .map { it.map { ConsoleRvItem(it) } } .observeOn(Schedulers.computation()) .map { it to itemsConsole.calculateDiff(it) } .observeOn(AndroidSchedulers.mainThread()) diff --git a/app/src/main/res/layout/item_console_md2.xml b/app/src/main/res/layout/item_console_md2.xml new file mode 100644 index 000000000..98e3663dc --- /dev/null +++ b/app/src/main/res/layout/item_console_md2.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + From cc7e47bbb6e02a004decb1c29476c503207094cb Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 22 Nov 2019 19:29:53 +0100 Subject: [PATCH 186/254] Added themes All files (that used styles) were refactored to use styles directly so themes can only actually adjust colors - Elaborate themes would be super hard to maintain and would certainly break over time --- app/src/main/AndroidManifest.xml | 1 - .../main/java/com/topjohnwu/magisk/Config.kt | 3 + .../magisk/model/entity/recycler/ThemeItem.kt | 14 ++ .../magisk/model/navigation/Navigation.kt | 5 + .../magisk/redesign/compat/CompatActivity.kt | 4 +- .../redesign/settings/SettingsViewModel.kt | 4 +- .../topjohnwu/magisk/redesign/theme/Theme.kt | 50 +++++ .../magisk/redesign/theme/ThemeFragment.kt | 9 + .../magisk/redesign/theme/ThemeViewModel.kt | 20 +- .../magisk/utils/DataBindingAdapters.kt | 5 + .../drawable/bg_selection_circle_green.xml | 8 + app/src/main/res/drawable/ic_paint.xml | 10 + app/src/main/res/layout/activity_main_md2.xml | 8 +- .../main/res/layout/dialog_magisk_base.xml | 18 +- app/src/main/res/layout/fragment_hide_md2.xml | 6 +- app/src/main/res/layout/fragment_home_md2.xml | 44 ++-- .../main/res/layout/fragment_install_md2.xml | 32 +-- app/src/main/res/layout/fragment_log_md2.xml | 2 +- .../main/res/layout/fragment_module_md2.xml | 6 +- .../res/layout/fragment_safetynet_md2.xml | 30 +-- .../main/res/layout/fragment_settings_md2.xml | 120 +++++------ .../res/layout/fragment_superuser_md2.xml | 20 +- .../main/res/layout/fragment_theme_md2.xml | 192 +++++++++++++++++- .../main/res/layout/include_hide_filter.xml | 15 +- .../res/layout/include_install_options.xml | 6 +- .../main/res/layout/include_module_filter.xml | 11 +- app/src/main/res/layout/item_console_md2.xml | 2 +- app/src/main/res/layout/item_developer.xml | 4 +- .../main/res/layout/item_developer_link.xml | 4 +- app/src/main/res/layout/item_hide_md2.xml | 14 +- .../main/res/layout/item_hide_process_md2.xml | 4 +- .../main/res/layout/item_log_access_md2.xml | 8 +- .../main/res/layout/item_log_track_md2.xml | 2 +- .../main/res/layout/item_module_download.xml | 2 +- app/src/main/res/layout/item_module_md2.xml | 12 +- app/src/main/res/layout/item_policy_md2.xml | 16 +- app/src/main/res/layout/item_repo_md2.xml | 18 +- .../main/res/layout/item_safe_mode_notice.xml | 4 +- app/src/main/res/layout/item_section_md2.xml | 4 +- app/src/main/res/layout/item_theme.xml | 182 +++++++++++++++++ .../main/res/layout/markdown_window_md2.xml | 2 +- .../res/layout/swicher_caption_variant.xml | 2 +- app/src/main/res/values-night/themes_md2.xml | 28 ++- app/src/main/res/values/attrs.xml | 78 ------- app/src/main/res/values/strings_md2.xml | 1 + app/src/main/res/values/styles_md2.xml | 79 +------ app/src/main/res/values/styles_md2_impl.xml | 16 +- app/src/main/res/values/styles_view_md2.xml | 4 +- app/src/main/res/values/themes_md2.xml | 79 +++++-- 49 files changed, 799 insertions(+), 409 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ThemeItem.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/theme/Theme.kt create mode 100644 app/src/main/res/drawable/bg_selection_circle_green.xml create mode 100644 app/src/main/res/drawable/ic_paint.xml create mode 100644 app/src/main/res/layout/item_theme.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dc1867923..3e73a2004 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,4 @@ - diff --git a/app/src/main/java/com/topjohnwu/magisk/Config.kt b/app/src/main/java/com/topjohnwu/magisk/Config.kt index cd5b229f7..2effcd5d7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Config.kt +++ b/app/src/main/java/com/topjohnwu/magisk/Config.kt @@ -13,6 +13,7 @@ import com.topjohnwu.magisk.di.Protected import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.extensions.inject import com.topjohnwu.magisk.model.preference.PreferenceModel +import com.topjohnwu.magisk.redesign.theme.Theme import com.topjohnwu.magisk.utils.BiometricHelper import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.superuser.Shell @@ -52,6 +53,7 @@ object Config : PreferenceModel, DBConfig { const val DOWNLOAD_PATH = "download_path" const val REDESIGN = "redesign" const val SAFETY = "safety_notice" + const val THEME_ORDINAL = "theme_ordinal" // system state const val MAGISKHIDE = "magiskhide" @@ -125,6 +127,7 @@ object Config : PreferenceModel, DBConfig { Key.DARK_THEME_EXTENDED, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM ) + var themeOrdinal by preference(Key.THEME_ORDINAL, Theme.Piplup.ordinal) var suReAuth by preference(Key.SU_REAUTH, false) var checkUpdate by preference(Key.CHECK_UPDATES, true) var magiskHide by preference(Key.MAGISKHIDE, true) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ThemeItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ThemeItem.kt new file mode 100644 index 000000000..c9e44f6fb --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ThemeItem.kt @@ -0,0 +1,14 @@ +package com.topjohnwu.magisk.model.entity.recycler + +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.databinding.ComparableRvItem +import com.topjohnwu.magisk.redesign.theme.Theme + +class ThemeItem(val theme: Theme) : ComparableRvItem() { + + override val layoutRes = R.layout.item_theme + + override fun contentSameAs(other: ThemeItem) = itemSameAs(other) + override fun itemSameAs(other: ThemeItem) = theme == other.theme + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt index 18d6794af..dfa2da71b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt @@ -8,6 +8,7 @@ import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.intent import com.topjohnwu.magisk.redesign.install.InstallFragment import com.topjohnwu.magisk.redesign.safetynet.SafetynetFragment +import com.topjohnwu.magisk.redesign.theme.ThemeFragment import com.topjohnwu.magisk.ui.MainActivity import com.topjohnwu.magisk.ui.hide.MagiskHideFragment import com.topjohnwu.magisk.ui.home.HomeFragment @@ -98,6 +99,10 @@ object Navigation { navDirections { destination = InstallFragment::class } } + fun theme() = MagiskNavigationEvent { + navDirections { destination = ThemeFragment::class } + } + fun fromSection(section: String) = when (section) { "superuser" -> superuser() "modules" -> modules() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt index 42a9e6f59..647c4ba07 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt @@ -10,7 +10,6 @@ import androidx.core.content.getSystemService import androidx.databinding.OnRebindCallback import androidx.databinding.ViewDataBinding import androidx.fragment.app.Fragment -import com.topjohnwu.magisk.R import com.topjohnwu.magisk.base.BaseActivity import com.topjohnwu.magisk.extensions.snackbar import com.topjohnwu.magisk.extensions.startAnimations @@ -18,13 +17,14 @@ import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.model.events.ViewEvent import com.topjohnwu.magisk.model.navigation.MagiskNavigationEvent import com.topjohnwu.magisk.model.navigation.Navigator +import com.topjohnwu.magisk.redesign.theme.Theme import kotlin.reflect.KClass abstract class CompatActivity : BaseActivity(), CompatView, Navigator { - override val themeRes = R.style.Foundation_Default + override val themeRes = Theme.selected.themeRes override val viewRoot: View get() = binding.root override val navigation: CompatNavigationDelegate>? by lazy { CompatNavigationDelegate(this) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt index dca920e12..2dbcce10a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt @@ -4,7 +4,7 @@ import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.extensions.addOnPropertyChangedCallback import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.model.events.DieEvent -import com.topjohnwu.magisk.model.events.dialog.DarkThemeDialog +import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.utils.KObservableField @@ -21,6 +21,6 @@ class SettingsViewModel : CompatViewModel() { } fun toggle(item: KObservableField) = item.toggle() - fun darkModePressed() = DarkThemeDialog().publish() + fun themePressed() = Navigation.theme().publish() } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/theme/Theme.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/Theme.kt new file mode 100644 index 000000000..048ebf1da --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/Theme.kt @@ -0,0 +1,50 @@ +package com.topjohnwu.magisk.redesign.theme + +import com.topjohnwu.magisk.Config +import com.topjohnwu.magisk.R + +enum class Theme( + val themeName: String, + val themeRes: Int +) { + + Piplup( + themeName = "Piplup", + themeRes = R.style.ThemeFoundationMD2_Piplup + ), + PiplupAmoled( + themeName = "AMOLED", + themeRes = R.style.ThemeFoundationMD2_Amoled + ), + Rayquaza( + themeName = "Rayquaza", + themeRes = R.style.ThemeFoundationMD2_Rayquaza + ), + Zapdos( + themeName = "Zapdos", + themeRes = R.style.ThemeFoundationMD2_Zapdos + ), + Charmeleon( + themeName = "Charmeleon", + themeRes = R.style.ThemeFoundationMD2_Charmeleon + ), + Mew( + themeName = "Mew", + themeRes = R.style.ThemeFoundationMD2_Mew + ), + Salamence( + themeName = "Salamence", + themeRes = R.style.ThemeFoundationMD2_Salamence + ); + + val isSelected get() = Config.themeOrdinal == ordinal + + fun select() { + Config.themeOrdinal = ordinal + } + + companion object { + val selected get() = values().getOrNull(Config.themeOrdinal) ?: Piplup + } + +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeFragment.kt index 830846b49..26cb5e4e2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeFragment.kt @@ -1,5 +1,6 @@ package com.topjohnwu.magisk.redesign.theme +import android.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentThemeMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment @@ -10,4 +11,12 @@ class ThemeFragment : CompatFragment() override val layoutRes = R.layout.fragment_theme_md2 override val viewModel by viewModel() + override fun consumeSystemWindowInsets(insets: Insets) = insets + + override fun onStart() { + super.onStart() + + activity.title = getString(R.string.section_theme) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt index 171418aeb..9bbacac6a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt @@ -1,5 +1,23 @@ package com.topjohnwu.magisk.redesign.theme +import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.model.entity.recycler.ThemeItem +import com.topjohnwu.magisk.model.events.RecreateEvent +import com.topjohnwu.magisk.model.events.dialog.DarkThemeDialog import com.topjohnwu.magisk.redesign.compat.CompatViewModel +import com.topjohnwu.magisk.redesign.home.itemBindingOf +import com.topjohnwu.magisk.redesign.superuser.diffListOf -class ThemeViewModel : CompatViewModel() \ No newline at end of file +class ThemeViewModel : CompatViewModel() { + + val items = diffListOf(*Theme.values().map { ThemeItem(it) }.toTypedArray()) + val itemBinding = itemBindingOf { it.bindExtra(BR.viewModel, this) } + + fun saveTheme(theme: Theme) { + theme.select() + RecreateEvent().publish() + } + + fun darkModePressed() = DarkThemeDialog().publish() + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index eebc0ed0e..3d76715e9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -455,4 +455,9 @@ fun View.setRotationNotAnimated(rotation: Int) { @BindingAdapter("android:text") fun TextView.setTextSafe(text: Int) { if (text == 0) this.text = null else setText(text) +} + +@BindingAdapter("android:theme") +fun View.setThemeCompat(theme: Int) { + } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_selection_circle_green.xml b/app/src/main/res/drawable/bg_selection_circle_green.xml new file mode 100644 index 000000000..38788d14a --- /dev/null +++ b/app/src/main/res/drawable/bg_selection_circle_green.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_paint.xml b/app/src/main/res/drawable/ic_paint.xml new file mode 100644 index 000000000..9917845ce --- /dev/null +++ b/app/src/main/res/drawable/ic_paint.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_md2.xml b/app/src/main/res/layout/activity_main_md2.xml index f51d38a17..6f55fa2dc 100644 --- a/app/src/main/res/layout/activity_main_md2.xml +++ b/app/src/main/res/layout/activity_main_md2.xml @@ -27,14 +27,14 @@ diff --git a/app/src/main/res/layout/dialog_magisk_base.xml b/app/src/main/res/layout/dialog_magisk_base.xml index d5bed6b79..a665c867f 100644 --- a/app/src/main/res/layout/dialog_magisk_base.xml +++ b/app/src/main/res/layout/dialog_magisk_base.xml @@ -16,7 +16,7 @@ android:layout_height="match_parent"> @@ -154,7 +154,7 @@ diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 0606134f6..ebc6b5a56 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -45,7 +45,7 @@ android:paddingTop="@dimen/l1"> + android:textAppearance="@style/AppearanceFoundation.Title" /> + android:textAppearance="@style/AppearanceFoundation.Caption.Variant" /> + android:textAppearance="@style/AppearanceFoundation.Title" /> diff --git a/app/src/main/res/layout/fragment_log_md2.xml b/app/src/main/res/layout/fragment_log_md2.xml index 13e333407..acfe2264c 100644 --- a/app/src/main/res/layout/fragment_log_md2.xml +++ b/app/src/main/res/layout/fragment_log_md2.xml @@ -45,7 +45,7 @@ diff --git a/app/src/main/res/layout/fragment_safetynet_md2.xml b/app/src/main/res/layout/fragment_safetynet_md2.xml index f2b02907c..ba39e10cd 100644 --- a/app/src/main/res/layout/fragment_safetynet_md2.xml +++ b/app/src/main/res/layout/fragment_safetynet_md2.xml @@ -37,7 +37,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:text="@string/safetynet_attest_loading" - android:textAppearance="?appearanceTextTitleNormal" /> + android:textAppearance="@style/AppearanceFoundation.Title" /> @@ -251,12 +251,12 @@ android:layout_gravity="center_vertical" android:gravity="start" android:text="basicIntegrity" - android:textAppearance="?appearanceTextBodyOnPrimary" + android:textAppearance="@style/AppearanceFoundation.Body.OnPrimary" android:textStyle="bold" tools:ignore="HardcodedText" /> @@ -268,7 +268,7 @@ - - - - - - - - - - - - - - + android:layout_height="wrap_content" + android:paddingTop="@dimen/l1"> + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_superuser_md2.xml b/app/src/main/res/layout/fragment_superuser_md2.xml index 89f00bcd8..140c8675a 100644 --- a/app/src/main/res/layout/fragment_superuser_md2.xml +++ b/app/src/main/res/layout/fragment_superuser_md2.xml @@ -31,7 +31,7 @@ diff --git a/app/src/main/res/layout/fragment_theme_md2.xml b/app/src/main/res/layout/fragment_theme_md2.xml index 5d47e2e50..ace460cd3 100644 --- a/app/src/main/res/layout/fragment_theme_md2.xml +++ b/app/src/main/res/layout/fragment_theme_md2.xml @@ -1,8 +1,11 @@ - + + + @@ -12,11 +15,194 @@ + android:clipToPadding="false" + android:fillViewport="true" + android:paddingStart="@dimen/l1" + android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l1}" + android:paddingEnd="@dimen/l1" + android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/l1}"> + android:layout_height="wrap_content" + android:columnCount="2" + android:orientation="vertical" + android:useDefaultMargins="true"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/include_hide_filter.xml b/app/src/main/res/layout/include_hide_filter.xml index 6f225c122..a1c18a36a 100644 --- a/app/src/main/res/layout/include_hide_filter.xml +++ b/app/src/main/res/layout/include_hide_filter.xml @@ -31,7 +31,7 @@ android:layout_height="wrap_content" android:text="@string/hide_filters" android:textAllCaps="true" - android:textAppearance="?appearanceTextCaptionNormal" + android:textAppearance="@style/AppearanceFoundation.Caption" android:textColor="?colorPrimary" android:textStyle="bold" app:layout_constraintTop_toTopOf="parent" /> @@ -52,7 +52,7 @@ android:layout_height="wrap_content" android:checked="@={viewModel.showSystem}" android:text="@string/show_system_app" - android:textAppearance="?appearanceTextCaptionNormal" + android:textAppearance="@style/AppearanceFoundation.Caption" app:checkedIcon="@drawable/ic_check_md2" app:chipBackgroundColor="?colorSurfaceVariant" tools:checked="true" /> @@ -65,7 +65,7 @@ android:layout_height="wrap_content" android:checkable="false" android:text="@{viewModel.query}" - android:textAppearance="?appearanceTextCaptionNormal" + android:textAppearance="@style/AppearanceFoundation.Caption" app:chipBackgroundColor="?colorSurfaceVariant" /> @@ -77,14 +77,14 @@ android:layout_marginTop="@dimen/l1" android:text="@string/hide_search" android:textAllCaps="true" - android:textAppearance="?appearanceTextCaptionNormal" + android:textAppearance="@style/AppearanceFoundation.Caption" android:textColor="?colorPrimary" android:textStyle="bold" app:layout_constraintTop_toBottomOf="@+id/hide_filter_chip_group" /> @@ -128,6 +128,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:backgroundTint="?colorPrimary" + app:tint="?colorOnPrimary" app:elevation="0dp" app:fabSize="mini" app:layout_constraintBottom_toBottomOf="@+id/hide_filter_search" diff --git a/app/src/main/res/layout/include_install_options.xml b/app/src/main/res/layout/include_install_options.xml index 196a798c1..7874da119 100644 --- a/app/src/main/res/layout/include_install_options.xml +++ b/app/src/main/res/layout/include_install_options.xml @@ -21,7 +21,7 @@ tools:layout_gravity="center"> @@ -115,6 +115,7 @@ android:layout_marginEnd="@dimen/l1" app:backgroundTint="?colorPrimary" app:elevation="0dp" + app:tint="?colorOnPrimary" app:fabSize="mini" app:layout_constraintBottom_toBottomOf="@+id/module_filter_search" app:layout_constraintEnd_toEndOf="parent" @@ -122,7 +123,7 @@ app:srcCompat="@drawable/ic_check_md2" /> diff --git a/app/src/main/res/layout/item_developer.xml b/app/src/main/res/layout/item_developer.xml index 3af38b3f4..063d8ea67 100644 --- a/app/src/main/res/layout/item_developer.xml +++ b/app/src/main/res/layout/item_developer.xml @@ -21,7 +21,7 @@ tools:layout_gravity="center|start"> diff --git a/app/src/main/res/layout/item_developer_link.xml b/app/src/main/res/layout/item_developer_link.xml index bcdf8181b..491288330 100644 --- a/app/src/main/res/layout/item_developer_link.xml +++ b/app/src/main/res/layout/item_developer_link.xml @@ -25,7 +25,7 @@ diff --git a/app/src/main/res/layout/item_hide_process_md2.xml b/app/src/main/res/layout/item_hide_process_md2.xml index c61aa76fd..f6bf8c7f8 100644 --- a/app/src/main/res/layout/item_hide_process_md2.xml +++ b/app/src/main/res/layout/item_hide_process_md2.xml @@ -31,7 +31,7 @@ android:layout_marginBottom="@dimen/l_50" android:singleLine="true" android:text="@{item.item.name}" - android:textAppearance="?appearanceTextCaptionVariant" + android:textAppearance="@style/AppearanceFoundation.Caption.Variant" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/hide_process_checkbox" app:layout_constraintStart_toStartOf="parent" @@ -40,7 +40,7 @@ @@ -98,7 +98,7 @@ app:layout_constraintTop_toBottomOf="@+id/module_description" /> @@ -82,7 +82,7 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/l1" android:text="@{item.item.lastUpdateString}" - android:textAppearance="?appearanceTextCaptionVariant" + android:textAppearance="@style/AppearanceFoundation.Caption.Variant" android:textSize="11sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/module_info" @@ -93,7 +93,7 @@ @@ -22,7 +22,7 @@ android:gravity="center" android:padding="@dimen/l1" android:text="@string/module_safe_mode_message" - android:textAppearance="?appearanceTextCaptionOnPrimary" + android:textAppearance="@style/AppearanceFoundation.Caption.OnPrimary" android:textStyle="bold" /> diff --git a/app/src/main/res/layout/item_section_md2.xml b/app/src/main/res/layout/item_section_md2.xml index 66bf2b8be..be9e8abd2 100644 --- a/app/src/main/res/layout/item_section_md2.xml +++ b/app/src/main/res/layout/item_section_md2.xml @@ -25,7 +25,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:text="@{item.title}" - android:textAppearance="?appearanceTextBodyNormal" + android:textAppearance="@style/AppearanceFoundation.Body" android:textColor="@color/color_primary_transient" android:textStyle="bold" tools:text="@tools:sample/lorem/random" @@ -36,7 +36,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/markdown_window_md2.xml b/app/src/main/res/layout/markdown_window_md2.xml index 4d9941eac..f0fd7ac4f 100644 --- a/app/src/main/res/layout/markdown_window_md2.xml +++ b/app/src/main/res/layout/markdown_window_md2.xml @@ -10,6 +10,6 @@ android:layout_marginStart="15dp" android:layout_marginEnd="15dp" android:paddingTop="10dp" - android:textAppearance="?appearanceTextCaptionNormal" /> + android:textAppearance="@style/AppearanceFoundation.Caption" /> \ No newline at end of file diff --git a/app/src/main/res/layout/swicher_caption_variant.xml b/app/src/main/res/layout/swicher_caption_variant.xml index 5737e4880..02c1d64a7 100644 --- a/app/src/main/res/layout/swicher_caption_variant.xml +++ b/app/src/main/res/layout/swicher_caption_variant.xml @@ -7,4 +7,4 @@ android:gravity="start|center_vertical" android:singleLine="true" tools:text="@string/magisk" - android:textAppearance="?appearanceTextCaptionVariant" /> \ No newline at end of file + android:textAppearance="@style/AppearanceFoundation.Caption.Variant" /> \ No newline at end of file diff --git a/app/src/main/res/values-night/themes_md2.xml b/app/src/main/res/values-night/themes_md2.xml index eb432d541..d72ce1b6a 100644 --- a/app/src/main/res/values-night/themes_md2.xml +++ b/app/src/main/res/values-night/themes_md2.xml @@ -1,24 +1,36 @@ - + + + + \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index a8dd8f25f..6c064a318 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -7,84 +7,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index 11bca52c2..3cdbf7a45 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -14,6 +14,7 @@ @string/superuser @string/log @string/settings + Themes is not installed has invalid update channel! diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index 4d0ee6142..a4b6094dd 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -25,87 +25,10 @@ @drawable/bg_selectable @drawable/bg_selectable_borderless @dimen/internal_action_bar_size - - @style/WidgetFoundation.Appbar - - @style/WidgetFoundation.Toolbar - - @style/WidgetFoundation.Card - @style/WidgetFoundation.Card.Variant - @style/WidgetFoundation.Card.Elevated - @style/WidgetFoundation.Card.OnPrimary - - @style/WidgetFoundation.Button - @style/WidgetFoundation.Button.OnPrimary - @style/WidgetFoundation.Button.Outlined - - @style/WidgetFoundation.Button.Outlined.OnPrimary - - @style/WidgetFoundation.Button.Flat - @style/WidgetFoundation.Button.Flat.OnPrimary - @style/WidgetFoundation.Button.Text - @style/WidgetFoundation.Button.Text.Secondary - @style/WidgetFoundation.Button.Text.OnPrimary - @style/WidgetFoundation.Button.Error - - @style/WidgetFoundation.Icon - @style/WidgetFoundation.Icon.Primary - @style/WidgetFoundation.Icon.OnPrimary - @style/WidgetFoundation.Icon.Error - - @style/WidgetFoundation.Image.Big - @style/WidgetFoundation.Image - @style/WidgetFoundation.Image.Small - - @style/WidgetFoundation.Checkbox - - @style/WidgetFoundation.RadioButton - - @style/WidgetFoundation.ProgressBar - - @style/WidgetFoundation.ProgressBar.Indeterminate - - - @style/WidgetFoundation.ProgressBar.Indeterminate.Circular - - - - - @style/AppearanceFoundation.Display - @style/AppearanceFoundation.Display.Variant - @style/AppearanceFoundation.Display.OnPrimary - - - @style/AppearanceFoundation.Display.OnPrimary.Variant - - - @style/AppearanceFoundation.Title - @style/AppearanceFoundation.Title.Variant - @style/AppearanceFoundation.Title.OnPrimary - - @style/AppearanceFoundation.Title.OnPrimary.Variant - - - @style/AppearanceFoundation.Body - @style/AppearanceFoundation.Body.Variant - @style/AppearanceFoundation.Body.OnPrimary - - @style/AppearanceFoundation.Body.OnPrimary.Variant - - - @style/AppearanceFoundation.Caption - @style/AppearanceFoundation.Caption.Variant - @style/AppearanceFoundation.Caption.OnPrimary - - - @style/AppearanceFoundation.Caption.OnPrimary.Variant - \ No newline at end of file diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index 3c3cd8756..ab3780e96 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -1,10 +1,4 @@ - + + + + + + + + + + + + From cb59cc92a3ad9871eaa799656d92b69db575cd73 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 25 Nov 2019 16:58:57 +0100 Subject: [PATCH 187/254] Updated action cards to be more colorful --- .../com/topjohnwu/magisk/di/RedesignModule.kt | 2 +- .../entity/recycler/TappableHeadlineItem.kt | 39 ++++ .../redesign/superuser/SuperuserViewModel.kt | 33 +-- .../res/color/color_secondary_transient.xml | 5 + .../main/res/layout/fragment_settings_md2.xml | 12 +- .../res/layout/fragment_superuser_md2.xml | 197 ++++-------------- .../main/res/layout/fragment_theme_md2.xml | 8 +- .../res/layout/item_tappable_headline.xml | 67 ++++++ .../main/res/values/styles_md2_appearance.xml | 8 + app/src/main/res/values/styles_md2_impl.xml | 12 ++ 10 files changed, 199 insertions(+), 184 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TappableHeadlineItem.kt create mode 100644 app/src/main/res/color/color_secondary_transient.xml create mode 100644 app/src/main/res/layout/item_tappable_headline.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt index f01dcb4e3..ff274352d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt @@ -24,7 +24,7 @@ val redesignModule = module { viewModel { RequestViewModel() } viewModel { SafetynetViewModel(get()) } viewModel { SettingsViewModel() } - viewModel { SuperuserViewModel(get(), get(), get(), get()) } + viewModel { SuperuserViewModel(get(), get(), get()) } viewModel { ThemeViewModel() } viewModel { InstallViewModel() } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TappableHeadlineItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TappableHeadlineItem.kt new file mode 100644 index 000000000..c24bec54a --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TappableHeadlineItem.kt @@ -0,0 +1,39 @@ +package com.topjohnwu.magisk.model.entity.recycler + +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.databinding.ComparableRvItem + +sealed class TappableHeadlineItem : ComparableRvItem() { + + abstract val title: Int + abstract val icon: Int + + override val layoutRes = R.layout.item_tappable_headline + + override fun itemSameAs(other: TappableHeadlineItem) = + this === other + + override fun contentSameAs(other: TappableHeadlineItem) = + title == other.title && icon == other.icon + + // --- listener + + interface Listener { + + fun onItemPressed(item: TappableHeadlineItem) + + } + + // --- objects + + object Hide : TappableHeadlineItem() { + override val title = R.string.magisk_hide_md2 + override val icon = R.drawable.ic_hide_md2 + } + + object Safetynet : TappableHeadlineItem() { + override val title = R.string.safetyNet + override val icon = R.drawable.ic_safetynet_md2 + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt index 184489b75..2ad85f284 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt @@ -11,6 +11,7 @@ import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.model.entity.MagiskPolicy import com.topjohnwu.magisk.model.entity.recycler.PolicyItem +import com.topjohnwu.magisk.model.entity.recycler.TappableHeadlineItem import com.topjohnwu.magisk.model.events.PolicyUpdateEvent import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.model.events.dialog.BiometricDialog @@ -20,26 +21,26 @@ import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.redesign.home.itemBindingOf import com.topjohnwu.magisk.utils.BiometricHelper import com.topjohnwu.magisk.utils.DiffObservableList -import com.topjohnwu.magisk.utils.RxBus import com.topjohnwu.magisk.utils.currentLocale import io.reactivex.Single class SuperuserViewModel( - private val rxBus: RxBus, private val db: PolicyDao, private val packageManager: PackageManager, private val resources: Resources -) : CompatViewModel() { +) : CompatViewModel(), TappableHeadlineItem.Listener { - val items = diffListOf() - val itemBinding = itemBindingOf { + val items = diffListOf>() + val itemBinding = itemBindingOf> { it.bindExtra(BR.viewModel, this) + it.bindExtra(BR.listener, this) } - init { - rxBus.register() - .subscribeK { updatePolicy(it) } - .add() + companion object { + private val menuOptions = listOf( + TappableHeadlineItem.Hide, + TappableHeadlineItem.Safetynet + ) } // --- @@ -56,6 +57,7 @@ class SuperuserViewModel( ).compare(o1, o2) } .toList() + .map { menuOptions + it } .map { it to items.calculateDiff(it) } .applySchedulers() .applyViewModel(this) @@ -63,12 +65,19 @@ class SuperuserViewModel( // --- - fun safetynetPressed() = Navigation.safetynet().publish() - fun hidePressed() = Navigation.hide().publish() + @Suppress("REDUNDANT_ELSE_IN_WHEN") + override fun onItemPressed(item: TappableHeadlineItem) = when (item) { + TappableHeadlineItem.Hide -> hidePressed() + TappableHeadlineItem.Safetynet -> safetynetPressed() + else -> Unit + } + + private fun safetynetPressed() = Navigation.safetynet().publish() + private fun hidePressed() = Navigation.hide().publish() fun deletePressed(item: PolicyItem) { fun updateState() = deletePolicy(item.item) - .subscribeK { items.removeAll { it.itemSameAs(item) } } + .subscribeK { items.removeAll { it.genericItemSameAs(item) } } .add() if (BiometricHelper.isEnabled) { diff --git a/app/src/main/res/color/color_secondary_transient.xml b/app/src/main/res/color/color_secondary_transient.xml new file mode 100644 index 000000000..e6ed58c86 --- /dev/null +++ b/app/src/main/res/color/color_secondary_transient.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings_md2.xml b/app/src/main/res/layout/fragment_settings_md2.xml index 896106d30..4eb129974 100644 --- a/app/src/main/res/layout/fragment_settings_md2.xml +++ b/app/src/main/res/layout/fragment_settings_md2.xml @@ -28,7 +28,7 @@ - + android:layout_height="match_parent"> - + + + android:layout_gravity="center" + android:gravity="center" + android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:text="@string/safetynet_attest_loading" + android:textAppearance="@style/AppearanceFoundation.Title" + android:textStyle="bold" /> - + - + - - - - - - - - - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_theme_md2.xml b/app/src/main/res/layout/fragment_theme_md2.xml index ace460cd3..23d0f3ef5 100644 --- a/app/src/main/res/layout/fragment_theme_md2.xml +++ b/app/src/main/res/layout/fragment_theme_md2.xml @@ -31,7 +31,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles_md2_appearance.xml b/app/src/main/res/values/styles_md2_appearance.xml index dff90120a..416e2711e 100644 --- a/app/src/main/res/values/styles_md2_appearance.xml +++ b/app/src/main/res/values/styles_md2_appearance.xml @@ -48,6 +48,14 @@ ?attr/colorOnSurfaceVariant + + + + diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index ab3780e96..12930369f 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -30,6 +30,14 @@ 1.5dp + + + + + + From a20594ed4806226faae28b39086475f83154732b Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 25 Nov 2019 17:25:49 +0100 Subject: [PATCH 188/254] Added emphasis on support section --- app/src/main/res/layout/fragment_home_md2.xml | 80 ++++++++++++------- app/src/main/res/layout/item_developer.xml | 4 +- .../main/res/layout/item_developer_link.xml | 4 +- app/src/main/res/values/styles_md2_impl.xml | 8 ++ 4 files changed, 61 insertions(+), 35 deletions(-) diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index ebc6b5a56..6bfd8c535 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -33,13 +33,14 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" + android:fillViewport="true" android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size}" android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/l2}" tools:layout_marginTop="24dp"> @@ -739,40 +740,57 @@ - + android:layout_gravity="bottom" + android:layout_margin="@dimen/l1"> - + - + + + + + + + + + diff --git a/app/src/main/res/layout/item_developer.xml b/app/src/main/res/layout/item_developer.xml index 063d8ea67..040289292 100644 --- a/app/src/main/res/layout/item_developer.xml +++ b/app/src/main/res/layout/item_developer.xml @@ -21,7 +21,7 @@ tools:layout_gravity="center|start"> diff --git a/app/src/main/res/layout/item_developer_link.xml b/app/src/main/res/layout/item_developer_link.xml index 491288330..c03281833 100644 --- a/app/src/main/res/layout/item_developer_link.xml +++ b/app/src/main/res/layout/item_developer_link.xml @@ -30,7 +30,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@{item.icon}" - app:tint="?colorOnSurface" + app:tint="?colorOnPrimary" tools:srcCompat="@drawable/ic_paypal" /> + app:tint="?colorOnPrimary" /> diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index 12930369f..86f10ac27 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -24,6 +24,14 @@ true + + + + + + @@ -74,6 +78,14 @@ ?attr/colorOnSurfaceVariant + + + + diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index 86f10ac27..841cb6325 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -42,10 +42,6 @@ ?colorPrimary - - + + + \ No newline at end of file From 627b40799c1a74c8b2a18be5b49de56b5e34cb5f Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 28 Nov 2019 18:58:04 +0100 Subject: [PATCH 191/254] Fixed checkbox (switch) colors --- app/src/main/res/color/color_checkbox_primary.xml | 5 +++++ app/src/main/res/color/color_primary_transient.xml | 1 - app/src/main/res/values/styles_md2_impl.xml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/color/color_checkbox_primary.xml diff --git a/app/src/main/res/color/color_checkbox_primary.xml b/app/src/main/res/color/color_checkbox_primary.xml new file mode 100644 index 000000000..953b0d3f4 --- /dev/null +++ b/app/src/main/res/color/color_checkbox_primary.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/color_primary_transient.xml b/app/src/main/res/color/color_primary_transient.xml index 52adbdb4e..b792af898 100644 --- a/app/src/main/res/color/color_primary_transient.xml +++ b/app/src/main/res/color/color_primary_transient.xml @@ -1,6 +1,5 @@ - \ No newline at end of file diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index 841cb6325..627f21382 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -200,7 +200,7 @@ \ No newline at end of file From cb96b536a2e984859eca111a1f3c4c361ba8ebea Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Thu, 28 Nov 2019 21:53:31 +0100 Subject: [PATCH 192/254] Added fair amount of settings implemented from the UI side Updated dialog to create recycler as it behaves better than regular listview --- .../magisk/redesign/settings/SettingsItems.kt | 134 ++++++++++++++++-- .../redesign/settings/SettingsViewModel.kt | 65 +++++++-- .../com/topjohnwu/magisk/view/MagiskDialog.kt | 63 ++++++-- .../main/res/layout/dialog_magisk_base.xml | 2 +- .../main/res/layout/item_list_single_line.xml | 31 ++++ .../res/layout/item_settings_selector.xml | 19 ++- 6 files changed, 278 insertions(+), 36 deletions(-) create mode 100644 app/src/main/res/layout/item_list_single_line.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt index 4ebb43f6a..2fceed1d1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt @@ -5,7 +5,10 @@ import com.topjohnwu.magisk.BuildConfig import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R import com.topjohnwu.magisk.extensions.get +import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.utils.asTransitive +import com.topjohnwu.magisk.utils.availableLocales +import com.topjohnwu.magisk.utils.currentLocale // --- Customization @@ -13,6 +16,22 @@ object Customization : SettingsItem.Section() { override val title = "Customization".asTransitive() } +object Language : SettingsItem.Selector() { + override var value by dataObservable(0) { + Config.locale = entryValues.getOrNull(it)?.toString() ?: return@dataObservable + } + + override val title = R.string.language.asTransitive() + + init { + availableLocales.subscribeK { (names, values) -> + setValues(names, values) + val selectedLocale = currentLocale.getDisplayName(currentLocale) + value = names.indexOfFirst { it == selectedLocale }.let { if (it == -1) 0 else it } + } + } +} + object Redesign : SettingsItem.Toggle() { override val title = "Redesign".asTransitive() override val description = @@ -31,7 +50,6 @@ object Manager : SettingsItem.Section() { override val title = R.string.manager.asTransitive() } -object Language object ClearRepoCache : SettingsItem.Blank() { override val title = R.string.settings_clear_cache_title.asTransitive() override val description = R.string.settings_clear_cache_summary.asTransitive() @@ -51,8 +69,17 @@ object Restore : SettingsItem.Blank() { fun HideOrRestore() = if (get().packageName == BuildConfig.APPLICATION_ID) Hide else Restore +//todo new dialog object DownloadPath -object UpdateChannel + +//fixme this +object UpdateChannel : SettingsItem.Selector() { + override var value by dataObservable(Config.updateChannel) { Config.updateChannel = it } +} + +//fixme new dialog +object UpdateChannelUrl + object UpdateChecker : SettingsItem.Toggle() { override val title = R.string.settings_check_update_title.asTransitive() override val description = R.string.settings_check_update_summary.asTransitive() @@ -95,9 +122,100 @@ object Superuser : SettingsItem.Section() { override val title = R.string.superuser.asTransitive() } -object AccessMode -object MultiuserMode -object MountNamespaceMode -object AutomaticResponse -object RequestTimeout -object SUNotification \ No newline at end of file +object AccessMode : SettingsItem.Selector() { + override val title = R.string.superuser_access.asTransitive() + override var value by dataObservable(Config.rootMode) { + Config.rootMode = entryValues.getOrNull(it) + ?.toString() + ?.toInt() ?: return@dataObservable + } + + init { + setValues( + resources.getStringArray(R.array.su_access), + resources.getStringArray(R.array.value_array) + ) + } +} + +object MultiuserMode : SettingsItem.Selector() { + override val title = R.string.multiuser_mode.asTransitive() + override var value by dataObservable(Config.suMultiuserMode) { + Config.suMultiuserMode = entryValues.getOrNull(it) + ?.toString() + ?.toInt() ?: return@dataObservable + } + + init { + setValues( + resources.getStringArray(R.array.multiuser_mode), + resources.getStringArray(R.array.value_array) + ) + } +} + +object MountNamespaceMode : SettingsItem.Selector() { + override val title = R.string.mount_namespace_mode.asTransitive() + override var value by dataObservable(Config.suMntNamespaceMode) { + Config.suMntNamespaceMode = entryValues.getOrNull(it) + ?.toString() + ?.toInt() ?: return@dataObservable + } + + init { + setValues( + resources.getStringArray(R.array.namespace), + resources.getStringArray(R.array.value_array) + ) + } +} + +object AutomaticResponse : SettingsItem.Selector() { + override val title = R.string.auto_response.asTransitive() + override var value by dataObservable(Config.suAutoReponse) { + Config.suAutoReponse = entryValues.getOrNull(it) + ?.toString() + ?.toInt() ?: return@dataObservable + } + + init { + setValues( + resources.getStringArray(R.array.auto_response), + resources.getStringArray(R.array.value_array) + ) + } +} + +object RequestTimeout : SettingsItem.Selector() { + override val title = R.string.request_timeout.asTransitive() + override var value by dataObservable(-1) { + Config.suDefaultTimeout = entryValues.getOrNull(it) + ?.toString() + ?.toInt() ?: return@dataObservable + } + + init { + setValues( + resources.getStringArray(R.array.request_timeout), + resources.getStringArray(R.array.request_timeout_value) + ) + val currentValue = Config.suDefaultTimeout.toString() + value = entryValues.indexOfFirst { it == currentValue } + } +} + +object SUNotification : SettingsItem.Selector() { + override val title = R.string.superuser_notification.asTransitive() + override var value by dataObservable(Config.suNotification) { + Config.suNotification = entryValues.getOrNull(it) + ?.toString() + ?.toInt() ?: return@dataObservable + } + + init { + setValues( + resources.getStringArray(R.array.su_notification), + resources.getStringArray(R.array.value_array) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt index 6a261ec2a..68fd19f13 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt @@ -1,5 +1,6 @@ package com.topjohnwu.magisk.redesign.settings +import android.content.res.Resources import android.view.MotionEvent import android.view.View import androidx.annotation.CallSuper @@ -17,6 +18,8 @@ import com.topjohnwu.magisk.redesign.module.adapterOf import com.topjohnwu.magisk.redesign.superuser.diffListOf import com.topjohnwu.magisk.utils.TransitiveText import com.topjohnwu.magisk.view.MagiskDialog +import org.koin.core.KoinComponent +import org.koin.core.get import kotlin.properties.ObservableProperty import kotlin.reflect.KProperty @@ -25,15 +28,18 @@ class SettingsViewModel : CompatViewModel(), SettingsItem.Callback { val adapter = adapterOf() val itemBinding = itemBindingOf { it.bindExtra(BR.callback, this) } val items = diffListOf( - // General - // Customization - Customization, Theme, Redesign, - // Manager - Manager, ClearRepoCache, HideOrRestore(), UpdateChecker, SystemlessHosts, Biometrics, - // Magisk - Magisk, SafeMode, MagiskHide, - // Superuser - Superuser + Customization, + Theme, Language, Redesign, + + Manager, + ClearRepoCache, HideOrRestore(), UpdateChecker, SystemlessHosts, Biometrics, + + Magisk, + SafeMode, MagiskHide, + + Superuser, + AccessMode, MultiuserMode, MountNamespaceMode, AutomaticResponse, RequestTimeout, + SUNotification ) override fun onItemPressed(view: View, item: SettingsItem) = when (item) { @@ -121,14 +127,49 @@ sealed class SettingsItem : ObservableItem() { } - abstract class Selector : Value() { + abstract class Selector : Value(), KoinComponent { override val layoutRes = R.layout.item_settings_selector + protected val resources get() = get() + + @Bindable + var entries: Array = arrayOf() + private set + @Bindable + var entryValues: Array = arrayOf() + private set + + val selectedEntry + @Bindable get() = entries.getOrNull(value) + + fun setValues( + entries: Array, + values: Array + ) { + check(entries.size <= values.size) { "List sizes must match" } + + this.entries = entries + this.entryValues = values + + notifyChange(BR.entries) + notifyChange(BR.entryValues) + notifyChange(BR.selectedEntry) + } + override fun onPressed(view: View, callback: Callback) { + if (entries.isEmpty() || entryValues.isEmpty()) return MagiskDialog(view.context) - //.applyAdapter() - super.onPressed(view, callback) + .applyTitle(title.getText(resources)) + .applyButton(MagiskDialog.ButtonType.NEGATIVE) { + titleRes = android.R.string.cancel + } + .applyAdapter(entries) { + value = it + notifyChange(BR.selectedEntry) + super.onPressed(view, callback) + } + .reveal() } } diff --git a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt index f4b698340..661cbfa58 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt @@ -8,13 +8,22 @@ import android.graphics.drawable.Drawable import android.os.Bundle import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog +import androidx.core.view.updateLayoutParams import androidx.databinding.ViewDataBinding +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.databinding.DialogMagiskBaseBinding +import com.topjohnwu.magisk.redesign.home.itemBindingOf import com.topjohnwu.magisk.utils.KObservableField +import me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapters +import me.tatarka.bindingcollectionadapter2.ItemBinding class MagiskDialog @JvmOverloads constructor( context: Context, theme: Int = 0 @@ -138,20 +147,57 @@ class MagiskDialog @JvmOverloads constructor( ButtonBuilder(button).apply(builder) } + class DialogItem( + val item: CharSequence, + val position: Int + ) : ComparableRvItem() { + override val layoutRes = R.layout.item_list_single_line + override fun itemSameAs(other: DialogItem) = item == other.item + override fun contentSameAs(other: DialogItem) = itemSameAs(other) + } + + interface ActualOnDialogClickListener { + fun onClick(position: Int) + } + + fun applyAdapter( + list: Array, + listener: OnDialogClickListener + ) = applyView( + RecyclerView(context).also { + it.isNestedScrollingEnabled = false + it.layoutManager = LinearLayoutManager(context) + + val actualListener = object : ActualOnDialogClickListener { + override fun onClick(position: Int) { + listener(position) + dismiss() + } + } + val items = list.mapIndexed { i, it -> DialogItem(it, i) } + val binding = itemBindingOf { it.bindExtra(BR.listener, actualListener) } + .let { ItemBinding.of(it) } + + BindingRecyclerViewAdapters.setAdapter(it, binding, items, null, null, null, null) + } + ) + fun cancellable(isCancellable: Boolean) = apply { setCancelable(isCancellable) } - fun applyView(binding: Binding, body: Binding.() -> Unit = {}) = - apply { - resetView() - this.binding.dialogBaseContainer.addView(binding.root) - binding.apply(body) - } + fun applyView( + binding: Binding, + body: Binding.() -> Unit = {} + ) = applyView(binding.root).also { binding.apply(body) } fun applyView(view: View) = apply { resetView() - this.binding.dialogBaseContainer.addView(view) + binding.dialogBaseContainer.addView(view) + view.updateLayoutParams { + width = ViewGroup.LayoutParams.MATCH_PARENT + height = ViewGroup.LayoutParams.WRAP_CONTENT + } } fun onDismiss(callback: OnDialogButtonClickListener) = @@ -203,4 +249,5 @@ class MagiskDialog @JvmOverloads constructor( //endregion } -typealias OnDialogButtonClickListener = (DialogInterface) -> Unit \ No newline at end of file +typealias OnDialogButtonClickListener = (DialogInterface) -> Unit +typealias OnDialogClickListener = (position: Int) -> Unit \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_magisk_base.xml b/app/src/main/res/layout/dialog_magisk_base.xml index a665c867f..7fa4bb7a3 100644 --- a/app/src/main/res/layout/dialog_magisk_base.xml +++ b/app/src/main/res/layout/dialog_magisk_base.xml @@ -93,6 +93,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constrainedHeight="true" + android:layout_marginTop="@dimen/l_50" app:layout_constraintBottom_toTopOf="@+id/dialog_base_space" app:layout_constraintLeft_toLeftOf="@+id/dialog_base_start" app:layout_constraintRight_toRightOf="@+id/dialog_base_end" @@ -108,7 +109,6 @@ gone="@{data.message.length == 0}" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/l_50" android:gravity="center" android:text="@{data.message}" android:textAppearance="@style/AppearanceFoundation.Body" diff --git a/app/src/main/res/layout/item_list_single_line.xml b/app/src/main/res/layout/item_list_single_line.xml new file mode 100644 index 000000000..e0f12d569 --- /dev/null +++ b/app/src/main/res/layout/item_list_single_line.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_settings_selector.xml b/app/src/main/res/layout/item_settings_selector.xml index d5f97e80c..401dc552d 100644 --- a/app/src/main/res/layout/item_settings_selector.xml +++ b/app/src/main/res/layout/item_settings_selector.xml @@ -19,7 +19,7 @@ style="@style/WidgetFoundation.Card" android:layout_width="match_parent" android:layout_height="wrap_content" - android:onClick="@{(view) -> callback.onItemPressed(view, item)}" + android:onClick="@{(view) -> item.onPressed(view, callback)}" tools:layout_gravity="center"> Date: Fri, 29 Nov 2019 14:49:41 +0100 Subject: [PATCH 193/254] Updated selector "selection" design --- .../main/res/layout/item_settings_selector.xml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/layout/item_settings_selector.xml b/app/src/main/res/layout/item_settings_selector.xml index 401dc552d..346a7d4ec 100644 --- a/app/src/main/res/layout/item_settings_selector.xml +++ b/app/src/main/res/layout/item_settings_selector.xml @@ -55,9 +55,9 @@ android:id="@+id/selector_text" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginStart="@{item.icon == 0 ? (int) @dimen/l1 : 0}" android:gravity="center_vertical" android:orientation="vertical" - android:layout_marginStart="@{item.icon == 0 ? (int) @dimen/l1 : 0}" android:paddingTop="@dimen/l1" android:paddingBottom="@dimen/l1" app:layout_constraintBottom_toTopOf="@+id/selector_divider" @@ -93,8 +93,10 @@ android:id="@+id/selector_divider" gone="@{item.selectedEntry == null}" android:layout_width="match_parent" - android:layout_height="1dp" + android:layout_height="0dp" + android:alpha=".5" android:background="?colorSurface" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@+id/selector_text" /> From dec1094a5937f9aa88049ba25c1e70534a7a8585 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 29 Nov 2019 20:07:33 +0100 Subject: [PATCH 194/254] Added "input" settings item, that opens custom input dialog Updated order of some items in settings --- .../magisk/redesign/settings/SettingsItems.kt | 67 +++++++++- .../redesign/settings/SettingsViewModel.kt | 64 ++++++++- .../layout/dialog_settings_download_path.xml | 54 ++++++++ .../layout/dialog_settings_update_channel.xml | 46 +++++++ .../main/res/layout/item_settings_blank.xml | 2 + .../main/res/layout/item_settings_input.xml | 124 ++++++++++++++++++ .../res/layout/item_settings_selector.xml | 2 + .../main/res/layout/item_settings_toggle.xml | 3 + app/src/main/res/values/strings.xml | 2 +- 9 files changed, 352 insertions(+), 12 deletions(-) create mode 100644 app/src/main/res/layout/dialog_settings_download_path.xml create mode 100644 app/src/main/res/layout/dialog_settings_update_channel.xml create mode 100644 app/src/main/res/layout/item_settings_input.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt index 2fceed1d1..688528315 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt @@ -1,14 +1,22 @@ package com.topjohnwu.magisk.redesign.settings import android.content.Context +import android.os.Environment +import android.view.LayoutInflater +import androidx.databinding.Bindable +import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.BuildConfig import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.databinding.DialogSettingsDownloadPathBinding +import com.topjohnwu.magisk.databinding.DialogSettingsUpdateChannelBinding import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.extensions.subscribeK +import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.magisk.utils.asTransitive import com.topjohnwu.magisk.utils.availableLocales import com.topjohnwu.magisk.utils.currentLocale +import java.io.File // --- Customization @@ -69,16 +77,61 @@ object Restore : SettingsItem.Blank() { fun HideOrRestore() = if (get().packageName == BuildConfig.APPLICATION_ID) Hide else Restore -//todo new dialog -object DownloadPath +object DownloadPath : SettingsItem.Input() { + override var value: String by dataObservable(Config.downloadPath) { Config.downloadPath = it } + override val title = R.string.settings_download_path_title.asTransitive() + override val intermediate: String? + get() = if (Utils.ensureDownloadPath(result) != null) result else null + var result = value + @Bindable get + set(value) { + field = value + notifyChange(BR.result) + notifyChange(BR.path) + } + val path + @Bindable get() = File( + Environment.getExternalStorageDirectory(), + result + ).absolutePath.orEmpty() -//fixme this -object UpdateChannel : SettingsItem.Selector() { - override var value by dataObservable(Config.updateChannel) { Config.updateChannel = it } + override fun getView(context: Context) = DialogSettingsDownloadPathBinding + .inflate(LayoutInflater.from(context)).also { it.data = this }.root } -//fixme new dialog -object UpdateChannelUrl +object UpdateChannel : SettingsItem.Selector() { + override var value by dataObservable(Config.updateChannel) { Config.updateChannel = it } + override val title = R.string.settings_update_channel_title.asTransitive() + + init { + val entries = resources.getStringArray(R.array.update_channel).let { + if (!Utils.isCanary && Config.updateChannel < Config.Value.CANARY_CHANNEL) + it.take(it.size - 2).toTypedArray() else it + } + setValues( + entries, + resources.getStringArray(R.array.value_array) + ) + } +} + +object UpdateChannelUrl : SettingsItem.Input() { + override val title = R.string.settings_update_custom.asTransitive() + override var value: String by dataObservable(Config.customChannelUrl) { + Config.customChannelUrl = it + } + override val intermediate: String? get() = result + + var result = value + @Bindable get + set(value) { + field = value + notifyChange(BR.result) + } + + override fun getView(context: Context) = DialogSettingsUpdateChannelBinding + .inflate(LayoutInflater.from(context)).also { it.data = this }.root +} object UpdateChecker : SettingsItem.Toggle() { override val title = R.string.settings_check_update_title.asTransitive() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt index 68fd19f13..ce0282f15 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt @@ -1,5 +1,6 @@ package com.topjohnwu.magisk.redesign.settings +import android.content.Context import android.content.res.Resources import android.view.MotionEvent import android.view.View @@ -8,6 +9,7 @@ import androidx.databinding.Bindable import androidx.databinding.ViewDataBinding import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R import com.topjohnwu.magisk.model.entity.recycler.ObservableItem import com.topjohnwu.magisk.model.events.DieEvent @@ -29,10 +31,11 @@ class SettingsViewModel : CompatViewModel(), SettingsItem.Callback { val itemBinding = itemBindingOf { it.bindExtra(BR.callback, this) } val items = diffListOf( Customization, - Theme, Language, Redesign, + Theme, Language, Redesign, DownloadPath, Manager, - ClearRepoCache, HideOrRestore(), UpdateChecker, SystemlessHosts, Biometrics, + UpdateChannel, UpdateChannelUrl, ClearRepoCache, HideOrRestore(), UpdateChecker, + SystemlessHosts, Biometrics, Magisk, SafeMode, MagiskHide, @@ -44,11 +47,23 @@ class SettingsViewModel : CompatViewModel(), SettingsItem.Callback { override fun onItemPressed(view: View, item: SettingsItem) = when (item) { // use only instances you want, don't declare everything - Theme -> Navigation.theme().publish() - Redesign -> DieEvent().publish() + is Theme -> Navigation.theme().publish() + is Redesign -> DieEvent().publish() + is UpdateChannel -> item.openUrlIfNecessary(view) else -> Unit } + private fun UpdateChannel.openUrlIfNecessary(view: View) { + if (value == Config.Value.CUSTOM_CHANNEL) { + if (UpdateChannelUrl.value.isBlank()) { + UpdateChannelUrl.onPressed(view, this@SettingsViewModel) + } + UpdateChannelUrl.isEnabled = true + } else { + UpdateChannelUrl.isEnabled = false + } + } + } sealed class SettingsItem : ObservableItem() { @@ -60,6 +75,13 @@ sealed class SettingsItem : ObservableItem() { @Bindable open val description: TransitiveText = TransitiveText.empty + var isEnabled = true + @Bindable get + set(value) { + field = value + notifyChange(BR.enabled) + } + protected open val isFullSpan: Boolean = false @CallSuper @@ -127,6 +149,40 @@ sealed class SettingsItem : ObservableItem() { } + abstract class Input : Value(), KoinComponent { + + override val layoutRes = R.layout.item_settings_input + + protected val resources get() = get() + protected abstract val intermediate: String? + + override fun onPressed(view: View, callback: Callback) { + MagiskDialog(view.context) + .applyTitle(title.getText(resources)) + .applyView(getView(view.context)) + .applyButton(MagiskDialog.ButtonType.POSITIVE) { + titleRes = android.R.string.ok + onClick { + intermediate?.let { result -> + preventDismiss = false + value = result + it.dismiss() + super.onPressed(view, callback) + return@onClick + } + preventDismiss = true + } + } + .applyButton(MagiskDialog.ButtonType.NEGATIVE) { + titleRes = android.R.string.cancel + } + .reveal() + } + + abstract fun getView(context: Context): View + + } + abstract class Selector : Value(), KoinComponent { override val layoutRes = R.layout.item_settings_selector diff --git a/app/src/main/res/layout/dialog_settings_download_path.xml b/app/src/main/res/layout/dialog_settings_download_path.xml new file mode 100644 index 000000000..d5782a298 --- /dev/null +++ b/app/src/main/res/layout/dialog_settings_download_path.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_settings_update_channel.xml b/app/src/main/res/layout/dialog_settings_update_channel.xml new file mode 100644 index 000000000..57cb087b4 --- /dev/null +++ b/app/src/main/res/layout/dialog_settings_update_channel.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_settings_blank.xml b/app/src/main/res/layout/item_settings_blank.xml index 25935519c..367f142f1 100644 --- a/app/src/main/res/layout/item_settings_blank.xml +++ b/app/src/main/res/layout/item_settings_blank.xml @@ -18,6 +18,8 @@ diff --git a/app/src/main/res/layout/item_settings_input.xml b/app/src/main/res/layout/item_settings_input.xml new file mode 100644 index 000000000..285c939eb --- /dev/null +++ b/app/src/main/res/layout/item_settings_input.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_settings_selector.xml b/app/src/main/res/layout/item_settings_selector.xml index 346a7d4ec..cb8a91fa3 100644 --- a/app/src/main/res/layout/item_settings_selector.xml +++ b/app/src/main/res/layout/item_settings_selector.xml @@ -19,6 +19,8 @@ style="@style/WidgetFoundation.Card" android:layout_width="match_parent" android:layout_height="wrap_content" + isEnabled="@{item.enabled}" + android:alpha="@{item.enabled ? 1f : .5f}" android:onClick="@{(view) -> item.onPressed(view, callback)}" tools:layout_gravity="center"> diff --git a/app/src/main/res/layout/item_settings_toggle.xml b/app/src/main/res/layout/item_settings_toggle.xml index 7c6a5acd3..ba9b1ebc5 100644 --- a/app/src/main/res/layout/item_settings_toggle.xml +++ b/app/src/main/res/layout/item_settings_toggle.xml @@ -20,6 +20,8 @@ @@ -49,6 +51,7 @@ android:layout_height="wrap_content" android:layout_marginEnd="@dimen/l_25" android:checked="@{item.value}" + isEnabled="@{item.enabled}" android:text="" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d9a127161..c23851d53 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -137,7 +137,7 @@ Update Channel Stable Beta - Custom + Custom Channel Insert a custom URL Magisk Core Only Mode Enable only core features. MagiskSU and MagiskHide will still be enabled, but no modules will be loaded From 34a0a00e3ce8975cda5cd792e56c380f18985706 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 29 Nov 2019 21:04:32 +0100 Subject: [PATCH 195/254] Updated constraint layout to fix layout issue in dialog --- app/build.gradle | 2 +- .../java/com/topjohnwu/magisk/view/MagiskDialog.kt | 11 +++++------ app/src/main/res/layout/item_settings_blank.xml | 7 +++---- app/src/main/res/layout/item_settings_input.xml | 1 - app/src/main/res/layout/item_settings_selector.xml | 3 +-- app/src/main/res/layout/item_settings_toggle.xml | 7 +++---- 6 files changed, 13 insertions(+), 18 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1c474ac40..2bd136737 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -121,7 +121,7 @@ dependencies { implementation "androidx.navigation:navigation-ui-ktx:${vNav}" implementation 'androidx.biometric:biometric:1.0.0' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta3' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha03' implementation 'androidx.browser:browser:1.0.0' implementation 'androidx.preference:preference:1.1.0' diff --git a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt index 661cbfa58..e4659c31e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt @@ -12,7 +12,6 @@ import android.view.ViewGroup import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog -import androidx.core.view.updateLayoutParams import androidx.databinding.ViewDataBinding import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -193,11 +192,11 @@ class MagiskDialog @JvmOverloads constructor( fun applyView(view: View) = apply { resetView() - binding.dialogBaseContainer.addView(view) - view.updateLayoutParams { - width = ViewGroup.LayoutParams.MATCH_PARENT - height = ViewGroup.LayoutParams.WRAP_CONTENT - } + binding.dialogBaseContainer.addView( + view, + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) } fun onDismiss(callback: OnDialogButtonClickListener) = diff --git a/app/src/main/res/layout/item_settings_blank.xml b/app/src/main/res/layout/item_settings_blank.xml index 367f142f1..f8b5be8e3 100644 --- a/app/src/main/res/layout/item_settings_blank.xml +++ b/app/src/main/res/layout/item_settings_blank.xml @@ -17,17 +17,16 @@ @@ -27,7 +27,6 @@ Date: Fri, 29 Nov 2019 21:04:47 +0100 Subject: [PATCH 196/254] Fixed state not being propagated correctly on startup --- .../magisk/redesign/settings/SettingsItems.kt | 8 ++++++++ .../magisk/redesign/settings/SettingsViewModel.kt | 15 +++++---------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt index 688528315..49cd2bc4b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt @@ -129,6 +129,14 @@ object UpdateChannelUrl : SettingsItem.Input() { notifyChange(BR.result) } + init { + updateState() + } + + fun updateState() { + isEnabled = UpdateChannel.value == Config.Value.CUSTOM_CHANNEL + } + override fun getView(context: Context) = DialogSettingsUpdateChannelBinding .inflate(LayoutInflater.from(context)).also { it.data = this }.root } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt index ce0282f15..c431f10c0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt @@ -9,7 +9,6 @@ import androidx.databinding.Bindable import androidx.databinding.ViewDataBinding import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.topjohnwu.magisk.BR -import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R import com.topjohnwu.magisk.model.entity.recycler.ObservableItem import com.topjohnwu.magisk.model.events.DieEvent @@ -49,18 +48,14 @@ class SettingsViewModel : CompatViewModel(), SettingsItem.Callback { // use only instances you want, don't declare everything is Theme -> Navigation.theme().publish() is Redesign -> DieEvent().publish() - is UpdateChannel -> item.openUrlIfNecessary(view) + is UpdateChannel -> openUrlIfNecessary(view) else -> Unit } - private fun UpdateChannel.openUrlIfNecessary(view: View) { - if (value == Config.Value.CUSTOM_CHANNEL) { - if (UpdateChannelUrl.value.isBlank()) { - UpdateChannelUrl.onPressed(view, this@SettingsViewModel) - } - UpdateChannelUrl.isEnabled = true - } else { - UpdateChannelUrl.isEnabled = false + private fun openUrlIfNecessary(view: View) { + UpdateChannelUrl.updateState() + if (UpdateChannelUrl.value.isBlank()) { + UpdateChannelUrl.onPressed(view, this@SettingsViewModel) } } From 3efea47ca85fdca5fc63a650bd66c6c5fc664a3e Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 2 Dec 2019 18:35:48 +0100 Subject: [PATCH 197/254] Updated settings to level functionality with the legacy --- .../com/topjohnwu/magisk/di/RedesignModule.kt | 2 +- .../redesign/settings/SettingsFragment.kt | 5 + .../magisk/redesign/settings/SettingsItems.kt | 122 +++++++++++++++--- .../redesign/settings/SettingsViewModel.kt | 93 ++++++++++++- .../res/layout/dialog_settings_app_name.xml | 52 ++++++++ .../main/res/layout/item_settings_blank.xml | 2 +- .../main/res/layout/item_settings_input.xml | 4 +- 7 files changed, 254 insertions(+), 26 deletions(-) create mode 100644 app/src/main/res/layout/dialog_settings_app_name.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt index ff274352d..c5d93ac71 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt @@ -23,7 +23,7 @@ val redesignModule = module { viewModel { ModuleViewModel(get(), get(), get()) } viewModel { RequestViewModel() } viewModel { SafetynetViewModel(get()) } - viewModel { SettingsViewModel() } + viewModel { SettingsViewModel(get()) } viewModel { SuperuserViewModel(get(), get(), get()) } viewModel { ThemeViewModel() } viewModel { InstallViewModel() } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt index 6f665624b..8ac1efad5 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt @@ -19,4 +19,9 @@ class SettingsFragment : CompatFragment 14 || value.isBlank() + + override val intermediate: String? + get() = if (isError) null else value + + override fun getView(context: Context) = DialogSettingsAppNameBinding + .inflate(LayoutInflater.from(context)).also { it.data = this }.root + + override fun refresh() { + isEnabled = Info.env.isActive + } } object Restore : SettingsItem.Blank() { @@ -129,11 +151,7 @@ object UpdateChannelUrl : SettingsItem.Input() { notifyChange(BR.result) } - init { - updateState() - } - - fun updateState() { + override fun refresh() { isEnabled = UpdateChannel.value == Config.Value.CUSTOM_CHANNEL } @@ -144,19 +162,43 @@ object UpdateChannelUrl : SettingsItem.Input() { object UpdateChecker : SettingsItem.Toggle() { override val title = R.string.settings_check_update_title.asTransitive() override val description = R.string.settings_check_update_summary.asTransitive() - override var value by dataObservable(Config.checkUpdate) { Config.checkUpdate = it } + override var value by dataObservable(Config.checkUpdate) { + Config.checkUpdate = it + Utils.scheduleUpdateCheck(get()) + } } // check whether is module already installed beforehand? object SystemlessHosts : SettingsItem.Blank() { override val title = R.string.settings_hosts_title.asTransitive() override val description = R.string.settings_hosts_summary.asTransitive() + + override fun refresh() { + isEnabled = Info.env.isActive + } } object Biometrics : SettingsItem.Toggle() { override val title = R.string.settings_su_biometric_title.asTransitive() override val description = R.string.settings_su_biometric_summary.asTransitive() override var value by dataObservable(Config.suBiometric) { Config.suBiometric = it } + + override fun refresh() { + isEnabled = BiometricHelper.isSupported && Utils.showSuperUser() + if (!isEnabled) { + value = false + } + } +} + +object Reauthenticate : SettingsItem.Toggle() { + override val title = R.string.settings_su_reauth_title.asTransitive() + override val description = R.string.settings_su_reauth_summary.asTransitive() + override var value by dataObservable(Config.suReAuth) { Config.suReAuth = it } + + override fun refresh() { + isEnabled = Build.VERSION.SDK_INT < Build.VERSION_CODES.O && Utils.showSuperUser() + } } // --- Magisk @@ -168,13 +210,35 @@ object Magisk : SettingsItem.Section() { object SafeMode : SettingsItem.Toggle() { override val title = R.string.settings_core_only_title.asTransitive() override val description = R.string.settings_core_only_summary.asTransitive() - override var value by dataObservable(Config.coreOnly) { Config.coreOnly = it } + override var value by dataObservable(Config.coreOnly) { + if (Config.coreOnly == it) return@dataObservable + Config.coreOnly = it + when { + it -> runCatching { Const.MAGISK_DISABLE_FILE.createNewFile() } + else -> Const.MAGISK_DISABLE_FILE.delete() + } + Utils.toast(R.string.settings_reboot_toast, Toast.LENGTH_LONG) + } + + override fun refresh() { + isEnabled = Info.env.isActive + } } object MagiskHide : SettingsItem.Toggle() { override val title = R.string.magiskhide.asTransitive() override val description = R.string.settings_magiskhide_summary.asTransitive() - override var value by dataObservable(Config.magiskHide) { Config.magiskHide = it } + override var value by dataObservable(Config.magiskHide) { + Config.magiskHide = it + when { + it -> Shell.su("magiskhide --enable").submit() + else -> Shell.su("magiskhide --disable").submit() + } + } + + override fun refresh() { + isEnabled = Info.env.isActive + } } // --- Superuser @@ -197,6 +261,10 @@ object AccessMode : SettingsItem.Selector() { resources.getStringArray(R.array.value_array) ) } + + override fun refresh() { + isEnabled = Utils.showSuperUser() + } } object MultiuserMode : SettingsItem.Selector() { @@ -213,6 +281,10 @@ object MultiuserMode : SettingsItem.Selector() { resources.getStringArray(R.array.value_array) ) } + + override fun refresh() { + isEnabled = Const.USER_ID <= 0 && Utils.showSuperUser() + } } object MountNamespaceMode : SettingsItem.Selector() { @@ -229,6 +301,10 @@ object MountNamespaceMode : SettingsItem.Selector() { resources.getStringArray(R.array.value_array) ) } + + override fun refresh() { + isEnabled = Utils.showSuperUser() + } } object AutomaticResponse : SettingsItem.Selector() { @@ -245,6 +321,10 @@ object AutomaticResponse : SettingsItem.Selector() { resources.getStringArray(R.array.value_array) ) } + + override fun refresh() { + isEnabled = Utils.showSuperUser() + } } object RequestTimeout : SettingsItem.Selector() { @@ -263,6 +343,10 @@ object RequestTimeout : SettingsItem.Selector() { val currentValue = Config.suDefaultTimeout.toString() value = entryValues.indexOfFirst { it == currentValue } } + + override fun refresh() { + isEnabled = Utils.showSuperUser() + } } object SUNotification : SettingsItem.Selector() { @@ -279,4 +363,8 @@ object SUNotification : SettingsItem.Selector() { resources.getStringArray(R.array.value_array) ) } + + override fun refresh() { + isEnabled = Utils.showSuperUser() + } } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt index c431f10c0..d3773b0f3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt @@ -1,30 +1,47 @@ package com.topjohnwu.magisk.redesign.settings +import android.Manifest import android.content.Context import android.content.res.Resources import android.view.MotionEvent import android.view.View +import android.widget.Toast import androidx.annotation.CallSuper import androidx.databinding.Bindable import androidx.databinding.ViewDataBinding import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.data.database.RepoDao +import com.topjohnwu.magisk.extensions.subscribeK +import com.topjohnwu.magisk.model.download.DownloadService +import com.topjohnwu.magisk.model.entity.internal.Configuration +import com.topjohnwu.magisk.model.entity.internal.DownloadSubject import com.topjohnwu.magisk.model.entity.recycler.ObservableItem import com.topjohnwu.magisk.model.events.DieEvent +import com.topjohnwu.magisk.model.events.PermissionEvent +import com.topjohnwu.magisk.model.events.RecreateEvent +import com.topjohnwu.magisk.model.events.dialog.BiometricDialog import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.redesign.home.itemBindingOf import com.topjohnwu.magisk.redesign.module.adapterOf import com.topjohnwu.magisk.redesign.superuser.diffListOf +import com.topjohnwu.magisk.utils.PatchAPK import com.topjohnwu.magisk.utils.TransitiveText +import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.magisk.view.MagiskDialog +import com.topjohnwu.superuser.Shell +import io.reactivex.Completable +import io.reactivex.subjects.PublishSubject import org.koin.core.KoinComponent import org.koin.core.get import kotlin.properties.ObservableProperty import kotlin.reflect.KProperty -class SettingsViewModel : CompatViewModel(), SettingsItem.Callback { +class SettingsViewModel( + private val repositoryDao: RepoDao +) : CompatViewModel(), SettingsItem.Callback { val adapter = adapterOf() val itemBinding = itemBindingOf { it.bindExtra(BR.callback, this) } @@ -34,10 +51,10 @@ class SettingsViewModel : CompatViewModel(), SettingsItem.Callback { Manager, UpdateChannel, UpdateChannelUrl, ClearRepoCache, HideOrRestore(), UpdateChecker, - SystemlessHosts, Biometrics, + Biometrics, Reauthenticate, Magisk, - SafeMode, MagiskHide, + SafeMode, MagiskHide, SystemlessHosts, Superuser, AccessMode, MultiuserMode, MountNamespaceMode, AutomaticResponse, RequestTimeout, @@ -45,20 +62,74 @@ class SettingsViewModel : CompatViewModel(), SettingsItem.Callback { ) override fun onItemPressed(view: View, item: SettingsItem) = when (item) { + is DownloadPath -> requireRWPermission() + else -> Unit + } + + override fun onItemChanged(view: View, item: SettingsItem) = when (item) { // use only instances you want, don't declare everything is Theme -> Navigation.theme().publish() is Redesign -> DieEvent().publish() + is Language -> RecreateEvent().publish() + is UpdateChannel -> openUrlIfNecessary(view) + is Biometrics -> authenticateOrRevert() + is ClearRepoCache -> clearRepoCache() + is SystemlessHosts -> createHosts() + is Hide -> updateManager(hide = true) + is Restore -> updateManager(hide = false) + else -> Unit } private fun openUrlIfNecessary(view: View) { - UpdateChannelUrl.updateState() + UpdateChannelUrl.refresh() if (UpdateChannelUrl.value.isBlank()) { UpdateChannelUrl.onPressed(view, this@SettingsViewModel) } } + private fun authenticateOrRevert() { + // immediately revert the preference + Biometrics.value = !Biometrics.value + BiometricDialog { + // allow the change on success + onSuccess { Biometrics.value = !Biometrics.value } + }.publish() + } + + private fun clearRepoCache() { + Completable.fromAction { repositoryDao.clear() } + .subscribeK { Utils.toast(R.string.repo_cache_cleared, Toast.LENGTH_SHORT) } + } + + private fun createHosts() { + Shell.su("add_hosts_module").submit { + Utils.toast(R.string.settings_hosts_toast, Toast.LENGTH_SHORT) + } + } + + private fun requireRWPermission() { + val callback = PublishSubject.create() + callback.subscribeK { if (!it) requireRWPermission() } + PermissionEvent( + listOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ), callback + ).publish() + } + + private fun updateManager(hide: Boolean) { + if (hide) { + PatchAPK.hideManager(get(), Hide.value) + } else { + DownloadService(get()) { + subject = DownloadSubject.Manager(Configuration.APK.Restore) + } + } + } + } sealed class SettingsItem : ObservableItem() { @@ -81,7 +152,7 @@ sealed class SettingsItem : ObservableItem() { @CallSuper open fun onPressed(view: View, callback: Callback) { - callback.onItemPressed(view, this) + callback.onItemChanged(view, this) // notify only after the callback invocation; callback can invalidate the backing data, // which wouldn't be recognized with reverse approach @@ -90,6 +161,8 @@ sealed class SettingsItem : ObservableItem() { notifyChange(BR.description) } + open fun refresh() {} + override fun onBindingBound(binding: ViewDataBinding) { super.onBindingBound(binding) if (isFullSpan) { @@ -105,6 +178,7 @@ sealed class SettingsItem : ObservableItem() { interface Callback { fun onItemPressed(view: View, item: SettingsItem) + fun onItemChanged(view: View, item: SettingsItem) } // --- @@ -131,6 +205,7 @@ sealed class SettingsItem : ObservableItem() { override val layoutRes = R.layout.item_settings_toggle override fun onPressed(view: View, callback: Callback) { + callback.onItemPressed(view, this) value = !value super.onPressed(view, callback) } @@ -147,11 +222,13 @@ sealed class SettingsItem : ObservableItem() { abstract class Input : Value(), KoinComponent { override val layoutRes = R.layout.item_settings_input + open val showStrip = true protected val resources get() = get() protected abstract val intermediate: String? override fun onPressed(view: View, callback: Callback) { + callback.onItemPressed(view, this) MagiskDialog(view.context) .applyTitle(title.getText(resources)) .applyView(getView(view.context)) @@ -210,6 +287,7 @@ sealed class SettingsItem : ObservableItem() { override fun onPressed(view: View, callback: Callback) { if (entries.isEmpty() || entryValues.isEmpty()) return + callback.onItemPressed(view, this) MagiskDialog(view.context) .applyTitle(title.getText(resources)) .applyButton(MagiskDialog.ButtonType.NEGATIVE) { @@ -229,6 +307,11 @@ sealed class SettingsItem : ObservableItem() { override val layoutRes = R.layout.item_settings_blank + override fun onPressed(view: View, callback: Callback) { + callback.onItemPressed(view, this) + super.onPressed(view, callback) + } + } abstract class Section : SettingsItem() { diff --git a/app/src/main/res/layout/dialog_settings_app_name.xml b/app/src/main/res/layout/dialog_settings_app_name.xml new file mode 100644 index 000000000..f0e325396 --- /dev/null +++ b/app/src/main/res/layout/dialog_settings_app_name.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_settings_blank.xml b/app/src/main/res/layout/item_settings_blank.xml index f8b5be8e3..a6df8aad7 100644 --- a/app/src/main/res/layout/item_settings_blank.xml +++ b/app/src/main/res/layout/item_settings_blank.xml @@ -21,7 +21,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:alpha="@{item.enabled ? 1f : .5f}" - android:onClick="@{(view) -> callback.onItemPressed(view, item)}" + android:onClick="@{(view) -> callback.onItemChanged(view, item)}" tools:layout_gravity="center"> Date: Mon, 2 Dec 2019 18:39:22 +0100 Subject: [PATCH 198/254] Updated homepage to be less aggressive --- app/src/main/res/layout/fragment_home_md2.xml | 6 +++--- app/src/main/res/layout/item_developer.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index b7a1f9036..7b5608040 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -741,7 +741,7 @@ + android:textAppearance="@style/AppearanceFoundation.Title" /> + android:textAppearance="@style/AppearanceFoundation.Caption.Variant" /> Date: Mon, 2 Dec 2019 18:51:22 +0100 Subject: [PATCH 199/254] Reverted tinting headlines --- .../entity/recycler/TappableHeadlineItem.kt | 5 ++ .../magisk/redesign/theme/ThemeViewModel.kt | 12 +++- .../main/res/layout/fragment_theme_md2.xml | 55 ++----------------- .../res/layout/item_tappable_headline.xml | 8 +-- 4 files changed, 23 insertions(+), 57 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TappableHeadlineItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TappableHeadlineItem.kt index c24bec54a..6f7c497da 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TappableHeadlineItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TappableHeadlineItem.kt @@ -36,4 +36,9 @@ sealed class TappableHeadlineItem : ComparableRvItem() { override val icon = R.drawable.ic_safetynet_md2 } + object ThemeMode : TappableHeadlineItem() { + override val title = R.string.section_theme + override val icon = R.drawable.ic_day_night + } + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt index 9bbacac6a..2e792ae36 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt @@ -1,6 +1,7 @@ package com.topjohnwu.magisk.redesign.theme import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.model.entity.recycler.TappableHeadlineItem import com.topjohnwu.magisk.model.entity.recycler.ThemeItem import com.topjohnwu.magisk.model.events.RecreateEvent import com.topjohnwu.magisk.model.events.dialog.DarkThemeDialog @@ -8,16 +9,23 @@ import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.redesign.home.itemBindingOf import com.topjohnwu.magisk.redesign.superuser.diffListOf -class ThemeViewModel : CompatViewModel() { +class ThemeViewModel : CompatViewModel(), TappableHeadlineItem.Listener { val items = diffListOf(*Theme.values().map { ThemeItem(it) }.toTypedArray()) val itemBinding = itemBindingOf { it.bindExtra(BR.viewModel, this) } + val themeHeadline = TappableHeadlineItem.ThemeMode + + override fun onItemPressed(item: TappableHeadlineItem) = when (item) { + is TappableHeadlineItem.ThemeMode -> darkModePressed() + else -> Unit + } + fun saveTheme(theme: Theme) { theme.select() RecreateEvent().publish() } - fun darkModePressed() = DarkThemeDialog().publish() + private fun darkModePressed() = DarkThemeDialog().publish() } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_theme_md2.xml b/app/src/main/res/layout/fragment_theme_md2.xml index d15b98330..3476daec9 100644 --- a/app/src/main/res/layout/fragment_theme_md2.xml +++ b/app/src/main/res/layout/fragment_theme_md2.xml @@ -29,58 +29,11 @@ android:orientation="vertical" android:useDefaultMargins="true"> - - - - - - - - - - - - - + layout="@layout/item_tappable_headline" + listener="@{viewModel}" /> Date: Mon, 2 Dec 2019 18:53:55 +0100 Subject: [PATCH 200/254] Updated hide items to follow suit with the rest of scrollable content --- app/src/main/res/layout/item_hide_md2.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/item_hide_md2.xml b/app/src/main/res/layout/item_hide_md2.xml index c39535b62..cce147289 100644 --- a/app/src/main/res/layout/item_hide_md2.xml +++ b/app/src/main/res/layout/item_hide_md2.xml @@ -18,7 +18,7 @@ Date: Fri, 6 Dec 2019 15:00:55 +0100 Subject: [PATCH 201/254] Finished rebranding core-only mode to safe mode In compliance with #2131 Mentioned features are not contained within this commit --- .../com/topjohnwu/magisk/redesign/settings/SettingsItems.kt | 4 ++-- app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/values/strings_md2.xml | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt index 2f6bdad10..8bd5b4fcf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt @@ -208,8 +208,8 @@ object Magisk : SettingsItem.Section() { } object SafeMode : SettingsItem.Toggle() { - override val title = R.string.settings_core_only_title.asTransitive() - override val description = R.string.settings_core_only_summary.asTransitive() + override val title = R.string.settings_safe_mode_title.asTransitive() + override val description = R.string.settings_safe_mode_summary.asTransitive() override var value by dataObservable(Config.coreOnly) { if (Config.coreOnly == it) return@dataObservable Config.coreOnly = it diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c23851d53..87e0a26fd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -139,7 +139,9 @@ Beta Custom Channel Insert a custom URL + Magisk Core Only Mode + Enable only core features. MagiskSU and MagiskHide will still be enabled, but no modules will be loaded Hide Magisk from various forms of detection Systemless hosts diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index 3cdbf7a45..a7527f006 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -68,6 +68,8 @@ Always Light Follow System Always Dark + Safe Mode + Disables everything but essential functionality within Magisk and Magisk Manager. Magisk Hide, as a separate subsystem, will stand unaffected. Options Method From 8a03c366b8441243c223f1b7598ee2a834686e49 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 6 Dec 2019 15:39:12 +0100 Subject: [PATCH 202/254] Updated settings item location >in code< --- .../model/entity/recycler/ModuleRvItem.kt | 2 +- .../model/entity/recycler/SettingsItem.kt | 209 ++++++++++++++++++ .../magisk/redesign/settings/SettingsItems.kt | 1 + .../redesign/settings/SettingsViewModel.kt | 205 +---------------- .../main/res/layout/item_settings_blank.xml | 4 +- .../main/res/layout/item_settings_input.xml | 4 +- .../main/res/layout/item_settings_section.xml | 2 +- .../res/layout/item_settings_selector.xml | 4 +- .../main/res/layout/item_settings_toggle.xml | 4 +- 9 files changed, 221 insertions(+), 214 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt index 5e170bc8b..b748ffc94 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt @@ -218,6 +218,6 @@ abstract class ObservableItem : ComparableRvItem(), Observable { list.add(callback ?: return) } - protected fun notifyChange(id: Int) = list.notifyChange(this, id) + fun notifyChange(id: Int) = list.notifyChange(this, id) } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt new file mode 100644 index 000000000..41e551d52 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt @@ -0,0 +1,209 @@ +package com.topjohnwu.magisk.model.entity.recycler + +import android.content.Context +import android.content.res.Resources +import android.view.MotionEvent +import android.view.View +import androidx.annotation.CallSuper +import androidx.databinding.Bindable +import androidx.databinding.ViewDataBinding +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.utils.TransitiveText +import com.topjohnwu.magisk.view.MagiskDialog +import org.koin.core.KoinComponent +import org.koin.core.get +import kotlin.properties.ObservableProperty +import kotlin.reflect.KProperty + +sealed class SettingsItem : ObservableItem() { + + @Bindable + open val icon: Int = 0 + @Bindable + open val title: TransitiveText = TransitiveText.empty + @Bindable + open val description: TransitiveText = TransitiveText.empty + + var isEnabled = true + @Bindable get + set(value) { + field = value + notifyChange(BR.enabled) + } + + protected open val isFullSpan: Boolean = false + + @CallSuper + open fun onPressed(view: View, callback: Callback) { + callback.onItemChanged(view, this) + + // notify only after the callback invocation; callback can invalidate the backing data, + // which wouldn't be recognized with reverse approach + notifyChange(BR.icon) + notifyChange(BR.title) + notifyChange(BR.description) + } + + open fun refresh() {} + + override fun onBindingBound(binding: ViewDataBinding) { + super.onBindingBound(binding) + if (isFullSpan) { + val params = binding.root.layoutParams as? StaggeredGridLayoutManager.LayoutParams + params?.isFullSpan = true + } + } + + override fun itemSameAs(other: SettingsItem) = this === other + override fun contentSameAs(other: SettingsItem) = itemSameAs(other) + + // --- + + interface Callback { + fun onItemPressed(view: View, item: SettingsItem) + fun onItemChanged(view: View, item: SettingsItem) + } + + // --- + + abstract class Value : SettingsItem() { + + abstract var value: T + @Bindable get + + protected inline fun dataObservable( + initialValue: T, + crossinline setter: (T) -> Unit + ) = object : ObservableProperty(initialValue) { + override fun afterChange(property: KProperty<*>, oldValue: T, newValue: T) { + setter(newValue) + notifyChange(BR.value) + } + } + + } + + abstract class Toggle : Value() { + + override val layoutRes = R.layout.item_settings_toggle + + override fun onPressed(view: View, callback: Callback) { + callback.onItemPressed(view, this) + value = !value + super.onPressed(view, callback) + } + + fun onTouched(view: View, callback: Callback, event: MotionEvent): Boolean { + if (event.action == MotionEvent.ACTION_UP) { + onPressed(view, callback) + } + return true + } + + } + + abstract class Input : Value(), KoinComponent { + + override val layoutRes = R.layout.item_settings_input + open val showStrip = true + + protected val resources get() = get() + protected abstract val intermediate: String? + + override fun onPressed(view: View, callback: Callback) { + callback.onItemPressed(view, this) + MagiskDialog(view.context) + .applyTitle(title.getText(resources)) + .applyView(getView(view.context)) + .applyButton(MagiskDialog.ButtonType.POSITIVE) { + titleRes = android.R.string.ok + onClick { + intermediate?.let { result -> + preventDismiss = false + value = result + it.dismiss() + super.onPressed(view, callback) + return@onClick + } + preventDismiss = true + } + } + .applyButton(MagiskDialog.ButtonType.NEGATIVE) { + titleRes = android.R.string.cancel + } + .reveal() + } + + abstract fun getView(context: Context): View + + } + + abstract class Selector : Value(), KoinComponent { + + override val layoutRes = R.layout.item_settings_selector + + protected val resources get() = get() + + @Bindable + var entries: Array = arrayOf() + private set + @Bindable + var entryValues: Array = arrayOf() + private set + + val selectedEntry + @Bindable get() = entries.getOrNull(value) + + fun setValues( + entries: Array, + values: Array + ) { + check(entries.size <= values.size) { "List sizes must match" } + + this.entries = entries + this.entryValues = values + + notifyChange(BR.entries) + notifyChange(BR.entryValues) + notifyChange(BR.selectedEntry) + } + + override fun onPressed(view: View, callback: Callback) { + if (entries.isEmpty() || entryValues.isEmpty()) return + callback.onItemPressed(view, this) + MagiskDialog(view.context) + .applyTitle(title.getText(resources)) + .applyButton(MagiskDialog.ButtonType.NEGATIVE) { + titleRes = android.R.string.cancel + } + .applyAdapter(entries) { + value = it + notifyChange(BR.selectedEntry) + super.onPressed(view, callback) + } + .reveal() + } + + } + + abstract class Blank : SettingsItem() { + + override val layoutRes = R.layout.item_settings_blank + + override fun onPressed(view: View, callback: Callback) { + callback.onItemPressed(view, this) + super.onPressed(view, callback) + } + + } + + abstract class Section : SettingsItem() { + + override val layoutRes = R.layout.item_settings_section + override val isFullSpan = true + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt index 8bd5b4fcf..882ee4262 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt @@ -12,6 +12,7 @@ import com.topjohnwu.magisk.databinding.DialogSettingsDownloadPathBinding import com.topjohnwu.magisk.databinding.DialogSettingsUpdateChannelBinding import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.extensions.subscribeK +import com.topjohnwu.magisk.model.entity.recycler.SettingsItem import com.topjohnwu.magisk.utils.* import com.topjohnwu.superuser.Shell import java.io.File diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt index d3773b0f3..58faf4df2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt @@ -1,15 +1,8 @@ package com.topjohnwu.magisk.redesign.settings import android.Manifest -import android.content.Context -import android.content.res.Resources -import android.view.MotionEvent import android.view.View import android.widget.Toast -import androidx.annotation.CallSuper -import androidx.databinding.Bindable -import androidx.databinding.ViewDataBinding -import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.database.RepoDao @@ -17,7 +10,7 @@ import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.model.download.DownloadService import com.topjohnwu.magisk.model.entity.internal.Configuration import com.topjohnwu.magisk.model.entity.internal.DownloadSubject -import com.topjohnwu.magisk.model.entity.recycler.ObservableItem +import com.topjohnwu.magisk.model.entity.recycler.SettingsItem import com.topjohnwu.magisk.model.events.DieEvent import com.topjohnwu.magisk.model.events.PermissionEvent import com.topjohnwu.magisk.model.events.RecreateEvent @@ -28,16 +21,11 @@ import com.topjohnwu.magisk.redesign.home.itemBindingOf import com.topjohnwu.magisk.redesign.module.adapterOf import com.topjohnwu.magisk.redesign.superuser.diffListOf import com.topjohnwu.magisk.utils.PatchAPK -import com.topjohnwu.magisk.utils.TransitiveText import com.topjohnwu.magisk.utils.Utils -import com.topjohnwu.magisk.view.MagiskDialog import com.topjohnwu.superuser.Shell import io.reactivex.Completable import io.reactivex.subjects.PublishSubject -import org.koin.core.KoinComponent import org.koin.core.get -import kotlin.properties.ObservableProperty -import kotlin.reflect.KProperty class SettingsViewModel( private val repositoryDao: RepoDao @@ -130,195 +118,4 @@ class SettingsViewModel( } } -} - -sealed class SettingsItem : ObservableItem() { - - @Bindable - open val icon: Int = 0 - @Bindable - open val title: TransitiveText = TransitiveText.empty - @Bindable - open val description: TransitiveText = TransitiveText.empty - - var isEnabled = true - @Bindable get - set(value) { - field = value - notifyChange(BR.enabled) - } - - protected open val isFullSpan: Boolean = false - - @CallSuper - open fun onPressed(view: View, callback: Callback) { - callback.onItemChanged(view, this) - - // notify only after the callback invocation; callback can invalidate the backing data, - // which wouldn't be recognized with reverse approach - notifyChange(BR.icon) - notifyChange(BR.title) - notifyChange(BR.description) - } - - open fun refresh() {} - - override fun onBindingBound(binding: ViewDataBinding) { - super.onBindingBound(binding) - if (isFullSpan) { - val params = binding.root.layoutParams as? StaggeredGridLayoutManager.LayoutParams - params?.isFullSpan = true - } - } - - override fun itemSameAs(other: SettingsItem) = this === other - override fun contentSameAs(other: SettingsItem) = itemSameAs(other) - - // --- - - interface Callback { - fun onItemPressed(view: View, item: SettingsItem) - fun onItemChanged(view: View, item: SettingsItem) - } - - // --- - - abstract class Value : SettingsItem() { - - abstract var value: T - @Bindable get - - protected inline fun dataObservable( - initialValue: T, - crossinline setter: (T) -> Unit - ) = object : ObservableProperty(initialValue) { - override fun afterChange(property: KProperty<*>, oldValue: T, newValue: T) { - setter(newValue) - notifyChange(BR.value) - } - } - - } - - abstract class Toggle : Value() { - - override val layoutRes = R.layout.item_settings_toggle - - override fun onPressed(view: View, callback: Callback) { - callback.onItemPressed(view, this) - value = !value - super.onPressed(view, callback) - } - - fun onTouched(view: View, callback: Callback, event: MotionEvent): Boolean { - if (event.action == MotionEvent.ACTION_UP) { - onPressed(view, callback) - } - return true - } - - } - - abstract class Input : Value(), KoinComponent { - - override val layoutRes = R.layout.item_settings_input - open val showStrip = true - - protected val resources get() = get() - protected abstract val intermediate: String? - - override fun onPressed(view: View, callback: Callback) { - callback.onItemPressed(view, this) - MagiskDialog(view.context) - .applyTitle(title.getText(resources)) - .applyView(getView(view.context)) - .applyButton(MagiskDialog.ButtonType.POSITIVE) { - titleRes = android.R.string.ok - onClick { - intermediate?.let { result -> - preventDismiss = false - value = result - it.dismiss() - super.onPressed(view, callback) - return@onClick - } - preventDismiss = true - } - } - .applyButton(MagiskDialog.ButtonType.NEGATIVE) { - titleRes = android.R.string.cancel - } - .reveal() - } - - abstract fun getView(context: Context): View - - } - - abstract class Selector : Value(), KoinComponent { - - override val layoutRes = R.layout.item_settings_selector - - protected val resources get() = get() - - @Bindable - var entries: Array = arrayOf() - private set - @Bindable - var entryValues: Array = arrayOf() - private set - - val selectedEntry - @Bindable get() = entries.getOrNull(value) - - fun setValues( - entries: Array, - values: Array - ) { - check(entries.size <= values.size) { "List sizes must match" } - - this.entries = entries - this.entryValues = values - - notifyChange(BR.entries) - notifyChange(BR.entryValues) - notifyChange(BR.selectedEntry) - } - - override fun onPressed(view: View, callback: Callback) { - if (entries.isEmpty() || entryValues.isEmpty()) return - callback.onItemPressed(view, this) - MagiskDialog(view.context) - .applyTitle(title.getText(resources)) - .applyButton(MagiskDialog.ButtonType.NEGATIVE) { - titleRes = android.R.string.cancel - } - .applyAdapter(entries) { - value = it - notifyChange(BR.selectedEntry) - super.onPressed(view, callback) - } - .reveal() - } - - } - - abstract class Blank : SettingsItem() { - - override val layoutRes = R.layout.item_settings_blank - - override fun onPressed(view: View, callback: Callback) { - callback.onItemPressed(view, this) - super.onPressed(view, callback) - } - - } - - abstract class Section : SettingsItem() { - - override val layoutRes = R.layout.item_settings_section - override val isFullSpan = true - - } - } \ No newline at end of file diff --git a/app/src/main/res/layout/item_settings_blank.xml b/app/src/main/res/layout/item_settings_blank.xml index a6df8aad7..31de4e803 100644 --- a/app/src/main/res/layout/item_settings_blank.xml +++ b/app/src/main/res/layout/item_settings_blank.xml @@ -7,11 +7,11 @@ + type="com.topjohnwu.magisk.model.entity.recycler.SettingsItem.Blank" /> + type="com.topjohnwu.magisk.model.entity.recycler.SettingsItem.Callback" /> diff --git a/app/src/main/res/layout/item_settings_input.xml b/app/src/main/res/layout/item_settings_input.xml index 64aac7865..0eb5fac97 100644 --- a/app/src/main/res/layout/item_settings_input.xml +++ b/app/src/main/res/layout/item_settings_input.xml @@ -7,11 +7,11 @@ + type="com.topjohnwu.magisk.model.entity.recycler.SettingsItem.Input" /> + type="com.topjohnwu.magisk.model.entity.recycler.SettingsItem.Callback" /> diff --git a/app/src/main/res/layout/item_settings_section.xml b/app/src/main/res/layout/item_settings_section.xml index 7c6a29e10..92e751ee6 100644 --- a/app/src/main/res/layout/item_settings_section.xml +++ b/app/src/main/res/layout/item_settings_section.xml @@ -6,7 +6,7 @@ + type="com.topjohnwu.magisk.model.entity.recycler.SettingsItem" /> diff --git a/app/src/main/res/layout/item_settings_selector.xml b/app/src/main/res/layout/item_settings_selector.xml index 66be0bcc3..edebf5b91 100644 --- a/app/src/main/res/layout/item_settings_selector.xml +++ b/app/src/main/res/layout/item_settings_selector.xml @@ -7,11 +7,11 @@ + type="com.topjohnwu.magisk.model.entity.recycler.SettingsItem.Selector" /> + type="com.topjohnwu.magisk.model.entity.recycler.SettingsItem.Callback" /> diff --git a/app/src/main/res/layout/item_settings_toggle.xml b/app/src/main/res/layout/item_settings_toggle.xml index 171bd267d..14b6e3749 100644 --- a/app/src/main/res/layout/item_settings_toggle.xml +++ b/app/src/main/res/layout/item_settings_toggle.xml @@ -9,11 +9,11 @@ + type="com.topjohnwu.magisk.model.entity.recycler.SettingsItem.Toggle" /> + type="com.topjohnwu.magisk.model.entity.recycler.SettingsItem.Callback" /> From c79b79b37ee056b8b25a9fa4890c694db8bbd0a4 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 6 Dec 2019 16:28:41 +0100 Subject: [PATCH 203/254] Cleaned up extensions and utilities in redesign --- .../magisk/redesign/compat/CompatHelpers.kt | 43 ++++++++++ .../magisk/redesign/hide/HideFragment.kt | 82 +------------------ .../magisk/redesign/hide/HideViewModel.kt | 12 +-- .../magisk/redesign/home/HomeViewModel.kt | 23 ++---- .../magisk/redesign/log/LogFragment.kt | 2 +- .../magisk/redesign/log/LogViewModel.kt | 4 +- .../magisk/redesign/module/ModuleFragment.kt | 2 +- .../magisk/redesign/module/ModuleViewModel.kt | 20 +---- .../redesign/settings/SettingsViewModel.kt | 6 +- .../redesign/superuser/SuperuserViewModel.kt | 13 +-- .../magisk/redesign/theme/ThemeViewModel.kt | 7 -- .../magisk/utils/MotionRevealHelper.kt | 82 +++++++++++++++++++ .../com/topjohnwu/magisk/view/MagiskDialog.kt | 2 +- 13 files changed, 148 insertions(+), 150 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatHelpers.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/utils/MotionRevealHelper.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatHelpers.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatHelpers.kt new file mode 100644 index 000000000..8fb894b6d --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatHelpers.kt @@ -0,0 +1,43 @@ +package com.topjohnwu.magisk.redesign.compat + +import androidx.databinding.ViewDataBinding +import com.topjohnwu.magisk.databinding.ComparableRvItem +import com.topjohnwu.magisk.utils.DiffObservableList +import com.topjohnwu.magisk.utils.FilterableDiffObservableList +import me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter +import me.tatarka.bindingcollectionadapter2.ItemBinding +import me.tatarka.bindingcollectionadapter2.OnItemBind + +inline fun > diffListOf( + vararg newItems: T +) = DiffObservableList(object : DiffObservableList.Callback { + override fun areItemsTheSame(oldItem: T, newItem: T) = oldItem.genericItemSameAs(newItem) + override fun areContentsTheSame(oldItem: T, newItem: T) = oldItem.genericContentSameAs(newItem) +}).also { it.update(newItems.toList()) } + +inline fun > filterableListOf( + vararg newItems: T +) = FilterableDiffObservableList(object : DiffObservableList.Callback { + override fun areItemsTheSame(oldItem: T, newItem: T) = oldItem.genericItemSameAs(newItem) + override fun areContentsTheSame(oldItem: T, newItem: T) = oldItem.genericContentSameAs(newItem) +}).also { it.update(newItems.toList()) } + +fun > adapterOf() = object : BindingRecyclerViewAdapter() { + override fun onBindBinding( + binding: ViewDataBinding, + variableId: Int, + layoutRes: Int, + position: Int, + item: T + ) { + super.onBindBinding(binding, variableId, layoutRes, position, item) + item.onBindingBound(binding) + } +} + +inline fun > itemBindingOf( + crossinline body: (ItemBinding<*>) -> Unit = {} +) = OnItemBind { itemBinding, _, item -> + item.bind(itemBinding) + body(itemBinding) +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt index 53a836e14..57fa96a17 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt @@ -1,8 +1,5 @@ package com.topjohnwu.magisk.redesign.hide -import android.animation.Animator -import android.animation.AnimatorSet -import android.animation.ObjectAnimator import android.content.Context import android.graphics.Insets import android.os.Bundle @@ -10,23 +7,15 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View -import androidx.core.animation.addListener -import androidx.core.view.isInvisible import androidx.core.view.isVisible -import androidx.core.view.marginBottom -import androidx.core.view.marginEnd -import androidx.interpolator.view.animation.FastOutSlowInInterpolator import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.google.android.material.circularreveal.CircularRevealCompat -import com.google.android.material.circularreveal.CircularRevealWidget -import com.google.android.material.floatingactionbutton.FloatingActionButton import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentHideMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment import com.topjohnwu.magisk.redesign.compat.hideKeyboard +import com.topjohnwu.magisk.utils.MotionRevealHelper import org.koin.androidx.viewmodel.ext.android.viewModel -import kotlin.math.hypot class HideFragment : CompatFragment() { @@ -94,71 +83,4 @@ class HideFragment : CompatFragment() { return super.onOptionsItemSelected(item) } -} - -object MotionRevealHelper { - - fun withViews( - revealable: CV, - fab: FloatingActionButton, - expanded: Boolean - ) where CV : CircularRevealWidget, CV : View { - revealable.revealInfo = revealable.createRevealInfo(!expanded) - - val revealInfo = revealable.createRevealInfo(expanded) - val revealAnim = revealable.createRevealAnim(revealInfo) - val moveAnim = fab.createMoveAnim(revealInfo) - - AnimatorSet().also { - if (expanded) { - it.play(revealAnim).after(moveAnim) - } else { - it.play(moveAnim).after(revealAnim) - } - }.start() - } - - private fun CV.createRevealAnim( - revealInfo: CircularRevealWidget.RevealInfo - ): Animator where CV : CircularRevealWidget, CV : View = - CircularRevealCompat.createCircularReveal( - this, - revealInfo.centerX, - revealInfo.centerY, - revealInfo.radius - ).apply { - addListener(onStart = { - isVisible = true - }, onEnd = { - if (revealInfo.radius == 0f) { - isInvisible = true - } - }) - } - - private fun FloatingActionButton.createMoveAnim( - revealInfo: CircularRevealWidget.RevealInfo - ): Animator = AnimatorSet().also { - it.interpolator = FastOutSlowInInterpolator() - it.addListener(onStart = { show() }, onEnd = { if (revealInfo.radius != 0f) hide() }) - - val maxX = revealInfo.centerX - marginEnd - measuredWidth / 2f - val targetX = if (revealInfo.radius == 0f) 0f else -maxX - val moveX = ObjectAnimator.ofFloat(this, View.TRANSLATION_X, targetX) - - val maxY = revealInfo.centerY - marginBottom - measuredHeight / 2f - val targetY = if (revealInfo.radius == 0f) 0f else -maxY - val moveY = ObjectAnimator.ofFloat(this, View.TRANSLATION_Y, targetY) - - it.playTogether(moveX, moveY) - } - - private fun View.createRevealInfo(expanded: Boolean): CircularRevealWidget.RevealInfo { - val cX = measuredWidth / 2f - val cY = measuredHeight / 2f - paddingBottom - return CircularRevealWidget.RevealInfo(cX, cY, if (expanded) hypot(cX, cY) else 0f) - } - -} - - +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt index d48d43556..b70d2d3cc 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt @@ -4,7 +4,6 @@ import android.content.pm.ApplicationInfo import androidx.databinding.Bindable import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.data.repository.MagiskRepository -import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.model.entity.HideAppInfo @@ -15,9 +14,8 @@ import com.topjohnwu.magisk.model.entity.recycler.HideItem import com.topjohnwu.magisk.model.entity.recycler.HideProcessItem import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.redesign.compat.Queryable -import com.topjohnwu.magisk.redesign.home.itemBindingOf -import com.topjohnwu.magisk.utils.DiffObservableList -import com.topjohnwu.magisk.utils.FilterableDiffObservableList +import com.topjohnwu.magisk.redesign.compat.filterableListOf +import com.topjohnwu.magisk.redesign.compat.itemBindingOf import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.currentLocale @@ -127,9 +125,3 @@ class HideViewModel( } -inline fun > filterableListOf( - vararg newItems: T -) = FilterableDiffObservableList(object : DiffObservableList.Callback { - override fun areItemsTheSame(oldItem: T, newItem: T) = oldItem.genericItemSameAs(newItem) - override fun areContentsTheSame(oldItem: T, newItem: T) = oldItem.genericContentSameAs(newItem) -}).also { it.update(newItems.toList()) } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 2068f8bf6..3f0093583 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -7,7 +7,6 @@ import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.Info import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.repository.MagiskRepository -import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.* import com.topjohnwu.magisk.model.download.RemoteFileService import com.topjohnwu.magisk.model.entity.MagiskJson @@ -24,12 +23,11 @@ import com.topjohnwu.magisk.model.events.dialog.UninstallDialog import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.model.observer.Observer import com.topjohnwu.magisk.redesign.compat.CompatViewModel +import com.topjohnwu.magisk.redesign.compat.itemBindingOf import com.topjohnwu.magisk.ui.home.MagiskState import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.superuser.Shell import me.tatarka.bindingcollectionadapter2.BR -import me.tatarka.bindingcollectionadapter2.ItemBinding -import me.tatarka.bindingcollectionadapter2.OnItemBind import kotlin.math.roundToInt class HomeViewModel( @@ -179,6 +177,12 @@ class HomeViewModel( } } + private fun String.clipVersion(other: String = ""): String { + val thisVersion = substringBefore('-') + val otherVersion = other.substringBefore('-') + return if (thisVersion != otherVersion) thisVersion else substringAfter('-') + } + } @Suppress("unused") @@ -190,16 +194,3 @@ val ManagerJson.isUpdateChannelCorrect get() = versionCode > 0 val ManagerJson.isObsolete get() = BuildConfig.VERSION_CODE < versionCode - -fun String.clipVersion(other: String = ""): String { - val thisVersion = substringBefore('-') - val otherVersion = other.substringBefore('-') - return if (thisVersion != otherVersion) thisVersion else substringAfter('-') -} - -inline fun > itemBindingOf( - crossinline body: (ItemBinding<*>) -> Unit = {} -) = OnItemBind { itemBinding, _, item -> - item.bind(itemBinding) - body(itemBinding) -} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt index 9af2d842c..1296684c9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt @@ -11,7 +11,7 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentLogMd2Binding import com.topjohnwu.magisk.redesign.MainActivity import com.topjohnwu.magisk.redesign.compat.CompatFragment -import com.topjohnwu.magisk.redesign.hide.MotionRevealHelper +import com.topjohnwu.magisk.utils.MotionRevealHelper import org.koin.androidx.viewmodel.ext.android.viewModel class LogFragment : CompatFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt index 5c69c2239..36d3df982 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt @@ -12,8 +12,8 @@ import com.topjohnwu.magisk.model.entity.recycler.ConsoleItem import com.topjohnwu.magisk.model.entity.recycler.LogItem import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.redesign.compat.CompatViewModel -import com.topjohnwu.magisk.redesign.home.itemBindingOf -import com.topjohnwu.magisk.redesign.superuser.diffListOf +import com.topjohnwu.magisk.redesign.compat.diffListOf +import com.topjohnwu.magisk.redesign.compat.itemBindingOf import com.topjohnwu.superuser.Shell import io.reactivex.Completable import io.reactivex.android.schedulers.AndroidSchedulers diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt index 43062c63e..65d61900b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt @@ -17,8 +17,8 @@ import com.topjohnwu.magisk.redesign.MainActivity import com.topjohnwu.magisk.redesign.ReselectionTarget import com.topjohnwu.magisk.redesign.compat.CompatFragment import com.topjohnwu.magisk.redesign.compat.hideKeyboard -import com.topjohnwu.magisk.redesign.hide.MotionRevealHelper import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener +import com.topjohnwu.magisk.utils.MotionRevealHelper import org.koin.androidx.viewmodel.ext.android.viewModel class ModuleFragment : CompatFragment(), diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index 6fdb66661..494b9f4ed 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -2,7 +2,6 @@ package com.topjohnwu.magisk.redesign.module import androidx.annotation.WorkerThread import androidx.databinding.Bindable -import androidx.databinding.ViewDataBinding import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R @@ -19,17 +18,13 @@ import com.topjohnwu.magisk.model.entity.recycler.* import com.topjohnwu.magisk.model.events.InstallExternalModuleEvent import com.topjohnwu.magisk.model.events.OpenChangelogEvent import com.topjohnwu.magisk.model.events.dialog.ModuleInstallDialog -import com.topjohnwu.magisk.redesign.compat.CompatViewModel -import com.topjohnwu.magisk.redesign.compat.Queryable -import com.topjohnwu.magisk.redesign.home.itemBindingOf -import com.topjohnwu.magisk.redesign.superuser.diffListOf +import com.topjohnwu.magisk.redesign.compat.* import com.topjohnwu.magisk.tasks.RepoUpdater import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.currentLocale import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable -import me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter import timber.log.Timber import kotlin.math.roundToInt @@ -293,17 +288,4 @@ class ModuleViewModel( private fun List.prependIfNotEmpty(item: () -> T) = prependIf(isNotEmpty(), item) -} - -fun > adapterOf() = object : BindingRecyclerViewAdapter() { - override fun onBindBinding( - binding: ViewDataBinding, - variableId: Int, - layoutRes: Int, - position: Int, - item: T - ) { - super.onBindBinding(binding, variableId, layoutRes, position, item) - item.onBindingBound(binding) - } } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt index 58faf4df2..f0013009f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt @@ -17,9 +17,9 @@ import com.topjohnwu.magisk.model.events.RecreateEvent import com.topjohnwu.magisk.model.events.dialog.BiometricDialog import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.redesign.compat.CompatViewModel -import com.topjohnwu.magisk.redesign.home.itemBindingOf -import com.topjohnwu.magisk.redesign.module.adapterOf -import com.topjohnwu.magisk.redesign.superuser.diffListOf +import com.topjohnwu.magisk.redesign.compat.adapterOf +import com.topjohnwu.magisk.redesign.compat.diffListOf +import com.topjohnwu.magisk.redesign.compat.itemBindingOf import com.topjohnwu.magisk.utils.PatchAPK import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.superuser.Shell diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt index 2ad85f284..7a22b1e2a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt @@ -18,9 +18,9 @@ import com.topjohnwu.magisk.model.events.dialog.BiometricDialog import com.topjohnwu.magisk.model.events.dialog.SuperuserRevokeDialog import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.redesign.compat.CompatViewModel -import com.topjohnwu.magisk.redesign.home.itemBindingOf +import com.topjohnwu.magisk.redesign.compat.diffListOf +import com.topjohnwu.magisk.redesign.compat.itemBindingOf import com.topjohnwu.magisk.utils.BiometricHelper -import com.topjohnwu.magisk.utils.DiffObservableList import com.topjohnwu.magisk.utils.currentLocale import io.reactivex.Single @@ -142,11 +142,4 @@ class SuperuserViewModel( private fun deletePolicy(policy: MagiskPolicy) = db.delete(policy.uid).andThen(Single.just(policy)) -} - -inline fun > diffListOf( - vararg newItems: T -) = DiffObservableList(object : DiffObservableList.Callback { - override fun areItemsTheSame(oldItem: T, newItem: T) = oldItem.genericItemSameAs(newItem) - override fun areContentsTheSame(oldItem: T, newItem: T) = oldItem.genericContentSameAs(newItem) -}).also { it.update(newItems.toList()) } \ No newline at end of file +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt index 2e792ae36..35c9d0876 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt @@ -1,19 +1,12 @@ package com.topjohnwu.magisk.redesign.theme -import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.model.entity.recycler.TappableHeadlineItem -import com.topjohnwu.magisk.model.entity.recycler.ThemeItem import com.topjohnwu.magisk.model.events.RecreateEvent import com.topjohnwu.magisk.model.events.dialog.DarkThemeDialog import com.topjohnwu.magisk.redesign.compat.CompatViewModel -import com.topjohnwu.magisk.redesign.home.itemBindingOf -import com.topjohnwu.magisk.redesign.superuser.diffListOf class ThemeViewModel : CompatViewModel(), TappableHeadlineItem.Listener { - val items = diffListOf(*Theme.values().map { ThemeItem(it) }.toTypedArray()) - val itemBinding = itemBindingOf { it.bindExtra(BR.viewModel, this) } - val themeHeadline = TappableHeadlineItem.ThemeMode override fun onItemPressed(item: TappableHeadlineItem) = when (item) { diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/MotionRevealHelper.kt b/app/src/main/java/com/topjohnwu/magisk/utils/MotionRevealHelper.kt new file mode 100644 index 000000000..df7254c1f --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/utils/MotionRevealHelper.kt @@ -0,0 +1,82 @@ +package com.topjohnwu.magisk.utils + +import android.animation.Animator +import android.animation.AnimatorSet +import android.animation.ObjectAnimator +import android.view.View +import androidx.core.animation.addListener +import androidx.core.view.isInvisible +import androidx.core.view.isVisible +import androidx.core.view.marginBottom +import androidx.core.view.marginEnd +import androidx.interpolator.view.animation.FastOutSlowInInterpolator +import com.google.android.material.circularreveal.CircularRevealCompat +import com.google.android.material.circularreveal.CircularRevealWidget +import com.google.android.material.floatingactionbutton.FloatingActionButton +import kotlin.math.hypot + +object MotionRevealHelper { + + fun withViews( + revealable: CV, + fab: FloatingActionButton, + expanded: Boolean + ) where CV : CircularRevealWidget, CV : View { + revealable.revealInfo = revealable.createRevealInfo(!expanded) + + val revealInfo = revealable.createRevealInfo(expanded) + val revealAnim = revealable.createRevealAnim(revealInfo) + val moveAnim = fab.createMoveAnim(revealInfo) + + AnimatorSet().also { + if (expanded) { + it.play(revealAnim).after(moveAnim) + } else { + it.play(moveAnim).after(revealAnim) + } + }.start() + } + + private fun CV.createRevealAnim( + revealInfo: CircularRevealWidget.RevealInfo + ): Animator where CV : CircularRevealWidget, CV : View = + CircularRevealCompat.createCircularReveal( + this, + revealInfo.centerX, + revealInfo.centerY, + revealInfo.radius + ).apply { + addListener(onStart = { + isVisible = true + }, onEnd = { + if (revealInfo.radius == 0f) { + isInvisible = true + } + }) + } + + private fun FloatingActionButton.createMoveAnim( + revealInfo: CircularRevealWidget.RevealInfo + ): Animator = AnimatorSet().also { + it.interpolator = FastOutSlowInInterpolator() + it.addListener(onStart = { show() }, onEnd = { if (revealInfo.radius != 0f) hide() }) + + // fixme rtl + val maxX = revealInfo.centerX - marginEnd - measuredWidth / 2f + val targetX = if (revealInfo.radius == 0f) 0f else -maxX + val moveX = ObjectAnimator.ofFloat(this, View.TRANSLATION_X, targetX) + + val maxY = revealInfo.centerY - marginBottom - measuredHeight / 2f + val targetY = if (revealInfo.radius == 0f) 0f else -maxY + val moveY = ObjectAnimator.ofFloat(this, View.TRANSLATION_Y, targetY) + + it.playTogether(moveX, moveY) + } + + private fun View.createRevealInfo(expanded: Boolean): CircularRevealWidget.RevealInfo { + val cX = measuredWidth / 2f + val cY = measuredHeight / 2f - paddingBottom + return CircularRevealWidget.RevealInfo(cX, cY, if (expanded) hypot(cX, cY) else 0f) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt index e4659c31e..b2a088cf5 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt @@ -19,7 +19,7 @@ import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.databinding.DialogMagiskBaseBinding -import com.topjohnwu.magisk.redesign.home.itemBindingOf +import com.topjohnwu.magisk.redesign.compat.itemBindingOf import com.topjohnwu.magisk.utils.KObservableField import me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapters import me.tatarka.bindingcollectionadapter2.ItemBinding From 848be8f806af2db1c040ad38d01002c06bcd4f7e Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 6 Dec 2019 18:06:59 +0100 Subject: [PATCH 204/254] Fixed rtl for reveal animations --- .../java/com/topjohnwu/magisk/utils/MotionRevealHelper.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/MotionRevealHelper.kt b/app/src/main/java/com/topjohnwu/magisk/utils/MotionRevealHelper.kt index df7254c1f..5fe6fc09e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/MotionRevealHelper.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/MotionRevealHelper.kt @@ -5,6 +5,7 @@ import android.animation.AnimatorSet import android.animation.ObjectAnimator import android.view.View import androidx.core.animation.addListener +import androidx.core.text.layoutDirection import androidx.core.view.isInvisible import androidx.core.view.isVisible import androidx.core.view.marginBottom @@ -61,9 +62,9 @@ object MotionRevealHelper { it.interpolator = FastOutSlowInInterpolator() it.addListener(onStart = { show() }, onEnd = { if (revealInfo.radius != 0f) hide() }) - // fixme rtl + val rtlMod = if (currentLocale.layoutDirection == View.LAYOUT_DIRECTION_RTL) 1f else -1f val maxX = revealInfo.centerX - marginEnd - measuredWidth / 2f - val targetX = if (revealInfo.radius == 0f) 0f else -maxX + val targetX = if (revealInfo.radius == 0f) 0f else maxX * rtlMod val moveX = ObjectAnimator.ofFloat(this, View.TRANSLATION_X, targetX) val maxY = revealInfo.centerY - marginBottom - measuredHeight / 2f From eae4eff92f59ef1d093e93bd50560248c8058d95 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 6 Dec 2019 20:34:25 +0100 Subject: [PATCH 205/254] Fixed custom dialog behaving oddly while displaying scrollable content --- .../com/topjohnwu/magisk/view/MagiskDialog.kt | 29 +++++++-- .../main/res/layout/dialog_magisk_base.xml | 63 ++++++++++--------- 2 files changed, 58 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt index b2a088cf5..30107bfbf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt @@ -9,9 +9,12 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.WindowManager import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatDialog +import androidx.core.view.ViewCompat +import androidx.core.view.updatePadding import androidx.databinding.ViewDataBinding import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -26,7 +29,7 @@ import me.tatarka.bindingcollectionadapter2.ItemBinding class MagiskDialog @JvmOverloads constructor( context: Context, theme: Int = 0 -) : AlertDialog(context, theme) { +) : AppCompatDialog(context, theme) { private val binding: DialogMagiskBaseBinding = DialogMagiskBaseBinding.inflate(LayoutInflater.from(context)) @@ -34,12 +37,30 @@ class MagiskDialog @JvmOverloads constructor( init { binding.setVariable(BR.data, data) - super.setView(binding.root) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + super.setContentView(binding.root) + window?.apply { + setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT + ) + } + + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, insets -> + view.updatePadding( + top = view.paddingTop + insets.systemWindowInsetTop, + bottom = view.paddingBottom + insets.systemWindowInsetBottom + ) + insets + } + + binding.dialogBaseOutsideContainer.setOnClickListener { + setCanceledOnTouchOutside(true) + } } inner class Data { diff --git a/app/src/main/res/layout/dialog_magisk_base.xml b/app/src/main/res/layout/dialog_magisk_base.xml index 7fa4bb7a3..e2d752533 100644 --- a/app/src/main/res/layout/dialog_magisk_base.xml +++ b/app/src/main/res/layout/dialog_magisk_base.xml @@ -13,6 +13,7 @@ - - + android:layout_height="wrap_content"> - + - + - + + app:layout_constraintBottom_toTopOf="@+id/dialog_base_buttons" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" /> - + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent"> - + From 85a350b6c8aee306bce50e6ad20db06092f00b1d Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 6 Dec 2019 20:53:22 +0100 Subject: [PATCH 206/254] Fixed minor RTL issues --- app/src/main/res/drawable/ic_back_md2.xml | 1 + app/src/main/res/layout/include_hide_filter.xml | 1 + app/src/main/res/layout/item_developer_link.xml | 2 ++ app/src/main/res/layout/item_policy_md2.xml | 5 +++-- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/drawable/ic_back_md2.xml b/app/src/main/res/drawable/ic_back_md2.xml index e4af14d80..2342f12e4 100644 --- a/app/src/main/res/drawable/ic_back_md2.xml +++ b/app/src/main/res/drawable/ic_back_md2.xml @@ -1,6 +1,7 @@ @@ -37,6 +38,7 @@ android:id="@+id/developer_more" style="@style/WidgetFoundation.Image.Small" android:layout_height="14sp" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="@+id/developer_link" app:layout_constraintStart_toEndOf="@+id/developer_link" app:layout_constraintTop_toTopOf="@+id/developer_link" diff --git a/app/src/main/res/layout/item_policy_md2.xml b/app/src/main/res/layout/item_policy_md2.xml index 512ece463..ac662a1a6 100644 --- a/app/src/main/res/layout/item_policy_md2.xml +++ b/app/src/main/res/layout/item_policy_md2.xml @@ -148,10 +148,11 @@ style="@style/WidgetFoundation.Icon" isEnabled="@{item.isEnabled}" isSelected="@{item.isExpanded}" - android:layout_gravity="top|end" + android:layout_gravity="top|right" android:onClick="@{(view) -> item.toggle(view)}" android:rotation="@{item.isExpanded ? 225 : 180}" - app:srcCompat="@drawable/ic_more_collapse" /> + app:srcCompat="@drawable/ic_more_collapse" + tools:ignore="RtlHardcoded" /> From 3bda7cb26b1efd29e2e14dfc32a3b9f6b65dfb9e Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 13 Dec 2019 14:41:49 +0100 Subject: [PATCH 207/254] Removed exclusive usage of 29 level API --- .../topjohnwu/magisk/redesign/hide/HideViewModel.kt | 8 ++------ .../magisk/redesign/module/ModuleViewModel.kt | 8 ++------ .../topjohnwu/magisk/utils/DataBindingAdapters.kt | 13 ------------- 3 files changed, 4 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt index b70d2d3cc..13744d4d3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt @@ -82,12 +82,8 @@ class HideViewModel( // --- override fun submitQuery() { - if (!queryHandler.hasCallbacks(queryRunnable)) { - queryHandler.post(queryRunnable) - } else { - queryHandler.removeCallbacks(queryRunnable) - queryHandler.postDelayed(queryRunnable, queryDelay) - } + queryHandler.removeCallbacks(queryRunnable) + queryHandler.postDelayed(queryRunnable, queryDelay) } private fun query( diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index 494b9f4ed..84648a5be 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -165,12 +165,8 @@ class ModuleViewModel( // --- override fun submitQuery() { - if (!queryHandler.hasCallbacks(queryRunnable)) { - queryHandler.post(queryRunnable) - } else { - queryHandler.removeCallbacks(queryRunnable) - queryHandler.postDelayed(queryRunnable, queryDelay) - } + queryHandler.removeCallbacks(queryRunnable) + queryHandler.postDelayed(queryRunnable, queryDelay) } private fun queryInternal(query: String, offset: Int): Single> { diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index 69462e5bd..fc10e2410 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -17,7 +17,6 @@ import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.Toolbar import androidx.core.animation.doOnEnd import androidx.core.view.* -import androidx.core.widget.NestedScrollView import androidx.databinding.BindingAdapter import androidx.databinding.InverseBindingAdapter import androidx.databinding.InverseBindingListener @@ -427,18 +426,6 @@ fun Chip.setOnCloseClickedListenerBinding(listener: View.OnClickListener) { setOnCloseIconClickListener(listener) } -@BindingAdapter("onScrollStateChanged") -fun NestedScrollView.setOnScrollStateChangeListener(listener: Runnable) { - setOnScrollChangeListener { _: NestedScrollView?, _: Int, _: Int, _: Int, _: Int -> - if (!handler.hasCallbacks(listener)) { - listener.run() - } else { - handler.removeCallbacksAndMessages(null) - } - handler.postDelayed(listener, 1000) - } -} - @BindingAdapter("progressAnimated") fun ProgressBar.setProgressAnimated(newProgress: Int) { val animator = tag as? ValueAnimator From 89b1fa341bbb0de7807f0c1710360cf96fdf95a3 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Fri, 13 Dec 2019 15:18:47 +0100 Subject: [PATCH 208/254] Added assigning repo to installed modules to show readme Close #1089 --- .../com/topjohnwu/magisk/data/database/Repo.kt | 3 +++ .../magisk/model/entity/recycler/ModuleRvItem.kt | 7 +++++++ .../magisk/redesign/module/ModuleViewModel.kt | 11 +++++++++++ app/src/main/res/layout/item_module_md2.xml | 14 ++++++++++++++ 4 files changed, 35 insertions(+) diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt index c97dd8ed7..fd13b9ecb 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt @@ -14,6 +14,9 @@ interface RepoBase { @Query("SELECT * FROM repos WHERE id = :id AND versionCode > :versionCode LIMIT 1") fun getUpdatableRepoById(id: String, versionCode: Int): Repo? + @Query("SELECT * FROM repos WHERE id = :id LIMIT 1") + fun getRepoById(id: String): Repo? + companion object { const val LIMIT = 10 } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt index b748ffc94..3d4bb21a7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt @@ -170,6 +170,13 @@ class ModuleItem(val item: Module) : ObservableItem(), Observable { override val layoutRes = R.layout.item_module_md2 + @get:Bindable + var repo: Repo? = null + set(value) { + field = value + notifyChange(BR.repo) + } + @get:Bindable var isEnabled = item.enable set(value) { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index 84648a5be..362802949 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -129,6 +129,7 @@ class ModuleViewModel( override fun refresh() = Single.fromCallable { Module.loadModules() } .map { it.map { ModuleItem(it) } } .map { it.order() } + .map { it.loadDetail() } .map { build(active = it, updatable = loadUpdates(it)) } .map { it to items.calculateDiff(it) } .applyViewModel(this) @@ -222,6 +223,13 @@ class ModuleViewModel( .sortedBy { it.item.name.toLowerCase(currentLocale) } .toList() + @WorkerThread + private fun List.loadDetail() = onEach { module -> + Single.fromCallable { dao.getRepoById(module.item.id)!! } + .subscribeK { module.repo = it } + .add() + } + private fun update(repo: Repo, progress: Int) = Single.fromCallable { itemsRemote + itemsSearch } .map { it.first { it.item.id == repo.id } } @@ -263,6 +271,9 @@ class ModuleViewModel( fun downloadPressed(item: RepoItem) = ModuleInstallDialog(item.item).publish() fun installPressed() = InstallExternalModuleEvent().publish() fun infoPressed(item: RepoItem) = OpenChangelogEvent(item.item).publish() + fun infoPressed(item: ModuleItem) { + OpenChangelogEvent(item.repo ?: return).publish() + } // --- diff --git a/app/src/main/res/layout/item_module_md2.xml b/app/src/main/res/layout/item_module_md2.xml index efdc590ca..f06d5561b 100644 --- a/app/src/main/res/layout/item_module_md2.xml +++ b/app/src/main/res/layout/item_module_md2.xml @@ -97,7 +97,21 @@ android:background="?colorSurfaceVariant" app:layout_constraintTop_toBottomOf="@+id/module_description" /> + + Date: Fri, 3 Jan 2020 02:06:53 +0800 Subject: [PATCH 209/254] Remove dexter dependency --- app/build.gradle | 1 - .../magisk/model/events/EventExecutors.kt | 6 +-- .../events/InstallExternalModuleEvent.kt | 5 +- .../magisk/model/events/SnackbarEvent.kt | 3 +- .../magisk/model/events/ViewEvents.kt | 53 ++++++------------- .../model/events/dialog/BiometricDialog.kt | 6 +-- .../model/events/dialog/DarkThemeDialog.kt | 6 +-- .../model/navigation/MagiskNavigationEvent.kt | 6 +-- .../magisk/redesign/compat/CompatDelegate.kt | 8 +-- 9 files changed, 34 insertions(+), 60 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c335fa2a2..6aa066dc4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -132,5 +132,4 @@ dependencies { implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.core:core-ktx:1.1.0' implementation 'com.google.android.material:material:1.2.0-alpha01' - implementation 'com.karumi:dexter:6.0.0' } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/EventExecutors.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/EventExecutors.kt index 8039a38e6..a1e3c2e8e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/EventExecutors.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/EventExecutors.kt @@ -1,8 +1,8 @@ package com.topjohnwu.magisk.model.events import android.content.Context -import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment +import com.topjohnwu.magisk.base.BaseActivity interface ContextExecutor { @@ -12,7 +12,7 @@ interface ContextExecutor { interface ActivityExecutor { - operator fun invoke(activity: AppCompatActivity) + operator fun invoke(activity: BaseActivity<*, *>) } @@ -20,4 +20,4 @@ interface FragmentExecutor { operator fun invoke(fragment: Fragment) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt index aed2ac426..2351df069 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt @@ -3,7 +3,6 @@ package com.topjohnwu.magisk.model.events import android.app.Activity import android.content.Context import android.content.Intent -import androidx.appcompat.app.AppCompatActivity import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.base.BaseActivity import com.topjohnwu.magisk.intent @@ -11,7 +10,7 @@ import com.topjohnwu.magisk.ui.flash.FlashActivity class InstallExternalModuleEvent : ViewEvent(), ActivityExecutor { - override fun invoke(activity: AppCompatActivity) { + override fun invoke(activity: BaseActivity<*, *>) { activity as BaseActivity<*, *> activity.withExternalRW { onSuccess { @@ -35,4 +34,4 @@ class InstallExternalModuleEvent : ViewEvent(), ActivityExecutor { } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/SnackbarEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/SnackbarEvent.kt index 61a878a49..4bf757aa3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/SnackbarEvent.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/SnackbarEvent.kt @@ -2,7 +2,6 @@ package com.topjohnwu.magisk.model.events import android.content.Context import androidx.annotation.StringRes -import androidx.appcompat.app.AppCompatActivity import com.google.android.material.snackbar.Snackbar import com.topjohnwu.magisk.base.BaseActivity import com.topjohnwu.magisk.extensions.snackbar @@ -28,7 +27,7 @@ class SnackbarEvent private constructor( fun message(context: Context): String = messageString ?: context.getString(messageRes) - override fun invoke(activity: AppCompatActivity) { + override fun invoke(activity: BaseActivity<*, *>) { if (activity is BaseActivity<*, *>) { activity.snackbar(activity.snackbarView, message(activity), length, f) } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt index 94305b615..126387c91 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt @@ -3,12 +3,6 @@ package com.topjohnwu.magisk.model.events import android.app.Activity import android.content.Context import android.content.Intent -import androidx.appcompat.app.AppCompatActivity -import com.karumi.dexter.Dexter -import com.karumi.dexter.MultiplePermissionsReport -import com.karumi.dexter.PermissionToken -import com.karumi.dexter.listener.PermissionRequest -import com.karumi.dexter.listener.multi.MultiplePermissionsListener import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R import com.topjohnwu.magisk.base.BaseActivity @@ -17,7 +11,6 @@ import com.topjohnwu.magisk.extensions.DynamicClassLoader import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.extensions.writeTo import com.topjohnwu.magisk.model.entity.module.Repo -import com.topjohnwu.magisk.model.permissions.PermissionRequestBuilder import com.topjohnwu.magisk.utils.RxBus import com.topjohnwu.magisk.utils.SafetyNetHelper import com.topjohnwu.magisk.view.MagiskDialog @@ -137,7 +130,7 @@ class UpdateSafetyNetEvent : ViewEvent(), ContextExecutor, KoinComponent, Safety } class ViewActionEvent(val action: BaseActivity<*, *>.() -> Unit) : ViewEvent(), ActivityExecutor { - override fun invoke(activity: AppCompatActivity) = (activity as BaseActivity<*, *>).run(action) + override fun invoke(activity: BaseActivity<*, *>) = (activity as BaseActivity<*, *>).run(action) } class OpenFilePickerEvent : ViewEvent() @@ -157,54 +150,38 @@ class PermissionEvent( val callback: PublishSubject ) : ViewEvent(), ActivityExecutor { - private val permissionRequest = PermissionRequestBuilder().apply { - onSuccess { - callback.onNext(true) - } - onFailure { - callback.onNext(false) - callback.onError(SecurityException("User refused permissions")) - } - }.build() - - override fun invoke(activity: AppCompatActivity) = Dexter.withActivity(activity) - .withPermissions(permissions) - .withListener(object : MultiplePermissionsListener { - override fun onPermissionRationaleShouldBeShown( - permissions: MutableList, - token: PermissionToken - ) = token.continuePermissionRequest() - - override fun onPermissionsChecked( - report: MultiplePermissionsReport - ) = if (report.areAllPermissionsGranted()) { - permissionRequest.onSuccess() - } else { - permissionRequest.onFailure() + override fun invoke(activity: BaseActivity<*, *>) = + activity.withPermissions(*permissions.toTypedArray()) { + onSuccess { + callback.onNext(true) } - }).check() + onFailure { + callback.onNext(false) + callback.onError(SecurityException("User refused permissions")) + } + } } class BackPressEvent : ViewEvent(), ActivityExecutor { - override fun invoke(activity: AppCompatActivity) { + override fun invoke(activity: BaseActivity<*, *>) { activity.onBackPressed() } } class DieEvent : ViewEvent(), ActivityExecutor { - override fun invoke(activity: AppCompatActivity) { + override fun invoke(activity: BaseActivity<*, *>) { activity.finish() } } class RecreateEvent : ViewEvent(), ActivityExecutor { - override fun invoke(activity: AppCompatActivity) { + override fun invoke(activity: BaseActivity<*, *>) { activity.recreate() } } class RequestFileEvent : ViewEvent(), ActivityExecutor { - override fun invoke(activity: AppCompatActivity) { + override fun invoke(activity: BaseActivity<*, *>) { Intent(Intent.ACTION_GET_CONTENT) .setType("*/*") .addCategory(Intent.CATEGORY_OPENABLE) @@ -218,4 +195,4 @@ class RequestFileEvent : ViewEvent(), ActivityExecutor { ?.takeIf { requestCode == REQUEST_CODE } ?.data } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt index a47a06309..5d2258686 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt @@ -1,6 +1,6 @@ package com.topjohnwu.magisk.model.events.dialog -import androidx.appcompat.app.AppCompatActivity +import com.topjohnwu.magisk.base.BaseActivity import com.topjohnwu.magisk.model.events.ActivityExecutor import com.topjohnwu.magisk.model.events.ViewEvent import com.topjohnwu.magisk.utils.BiometricHelper @@ -16,7 +16,7 @@ class BiometricDialog( builder(Builder()) } - override fun invoke(activity: AppCompatActivity) { + override fun invoke(activity: BaseActivity<*, *>) { BiometricHelper.authenticate( activity, onError = listenerOnFailure, @@ -35,4 +35,4 @@ class BiometricDialog( } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DarkThemeDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DarkThemeDialog.kt index 0c62622df..68e8d0780 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DarkThemeDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DarkThemeDialog.kt @@ -1,10 +1,10 @@ package com.topjohnwu.magisk.model.events.dialog import android.app.Activity -import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.base.BaseActivity import com.topjohnwu.magisk.model.events.ActivityExecutor import com.topjohnwu.magisk.view.MagiskDialog import java.lang.ref.WeakReference @@ -13,7 +13,7 @@ class DarkThemeDialog : DialogEvent(), ActivityExecutor { private var activity: WeakReference? = null - override fun invoke(activity: AppCompatActivity) { + override fun invoke(activity: BaseActivity<*, *>) { this.activity = WeakReference(activity) } @@ -47,4 +47,4 @@ class DarkThemeDialog : DialogEvent(), ActivityExecutor { } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt index a5cf30cac..c5df8ee47 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt @@ -3,8 +3,8 @@ package com.topjohnwu.magisk.model.navigation import android.os.Bundle import androidx.annotation.AnimRes import androidx.annotation.AnimatorRes -import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment +import com.topjohnwu.magisk.base.BaseActivity import com.topjohnwu.magisk.model.events.ActivityExecutor import com.topjohnwu.magisk.model.events.ViewEvent import com.topjohnwu.magisk.redesign.compat.CompatActivity @@ -23,7 +23,7 @@ class MagiskNavigationEvent( operator fun invoke(builder: Builder.() -> Unit) = Builder().apply(builder).build() } - override fun invoke(activity: AppCompatActivity) { + override fun invoke(activity: BaseActivity<*, *>) { if (activity !is CompatActivity<*, *>) return activity.navigation?.navigateTo(this) } @@ -91,4 +91,4 @@ class MagiskAnimBuilder { var popExit = 0 val anySet: Boolean get() = enter != 0 || exit != 0 || popEnter != 0 || popExit != 0 -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt index cd4792956..69b8b50cf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt @@ -2,10 +2,10 @@ package com.topjohnwu.magisk.redesign.compat import android.graphics.Insets import android.view.View -import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.Fragment +import com.topjohnwu.magisk.base.BaseActivity import com.topjohnwu.magisk.model.events.ActivityExecutor import com.topjohnwu.magisk.model.events.ContextExecutor import com.topjohnwu.magisk.model.events.FragmentExecutor @@ -26,7 +26,7 @@ class CompatDelegate internal constructor( view.viewModel.requestRefresh() } - fun onEventExecute(event: ViewEvent, activity: AppCompatActivity) { + fun onEventExecute(event: ViewEvent, activity: BaseActivity<*, *>) { (event as? ContextExecutor)?.invoke(activity) (event as? ActivityExecutor)?.invoke(activity) (event as? FragmentExecutor)?.let { @@ -37,7 +37,7 @@ class CompatDelegate internal constructor( fun onEventExecute(event: ViewEvent, fragment: Fragment) { (event as? ContextExecutor)?.invoke(fragment.requireContext()) (event as? FragmentExecutor)?.invoke(fragment) - (event as? ActivityExecutor)?.invoke(fragment.requireActivity() as AppCompatActivity) + (event as? ActivityExecutor)?.invoke(fragment.requireActivity() as BaseActivity<*, *>) } private fun ensureInsets() { @@ -74,4 +74,4 @@ class CompatDelegate internal constructor( insets.systemWindowInsetBottom - bottom ) -} \ No newline at end of file +} From 7e9b3f1a60dfe1081856e0262d1e57d4da0a562e Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sat, 4 Jan 2020 04:48:13 +0800 Subject: [PATCH 210/254] Merge components --- app/src/main/AndroidManifest.xml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e73a2004..f8512c230 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,6 +20,10 @@ + + + + @@ -30,15 +34,6 @@ android:windowSoftInputMode="adjustResize" android:exported="true" /> - - - - - - - From 67b5f39df21b103af821bcf25e4219e06f9bb1c3 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 4 Jan 2020 11:52:29 +0100 Subject: [PATCH 211/254] Updated device info view to be expanded by default --- .../com/topjohnwu/magisk/redesign/home/HomeViewModel.kt | 1 - app/src/main/res/layout/fragment_home_md2.xml | 6 +----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 3f0093583..509c42de8 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -64,7 +64,6 @@ class HomeViewModel( val stateMagiskExpanded = KObservableField(false) val stateManagerExpanded = KObservableField(false) - val stateDeviceExpanded = KObservableField(false) val stateHideManagerName = R.string.manager.res().let { if (!statePackageOriginal) { diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 7b5608040..5c922ea50 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -98,7 +98,6 @@ android:layout_gravity="center" android:layout_marginStart="@dimen/l1" android:layout_marginEnd="@dimen/l1" - android:onClick="@{() -> viewModel.toggle(viewModel.stateDeviceExpanded)}" app:layout_constrainedWidth="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -192,15 +191,12 @@ + app:layout_constraintTop_toTopOf="parent"> Date: Sat, 4 Jan 2020 13:30:21 +0100 Subject: [PATCH 212/254] Updated navigation behavior to be consistent and easily manageable --- .../topjohnwu/magisk/redesign/MainActivity.kt | 46 +++++++------------ .../utils/HideBottomViewOnScrollBehavior.kt | 45 +++++++++++++++--- .../utils/HideTopViewOnScrollBehavior.kt | 34 +++++++++++--- .../magisk/utils/HideableBehavior.kt | 9 ++++ 4 files changed, 92 insertions(+), 42 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/utils/HideableBehavior.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index 8d0e43c2e..d08fb6c8b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -3,14 +3,12 @@ package com.topjohnwu.magisk.redesign import android.graphics.Insets import android.os.Bundle import android.view.MenuItem -import android.view.ViewGroup +import android.view.View import android.view.ViewTreeObserver import androidx.coordinatorlayout.widget.CoordinatorLayout -import androidx.core.view.isVisible import androidx.core.view.setPadding import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment -import androidx.interpolator.view.animation.FastOutSlowInInterpolator import com.google.android.material.card.MaterialCardView import com.ncapdevi.fragnav.FragNavController import com.topjohnwu.magisk.Const @@ -25,6 +23,7 @@ import com.topjohnwu.magisk.redesign.module.ModuleFragment import com.topjohnwu.magisk.redesign.superuser.SuperuserFragment import com.topjohnwu.magisk.utils.HideBottomViewOnScrollBehavior import com.topjohnwu.magisk.utils.HideTopViewOnScrollBehavior +import com.topjohnwu.magisk.utils.HideableBehavior import com.topjohnwu.superuser.Shell import org.koin.androidx.viewmodel.ext.android.viewModel import kotlin.reflect.KClass @@ -84,10 +83,9 @@ open class MainActivity : CompatActivity( if (savedInstanceState != null) { onTabTransaction(null, -1) - onFragmentTransaction(null, FragNavController.TransactionType.PUSH) if (!navigation.isRoot) { - requestNavigationHidden(animate = false) + requestNavigationHidden() } } } @@ -114,19 +112,13 @@ open class MainActivity : CompatActivity( return true } - override fun onTabTransaction(fragment: Fragment?, index: Int) { - setDisplayHomeAsUpEnabled(false) - } + override fun onTabTransaction(fragment: Fragment?, index: Int) = + onFragmentTransaction(fragment, FragNavController.TransactionType.PUSH) override fun onFragmentTransaction( fragment: Fragment?, transactionType: FragNavController.TransactionType ) { - binding.mainToolbarWrapper.animate() - .translationY(0f) - .setInterpolator(FastOutSlowInInterpolator()) - .start() - setDisplayHomeAsUpEnabled(!navigation.isRoot) requestNavigationHidden(!navigation.isRoot) } @@ -143,25 +135,19 @@ open class MainActivity : CompatActivity( } } - internal fun requestNavigationHidden(hide: Boolean = true, animate: Boolean = true) { - val lapam = binding.mainBottomBar.layoutParams as ViewGroup.MarginLayoutParams - val height = binding.mainBottomBar.measuredHeight - val verticalMargin = lapam.let { it.topMargin + it.bottomMargin } - val maxTranslation = height + verticalMargin - val translation = if (!hide) 0 else maxTranslation + @Suppress("UNCHECKED_CAST") + internal fun requestNavigationHidden(hide: Boolean = true) { + val topView = binding.mainToolbarWrapper + val bottomView = binding.mainBottomBar - if (!animate) { - binding.mainBottomBar.translationY = translation.toFloat() - binding.mainBottomBar.isVisible = !hide - return - } + val topParams = topView.layoutParams as? CoordinatorLayout.LayoutParams + val bottomParams = bottomView.layoutParams as? CoordinatorLayout.LayoutParams - binding.mainBottomBar.animate() - .translationY(translation.toFloat()) - .setInterpolator(FastOutSlowInInterpolator()) - .withStartAction { if (!hide) binding.mainBottomBar.isVisible = true } - .withEndAction { if (hide) binding.mainBottomBar.isVisible = false } - .start() + val topBehavior = topParams?.behavior as? HideableBehavior + val bottomBehavior = bottomParams?.behavior as? HideableBehavior + + topBehavior?.setHidden(topView, hide = false, lockState = false) + bottomBehavior?.setHidden(bottomView, hide, hide) } fun invalidateToolbar() { diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/HideBottomViewOnScrollBehavior.kt b/app/src/main/java/com/topjohnwu/magisk/utils/HideBottomViewOnScrollBehavior.kt index 521a1fd5d..d3009f56a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/HideBottomViewOnScrollBehavior.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/HideBottomViewOnScrollBehavior.kt @@ -11,14 +11,17 @@ import com.google.android.material.snackbar.Snackbar import com.topjohnwu.magisk.R import kotlin.math.roundToInt -class HideBottomViewOnScrollBehavior : HideBottomViewOnScrollBehavior() { +class HideBottomViewOnScrollBehavior : HideBottomViewOnScrollBehavior(), + HideableBehavior { - override fun layoutDependsOn(parent: CoordinatorLayout, child: T, dependency: View) = + private var lockState: Boolean = false + + override fun layoutDependsOn(parent: CoordinatorLayout, child: V, dependency: View) = super.layoutDependsOn(parent, child, dependency) or (dependency is Snackbar.SnackbarLayout) override fun onDependentViewChanged( parent: CoordinatorLayout, - child: T, + child: V, dependency: View ) = when (dependency) { is Snackbar.SnackbarLayout -> onDependentViewChanged(parent, child, dependency) @@ -27,7 +30,7 @@ class HideBottomViewOnScrollBehavior : HideBottomViewOnScrollBehavior< override fun onDependentViewRemoved( parent: CoordinatorLayout, - child: T, + child: V, dependency: View ) = when (dependency) { is Snackbar.SnackbarLayout -> onDependentViewRemoved(parent, child, dependency) @@ -38,7 +41,7 @@ class HideBottomViewOnScrollBehavior : HideBottomViewOnScrollBehavior< private fun onDependentViewChanged( parent: CoordinatorLayout, - child: T, + child: V, dependency: Snackbar.SnackbarLayout ): Boolean { val viewMargin = (child.layoutParams as ViewGroup.MarginLayoutParams).bottomMargin @@ -58,7 +61,7 @@ class HideBottomViewOnScrollBehavior : HideBottomViewOnScrollBehavior< private fun onDependentViewRemoved( parent: CoordinatorLayout, - child: T, + child: V, dependency: Snackbar.SnackbarLayout ) { // checks whether the navigation is not hidden via scroll @@ -69,6 +72,36 @@ class HideBottomViewOnScrollBehavior : HideBottomViewOnScrollBehavior< //--- + override fun slideUp(child: V) { + if (lockState) return + super.slideUp(child) + } + + override fun slideDown(child: V) { + if (lockState) return + super.slideDown(child) + } + + override fun setHidden( + view: V, + hide: Boolean, + lockState: Boolean + ) { + if (!lockState) { + this.lockState = lockState + } + + if (hide) { + slideDown(view) + } else { + slideUp(view) + } + + this.lockState = lockState + } + + //--- + private fun View.translationY(destination: Float) = animate() .translationY(destination) .setInterpolator(FastOutSlowInInterpolator()) diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/HideTopViewOnScrollBehavior.kt b/app/src/main/java/com/topjohnwu/magisk/utils/HideTopViewOnScrollBehavior.kt index 39650e230..66e6701ff 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/HideTopViewOnScrollBehavior.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/HideTopViewOnScrollBehavior.kt @@ -10,7 +10,8 @@ import androidx.core.view.ViewCompat import com.google.android.material.animation.AnimationUtils import com.google.android.material.behavior.HideBottomViewOnScrollBehavior -class HideTopViewOnScrollBehavior : HideBottomViewOnScrollBehavior() { +class HideTopViewOnScrollBehavior : HideBottomViewOnScrollBehavior(), + HideableBehavior { companion object { private const val STATE_SCROLLED_DOWN = 1 @@ -21,6 +22,7 @@ class HideTopViewOnScrollBehavior : HideBottomViewOnScrollBehavior( private var currentState = STATE_SCROLLED_UP private var additionalHiddenOffsetY = 0 private var currentAnimator: ViewPropertyAnimator? = null + private var lockState: Boolean = false override fun onLayoutChild( parent: CoordinatorLayout, @@ -63,10 +65,30 @@ class HideTopViewOnScrollBehavior : HideBottomViewOnScrollBehavior( dxUnconsumed: Int, dyUnconsumed: Int ) { - when { - dyConsumed > 0 -> slideUp(child) - dyConsumed < 0 -> slideDown(child) + // when initiating scroll while the view is at the bottom or at the top and pushing it + // further, the parent will report consumption of 0 + if (dyConsumed == 0) return + + setHidden(child, dyConsumed > 0, false) + } + + @Suppress("UNCHECKED_CAST") + override fun setHidden( + view: V, + hide: Boolean, + lockState: Boolean + ) { + if (!lockState) { + this.lockState = lockState } + + if (hide) { + slideUp(view) + } else { + slideDown(view) + } + + this.lockState = lockState } /** @@ -74,7 +96,7 @@ class HideTopViewOnScrollBehavior : HideBottomViewOnScrollBehavior( * screen. */ override fun slideDown(child: V) { - if (currentState == STATE_SCROLLED_UP) { + if (currentState == STATE_SCROLLED_UP || lockState) { return } @@ -97,7 +119,7 @@ class HideTopViewOnScrollBehavior : HideBottomViewOnScrollBehavior( * screen. */ override fun slideUp(child: V) { - if (currentState == STATE_SCROLLED_DOWN) { + if (currentState == STATE_SCROLLED_DOWN || lockState) { return } diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/HideableBehavior.kt b/app/src/main/java/com/topjohnwu/magisk/utils/HideableBehavior.kt new file mode 100644 index 000000000..5945472c5 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/utils/HideableBehavior.kt @@ -0,0 +1,9 @@ +package com.topjohnwu.magisk.utils + +import android.view.View + +interface HideableBehavior { + + fun setHidden(view: V, hide: Boolean, lockState: Boolean = false) + +} \ No newline at end of file From eb929160b3103983819e6201f376202f0f9c7dc0 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 4 Jan 2020 13:30:33 +0100 Subject: [PATCH 213/254] Reverted updating material library --- app/build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 6aa066dc4..14c81d5f2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -131,5 +131,6 @@ dependencies { implementation 'androidx.transition:transition:1.3.0-rc02' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.core:core-ktx:1.1.0' - implementation 'com.google.android.material:material:1.2.0-alpha01' + // DO NOT UPDATE, 1.2.x has bunch of things broken in functionality against 1.1.x + implementation 'com.google.android.material:material:1.1.0-beta02' } From 8737be262367ffa775082bb08e34441648518340 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 4 Jan 2020 16:07:53 +0100 Subject: [PATCH 214/254] Updated policy (apps) layout to be more compact Added pinch in to increase list span count / out to decrease The setting will be remembered across the whole app (every list that uses Staggered Grid) Updated indication of whether the policy has root access enabled permitted or not Displays crossed out app logo if not permitted --- .../main/java/com/topjohnwu/magisk/Config.kt | 10 +- .../model/entity/recycler/PolicyRvItem.kt | 11 +- .../magisk/redesign/module/ModuleFragment.kt | 16 +- .../redesign/settings/SettingsFragment.kt | 13 + .../redesign/superuser/SuperuserFragment.kt | 13 + .../magisk/utils/DataBindingAdapters.kt | 8 + .../magisk/utils/PinchGestureCallback.kt | 24 ++ .../magisk/utils/PinchZoomTouchListener.kt | 66 +++++ .../res/drawable/ic_notifications_md2.xml | 10 + app/src/main/res/drawable/ic_off.xml | 10 + .../main/res/layout/fragment_module_md2.xml | 2 +- .../main/res/layout/fragment_settings_md2.xml | 1 + .../res/layout/fragment_superuser_md2.xml | 1 + app/src/main/res/layout/item_policy_md2.xml | 250 ++++++++++-------- app/src/main/res/values/strings_md2.xml | 4 +- 15 files changed, 304 insertions(+), 135 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/utils/PinchGestureCallback.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/utils/PinchZoomTouchListener.kt create mode 100644 app/src/main/res/drawable/ic_notifications_md2.xml create mode 100644 app/src/main/res/drawable/ic_off.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/Config.kt b/app/src/main/java/com/topjohnwu/magisk/Config.kt index 07595d902..2cbb18d56 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Config.kt +++ b/app/src/main/java/com/topjohnwu/magisk/Config.kt @@ -55,6 +55,7 @@ object Config : PreferenceModel, DBConfig { const val SAFETY = "safety_notice" const val THEME_ORDINAL = "theme_ordinal" const val BOOT_ID = "boot_id" + const val LIST_SPAN_COUNT = "list_span_count" // system state const val MAGISKHIDE = "magiskhide" @@ -109,8 +110,7 @@ object Config : PreferenceModel, DBConfig { Value.CANARY_DEBUG_CHANNEL else Value.CANARY_CHANNEL - } - else Value.DEFAULT_CHANNEL + } else Value.DEFAULT_CHANNEL var bootId by preference(Key.BOOT_ID, "") @@ -137,6 +137,7 @@ object Config : PreferenceModel, DBConfig { @JvmStatic var coreOnly by preference(Key.COREONLY, false) var showSystemApp by preference(Key.SHOW_SYSTEM_APP, false) + var listSpanCount by preference(Key.LIST_SPAN_COUNT, 2) var customChannelUrl by preference(Key.CUSTOM_CHANNEL, "") var locale by preference(Key.LOCALE, "") @@ -149,8 +150,9 @@ object Config : PreferenceModel, DBConfig { var keyStoreRaw by dbStrings(Key.KEYSTORE, "", true) // Always return a path in external storage where we can write - val downloadDirectory get() = - Utils.ensureDownloadPath(downloadPath) ?: get().getExternalFilesDir(null)!! + val downloadDirectory + get() = + Utils.ensureDownloadPath(downloadPath) ?: get().getExternalFilesDir(null)!! private const val SU_FINGERPRINT = "su_fingerprint" diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt index fbb3b4e8b..c6f1593df 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt @@ -1,8 +1,6 @@ package com.topjohnwu.magisk.model.entity.recycler import android.graphics.drawable.Drawable -import android.view.View -import android.view.ViewGroup import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.addOnPropertyChangedCallback @@ -14,8 +12,6 @@ import com.topjohnwu.magisk.model.events.PolicyUpdateEvent import com.topjohnwu.magisk.redesign.superuser.SuperuserViewModel import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.RxBus -import com.topjohnwu.magisk.utils.rotationTo -import com.topjohnwu.magisk.utils.setRevealed class PolicyRvItem(val item: MagiskPolicy, val icon: Drawable) : ComparableRvItem() { @@ -73,18 +69,15 @@ class PolicyItem(val item: MagiskPolicy, val icon: Drawable) : ComparableRvItem< fun toggle(viewModel: SuperuserViewModel) { if (isExpanded.value) { + toggle() return } isEnabled.toggle() viewModel.togglePolicy(this, isEnabled.value) } - fun toggle(view: View) { + fun toggle() { isExpanded.toggle() - view.rotationTo(if (isExpanded.value) 225 else 180) - (view.parent as ViewGroup) - .findViewById(R.id.policy_expand_container) - .setRevealed(isExpanded.value) } fun toggleNotify(viewModel: SuperuserViewModel) { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt index 65d61900b..0905e9b8e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt @@ -19,6 +19,7 @@ import com.topjohnwu.magisk.redesign.compat.CompatFragment import com.topjohnwu.magisk.redesign.compat.hideKeyboard import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener import com.topjohnwu.magisk.utils.MotionRevealHelper +import com.topjohnwu.magisk.utils.PinchZoomTouchListener import org.koin.androidx.viewmodel.ext.android.viewModel class ModuleFragment : CompatFragment(), @@ -67,13 +68,18 @@ class ModuleFragment : CompatFragment if (newState != RecyclerView.SCROLL_STATE_IDLE) hideKeyboard() } }) + + PinchZoomTouchListener.attachTo(binding.moduleFilterInclude.moduleFilterList) + PinchZoomTouchListener.attachTo(binding.moduleList) } override fun onDestroyView() { listeners.forEach { - binding.moduleRemote.removeOnScrollListener(it) + binding.moduleList.removeOnScrollListener(it) binding.moduleFilterInclude.moduleFilterList.removeOnScrollListener(it) } + PinchZoomTouchListener.clear(binding.moduleList) + PinchZoomTouchListener.clear(binding.moduleFilterInclude.moduleFilterList) super.onDestroyView() } @@ -101,14 +107,14 @@ class ModuleFragment : CompatFragment // --- override fun onReselected() { - binding.moduleRemote + binding.moduleList .takeIf { (it.layoutManager as? StaggeredGridLayoutManager)?.let { it.findFirstVisibleItemPositions(IntArray(it.spanCount)).min() } ?: 0 > 10 } ?.also { it.scrollToPosition(10) } - .let { binding.moduleRemote } + .let { binding.moduleList } .also { it.post { it.smoothScrollToPosition(0) } } } @@ -117,11 +123,11 @@ class ModuleFragment : CompatFragment override fun onPreBind(binding: FragmentModuleMd2Binding) = Unit private fun setEndlessScroller() { - val lama = binding.moduleRemote.layoutManager ?: return + val lama = binding.moduleList.layoutManager ?: return lama.isAutoMeasureEnabled = false val listener = EndlessRecyclerScrollListener(lama, viewModel::loadRemote) - binding.moduleRemote.addOnScrollListener(listener) + binding.moduleList.addOnScrollListener(listener) listeners.add(listener) } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt index 8ac1efad5..2fdcef756 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt @@ -1,9 +1,12 @@ package com.topjohnwu.magisk.redesign.settings import android.graphics.Insets +import android.os.Bundle +import android.view.View import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentSettingsMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment +import com.topjohnwu.magisk.utils.PinchZoomTouchListener import org.koin.androidx.viewmodel.ext.android.viewModel class SettingsFragment : CompatFragment() { @@ -19,6 +22,16 @@ class SettingsFragment : CompatFragment() { @@ -23,6 +26,16 @@ class SuperuserFragment : CompatFragment Unit) { + setOnLongClickListener { + listener() + true + } } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/PinchGestureCallback.kt b/app/src/main/java/com/topjohnwu/magisk/utils/PinchGestureCallback.kt new file mode 100644 index 000000000..f977546a3 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/utils/PinchGestureCallback.kt @@ -0,0 +1,24 @@ +package com.topjohnwu.magisk.utils + +import android.view.ScaleGestureDetector + +abstract class PinchGestureCallback : ScaleGestureDetector.SimpleOnScaleGestureListener() { + + private var startFactor: Float = 1f + + override fun onScaleBegin(detector: ScaleGestureDetector?): Boolean { + startFactor = detector?.scaleFactor ?: 1f + return super.onScaleBegin(detector) + } + + override fun onScaleEnd(detector: ScaleGestureDetector?) { + val endFactor = detector?.scaleFactor ?: 1f + + if (endFactor > startFactor) onZoom() + else if (endFactor < startFactor) onPinch() + } + + abstract fun onPinch() + abstract fun onZoom() + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/PinchZoomTouchListener.kt b/app/src/main/java/com/topjohnwu/magisk/utils/PinchZoomTouchListener.kt new file mode 100644 index 000000000..58e099709 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/utils/PinchZoomTouchListener.kt @@ -0,0 +1,66 @@ +package com.topjohnwu.magisk.utils + +import android.annotation.SuppressLint +import android.view.MotionEvent +import android.view.ScaleGestureDetector +import android.view.View +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import androidx.transition.TransitionManager +import com.topjohnwu.magisk.Config +import kotlin.math.max +import kotlin.math.min + +class PinchZoomTouchListener private constructor( + private val view: RecyclerView, + private val max: Int = 3, + private val min: Int = 1 +) : View.OnTouchListener { + + private val layoutManager + get() = view.layoutManager + + private val pinchListener = object : PinchGestureCallback() { + override fun onPinch() = updateSpanCount(Config.listSpanCount + 1) + override fun onZoom() = updateSpanCount(Config.listSpanCount - 1) + } + + private val gestureDetector by lazy { ScaleGestureDetector(view.context, pinchListener) } + + init { + updateSpanCount(Config.listSpanCount, false) + } + + @SuppressLint("ClickableViewAccessibility") + override fun onTouch(v: View?, event: MotionEvent?): Boolean { + gestureDetector.onTouchEvent(event) + return false + } + + private fun updateSpanCount(count: Int, animate: Boolean = true) { + if (animate) { + TransitionManager.beginDelayedTransition(view) + } + + val boundCount = max(min, min(max, count)) + + when (val l = layoutManager) { + is StaggeredGridLayoutManager -> l.spanCount = boundCount + is GridLayoutManager -> l.spanCount = boundCount + else -> Unit + } + + Config.listSpanCount = boundCount + } + + companion object { + + @SuppressLint("ClickableViewAccessibility") + fun attachTo(view: RecyclerView) = view.setOnTouchListener(PinchZoomTouchListener(view)) + + fun clear(view: View) = view.setOnTouchListener(null) + + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_notifications_md2.xml b/app/src/main/res/drawable/ic_notifications_md2.xml new file mode 100644 index 000000000..c55141254 --- /dev/null +++ b/app/src/main/res/drawable/ic_notifications_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_off.xml b/app/src/main/res/drawable/ic_off.xml new file mode 100644 index 000000000..377067b0d --- /dev/null +++ b/app/src/main/res/drawable/ic_off.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_module_md2.xml b/app/src/main/res/layout/fragment_module_md2.xml index 325c0fa3c..1d577a1c0 100644 --- a/app/src/main/res/layout/fragment_module_md2.xml +++ b/app/src/main/res/layout/fragment_module_md2.xml @@ -20,7 +20,7 @@ android:layout_height="match_parent"> - + android:layout_height="wrap_content" + android:orientation="vertical"> - + - + - + - + - + - + - - - + app:layout_constraintTop_toBottomOf="@+id/policy_package_name" + tools:visibility="visible"> - + - + + + + + + + diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index a7527f006..272950e7a 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -86,8 +86,8 @@ Restore Install from storage - Toggles logging - Toggles “toast” notifications + Logs + Notifications Revoke Filter by name From bc0bb92f7a4d7bde687a1e93d9ad5e2b0d61b62b Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 4 Jan 2020 16:24:44 +0100 Subject: [PATCH 215/254] Updated indication of whether the module is enabled --- .../com/topjohnwu/magisk/utils/DataBindingAdapters.kt | 10 ++++++++++ app/src/main/res/layout/item_module_md2.xml | 3 +++ app/src/main/res/layout/item_policy_md2.xml | 2 ++ 3 files changed, 15 insertions(+) diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index 3277424ff..a3fe1b070 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -2,6 +2,7 @@ package com.topjohnwu.magisk.utils import android.animation.Animator import android.animation.ValueAnimator +import android.graphics.Paint import android.graphics.drawable.Drawable import android.os.Build import android.view.View @@ -456,4 +457,13 @@ fun View.setOnLongClickListenerBinding(listener: () -> Unit) { listener() true } +} + +@BindingAdapter("strikeThrough") +fun TextView.setStrikeThroughEnabled(useStrikeThrough: Boolean) { + paintFlags = if (useStrikeThrough) { + paintFlags or Paint.STRIKE_THRU_TEXT_FLAG + } else { + paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv() + } } \ No newline at end of file diff --git a/app/src/main/res/layout/item_module_md2.xml b/app/src/main/res/layout/item_module_md2.xml index f06d5561b..9ebd1c738 100644 --- a/app/src/main/res/layout/item_module_md2.xml +++ b/app/src/main/res/layout/item_module_md2.xml @@ -49,6 +49,7 @@ Date: Sun, 5 Jan 2020 14:24:36 +0800 Subject: [PATCH 216/254] Fix font files --- .gitattributes | 1 + app/src/main/res/font/exo_bold.ttf | Bin 162779 -> 87084 bytes app/src/main/res/font/exo_bold_italic.ttf | Bin 164161 -> 92444 bytes app/src/main/res/font/exo_regular.ttf | Bin 154154 -> 87740 bytes app/src/main/res/font/exo_regular_italic.ttf | Bin 155882 -> 93356 bytes 5 files changed, 1 insertion(+) mode change 100755 => 100644 app/src/main/res/font/exo_bold.ttf mode change 100755 => 100644 app/src/main/res/font/exo_bold_italic.ttf mode change 100755 => 100644 app/src/main/res/font/exo_regular.ttf mode change 100755 => 100644 app/src/main/res/font/exo_regular_italic.ttf diff --git a/.gitattributes b/.gitattributes index 971dee287..ad2d62815 100644 --- a/.gitattributes +++ b/.gitattributes @@ -17,3 +17,4 @@ tools/** binary *.apk binary *.png binary *.jpg binary +*.ttf binary diff --git a/app/src/main/res/font/exo_bold.ttf b/app/src/main/res/font/exo_bold.ttf old mode 100755 new mode 100644 index 5938d4ce02120ee7f149486ae4275e1c22a31335..8ea37706c75fbdc90d8964001852f4584085eea1 GIT binary patch literal 87084 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 N1|gd~iB992!QUOEU>yJe literal 162779 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 W)~*1IHdz656_C*;vwO8S_5T5pibQt+ diff --git a/app/src/main/res/font/exo_bold_italic.ttf b/app/src/main/res/font/exo_bold_italic.ttf old mode 100755 new mode 100644 index 9f446bd11f16687410221d27e17fb27b0c8b9297..7ec56c94ee733ddc029d85afb9ddfb5d2ad6af1d GIT binary patch literal 92444 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 z zEOcJId&`E>kU!JoD+;A#>=?A9Sl5~=($XA0hrg<{xU(`;>n{xT&5ika<*MClhN^nY za*JGczbB`z#8W$`i|9kn1v{jN73|c-+d5ICspyTekVXbJI=`H2E1B86i+dnrD|Uf%u}=mslTpD-Sa>dNn|5m5 z7P&K>h7d|fB|AJ(#MQRi!0wAW4aS15>6t5Z=7}2k8Iqu+hAgR8SO!V<_v*GdmCvA# zX|1H5{Z!o*hd;}wNI3kD5zi6!cZmmn#t1*k-V>HJ6PC3NJ9D45a>~LcN&-@1Ck&r* zsK?xb?O|7tvR)(mQ)=f;vGleFirC87qxO_$pO2k&@_4jJ+z%kI3BU0muv1L%wisQ) zX|F(V>=iB~4M-?O{}P%eVz*Opz_b3)fPZHx9My8^!+ zAC=-!iRUGLUR)B-A*!TZ9!(|UUD%sZB#=vl|Gc$gNXVhjAexrqs?_zoZ;2;X4q==k zpoVsRW+UonLDd6>u6k$OIhmH14<1C{46SJbiWoO7zRtFY)Dx)*|jAIO6Fh zz4ZkKjX0Evcpy}7G$UUXxfO7Sc z1JArfYl=S!iue-~i`M>sD|dqfY&-c7GWoJv3l3FesMOH>Tbst+Uh|c#xbT4od3J2) zC*=c`jT<{+2z5m-bq{*ED2fs_Ug+l~+d-k%{99|juxemUzWMqB@BMeSUV0~WM~UQ4 zma(|5YI8;GE>;$!dMVoS%6#Wfq*X91k8wE74hc_Fo;Sd09tgPl3}TiHdy7tn$m@=u{e?N1vl&^l3`Yc8Kwho+SDhl#R zD0~Q`>dWW%5Pw!22Uu73F3KC|N~yUm%N*HLz^`e)cFN%``|a&**4{yORqW--sp_C|1@}f zRLr1V@z!F;EwR5u@0{v13fq^oI9Da0WKR<6X(0)rmXQ}pscO|=l+z5fvWnQp9`>*^ z_F|0N)!4!S;9#Q1V`LdpJ+`{glLT@Vxeq}D1ye; z;YZjX&`VTgm~s)=WVFw1>zhetCY?`oK~EJd~y3qoti9AgLU-G)X)k; z6HUtmgNpy`i5jSA8yFq4Eiz`DZH{kUnM6TbZGDuNCz8+|%N9#HsN+~m%V`DI^Q>aQ z)9cVwCg3%`fT| zEL6~P>0Wlj&EpsuPDQ;?WmF*5d0p>^y%W8s9OQkVpX%{z z=zFD9T)RkyCZx02mpCKVSdL;dsX1ThN5+Ay- zw#+P#H$R2Y^&5w;9-V_6`j#z}EoaYtirnT6W;kOukyqEWHU#Q~y~GVhhIpq5QC^i0 z;rR=Jk#0Qn6QORhq!9Mf=#w7xZH!(6K}qM@Bwa3|`_LJbhEDNPlBtK}t9>l}Mh z^O))UD#vS0pT!V=12Uo6T`+H7B*yd&SR z{qT3|#1<&YFkXsp!E>G1f+uazU0;BiXjZxm6eIU{8pR+ni3PDc(k=DD1brp3f9YE< z?3J|r7;~J-RO1`6_#TbSRkPO^=x8{jy`GU0$Wgc1So^i@6I*%~tYWkEOAuq-z4RpS)gC>On#y+hP<>p5Aj}}cIP49>=Y}gU%N&` zTzMFdTG=yGnEJr1t65dsEn^i|wYYyAgh*s->-}y3&-sW$k;cur|e%m9@y(87#8!wlO!aYj5>rmUpD4 zN9uCD(>mCkN=Lfex$&j!?DX{Vb1-g=@*Mjie@e`2yVz}syG^5E#4*;uzYcZmN*T{S z=cKdiadu%^>{9+z?DFR3Yj3*g=L1A_BYGd<&qA9y^d6U+cBWdI%!1oFWb%ysJt6zn z%*HjnGlrYi^;K7R{kfI3zMS8%^HO66*v!s39XkfZUt^Ws`GMTg#-iMt2FSjITvSBr z9AXlAyS4aa%3M^4R)Hxu)JdG6_*xovZc=$>+n^EY@7Ww-aOzfBmHm_jfZ{g3&NfW-bh(W0mnXK zOi~dQR3N?)HPhO-r=?euC}hz%9X*Q^Db>c|VI#5ZNu93Dq}s}!^tE$!%3;NGk>e$L zRdI5K{GB4=-%|u}MuOP=R7E{_x^zyb3dPj1uO|uXOhoDO%Q46)ZB7D8S`<>nev7Q0 zQ)Ze^gVoDB7JFZ}cluCQ zUS&A;LtsMwR$xlHfiZ*&%Ww&oPhb-HPD;PAwUQ>qEn&EBpjZZxYXfC*a;0@nFK#7 za?_Oc`I!6A9xH%+Q&etgD0uQaRIj{)_0GAx)_22(Yg|v~WSOkLaXn{a6;HWmtm!dT zPjRKP@+;GJ__FI$Hd$L!gFCFE0-5k;3)^-ReX#AH2|C1hw8nCRV?|y>+z_-x@GPOW z*?0zMl%om==TDfKr_~>0qpp*9`eln^<1DYN3$c1*-SKn-2j2CO#6^qsO|x|_lgf_2 zlVFXfaN{kDovfx!V_)OJXW${NN9XJ^TGs`?RC9c>CWiv>Msu7v#=4FYYkDh8=6R)* z61}qHy*}nkX|}$eITr1)+KXy!YF$mI{{o6^ z<*3Z{{ZX9$OI)WuwJWQ%T;?=EZzW`#Fq1RfB$H$(MF!JII`&^W(iEQo?3)RDh$lF4 z-fv~`xuDCSk>UW2Cr_2M=#O~-D+!(c(^`^vTVB2_?-!R3VdIFG<>BAIwu+_Na5vbL z)`cC;>1#G_XDROCEz?>WGwwC9yr6k>X<1KGma{5g-Qb_MG2F5Jg1WtR?cU5l5UUpX zkxb~!iIrAMRLEJ)Ll>qm>AY~a`zg%k)ZaLtFFM2?oZgX27qrVM=)DkHl2B3wmnzptnSQ@{Fg^2XNvLfF$zQgm`6Z!gb0xG)&@Z8MK7*ZOyfyJlt%=_Q3AnIK ziN(2&q(GA04#~pv(!DJ7P7VchHytYeaq*$WheAIN9pZJbzIyVvue_qII|tA@eq$rG z)vJi*=F=MC=Z8B*$IftS*mcPDWBdvK;KwOHX8U9NUU`M>@7;|5dLyJ8)DF|=K^_sb z{!Ke65mX5|5F9z!b;Ma4)&pbfBgi;vJTQs@RpLPf?TbP4$=^~BJQlUT94S)Zk+r`B z6}7(_RM!3yR8*d7&{JxE1vF9nORYuiuLjp^e+m9&6(`FAo?QF;xJHqv{nh&EwZCOJ zB_keWKk}Yigw_b3sQne~;gv+~FF{4^uZBgh{Ux}l{ng-l?JvPa?XQMK*8aAk_BSym zYJbZ~%9QmHwZB?hs{Lh3>Ey@kBG89eSKjS{iA~2)me7tCx654;EHrl>>dhFLXHKX&&qFH9U;xOc};s-<1?MkayA!&5$3tp_i$>hdO!r zquy7Vn{m_fU9k&N(+l?!_oA0r>t_mTts1W~(P>QEQx$(ijp>H021I zsQv2(xJ!9M!l7kj`y=cn0q?_Es1bgYy)1a3`dotJEL7y6$jMsiAX{G57-8S_zA^>e zIO|gz!iNGo(ssCc`QE+6)LPGg=bz714OH#~Yd}L;Z`_-tNnG5W=n=<4zq+jFN0)i7 zOh2^0WXVBn{x-2&PX3lIzQ;}4KLU@UpXvmUBcO@=$)5$yVa!Itr^Ao%m4ar{><++f zq**bJiaELC!KOot=`W1%2%C)&X2%{Otx{_tZ=58E*y5CWC*SmRtgDvH-MtaMV zp_z`&ED~iUu}35yVvNe9v5#u^nMgU%swp|}^nwrJ%jd#c@jjro?oefzRyl_`r4>%l z3WV+7lV_zl`_Earc1NnK@9eR8Eg7lhbrlT-X|}R@^Xv_+-5Yk*jclo%wt0Ky-oXVu zp^C!1fvM4ousHdqRb#G@Ea`=!R%wG0PEjktvGR!XR0$<{OK6&S!-b$<6cHamDdM|F z$aVH)0J!zmi1^mhtf0(^3W-Qu6!FPk+3{W<^9x19C*e6-#zwZMh)=?E`2*T0NgN>J zd(r@>*h{p>S=_A#_#q7r-%D_usXCP_l&{6UzY}A*CNLC6gPT_&2HQb;{ z6|wSO(xFxPr*f?}#$5H(r$q0yLh{{Gg9^nBQtmSUOPfEv0zlMIKoP!E3T310uRBuh z%?qa%r zlO+@3(Hvn8tLn37b>;|9uqu)_Gq#?;m>D5AaD=_!iNGk>8j;T($xG9YmM=e#Q(DH z1V-5^o|~6l;q(;#*EJ~iVP}`yk+RaHNi+m5-BimIm#Ec`VjL2sem$ZP>#_L@m?^cr zZ1B1kXRghM4P9C=WLEQYhOqDyP1Epe@zA1W}JeOcv825sqUwwW_GS)9Hci__lUmeDypkh$6F%JQbU9NnGn?m_X+ zV;lUCMa=)}G#NdrQ46Z5hE`N#hakI~@tp3}xL(xIQa`s??WrGRC~C(f^dYTRkf5T^ zMarFm)2QGS@)sFi13RZBRX<%4%$Hzs#l}R=w_$GQ870D=Oz=D~l^Nfy?>0G36A)<} zym13>X*I$QU>~F>DG{;{M8WaaG>e4rje)NNs zreJg&xQOZuTCFG))$fKBClyFQAkl%SRAxP_+&SCk*tD`>TCTgdqO`UnK8>$n5bNG)1^i6=9*gIzl^Y};@Zjf$~(6GpXSE^2oV zetesk{lIg3{~`9o-n}twtWa^KwQ}H#$N|f&u(*5hO3(h({bh&BE=#@4BYLtY#(O6x zd&l?g1=j+gg>jz$<>&{#`e07R^UB1Bm5})r_jw3=msaVM6b*yW4B8& zdE(x|C)e2O4mDVd!@c)C7j}Mf+HT^NnA)MMc5LWwlo2yNL1i}e|pS-gZz+$KSTB@uoMU$bodc& zH?)uAK}3700ZtLE#Pbr#4!R?1zK^)E0N-GapMK{cf2=uNNpe`9B%6xjD%%FWe4#h? zHiU7Sh{T{;lX8(N>dA@*R0AR(8R-FF>nwt(Bev z*mXnhtrwSHedFJ*ZM^q7bhw3WqCdz4Y>wRw{fK@-6W^8kXPX735>7Kg!qb#v1~_R* zz)^LYV}O%w%l3ALTmb0G1ocE$8onUcguJD!Iz4>NtqU%`^Y!a)U$p;o%o%(C!3S9` z%Y5V!>I3UX)oC47tVYExgQ_+3=N-34uDR<()}cGt;n>H_9NTgSs242-^*@r-E58%e zNH|eXaAYz?Y%QTgyJ(HL`7+rWK8nWE;YT=RP1sL`YbRmJqar&fY6~QkX0gQnlD0|- zxUgMGi&MM}DWR07kWdenY*8=BajGZp78E|8ev^j<{_bJd;-?D#;f-zH!KUrq5fi?+ z1gxbC?w{7Umwt)hUa=Ao9Fc=~^G>!V4=q|_6-D|0T$X@K8dHZKVQ&yNWl)K+H~Bx1 z{VzZ)D^ANrPM+S}3S-Gc+C;ozD03!sWPV4x&AxtRo{21Fyq0?Z$7kq_Ep~4JKi~ShDLX<9)+*nYb)K^zxRcP4j}097A+ZIZalpl~%c^hwm6UKecOKUP0yIxwR8DRu&9&M5oZL z8qtoF*az$*Rvr6ORc1kUnC%9>*?4c`cHqN$X%eNaz$T&#t#Zw339%ifvQ6C+-E%T| zbLME6d3@FOsxHgUjG_~K5<2ivS5LbL2}4O|8!HWp~V;Yif1uTyn=%Wz{&0=vrD*V~OxV)6lf6Otx|5hT&-$ z#j#tLtvL`bXMHL5w(@Z7Nw;YVI5;1Y_$uzT#GGTe{{Tk`j9=mS{Qf-?d@O54m$*f> z24=hrbRi=fEs<)FKkkL_4X1N3gKm}+Z4Ouc-ZOLQluax8XMLAdXU44K|Eyn95(w-{ zPhU85=Ao%yyd2||L1OEH3l=8csFT^ha2Qvg$U2oMHo!70jF+?Ad%pW(gFm>v7U+=JIMs%t@wW~I* zXVDl&2Df}aI7Mt%5(wkQ*a+CQMjSlEu8)1s#d>ay{pIVv%JJfv&N?tid`RwNh9&)&6ba}knRxW`REXPRaK|)zVMl=oF@}?pE z4N)3En1W24;;0d}`@(SfgWujhA*wDvN^!s>`uq-pyYR7MZO)J8MQDV8Lf@Rybr%V;w{Jb@=Eu?RI2s zuIjbrwxktU7Tng3Vn}>CO=Eu{4J7q?9XSAcT0(oH%>0u z_t@KFR%y=7IIG}ZhaWBqX60Vts2!}F)>YrW>QPth>&xyeh`3$OWj0%VL(}r;!i~@z z<=38M$Ax8w!tiDZ%TE1W#vLvHuCEQMpb9_Y;n;(05Zu_A*?iJ8x!sFyp&9BHF z3Qr?nxgwiJ?548P5bm^#dYCT~;Y&1EGgosxPt;iIScW}!X??Y|Hug_f;T-;!?r(Je za{vzKdA2JxmInt^6FZcKm9J)U3#f+0;}?NwCG48q&L+fn8SB*H`$OXUaau>??GxUS z7R0#0(UgdrnWn6bZEA7q-0l_4Ev8V~aOd*jN^2o=y2{J&;r1SGtjln});rKtpPKbr zXaA8JTT!acGH7o5e0>ecDzZ0;!ExRK?i4wc0&Kzp5D zcuD`6_1Sd>eKwszpH+~|qu?BR)qG?Wzs^f85)+9QLAudQWav;hBi=2gd3Mo!$3$5` zRU7u&cjXtTJU?)?W7GV$PP#|9D=Swu*+%*fyO!HMj+8=fUSi=6hs)})FL%|~TD`#m zPfB?~hQr_1LEbI{vcDT|K*3icUuCqYzn@}I4Mu|^TLkS-pl2XKJ7!FX7A*3UxO9tD zhKPblzH7JR>%M$$=7E6QW8Trp>YdNHGpi!?b&RK{jx9W#vDD)%vZm$Q9jtES5@&sd z%{i@i3Ry!7#`!X2lr6oayzWiZV!|lm1>**r5N>C8#|3+aB90xk^|s8~;*KUY%{H^W zzqQ0{VqQ<5+3P#pIs2=Rr!T8-uv)6h?XH22woRd2v(27f;RGB@eXS3))KHBL^V|&5elrA(CuXD9@6qdr6~5^hNyi zwmEbiv^cmoGS-VQvBY0wv82pwTv5};ZRYGOpNFTV&X}@fo72rrET_!n;`rT%jFb|y zg*lz&b`;m~z~PcQr){RE!r}^M1S=cs%gXH5mYiDE67X5mExlc}tj6oevilsa>~vFV z`qRPU^z<~htI!F4xe@^{_p!y0Gj?*CH9~U<*GRIqh&$SdR*>q8tdBT%)Z)jYtI8nZ z)YO?%26`a(z2?l!>=1sKA~PF$t#3#%RhB!P10AiM!(V-z6$M=R{$P&Nkw(5ip8=dB z8pe0s9yxzgeAlgv!*kPf-5NN4$%4M?TH^d2@m<#l=dwOa=Zf=pg>TuwR;QzCaVJrT>I~lI* z5!N_M`WQ{4pXFm7_$(hodi^g>hE3vhg7>Q&{#v1*k6?dU7xS!B`6n^>kFzJAGMxkI zhE#=h!b61ltN5+Grx2_BTP6QO&vzv~|4Y*IEt9`J!}H&w|3{ec9J`56cnxy5wAa>S z=rgz*v24n?v)@vhv2xZ$-F@b=wByN?W?4mEZT8A4J%&LoC@}eiUaq~CxTe5tan^MyTJKEOOY@;{nDp33M5ir5GoVvr) zN&qi)w%U-hY%11YrnErB_&M4$#lwA{I6u7pxowV;o!L!} z7T2M(rm!nwUt8XP&oVFFc@c$P?C4o!pj|A%#^6PJ8SSTsTu&92nykFMG}C9kVjA1# zIp)nN>1dl`Nlo9e(Uh?{FSEiNaJbmAz3bhrwdti@Gy0%=+Ciz1PnN#RN4z56A|bD$ zA*aAa_%uCo(+Dx0NomK7)KrWvcg`@CaQYpcz& z$`$M#=pC=faTk?(1GyxPrI1FN)V}a0F!kwgX0i*iWB>djd+=7gS|}su0en z2Z(!ZUnf3g$VOWrL%bQHeVw*xM|4No2<>GPDKP@{aZ|dftgx7yQa#u1Yi(tmrJ4)# za(xIiM*Gga-0ef$q88P8ye4arD>Kt%b$KK10yU-Fw8UC8y)a_QEX~O2*;QVh;k<_@MA%!} zM7~DO>+5pNxeuqhdfKh|52yK>c#}4l<;32bmGkJIEwRTNzWHhjZbvzvUB`|hPp0BD zD-BleftsU!s~>;x>QR_Jqxi#o(aIUQmuByN`?{3tis}XjS|e-2{CU>}dEU8IE6;Vz zFyDEV=Zb;uMYQ|BYVry8nDmCI1`Azv%fv14g^%OOHrB%!`w8CLK~7MMi(m<%(0D3- zu`NAyf!}O5c^9yrG~43Tw9Lg`^x4dU@TsrR42<^?mK_T1wR1PmbnYl%9&_<_7IZoG zI6c`G)1D#`$4%n*-gA_oN>#2_{N2S40$=symy}aTaomcI+3<;SJt!-rH}o5XH4qZok%U5@ z^?e3&s+pr6{Ouc!eagRGoUQjcO?Dw zztz2YTVAS5&0OGiao+-d^yC}Q*sP}YnGVZ(FZvfwwle%WHEK1en%^fo1tkh9=3{QH zGcYU!E}kFneKHUC_;R|*Tg}GrLgk8FtGLNW`~p4w3O(HyM1Mq0G()lTFK#KkqwLP2 zy9d_}?i^S<@RfoG%N{KF2L5%{RFJx>-9g!|Uc0;JT$ZaVOxSZQsM~D30DNim)l4t`Y`X?b#jC`6z;+ z$68fCX63JNi`oTjRB_=B4EPD2TRsb+)aC(kd)hwf(hc2#W>7jmI_YR~QAS5`rhZ_k;-;q$^&q zhT@+W_gU5#J~rE3Jj1bu@ve}2_VXjXnWg-yACIp(Ibm_6_R@?K)LsZYume9GW(e6} zaucB{{0a-rbgbb;g(3Hx+szvS-72leb5-J!!m{o9c{5hg!C208=^{O;$k$FbV zrkz8S{?N+di>L3OHa=Kev%mfi=d;w~Lko|8a?XY)PGiK@%<|Cy#{iitpDq(88->T z;weo(i$CE$IgO3s&2aIIml~e2Ke}UKdIr3kl-KzPo^iEVRLAIexY{IUS(|chEf^|rl?0VpW5tj4v(DgUXKnwI_ z=gJn*XgKOOw|-^cg73vXx$=e^r@wN9oR@F2nbx5|ktu|~7GP!j^TG@SFxRZ zpV(E>`R(c65dl0M+QG5l0QZhzmYL?w@^BYSgh@s;5cH6xNb*R{yycCCRPCQo9-dW?uOYKs2hiA$SG$xkA6iJu)3 z9ujYuNf()(mubqgjSMokiUg(Cc^^-AW@UOBEIBDv^QX1v<=)?EH#ggNc*--pj?LTo zoYfgFhk9>KPerh1=oQKKe=OyX-4|UoPJk!PQW~!Rp&VS@9K@X z3fNz#&)QrNinVzww`ep^m3ZJMo8c(K$WX&iQeK)Ir9C^h$UIF20#{#O7cvcZ0Co zsPaX=3%`n_`J-vP%6am4%(;bZ8qe5|4bRwluGr<`8GczDF=IAvBmA_O@!+B1O@@ev z*T$~;wlTJ9!~hQ1-lxWl=0qsd4qUu0-W$~_w6BjU_p@$|I;=^9AG!X+@Vg!Gxi_;a zrG$MAR#=kt2Sk_1CGeYg`DaI$C5SHX*_A(@dtSi>O)HycH?C~DGXIL)EAy^vTG=$a zX(da^nU{Nb$&4k3@t^#7ZwC3RIk1EW@ryUK-XL2GbJLfpOB=d3L@#I_YYT@j*mTYE zv1cBNbU*Zig~M0R(yet7`axqpH%?NpOkp-)m6~^MIJ|E~_xhF#T3F%5!fGXNXGM-ML;{ zYNk7Db#-5>-&;7?$;%8%!`Ra&Pp~gRl6H!S|4UqI2um>sBkab6G6QF(gO|tk8~e!_ z=pcW#3K8E=c_V&(HGlHhWG|w$eC2bKsCoR<)nFB?Wse|>5LO4Z9)oy;fqJaQlSjpq zY1)%%+7s$y!xO94hcex@EESMX_wC!yRwXKSF>0qOW)$Rj?63Hvht?CUcg)0EdDLA6|E-r zx?|(53t-LNllS31+C7wY@*^uq<}61kEyd{%d1^Q*%DtcvtD&!~XUBkj#L?SlcZ@~{ zW>hw`E%Mrn2W#vjW^-uX^bMaILI;z(aZNyAju8X4&r@#QS)SW-~j)i{cO=Pl`2Tu?I9&=oCi=x!!Y z+d26q{62e&xP@8>IDTYEy4I_a^`ZssJgAGKid(ByPyANBecM?XBN;nR{f&CZd7CZs ztd`Y7p5^=N8?8L?Gxdu`%_AcwPx6n`uU=$o&Kl-s{APU-l%t|X`vv}E)qxzAsK#O_ z9u8|caj7VATLpe4C}AT}GXh-xMBChb&Vq&EdGqSe8tv(K;J5P9Ceo(-Cp+x_f0%m@ zfGCfxfB2c1Eo=dnU3yuT-s{5BJ4;s-R8&+11Vt%Iu_dvWBxMhqC($@tn|W=m2;zJr(65x)Fg#xW!M93{k9byS?k)LH+r>~&mz?;cFym%EXpfc zyu$U#`Fvfe2@D>ef5vF%XMFJ-1;zgu^gqZ1=z(bM7;+$1?fs7Becvbjo-*$@H~G!T z^BJs8-&^eeJZ-mywRw$sE%EC0TD=-SWYOFiS`985@iiWqkA#bJ6`YUog`Nb#OXMX4 ztOQQ55-55!wX4YTAh|#qu zJJh#xE*)6)261R}a@CmC0W_$fD>ETIpeR(xF$1mbTHigRgpzRhN_Q+i_1 z`lT1mZ^<|(BR9~Ixj(D*whPIfdtGmlBo2E?hU*oA#WDHD@}<~=1!pRw3F5y8@nv$M z(={#iTWDD1wMf52@4sWy>{*tJ9XUGvo%*|Vcj)i(BdP$GVU7PVtJ37KDs{=GRo?58 z3rp2i3{M!d{+%cX>rs?{U70UfLzRxP;KJ|to!>lP3ie001`QqT-=8+$DE`Im5BY~t z{EJzBl9}}HJ6J}7lN*y~BsV30anb6g)iYK%uKs9fJ@Up0S-jdE$W5^>%kLH7I0Yzz ze$8SWX2ES~Sd(pMH1VpKQ8lBWIxuf%Lfg(RpGqJ4mut^G^(zvjYmVL%>Ix;F`(L!$ z_2oMx_Ac*v^Ds`aJ46p)9V86Blq>V{(piF7K0{X(qcliaR*M0b)6)6Y97C?HvucZN zoh{eku;v;kT*ez0l@6Cikk=n+d>Vg^igB;kz4vmS;6zzhf=Yq7Q3QFL#PBoe31Hvi zHG(K{>cJkT#fo+g)|s)2N6*hP&sv(1R1_9*PGx~HKZ%$cI+)#cj^!@mums=Zw~So4 zU@+aFzKdMg;GQuUYumWdJ7SjW`PI1MNTqW8+#y;e2Bm3u)i?_pFHqDCW5lji@e+A? z%T(Sq#syK`MTyS%U5*yxY}0H*OYnEq?doQO>(`?4_JlSl(3y<|`KBL8YhzF2xux?P zFIqCQ=?E_m>t8sn%ts??C!t~}kWalb9kC!NgteFiWkQG{{e_`kml!Vz+GlDt%<;`M zW|khAwKR8VPJ3HUeoXv)pv-a`&g^Mi+DJ}m>YuTzb?cncxG3}qz9(`IO2SD~5`$dj zs`0y7&{{a3!2vk=piLCL@wzaw!MM)coYisJ+&M*->#g}dZpny85~FSn#BR}n^m<=y zW8Dgi>mT&Q^u$J*7P}MKira5|>_F^4#=sGyCcNF)X$aUgK4N_C@V+NP87+6~8~mGg z4fBz*$a}W_Zazxlfb}iFIvm-{v|((5JUF^3u5lxPu1c*jHl}S0-?rVa!BAt$GiLj3 zPg+-IUcN2OZWO(X47twa{p$%=1#!5ZB@aD;g>fRap@i2^0#{Wy@jY4~0fdo1I{$vB zaeFvB-*~>|9Dn>W<1SE7xDiHMPxHNo^qqc}{#4=q&QE#Z^uY zuIF_=L%I;(;YbrX@d28^#gDuo@^DvI*Y4Wg_}x`YmW|FG8=E^i%Ksym%~BgmUjseD zkIzoh6zz|%tOjx)R8wp!kR}81=CurFMpW|&QTkpzF{*>+hN`(2`N3P?Z14$b4r*Ed z3alZpae1|0x)o>RgQa-3>mMgWM%`uM9Ian!hVKT!-_b%iRi%s(`K?Lv*z6Z9uAeHp zDq1aP&VI>4ykVVfL3P)6cCHscyx#cE4y~eCX$4K<;_}p5^=Tx`^@l$>)!)@fg6b=` zZr^?~;_XDdnM%C8IIUW(-5Egc@OOPim_LcwzI|&|-8M87`c67^(#6ORTii;HoD^r1 zVArqyWM6=*IY6fSKw-|dvF#h3>y=b9CsN7zb2;YZ0CHP^>noxOaLtob^=u#8W-r?2 z&V(r%IOiN%^yw#Byl@Ves39%fpaQ%)$=9F1i9Vh~l>{u|v$aKsn>) z;x#`i$0hwB98-+vCkz4t90`0+5@L2PO-dbD>71FfAZz3|cdd<@Pv}5PaqnFW+qnB|^ z|8VDHRpou2B8V^~iLx;K_!0eOfs_ThZn@e;$^(ubEh95X-L74(yIpsjf^9FHL0ZP3Rm-4-|o7e&i&(KF@kXxdM9uaI+?t#!p9FLchMZ8)AHpK ze)(iV?RaHl=~zojQ>ePIDtl?XdijP8qqXM^w^e9;i>>A5jwE$&XY;zspwRe`>Z-`V zp~gL12H)SmeRYM-7oQK$z^dpv@MvK$CWY- zSS!~?JmwTWk&C!uJy@X4yOkX8@_c5|H`Mo(z%;<5aZ8WB+&dB-p*GT>uyUL*;U?Lb zhiLWny-Kv+E-GL-?AoKw>cJ^>Ue0e~{BP@RI|kk2jzP1iWBC1t^da5T=<0fGI>kPW z;v@_TtpJVxQxZ-k`ZR)0BQM4w_8e$3=&Kel@({ZPeJ4R1R7ZSE&UO7<^3;qoo5&bh z?mFPwLr%Eq-g|iO&vKWtL-cLPZP>|B_Te0MS*qrIV5*+tV)B9hjJ-=t15kTo z5;*33*@;{Ds5;P5T3u&|7+jgr9_4q|jHrPtQfF3nonMrk-j-XF5**PQlW2{N)GVGc zYh_}Re||wzr;o0`&|2`|)~eNcS1+=~M4oK&582}%m=kM@=hW?V{XlOAZwU}u5=xsm zK|I0xEaKj`JX%SrAt9u^TpeKOt|i+|#l4-qHD`9NjCaJxseM(pa8jYsm*@IecR6dj zk8Y;h{}`f|eP@eZ>aP#8ptRYjc@1{5OQcz-xy;uUexM8yalZ`AWSkb5eR5H6p<{3+ z!naAdIhE&#}5x8bOdbkO?Id&Os^6I3FKd{E$ zi*iv*>4*;A?s8>$=j3fH3q=qo^J~sq^T@!OIcK&#@?=q8MOpP*&Vka#26IhrdtO{; zv|&zuaaBTcO^ZHpPEqyxrs22toYc4Vi+!_J-8a&(VEK*97OtwQm{q^K)nKSGu9=yZ zXsR(m1XNAIF^#`_@-MNp@V#oRHpM{s<5du9ZCKm;K~eEb&Bw-$ z{Bv3UBI7mJlN*`#8CyVh$+ZC_A`Z7**N~_5yWIxVZ7`fIYP6=}|bBRlC0h!o$ zR42@ELaLEEoHg>*j$6`L&V?Hf;d%&sY zeT%k}+r3vCpM27|+S`RKVdRV-FPyuH;A^qjVt{D034E%RE22!HL6C{eTA` z_&kF=obKOLZ(}dG7@aOYfuVn+!pZ`kh4*uASE>Smmsb!63&m)k5E3|truPI$!TUZm9Y&F@!YLcuWX=SeURSlfp^W1N-E%cB$YsoR@ z2+3m;cWtBi=mc`Wn}3!CdM{Gp-3JxkkmmK2t$j&5XHP4!r9 z!>Q?wiFFBSO(oxYtH|sP`Bh`J8ckAmZr{O!D;&A$nd$o%YxMW{mt|Duq~x3Ye8@>y zt34E6k(ym$zE7v(Eph_ImviVvLNB!QsUhZQ&y0C_v**!^PN}ZuF}lfvBo5z{;o3C% z;HA6Tm*X4ck3lcvA@3n1n%xR*hvD}wvG0=aK8ZbolR_GHP+JBHWVu%{Uz&mz!%U5} zUA$C?^E>if%PTx(uEmw-33)}CY(X7)vgLD@;AimJKAW(7Ls5GrvCV8zS@nx&%??zHeX-kTX)kL!Nc-L3C$(kHBiA^B6#>7okwRfiZg<3aC$AHqP6b;=*Awc*apv0~^u*mWaUC^V>#bWbKYmuI@A{zN@Y*d&#Tl(< zq{l>6B^QVL`4$8QTS!o#y0JWOW@M;Oa6&-g3~z0x$>N{1Zb|X{gdLT*5VT(JW1R2f z6B+2wRS~J3^pY8PGt$5{6MmyxjOf6rtm&KrQeTyxM{1l2F(HB0n9xAd>qyOQbfh`z zi=!hfK{4SLk=q>iBQ%P(fzM&x47&ID4w4vB6Ps3iYYajJdA-2Vl;)e+s4vl}7W6c1 zouw(&mN|S~kH)9xRMy~$N7pSxyVR^ME?m+zc+Dc3l%nzNbbX$xA`Rx9E$BV?TGdUs zo7whn?pQ(SVq(WCh>SEw2jtC9DoY9oNh>X=oOi~YAicRXAj}+E>bf%Qo`A4BGjtc_ zG$xQ$C3 zLtJ@cc=AIIa^*38mF0Zi8)X?ra2%Wr(`sX$4{x=a+S{TcRVx4B)aDX~uY%ULtf(M=o$eYa zFnq519p^Q3`FHQJdxGc2G1G9qg~b+7C1Kj`5VnUF<(nVzdY-XobWgCfT=BO4vR;;@ zPbR8FeR9ZfkNoyNc_1NOU99#A(iCfAt$1v|dx5H0qj-@V3t#zIq3f?-Kf|n4^Kzp1MJHGiV)n)4uH8@OYZ3X3?RP; zZI19FiTS1Z38~&mnGU7+PcWQYp4yTUKvv&Uxfy?zim^3) z8&*Qq(n2t=2%OsRgSL}^6Nt^=y%P%><7*VkdPW(=;N&cW^NcBr8Oj}5E(ZT;(PJU? z_9`x#-9deHMMbm89SdF6OWOm@km881Da{bMlUmdN%YaT$YQfO-RPtD4Mtp@aD&{rjziZSJne#&r6vpAnm%Y}uEYq)&?cxTpo+v;5S!frJN>IIj~7 zr6i?#ZoJP%l2Y;bjHN+MO}^I1*JER9!Rd-n7Cw)GlBVzOjqkXL6LEM$R93_6lKSLC&${`^Vr%eDfLpX(Xa8_WhmB{7;FYx+6&clIy&kdaj_v`jz=^! zvZAlHvbK^~OBc4EIAV_v3;_3-iBfVzoj^M*dy5@Qu1?Ckdicd)!;*ROHvh%?Mczd* zjRz`M`fc-%)8B76MAEkVk!#4eadw}|+-Bc9uIh^jugqJGW)N$rI`ngJC9#*s-^Gzv zh`F)?ZdzI7SEMg97>nCyWLBCs#z(33dkv@iVVh}VuiucaQdc>nF#yMaVoNmj>Y;T! zPsmU-AGjWGHxEm-7JeIp(rAaSIO+t;{1Xj@dWRuNA7?l*q^ZDAztNUpAYEryoJLfx zKTfMSyJDZ~*%w|Qj(rt8|0?9~6cm@@j=Pt)yVB6%PlpVHm?4MsLsZwPch2Q+JsqvI z87i8aD-57Yx4(pcHer=+_&d^AZNA;ChtqaF;U^KPia(CU4njVq#p+ z>v5T<+H8WnRZVy3yi}cme(Fv=zk%*LiLP^JGKM$ne2)Iebr{!U@VQd>XkA!Uf=@qu z4htXOqrW15B4yJ`=_Q=Sg<37&*(lZTHdsgLi&a&7d5Siq*n_vBn96YUd6CBn@VQm^ z=#IWCd^XV`_W^t*fvLQXeky!UrS3nPD$CKkh0g%p?cR@f zu9(Vn^ka^T>r2|=UXM57aFUAwS;`ZqnEy5>k=&FdcPYh7zzugtWNW0tq?B^-W2YT^}A8 z=&M>tAFU|%QhP`6f#D9t_g)=zH($qPibfn0^Uf^(Mzrse>Qyu(yLfRYa(%#Ubr-p> z=k2VT-p)^XwDVz)W~Qz=?iBX{+=mhU4e2Jk*wp^Ec(Rju^tU&Zem36Shzs8jcl#kf zV5{aT0rYqDvqj;NA)0n0YIva*!rsgZ;Cq@o&+S0l0AEb}h{e|;aV!NA&a)*&cswB} zD6zcCQIZ>LFJUa$J48LZn)e{|W;a?C?d<0QYeG(I-4X6H+;{N(b<|*dX(L;d?Yg~$ zIjJqQ7RNH?R(+aRU=HBz&^iO_5X7|-wLjCn9c?Xft-!UOg!s5VKWRP>yN{UNKjNJW zgb^P01WDK9372`e!Ri`fPWK(`m47)(*B_H=%=zb0`ZjBF&tq>NbCe$TXg${C(R{%2 zd{*XeWX}mK(NA6H^FI0<@1buYJ!?C z20w^}E{+`f5bt94g1nO_)axtz0^BgU0+k4mx zO--jE##t=SeG_|e;_QRG?4-2K%buS#VtMi)iL~;@p{`3wLcfD26Sech!Ulni5utjIHxU}57hID&DeO^*zdWtm-F=}_#iYu z-YF-x!ed-xOM?=E;w_dCRfDNGBOorq*J?0_s2kWr-Uh$mz^W3XQL7I&Be$)r*?ld$ zW};7=F8T|*WiP}5gR&1E z;$tir<6<#JF=Zb<&fVjqnzD}suU&+(t3pjF`}jp3{wl^K*5k#Pd{D$F#+aOkF-h6s zCwYuW%t`3M>TTrB-&GUuWBgeSkN`IVo z!4)|#zzW}A znBR{>PunPB?@VaQqdTL+g8fUoql?9DnGs+xM__<)h;}*Rw&3N^AiTY)ai1#Qof{;- z5Cd=m58~^L=Zz+fVx931ls2ALglJ>l;G>)IQH!%YL*y>Zp5TUjEnZpZl}Fq=o&#>m zH^O+z%Ye_Dn2B++!oqg~v@w?{gIUc7Gh%qT3#D7p3&FF+`o0IxzSV%%FwxMF|h+giNrvuQm!9eqRaGTthG=4H=M zVP*U~ol{vE%HKgxfPVW2=Vf>h@0h&o;BiI#Y7$_gO@<2 zo+hRJDZ5W6`Dm7Bu3nQowRZ}J4XER_Yz1_#M6??xx;XPBizR#p;Oh=CVyk;{Vv2Fi zFG}-^v>1a8=3v_3lb30VH`%=Xf>}drIaA2tzlRkhdwHp~ex{-{y~b$rz9b{V=&RNR z%e1MdSaV_Zpf035PTd5#-w&+rnzg5=WnR&Yd941V;DHnzPogdZWX==DV~@+67$rD0 z95QROh~73How}Te{TAalR53F$E;LPuwpyi_^8!qP-u}AKu*!88BYAOC8~s9OF`6Lf z7Pdw?c(K$~iF~eQ>y*`OP-hx(WaldQlL6^q35$Qsu5%tm$E zSZ#_)CWkK}20!m4QMdoUe{)?@MMx(?(qF_imMMRD_y+DoxEJ;)^@hxM*juU z)zV+2N2M2W=kPP>2fS3PCxLkJA)OSG8qz}clJm)1c%dSSrqKmBsknyzh5m-s6En+a zeQb=K#7<%7u*=vh>;v{C`$;uhwOG}s+MwF0I#YGA>N?e(sz+2WsNPZiP4&I%sM=c{ zq3%)-s`sf6sNYb3qW*{aSB+ZZr-{(yX}UCnnvI%WnzJ>RYHrZnt$9rIlIA1L-!;GB zMxd`YOq-z1)|P79wac~Jw5MsW*WRUlRQsa#UF~PuAH2f6^1Z6PW_d058u8lfwa4o` zuPeNs_j=pwuewNGiY^cLc$#$`x>dS$y6w8tbrId{2^gH$E=&#cMYN$8NHFO%*7`7VDG<<6eHO3oTjF%XnGrnc~)cCFOcW6Su^)3VQUz;d1C4u7-1)xXuh!+*Q~>HZh^zaHQp5E+mX zuq5F6fV%>I3~&b;z*`yu=LL2K_6I&2_(tF-f!_uG5#$x*A7l$k4ayIy4r&f+4_Y2H z9JDp)jG#AyJ`VN|&I_&z-Wt3&_`KlDgKrK#6#PW+S0SMx@gdnEr6G$$R)&m)Yzf&D za$d+4A-9J-6!Kiin<0loz6tp?R2AwQniX0R+7#LsIu?3%=&hmmhdv$pdg#ZYUxywE ziwav5wjyja>_FI6VYi0eANF+E>*1Pkb9h8}Yj{Wa%J8x9t>I^cUle|A_#NR7hd&?w ze)!knM-TVU(6joP-`-n4yU`-knf%+>LQx#>d5v#Xp|F5@saqN_a3aD6u{9y2M8lUrc-_@o$O$Op=m}Nx?}mNf}9{ zNexN!lDd)xlQt&pN;)g)lBDaC?o4_l>4ju%vKdz?79^jOd`I%%lD|)hNJ&b`Nf}Fd zAm!A4@ zl6FqoWob92-Iw-kx*qJJ>%nyuQPthq?z8C$(gyCGcy-v_GWI)+?#oR=9QVZX5OFq zbmli%`mDgL=&XV)XV$E&MOiDdMzb!+x;pE&tk1H3$U2(smF=G$lbw-WlwF(Mn%$8- zl)X87Pxg7)S7iS+`@8Hv>|S<%d!#)Dw=^p4v+YamH`u?m|DL1C3CM}fvFB{hxhdz~ zoX>Joa~J3K<&NfV$=#cKe(sgIx8{DE`@6&72z10bHaK=T&Tw4hxYluxjiu z=H+$e4d!jk+m&~7-l4oF@?Oq+KktjYf96a1Mr>R(3R${)<%kiRqk%>0Y;Z^-{L z|EB_}z_%c}ptPW&U|vC2!C=A31s4}wS8zwc!v)V5yj}2V!M6p!6{-uv3lj_Ng=K|} zg*ytLDEzs|TI4L+Ty$p9-9`T_wiMSD?p;ayQ*(O&UL#UGXW z%FxQ>%EHPumD?+?t^Be|Q*& zwI9`fUi)qB(KzHWBig1Vl%HFewS&aS((?uNR%>)xxE>f`Fu z>T~Ot)c4k3TK`7$TOV$HcuwJ*ujZ=e4$QrM?pO2L=iM~#w>Dc_ZQGo-6>VGF9%}n!e!={c=O37V z_58ogKeQlr!Qg^(7QC>~vT(`5ixdE=pQ-$>N&DCoaBy@n=iS zONy8DFF9w)lS{tsz_M*eL`Qswqob^&u48t`!jA5a{*K)p7j)dy@lwa99j>MEON*Aa zEnT|wq@{b79$5P5(hryZed&=-V`oHXdS_$jVCOlVS9Ctu`AX-vokzMzm#)jNE2Jx` zE4eGXtFWuGYkAj5*9l$QyY_Tl(RF{<<6SRwz1#J9x2ij!JFC00yRo~sd!&0;_x|qN zx?k`9eOdUj(q#k7u3z@ZvbUH0(UZ}$Nk|W5i?k_vxTM3k_$O%FUvT;2sdIB);N}|_ zUfy!_i0cRSpo-s3)j~@UfAma#{uh5xLOIZTq@e#cu-7Fc2YLb)_c=66OO6Y-NTu`^ zDIefza(gLlk>>o@AP4z#I7@0jF5HgrX@L9srPCmJnj4qG{uD<}vs;QH0J;_Va`4Bk zmt(^`_-C*lDQO(&orwRh;9k__e*^a;{juP9dEPIjAb!g9GF5uy(*=Av6aaYo4KV*F zC_(tY3$ID#xZT}GJEe7WfixgYZl4afO3UfLf}0TMSn#jX-7D?IH%<0U2Ylhhg0|iH zZ$Uo3QZXHhq&oUv2G%b%a-dG^1OV`^T;uV8mLXm#fSVPH$?Y6s|BDbORg+y(3kO;* z#U2-Cq7KafZYm(Ta5mPByXaHFG{t?aII>?l()%JVk8i@OhYkgDNu|{60mb;X%(&YE z|4eqNT>eLs)AfG?RY-p z>HZkgOU}Oyi=_;5KH74plp{=TKL&tSP5%;F5$9O&uhPazt*qtGfbW}oq0a694&a+! ziPHh!LTY5c02%>4QVV!ri)yCS!mNNN(06wL-hzF#l*6)M!cH5du>Ur&Jjud=2H`cV z^Q3g#)yxt0@1@!J?qG`o+&AwZQtBHJsG5|CZcQKC#4G5nG z1owicfoYmMahiKPemYq!#dE-S`3gBOFXZ*OH1jx64gXAf7;hJk!!%r`<0jnosL%hK z(1iJz!?ZHl4B&xRFgTFUVDj)_nEwNizas9x33QcIMEOfIM=+LP9s@eij~4#dph+5G z3#HNNfb$vwG+G+`cYu6?SC^*41yU`!L8_&{Ny*?lMtTzHwp*G-MzQ15fE&7aiA>bJ zLvqp%X)#TfhUus@6ZQq4mf_;LA-u; z5bu>81kDfPWub$30sf%W2Urg{8^FWYlE1ruRBe^ksI~#NN~>s?1$FZ_osf+EMs<2{ySmeQgYaU*`H1T^Y?voI=j)!CQGm4Z*^`yl8 z4Qa)zd95(FOH0W%n6m#r;g1LF-9L@{k+;l;r*Z+$2CMMCn0!EGZ|$k!}OKr(_YZ&4&3he z39nTAgt;sWc9Z*Dx&pLZh&En`cn?WKfO^oOQz?s^T_~p$&?UWx^I`Ae-6W1%Cv>t| zfUf{tKidkxAN)HpM$2K&1S|oR0(ksl(DMhFO#tjhK(~_pGhv1TcswV7r;Px#19-YP z0OVz2g~`JV$f5_No#aOM_ZSZny$ibJ3DR5| ziMOtIBWx4WK-O`NK%~GUA9OyIXr=`+r>37f&fW9z~ zd<*kKDPFZ-a_;YBcQfSKfLDGO#K@~MJ}-BuUQV7eX!oCJ6b(2pj`hS>(d zol@5(z^MS7_j3&ZzLcb+M_~2>4x?{}!h8TQ2Y_SuE^KwWb^z7_Rs!w=3<2H-oDX;l zum#WuH~=^cfPF#N0swl1>l=U_!1MST`NzUM5fBXE`D3Tt^(vqk5Gnl?{rNrYhxdU0 zv`E{fFG0hbr3KPU(gwh4xJRU0-AAzRIw*Z1jgSuMLeTj#^gl0{d&ue1>C%08z3~g_ zRM@*L%E%(!haOd*_rovlazSwaIW3eoerL!!S%dTVhvxlwB z>Wek)C~KTG#hPKwvldzFt*zEJYrA#GdIDCtPq&_JJM z+U&MMTeWSqZG-I;+hw*ZZP(bYv)yF-i|tO^A=?8{mZ-p}=&1Op^k|CJZeOf-2SkTr z%{wK!E_!KnPu#P=)8AFt>*jynsBkUsg-bsE&dPF)T-7DRJ9kg5AN$wywZXo{azfVnv`57MR z(_}yfw;lfW)4@+SeX2Wr|KVNu*K_zq_`Pu$qZH;n;`jW+=N;a0c=h2epJ1GRatZ+B z_>;Atto)?z6Xf&38=8-F!Aehk94S5~E6}U|!qc)q7R*9fIJ2^)44eW!E7%}g%}!*y z7&yeS{@4zL?PnLTE7{fTT6R6Vk=@K5W-qdr*{kfI>^GH4g|ihnrKVEdh2Q%D536{& z)BboU!tPL^7OHzxhdhH-x57^W* zZT4dCaSv*C5OaB?6oviG41DjP4rlb|NZnEo-VYhVm+(%&_`giLT)JMmTY5-(Q+i8! zU;04$oTV@mOJ%n(o61M}nrMj*?|%m2wZbftPfGCa!YtBC+Q|~KoSaJbk<-YzHoJWZYQkmE_>~wmB{;JZl zi`eDNPo<~7&{tRmql_@d!m#tL#>t#;$%0p{BJe_7DMnL{R3t6NyAo~So=JG!34jPK~0P#o&=L{5<_Z98L1#u#1Hqz z#>fh?lI+B5%qNrW_#WAfdWTBj(9c zyq()D^^)0`6;_Zr_@cl(NQ-kJk+nhEStw?LG14iGlBJlLmx0@FmQEsl(wXEW>0)w< zbOmOEtH_zsm5^+1fJS*Mxk$Q&TqxZ{4oHW{Rnon9U-=%a4!lktmR=_JOOKG7q}Lz` zy+{s8uaXC)cgPdcN8~xkKwps8rLQ1seo5ZIe6vn^8ZuP_u}kM-{t1KZWhENve6j;? z@&AUiDR@zmL_-!!l;&ez=pgmd4zgN0i)_N{sb@*olKs+Sd4`z0)^sS_mzL)ekTVRlW#MJs7q@*}V zP6?2haFd)wVCId46otF*Bnm4(R%ju0(jrnLoeWLqRI(N?KCP0rk^yNO-sjy;hNLZ! zl=nhnK8_ow*#@?eZDMD$ z^Vk9K#qHpWr?GwDRo>t$nBi4A*e?Lcc7pMAfnuki%t6J@Aj{pQ*i|?s^o3$qqeXE> zT;!vH{#B>gy`)f#2H9WdVK+ej-=z2(J?!4ZM*gDs`(VxGRjCRba5bc_VW|(?aD_CA zxjGyCg=-HsaLElSfx5i1j1a1KIdf(sT+1xOHxD)9HRwZWgD8vRFrL3n)TkF_^STb9 zE`5l@>6C~QGCZbZ0^2lcJb%x!XCf`feGt%t8rbmWNGIsfIYBL%R_i4GFCFogp^Onh zt+fKP9{7w?kGBaAwP7aX*m6u-Ve5r$9r7GT3Y!u`rdAJPjlh>vaZKdSYs>2;w{9ya z*aUYo+KtEc%()3U@tIQ2Ar)cAq7|ot+*@SKrj|R7O(*CDtr!&OL~rO9c&>w+<6(mz zFSkOPE$pM{KelP~;S}NhbTv|pphVtY{V;j&TaF&ojPyw(KU4z-bj?_aQZWzp`aIG`=92|v zA!&!ky@)J^CiEJ<=MPK?>Ocd1M#ajoC6EGxsT& zVNQi~ut$0mQVEy0PA6xOGocrqjW5Zb1L^BLoJ2c-nW+G?@`dCgaxrGCBD^~Acg$M% z5lBLi&#u7tEw94-ay5ATHJH7sA!l4i@K^{Wo}0+ckT`CE+;bZwpxZI?_hX(|N$w(d z<1454LJ~QIQF{=xxf3!(4Nk&ISWkHXXQ>~;i2e#svJvtKm;WGPt|pJ;%b`z7!{jL; z4L(brgCsRVUcd~qhP*^xCa;iJ$!p|w@&=@hdd!gx(y!!g@(y{Iyhq-L?DPTokbFcw zMvs0Aa?dB2rw?PE{*?R`s{v!so<1jEkT1zskgooYb%L4rLc%xL@%ff~hcC(eKz_vc z9X^G$^%MCSGygB-2tH>18~L65L5_l#w_vt+VV%j1PE9Dq7s^yPm9C~5s>Ldc7u8Wc zHBckPJBHL3_kR7TnOdknPE7|$C(%F}gq7Lbq*fXNsc;U~SVEzb;u}S{qa8`XA#fHj z8ei0ik^Z2uG>&2onwOjB^@F^#6v44Ns;mp0*+?iQLYZKZas`{dAE+&Rm` zO}PSENQ-DOEy4ZhGFnb6XeD_3LcC#EjeBl2QaesDeobqoL$r?8(+1i|o9GOzaL$xI zr_FR0osAb8Tj?A+m(HVY(A^)F9)Z5RkhbI7=8NeP+Ci7nPTEDg=`x&I?4`@;3ff0k z(p9vd4$wh5L|4-_beN9NQ94G~(sgt_-9R_uRPu>1{Ykc{|=@y_4RB*O~93_tHc3KIr@pKv#Z< zK1?5>kJ88JFLkjNmHNf%3(uv%6pT?j479~x62r1N0hD-6YoW;m;74Xlwh zu^DV8Yi6_9Y}UeB*&H^P&0}qBK3l*RvUawJEoMtt2Xx?0*2TKnGS%?!$dH>LLvCSP**58R=`WBUcSt7avb)%Bb~1F>Q>E*m zojwTd^a-pb+zA=+Zs~DowtLw=$eE|JGoWRj1?h7?PTHOe8T5Qep%<_Vp-*1SE@79l zgV2yKXIDU1zY5y=HPB11gB*JUboQIr&C(8bi}Zk`Ww)~1q^qT0*k9P~><)G(yNlh; z?qT<`L+n22mG?{MvIp3MklDY5gnkcZ=hLB4N8%R8e(7xK8qD8UvWM_u}mE4dzL*1 z{pJOs@w|*P!>_W}p!2*Tbf34`JM3Nd9(x}ri9ci?v5(m&>@fS3{gwTVea1d#U*LT4 zSM2ZXYxWQJ4f~dT$G&GjuphA+@e})*{lbp0U)gW$clHM~E*JDHNkyP_G3Z-rl}4q7 z#-&r~p@kWtdHJY(RVHX(X6Rr3D!fat3Q`5DLR6uuFjY8K9p95afp+~ib_m{w6#EfY z%|FJP!8@u5l~om~vZcq;N{3=*DrUA~ z=E!EnxLKvRmG~9;io1fFnc102`igN=KN{A|(`G%_QzTxh%f!_X}_4=x1L!+JD-93Y&n(FROWCUY)sB=__EXvPv zW-9n)IyFvFO^s7TmSbfpp_NLltCU()DcDviMOTU10_z;TbD~%|i%O-!mE#q5Xq`&M z1lCzfmUwyJDOXfUrxcy#)YJ-$47HP$GuCzw4GeV3)zjBbD>6G%RoB%yEa#J5VW^u- zsQBe*>L=P1SSu)IkJnP6O_lIRc!joJLAhQ=QByzK*T1aC&@h>^vC#u1O_OLJO_RXf z*yItUY67-08g`}XcBQ-=g{nE(nwfI?nR5D>9_i(zIZF4+aWLoLa>XxS(>zhDEN8Wn zTeVWVYNf5Jm88|8bkt4|Ix{<4X(0P}+bRuE$Lpvxj-d9hmwy&A!&h( zT2_9IY7RP_W{yCJmz9|%#|175!5rhJQVoYwGk2o35KY0wIc_@Cb0?|pR0^z75OI#T zf|8lj={@()RL9Vo>q+&z3hi9E|ElM5UZR;Rda+EKynIcYppBtzk`}tQWqm!vJtKW1 znzrS`oojmx3nl~Qboold*W_pxh$ymmjncdDuC^e3O}=KK$X>s2+Gs7v)^tt~0zIKd zPEeVrm|2QxSIk`5tQa?|6}J+Q*V}S1D*#DP>lP zY69I{ea}RBGCGw?O)JN1ny2mYZ0;;2%dA{&&lJuoiq6c=RnlkGXqF4i49h2LXI$S~1CCD-A0q6Uw+{=W6;U8Wq?pMP=9M`qKM{y8Gv}G|CaH6lzt87>HS^ z?Nchzr|{aoiC&tSZO=2ToGi<@$^%K`s^!ByJ%jz7gUkB5HT|OfH2tDt#(s}@s(w^P zF5IqA$gUufqYyvGt{Ifm56bBWJ<`ibbCm9vlgD}{7;u4RXrj_!z)Eh_O69ASCaqSI zR*TY6Wu-l`m3Fj`cLAk~RMn`5CRstXf~#{pHziiJ(vh55-a~(81(`M4A%tEA2q zWq|=#8ixMFfR&tcM9yHqiaR$?Gb~eQSf*IBgIY*jabS3cxDB zDC_O$RRcQu#BV>`+;0OLfjKH*gQhcmWT1Ps0fHB#P{l52DeOj3U`36GqcYFak>%;I zdpdH3!_+xhNsrJ9IaJBM+B3v6`-%e3kje=MMwnc%PvVH7Igbdpp;NTBuxmSIvKf^LMtEwvgkc&QUe?<)&^OpOC`a;x z$3W*u_gMe9k4ypu8BMpGeYZzzbc+EY{JkOjFYD{?m)lH9DU-ea>g|Hap32xlZ)d*o%a-F0#pY}XMGd6 z*~6+lyFis^538DNz$|CgWFJCn$_^jUN0x2`8orYgtVb0pWs(_sruUD^$yy^v1q)>Y z_DG-QiC>n2g)$#|M5~-68=sj)h^E&gLY6|x<-*Ufd~(=f+UDw=@Hcr(;ljhua~>By zzLS%=aLW|WmMN!^+grzHch69{t|pIp-ZNCLm8MVl8Tvf>qbvjne^cKv8WWV0>*~`t zr7aYs>$C`lh!_m7F2Z0l6!Uq{tL&7nw2u59ukJ|(5w=M zpQp5;_;`pMa@2ld7-aE7u}?OSpQj)qLUmjk5jMHXcF*o&SL)a=re+aKGvE<9$FsZV z$lYBdcLakhz=+5OS&9*MKTlD{Gpot*k>$*hk??|K;~7O634sdhVB;s5+6VVh2 zP1sEy(wY)D*(x$7Ii5J?OybA|Igvy=B(r7BYT=Yq<;rx{k8&AE_-oe4hRhEPvgjwg z46^(u?0%j?pzz`OaY=B(fhtZC6d_aUE90jbku#QsM30ns5L-wdBa>rE#@8X^>pkK* z*_k|~Ns-RaQ>66F))PC2CqfRnTly~V86JQ}(bX?wrjf_0j!U01MzRPxktdf!Cmj$* zCmfJsr#L*D$DvezOwM!6V>rpOs_-|B9b-6g308#qjQwdepw}vN8=Kzeok}|kS=R$c zr{{32@g$GZ3uUr9J+XJn*qf(F!V`G{!SS&x%fu5QkbTD~B1^|2L@z{SVKvBdvS$Jr zJSmT_avtUQQPlo|;>DwpbPwt4%P4 z@&i+><-ioG1x&G41yiU_FvXe=Ore6n6suM+3&2jGn~SV<0wZ3CuD5TkQtn6}ngU+> z5iGQW?Qm;P-|`h0Z9JkZ5yK|ql_&7Z%#;^EU<$loDtP57c;zX0cmii0Pr;d66`Xm*2`S!Zg5sk2e7ZWjSIP5vcjrit zWp&SR-_SC?Ob=0XSvvPKbdB}*_lyd=Z_oPf{?37AL+b{GJ8W8fzL-)~F-L^?tr_bX z8SNVyoQSQTEGY2U34OZ2(0lrOdX?gYb6Aj`qhjLjRXw8<5&RU7$tXUnJBP9CGLeID zP6q3H`<9QPW?0;nTTfQFp_3`CSW#{08Q{Tk-FpTn?JG8{UV-kw5fQUVW<|Adn3s?B z^^af$6J$~lw@i3V7VX_R0;2Yf$l}{{O7r=|qxRhC>rs2|o>F`6F}3#GXS}V1U8#p` zm+K+hMH`Cd_iRrQrqq$!kJq+5%y)2XpsQziq;I)AD|=8~1ba}OyS>M|f+%!q$56tD zMtd-=jfcywE>L=^k03BlVO}#P$C2sFy?lh%L=0cyoD8-Iw`it`d`**nazPXA$}^NZ zNTxDOvF#$*ki0#UnJI6PVaH6Y$-oqAF%a={y}O6{hXx10#zs4bH>j2k4K7zX$A*XG z^fG(EE>5+ozi+rx@l-Oe6f5WmbZA!hj3B)dtgyUFvCe}slrm*bo1L8{yD|5A^$e^Y z-GG!LVOF-xYqB%t^=}|2`^zg}5QiK(K1K&RL46IFG}cixBR$<1vs&oXyr*+hP`7gc zLv{qhhj1E}K?CJH6m;T5F~M@5 z^v-_Kc1S7DBX(s+%&xSdJ+ne5glmuVIo>OVhE{cU4Xs7nP2?&sl-lLh&rG|#?F6&Z z2qmwpr+;YOWaMlyNoC@pTp1;Nib0^CEhZ=U%X>?9c{MoGZqF4%1=XA6hp3})_)Jt( zc23mRGis%$Biqwa<>_#EIx2+2XQK9=VL8HKo7Zk>@WrAfGL2zgS;65e=)jYDl6ae z_BY~<#}`Zk?tFvXBZhP7<6R!?!GOvTFx^ci|2m!6~PE@p~VAMItyOvj)E-Yy`jCaK44$Jjo&a zKFglP@AK?sydC%|!@Hk2XA#EFCIdG;P75xPXmw4~9LcA@b94~5A5n>HF@lnaTa4#OOPC8`y-rBi(1ARwnmh zysc`&%fpedY3ZBpLx}MLMxKV){6}aI=VVoi($k7XD;LNn#=W@Tt zLqa3G;1?*c)!-y_CQiOpjHY9zHv&Bz?MwB*T49r1~VI%`KxL7FqJAvzK z99GSc^tcb?i*xL}NB#rw4d7eAcYyB!KLCCN{1fmK;Ag-ufFpok0lxu$2mApz3UC43 z?w^SSAOH$r02M%o`{5W>!~ie?ya7G{UjW89UQIttEC7E%03Z+$1PBI%0Dw6O1B3%2 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 BpLqZP literal 164161 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 diff --git a/app/src/main/res/font/exo_regular.ttf b/app/src/main/res/font/exo_regular.ttf old mode 100755 new mode 100644 index b20730485857647bb1607bcedad5973b0c942e3b..cf681a354cecc3a1dad327b892aff394f6d92c58 GIT binary patch literal 87740 zcmcHi2Vh*q@du8--6!3tShk8!C)rlHJLyj4bSK^E?$moPR(0>)2HTk8Lba);_ht;C z1qd~vgb;cNNq_`G_=cFTLxKYa1EwSn5Q_Em`^@fpPj|LS^8NpRKZA6-x!u{B*_qkd z*?D^kQxs*gvO`gorJZf<9aYy>cPT98LO^fp92^+Ae(EVr3Y%P{D3OyoM`pEL+xDZw z3TwYvQPOe;M*M+gMYlh$DF2&^_Dff6Shi{D`N!4b{U$}R?pw3$WV|Y=z_$ah32WA$ zy85!Whu_8DpD4<6mbI&vtsK8#cZ;ID)CX92EdW-x^-V>23!f_mYd4&-&GE_!f5zwM z0nOU=C#+ajPtqC7tp=)xP8ZQB%AqC5j!U!Z;d#$_8;&HUA=HHz}LK}At7-E_jq zryMAFwOCR1zpW@mcY??2@i9J&XX7uclA$Op&5;)GNOO3so`@%6kJzntE1xyCpZ#5{ zWxsm&oWgU@Ej;Jkf^*I(;MrsQ`3$dC`>X*u_nbmS;ffQ#cJO_`mjryl4421Ybum?C zxvLKk_h@f*4YP-~pUwA;<-hR;o5pr%JCyNp*-O0@uW_JURo~}}l?nJACj6slcwCAO zx5lLbejDK#_wgO7(cYzs_P}?DFPy*^)i2%XM^wipn)ouJ;p$f=d}<8*2PRzy0H2`u zeY3sIXfNn8+PhTI{z$siiGGdfsdK+tQh!&96#e5qv+ag()%vj3wntz z%$6bd7&%4F$9|)|pywxM`%n4KDExPt@Xuq~pJ2j2G2r9v(c{KVW)DT-dBbe~F|~(I z2(60ihhnZNS zaFyHTa=Y{M-OMM|@bKzB=;7h=nyLUl{VYqcyr%r8j*{a1ypj^f;ej{a;QO>1QcqJm zuQjPU$d`cv==%6!^>m*zGol(_*v5<3G^luvslGHBIHdUiGuH z2iPk2n!yz}mTCt)4i?s4Dfcrz?dHYTzZ_T9vfvMVUT0GRZ_Ic7GQK|kL4Q#rOJdn< zSbIp$7e*BGk|XUz&7)VPALRH!Ns3}qaup@R5r9;5**F-<#pSYPNcp(Z`dQMmwPk_9 zwX3yH*p!O8lb(E`sjavA1-|c@mf0!Ea|bppWH)u!Z_~5~n}+K;v`-)dF@mrxF{1h& z4`5`b)Q*44?fe5}hN5J;X;Q#`rrqXtyPOu96wFG*X0f>5*%+=mX^C&E&$Th!JL)MM z?%&?yJGshId≪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 literal 154154 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 K(z|c-C;UI0?i5G> diff --git a/app/src/main/res/font/exo_regular_italic.ttf b/app/src/main/res/font/exo_regular_italic.ttf old mode 100755 new mode 100644 index 20b02d044dcb521c27cafb8b607a235e3b3b6286..5673cabab2ac1d9d1d7414735624f9aed1bb262c GIT binary patch literal 93356 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ĒjUhdSk6ZwoxP-eO^CS)^MH?$sf;mH21lSHg2z)U_FO2ZH%Q)Y|ft8KbC&=hSugURbAS#D2^}rW?J2@<<9&0%U^mdrJ+Xuzb+tD zF}s#T);L)0zqQIC#0-$tQnvC7SG=A@yvbf$QS5W%_`Z1cd$+f*%;#)(7;>eoQIdin zDVoJa7%F8eGPlTvJ;q$)8*ND|TQ*LvUa`Jzf(>?z#9Ma%sD{5hwlceL^FpWoOIBmi zpJBT@mZYWc)c+8c@&Pdq?lk7Xg^{>M=07C-ZEnC3*AO*ch2Rv|^haU`GoBA4?U6?@ zwLi*{wa0uQEglg20Ez#jNc+B+_OI{)j6-qIalQ)k1JP0>vNuxJGW5iTJe)?xd=XAj zBp)eg`tX7>$NF<77CY^{E;utXt~!(UZz;d1%yD>XaM-D-m9;AtPN~ksv-jAX_I9l% zRO@t?6@|J}(z-TH#5vmSwLP^-3I2lqP_n0Y&8VQC=n-sdR6{-l_rtsI z5Pskoe?r+ve2ab*qsV@5b8|oPAF`i-!#^D3_bS^3|80W*9@xM~cAuJXa>1R1=eHs}Hwm63&tyyReUbJQ-$@xAi?pwf zX@8X4jP`&FPeJW{hyVZ=vV&|PyD`Wd^IgFno@uZW!)K6`#12tP2`Pgh&LA{|)vzUx zM+>qyTRX?5;*$?;%~_G*^o$k_FLOF;0_Qlp&Z+yjyg^$rxgvhcf+MFm?d-Ao-mc_{ z^SEX)Q?h8;z(7 zg_3`{-sNOB$CXYE_Aa(Nm#>}N+?0?pedfZ@cx$Tuh^wvNwsChyZ_8L+M{jl3U9k081Ufk>3Ciqu}hGw^-)dfZ? z>`NgdY9x{<)PeoD^e5U+S|?iZyHs@KU!ASiuVcHaXNQKMFEN6MqaP7+f17_r$o(*~ z$22nhG$V{B*eQ*{?*koK^`@+Ed(t+H@-pb^h)L-VgIF339*D4d6&j7KW>i>#q=KwQ zQgMu^5bdjD+8^aO-xlz`82Brk&d->#2U>a#_&r80j`9ccTv6l_u;Kahsd1r+p19G; zzUlU)o{8SHsWVsF)}B(gkbOm8J5({+U2@6}cDp`(__7*|Bk&1N@r01h8~hPLmxL3& z68=sMoIHetzZC9b(gW!8UJ+DXFgKrTROFSPCT*^c3 z#V#NZ)MIvlf0@yb5ew}D)aFoCJIUg-82R{%>zu8sYt*4%0D+t!riKnFBaA`3{o0Vx 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/menu/menu_log.xml b/app/src/main/res/menu/menu_log.xml deleted file mode 100644 index 7fc9e341b..000000000 --- a/app/src/main/res/menu/menu_log.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_magiskhide.xml b/app/src/main/res/menu/menu_magiskhide.xml deleted file mode 100644 index 6a44ae6cf..000000000 --- a/app/src/main/res/menu/menu_magiskhide.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - \ No newline at end of file From 1449486958d899363447a7770617d3b714cdb388 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 12 Jan 2020 21:52:32 +0800 Subject: [PATCH 233/254] Replace old design with redesign (p3) --- app/proguard-rules.pro | 2 +- .../magisk/base/BasePreferenceFragment.kt | 56 --------- .../base/viewmodel/ObservableViewModel.kt | 6 +- .../magisk/data/repository/LogRepository.kt | 13 +- .../topjohnwu/magisk/extensions/XAndroid.kt | 4 +- .../magisk/model/download/DownloadService.kt | 10 +- .../events/InstallExternalModuleEvent.kt | 1 - .../magisk/model/events/ViewEvents.kt | 19 +-- .../magisk/redesign/log/LogViewModel.kt | 4 +- .../com/topjohnwu/magisk/tasks/RepoUpdater.kt | 1 + .../topjohnwu/magisk/utils/KItemDecoration.kt | 7 +- .../topjohnwu/magisk/utils/SafetyNetHelper.kt | 8 +- .../magisk/view/dialogs/CustomAlertDialog.kt | 113 ------------------ .../magisk/view/dialogs/EnvFixDialog.kt | 51 -------- .../view/dialogs/InstallMethodDialog.kt | 73 ----------- .../view/dialogs/MagiskInstallDialog.kt | 44 ------- .../view/dialogs/ManagerInstallDialog.kt | 26 ---- .../magisk/view/dialogs/UninstallDialog.kt | 40 ------- 18 files changed, 25 insertions(+), 453 deletions(-) delete mode 100644 app/src/main/java/com/topjohnwu/magisk/base/BasePreferenceFragment.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/view/dialogs/CustomAlertDialog.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/view/dialogs/EnvFixDialog.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/view/dialogs/InstallMethodDialog.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/view/dialogs/MagiskInstallDialog.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/view/dialogs/ManagerInstallDialog.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/view/dialogs/UninstallDialog.kt diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index accd5efc2..8d54a7d63 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -42,7 +42,7 @@ -assumenosideeffects class timber.log.Timber.Tree { *; } # Excessive obfuscation --repackageclasses 'a' +-repackageclasses a -allowaccessmodification # QOL diff --git a/app/src/main/java/com/topjohnwu/magisk/base/BasePreferenceFragment.kt b/app/src/main/java/com/topjohnwu/magisk/base/BasePreferenceFragment.kt deleted file mode 100644 index 01aa437c0..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/base/BasePreferenceFragment.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.topjohnwu.magisk.base - -import android.annotation.SuppressLint -import android.content.SharedPreferences -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.preference.* -import androidx.recyclerview.widget.RecyclerView -import org.koin.android.ext.android.inject - -abstract class BasePreferenceFragment : PreferenceFragmentCompat(), - SharedPreferences.OnSharedPreferenceChangeListener { - - protected val prefs: SharedPreferences by inject() - protected val activity get() = requireActivity() as BaseActivity<*, *> - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - val v = super.onCreateView(inflater, container, savedInstanceState) - prefs.registerOnSharedPreferenceChangeListener(this) - return v - } - - override fun onDestroyView() { - prefs.unregisterOnSharedPreferenceChangeListener(this) - super.onDestroyView() - } - - private fun setAllPreferencesToAvoidHavingExtraSpace(preference: Preference) { - preference.isIconSpaceReserved = false - if (preference is PreferenceGroup) - for (i in 0 until preference.preferenceCount) - setAllPreferencesToAvoidHavingExtraSpace(preference.getPreference(i)) - } - - override fun setPreferenceScreen(preferenceScreen: PreferenceScreen?) { - if (preferenceScreen != null) - setAllPreferencesToAvoidHavingExtraSpace(preferenceScreen) - super.setPreferenceScreen(preferenceScreen) - } - - override fun onCreateAdapter(preferenceScreen: PreferenceScreen?): RecyclerView.Adapter<*> = - object : PreferenceGroupAdapter(preferenceScreen) { - @SuppressLint("RestrictedApi") - override fun onPreferenceHierarchyChange(preference: Preference?) { - if (preference != null) - setAllPreferencesToAvoidHavingExtraSpace(preference) - super.onPreferenceHierarchyChange(preference) - } - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/ObservableViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/ObservableViewModel.kt index 17ea6f373..8b6e53498 100644 --- a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/ObservableViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/ObservableViewModel.kt @@ -5,7 +5,7 @@ import androidx.databinding.PropertyChangeRegistry import androidx.lifecycle.ViewModel /** - * Copy of [android.databinding.BaseObservable] which extends [ViewModel] + * Copy of [androidx.databinding.BaseObservable] which extends [ViewModel] */ abstract class ObservableViewModel : TeanityViewModel(), Observable { @@ -35,7 +35,7 @@ abstract class ObservableViewModel : TeanityViewModel(), Observable { /** * Notifies listeners that a specific property has changed. The getter for the property - * that changes should be marked with [android.databinding.Bindable] to generate a field in + * that changes should be marked with [androidx.databinding.Bindable] to generate a field in * `BR` to be used as `fieldId`. * * @param fieldId The generated BR id for the Bindable field. @@ -43,4 +43,4 @@ abstract class ObservableViewModel : TeanityViewModel(), Observable { fun notifyPropertyChanged(fieldId: Int) { callbacks?.notifyCallbacks(this, fieldId, null) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt b/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt index 8194b71a1..7140c3094 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt @@ -3,20 +3,16 @@ package com.topjohnwu.magisk.data.repository import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.data.database.SuLogDao import com.topjohnwu.magisk.model.entity.MagiskLog -import com.topjohnwu.magisk.model.entity.WrappedMagiskLog import com.topjohnwu.superuser.Shell import io.reactivex.Completable import io.reactivex.Single -import java.util.concurrent.TimeUnit class LogRepository( private val logDao: SuLogDao ) { - fun fetchLogsNowrap() = logDao.fetchAll() - - fun fetchLogs() = fetchLogsNowrap().map { it.wrap() } + fun fetchLogs() = logDao.fetchAll() fun fetchMagiskLogs() = Single.fromCallable { Shell.su("tail -n 5000 ${Const.MAGISK_LOG}").exec().out @@ -30,11 +26,4 @@ class LogRepository( fun insert(log: MagiskLog) = logDao.insert(log) - private fun List.wrap(): List { - val day = TimeUnit.DAYS.toMillis(1) - return groupBy { it.time / day } - .map { WrappedMagiskLog(it.key * day, it.value) } - } - - } diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/XAndroid.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/XAndroid.kt index 24da3e04b..78134410a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/XAndroid.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/XAndroid.kt @@ -286,7 +286,7 @@ fun Context.drawableCompat(@DrawableRes id: Int) = ContextCompat.getDrawable(thi * with respect to RTL layout direction */ fun Context.startEndToLeftRight(start: Int, end: Int): Pair { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && + if (SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL ) { return end to start @@ -330,7 +330,7 @@ val isDeviceSecure: Boolean } val securityLevelDate get() = securityLevelFormatter.parseOrNull(securityLevel) ?: Date(0) val securityLevel - get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + get() = if (SDK_INT >= Build.VERSION_CODES.M) { Build.VERSION.SECURITY_PATCH } else { null diff --git a/app/src/main/java/com/topjohnwu/magisk/model/download/DownloadService.kt b/app/src/main/java/com/topjohnwu/magisk/model/download/DownloadService.kt index 4ab17d563..b39909bb8 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/download/DownloadService.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/download/DownloadService.kt @@ -114,13 +114,15 @@ open class DownloadService : RemoteFileService() { @Suppress("ReplaceSingleLineLet") private fun Notification.Builder.setContentIntent(intent: Intent) = - PendingIntent.getActivity(context, nextInt(), intent, PendingIntent.FLAG_ONE_SHOT) - .let { setContentIntent(it) } + setContentIntent( + PendingIntent.getActivity(context, nextInt(), intent, PendingIntent.FLAG_ONE_SHOT) + ) @Suppress("ReplaceSingleLineLet") private fun Notification.Builder.addAction(icon: Int, title: Int, intent: Intent) = - PendingIntent.getActivity(context, nextInt(), intent, PendingIntent.FLAG_ONE_SHOT) - .let { addAction(icon, getString(title), it) } + addAction(icon, getString(title), + PendingIntent.getActivity(context, nextInt(), intent, PendingIntent.FLAG_ONE_SHOT) + ) // --- diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt index 2351df069..0c7c603d8 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt @@ -11,7 +11,6 @@ import com.topjohnwu.magisk.ui.flash.FlashActivity class InstallExternalModuleEvent : ViewEvent(), ActivityExecutor { override fun invoke(activity: BaseActivity<*, *>) { - activity as BaseActivity<*, *> activity.withExternalRW { onSuccess { val intent = Intent(Intent.ACTION_GET_CONTENT) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt index 126387c91..dbe9caf11 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt @@ -35,17 +35,6 @@ abstract class ViewEvent { var handled = false } -data class OpenLinkEvent(val url: String) : ViewEvent() - -class ManagerInstallEvent : ViewEvent() -class MagiskInstallEvent : ViewEvent() - -class ManagerChangelogEvent : ViewEvent() -class MagiskChangelogEvent : ViewEvent() - -class UninstallEvent : ViewEvent() -class EnvFixEvent : ViewEvent() - class UpdateSafetyNetEvent : ViewEvent(), ContextExecutor, KoinComponent, SafetyNetHelper.Callback { private val magiskRepo by inject() @@ -130,21 +119,15 @@ class UpdateSafetyNetEvent : ViewEvent(), ContextExecutor, KoinComponent, Safety } class ViewActionEvent(val action: BaseActivity<*, *>.() -> Unit) : ViewEvent(), ActivityExecutor { - override fun invoke(activity: BaseActivity<*, *>) = (activity as BaseActivity<*, *>).run(action) + override fun invoke(activity: BaseActivity<*, *>) = activity.run(action) } -class OpenFilePickerEvent : ViewEvent() - class OpenChangelogEvent(val item: Repo) : ViewEvent(), ContextExecutor { override fun invoke(context: Context) { MarkDownWindow.show(context, null, item.readme) } } -class InstallModuleEvent(val item: Repo) : ViewEvent() - -class PageChangedEvent : ViewEvent() - class PermissionEvent( val permissions: List, val callback: PublishSubject diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt index 5993c161c..36134093b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt @@ -47,7 +47,7 @@ class LogViewModel( val itemConsoleBinding = itemBindingOf> {} override fun refresh(): Disposable { - val logs = repo.fetchLogsNowrap() + val logs = repo.fetchLogs() .map { it.map { LogItem(it) } } .observeOn(Schedulers.computation()) .map { it to items.calculateDiff(it) } @@ -110,4 +110,4 @@ class LogViewModel( } .add() -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/tasks/RepoUpdater.kt b/app/src/main/java/com/topjohnwu/magisk/tasks/RepoUpdater.kt index c3ba9cee3..62fd54e0f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/tasks/RepoUpdater.kt +++ b/app/src/main/java/com/topjohnwu/magisk/tasks/RepoUpdater.kt @@ -63,6 +63,7 @@ class RepoUpdater( private fun String.trimEtag() = substring(indexOf('\"'), lastIndexOf('\"') + 1) + @Suppress("RedundantLambdaArrow") operator fun invoke(forced: Boolean = false) : Single { val cached = Collections.synchronizedSet(HashSet(repoDB.repoIDList)) return loadPage(cached, etag = repoDB.etagKey).doOnComplete { diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/KItemDecoration.kt b/app/src/main/java/com/topjohnwu/magisk/utils/KItemDecoration.kt index 0fc5c4f5c..28887ad2d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/KItemDecoration.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/KItemDecoration.kt @@ -10,6 +10,7 @@ import androidx.core.view.get import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.RecyclerView import com.topjohnwu.magisk.extensions.drawableCompat +import kotlin.math.roundToInt class KItemDecoration( private val context: Context, @@ -63,7 +64,7 @@ class KItemDecoration( .map { parent[it] } .forEach { child -> parent.getDecoratedBoundsWithMargins(child, bounds) - val bottom = bounds.bottom + Math.round(child.translationY) + val bottom = bounds.bottom + child.translationY.roundToInt() val top = bottom - drawable.intrinsicHeight drawable.setBounds(left, top, right, bottom) drawable.draw(canvas) @@ -93,7 +94,7 @@ class KItemDecoration( .map { parent[it] } .forEach { child -> parent.layoutManager!!.getDecoratedBoundsWithMargins(child, bounds) - val right = bounds.right + Math.round(child.translationX) + val right = bounds.right + child.translationX.roundToInt() val left = right - drawable.intrinsicWidth drawable.setBounds(left, top, right, bottom) drawable.draw(canvas) @@ -114,4 +115,4 @@ class KItemDecoration( } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/SafetyNetHelper.kt b/app/src/main/java/com/topjohnwu/magisk/utils/SafetyNetHelper.kt index 68e7efd82..6e95ed82e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/SafetyNetHelper.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/SafetyNetHelper.kt @@ -12,10 +12,10 @@ interface SafetyNetHelper { companion object { - val RESPONSE_ERR = 0x01 - val CONNECTION_FAIL = 0x02 + const val RESPONSE_ERR = 0x01 + const val CONNECTION_FAIL = 0x02 - val BASIC_PASS = 0x10 - val CTS_PASS = 0x20 + const val BASIC_PASS = 0x10 + const val CTS_PASS = 0x20 } } diff --git a/app/src/main/java/com/topjohnwu/magisk/view/dialogs/CustomAlertDialog.kt b/app/src/main/java/com/topjohnwu/magisk/view/dialogs/CustomAlertDialog.kt deleted file mode 100644 index bce39bba8..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/view/dialogs/CustomAlertDialog.kt +++ /dev/null @@ -1,113 +0,0 @@ -package com.topjohnwu.magisk.view.dialogs - -import android.content.Context -import android.content.DialogInterface -import android.view.LayoutInflater -import android.view.View -import androidx.annotation.StringRes -import androidx.annotation.StyleRes -import androidx.appcompat.app.AlertDialog - -import com.topjohnwu.magisk.databinding.AlertDialogBinding - -open class CustomAlertDialog : AlertDialog.Builder { - - private var positiveListener: DialogInterface.OnClickListener? = null - private var negativeListener: DialogInterface.OnClickListener? = null - private var neutralListener: DialogInterface.OnClickListener? = null - - protected var dialog: AlertDialog? = null - protected var binding: AlertDialogBinding = - AlertDialogBinding.inflate(LayoutInflater.from(context)) - - init { - super.setView(binding.root) - binding.message.visibility = View.GONE - binding.negative.visibility = View.GONE - binding.positive.visibility = View.GONE - binding.neutral.visibility = View.GONE - binding.buttonPanel.visibility = View.GONE - } - - constructor(context: Context) : super(context) - - constructor(context: Context, @StyleRes themeResId: Int) : super(context, themeResId) - - override fun setView(layoutResId: Int): CustomAlertDialog { - return this - } - - override fun setView(view: View): CustomAlertDialog { - return this - } - - override fun setMessage(message: CharSequence?): CustomAlertDialog { - binding.message.visibility = View.VISIBLE - binding.message.text = message - return this - } - - override fun setMessage(@StringRes messageId: Int): CustomAlertDialog { - return setMessage(context.getString(messageId)) - } - - override fun setPositiveButton(text: CharSequence, listener: DialogInterface.OnClickListener?): CustomAlertDialog { - binding.buttonPanel.visibility = View.VISIBLE - binding.positive.visibility = View.VISIBLE - binding.positive.text = text - positiveListener = listener - binding.positive.setOnClickListener { - positiveListener?.onClick(dialog, DialogInterface.BUTTON_POSITIVE) - dialog?.dismiss() - } - return this - } - - override fun setPositiveButton(@StringRes textId: Int, listener: DialogInterface.OnClickListener?): CustomAlertDialog { - return setPositiveButton(context.getString(textId), listener) - } - - override fun setNegativeButton(text: CharSequence, listener: DialogInterface.OnClickListener?): CustomAlertDialog { - binding.buttonPanel.visibility = View.VISIBLE - binding.negative.visibility = View.VISIBLE - binding.negative.text = text - negativeListener = listener - binding.negative.setOnClickListener { - negativeListener?.onClick(dialog, DialogInterface.BUTTON_NEGATIVE) - dialog?.dismiss() - } - return this - } - - override fun setNegativeButton(@StringRes textId: Int, listener: DialogInterface.OnClickListener?): CustomAlertDialog { - return setNegativeButton(context.getString(textId), listener) - } - - override fun setNeutralButton(text: CharSequence, listener: DialogInterface.OnClickListener?): CustomAlertDialog { - binding.buttonPanel.visibility = View.VISIBLE - binding.neutral.visibility = View.VISIBLE - binding.neutral.text = text - neutralListener = listener - binding.neutral.setOnClickListener { - neutralListener?.onClick(dialog, DialogInterface.BUTTON_NEUTRAL) - dialog?.dismiss() - } - return this - } - - override fun setNeutralButton(@StringRes textId: Int, listener: DialogInterface.OnClickListener?): CustomAlertDialog { - return setNeutralButton(context.getString(textId), listener) - } - - override fun create(): AlertDialog { - return super.create().apply { dialog = this } - } - - override fun show(): AlertDialog { - return create().apply { show() } - } - - fun dismiss() { - dialog?.dismiss() - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/view/dialogs/EnvFixDialog.kt b/app/src/main/java/com/topjohnwu/magisk/view/dialogs/EnvFixDialog.kt deleted file mode 100644 index 12d8b81a2..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/view/dialogs/EnvFixDialog.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.topjohnwu.magisk.view.dialogs - -import android.app.Activity -import android.app.ProgressDialog -import android.widget.Toast -import androidx.core.net.toUri -import com.topjohnwu.magisk.Info -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.extensions.cachedFile -import com.topjohnwu.magisk.extensions.reboot -import com.topjohnwu.magisk.net.Networking -import com.topjohnwu.magisk.tasks.MagiskInstaller -import com.topjohnwu.magisk.utils.Utils -import com.topjohnwu.superuser.Shell -import com.topjohnwu.superuser.ShellUtils -import com.topjohnwu.superuser.internal.UiThreadHandler -import com.topjohnwu.superuser.io.SuFile -import java.io.File - -class EnvFixDialog(activity: Activity) : CustomAlertDialog(activity) { - - init { - setTitle(R.string.env_fix_title) - setMessage(R.string.env_fix_msg) - setCancelable(true) - setPositiveButton(android.R.string.yes) { _, _ -> - val pd = ProgressDialog.show(activity, - activity.getString(R.string.setup_title), - activity.getString(R.string.setup_msg)) - object : MagiskInstaller() { - override fun operations(): Boolean { - installDir = SuFile("/data/adb/magisk") - Shell.su("rm -rf /data/adb/magisk/*").exec() - val zip : File = activity.cachedFile("magisk.zip") - if (!ShellUtils.checkSum("MD5", zip, Info.remote.magisk.md5)) - Networking.get(Info.remote.magisk.link).execForFile(zip) - zipUri = zip.toUri() - return extractZip() && Shell.su("fix_env").exec().isSuccess - } - - override fun onResult(success: Boolean) { - pd.dismiss() - Utils.toast(if (success) R.string.reboot_delay_toast else R.string.setup_fail, Toast.LENGTH_LONG) - if (success) - UiThreadHandler.handler.postDelayed({ reboot() }, 5000) - } - }.exec() - } - setNegativeButton(android.R.string.no, null) - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/view/dialogs/InstallMethodDialog.kt b/app/src/main/java/com/topjohnwu/magisk/view/dialogs/InstallMethodDialog.kt deleted file mode 100644 index 6e1e812c1..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/view/dialogs/InstallMethodDialog.kt +++ /dev/null @@ -1,73 +0,0 @@ -package com.topjohnwu.magisk.view.dialogs - -import android.app.Activity -import android.content.Intent -import android.net.Uri -import android.widget.Toast -import androidx.appcompat.app.AlertDialog -import com.topjohnwu.magisk.Const -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.BaseActivity -import com.topjohnwu.magisk.model.download.DownloadService -import com.topjohnwu.magisk.model.entity.internal.Configuration -import com.topjohnwu.magisk.model.entity.internal.DownloadSubject -import com.topjohnwu.magisk.utils.Utils - -internal class InstallMethodDialog(activity: BaseActivity<*, *>, options: List) : - AlertDialog.Builder(activity) { - - init { - setTitle(R.string.select_method) - setItems(options.toTypedArray()) { _, idx -> - when (idx) { - 0 -> downloadOnly(activity) - 1 -> patchBoot(activity) - 2 -> flash(activity) - 3 -> installInactiveSlot(activity) - } - } - } - - private fun flash(activity: BaseActivity<*, *>) = DownloadService(activity) { - subject = DownloadSubject.Magisk(Configuration.Flash.Primary) - } - - private fun patchBoot(activity: BaseActivity<*, *>) = activity.withExternalRW { - onSuccess { - Utils.toast(R.string.patch_file_msg, Toast.LENGTH_LONG) - val intent = Intent(Intent.ACTION_GET_CONTENT) - .setType("*/*") - .addCategory(Intent.CATEGORY_OPENABLE) - activity.startActivityForResult(intent, Const.ID.SELECT_BOOT) { resultCode, data -> - if (resultCode == Activity.RESULT_OK && data != null) { - DownloadService(activity) { - val safeData = data.data ?: Uri.EMPTY - subject = DownloadSubject.Magisk(Configuration.Patch(safeData)) - } - } - } - } - } - - private fun downloadOnly(activity: BaseActivity<*, *>) = activity.withExternalRW { - onSuccess { - DownloadService(activity) { - subject = DownloadSubject.Magisk(Configuration.Download) - } - } - } - - private fun installInactiveSlot(activity: BaseActivity<*, *>) { - CustomAlertDialog(activity) - .setTitle(R.string.warning) - .setMessage(R.string.install_inactive_slot_msg) - .setCancelable(true) - .setPositiveButton(android.R.string.yes) { _, _ -> - DownloadService(activity) { - subject = DownloadSubject.Magisk(Configuration.Flash.Secondary) - } - } - .setNegativeButton(android.R.string.no, null) - .show() - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/view/dialogs/MagiskInstallDialog.kt b/app/src/main/java/com/topjohnwu/magisk/view/dialogs/MagiskInstallDialog.kt deleted file mode 100644 index 2f83b6f98..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/view/dialogs/MagiskInstallDialog.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.topjohnwu.magisk.view.dialogs - -import android.net.Uri -import com.topjohnwu.magisk.Info -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.BaseActivity -import com.topjohnwu.magisk.utils.Utils -import com.topjohnwu.magisk.view.MarkDownWindow -import com.topjohnwu.superuser.Shell -import com.topjohnwu.superuser.ShellUtils -import java.util.* - -class MagiskInstallDialog(a: BaseActivity<*, *>) : CustomAlertDialog(a) { - init { - val filename = "Magisk v${Info.remote.magisk.version}" + - "(${Info.remote.magisk.versionCode})" - setTitle(a.getString(R.string.repo_install_title, a.getString(R.string.magisk))) - setMessage(a.getString(R.string.repo_install_msg, filename)) - setCancelable(true) - setPositiveButton(R.string.install) { _, _ -> - val options = ArrayList() - options.add(a.getString(R.string.download_zip_only)) - options.add(a.getString(R.string.select_patch_file)) - if (Shell.rootAccess()) { - options.add(a.getString(R.string.direct_install)) - val s = ShellUtils.fastCmd("grep_prop ro.build.ab_update") - if (s.isNotEmpty() && s.toBoolean()) { - options.add(a.getString(R.string.install_inactive_slot)) - } - } - InstallMethodDialog(a, options).show() - } - if (Info.remote.magisk.note.isNotEmpty()) { - setNeutralButton(R.string.release_notes) { _, _ -> - if (Info.remote.magisk.note.contains("forum.xda-developers")) { - // Open forum links in browser - Utils.openLink(a, Uri.parse(Info.remote.magisk.note)) - } else { - MarkDownWindow.show(a, null, Info.remote.magisk.note) - } - } - } - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/view/dialogs/ManagerInstallDialog.kt b/app/src/main/java/com/topjohnwu/magisk/view/dialogs/ManagerInstallDialog.kt deleted file mode 100644 index cea430e32..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/view/dialogs/ManagerInstallDialog.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.topjohnwu.magisk.view.dialogs - -import android.app.Activity -import com.topjohnwu.magisk.Info -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.model.download.DownloadService -import com.topjohnwu.magisk.model.entity.internal.Configuration -import com.topjohnwu.magisk.model.entity.internal.DownloadSubject -import com.topjohnwu.magisk.view.MarkDownWindow - -class ManagerInstallDialog(a: Activity) : CustomAlertDialog(a) { - - init { - val subject = DownloadSubject.Manager(Configuration.APK.Upgrade) - setTitle(a.getString(R.string.repo_install_title, a.getString(R.string.app_name))) - setMessage(a.getString(R.string.repo_install_msg, subject.title)) - setCancelable(true) - setPositiveButton(R.string.install) { _, _ -> - DownloadService(a) { this.subject = subject } - } - if (Info.remote.app.note.isNotEmpty()) { - setNeutralButton(R.string.app_changelog) { _, _ -> - MarkDownWindow.show(a, null, Info.remote.app.note) } - } - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/view/dialogs/UninstallDialog.kt b/app/src/main/java/com/topjohnwu/magisk/view/dialogs/UninstallDialog.kt deleted file mode 100644 index 8c7244172..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/view/dialogs/UninstallDialog.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.topjohnwu.magisk.view.dialogs - -import android.app.Activity -import android.app.ProgressDialog -import android.widget.Toast -import com.topjohnwu.magisk.Info -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.model.download.DownloadService -import com.topjohnwu.magisk.model.entity.internal.Configuration -import com.topjohnwu.magisk.model.entity.internal.DownloadSubject -import com.topjohnwu.magisk.utils.Utils -import com.topjohnwu.superuser.Shell - -class UninstallDialog(activity: Activity) : CustomAlertDialog(activity) { - - init { - setTitle(R.string.uninstall_magisk_title) - setMessage(R.string.uninstall_magisk_msg) - setNeutralButton(R.string.restore_img) { _, _ -> - val dialog = ProgressDialog.show(activity, - activity.getString(R.string.restore_img), - activity.getString(R.string.restore_img_msg)) - Shell.su("restore_imgs").submit { result -> - dialog.cancel() - if (result.isSuccess) { - Utils.toast(R.string.restore_done, Toast.LENGTH_SHORT) - } else { - Utils.toast(R.string.restore_fail, Toast.LENGTH_LONG) - } - } - } - if (Info.remote.uninstaller.link.isNotEmpty()) { - setPositiveButton(R.string.complete_uninstall) { _, _ -> - DownloadService(activity) { - subject = DownloadSubject.Magisk(Configuration.Uninstall) - } - } - } - } -} From 3490ba0a56a519d11e472f42caec0b31b648eba7 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Mon, 13 Jan 2020 00:43:09 +0800 Subject: [PATCH 234/254] Redesign is now the new norm --- app/src/main/java/a/b.kt | 2 +- app/src/main/java/a/f.java | 2 +- app/src/main/java/a/m.java | 2 +- .../main/java/com/topjohnwu/magisk/Config.kt | 2 +- .../main/java/com/topjohnwu/magisk/Hacks.kt | 6 +- .../com/topjohnwu/magisk/di/RedesignModule.kt | 26 ++--- .../topjohnwu/magisk/di/ViewModelsModule.kt | 4 +- .../{ui => legacy}/flash/FlashActivity.kt | 2 +- .../magisk/legacy/flash/FlashViewModel.kt | 110 ++++++++++++++++++ .../surequest/SuRequestActivity.kt | 2 +- .../surequest/SuRequestViewModel.kt | 2 +- .../magisk/model/download/DownloadService.kt | 2 +- .../model/entity/recycler/HideRvItem.kt | 2 +- .../model/entity/recycler/ModuleRvItem.kt | 2 +- .../model/entity/recycler/PolicyRvItem.kt | 2 +- .../magisk/model/entity/recycler/ThemeItem.kt | 4 +- .../events/InstallExternalModuleEvent.kt | 2 +- .../model/navigation/MagiskNavigationEvent.kt | 2 +- .../magisk/model/navigation/Navigation.kt | 20 ++-- .../magisk/redesign/MainViewModel.kt | 5 - .../magisk/redesign/flash/FlashViewModel.kt | 5 - .../redesign/request/RequestViewModel.kt | 5 - .../magisk/{redesign => ui}/MainActivity.kt | 12 +- .../com/topjohnwu/magisk/ui/MainViewModel.kt | 5 + .../{redesign => ui}/ReselectionTarget.kt | 4 +- .../{redesign => ui}/compat/CompatActivity.kt | 6 +- .../{redesign => ui}/compat/CompatDelegate.kt | 2 +- .../{redesign => ui}/compat/CompatFragment.kt | 4 +- .../{redesign => ui}/compat/CompatHelpers.kt | 4 +- .../compat/CompatNavigationDelegate.kt | 6 +- .../{redesign => ui}/compat/CompatView.kt | 2 +- .../compat/CompatViewModel.kt | 2 +- .../{redesign => ui}/compat/Queryable.kt | 4 +- .../{redesign => ui}/flash/FlashFragment.kt | 6 +- .../magisk/ui/flash/FlashViewModel.kt | 109 +---------------- .../{redesign => ui}/hide/HideFragment.kt | 6 +- .../{redesign => ui}/hide/HideViewModel.kt | 10 +- .../{redesign => ui}/home/HomeFragment.kt | 4 +- .../{redesign => ui}/home/HomeViewModel.kt | 6 +- .../install/InstallFragment.kt | 4 +- .../install/InstallViewModel.kt | 6 +- .../{redesign => ui}/log/LogFragment.kt | 6 +- .../{redesign => ui}/log/LogViewModel.kt | 8 +- .../{redesign => ui}/module/ModuleFragment.kt | 10 +- .../module/ModuleViewModel.kt | 6 +- .../request/RequestActivity.kt | 6 +- .../magisk/ui/request/RequestViewModel.kt | 5 + .../safetynet/SafetynetFragment.kt | 6 +- .../safetynet/SafetynetViewModel.kt | 6 +- .../settings/SettingsFragment.kt | 4 +- .../settings/SettingsItems.kt | 2 +- .../settings/SettingsViewModel.kt | 10 +- .../superuser/SuperuserFragment.kt | 4 +- .../superuser/SuperuserViewModel.kt | 12 +- .../magisk/{redesign => ui}/theme/Theme.kt | 2 +- .../{redesign => ui}/theme/ThemeFragment.kt | 4 +- .../{redesign => ui}/theme/ThemeViewModel.kt | 6 +- .../com/topjohnwu/magisk/utils/SuHandler.kt | 2 +- .../com/topjohnwu/magisk/view/MagiskDialog.kt | 4 +- app/src/main/res/layout/activity_flash.xml | 4 +- app/src/main/res/layout/activity_main_md2.xml | 2 +- app/src/main/res/layout/activity_request.xml | 2 +- .../main/res/layout/activity_request_md2.xml | 4 +- .../res/layout/dialog_settings_app_name.xml | 2 +- .../layout/dialog_settings_download_path.xml | 2 +- .../layout/dialog_settings_update_channel.xml | 2 +- .../main/res/layout/fragment_flash_md2.xml | 4 +- app/src/main/res/layout/fragment_hide_md2.xml | 4 +- app/src/main/res/layout/fragment_home_md2.xml | 4 +- .../main/res/layout/fragment_install_md2.xml | 4 +- app/src/main/res/layout/fragment_log_md2.xml | 4 +- .../main/res/layout/fragment_module_md2.xml | 4 +- .../res/layout/fragment_safetynet_md2.xml | 4 +- .../main/res/layout/fragment_settings_md2.xml | 4 +- .../res/layout/fragment_superuser_md2.xml | 4 +- .../main/res/layout/fragment_theme_md2.xml | 6 +- .../main/res/layout/include_hide_filter.xml | 2 +- .../main/res/layout/include_log_magisk.xml | 4 +- .../main/res/layout/include_module_filter.xml | 2 +- app/src/main/res/layout/item_developer.xml | 4 +- .../main/res/layout/item_developer_link.xml | 4 +- app/src/main/res/layout/item_hide_md2.xml | 4 +- .../main/res/layout/item_hide_process_md2.xml | 4 +- .../main/res/layout/item_log_access_md2.xml | 4 +- .../main/res/layout/item_module_download.xml | 2 +- app/src/main/res/layout/item_module_md2.xml | 4 +- app/src/main/res/layout/item_policy_md2.xml | 4 +- app/src/main/res/layout/item_repo_md2.xml | 2 +- app/src/main/res/layout/item_section_md2.xml | 4 +- app/src/main/res/layout/item_theme.xml | 6 +- 90 files changed, 313 insertions(+), 313 deletions(-) rename app/src/main/java/com/topjohnwu/magisk/{ui => legacy}/flash/FlashActivity.kt (99%) create mode 100644 app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashViewModel.kt rename app/src/main/java/com/topjohnwu/magisk/{ui => legacy}/surequest/SuRequestActivity.kt (97%) rename app/src/main/java/com/topjohnwu/magisk/{ui => legacy}/surequest/SuRequestViewModel.kt (99%) delete mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/MainViewModel.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/flash/FlashViewModel.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/redesign/request/RequestViewModel.kt rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/MainActivity.kt (94%) create mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/ReselectionTarget.kt (58%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/compat/CompatActivity.kt (97%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/compat/CompatDelegate.kt (98%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/compat/CompatFragment.kt (97%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/compat/CompatHelpers.kt (97%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/compat/CompatNavigationDelegate.kt (97%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/compat/CompatView.kt (88%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/compat/CompatViewModel.kt (96%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/compat/Queryable.kt (91%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/flash/FlashFragment.kt (77%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/hide/HideFragment.kt (94%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/hide/HideViewModel.kt (93%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/home/HomeFragment.kt (91%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/home/HomeViewModel.kt (97%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/install/InstallFragment.kt (89%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/install/InstallViewModel.kt (95%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/log/LogFragment.kt (93%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/log/LogViewModel.kt (94%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/module/ModuleFragment.kt (95%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/module/ModuleViewModel.kt (99%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/request/RequestActivity.kt (78%) create mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/request/RequestViewModel.kt rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/safetynet/SafetynetFragment.kt (81%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/safetynet/SafetynetViewModel.kt (94%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/settings/SettingsFragment.kt (91%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/settings/SettingsItems.kt (99%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/settings/SettingsViewModel.kt (93%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/superuser/SuperuserFragment.kt (93%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/superuser/SuperuserViewModel.kt (95%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/theme/Theme.kt (96%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/theme/ThemeFragment.kt (84%) rename app/src/main/java/com/topjohnwu/magisk/{redesign => ui}/theme/ThemeViewModel.kt (86%) diff --git a/app/src/main/java/a/b.kt b/app/src/main/java/a/b.kt index 150f876fc..918eeeadf 100644 --- a/app/src/main/java/a/b.kt +++ b/app/src/main/java/a/b.kt @@ -1,5 +1,5 @@ package a -import com.topjohnwu.magisk.redesign.MainActivity +import com.topjohnwu.magisk.ui.MainActivity class b : MainActivity() diff --git a/app/src/main/java/a/f.java b/app/src/main/java/a/f.java index 08d136b28..204920535 100644 --- a/app/src/main/java/a/f.java +++ b/app/src/main/java/a/f.java @@ -1,6 +1,6 @@ package a; -import com.topjohnwu.magisk.ui.flash.FlashActivity; +import com.topjohnwu.magisk.legacy.flash.FlashActivity; public class f extends FlashActivity { /* stub */ diff --git a/app/src/main/java/a/m.java b/app/src/main/java/a/m.java index 3d727085d..195a6127c 100644 --- a/app/src/main/java/a/m.java +++ b/app/src/main/java/a/m.java @@ -1,6 +1,6 @@ package a; -import com.topjohnwu.magisk.ui.surequest.SuRequestActivity; +import com.topjohnwu.magisk.legacy.surequest.SuRequestActivity; public class m extends SuRequestActivity { /* stub */ diff --git a/app/src/main/java/com/topjohnwu/magisk/Config.kt b/app/src/main/java/com/topjohnwu/magisk/Config.kt index 6134b4b45..632bb2f75 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Config.kt +++ b/app/src/main/java/com/topjohnwu/magisk/Config.kt @@ -13,7 +13,7 @@ import com.topjohnwu.magisk.di.Protected import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.extensions.inject import com.topjohnwu.magisk.model.preference.PreferenceModel -import com.topjohnwu.magisk.redesign.theme.Theme +import com.topjohnwu.magisk.ui.theme.Theme import com.topjohnwu.magisk.utils.BiometricHelper import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.superuser.Shell diff --git a/app/src/main/java/com/topjohnwu/magisk/Hacks.kt b/app/src/main/java/com/topjohnwu/magisk/Hacks.kt index df21b4d2c..a316acc8a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Hacks.kt +++ b/app/src/main/java/com/topjohnwu/magisk/Hacks.kt @@ -18,10 +18,10 @@ import com.topjohnwu.magisk.extensions.forceGetDeclaredField import com.topjohnwu.magisk.model.download.DownloadService import com.topjohnwu.magisk.model.receiver.GeneralReceiver import com.topjohnwu.magisk.model.update.UpdateCheckService -import com.topjohnwu.magisk.redesign.MainActivity +import com.topjohnwu.magisk.ui.MainActivity import com.topjohnwu.magisk.ui.SplashActivity -import com.topjohnwu.magisk.ui.flash.FlashActivity -import com.topjohnwu.magisk.ui.surequest.SuRequestActivity +import com.topjohnwu.magisk.legacy.flash.FlashActivity +import com.topjohnwu.magisk.legacy.surequest.SuRequestActivity import com.topjohnwu.magisk.utils.refreshLocale import com.topjohnwu.magisk.utils.updateConfig diff --git a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt index c5d93ac71..a79c9a980 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt @@ -1,17 +1,17 @@ package com.topjohnwu.magisk.di -import com.topjohnwu.magisk.redesign.MainViewModel -import com.topjohnwu.magisk.redesign.flash.FlashViewModel -import com.topjohnwu.magisk.redesign.hide.HideViewModel -import com.topjohnwu.magisk.redesign.home.HomeViewModel -import com.topjohnwu.magisk.redesign.install.InstallViewModel -import com.topjohnwu.magisk.redesign.log.LogViewModel -import com.topjohnwu.magisk.redesign.module.ModuleViewModel -import com.topjohnwu.magisk.redesign.request.RequestViewModel -import com.topjohnwu.magisk.redesign.safetynet.SafetynetViewModel -import com.topjohnwu.magisk.redesign.settings.SettingsViewModel -import com.topjohnwu.magisk.redesign.superuser.SuperuserViewModel -import com.topjohnwu.magisk.redesign.theme.ThemeViewModel +import com.topjohnwu.magisk.ui.MainViewModel +import com.topjohnwu.magisk.ui.flash.FlashViewModel +import com.topjohnwu.magisk.ui.hide.HideViewModel +import com.topjohnwu.magisk.ui.home.HomeViewModel +import com.topjohnwu.magisk.ui.install.InstallViewModel +import com.topjohnwu.magisk.ui.log.LogViewModel +import com.topjohnwu.magisk.ui.module.ModuleViewModel +import com.topjohnwu.magisk.ui.request.RequestViewModel +import com.topjohnwu.magisk.ui.safetynet.SafetynetViewModel +import com.topjohnwu.magisk.ui.settings.SettingsViewModel +import com.topjohnwu.magisk.ui.superuser.SuperuserViewModel +import com.topjohnwu.magisk.ui.theme.ThemeViewModel import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module @@ -29,4 +29,4 @@ val redesignModule = module { viewModel { InstallViewModel() } viewModel { MainViewModel() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt index 8df400983..547068331 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt @@ -1,8 +1,8 @@ package com.topjohnwu.magisk.di import android.net.Uri -import com.topjohnwu.magisk.ui.flash.FlashViewModel -import com.topjohnwu.magisk.ui.surequest.SuRequestViewModel +import com.topjohnwu.magisk.legacy.flash.FlashViewModel +import com.topjohnwu.magisk.legacy.surequest.SuRequestViewModel import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashActivity.kt b/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashActivity.kt similarity index 99% rename from app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashActivity.kt rename to app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashActivity.kt index 73609318a..6e2761636 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashActivity.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.ui.flash +package com.topjohnwu.magisk.legacy.flash import android.content.Context import android.content.Intent diff --git a/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashViewModel.kt new file mode 100644 index 000000000..ca68bfa55 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashViewModel.kt @@ -0,0 +1,110 @@ +package com.topjohnwu.magisk.legacy.flash + +import android.Manifest.permission.READ_EXTERNAL_STORAGE +import android.Manifest.permission.WRITE_EXTERNAL_STORAGE +import android.content.res.Resources +import android.net.Uri +import android.os.Handler +import androidx.core.os.postDelayed +import androidx.databinding.ObservableArrayList +import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.Config +import com.topjohnwu.magisk.Const +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.base.viewmodel.BaseViewModel +import com.topjohnwu.magisk.databinding.ComparableRvItem +import com.topjohnwu.magisk.extensions.* +import com.topjohnwu.magisk.model.entity.recycler.ConsoleRvItem +import com.topjohnwu.magisk.model.events.SnackbarEvent +import com.topjohnwu.magisk.model.flash.FlashResultListener +import com.topjohnwu.magisk.model.flash.Flashing +import com.topjohnwu.magisk.model.flash.Patching +import com.topjohnwu.magisk.utils.DiffObservableList +import com.topjohnwu.magisk.utils.KObservableField +import com.topjohnwu.superuser.Shell +import me.tatarka.bindingcollectionadapter2.ItemBinding +import java.io.File +import java.util.* + +class FlashViewModel( + action: String, + installer: Uri, + uri: Uri, + private val resources: Resources +) : BaseViewModel(), FlashResultListener { + + val canShowReboot = Shell.rootAccess() + val showRestartTitle = KObservableField(false) + + val behaviorText = KObservableField(resources.getString(R.string.flashing)) + + val items = DiffObservableList(ComparableRvItem.callback) + val itemBinding = ItemBinding.of> { itemBinding, _, item -> + item.bind(itemBinding) + itemBinding.bindExtra(BR.viewModel, this@FlashViewModel) + } + + private val outItems = ObservableArrayList() + private val logItems = Collections.synchronizedList(mutableListOf()) + + init { + outItems.sendUpdatesTo(items) { it.map { ConsoleRvItem(it) } } + outItems.copyNewInputInto(logItems) + + state = State.LOADING + + when (action) { + Const.Value.FLASH_ZIP -> Flashing + .Install(installer, outItems, logItems, this) + .exec() + Const.Value.UNINSTALL -> Flashing + .Uninstall(installer, outItems, logItems, this) + .exec() + Const.Value.FLASH_MAGISK -> Patching + .Direct(installer, outItems, logItems, this) + .exec() + Const.Value.FLASH_INACTIVE_SLOT -> Patching + .SecondSlot(installer, outItems, logItems, this) + .exec() + Const.Value.PATCH_FILE -> Patching + .File(installer, uri, outItems, logItems, this) + .exec() + } + } + + override fun onResult(isSuccess: Boolean) { + state = if (isSuccess) State.LOADED else State.LOADING_FAILED + behaviorText.value = when { + isSuccess -> resources.getString(R.string.done) + else -> resources.getString(R.string.failure) + } + + if (isSuccess) { + Handler().postDelayed(500) { + showRestartTitle.value = true + } + } + } + + fun savePressed() = withPermissions(READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE) + .map { now } + .map { it.toTime(timeFormatStandard) } + .map { Const.MAGISK_INSTALL_LOG_FILENAME.format(it) } + .map { File(Config.downloadDirectory, it) } + .map { file -> + file.bufferedWriter().use { writer -> + logItems.forEach { + writer.write(it) + writer.newLine() + } + } + file.path + } + .subscribeK { SnackbarEvent(it).publish() } + .add() + + fun restartPressed() = reboot() + + fun backPressed() = back() + +} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestActivity.kt b/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestActivity.kt similarity index 97% rename from app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestActivity.kt rename to app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestActivity.kt index 2fdac91ab..df7542c68 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestActivity.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.ui.surequest +package com.topjohnwu.magisk.legacy.surequest import android.content.Intent import android.content.pm.ActivityInfo diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestViewModel.kt similarity index 99% rename from app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestViewModel.kt rename to app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestViewModel.kt index c9971d738..363b0c471 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestViewModel.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.ui.surequest +package com.topjohnwu.magisk.legacy.surequest import android.content.Intent import android.content.SharedPreferences diff --git a/app/src/main/java/com/topjohnwu/magisk/model/download/DownloadService.kt b/app/src/main/java/com/topjohnwu/magisk/model/download/DownloadService.kt index b39909bb8..64c568ad7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/download/DownloadService.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/download/DownloadService.kt @@ -16,7 +16,7 @@ import com.topjohnwu.magisk.model.entity.internal.Configuration.* import com.topjohnwu.magisk.model.entity.internal.Configuration.Flash.Secondary import com.topjohnwu.magisk.model.entity.internal.DownloadSubject import com.topjohnwu.magisk.model.entity.internal.DownloadSubject.* -import com.topjohnwu.magisk.ui.flash.FlashActivity +import com.topjohnwu.magisk.legacy.flash.FlashActivity import com.topjohnwu.magisk.utils.APKInstall import org.koin.core.get import java.io.File diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt index 30befa36e..c6be0412e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt @@ -10,7 +10,7 @@ import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.model.entity.ProcessHideApp import com.topjohnwu.magisk.model.entity.StatefulProcess import com.topjohnwu.magisk.model.observer.Observer -import com.topjohnwu.magisk.redesign.hide.HideViewModel +import com.topjohnwu.magisk.ui.hide.HideViewModel import com.topjohnwu.magisk.utils.KObservableField import kotlin.math.roundToInt diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt index 1a8a2f2c3..bf35d15e4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt @@ -10,7 +10,7 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.model.entity.module.Module import com.topjohnwu.magisk.model.entity.module.Repo -import com.topjohnwu.magisk.redesign.module.ModuleViewModel +import com.topjohnwu.magisk.ui.module.ModuleViewModel import com.topjohnwu.magisk.utils.KObservableField object SafeModeNotice : ComparableRvItem() { diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt index 6d12c729e..910c67b3d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt @@ -6,7 +6,7 @@ import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.model.entity.MagiskPolicy import com.topjohnwu.magisk.model.events.PolicyUpdateEvent -import com.topjohnwu.magisk.redesign.superuser.SuperuserViewModel +import com.topjohnwu.magisk.ui.superuser.SuperuserViewModel import com.topjohnwu.magisk.utils.KObservableField class PolicyItem(val item: MagiskPolicy, val icon: Drawable) : ComparableRvItem() { diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ThemeItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ThemeItem.kt index c9e44f6fb..4997269e7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ThemeItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ThemeItem.kt @@ -2,7 +2,7 @@ package com.topjohnwu.magisk.model.entity.recycler import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem -import com.topjohnwu.magisk.redesign.theme.Theme +import com.topjohnwu.magisk.ui.theme.Theme class ThemeItem(val theme: Theme) : ComparableRvItem() { @@ -11,4 +11,4 @@ class ThemeItem(val theme: Theme) : ComparableRvItem() { override fun contentSameAs(other: ThemeItem) = itemSameAs(other) override fun itemSameAs(other: ThemeItem) = theme == other.theme -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt index 0c7c603d8..1e891912f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt @@ -6,7 +6,7 @@ import android.content.Intent import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.base.BaseActivity import com.topjohnwu.magisk.intent -import com.topjohnwu.magisk.ui.flash.FlashActivity +import com.topjohnwu.magisk.legacy.flash.FlashActivity class InstallExternalModuleEvent : ViewEvent(), ActivityExecutor { diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt index c5df8ee47..9dea56b0d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt @@ -7,7 +7,7 @@ import androidx.fragment.app.Fragment import com.topjohnwu.magisk.base.BaseActivity import com.topjohnwu.magisk.model.events.ActivityExecutor import com.topjohnwu.magisk.model.events.ViewEvent -import com.topjohnwu.magisk.redesign.compat.CompatActivity +import com.topjohnwu.magisk.ui.compat.CompatActivity import kotlin.reflect.KClass @DslMarker diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt index 1675df86b..69cd99127 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt @@ -5,16 +5,16 @@ import android.content.Intent import android.os.Build import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.intent -import com.topjohnwu.magisk.redesign.MainActivity -import com.topjohnwu.magisk.redesign.hide.HideFragment -import com.topjohnwu.magisk.redesign.home.HomeFragment -import com.topjohnwu.magisk.redesign.install.InstallFragment -import com.topjohnwu.magisk.redesign.log.LogFragment -import com.topjohnwu.magisk.redesign.module.ModuleFragment -import com.topjohnwu.magisk.redesign.safetynet.SafetynetFragment -import com.topjohnwu.magisk.redesign.settings.SettingsFragment -import com.topjohnwu.magisk.redesign.superuser.SuperuserFragment -import com.topjohnwu.magisk.redesign.theme.ThemeFragment +import com.topjohnwu.magisk.ui.MainActivity +import com.topjohnwu.magisk.ui.hide.HideFragment +import com.topjohnwu.magisk.ui.home.HomeFragment +import com.topjohnwu.magisk.ui.install.InstallFragment +import com.topjohnwu.magisk.ui.log.LogFragment +import com.topjohnwu.magisk.ui.module.ModuleFragment +import com.topjohnwu.magisk.ui.safetynet.SafetynetFragment +import com.topjohnwu.magisk.ui.settings.SettingsFragment +import com.topjohnwu.magisk.ui.superuser.SuperuserFragment +import com.topjohnwu.magisk.ui.theme.ThemeFragment object Navigation { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainViewModel.kt deleted file mode 100644 index 41edb6da4..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainViewModel.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.topjohnwu.magisk.redesign - -import com.topjohnwu.magisk.redesign.compat.CompatViewModel - -class MainViewModel : CompatViewModel() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/flash/FlashViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/flash/FlashViewModel.kt deleted file mode 100644 index ff0fbc1cf..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/flash/FlashViewModel.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.topjohnwu.magisk.redesign.flash - -import com.topjohnwu.magisk.redesign.compat.CompatViewModel - -class FlashViewModel : CompatViewModel() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/request/RequestViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/request/RequestViewModel.kt deleted file mode 100644 index 92920eea8..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/request/RequestViewModel.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.topjohnwu.magisk.redesign.request - -import com.topjohnwu.magisk.redesign.compat.CompatViewModel - -class RequestViewModel : CompatViewModel() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt similarity index 94% rename from app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt index fb4057ef3..9f54ffcd9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign +package com.topjohnwu.magisk.ui import android.os.Bundle import android.view.MenuItem @@ -17,11 +17,11 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ActivityMainMd2Binding import com.topjohnwu.magisk.extensions.startAnimations import com.topjohnwu.magisk.model.navigation.Navigation -import com.topjohnwu.magisk.redesign.compat.CompatActivity -import com.topjohnwu.magisk.redesign.compat.CompatNavigationDelegate -import com.topjohnwu.magisk.redesign.home.HomeFragment -import com.topjohnwu.magisk.redesign.module.ModuleFragment -import com.topjohnwu.magisk.redesign.superuser.SuperuserFragment +import com.topjohnwu.magisk.ui.compat.CompatActivity +import com.topjohnwu.magisk.ui.compat.CompatNavigationDelegate +import com.topjohnwu.magisk.ui.home.HomeFragment +import com.topjohnwu.magisk.ui.module.ModuleFragment +import com.topjohnwu.magisk.ui.superuser.SuperuserFragment import com.topjohnwu.magisk.utils.HideBottomViewOnScrollBehavior import com.topjohnwu.magisk.utils.HideTopViewOnScrollBehavior import com.topjohnwu.magisk.utils.HideableBehavior diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt new file mode 100644 index 000000000..63104cbd5 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt @@ -0,0 +1,5 @@ +package com.topjohnwu.magisk.ui + +import com.topjohnwu.magisk.ui.compat.CompatViewModel + +class MainViewModel : CompatViewModel() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/ReselectionTarget.kt b/app/src/main/java/com/topjohnwu/magisk/ui/ReselectionTarget.kt similarity index 58% rename from app/src/main/java/com/topjohnwu/magisk/redesign/ReselectionTarget.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/ReselectionTarget.kt index e7d44d8ef..2134ecc1b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/ReselectionTarget.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/ReselectionTarget.kt @@ -1,7 +1,7 @@ -package com.topjohnwu.magisk.redesign +package com.topjohnwu.magisk.ui interface ReselectionTarget { fun onReselected() -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatActivity.kt similarity index 97% rename from app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatActivity.kt index 647c4ba07..66229faa8 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatActivity.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.compat +package com.topjohnwu.magisk.ui.compat import android.app.Activity import android.content.Intent @@ -17,7 +17,7 @@ import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.model.events.ViewEvent import com.topjohnwu.magisk.model.navigation.MagiskNavigationEvent import com.topjohnwu.magisk.model.navigation.Navigator -import com.topjohnwu.magisk.redesign.theme.Theme +import com.topjohnwu.magisk.ui.theme.Theme import kotlin.reflect.KClass @@ -89,4 +89,4 @@ fun Activity.hideKeyboard() { getSystemService() ?.hideSoftInputFromWindow(view.windowToken, 0) view.clearFocus() -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatDelegate.kt similarity index 98% rename from app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatDelegate.kt index d5e97b299..783cfd1c2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatDelegate.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.compat +package com.topjohnwu.magisk.ui.compat import android.view.View import androidx.core.graphics.Insets diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatFragment.kt similarity index 97% rename from app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatFragment.kt index c4b942736..14e60a9eb 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatFragment.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.compat +package com.topjohnwu.magisk.ui.compat import android.os.Bundle import android.view.View @@ -53,4 +53,4 @@ abstract class CompatFragment> itemBindingOf( ) = OnItemBind { itemBinding, _, item -> item.bind(itemBinding) body(itemBinding) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatNavigationDelegate.kt similarity index 97% rename from app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatNavigationDelegate.kt index 5037e6ff3..f1c965c70 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatNavigationDelegate.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatNavigationDelegate.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.compat +package com.topjohnwu.magisk.ui.compat import android.content.Intent import android.os.Bundle @@ -8,7 +8,7 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.model.navigation.MagiskAnimBuilder import com.topjohnwu.magisk.model.navigation.MagiskNavigationEvent import com.topjohnwu.magisk.model.navigation.Navigator -import com.topjohnwu.magisk.redesign.ReselectionTarget +import com.topjohnwu.magisk.ui.ReselectionTarget import timber.log.Timber class CompatNavigationDelegate( @@ -125,4 +125,4 @@ class CompatNavigationDelegate( ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatView.kt b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatView.kt similarity index 88% rename from app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatView.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatView.kt index cfcf4d9f2..919851df6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatView.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatView.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.compat +package com.topjohnwu.magisk.ui.compat import android.view.View import androidx.core.graphics.Insets diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatViewModel.kt similarity index 96% rename from app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatViewModel.kt index 7868e6014..c22ae870f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatViewModel.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.compat +package com.topjohnwu.magisk.ui.compat import androidx.annotation.CallSuper import androidx.core.graphics.Insets diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/Queryable.kt b/app/src/main/java/com/topjohnwu/magisk/ui/compat/Queryable.kt similarity index 91% rename from app/src/main/java/com/topjohnwu/magisk/redesign/compat/Queryable.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/compat/Queryable.kt index 3d6f43661..ff8d5e508 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/Queryable.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/compat/Queryable.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.compat +package com.topjohnwu.magisk.ui.compat import android.os.Handler import android.os.Looper @@ -20,4 +20,4 @@ interface Queryable { override fun submitQuery() {} } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/flash/FlashFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt similarity index 77% rename from app/src/main/java/com/topjohnwu/magisk/redesign/flash/FlashFragment.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt index 63366c484..b32f65456 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/flash/FlashFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt @@ -1,8 +1,8 @@ -package com.topjohnwu.magisk.redesign.flash +package com.topjohnwu.magisk.ui.flash import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentFlashMd2Binding -import com.topjohnwu.magisk.redesign.compat.CompatFragment +import com.topjohnwu.magisk.ui.compat.CompatFragment import org.koin.androidx.viewmodel.ext.android.viewModel class FlashFragment : CompatFragment() { @@ -10,4 +10,4 @@ class FlashFragment : CompatFragment() override val layoutRes = R.layout.fragment_flash_md2 override val viewModel by viewModel() -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt index e2ead2b3b..a70f2f3df 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt @@ -1,110 +1,5 @@ package com.topjohnwu.magisk.ui.flash -import android.Manifest.permission.READ_EXTERNAL_STORAGE -import android.Manifest.permission.WRITE_EXTERNAL_STORAGE -import android.content.res.Resources -import android.net.Uri -import android.os.Handler -import androidx.core.os.postDelayed -import androidx.databinding.ObservableArrayList -import com.topjohnwu.magisk.BR -import com.topjohnwu.magisk.Config -import com.topjohnwu.magisk.Const -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.viewmodel.BaseViewModel -import com.topjohnwu.magisk.databinding.ComparableRvItem -import com.topjohnwu.magisk.extensions.* -import com.topjohnwu.magisk.model.entity.recycler.ConsoleRvItem -import com.topjohnwu.magisk.model.events.SnackbarEvent -import com.topjohnwu.magisk.model.flash.FlashResultListener -import com.topjohnwu.magisk.model.flash.Flashing -import com.topjohnwu.magisk.model.flash.Patching -import com.topjohnwu.magisk.utils.DiffObservableList -import com.topjohnwu.magisk.utils.KObservableField -import com.topjohnwu.superuser.Shell -import me.tatarka.bindingcollectionadapter2.ItemBinding -import java.io.File -import java.util.* +import com.topjohnwu.magisk.ui.compat.CompatViewModel -class FlashViewModel( - action: String, - installer: Uri, - uri: Uri, - private val resources: Resources -) : BaseViewModel(), FlashResultListener { - - val canShowReboot = Shell.rootAccess() - val showRestartTitle = KObservableField(false) - - val behaviorText = KObservableField(resources.getString(R.string.flashing)) - - val items = DiffObservableList(ComparableRvItem.callback) - val itemBinding = ItemBinding.of> { itemBinding, _, item -> - item.bind(itemBinding) - itemBinding.bindExtra(BR.viewModel, this@FlashViewModel) - } - - private val outItems = ObservableArrayList() - private val logItems = Collections.synchronizedList(mutableListOf()) - - init { - outItems.sendUpdatesTo(items) { it.map { ConsoleRvItem(it) } } - outItems.copyNewInputInto(logItems) - - state = State.LOADING - - when (action) { - Const.Value.FLASH_ZIP -> Flashing - .Install(installer, outItems, logItems, this) - .exec() - Const.Value.UNINSTALL -> Flashing - .Uninstall(installer, outItems, logItems, this) - .exec() - Const.Value.FLASH_MAGISK -> Patching - .Direct(installer, outItems, logItems, this) - .exec() - Const.Value.FLASH_INACTIVE_SLOT -> Patching - .SecondSlot(installer, outItems, logItems, this) - .exec() - Const.Value.PATCH_FILE -> Patching - .File(installer, uri, outItems, logItems, this) - .exec() - } - } - - override fun onResult(isSuccess: Boolean) { - state = if (isSuccess) State.LOADED else State.LOADING_FAILED - behaviorText.value = when { - isSuccess -> resources.getString(R.string.done) - else -> resources.getString(R.string.failure) - } - - if (isSuccess) { - Handler().postDelayed(500) { - showRestartTitle.value = true - } - } - } - - fun savePressed() = withPermissions(READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE) - .map { now } - .map { it.toTime(timeFormatStandard) } - .map { Const.MAGISK_INSTALL_LOG_FILENAME.format(it) } - .map { File(Config.downloadDirectory, it) } - .map { file -> - file.bufferedWriter().use { writer -> - logItems.forEach { - writer.write(it) - writer.newLine() - } - } - file.path - } - .subscribeK { SnackbarEvent(it).publish() } - .add() - - fun restartPressed() = reboot() - - fun backPressed() = back() - -} \ No newline at end of file +class FlashViewModel : CompatViewModel() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideFragment.kt similarity index 94% rename from app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/hide/HideFragment.kt index da5efff9d..b45a4f5c1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideFragment.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.hide +package com.topjohnwu.magisk.ui.hide import android.content.Context import android.os.Bundle @@ -12,8 +12,8 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentHideMd2Binding -import com.topjohnwu.magisk.redesign.compat.CompatFragment -import com.topjohnwu.magisk.redesign.compat.hideKeyboard +import com.topjohnwu.magisk.ui.compat.CompatFragment +import com.topjohnwu.magisk.ui.compat.hideKeyboard import com.topjohnwu.magisk.utils.MotionRevealHelper import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt similarity index 93% rename from app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt index 13744d4d3..966821f8f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.hide +package com.topjohnwu.magisk.ui.hide import android.content.pm.ApplicationInfo import androidx.databinding.Bindable @@ -12,10 +12,10 @@ import com.topjohnwu.magisk.model.entity.ProcessHideApp import com.topjohnwu.magisk.model.entity.StatefulProcess import com.topjohnwu.magisk.model.entity.recycler.HideItem import com.topjohnwu.magisk.model.entity.recycler.HideProcessItem -import com.topjohnwu.magisk.redesign.compat.CompatViewModel -import com.topjohnwu.magisk.redesign.compat.Queryable -import com.topjohnwu.magisk.redesign.compat.filterableListOf -import com.topjohnwu.magisk.redesign.compat.itemBindingOf +import com.topjohnwu.magisk.ui.compat.CompatViewModel +import com.topjohnwu.magisk.ui.compat.Queryable +import com.topjohnwu.magisk.ui.compat.filterableListOf +import com.topjohnwu.magisk.ui.compat.itemBindingOf import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.currentLocale diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt similarity index 91% rename from app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt index ca2ed1fba..e4e8e49a7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.home +package com.topjohnwu.magisk.ui.home import android.view.Menu import android.view.MenuInflater @@ -7,7 +7,7 @@ import androidx.core.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentHomeMd2Binding import com.topjohnwu.magisk.model.navigation.Navigation -import com.topjohnwu.magisk.redesign.compat.CompatFragment +import com.topjohnwu.magisk.ui.compat.CompatFragment import org.koin.androidx.viewmodel.ext.android.viewModel class HomeFragment : CompatFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt similarity index 97% rename from app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt index 07b57f127..52ccc1a71 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.home +package com.topjohnwu.magisk.ui.home import android.Manifest import android.os.Build @@ -22,8 +22,8 @@ import com.topjohnwu.magisk.model.events.dialog.ManagerInstallDialog import com.topjohnwu.magisk.model.events.dialog.UninstallDialog import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.model.observer.Observer -import com.topjohnwu.magisk.redesign.compat.CompatViewModel -import com.topjohnwu.magisk.redesign.compat.itemBindingOf +import com.topjohnwu.magisk.ui.compat.CompatViewModel +import com.topjohnwu.magisk.ui.compat.itemBindingOf import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.superuser.Shell import me.tatarka.bindingcollectionadapter2.BR diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/install/InstallFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallFragment.kt similarity index 89% rename from app/src/main/java/com/topjohnwu/magisk/redesign/install/InstallFragment.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/install/InstallFragment.kt index 34fd1e0c2..d2e4a5880 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/install/InstallFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallFragment.kt @@ -1,11 +1,11 @@ -package com.topjohnwu.magisk.redesign.install +package com.topjohnwu.magisk.ui.install import android.content.Intent import androidx.core.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentInstallMd2Binding import com.topjohnwu.magisk.model.events.RequestFileEvent -import com.topjohnwu.magisk.redesign.compat.CompatFragment +import com.topjohnwu.magisk.ui.compat.CompatFragment import org.koin.androidx.viewmodel.ext.android.viewModel class InstallFragment : CompatFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/install/InstallViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt similarity index 95% rename from app/src/main/java/com/topjohnwu/magisk/redesign/install/InstallViewModel.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt index 25150c36e..58a2da93d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/install/InstallViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.install +package com.topjohnwu.magisk.ui.install import android.net.Uri import com.topjohnwu.magisk.R @@ -8,7 +8,7 @@ import com.topjohnwu.magisk.model.download.RemoteFileService import com.topjohnwu.magisk.model.entity.internal.Configuration import com.topjohnwu.magisk.model.entity.internal.DownloadSubject import com.topjohnwu.magisk.model.events.RequestFileEvent -import com.topjohnwu.magisk.redesign.compat.CompatViewModel +import com.topjohnwu.magisk.ui.compat.CompatViewModel import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.ShellUtils @@ -69,4 +69,4 @@ class InstallViewModel : CompatViewModel(State.LOADED) { .fastCmd("grep_prop ro.build.ab_update") .let { it.isNotEmpty() && it.toBoolean() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt similarity index 93% rename from app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt index 274de9352..e4a25c4aa 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.log +package com.topjohnwu.magisk.ui.log import android.os.Bundle import android.view.Menu @@ -9,8 +9,8 @@ import androidx.core.graphics.Insets import androidx.core.view.isVisible import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentLogMd2Binding -import com.topjohnwu.magisk.redesign.MainActivity -import com.topjohnwu.magisk.redesign.compat.CompatFragment +import com.topjohnwu.magisk.ui.MainActivity +import com.topjohnwu.magisk.ui.compat.CompatFragment import com.topjohnwu.magisk.utils.MotionRevealHelper import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt similarity index 94% rename from app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt index 36134093b..c88ebb873 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.log +package com.topjohnwu.magisk.ui.log import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.Config @@ -12,9 +12,9 @@ import com.topjohnwu.magisk.model.entity.recycler.ConsoleItem import com.topjohnwu.magisk.model.entity.recycler.LogItem import com.topjohnwu.magisk.model.entity.recycler.TextItem import com.topjohnwu.magisk.model.events.SnackbarEvent -import com.topjohnwu.magisk.redesign.compat.CompatViewModel -import com.topjohnwu.magisk.redesign.compat.diffListOf -import com.topjohnwu.magisk.redesign.compat.itemBindingOf +import com.topjohnwu.magisk.ui.compat.CompatViewModel +import com.topjohnwu.magisk.ui.compat.diffListOf +import com.topjohnwu.magisk.ui.compat.itemBindingOf import com.topjohnwu.superuser.Shell import io.reactivex.Completable import io.reactivex.android.schedulers.AndroidSchedulers diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt similarity index 95% rename from app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt index bb33a86f9..ac1008ff6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.module +package com.topjohnwu.magisk.ui.module import android.content.Intent import android.os.Bundle @@ -14,10 +14,10 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentModuleMd2Binding import com.topjohnwu.magisk.model.events.InstallExternalModuleEvent import com.topjohnwu.magisk.model.events.ViewEvent -import com.topjohnwu.magisk.redesign.MainActivity -import com.topjohnwu.magisk.redesign.ReselectionTarget -import com.topjohnwu.magisk.redesign.compat.CompatFragment -import com.topjohnwu.magisk.redesign.compat.hideKeyboard +import com.topjohnwu.magisk.ui.MainActivity +import com.topjohnwu.magisk.ui.ReselectionTarget +import com.topjohnwu.magisk.ui.compat.CompatFragment +import com.topjohnwu.magisk.ui.compat.hideKeyboard import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener import com.topjohnwu.magisk.utils.MotionRevealHelper import com.topjohnwu.magisk.utils.PinchZoomTouchListener diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt similarity index 99% rename from app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt index 0c01db6f9..40421f29d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.redesign.module +package com.topjohnwu.magisk.ui.module import androidx.annotation.WorkerThread import androidx.databinding.Bindable @@ -19,8 +19,8 @@ import com.topjohnwu.magisk.model.entity.recycler.* import com.topjohnwu.magisk.model.events.InstallExternalModuleEvent import com.topjohnwu.magisk.model.events.OpenChangelogEvent import com.topjohnwu.magisk.model.events.dialog.ModuleInstallDialog -import com.topjohnwu.magisk.redesign.compat.* import com.topjohnwu.magisk.tasks.RepoUpdater +import com.topjohnwu.magisk.ui.compat.* import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.currentLocale @@ -310,4 +310,4 @@ class ModuleViewModel( OpenChangelogEvent(item.repo ?: return).publish() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/request/RequestActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestActivity.kt similarity index 78% rename from app/src/main/java/com/topjohnwu/magisk/redesign/request/RequestActivity.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/request/RequestActivity.kt index 8e8303bfb..814d0f312 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/request/RequestActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestActivity.kt @@ -1,8 +1,8 @@ -package com.topjohnwu.magisk.redesign.request +package com.topjohnwu.magisk.ui.request import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ActivityRequestMd2Binding -import com.topjohnwu.magisk.redesign.compat.CompatActivity +import com.topjohnwu.magisk.ui.compat.CompatActivity import org.koin.androidx.viewmodel.ext.android.viewModel class RequestActivity : CompatActivity() { @@ -11,4 +11,4 @@ class RequestActivity : CompatActivity() -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestViewModel.kt new file mode 100644 index 000000000..52ab65141 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestViewModel.kt @@ -0,0 +1,5 @@ +package com.topjohnwu.magisk.ui.request + +import com.topjohnwu.magisk.ui.compat.CompatViewModel + +class RequestViewModel : CompatViewModel() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetFragment.kt similarity index 81% rename from app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetFragment.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetFragment.kt index 44e83d184..f66663ac9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetFragment.kt @@ -1,8 +1,8 @@ -package com.topjohnwu.magisk.redesign.safetynet +package com.topjohnwu.magisk.ui.safetynet import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentSafetynetMd2Binding -import com.topjohnwu.magisk.redesign.compat.CompatFragment +import com.topjohnwu.magisk.ui.compat.CompatFragment import org.koin.androidx.viewmodel.ext.android.viewModel class SafetynetFragment : CompatFragment() { @@ -15,4 +15,4 @@ class SafetynetFragment : CompatFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeViewModel.kt similarity index 86% rename from app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeViewModel.kt index 35c9d0876..132b8b7f2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeViewModel.kt @@ -1,9 +1,9 @@ -package com.topjohnwu.magisk.redesign.theme +package com.topjohnwu.magisk.ui.theme import com.topjohnwu.magisk.model.entity.recycler.TappableHeadlineItem import com.topjohnwu.magisk.model.events.RecreateEvent import com.topjohnwu.magisk.model.events.dialog.DarkThemeDialog -import com.topjohnwu.magisk.redesign.compat.CompatViewModel +import com.topjohnwu.magisk.ui.compat.CompatViewModel class ThemeViewModel : CompatViewModel(), TappableHeadlineItem.Listener { @@ -21,4 +21,4 @@ class ThemeViewModel : CompatViewModel(), TappableHeadlineItem.Listener { private fun darkModePressed() = DarkThemeDialog().publish() -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/SuHandler.kt b/app/src/main/java/com/topjohnwu/magisk/utils/SuHandler.kt index c009b2445..3afee48a6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/SuHandler.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/SuHandler.kt @@ -15,7 +15,7 @@ import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.model.entity.MagiskPolicy import com.topjohnwu.magisk.model.entity.toLog import com.topjohnwu.magisk.model.entity.toPolicy -import com.topjohnwu.magisk.ui.surequest.SuRequestActivity +import com.topjohnwu.magisk.legacy.surequest.SuRequestActivity import com.topjohnwu.superuser.Shell import timber.log.Timber diff --git a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt index 3fba7938d..ec98b0631 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt @@ -22,7 +22,7 @@ import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.databinding.DialogMagiskBaseBinding -import com.topjohnwu.magisk.redesign.compat.itemBindingOf +import com.topjohnwu.magisk.ui.compat.itemBindingOf import com.topjohnwu.magisk.utils.KObservableField import me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapters import me.tatarka.bindingcollectionadapter2.ItemBinding @@ -277,4 +277,4 @@ class MagiskDialog @JvmOverloads constructor( } typealias OnDialogButtonClickListener = (DialogInterface) -> Unit -typealias OnDialogClickListener = (position: Int) -> Unit \ No newline at end of file +typealias OnDialogClickListener = (position: Int) -> Unit diff --git a/app/src/main/res/layout/activity_flash.xml b/app/src/main/res/layout/activity_flash.xml index 81dc153f7..cecf04191 100644 --- a/app/src/main/res/layout/activity_flash.xml +++ b/app/src/main/res/layout/activity_flash.xml @@ -7,7 +7,7 @@ + type="com.topjohnwu.magisk.legacy.flash.FlashViewModel" /> @@ -149,4 +149,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_main_md2.xml b/app/src/main/res/layout/activity_main_md2.xml index 6f55fa2dc..588b460b5 100644 --- a/app/src/main/res/layout/activity_main_md2.xml +++ b/app/src/main/res/layout/activity_main_md2.xml @@ -7,7 +7,7 @@ + type="com.topjohnwu.magisk.ui.MainViewModel" /> diff --git a/app/src/main/res/layout/activity_request.xml b/app/src/main/res/layout/activity_request.xml index 70af73e7d..6d0ed9652 100644 --- a/app/src/main/res/layout/activity_request.xml +++ b/app/src/main/res/layout/activity_request.xml @@ -7,7 +7,7 @@ + type="com.topjohnwu.magisk.legacy.surequest.SuRequestViewModel" /> diff --git a/app/src/main/res/layout/activity_request_md2.xml b/app/src/main/res/layout/activity_request_md2.xml index 7ab7d92e8..2ac22e2cd 100644 --- a/app/src/main/res/layout/activity_request_md2.xml +++ b/app/src/main/res/layout/activity_request_md2.xml @@ -5,7 +5,7 @@ + type="com.topjohnwu.magisk.ui.request.RequestViewModel" /> @@ -20,4 +20,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/dialog_settings_app_name.xml b/app/src/main/res/layout/dialog_settings_app_name.xml index f0e325396..cc549a77c 100644 --- a/app/src/main/res/layout/dialog_settings_app_name.xml +++ b/app/src/main/res/layout/dialog_settings_app_name.xml @@ -7,7 +7,7 @@ + type="com.topjohnwu.magisk.ui.settings.Hide" /> diff --git a/app/src/main/res/layout/dialog_settings_download_path.xml b/app/src/main/res/layout/dialog_settings_download_path.xml index d5782a298..f3ea581a1 100644 --- a/app/src/main/res/layout/dialog_settings_download_path.xml +++ b/app/src/main/res/layout/dialog_settings_download_path.xml @@ -7,7 +7,7 @@ + type="com.topjohnwu.magisk.ui.settings.DownloadPath" /> diff --git a/app/src/main/res/layout/dialog_settings_update_channel.xml b/app/src/main/res/layout/dialog_settings_update_channel.xml index 57cb087b4..26095efa2 100644 --- a/app/src/main/res/layout/dialog_settings_update_channel.xml +++ b/app/src/main/res/layout/dialog_settings_update_channel.xml @@ -7,7 +7,7 @@ + type="com.topjohnwu.magisk.ui.settings.UpdateChannelUrl" /> diff --git a/app/src/main/res/layout/fragment_flash_md2.xml b/app/src/main/res/layout/fragment_flash_md2.xml index d7922085b..55900f5c7 100644 --- a/app/src/main/res/layout/fragment_flash_md2.xml +++ b/app/src/main/res/layout/fragment_flash_md2.xml @@ -5,7 +5,7 @@ + type="com.topjohnwu.magisk.ui.flash.FlashViewModel" /> @@ -20,4 +20,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_hide_md2.xml b/app/src/main/res/layout/fragment_hide_md2.xml index 1144ba51c..c425ff08d 100644 --- a/app/src/main/res/layout/fragment_hide_md2.xml +++ b/app/src/main/res/layout/fragment_hide_md2.xml @@ -9,7 +9,7 @@ + type="com.topjohnwu.magisk.ui.hide.HideViewModel" /> @@ -89,4 +89,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 0c8209012..6cefd97e9 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -17,7 +17,7 @@ - + @@ -25,7 +25,7 @@ + type="com.topjohnwu.magisk.ui.home.HomeViewModel" /> diff --git a/app/src/main/res/layout/fragment_install_md2.xml b/app/src/main/res/layout/fragment_install_md2.xml index 4ec602d78..50c1c3eb5 100644 --- a/app/src/main/res/layout/fragment_install_md2.xml +++ b/app/src/main/res/layout/fragment_install_md2.xml @@ -7,7 +7,7 @@ + type="com.topjohnwu.magisk.ui.install.InstallViewModel" /> @@ -278,4 +278,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_log_md2.xml b/app/src/main/res/layout/fragment_log_md2.xml index 4fa3d9c4e..daebc548c 100644 --- a/app/src/main/res/layout/fragment_log_md2.xml +++ b/app/src/main/res/layout/fragment_log_md2.xml @@ -7,7 +7,7 @@ + type="com.topjohnwu.magisk.ui.log.LogViewModel" /> @@ -77,4 +77,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_module_md2.xml b/app/src/main/res/layout/fragment_module_md2.xml index 1d577a1c0..6ad7391b0 100644 --- a/app/src/main/res/layout/fragment_module_md2.xml +++ b/app/src/main/res/layout/fragment_module_md2.xml @@ -11,7 +11,7 @@ + type="com.topjohnwu.magisk.ui.module.ModuleViewModel" /> @@ -94,4 +94,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_safetynet_md2.xml b/app/src/main/res/layout/fragment_safetynet_md2.xml index ba39e10cd..7865df4d6 100644 --- a/app/src/main/res/layout/fragment_safetynet_md2.xml +++ b/app/src/main/res/layout/fragment_safetynet_md2.xml @@ -12,7 +12,7 @@ + type="com.topjohnwu.magisk.ui.safetynet.SafetynetViewModel" /> @@ -289,4 +289,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_settings_md2.xml b/app/src/main/res/layout/fragment_settings_md2.xml index 2b5569a3b..85a6fab75 100644 --- a/app/src/main/res/layout/fragment_settings_md2.xml +++ b/app/src/main/res/layout/fragment_settings_md2.xml @@ -9,7 +9,7 @@ + type="com.topjohnwu.magisk.ui.settings.SettingsViewModel" /> @@ -35,4 +35,4 @@ tools:listitem="@layout/item_settings_toggle" tools:paddingTop="@dimen/l1" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_superuser_md2.xml b/app/src/main/res/layout/fragment_superuser_md2.xml index 08eecdd8e..8d4b7c32d 100644 --- a/app/src/main/res/layout/fragment_superuser_md2.xml +++ b/app/src/main/res/layout/fragment_superuser_md2.xml @@ -9,7 +9,7 @@ + type="com.topjohnwu.magisk.ui.superuser.SuperuserViewModel" /> @@ -62,4 +62,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_theme_md2.xml b/app/src/main/res/layout/fragment_theme_md2.xml index 3476daec9..f728b03b7 100644 --- a/app/src/main/res/layout/fragment_theme_md2.xml +++ b/app/src/main/res/layout/fragment_theme_md2.xml @@ -4,11 +4,11 @@ - + + type="com.topjohnwu.magisk.ui.theme.ThemeViewModel" /> @@ -159,4 +159,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/include_hide_filter.xml b/app/src/main/res/layout/include_hide_filter.xml index bf9acad8c..705ca9d2c 100644 --- a/app/src/main/res/layout/include_hide_filter.xml +++ b/app/src/main/res/layout/include_hide_filter.xml @@ -9,7 +9,7 @@ + type="com.topjohnwu.magisk.ui.hide.HideViewModel" /> diff --git a/app/src/main/res/layout/include_log_magisk.xml b/app/src/main/res/layout/include_log_magisk.xml index a7240619c..324f9906b 100644 --- a/app/src/main/res/layout/include_log_magisk.xml +++ b/app/src/main/res/layout/include_log_magisk.xml @@ -7,7 +7,7 @@ + type="com.topjohnwu.magisk.ui.log.LogViewModel" /> @@ -51,4 +51,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/include_module_filter.xml b/app/src/main/res/layout/include_module_filter.xml index 7f0816fec..080e9fe8f 100644 --- a/app/src/main/res/layout/include_module_filter.xml +++ b/app/src/main/res/layout/include_module_filter.xml @@ -9,7 +9,7 @@ + type="com.topjohnwu.magisk.ui.module.ModuleViewModel" /> diff --git a/app/src/main/res/layout/item_developer.xml b/app/src/main/res/layout/item_developer.xml index 2049ee911..96279abca 100644 --- a/app/src/main/res/layout/item_developer.xml +++ b/app/src/main/res/layout/item_developer.xml @@ -11,7 +11,7 @@ + type="com.topjohnwu.magisk.ui.home.HomeViewModel" /> @@ -66,4 +66,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/item_developer_link.xml b/app/src/main/res/layout/item_developer_link.xml index eac039e9c..41c6cee0a 100644 --- a/app/src/main/res/layout/item_developer_link.xml +++ b/app/src/main/res/layout/item_developer_link.xml @@ -11,7 +11,7 @@ + type="com.topjohnwu.magisk.ui.home.HomeViewModel" /> @@ -47,4 +47,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/item_hide_md2.xml b/app/src/main/res/layout/item_hide_md2.xml index cce147289..37a92c37b 100644 --- a/app/src/main/res/layout/item_hide_md2.xml +++ b/app/src/main/res/layout/item_hide_md2.xml @@ -13,7 +13,7 @@ + type="com.topjohnwu.magisk.ui.hide.HideViewModel" /> @@ -129,4 +129,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/item_hide_process_md2.xml b/app/src/main/res/layout/item_hide_process_md2.xml index f6bf8c7f8..bd0152371 100644 --- a/app/src/main/res/layout/item_hide_process_md2.xml +++ b/app/src/main/res/layout/item_hide_process_md2.xml @@ -11,7 +11,7 @@ + type="com.topjohnwu.magisk.ui.hide.HideViewModel" /> @@ -55,4 +55,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/item_log_access_md2.xml b/app/src/main/res/layout/item_log_access_md2.xml index 49c78cae6..5a3472f12 100644 --- a/app/src/main/res/layout/item_log_access_md2.xml +++ b/app/src/main/res/layout/item_log_access_md2.xml @@ -13,7 +13,7 @@ + type="com.topjohnwu.magisk.ui.log.LogViewModel" /> @@ -101,4 +101,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/item_module_download.xml b/app/src/main/res/layout/item_module_download.xml index 8ff316ad4..6f6b4fa4e 100644 --- a/app/src/main/res/layout/item_module_download.xml +++ b/app/src/main/res/layout/item_module_download.xml @@ -10,7 +10,7 @@ + type="com.topjohnwu.magisk.ui.module.ModuleViewModel" /> diff --git a/app/src/main/res/layout/item_module_md2.xml b/app/src/main/res/layout/item_module_md2.xml index 9ebd1c738..db37b46a5 100644 --- a/app/src/main/res/layout/item_module_md2.xml +++ b/app/src/main/res/layout/item_module_md2.xml @@ -15,7 +15,7 @@ + type="com.topjohnwu.magisk.ui.module.ModuleViewModel" /> @@ -133,4 +133,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/item_policy_md2.xml b/app/src/main/res/layout/item_policy_md2.xml index c5b0b9c62..0383e8684 100644 --- a/app/src/main/res/layout/item_policy_md2.xml +++ b/app/src/main/res/layout/item_policy_md2.xml @@ -11,7 +11,7 @@ + type="com.topjohnwu.magisk.ui.superuser.SuperuserViewModel" /> @@ -180,4 +180,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/item_repo_md2.xml b/app/src/main/res/layout/item_repo_md2.xml index 7430e1a10..7b05e031a 100644 --- a/app/src/main/res/layout/item_repo_md2.xml +++ b/app/src/main/res/layout/item_repo_md2.xml @@ -13,7 +13,7 @@ + type="com.topjohnwu.magisk.ui.module.ModuleViewModel" /> diff --git a/app/src/main/res/layout/item_section_md2.xml b/app/src/main/res/layout/item_section_md2.xml index be9e8abd2..65568bda5 100644 --- a/app/src/main/res/layout/item_section_md2.xml +++ b/app/src/main/res/layout/item_section_md2.xml @@ -11,7 +11,7 @@ + type="com.topjohnwu.magisk.ui.module.ModuleViewModel" /> @@ -53,4 +53,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/item_theme.xml b/app/src/main/res/layout/item_theme.xml index 0c36a10f8..97c030bb5 100644 --- a/app/src/main/res/layout/item_theme.xml +++ b/app/src/main/res/layout/item_theme.xml @@ -7,11 +7,11 @@ + type="com.topjohnwu.magisk.ui.theme.ThemeViewModel" /> + type="com.topjohnwu.magisk.ui.theme.Theme" /> @@ -179,4 +179,4 @@ - \ No newline at end of file + From 84f1e78660608bd232623efe5c8c210006dea466 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Mon, 13 Jan 2020 03:56:03 +0800 Subject: [PATCH 235/254] Consolidate base viewmodel implementation --- .../com/topjohnwu/magisk/base/BaseActivity.kt | 1 - .../com/topjohnwu/magisk/base/BaseFragment.kt | 1 - .../topjohnwu/magisk/base/BaseViewModel.kt | 201 ++++++++++++++++++ .../magisk/base/viewmodel/BaseViewModel.kt | 31 --- .../magisk/base/viewmodel/LoadingViewModel.kt | 78 ------- .../base/viewmodel/ObservableViewModel.kt | 46 ---- .../base/viewmodel/StatefulViewModel.kt | 15 -- .../magisk/base/viewmodel/TeanityViewModel.kt | 33 --- .../magisk/legacy/flash/FlashViewModel.kt | 2 +- .../legacy/surequest/SuRequestViewModel.kt | 2 +- .../com/topjohnwu/magisk/ui/MainViewModel.kt | 4 +- .../magisk/ui/compat/CompatActivity.kt | 3 +- .../magisk/ui/compat/CompatFragment.kt | 3 +- .../topjohnwu/magisk/ui/compat/CompatView.kt | 3 +- .../magisk/ui/compat/CompatViewModel.kt | 45 ---- .../magisk/ui/flash/FlashViewModel.kt | 4 +- .../topjohnwu/magisk/ui/hide/HideViewModel.kt | 4 +- .../topjohnwu/magisk/ui/home/HomeViewModel.kt | 4 +- .../magisk/ui/install/InstallViewModel.kt | 4 +- .../topjohnwu/magisk/ui/log/LogViewModel.kt | 4 +- .../magisk/ui/module/ModuleViewModel.kt | 3 +- .../magisk/ui/request/RequestViewModel.kt | 4 +- .../magisk/ui/safetynet/SafetynetViewModel.kt | 4 +- .../magisk/ui/settings/SettingsViewModel.kt | 4 +- .../magisk/ui/superuser/SuperuserViewModel.kt | 4 +- .../magisk/ui/theme/ThemeViewModel.kt | 4 +- 26 files changed, 233 insertions(+), 278 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/base/BaseViewModel.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/base/viewmodel/BaseViewModel.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/base/viewmodel/LoadingViewModel.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/base/viewmodel/ObservableViewModel.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/base/viewmodel/StatefulViewModel.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/base/viewmodel/TeanityViewModel.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatViewModel.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/base/BaseActivity.kt b/app/src/main/java/com/topjohnwu/magisk/base/BaseActivity.kt index 667c39b62..f308ef624 100644 --- a/app/src/main/java/com/topjohnwu/magisk/base/BaseActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/base/BaseActivity.kt @@ -16,7 +16,6 @@ import androidx.databinding.ViewDataBinding import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.viewmodel.BaseViewModel import com.topjohnwu.magisk.extensions.set import com.topjohnwu.magisk.model.events.EventHandler import com.topjohnwu.magisk.model.permissions.PermissionRequestBuilder diff --git a/app/src/main/java/com/topjohnwu/magisk/base/BaseFragment.kt b/app/src/main/java/com/topjohnwu/magisk/base/BaseFragment.kt index 8c0f43b59..cd275e8ff 100644 --- a/app/src/main/java/com/topjohnwu/magisk/base/BaseFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/base/BaseFragment.kt @@ -8,7 +8,6 @@ import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import androidx.fragment.app.Fragment import com.topjohnwu.magisk.BR -import com.topjohnwu.magisk.base.viewmodel.BaseViewModel import com.topjohnwu.magisk.model.events.EventHandler import com.topjohnwu.magisk.model.events.ViewEvent diff --git a/app/src/main/java/com/topjohnwu/magisk/base/BaseViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/base/BaseViewModel.kt new file mode 100644 index 000000000..729c40d41 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/base/BaseViewModel.kt @@ -0,0 +1,201 @@ +package com.topjohnwu.magisk.base + +import androidx.annotation.CallSuper +import androidx.core.graphics.Insets +import androidx.databinding.Bindable +import androidx.databinding.PropertyChangeRegistry +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.Info +import com.topjohnwu.magisk.extensions.doOnSubscribeUi +import com.topjohnwu.magisk.model.events.* +import com.topjohnwu.magisk.model.observer.Observer +import com.topjohnwu.magisk.utils.KObservableField +import io.reactivex.* +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.disposables.Disposable +import io.reactivex.subjects.PublishSubject +import org.koin.core.KoinComponent +import androidx.databinding.Observable as BindingObservable + +abstract class BaseViewModel( + initialState: State = State.LOADING +) : ViewModel(), BindingObservable, KoinComponent { + + enum class State { + LOADED, LOADING, LOADING_FAILED + } + + val loading @Bindable get() = state == State.LOADING + val loaded @Bindable get() = state == State.LOADED + val loadingFailed @Bindable get() = state == State.LOADING_FAILED + + val isConnected = Observer(Info.isConnected) { Info.isConnected.value } + val viewEvents: LiveData get() = _viewEvents + val insets = KObservableField(Insets.NONE) + + var state: State = initialState + set(value) { + field = value + notifyStateChanged() + } + + private val disposables = CompositeDisposable() + private val _viewEvents = MutableLiveData() + private var runningTask: Disposable? = null + private val refreshCallback = object : androidx.databinding.Observable.OnPropertyChangedCallback() { + override fun onPropertyChanged(sender: androidx.databinding.Observable?, propertyId: Int) { + requestRefresh() + } + } + + init { + isConnected.addOnPropertyChangedCallback(refreshCallback) + } + + /** This should probably never be called manually, it's called manually via delegate. */ + @Synchronized + fun requestRefresh() { + if (runningTask?.isDisposed?.not() == true) { + return + } + runningTask = refresh() + } + + protected open fun refresh(): Disposable? = null + + open fun notifyStateChanged() { + notifyPropertyChanged(BR.loading) + notifyPropertyChanged(BR.loaded) + notifyPropertyChanged(BR.loadingFailed) + } + + @CallSuper + override fun onCleared() { + isConnected.removeOnPropertyChangedCallback(refreshCallback) + disposables.clear() + super.onCleared() + } + + fun withView(action: BaseActivity<*, *>.() -> Unit) { + ViewActionEvent(action).publish() + } + + fun withPermissions(vararg permissions: String): Observable { + val subject = PublishSubject.create() + return subject.doOnSubscribeUi { PermissionEvent(permissions.toList(), subject).publish() } + } + + fun back() = BackPressEvent().publish() + + fun Event.publish() { + _viewEvents.postValue(this) + } + + fun Int.publish() { + _viewEvents.postValue(SimpleViewEvent(this)) + } + + fun Disposable.add() { + disposables.add(this) + } + + // The following is copied from androidx.databinding.BaseObservable + + @Transient + private var callbacks: PropertyChangeRegistry? = null + + @Synchronized + override fun addOnPropertyChangedCallback(callback: BindingObservable.OnPropertyChangedCallback) { + if (callbacks == null) { + callbacks = PropertyChangeRegistry() + } + callbacks?.add(callback) + } + + @Synchronized + override fun removeOnPropertyChangedCallback(callback: BindingObservable.OnPropertyChangedCallback) { + callbacks?.remove(callback) + } + + /** + * Notifies listeners that all properties of this instance have changed. + */ + @Synchronized + fun notifyChange() { + callbacks?.notifyCallbacks(this, 0, null) + } + + /** + * Notifies listeners that a specific property has changed. The getter for the property + * that changes should be marked with [androidx.databinding.Bindable] to generate a field in + * `BR` to be used as `fieldId`. + * + * @param fieldId The generated BR id for the Bindable field. + */ + fun notifyPropertyChanged(fieldId: Int) { + callbacks?.notifyCallbacks(this, fieldId, null) + } + + //region Rx + protected fun Observable.applyViewModel(viewModel: BaseViewModel, allowFinishing: Boolean = true) = + doOnSubscribe { viewModel.state = + State.LOADING + } + .doOnError { viewModel.state = + State.LOADING_FAILED + } + .doOnNext { if (allowFinishing) viewModel.state = + State.LOADED + } + + protected fun Single.applyViewModel(viewModel: BaseViewModel, allowFinishing: Boolean = true) = + doOnSubscribe { viewModel.state = + State.LOADING + } + .doOnError { viewModel.state = + State.LOADING_FAILED + } + .doOnSuccess { if (allowFinishing) viewModel.state = + State.LOADED + } + + protected fun Maybe.applyViewModel(viewModel: BaseViewModel, allowFinishing: Boolean = true) = + doOnSubscribe { viewModel.state = + State.LOADING + } + .doOnError { viewModel.state = + State.LOADING_FAILED + } + .doOnComplete { if (allowFinishing) viewModel.state = + State.LOADED + } + .doOnSuccess { if (allowFinishing) viewModel.state = + State.LOADED + } + + protected fun Flowable.applyViewModel(viewModel: BaseViewModel, allowFinishing: Boolean = true) = + doOnSubscribe { viewModel.state = + State.LOADING + } + .doOnError { viewModel.state = + State.LOADING_FAILED + } + .doOnNext { if (allowFinishing) viewModel.state = + State.LOADED + } + + protected fun Completable.applyViewModel(viewModel: BaseViewModel, allowFinishing: Boolean = true) = + doOnSubscribe { viewModel.state = + State.LOADING + } + .doOnError { viewModel.state = + State.LOADING_FAILED + } + .doOnComplete { if (allowFinishing) viewModel.state = + State.LOADED + } + //endregion +} diff --git a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/BaseViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/BaseViewModel.kt deleted file mode 100644 index 8b938c7eb..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/BaseViewModel.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.topjohnwu.magisk.base.viewmodel - -import com.topjohnwu.magisk.base.BaseActivity -import com.topjohnwu.magisk.extensions.doOnSubscribeUi -import com.topjohnwu.magisk.model.events.BackPressEvent -import com.topjohnwu.magisk.model.events.PermissionEvent -import com.topjohnwu.magisk.model.events.ViewActionEvent -import com.topjohnwu.magisk.model.observer.Observer -import io.reactivex.Observable -import io.reactivex.subjects.PublishSubject -import com.topjohnwu.magisk.Info.isConnected as gIsConnected - - -abstract class BaseViewModel( - initialState: State = State.LOADING -) : LoadingViewModel(initialState) { - - val isConnected = Observer(gIsConnected) { gIsConnected.value } - - fun withView(action: BaseActivity<*, *>.() -> Unit) { - ViewActionEvent(action).publish() - } - - fun withPermissions(vararg permissions: String): Observable { - val subject = PublishSubject.create() - return subject.doOnSubscribeUi { PermissionEvent(permissions.toList(), subject).publish() } - } - - fun back() = BackPressEvent().publish() - -} diff --git a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/LoadingViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/LoadingViewModel.kt deleted file mode 100644 index bd4ac195d..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/LoadingViewModel.kt +++ /dev/null @@ -1,78 +0,0 @@ -package com.topjohnwu.magisk.base.viewmodel - -import androidx.databinding.Bindable -import com.topjohnwu.magisk.BR -import io.reactivex.* - -abstract class LoadingViewModel(defaultState: State = State.LOADING) : - StatefulViewModel(defaultState) { - - val loading @Bindable get() = state == State.LOADING - val loaded @Bindable get() = state == State.LOADED - val loadingFailed @Bindable get() = state == State.LOADING_FAILED - - @Deprecated( - "Direct access is recommended since 0.2. This access method will be removed in 1.0", - ReplaceWith("state = State.LOADING", "com.topjohnwu.magisk.base.viewmodel.LoadingViewModel.State"), - DeprecationLevel.WARNING - ) - fun setLoading() { - state = State.LOADING - } - - @Deprecated( - "Direct access is recommended since 0.2. This access method will be removed in 1.0", - ReplaceWith("state = State.LOADED", "com.topjohnwu.magisk.base.viewmodel.LoadingViewModel.State"), - DeprecationLevel.WARNING - ) - fun setLoaded() { - state = State.LOADED - } - - @Deprecated( - "Direct access is recommended since 0.2. This access method will be removed in 1.0", - ReplaceWith("state = State.LOADING_FAILED", "com.topjohnwu.magisk.base.viewmodel.LoadingViewModel.State"), - DeprecationLevel.WARNING - ) - fun setLoadingFailed() { - state = State.LOADING_FAILED - } - - override fun notifyStateChanged() { - notifyPropertyChanged(BR.loading) - notifyPropertyChanged(BR.loaded) - notifyPropertyChanged(BR.loadingFailed) - } - - enum class State { - LOADED, LOADING, LOADING_FAILED - } - - //region Rx - protected fun Observable.applyViewModel(viewModel: LoadingViewModel, allowFinishing: Boolean = true) = - doOnSubscribe { viewModel.state = State.LOADING } - .doOnError { viewModel.state = State.LOADING_FAILED } - .doOnNext { if (allowFinishing) viewModel.state = State.LOADED } - - protected fun Single.applyViewModel(viewModel: LoadingViewModel, allowFinishing: Boolean = true) = - doOnSubscribe { viewModel.state = State.LOADING } - .doOnError { viewModel.state = State.LOADING_FAILED } - .doOnSuccess { if (allowFinishing) viewModel.state = State.LOADED } - - protected fun Maybe.applyViewModel(viewModel: LoadingViewModel, allowFinishing: Boolean = true) = - doOnSubscribe { viewModel.state = State.LOADING } - .doOnError { viewModel.state = State.LOADING_FAILED } - .doOnComplete { if (allowFinishing) viewModel.state = State.LOADED } - .doOnSuccess { if (allowFinishing) viewModel.state = State.LOADED } - - protected fun Flowable.applyViewModel(viewModel: LoadingViewModel, allowFinishing: Boolean = true) = - doOnSubscribe { viewModel.state = State.LOADING } - .doOnError { viewModel.state = State.LOADING_FAILED } - .doOnNext { if (allowFinishing) viewModel.state = State.LOADED } - - protected fun Completable.applyViewModel(viewModel: LoadingViewModel, allowFinishing: Boolean = true) = - doOnSubscribe { viewModel.state = State.LOADING } - .doOnError { viewModel.state = State.LOADING_FAILED } - .doOnComplete { if (allowFinishing) viewModel.state = State.LOADED } - //endregion -} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/ObservableViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/ObservableViewModel.kt deleted file mode 100644 index 8b6e53498..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/ObservableViewModel.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.topjohnwu.magisk.base.viewmodel - -import androidx.databinding.Observable -import androidx.databinding.PropertyChangeRegistry -import androidx.lifecycle.ViewModel - -/** - * Copy of [androidx.databinding.BaseObservable] which extends [ViewModel] - */ -abstract class ObservableViewModel : TeanityViewModel(), Observable { - - @Transient - private var callbacks: PropertyChangeRegistry? = null - - @Synchronized - override fun addOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback) { - if (callbacks == null) { - callbacks = PropertyChangeRegistry() - } - callbacks?.add(callback) - } - - @Synchronized - override fun removeOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback) { - callbacks?.remove(callback) - } - - /** - * Notifies listeners that all properties of this instance have changed. - */ - @Synchronized - fun notifyChange() { - callbacks?.notifyCallbacks(this, 0, null) - } - - /** - * Notifies listeners that a specific property has changed. The getter for the property - * that changes should be marked with [androidx.databinding.Bindable] to generate a field in - * `BR` to be used as `fieldId`. - * - * @param fieldId The generated BR id for the Bindable field. - */ - fun notifyPropertyChanged(fieldId: Int) { - callbacks?.notifyCallbacks(this, fieldId, null) - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/StatefulViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/StatefulViewModel.kt deleted file mode 100644 index e441c84db..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/StatefulViewModel.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.topjohnwu.magisk.base.viewmodel - -abstract class StatefulViewModel>( - val defaultState: State -) : ObservableViewModel() { - - var state: State = defaultState - set(value) { - field = value - notifyStateChanged() - } - - open fun notifyStateChanged() = Unit - -} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/TeanityViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/TeanityViewModel.kt deleted file mode 100644 index 17449a115..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/TeanityViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.topjohnwu.magisk.base.viewmodel - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.topjohnwu.magisk.model.events.SimpleViewEvent -import com.topjohnwu.magisk.model.events.ViewEvent -import io.reactivex.disposables.CompositeDisposable -import io.reactivex.disposables.Disposable - -abstract class TeanityViewModel : ViewModel() { - - private val disposables = CompositeDisposable() - private val _viewEvents = MutableLiveData() - val viewEvents: LiveData get() = _viewEvents - - override fun onCleared() { - super.onCleared() - disposables.clear() - } - - fun Event.publish() { - _viewEvents.postValue(this) - } - - fun Int.publish() { - _viewEvents.postValue(SimpleViewEvent(this)) - } - - fun Disposable.add() { - disposables.add(this) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashViewModel.kt index ca68bfa55..b39654507 100644 --- a/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashViewModel.kt @@ -11,7 +11,7 @@ import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.viewmodel.BaseViewModel +import com.topjohnwu.magisk.base.BaseViewModel import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.* import com.topjohnwu.magisk.model.entity.recycler.ConsoleRvItem diff --git a/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestViewModel.kt index 363b0c471..7230a2983 100644 --- a/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestViewModel.kt @@ -10,7 +10,7 @@ import com.topjohnwu.magisk.BuildConfig import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.viewmodel.BaseViewModel +import com.topjohnwu.magisk.base.BaseViewModel import com.topjohnwu.magisk.data.database.PolicyDao import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.now diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt index 63104cbd5..831449270 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt @@ -1,5 +1,5 @@ package com.topjohnwu.magisk.ui -import com.topjohnwu.magisk.ui.compat.CompatViewModel +import com.topjohnwu.magisk.base.BaseViewModel -class MainViewModel : CompatViewModel() +class MainViewModel : BaseViewModel() diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatActivity.kt index 66229faa8..928f2661d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatActivity.kt @@ -11,6 +11,7 @@ import androidx.databinding.OnRebindCallback import androidx.databinding.ViewDataBinding import androidx.fragment.app.Fragment import com.topjohnwu.magisk.base.BaseActivity +import com.topjohnwu.magisk.base.BaseViewModel import com.topjohnwu.magisk.extensions.snackbar import com.topjohnwu.magisk.extensions.startAnimations import com.topjohnwu.magisk.model.events.SnackbarEvent @@ -21,7 +22,7 @@ import com.topjohnwu.magisk.ui.theme.Theme import kotlin.reflect.KClass -abstract class CompatActivity : +abstract class CompatActivity : BaseActivity(), CompatView, Navigator { override val themeRes = Theme.selected.themeRes diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatFragment.kt index 14e60a9eb..decb4c34a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatFragment.kt @@ -7,10 +7,11 @@ import androidx.databinding.OnRebindCallback import androidx.databinding.ViewDataBinding import androidx.fragment.app.Fragment import com.topjohnwu.magisk.base.BaseFragment +import com.topjohnwu.magisk.base.BaseViewModel import com.topjohnwu.magisk.extensions.startAnimations import com.topjohnwu.magisk.model.events.ViewEvent -abstract class CompatFragment +abstract class CompatFragment : BaseFragment(), CompatView { override val viewRoot: View get() = binding.root diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatView.kt b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatView.kt index 919851df6..84e1724c2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatView.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatView.kt @@ -2,8 +2,9 @@ package com.topjohnwu.magisk.ui.compat import android.view.View import androidx.core.graphics.Insets +import com.topjohnwu.magisk.base.BaseViewModel -internal interface CompatView { +internal interface CompatView { val viewRoot: View val viewModel: ViewModel diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatViewModel.kt deleted file mode 100644 index c22ae870f..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatViewModel.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.topjohnwu.magisk.ui.compat - -import androidx.annotation.CallSuper -import androidx.core.graphics.Insets -import androidx.databinding.Observable -import com.topjohnwu.magisk.base.viewmodel.BaseViewModel -import com.topjohnwu.magisk.utils.KObservableField -import io.reactivex.disposables.Disposable -import org.koin.core.KoinComponent - -abstract class CompatViewModel( - initialState: State = State.LOADING -) : BaseViewModel(initialState), KoinComponent { - - val insets = KObservableField(Insets.NONE) - - private var runningTask: Disposable? = null - private val refreshCallback = object : Observable.OnPropertyChangedCallback() { - override fun onPropertyChanged(sender: Observable?, propertyId: Int) { - requestRefresh() - } - } - - init { - isConnected.addOnPropertyChangedCallback(refreshCallback) - } - - /** This should probably never be called manually, it's called manually via delegate. */ - @Synchronized - fun requestRefresh() { - if (runningTask?.isDisposed?.not() == true) { - return - } - runningTask = refresh() - } - - protected open fun refresh(): Disposable? = null - - @CallSuper - override fun onCleared() { - isConnected.removeOnPropertyChangedCallback(refreshCallback) - super.onCleared() - } - -} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt index a70f2f3df..bd4938fb3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt @@ -1,5 +1,5 @@ package com.topjohnwu.magisk.ui.flash -import com.topjohnwu.magisk.ui.compat.CompatViewModel +import com.topjohnwu.magisk.base.BaseViewModel -class FlashViewModel : CompatViewModel() +class FlashViewModel : BaseViewModel() diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt index 966821f8f..252d95016 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt @@ -12,7 +12,7 @@ import com.topjohnwu.magisk.model.entity.ProcessHideApp import com.topjohnwu.magisk.model.entity.StatefulProcess import com.topjohnwu.magisk.model.entity.recycler.HideItem import com.topjohnwu.magisk.model.entity.recycler.HideProcessItem -import com.topjohnwu.magisk.ui.compat.CompatViewModel +import com.topjohnwu.magisk.base.BaseViewModel import com.topjohnwu.magisk.ui.compat.Queryable import com.topjohnwu.magisk.ui.compat.filterableListOf import com.topjohnwu.magisk.ui.compat.itemBindingOf @@ -21,7 +21,7 @@ import com.topjohnwu.magisk.utils.currentLocale class HideViewModel( private val magiskRepo: MagiskRepository -) : CompatViewModel(), Queryable by Queryable.impl(1000) { +) : BaseViewModel(), Queryable by Queryable.impl(1000) { override val queryRunnable = Runnable { query() } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt index 52ccc1a71..f998ff320 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt @@ -22,7 +22,7 @@ import com.topjohnwu.magisk.model.events.dialog.ManagerInstallDialog import com.topjohnwu.magisk.model.events.dialog.UninstallDialog import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.model.observer.Observer -import com.topjohnwu.magisk.ui.compat.CompatViewModel +import com.topjohnwu.magisk.base.BaseViewModel import com.topjohnwu.magisk.ui.compat.itemBindingOf import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.superuser.Shell @@ -35,7 +35,7 @@ enum class MagiskState { class HomeViewModel( private val repoMagisk: MagiskRepository -) : CompatViewModel() { +) : BaseViewModel() { val isNoticeVisible = KObservableField(Config.safetyNotice) diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt index 58a2da93d..9e6dc3b5d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt @@ -8,14 +8,14 @@ import com.topjohnwu.magisk.model.download.RemoteFileService import com.topjohnwu.magisk.model.entity.internal.Configuration import com.topjohnwu.magisk.model.entity.internal.DownloadSubject import com.topjohnwu.magisk.model.events.RequestFileEvent -import com.topjohnwu.magisk.ui.compat.CompatViewModel +import com.topjohnwu.magisk.base.BaseViewModel import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.ShellUtils import org.koin.core.get import kotlin.math.roundToInt -class InstallViewModel : CompatViewModel(State.LOADED) { +class InstallViewModel : BaseViewModel(State.LOADED) { val isRooted = Shell.rootAccess() val isAB = isABDevice() diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt index c88ebb873..520094e00 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt @@ -12,7 +12,7 @@ import com.topjohnwu.magisk.model.entity.recycler.ConsoleItem import com.topjohnwu.magisk.model.entity.recycler.LogItem import com.topjohnwu.magisk.model.entity.recycler.TextItem import com.topjohnwu.magisk.model.events.SnackbarEvent -import com.topjohnwu.magisk.ui.compat.CompatViewModel +import com.topjohnwu.magisk.base.BaseViewModel import com.topjohnwu.magisk.ui.compat.diffListOf import com.topjohnwu.magisk.ui.compat.itemBindingOf import com.topjohnwu.superuser.Shell @@ -26,7 +26,7 @@ import java.util.* class LogViewModel( private val repo: LogRepository -) : CompatViewModel() { +) : BaseViewModel() { // --- empty view diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt index 40421f29d..200473367 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt @@ -6,6 +6,7 @@ import androidx.databinding.ObservableArrayList import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.base.BaseViewModel import com.topjohnwu.magisk.data.database.RepoByNameDao import com.topjohnwu.magisk.data.database.RepoByUpdatedDao import com.topjohnwu.magisk.databinding.ComparableRvItem @@ -37,7 +38,7 @@ class ModuleViewModel( private val repoName: RepoByNameDao, private val repoUpdated: RepoByUpdatedDao, private val repoUpdater: RepoUpdater -) : CompatViewModel(), Queryable by Queryable.impl(1000) { +) : BaseViewModel(), Queryable by Queryable.impl(1000) { override val queryRunnable = Runnable { query() } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestViewModel.kt index 52ab65141..355a6dedf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestViewModel.kt @@ -1,5 +1,5 @@ package com.topjohnwu.magisk.ui.request -import com.topjohnwu.magisk.ui.compat.CompatViewModel +import com.topjohnwu.magisk.base.BaseViewModel -class RequestViewModel : CompatViewModel() +class RequestViewModel : BaseViewModel() diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetViewModel.kt index d8a6627b0..25eb3d63a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetViewModel.kt @@ -6,7 +6,7 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.model.events.SafetyNetResult import com.topjohnwu.magisk.model.events.UpdateSafetyNetEvent -import com.topjohnwu.magisk.ui.compat.CompatViewModel +import com.topjohnwu.magisk.base.BaseViewModel import com.topjohnwu.magisk.ui.safetynet.SafetyNetState.* import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.RxBus @@ -18,7 +18,7 @@ enum class SafetyNetState { class SafetynetViewModel( rxBus: RxBus -) : CompatViewModel() { +) : BaseViewModel() { private var currentState = IDLE set(value) { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt index 47cfadd55..9f5a90db8 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt @@ -15,7 +15,7 @@ import com.topjohnwu.magisk.model.events.PermissionEvent import com.topjohnwu.magisk.model.events.RecreateEvent import com.topjohnwu.magisk.model.events.dialog.BiometricDialog import com.topjohnwu.magisk.model.navigation.Navigation -import com.topjohnwu.magisk.ui.compat.CompatViewModel +import com.topjohnwu.magisk.base.BaseViewModel import com.topjohnwu.magisk.ui.compat.adapterOf import com.topjohnwu.magisk.ui.compat.diffListOf import com.topjohnwu.magisk.ui.compat.itemBindingOf @@ -28,7 +28,7 @@ import org.koin.core.get class SettingsViewModel( private val repositoryDao: RepoDao -) : CompatViewModel(), SettingsItem.Callback { +) : BaseViewModel(), SettingsItem.Callback { val adapter = adapterOf() val itemBinding = itemBindingOf { it.bindExtra(BR.callback, this) } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt index 9c3e77ae4..f0b58c24a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt @@ -19,7 +19,7 @@ import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.model.events.dialog.BiometricDialog import com.topjohnwu.magisk.model.events.dialog.SuperuserRevokeDialog import com.topjohnwu.magisk.model.navigation.Navigation -import com.topjohnwu.magisk.ui.compat.CompatViewModel +import com.topjohnwu.magisk.base.BaseViewModel import com.topjohnwu.magisk.ui.compat.adapterOf import com.topjohnwu.magisk.ui.compat.diffListOf import com.topjohnwu.magisk.ui.compat.itemBindingOf @@ -32,7 +32,7 @@ class SuperuserViewModel( private val db: PolicyDao, private val packageManager: PackageManager, private val resources: Resources -) : CompatViewModel(), TappableHeadlineItem.Listener { +) : BaseViewModel(), TappableHeadlineItem.Listener { private val itemNoData = TextItem(R.string.superuser_policy_none) diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeViewModel.kt index 132b8b7f2..3cb572173 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeViewModel.kt @@ -3,9 +3,9 @@ package com.topjohnwu.magisk.ui.theme import com.topjohnwu.magisk.model.entity.recycler.TappableHeadlineItem import com.topjohnwu.magisk.model.events.RecreateEvent import com.topjohnwu.magisk.model.events.dialog.DarkThemeDialog -import com.topjohnwu.magisk.ui.compat.CompatViewModel +import com.topjohnwu.magisk.base.BaseViewModel -class ThemeViewModel : CompatViewModel(), TappableHeadlineItem.Listener { +class ThemeViewModel : BaseViewModel(), TappableHeadlineItem.Listener { val themeHeadline = TappableHeadlineItem.ThemeMode From ba1a2fbce4487ad97341d4e48e7ff9966457dac8 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Mon, 13 Jan 2020 04:00:35 +0800 Subject: [PATCH 236/254] Remove deprecate APIs --- .../java/com/topjohnwu/magisk/model/navigation/Navigator.kt | 4 +--- .../java/com/topjohnwu/magisk/ui/compat/CompatActivity.kt | 4 ---- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigator.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigator.kt index e2b755a9d..ff9dcfe26 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigator.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigator.kt @@ -8,6 +8,4 @@ interface Navigator { //TODO Elevate Fragment to MagiskFragment<*,*> once everything is on board with it val baseFragments: List> - fun navigateTo(event: MagiskNavigationEvent) - -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatActivity.kt index 928f2661d..348d47770 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatActivity.kt @@ -16,7 +16,6 @@ import com.topjohnwu.magisk.extensions.snackbar import com.topjohnwu.magisk.extensions.startAnimations import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.model.events.ViewEvent -import com.topjohnwu.magisk.model.navigation.MagiskNavigationEvent import com.topjohnwu.magisk.model.navigation.Navigator import com.topjohnwu.magisk.ui.theme.Theme import kotlin.reflect.KClass @@ -78,9 +77,6 @@ abstract class CompatActivity Date: Mon, 13 Jan 2020 22:01:46 +0800 Subject: [PATCH 237/254] Separate core components --- app/proguard-rules.pro | 10 +- app/src/main/java/a/a.java | 2 +- app/src/main/java/a/c.java | 2 +- app/src/main/java/a/e.java | 2 +- app/src/main/java/a/g.java | 2 +- app/src/main/java/a/h.java | 2 +- app/src/main/java/a/j.java | 2 +- app/src/main/java/a/w.java | 4 +- .../com/topjohnwu/magisk/{ => core}/App.kt | 13 +- .../com/topjohnwu/magisk/{ => core}/Config.kt | 50 ++++-- .../com/topjohnwu/magisk/{ => core}/Const.kt | 2 +- .../receiver => core}/GeneralReceiver.kt | 23 +-- .../com/topjohnwu/magisk/{ => core}/Hacks.kt | 15 +- .../com/topjohnwu/magisk/{ => core}/Info.kt | 5 +- .../magisk/{ui => core}/SplashActivity.kt | 11 +- .../update => core}/UpdateCheckService.kt | 9 +- .../magisk/{ => core}/base/BaseActivity.kt | 53 ++---- .../magisk/{ => core}/base/BaseReceiver.kt | 4 +- .../magisk/{ => core}/base/BaseService.kt | 4 +- .../base/BaseWorkerWrapper.kt} | 4 +- .../download/DownloadService.kt | 6 +- .../download/ManagerUpgrade.kt | 13 +- .../download/ModuleProcessor.kt | 4 +- .../download/NotificationService.kt | 6 +- .../download/RemoteFileService.kt | 6 +- .../database => core}/magiskdb/BaseDao.kt | 2 +- .../database => core/magiskdb}/PolicyDao.kt | 14 +- .../{data/database => core}/magiskdb/Query.kt | 2 +- .../database => core/magiskdb}/SettingsDao.kt | 7 +- .../database => core/magiskdb}/StringDao.kt | 7 +- .../entity => core/model}/MagiskPolicy.kt | 4 +- .../entity => core/model}/UpdateInfo.kt | 2 +- .../model}/module/BaseModule.kt | 2 +- .../entity => core/model}/module/Module.kt | 4 +- .../entity => core/model}/module/Repo.kt | 4 +- .../su/SuCallbackHandler.kt} | 18 +- .../magisk/{utils => core/su}/SuConnector.kt | 2 +- .../magisk/core/su/SuRequestHandler.kt | 103 +++++++++++ .../magisk/{ => core}/tasks/FlashZip.kt | 6 +- .../{ => core}/tasks/MagiskInstaller.kt | 52 ++++-- .../magisk/{ => core}/tasks/RepoUpdater.kt | 49 +++-- .../{ => core}/utils/BiometricHelper.kt | 4 +- .../magisk/{ => core}/utils/Keygen.kt | 34 ++-- .../magisk/{ => core}/utils/Locales.kt | 6 +- .../magisk/{ => core}/utils/PatchAPK.kt | 11 +- .../{ => core}/utils/ProgressInputStream.kt | 4 +- .../magisk/{ => core}/utils/RootInit.kt | 6 +- .../{ => core}/utils/SafetyNetHelper.kt | 2 +- .../magisk/{ => core}/utils/Utils.kt | 11 +- .../magisk/{ => core}/utils/ZipUtils.kt | 2 +- .../magisk/{ => core}/view/Notifications.kt | 26 +-- .../magisk/{ => core}/view/Shortcuts.kt | 11 +- .../topjohnwu/magisk/data/database/Repo.kt | 4 +- .../topjohnwu/magisk/data/database/RepoDao.kt | 4 +- .../magisk/data/network/GithubServices.kt | 8 +- .../magisk/data/repository/DBConfig.kt | 4 +- .../magisk/data/repository/LogRepository.kt | 2 +- .../data/repository/MagiskRepository.kt | 7 +- .../data/repository/StringRepository.kt | 4 +- .../com/topjohnwu/magisk/di/DatabaseModule.kt | 8 +- .../topjohnwu/magisk/di/NetworkingModule.kt | 2 +- .../topjohnwu/magisk/extensions/XAndroid.kt | 10 +- .../com/topjohnwu/magisk/extensions/XSU.kt | 4 +- .../com/topjohnwu/magisk/extensions/XTime.kt | 18 +- .../magisk/legacy/flash/FlashActivity.kt | 10 +- .../magisk/legacy/flash/FlashViewModel.kt | 6 +- .../legacy/surequest/SuRequestActivity.kt | 14 +- .../legacy/surequest/SuRequestViewModel.kt | 169 ++++++------------ .../magisk/model/entity/MagiskLog.kt | 8 +- .../model/entity/internal/DownloadSubject.kt | 12 +- .../magisk/model/entity/recycler/HomeItems.kt | 2 +- .../model/entity/recycler/ModuleRvItem.kt | 4 +- .../model/entity/recycler/PolicyRvItem.kt | 2 +- .../magisk/model/events/EventExecutors.kt | 4 +- .../events/InstallExternalModuleEvent.kt | 8 +- .../topjohnwu/magisk/model/events/RxEvents.kt | 2 +- .../magisk/model/events/SnackbarEvent.kt | 7 +- .../magisk/model/events/ViewEvents.kt | 22 +-- .../model/events/dialog/BiometricDialog.kt | 6 +- .../model/events/dialog/DarkThemeDialog.kt | 6 +- .../model/events/dialog/EnvFixDialog.kt | 30 +--- .../events/dialog/MagiskInstallDialog.kt | 8 +- .../events/dialog/ManagerInstallDialog.kt | 6 +- .../events/dialog/ModuleInstallDialog.kt | 6 +- .../model/events/dialog/UninstallDialog.kt | 8 +- .../topjohnwu/magisk/model/flash/Flashing.kt | 4 +- .../topjohnwu/magisk/model/flash/Patching.kt | 13 +- .../model/navigation/MagiskNavigationEvent.kt | 6 +- .../magisk/model/navigation/Navigation.kt | 8 +- .../com/topjohnwu/magisk/model/zip/Zip.kt | 75 -------- .../com/topjohnwu/magisk/ui/MainActivity.kt | 6 +- .../com/topjohnwu/magisk/ui/MainViewModel.kt | 2 +- .../magisk/ui/base/BaseUIActivity.kt | 39 ++++ .../base/BaseUIFragment.kt} | 8 +- .../magisk/{ => ui}/base/BaseViewModel.kt | 7 +- .../ui/{compat => base}/CompatActivity.kt | 7 +- .../ui/{compat => base}/CompatDelegate.kt | 7 +- .../ui/{compat => base}/CompatFragment.kt | 8 +- .../ui/{compat => base}/CompatHelpers.kt | 2 +- .../CompatNavigationDelegate.kt | 2 +- .../magisk/ui/{compat => base}/CompatView.kt | 3 +- .../magisk/ui/{compat => base}/Queryable.kt | 2 +- .../magisk/ui/flash/FlashFragment.kt | 2 +- .../magisk/ui/flash/FlashViewModel.kt | 2 +- .../topjohnwu/magisk/ui/hide/HideFragment.kt | 4 +- .../topjohnwu/magisk/ui/hide/HideViewModel.kt | 10 +- .../topjohnwu/magisk/ui/home/HomeFragment.kt | 2 +- .../topjohnwu/magisk/ui/home/HomeViewModel.kt | 16 +- .../magisk/ui/install/InstallFragment.kt | 2 +- .../magisk/ui/install/InstallViewModel.kt | 6 +- .../topjohnwu/magisk/ui/log/LogFragment.kt | 2 +- .../topjohnwu/magisk/ui/log/LogViewModel.kt | 10 +- .../magisk/ui/module/ModuleFragment.kt | 4 +- .../magisk/ui/module/ModuleViewModel.kt | 19 +- .../magisk/ui/request/RequestActivity.kt | 2 +- .../magisk/ui/request/RequestViewModel.kt | 2 +- .../magisk/ui/safetynet/SafetynetFragment.kt | 2 +- .../magisk/ui/safetynet/SafetynetViewModel.kt | 4 +- .../magisk/ui/settings/SettingsFragment.kt | 2 +- .../magisk/ui/settings/SettingsItems.kt | 18 +- .../magisk/ui/settings/SettingsViewModel.kt | 14 +- .../magisk/ui/superuser/SuperuserFragment.kt | 2 +- .../magisk/ui/superuser/SuperuserViewModel.kt | 16 +- .../com/topjohnwu/magisk/ui/theme/Theme.kt | 2 +- .../magisk/ui/theme/ThemeFragment.kt | 2 +- .../magisk/ui/theme/ThemeViewModel.kt | 2 +- .../magisk/utils/MotionRevealHelper.kt | 3 +- .../magisk/utils/PinchZoomTouchListener.kt | 4 +- .../com/topjohnwu/magisk/view/MagiskDialog.kt | 2 +- app/src/main/res/layout/fragment_home_md2.xml | 6 +- .../main/res/layout/fragment_module_md2.xml | 2 +- .../res/layout/fragment_safetynet_md2.xml | 2 +- .../res/layout/include_install_options.xml | 4 +- app/src/main/res/layout/item_module_md2.xml | 2 +- 134 files changed, 742 insertions(+), 693 deletions(-) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/App.kt (88%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/Config.kt (88%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/Const.kt (98%) rename app/src/main/java/com/topjohnwu/magisk/{model/receiver => core}/GeneralReceiver.kt (75%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/Hacks.kt (92%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/Info.kt (95%) rename app/src/main/java/com/topjohnwu/magisk/{ui => core}/SplashActivity.kt (88%) rename app/src/main/java/com/topjohnwu/magisk/{model/update => core}/UpdateCheckService.kt (80%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/base/BaseActivity.kt (60%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/base/BaseReceiver.kt (85%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/base/BaseService.kt (76%) rename app/src/main/java/com/topjohnwu/magisk/{base/DelegateWorker.kt => core/base/BaseWorkerWrapper.kt} (94%) rename app/src/main/java/com/topjohnwu/magisk/{model => core}/download/DownloadService.kt (98%) rename app/src/main/java/com/topjohnwu/magisk/{model => core}/download/ManagerUpgrade.kt (84%) rename app/src/main/java/com/topjohnwu/magisk/{model => core}/download/ModuleProcessor.kt (96%) rename app/src/main/java/com/topjohnwu/magisk/{model => core}/download/NotificationService.kt (93%) rename app/src/main/java/com/topjohnwu/magisk/{model => core}/download/RemoteFileService.kt (96%) rename app/src/main/java/com/topjohnwu/magisk/{data/database => core}/magiskdb/BaseDao.kt (95%) rename app/src/main/java/com/topjohnwu/magisk/{data/database => core/magiskdb}/PolicyDao.kt (79%) rename app/src/main/java/com/topjohnwu/magisk/{data/database => core}/magiskdb/Query.kt (98%) rename app/src/main/java/com/topjohnwu/magisk/{data/database => core/magiskdb}/SettingsDao.kt (65%) rename app/src/main/java/com/topjohnwu/magisk/{data/database => core/magiskdb}/StringDao.kt (64%) rename app/src/main/java/com/topjohnwu/magisk/{model/entity => core/model}/MagiskPolicy.kt (94%) rename app/src/main/java/com/topjohnwu/magisk/{model/entity => core/model}/UpdateInfo.kt (95%) rename app/src/main/java/com/topjohnwu/magisk/{model/entity => core/model}/module/BaseModule.kt (96%) rename app/src/main/java/com/topjohnwu/magisk/{model/entity => core/model}/module/Module.kt (96%) rename app/src/main/java/com/topjohnwu/magisk/{model/entity => core/model}/module/Repo.kt (96%) rename app/src/main/java/com/topjohnwu/magisk/{utils/SuHandler.kt => core/su/SuCallbackHandler.kt} (89%) rename app/src/main/java/com/topjohnwu/magisk/{utils => core/su}/SuConnector.kt (97%) create mode 100644 app/src/main/java/com/topjohnwu/magisk/core/su/SuRequestHandler.kt rename app/src/main/java/com/topjohnwu/magisk/{ => core}/tasks/FlashZip.kt (95%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/tasks/MagiskInstaller.kt (89%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/tasks/RepoUpdater.kt (68%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/utils/BiometricHelper.kt (95%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/utils/Keygen.kt (85%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/utils/Locales.kt (95%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/utils/PatchAPK.kt (94%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/utils/ProgressInputStream.kt (95%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/utils/RootInit.kt (88%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/utils/SafetyNetHelper.kt (89%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/utils/Utils.kt (91%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/utils/ZipUtils.kt (97%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/view/Notifications.kt (89%) rename app/src/main/java/com/topjohnwu/magisk/{ => core}/view/Shortcuts.kt (93%) delete mode 100644 app/src/main/java/com/topjohnwu/magisk/model/zip/Zip.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/base/BaseUIActivity.kt rename app/src/main/java/com/topjohnwu/magisk/{base/BaseFragment.kt => ui/base/BaseUIFragment.kt} (83%) rename app/src/main/java/com/topjohnwu/magisk/{ => ui}/base/BaseViewModel.kt (97%) rename app/src/main/java/com/topjohnwu/magisk/ui/{compat => base}/CompatActivity.kt (93%) rename app/src/main/java/com/topjohnwu/magisk/ui/{compat => base}/CompatDelegate.kt (93%) rename app/src/main/java/com/topjohnwu/magisk/ui/{compat => base}/CompatFragment.kt (88%) rename app/src/main/java/com/topjohnwu/magisk/ui/{compat => base}/CompatHelpers.kt (97%) rename app/src/main/java/com/topjohnwu/magisk/ui/{compat => base}/CompatNavigationDelegate.kt (99%) rename app/src/main/java/com/topjohnwu/magisk/ui/{compat => base}/CompatView.kt (80%) rename app/src/main/java/com/topjohnwu/magisk/ui/{compat => base}/Queryable.kt (92%) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 8d54a7d63..187850117 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -17,9 +17,9 @@ #} # Snet --keepclassmembers class com.topjohnwu.magisk.utils.SafetyNetHelper { *; } --keep,allowobfuscation interface com.topjohnwu.magisk.utils.SafetyNetHelper$Callback --keepclassmembers class * implements com.topjohnwu.magisk.utils.SafetyNetHelper$Callback { +-keepclassmembers class com.topjohnwu.magisk.core.utils.SafetyNetHelper { *; } +-keep,allowobfuscation interface com.topjohnwu.magisk.core.utils.SafetyNetHelper$Callback +-keepclassmembers class * implements com.topjohnwu.magisk.core.utils.SafetyNetHelper$Callback { void onResponse(int); } @@ -29,13 +29,13 @@ } # DelegateWorker --keep,allowobfuscation class * extends com.topjohnwu.magisk.base.DelegateWorker +-keep,allowobfuscation class * extends com.topjohnwu.magisk.core.base.BaseWorkerWrapper # BootSigner -keep class a.a { *; } # Workaround R8 bug --keep,allowobfuscation class com.topjohnwu.magisk.model.receiver.GeneralReceiver +-keep,allowobfuscation class com.topjohnwu.magisk.core.GeneralReceiver -keepclassmembers class a.e { *; } # Strip logging diff --git a/app/src/main/java/a/a.java b/app/src/main/java/a/a.java index dcff5fbfa..7537dc297 100644 --- a/app/src/main/java/a/a.java +++ b/app/src/main/java/a/a.java @@ -1,6 +1,6 @@ package a; -import com.topjohnwu.magisk.utils.PatchAPK; +import com.topjohnwu.magisk.core.utils.PatchAPK; import com.topjohnwu.signing.BootSigner; public class a { diff --git a/app/src/main/java/a/c.java b/app/src/main/java/a/c.java index 73073ef6a..bc0ad4546 100644 --- a/app/src/main/java/a/c.java +++ b/app/src/main/java/a/c.java @@ -1,6 +1,6 @@ package a; -import com.topjohnwu.magisk.ui.SplashActivity; +import com.topjohnwu.magisk.core.SplashActivity; public class c extends SplashActivity { /* stub */ diff --git a/app/src/main/java/a/e.java b/app/src/main/java/a/e.java index e2f243e94..773d1dead 100644 --- a/app/src/main/java/a/e.java +++ b/app/src/main/java/a/e.java @@ -1,6 +1,6 @@ package a; -import com.topjohnwu.magisk.App; +import com.topjohnwu.magisk.core.App; public class e extends App { public e() { diff --git a/app/src/main/java/a/g.java b/app/src/main/java/a/g.java index 168ceb9fb..e8b94881b 100644 --- a/app/src/main/java/a/g.java +++ b/app/src/main/java/a/g.java @@ -5,7 +5,7 @@ import android.content.Context; import androidx.annotation.NonNull; import androidx.work.WorkerParameters; -import com.topjohnwu.magisk.model.update.UpdateCheckService; +import com.topjohnwu.magisk.core.UpdateCheckService; public class g extends w { /* Stub */ diff --git a/app/src/main/java/a/h.java b/app/src/main/java/a/h.java index 0be3819f7..dbf7751ea 100644 --- a/app/src/main/java/a/h.java +++ b/app/src/main/java/a/h.java @@ -1,6 +1,6 @@ package a; -import com.topjohnwu.magisk.model.receiver.GeneralReceiver; +import com.topjohnwu.magisk.core.GeneralReceiver; public class h extends GeneralReceiver { /* stub */ diff --git a/app/src/main/java/a/j.java b/app/src/main/java/a/j.java index a7be03859..8b3f9830f 100644 --- a/app/src/main/java/a/j.java +++ b/app/src/main/java/a/j.java @@ -1,6 +1,6 @@ package a; -import com.topjohnwu.magisk.model.download.DownloadService; +import com.topjohnwu.magisk.core.download.DownloadService; public class j extends DownloadService { /* stub */ diff --git a/app/src/main/java/a/w.java b/app/src/main/java/a/w.java index f852a8968..076926e7e 100644 --- a/app/src/main/java/a/w.java +++ b/app/src/main/java/a/w.java @@ -6,11 +6,11 @@ import androidx.annotation.NonNull; import androidx.work.Worker; import androidx.work.WorkerParameters; -import com.topjohnwu.magisk.base.DelegateWorker; +import com.topjohnwu.magisk.core.base.BaseWorkerWrapper; import java.lang.reflect.ParameterizedType; -public abstract class w extends Worker { +public abstract class w extends Worker { /* Wrapper class to workaround Proguard -keep class * extends Worker */ diff --git a/app/src/main/java/com/topjohnwu/magisk/App.kt b/app/src/main/java/com/topjohnwu/magisk/core/App.kt similarity index 88% rename from app/src/main/java/com/topjohnwu/magisk/App.kt rename to app/src/main/java/com/topjohnwu/magisk/core/App.kt index 3603a01ea..7d59c20f2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/App.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/App.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk +package com.topjohnwu.magisk.core import android.app.Application import android.content.Context @@ -9,6 +9,12 @@ import androidx.room.Room import androidx.work.WorkManager import androidx.work.impl.WorkDatabase import androidx.work.impl.WorkDatabase_Impl +import com.topjohnwu.magisk.BuildConfig +import com.topjohnwu.magisk.DynAPK +import com.topjohnwu.magisk.FileProvider +import com.topjohnwu.magisk.core.su.SuCallbackHandler +import com.topjohnwu.magisk.core.utils.RootInit +import com.topjohnwu.magisk.core.utils.updateConfig import com.topjohnwu.magisk.data.database.RepoDatabase import com.topjohnwu.magisk.data.database.RepoDatabase_Impl import com.topjohnwu.magisk.data.database.SuLogDatabase @@ -17,9 +23,6 @@ import com.topjohnwu.magisk.di.ActivityTracker import com.topjohnwu.magisk.di.koinModules import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.extensions.unwrap -import com.topjohnwu.magisk.utils.RootInit -import com.topjohnwu.magisk.utils.SuHandler -import com.topjohnwu.magisk.utils.updateConfig import com.topjohnwu.superuser.Shell import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin @@ -37,7 +40,7 @@ open class App() : Application() { Shell.Config.verboseLogging(BuildConfig.DEBUG) Shell.Config.addInitializers(RootInit::class.java) Shell.Config.setTimeout(2) - FileProvider.callHandler = SuHandler + FileProvider.callHandler = SuCallbackHandler Room.setFactory { when (it) { WorkDatabase::class.java -> WorkDatabase_Impl() diff --git a/app/src/main/java/com/topjohnwu/magisk/Config.kt b/app/src/main/java/com/topjohnwu/magisk/core/Config.kt similarity index 88% rename from app/src/main/java/com/topjohnwu/magisk/Config.kt rename to app/src/main/java/com/topjohnwu/magisk/core/Config.kt index 632bb2f75..118412372 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Config.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/Config.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk +package com.topjohnwu.magisk.core import android.content.Context import android.content.SharedPreferences @@ -6,16 +6,17 @@ import android.os.Environment import android.util.Xml import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.edit -import com.topjohnwu.magisk.data.database.SettingsDao -import com.topjohnwu.magisk.data.database.StringDao +import com.topjohnwu.magisk.BuildConfig +import com.topjohnwu.magisk.core.magiskdb.SettingsDao +import com.topjohnwu.magisk.core.magiskdb.StringDao import com.topjohnwu.magisk.data.repository.DBConfig import com.topjohnwu.magisk.di.Protected import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.extensions.inject import com.topjohnwu.magisk.model.preference.PreferenceModel import com.topjohnwu.magisk.ui.theme.Theme -import com.topjohnwu.magisk.utils.BiometricHelper -import com.topjohnwu.magisk.utils.Utils +import com.topjohnwu.magisk.core.utils.BiometricHelper +import com.topjohnwu.magisk.core.utils.Utils import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.io.SuFile import com.topjohnwu.superuser.io.SuFileInputStream @@ -115,12 +116,24 @@ object Config : PreferenceModel, DBConfig { var bootId by preference(Key.BOOT_ID, "") var downloadPath by preference(Key.DOWNLOAD_PATH, Environment.DIRECTORY_DOWNLOADS) - var repoOrder by preference(Key.REPO_ORDER, Value.ORDER_DATE) + var repoOrder by preference( + Key.REPO_ORDER, + Value.ORDER_DATE + ) var suDefaultTimeout by preferenceStrInt(Key.SU_REQUEST_TIMEOUT, 10) - var suAutoReponse by preferenceStrInt(Key.SU_AUTO_RESPONSE, Value.SU_PROMPT) - var suNotification by preferenceStrInt(Key.SU_NOTIFICATION, Value.NOTIFICATION_TOAST) - var updateChannel by preferenceStrInt(Key.UPDATE_CHANNEL, defaultChannel) + var suAutoReponse by preferenceStrInt( + Key.SU_AUTO_RESPONSE, + Value.SU_PROMPT + ) + var suNotification by preferenceStrInt( + Key.SU_NOTIFICATION, + Value.NOTIFICATION_TOAST + ) + var updateChannel by preferenceStrInt( + Key.UPDATE_CHANNEL, + defaultChannel + ) var safetyNotice by preference(Key.SAFETY, true) var darkThemeExtended by preference( @@ -139,9 +152,18 @@ object Config : PreferenceModel, DBConfig { var customChannelUrl by preference(Key.CUSTOM_CHANNEL, "") var locale by preference(Key.LOCALE, "") - var rootMode by dbSettings(Key.ROOT_ACCESS, Value.ROOT_ACCESS_APPS_AND_ADB) - var suMntNamespaceMode by dbSettings(Key.SU_MNT_NS, Value.NAMESPACE_MODE_REQUESTER) - var suMultiuserMode by dbSettings(Key.SU_MULTIUSER_MODE, Value.MULTIUSER_MODE_OWNER_ONLY) + var rootMode by dbSettings( + Key.ROOT_ACCESS, + Value.ROOT_ACCESS_APPS_AND_ADB + ) + var suMntNamespaceMode by dbSettings( + Key.SU_MNT_NS, + Value.NAMESPACE_MODE_REQUESTER + ) + var suMultiuserMode by dbSettings( + Key.SU_MULTIUSER_MODE, + Value.MULTIUSER_MODE_OWNER_ONLY + ) var suBiometric by dbSettings(Key.SU_BIOMETRIC, false) var suManager by dbStrings(Key.SU_MANAGER, "", true) var keyStoreRaw by dbStrings(Key.KEYSTORE, "", true) @@ -177,7 +199,9 @@ object Config : PreferenceModel, DBConfig { } private fun parsePrefs(editor: SharedPreferences.Editor) = editor.apply { - val config = SuFile.open("/data/adb", Const.MANAGER_CONFIGS) + val config = SuFile.open("/data/adb", + Const.MANAGER_CONFIGS + ) if (config.exists()) runCatching { val input = SuFileInputStream(config) val parser = Xml.newPullParser() diff --git a/app/src/main/java/com/topjohnwu/magisk/Const.kt b/app/src/main/java/com/topjohnwu/magisk/core/Const.kt similarity index 98% rename from app/src/main/java/com/topjohnwu/magisk/Const.kt rename to app/src/main/java/com/topjohnwu/magisk/core/Const.kt index 771612c5a..1ac63c3a7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Const.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/Const.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk +package com.topjohnwu.magisk.core import android.os.Process import java.io.File diff --git a/app/src/main/java/com/topjohnwu/magisk/model/receiver/GeneralReceiver.kt b/app/src/main/java/com/topjohnwu/magisk/core/GeneralReceiver.kt similarity index 75% rename from app/src/main/java/com/topjohnwu/magisk/model/receiver/GeneralReceiver.kt rename to app/src/main/java/com/topjohnwu/magisk/core/GeneralReceiver.kt index 90134a8eb..bb2c0eb4a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/receiver/GeneralReceiver.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/GeneralReceiver.kt @@ -1,19 +1,16 @@ -package com.topjohnwu.magisk.model.receiver +package com.topjohnwu.magisk.core import android.content.ContextWrapper import android.content.Intent -import com.topjohnwu.magisk.Config -import com.topjohnwu.magisk.Const -import com.topjohnwu.magisk.Info -import com.topjohnwu.magisk.base.BaseReceiver -import com.topjohnwu.magisk.data.database.PolicyDao +import com.topjohnwu.magisk.core.base.BaseReceiver +import com.topjohnwu.magisk.core.download.DownloadService +import com.topjohnwu.magisk.core.magiskdb.PolicyDao +import com.topjohnwu.magisk.core.su.SuCallbackHandler import com.topjohnwu.magisk.extensions.reboot -import com.topjohnwu.magisk.model.download.DownloadService -import com.topjohnwu.magisk.model.entity.ManagerJson +import com.topjohnwu.magisk.core.model.ManagerJson import com.topjohnwu.magisk.model.entity.internal.Configuration import com.topjohnwu.magisk.model.entity.internal.DownloadSubject -import com.topjohnwu.magisk.utils.SuHandler -import com.topjohnwu.magisk.view.Shortcuts +import com.topjohnwu.magisk.core.view.Shortcuts import com.topjohnwu.superuser.Shell import org.koin.core.inject @@ -30,7 +27,11 @@ open class GeneralReceiver : BaseReceiver() { when (intent.action ?: return) { Intent.ACTION_REBOOT -> { - SuHandler(context, intent.getStringExtra("action"), intent.extras) + SuCallbackHandler( + context, + intent.getStringExtra("action"), + intent.extras + ) } Intent.ACTION_PACKAGE_REPLACED -> { // This will only work pre-O diff --git a/app/src/main/java/com/topjohnwu/magisk/Hacks.kt b/app/src/main/java/com/topjohnwu/magisk/core/Hacks.kt similarity index 92% rename from app/src/main/java/com/topjohnwu/magisk/Hacks.kt rename to app/src/main/java/com/topjohnwu/magisk/core/Hacks.kt index a316acc8a..ec22ce036 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Hacks.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/Hacks.kt @@ -1,6 +1,6 @@ @file:Suppress("DEPRECATION") -package com.topjohnwu.magisk +package com.topjohnwu.magisk.core import android.annotation.SuppressLint import android.app.job.JobInfo @@ -14,16 +14,15 @@ import android.content.res.AssetManager import android.content.res.Configuration import android.content.res.Resources import androidx.annotation.RequiresApi +import com.topjohnwu.magisk.DynAPK +import com.topjohnwu.magisk.ProcessPhoenix +import com.topjohnwu.magisk.core.download.DownloadService +import com.topjohnwu.magisk.core.utils.refreshLocale +import com.topjohnwu.magisk.core.utils.updateConfig import com.topjohnwu.magisk.extensions.forceGetDeclaredField -import com.topjohnwu.magisk.model.download.DownloadService -import com.topjohnwu.magisk.model.receiver.GeneralReceiver -import com.topjohnwu.magisk.model.update.UpdateCheckService -import com.topjohnwu.magisk.ui.MainActivity -import com.topjohnwu.magisk.ui.SplashActivity import com.topjohnwu.magisk.legacy.flash.FlashActivity import com.topjohnwu.magisk.legacy.surequest.SuRequestActivity -import com.topjohnwu.magisk.utils.refreshLocale -import com.topjohnwu.magisk.utils.updateConfig +import com.topjohnwu.magisk.ui.MainActivity fun AssetManager.addAssetPath(path: String) { DynAPK.addAssetPath(this, path) diff --git a/app/src/main/java/com/topjohnwu/magisk/Info.kt b/app/src/main/java/com/topjohnwu/magisk/core/Info.kt similarity index 95% rename from app/src/main/java/com/topjohnwu/magisk/Info.kt rename to app/src/main/java/com/topjohnwu/magisk/core/Info.kt index 0d1e3bb01..c4a9c7061 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Info.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/Info.kt @@ -1,9 +1,10 @@ -package com.topjohnwu.magisk +package com.topjohnwu.magisk.core import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork +import com.topjohnwu.magisk.DynAPK +import com.topjohnwu.magisk.core.model.UpdateInfo import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.extensions.subscribeK -import com.topjohnwu.magisk.model.entity.UpdateInfo import com.topjohnwu.magisk.utils.CachedValue import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.superuser.Shell diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/SplashActivity.kt b/app/src/main/java/com/topjohnwu/magisk/core/SplashActivity.kt similarity index 88% rename from app/src/main/java/com/topjohnwu/magisk/ui/SplashActivity.kt rename to app/src/main/java/com/topjohnwu/magisk/core/SplashActivity.kt index ad942ae0a..d56489ff1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/SplashActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/SplashActivity.kt @@ -1,16 +1,13 @@ -package com.topjohnwu.magisk.ui +package com.topjohnwu.magisk.core import android.app.Activity import android.content.Context import android.os.Bundle import com.topjohnwu.magisk.BuildConfig -import com.topjohnwu.magisk.Config -import com.topjohnwu.magisk.Info import com.topjohnwu.magisk.model.navigation.Navigation -import com.topjohnwu.magisk.utils.Utils -import com.topjohnwu.magisk.view.Notifications -import com.topjohnwu.magisk.view.Shortcuts -import com.topjohnwu.magisk.wrap +import com.topjohnwu.magisk.core.utils.Utils +import com.topjohnwu.magisk.core.view.Notifications +import com.topjohnwu.magisk.core.view.Shortcuts import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.ShellUtils diff --git a/app/src/main/java/com/topjohnwu/magisk/model/update/UpdateCheckService.kt b/app/src/main/java/com/topjohnwu/magisk/core/UpdateCheckService.kt similarity index 80% rename from app/src/main/java/com/topjohnwu/magisk/model/update/UpdateCheckService.kt rename to app/src/main/java/com/topjohnwu/magisk/core/UpdateCheckService.kt index 190e05802..162918caa 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/update/UpdateCheckService.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/UpdateCheckService.kt @@ -1,15 +1,14 @@ -package com.topjohnwu.magisk.model.update +package com.topjohnwu.magisk.core import androidx.work.ListenableWorker import com.topjohnwu.magisk.BuildConfig -import com.topjohnwu.magisk.Info -import com.topjohnwu.magisk.base.DelegateWorker +import com.topjohnwu.magisk.core.base.BaseWorkerWrapper +import com.topjohnwu.magisk.core.view.Notifications import com.topjohnwu.magisk.data.repository.MagiskRepository import com.topjohnwu.magisk.extensions.inject -import com.topjohnwu.magisk.view.Notifications import com.topjohnwu.superuser.Shell -class UpdateCheckService : DelegateWorker() { +class UpdateCheckService : BaseWorkerWrapper() { private val magiskRepo: MagiskRepository by inject() diff --git a/app/src/main/java/com/topjohnwu/magisk/base/BaseActivity.kt b/app/src/main/java/com/topjohnwu/magisk/core/base/BaseActivity.kt similarity index 60% rename from app/src/main/java/com/topjohnwu/magisk/base/BaseActivity.kt rename to app/src/main/java/com/topjohnwu/magisk/core/base/BaseActivity.kt index f308ef624..3c08cebb4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/base/BaseActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/base/BaseActivity.kt @@ -1,47 +1,26 @@ -package com.topjohnwu.magisk.base +package com.topjohnwu.magisk.core.base import android.Manifest import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.content.res.Configuration -import android.os.Bundle import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.app.AppCompatDelegate import androidx.collection.SparseArrayCompat import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat -import androidx.databinding.DataBindingUtil -import androidx.databinding.ViewDataBinding -import com.topjohnwu.magisk.BR -import com.topjohnwu.magisk.Config -import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.utils.currentLocale +import com.topjohnwu.magisk.core.wrap import com.topjohnwu.magisk.extensions.set -import com.topjohnwu.magisk.model.events.EventHandler import com.topjohnwu.magisk.model.permissions.PermissionRequestBuilder -import com.topjohnwu.magisk.utils.currentLocale -import com.topjohnwu.magisk.wrap import kotlin.random.Random -typealias RequestCallback = BaseActivity<*, *>.(Int, Intent?) -> Unit +typealias RequestCallback = BaseActivity.(Int, Intent?) -> Unit -abstract class BaseActivity : - AppCompatActivity(), EventHandler { - - protected lateinit var binding: Binding - protected abstract val layoutRes: Int - protected abstract val viewModel: ViewModel - protected open val themeRes: Int = R.style.MagiskTheme - - open val snackbarView get() = binding.root +abstract class BaseActivity : AppCompatActivity() { private val resultCallbacks by lazy { SparseArrayCompat() } - init { - val theme = Config.darkThemeExtended - AppCompatDelegate.setDefaultNightMode(theme) - } - override fun applyOverrideConfiguration(config: Configuration?) { // Force applying our preferred local config?.setLocale(currentLocale) @@ -52,18 +31,6 @@ abstract class BaseActivity(this, layoutRes).apply { - setVariable(BR.viewModel, viewModel) - lifecycleOwner = this@BaseActivity - } - } - fun withPermissions(vararg permissions: String, builder: PermissionRequestBuilder.() -> Unit) { val request = PermissionRequestBuilder().apply(builder).build() val ungranted = permissions.filter { @@ -89,7 +56,7 @@ abstract class BaseActivity, grantResults: IntArray) { + requestCode: Int, permissions: Array, grantResults: IntArray) { var success = true for (res in grantResults) { if (res != PackageManager.PERMISSION_GRANTED) { @@ -97,18 +64,18 @@ abstract class BaseActivity { abstract var id: String diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/module/Module.kt b/app/src/main/java/com/topjohnwu/magisk/core/model/module/Module.kt similarity index 96% rename from app/src/main/java/com/topjohnwu/magisk/model/entity/module/Module.kt rename to app/src/main/java/com/topjohnwu/magisk/core/model/module/Module.kt index 1da190682..40ddecdd7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/module/Module.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/model/module/Module.kt @@ -1,7 +1,7 @@ -package com.topjohnwu.magisk.model.entity.module +package com.topjohnwu.magisk.core.model.module import androidx.annotation.WorkerThread -import com.topjohnwu.magisk.Const +import com.topjohnwu.magisk.core.Const import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.io.SuFile diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/module/Repo.kt b/app/src/main/java/com/topjohnwu/magisk/core/model/module/Repo.kt similarity index 96% rename from app/src/main/java/com/topjohnwu/magisk/model/entity/module/Repo.kt rename to app/src/main/java/com/topjohnwu/magisk/core/model/module/Repo.kt index 3bb4ee096..2bd4f1aaf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/module/Repo.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/model/module/Repo.kt @@ -1,9 +1,9 @@ -package com.topjohnwu.magisk.model.entity.module +package com.topjohnwu.magisk.core.model.module import android.os.Parcelable import androidx.room.Entity import androidx.room.PrimaryKey -import com.topjohnwu.magisk.Const +import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.data.repository.StringRepository import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.extensions.legalFilename diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/SuHandler.kt b/app/src/main/java/com/topjohnwu/magisk/core/su/SuCallbackHandler.kt similarity index 89% rename from app/src/main/java/com/topjohnwu/magisk/utils/SuHandler.kt rename to app/src/main/java/com/topjohnwu/magisk/core/su/SuCallbackHandler.kt index 3afee48a6..6b9959566 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/SuHandler.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/su/SuCallbackHandler.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.utils +package com.topjohnwu.magisk.core.su import android.content.Context import android.content.Intent @@ -6,20 +6,26 @@ import android.os.Build import android.os.Bundle import android.os.Process import android.widget.Toast -import com.topjohnwu.magisk.* +import com.topjohnwu.magisk.BuildConfig +import com.topjohnwu.magisk.ProviderCallHandler +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.Config +import com.topjohnwu.magisk.core.intent +import com.topjohnwu.magisk.core.model.MagiskPolicy +import com.topjohnwu.magisk.core.model.toPolicy +import com.topjohnwu.magisk.core.wrap import com.topjohnwu.magisk.data.repository.LogRepository import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.extensions.startActivity import com.topjohnwu.magisk.extensions.startActivityWithRoot import com.topjohnwu.magisk.extensions.subscribeK -import com.topjohnwu.magisk.model.entity.MagiskPolicy -import com.topjohnwu.magisk.model.entity.toLog -import com.topjohnwu.magisk.model.entity.toPolicy import com.topjohnwu.magisk.legacy.surequest.SuRequestActivity +import com.topjohnwu.magisk.model.entity.toLog +import com.topjohnwu.magisk.core.utils.Utils import com.topjohnwu.superuser.Shell import timber.log.Timber -object SuHandler : ProviderCallHandler { +object SuCallbackHandler : ProviderCallHandler { const val REQUEST = "request" const val LOG = "log" diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/SuConnector.kt b/app/src/main/java/com/topjohnwu/magisk/core/su/SuConnector.kt similarity index 97% rename from app/src/main/java/com/topjohnwu/magisk/utils/SuConnector.kt rename to app/src/main/java/com/topjohnwu/magisk/core/su/SuConnector.kt index 9570d99da..0b7e8ee2c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/SuConnector.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/su/SuConnector.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.utils +package com.topjohnwu.magisk.core.su import android.net.LocalSocket import android.net.LocalSocketAddress diff --git a/app/src/main/java/com/topjohnwu/magisk/core/su/SuRequestHandler.kt b/app/src/main/java/com/topjohnwu/magisk/core/su/SuRequestHandler.kt new file mode 100644 index 000000000..204ffc31b --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/core/su/SuRequestHandler.kt @@ -0,0 +1,103 @@ +package com.topjohnwu.magisk.core.su + +import android.content.Intent +import android.content.pm.PackageManager +import android.os.CountDownTimer +import com.topjohnwu.magisk.BuildConfig +import com.topjohnwu.magisk.core.Config +import com.topjohnwu.magisk.core.Const +import com.topjohnwu.magisk.core.magiskdb.PolicyDao +import com.topjohnwu.magisk.core.model.MagiskPolicy +import com.topjohnwu.magisk.core.model.toPolicy +import com.topjohnwu.magisk.extensions.now +import timber.log.Timber +import java.util.concurrent.TimeUnit + +abstract class SuRequestHandler( + private val packageManager: PackageManager, + private val policyDB: PolicyDao +) { + protected var timer: CountDownTimer = object : CountDownTimer( + TimeUnit.MINUTES.toMillis(1), TimeUnit.MINUTES.toMillis(1)) { + override fun onFinish() { + respond(MagiskPolicy.DENY, 0) + } + override fun onTick(remains: Long) {} + } + set(value) { + field.cancel() + field = value + field.start() + } + + protected lateinit var policy: MagiskPolicy + + private val cleanupTasks = mutableListOf<() -> Unit>() + private lateinit var connector: SuConnector + + abstract fun onStart() + abstract fun onRespond() + + fun start(intent: Intent): Boolean { + val socketName = intent.getStringExtra("socket") ?: return false + + try { + connector = object : SuConnector(socketName) { + override fun onResponse() { + out.writeInt(policy.policy) + } + } + val map = connector.readRequest() + val uid = map["uid"]?.toIntOrNull() ?: return false + policy = uid.toPolicy(packageManager) + } catch (e: Exception) { + Timber.e(e) + return false + } + + // Never allow com.topjohnwu.magisk (could be malware) + if (policy.packageName == BuildConfig.APPLICATION_ID) + return false + + when (Config.suAutoReponse) { + Config.Value.SU_AUTO_DENY -> { + respond(MagiskPolicy.DENY, 0) + return true + } + Config.Value.SU_AUTO_ALLOW -> { + respond(MagiskPolicy.ALLOW, 0) + return true + } + } + + timer.start() + cleanupTasks.add { + timer.cancel() + } + + onStart() + return true + } + + private fun respond() { + connector.response() + cleanupTasks.forEach { it() } + onRespond() + } + + fun respond(action: Int, time: Int) { + val until = if (time > 0) + TimeUnit.MILLISECONDS.toSeconds(now) + TimeUnit.MINUTES.toSeconds(time.toLong()) + else + time.toLong() + + policy.policy = action + policy.until = until + policy.uid = policy.uid % 100000 + Const.USER_ID * 100000 + + if (until >= 0) + policyDB.update(policy).blockingAwait() + + respond() + } +} diff --git a/app/src/main/java/com/topjohnwu/magisk/tasks/FlashZip.kt b/app/src/main/java/com/topjohnwu/magisk/core/tasks/FlashZip.kt similarity index 95% rename from app/src/main/java/com/topjohnwu/magisk/tasks/FlashZip.kt rename to app/src/main/java/com/topjohnwu/magisk/core/tasks/FlashZip.kt index 2e9e9ac36..22759ece6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/tasks/FlashZip.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/tasks/FlashZip.kt @@ -1,13 +1,13 @@ -package com.topjohnwu.magisk.tasks +package com.topjohnwu.magisk.core.tasks import android.content.Context import android.net.Uri -import com.topjohnwu.magisk.Const +import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.extensions.fileName import com.topjohnwu.magisk.extensions.inject import com.topjohnwu.magisk.extensions.readUri import com.topjohnwu.magisk.extensions.subscribeK -import com.topjohnwu.magisk.utils.unzip +import com.topjohnwu.magisk.core.utils.unzip import com.topjohnwu.superuser.Shell import io.reactivex.Single import java.io.File diff --git a/app/src/main/java/com/topjohnwu/magisk/tasks/MagiskInstaller.kt b/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt similarity index 89% rename from app/src/main/java/com/topjohnwu/magisk/tasks/MagiskInstaller.kt rename to app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt index 19598e116..8c148df71 100644 --- a/app/src/main/java/com/topjohnwu/magisk/tasks/MagiskInstaller.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.tasks +package com.topjohnwu.magisk.core.tasks import android.content.Context import android.net.Uri @@ -6,11 +6,13 @@ import android.os.Build import android.text.TextUtils import androidx.annotation.MainThread import androidx.annotation.WorkerThread -import com.topjohnwu.magisk.Config -import com.topjohnwu.magisk.Info +import androidx.core.net.toUri +import com.topjohnwu.magisk.core.Info +import com.topjohnwu.magisk.core.Config import com.topjohnwu.magisk.data.network.GithubRawServices import com.topjohnwu.magisk.di.Protected import com.topjohnwu.magisk.extensions.* +import com.topjohnwu.magisk.net.Networking import com.topjohnwu.signing.SignBoot import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.ShellUtils @@ -34,10 +36,10 @@ import java.util.zip.ZipInputStream abstract class MagiskInstaller { - protected lateinit var srcBoot: String - protected lateinit var destFile: File protected lateinit var installDir: File - protected lateinit var zipUri: Uri + private lateinit var srcBoot: String + private lateinit var destFile: File + private lateinit var zipUri: Uri private val console: MutableList private val logs: MutableList @@ -60,7 +62,7 @@ abstract class MagiskInstaller { installDir.mkdirs() } - protected fun findImage(): Boolean { + private fun findImage(): Boolean { srcBoot = "find_boot_image; echo \"\$BOOTIMAGE\"".fsh() if (srcBoot.isEmpty()) { console.add("! Unable to detect target image") @@ -70,7 +72,7 @@ abstract class MagiskInstaller { return true } - protected fun findSecondaryImage(): Boolean { + private fun findSecondaryImage(): Boolean { val slot = "echo \$SLOT".fsh() val target = if (slot == "_a") "_b" else "_a" console.add("- Target slot: $target") @@ -87,7 +89,7 @@ abstract class MagiskInstaller { return true } - protected fun extractZip(): Boolean { + private fun extractZip(): Boolean { val arch: String arch = if (Build.VERSION.SDK_INT >= 21) { val abis = listOf(*Build.SUPPORTED_ABIS) @@ -208,7 +210,7 @@ abstract class MagiskInstaller { } } - protected fun handleFile(uri: Uri): Boolean { + private fun handleFile(uri: Uri): Boolean { try { context.readUri(uri).buffered().use { it.mark(500) @@ -238,7 +240,7 @@ abstract class MagiskInstaller { return true } - protected fun patchBoot(): Boolean { + private fun patchBoot(): Boolean { var isSigned = false try { SuFileInputStream(srcBoot).use { @@ -284,7 +286,7 @@ abstract class MagiskInstaller { return true } - protected fun flashBoot(): Boolean { + private fun flashBoot(): Boolean { if (!"direct_install $installDir $srcBoot".sh().isSuccess) return false arrayOf( @@ -294,7 +296,7 @@ abstract class MagiskInstaller { return true } - protected fun storeBoot(): Boolean { + private fun storeBoot(): Boolean { val patched = SuFile.open(installDir, "new-boot.img") try { val os = tarOut?.let { @@ -320,7 +322,7 @@ abstract class MagiskInstaller { return true } - protected fun postOTA(): Boolean { + private fun postOTA(): Boolean { val bootctl = SuFile("/data/adb/bootctl") try { withStreams(service.fetchBootctl().blockingGet().byteStream(), bootctl.suOutputStream()) { @@ -345,6 +347,28 @@ abstract class MagiskInstaller { private fun String.fsh() = ShellUtils.fastCmd(this) private fun Array.fsh() = ShellUtils.fastCmd(*this) + protected fun doPatchFile(patchFile: Uri) = + extractZip() && handleFile(patchFile) && patchBoot() && storeBoot() + + protected fun direct() = findImage() && extractZip() && patchBoot() && flashBoot() + + protected fun secondSlot() = + findSecondaryImage() && extractZip() && patchBoot() && flashBoot() && postOTA() + + protected fun fixEnv(): Boolean { + val context = get() + val zip: File = context.cachedFile("magisk.zip") + + installDir = SuFile("/data/adb/magisk") + Shell.su("rm -rf /data/adb/magisk/*").exec() + + if (!ShellUtils.checkSum("MD5", zip, Info.remote.magisk.md5)) + Networking.get(Info.remote.magisk.link).execForFile(zip) + + zipUri = zip.toUri() + return extractZip() && Shell.su("fix_env").exec().isSuccess + } + @WorkerThread protected abstract fun operations(): Boolean diff --git a/app/src/main/java/com/topjohnwu/magisk/tasks/RepoUpdater.kt b/app/src/main/java/com/topjohnwu/magisk/core/tasks/RepoUpdater.kt similarity index 68% rename from app/src/main/java/com/topjohnwu/magisk/tasks/RepoUpdater.kt rename to app/src/main/java/com/topjohnwu/magisk/core/tasks/RepoUpdater.kt index 62fd54e0f..e8b4f2dfd 100644 --- a/app/src/main/java/com/topjohnwu/magisk/tasks/RepoUpdater.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/tasks/RepoUpdater.kt @@ -1,11 +1,11 @@ -package com.topjohnwu.magisk.tasks +package com.topjohnwu.magisk.core.tasks -import com.topjohnwu.magisk.Const +import com.topjohnwu.magisk.core.Const +import com.topjohnwu.magisk.core.model.module.Repo import com.topjohnwu.magisk.data.database.RepoDao import com.topjohnwu.magisk.data.network.GithubApiServices -import com.topjohnwu.magisk.model.entity.module.Repo +import io.reactivex.Completable import io.reactivex.Flowable -import io.reactivex.Single import io.reactivex.rxkotlin.toFlowable import io.reactivex.schedulers.Schedulers import se.ansman.kotshi.JsonSerializable @@ -19,18 +19,17 @@ class RepoUpdater( private val api: GithubApiServices, private val repoDB: RepoDao ) { - private fun loadRepos(repos: List, cached: MutableSet) = - repos.toFlowable().parallel().runOn(Schedulers.io()).map { - // Skip submission - if (it.id == "submission") - return@map - (repoDB.getRepo(it.id)?.apply { cached.remove(it.id) } ?: - Repo(it.id)).runCatching { - update(it.pushDate) - repoDB.addRepo(this) - }.getOrElse { Timber.e(it) } - }.sequential() + repos.toFlowable().parallel().runOn(Schedulers.io()).map { + // Skip submission + if (it.id == "submission") + return@map + (repoDB.getRepo(it.id)?.apply { cached.remove(it.id) } ?: + Repo(it.id)).runCatching { + update(it.pushDate) + repoDB.addRepo(this) + }.getOrElse { Timber.e(it) } + }.sequential() private fun loadPage( cached: MutableSet, @@ -55,16 +54,16 @@ class RepoUpdater( } private fun forcedReload(cached: MutableSet) = - cached.toFlowable().parallel().runOn(Schedulers.io()).map { - runCatching { - Repo(it).update() - }.getOrElse { Timber.e(it) } - }.sequential() + cached.toFlowable().parallel().runOn(Schedulers.io()).map { + runCatching { + Repo(it).update() + }.getOrElse { Timber.e(it) } + }.sequential() private fun String.trimEtag() = substring(indexOf('\"'), lastIndexOf('\"') + 1) @Suppress("RedundantLambdaArrow") - operator fun invoke(forced: Boolean = false) : Single { + operator fun invoke(forced: Boolean = false) : Completable { val cached = Collections.synchronizedSet(HashSet(repoDB.repoIDList)) return loadPage(cached, etag = repoDB.etagKey).doOnComplete { repoDB.removeRepos(cached) @@ -76,16 +75,16 @@ class RepoUpdater( Timber.e(it) } Flowable.empty() - }.ignoreElements().toSingleDefault(Unit) + }.ignoreElements() } object CachedException : Exception() } private val dateFormat: SimpleDateFormat = - SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US).apply { - timeZone = TimeZone.getTimeZone("UTC") - } + SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US).apply { + timeZone = TimeZone.getTimeZone("UTC") + } @JsonSerializable data class GithubRepoInfo( diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/BiometricHelper.kt b/app/src/main/java/com/topjohnwu/magisk/core/utils/BiometricHelper.kt similarity index 95% rename from app/src/main/java/com/topjohnwu/magisk/utils/BiometricHelper.kt rename to app/src/main/java/com/topjohnwu/magisk/core/utils/BiometricHelper.kt index 0b2bae237..523d7319f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/BiometricHelper.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/utils/BiometricHelper.kt @@ -1,11 +1,11 @@ -package com.topjohnwu.magisk.utils +package com.topjohnwu.magisk.core.utils import androidx.biometric.BiometricManager import androidx.biometric.BiometricPrompt import androidx.core.content.ContextCompat import androidx.fragment.app.FragmentActivity -import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.Config import org.koin.core.KoinComponent import org.koin.core.get diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Keygen.kt b/app/src/main/java/com/topjohnwu/magisk/core/utils/Keygen.kt similarity index 85% rename from app/src/main/java/com/topjohnwu/magisk/utils/Keygen.kt rename to app/src/main/java/com/topjohnwu/magisk/core/utils/Keygen.kt index d1ffcf04a..993d1fc06 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Keygen.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/utils/Keygen.kt @@ -1,11 +1,11 @@ -package com.topjohnwu.magisk.utils +package com.topjohnwu.magisk.core.utils import android.content.pm.PackageManager import android.util.Base64 import android.util.Base64OutputStream -import com.topjohnwu.magisk.Config +import com.topjohnwu.magisk.core.Config +import com.topjohnwu.magisk.core.utils.PatchAPK.ALPHANUM import com.topjohnwu.magisk.di.koinModules -import com.topjohnwu.magisk.utils.PatchAPK.ALPHANUM import com.topjohnwu.signing.CryptoUtils.readCertificate import com.topjohnwu.signing.CryptoUtils.readPrivateKey import com.topjohnwu.superuser.internal.InternalUtils @@ -50,10 +50,14 @@ class Keygen: CertKeyProvider { private val provider: CertKeyProvider - inner class KeyStoreProvider : CertKeyProvider { + inner class KeyStoreProvider : + CertKeyProvider { private val ks by lazy { init() } override val cert by lazy { ks.getCertificate(ALIAS) as X509Certificate } - override val key by lazy { ks.getKey(ALIAS, PASSWORD) as PrivateKey } + override val key by lazy { ks.getKey( + ALIAS, + PASSWORD + ) as PrivateKey } } class TestProvider : CertKeyProvider { @@ -113,8 +117,12 @@ class Keygen: CertKeyProvider { if (raw.isEmpty()) { ks.load(null) } else { - GZIPInputStream(Base64.decode(raw, BASE64_FLAG).inputStream()).use { - ks.load(it, PASSWORD) + GZIPInputStream(Base64.decode(raw, + BASE64_FLAG + ).inputStream()).use { + ks.load(it, + PASSWORD + ) } } @@ -131,10 +139,16 @@ class Keygen: CertKeyProvider { val cert = JcaX509CertificateConverter().getCertificate(builder.build(signer)) // Store them into keystore - ks.setKeyEntry(ALIAS, kp.private, PASSWORD, arrayOf(cert)) + ks.setKeyEntry( + ALIAS, kp.private, + PASSWORD, arrayOf(cert)) val bytes = ByteArrayOutputStream() - GZIPOutputStream(Base64OutputStream(bytes, BASE64_FLAG)).use { - ks.store(it, PASSWORD) + GZIPOutputStream(Base64OutputStream(bytes, + BASE64_FLAG + )).use { + ks.store(it, + PASSWORD + ) } Config.keyStoreRaw = bytes.toString("UTF-8") diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Locales.kt b/app/src/main/java/com/topjohnwu/magisk/core/utils/Locales.kt similarity index 95% rename from app/src/main/java/com/topjohnwu/magisk/utils/Locales.kt rename to app/src/main/java/com/topjohnwu/magisk/core/utils/Locales.kt index f08bdb3d3..6cce37c15 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Locales.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/utils/Locales.kt @@ -1,13 +1,13 @@ @file:Suppress("DEPRECATION") -package com.topjohnwu.magisk.utils +package com.topjohnwu.magisk.core.utils import android.annotation.SuppressLint import android.content.res.Configuration import android.content.res.Resources -import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.ResourceMgr +import com.topjohnwu.magisk.core.Config +import com.topjohnwu.magisk.core.ResourceMgr import com.topjohnwu.magisk.extensions.langTagToLocale import com.topjohnwu.magisk.extensions.toLangTag import io.reactivex.Single diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/PatchAPK.kt b/app/src/main/java/com/topjohnwu/magisk/core/utils/PatchAPK.kt similarity index 94% rename from app/src/main/java/com/topjohnwu/magisk/utils/PatchAPK.kt rename to app/src/main/java/com/topjohnwu/magisk/core/utils/PatchAPK.kt index b1d4c00d3..8d3f9a984 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/PatchAPK.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/utils/PatchAPK.kt @@ -1,15 +1,20 @@ -package com.topjohnwu.magisk.utils +package com.topjohnwu.magisk.core.utils import android.content.Context import android.os.Build.VERSION.SDK_INT import android.widget.Toast -import com.topjohnwu.magisk.* +import com.topjohnwu.magisk.BuildConfig +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.Config +import com.topjohnwu.magisk.core.Const +import com.topjohnwu.magisk.core.Info +import com.topjohnwu.magisk.core.isRunningAsStub import com.topjohnwu.magisk.data.network.GithubRawServices import com.topjohnwu.magisk.extensions.DynamicClassLoader import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.extensions.writeTo -import com.topjohnwu.magisk.view.Notifications +import com.topjohnwu.magisk.core.view.Notifications import com.topjohnwu.signing.JarMap import com.topjohnwu.signing.SignAPK import com.topjohnwu.superuser.Shell diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/ProgressInputStream.kt b/app/src/main/java/com/topjohnwu/magisk/core/utils/ProgressInputStream.kt similarity index 95% rename from app/src/main/java/com/topjohnwu/magisk/utils/ProgressInputStream.kt rename to app/src/main/java/com/topjohnwu/magisk/core/utils/ProgressInputStream.kt index 817f06566..ac0f26cb9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/ProgressInputStream.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/utils/ProgressInputStream.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.utils +package com.topjohnwu.magisk.core.utils import com.topjohnwu.superuser.internal.UiThreadHandler import java.io.FilterInputStream @@ -41,4 +41,4 @@ class ProgressInputStream( } return sz } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/RootInit.kt b/app/src/main/java/com/topjohnwu/magisk/core/utils/RootInit.kt similarity index 88% rename from app/src/main/java/com/topjohnwu/magisk/utils/RootInit.kt rename to app/src/main/java/com/topjohnwu/magisk/core/utils/RootInit.kt index 92d5a2729..5f75e1819 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/RootInit.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/utils/RootInit.kt @@ -1,10 +1,10 @@ -package com.topjohnwu.magisk.utils +package com.topjohnwu.magisk.core.utils import android.content.Context -import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.Const +import com.topjohnwu.magisk.core.wrap import com.topjohnwu.magisk.extensions.rawResource -import com.topjohnwu.magisk.wrap import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.io.SuFile diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/SafetyNetHelper.kt b/app/src/main/java/com/topjohnwu/magisk/core/utils/SafetyNetHelper.kt similarity index 89% rename from app/src/main/java/com/topjohnwu/magisk/utils/SafetyNetHelper.kt rename to app/src/main/java/com/topjohnwu/magisk/core/utils/SafetyNetHelper.kt index 6e95ed82e..c27fc1836 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/SafetyNetHelper.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/utils/SafetyNetHelper.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.utils +package com.topjohnwu.magisk.core.utils interface SafetyNetHelper { diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.kt b/app/src/main/java/com/topjohnwu/magisk/core/utils/Utils.kt similarity index 91% rename from app/src/main/java/com/topjohnwu/magisk/utils/Utils.kt rename to app/src/main/java/com/topjohnwu/magisk/core/utils/Utils.kt index 810b9eba6..1ab7849e7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/utils/Utils.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.utils +package com.topjohnwu.magisk.core.utils import android.content.Context import android.content.Intent @@ -7,10 +7,10 @@ import android.net.Uri import android.os.Environment import android.widget.Toast import androidx.work.* -import com.topjohnwu.magisk.* +import com.topjohnwu.magisk.BuildConfig import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.* import com.topjohnwu.magisk.extensions.get -import com.topjohnwu.magisk.model.update.UpdateCheckService import com.topjohnwu.superuser.internal.UiThreadHandler import java.io.File import java.util.concurrent.TimeUnit @@ -62,7 +62,10 @@ object Utils { if (intent.resolveActivity(context.packageManager) != null) { context.startActivity(intent) } else { - toast(R.string.open_link_failed_toast, Toast.LENGTH_SHORT) + toast( + R.string.open_link_failed_toast, + Toast.LENGTH_SHORT + ) } } diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/ZipUtils.kt b/app/src/main/java/com/topjohnwu/magisk/core/utils/ZipUtils.kt similarity index 97% rename from app/src/main/java/com/topjohnwu/magisk/utils/ZipUtils.kt rename to app/src/main/java/com/topjohnwu/magisk/core/utils/ZipUtils.kt index 322750717..1267f19b7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/ZipUtils.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/utils/ZipUtils.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.utils +package com.topjohnwu.magisk.core.utils import com.topjohnwu.superuser.io.SuFile import com.topjohnwu.superuser.io.SuFileOutputStream diff --git a/app/src/main/java/com/topjohnwu/magisk/view/Notifications.kt b/app/src/main/java/com/topjohnwu/magisk/core/view/Notifications.kt similarity index 89% rename from app/src/main/java/com/topjohnwu/magisk/view/Notifications.kt rename to app/src/main/java/com/topjohnwu/magisk/core/view/Notifications.kt index d056a2e83..ddcc7765e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/Notifications.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/view/Notifications.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.view +package com.topjohnwu.magisk.core.view import android.app.Notification import android.app.NotificationChannel @@ -9,13 +9,12 @@ import android.os.Build.VERSION.SDK_INT import androidx.core.app.TaskStackBuilder import androidx.core.content.getSystemService import androidx.core.graphics.drawable.toIcon -import com.topjohnwu.magisk.* -import com.topjohnwu.magisk.Const.ID.PROGRESS_NOTIFICATION_CHANNEL -import com.topjohnwu.magisk.Const.ID.UPDATE_NOTIFICATION_CHANNEL +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.* +import com.topjohnwu.magisk.core.Const.ID.PROGRESS_NOTIFICATION_CHANNEL +import com.topjohnwu.magisk.core.Const.ID.UPDATE_NOTIFICATION_CHANNEL import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.extensions.getBitmap -import com.topjohnwu.magisk.model.receiver.GeneralReceiver -import com.topjohnwu.magisk.ui.SplashActivity object Notifications { @@ -52,10 +51,13 @@ object Notifications { val stackBuilder = TaskStackBuilder.create(context) stackBuilder.addParentStack(SplashActivity::class.java.cmp(context.packageName)) stackBuilder.addNextIntent(intent) - val pendingIntent = stackBuilder.getPendingIntent(Const.ID.MAGISK_UPDATE_NOTIFICATION_ID, + val pendingIntent = stackBuilder.getPendingIntent( + Const.ID.MAGISK_UPDATE_NOTIFICATION_ID, PendingIntent.FLAG_UPDATE_CURRENT) - val builder = updateBuilder(context) + val builder = updateBuilder( + context + ) .setContentTitle(context.getString(R.string.magisk_update_title)) .setContentText(context.getString(R.string.manager_download_install)) .setAutoCancel(true) @@ -72,7 +74,9 @@ object Notifications { val pendingIntent = PendingIntent.getBroadcast(context, Const.ID.APK_UPDATE_NOTIFICATION_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT) - val builder = updateBuilder(context) + val builder = updateBuilder( + context + ) .setContentTitle(context.getString(R.string.manager_update_title)) .setContentText(context.getString(R.string.manager_download_install)) .setAutoCancel(true) @@ -87,7 +91,9 @@ object Notifications { val pendingIntent = PendingIntent.getBroadcast(context, Const.ID.DTBO_NOTIFICATION_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT) - val builder = updateBuilder(context) + val builder = updateBuilder( + context + ) .setContentTitle(context.getString(R.string.dtbo_patched_title)) .setContentText(context.getString(R.string.dtbo_patched_reboot)) diff --git a/app/src/main/java/com/topjohnwu/magisk/view/Shortcuts.kt b/app/src/main/java/com/topjohnwu/magisk/core/view/Shortcuts.kt similarity index 93% rename from app/src/main/java/com/topjohnwu/magisk/view/Shortcuts.kt rename to app/src/main/java/com/topjohnwu/magisk/core/view/Shortcuts.kt index d8bfa7e0a..f4d0a3c78 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/Shortcuts.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/view/Shortcuts.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.view +package com.topjohnwu.magisk.core.view import android.content.Context import android.content.Intent @@ -10,17 +10,18 @@ import androidx.annotation.RequiresApi import androidx.core.content.getSystemService import androidx.core.graphics.drawable.toAdaptiveIcon import androidx.core.graphics.drawable.toIcon -import com.topjohnwu.magisk.* +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.* +import com.topjohnwu.magisk.core.utils.Utils import com.topjohnwu.magisk.extensions.getBitmap -import com.topjohnwu.magisk.ui.SplashActivity -import com.topjohnwu.magisk.utils.Utils object Shortcuts { fun setup(context: Context) { if (Build.VERSION.SDK_INT >= 25) { val manager = context.getSystemService() - manager?.dynamicShortcuts = getShortCuts(context) + manager?.dynamicShortcuts = + getShortCuts(context) } } diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt index fd13b9ecb..c3ea56535 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/database/Repo.kt @@ -4,7 +4,7 @@ package com.topjohnwu.magisk.data.database import androidx.room.Dao import androidx.room.Query -import com.topjohnwu.magisk.model.entity.module.Repo +import com.topjohnwu.magisk.core.model.module.Repo interface RepoBase { @@ -64,4 +64,4 @@ interface RepoByNameDao : RepoBase { override fun searchRepos(query: String, offset: Int, limit: Int): List -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/RepoDao.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/RepoDao.kt index 3ed769366..05f5f53a4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/database/RepoDao.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/database/RepoDao.kt @@ -1,8 +1,8 @@ package com.topjohnwu.magisk.data.database import androidx.room.* -import com.topjohnwu.magisk.Config -import com.topjohnwu.magisk.model.entity.module.Repo +import com.topjohnwu.magisk.core.Config +import com.topjohnwu.magisk.core.model.module.Repo @Database(version = 6, entities = [Repo::class, RepoEtag::class]) abstract class RepoDatabase : RoomDatabase() { diff --git a/app/src/main/java/com/topjohnwu/magisk/data/network/GithubServices.kt b/app/src/main/java/com/topjohnwu/magisk/data/network/GithubServices.kt index 1a10b592f..c072648bb 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/network/GithubServices.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/network/GithubServices.kt @@ -1,8 +1,8 @@ package com.topjohnwu.magisk.data.network -import com.topjohnwu.magisk.Const -import com.topjohnwu.magisk.model.entity.UpdateInfo -import com.topjohnwu.magisk.tasks.GithubRepoInfo +import com.topjohnwu.magisk.core.Const +import com.topjohnwu.magisk.core.tasks.GithubRepoInfo +import com.topjohnwu.magisk.core.model.UpdateInfo import io.reactivex.Flowable import io.reactivex.Single import okhttp3.ResponseBody @@ -78,4 +78,4 @@ interface GithubApiServices { @Query("sort") sort: String = "pushed", @Query("per_page") count: Int = 100): Flowable>> -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/data/repository/DBConfig.kt b/app/src/main/java/com/topjohnwu/magisk/data/repository/DBConfig.kt index 0634ee1e6..a33bdde4b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/repository/DBConfig.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/repository/DBConfig.kt @@ -1,7 +1,7 @@ package com.topjohnwu.magisk.data.repository -import com.topjohnwu.magisk.data.database.SettingsDao -import com.topjohnwu.magisk.data.database.StringDao +import com.topjohnwu.magisk.core.magiskdb.SettingsDao +import com.topjohnwu.magisk.core.magiskdb.StringDao import io.reactivex.schedulers.Schedulers import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty diff --git a/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt b/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt index 7140c3094..86ce26a30 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt @@ -1,6 +1,6 @@ package com.topjohnwu.magisk.data.repository -import com.topjohnwu.magisk.Const +import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.data.database.SuLogDao import com.topjohnwu.magisk.model.entity.MagiskLog import com.topjohnwu.superuser.Shell diff --git a/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt b/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt index eb1d3c5d7..1a3a73c1a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt @@ -1,8 +1,8 @@ package com.topjohnwu.magisk.data.repository import android.content.pm.PackageManager -import com.topjohnwu.magisk.Config -import com.topjohnwu.magisk.Info +import com.topjohnwu.magisk.core.Info +import com.topjohnwu.magisk.core.Config import com.topjohnwu.magisk.data.network.GithubRawServices import com.topjohnwu.magisk.extensions.getLabel import com.topjohnwu.magisk.extensions.packageName @@ -24,7 +24,8 @@ class MagiskRepository( Config.Value.BETA_CHANNEL -> apiRaw.fetchBetaUpdate() Config.Value.CANARY_CHANNEL -> apiRaw.fetchCanaryUpdate() Config.Value.CANARY_DEBUG_CHANNEL -> apiRaw.fetchCanaryDebugUpdate() - Config.Value.CUSTOM_CHANNEL -> apiRaw.fetchCustomUpdate(Config.customChannelUrl) + Config.Value.CUSTOM_CHANNEL -> apiRaw.fetchCustomUpdate( + Config.customChannelUrl) else -> throw IllegalArgumentException() }.flatMap { // If remote version is lower than current installed, try switching to beta diff --git a/app/src/main/java/com/topjohnwu/magisk/data/repository/StringRepository.kt b/app/src/main/java/com/topjohnwu/magisk/data/repository/StringRepository.kt index 9395a06ea..74806db6c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/repository/StringRepository.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/repository/StringRepository.kt @@ -1,7 +1,7 @@ package com.topjohnwu.magisk.data.repository +import com.topjohnwu.magisk.core.model.module.Repo import com.topjohnwu.magisk.data.network.GithubRawServices -import com.topjohnwu.magisk.model.entity.module.Repo class StringRepository( private val api: GithubRawServices @@ -12,4 +12,4 @@ class StringRepository( fun getMetadata(repo: Repo) = api.fetchModuleInfo(repo.id, "module.prop") fun getReadme(repo: Repo) = api.fetchModuleInfo(repo.id, "README.md") -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/di/DatabaseModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/DatabaseModule.kt index 9105dd274..0c1d1d9f1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/DatabaseModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/DatabaseModule.kt @@ -2,8 +2,12 @@ package com.topjohnwu.magisk.di import android.content.Context import androidx.room.Room -import com.topjohnwu.magisk.data.database.* -import com.topjohnwu.magisk.tasks.RepoUpdater +import com.topjohnwu.magisk.core.magiskdb.PolicyDao +import com.topjohnwu.magisk.core.magiskdb.SettingsDao +import com.topjohnwu.magisk.core.magiskdb.StringDao +import com.topjohnwu.magisk.core.tasks.RepoUpdater +import com.topjohnwu.magisk.data.database.RepoDatabase +import com.topjohnwu.magisk.data.database.SuLogDatabase import org.koin.dsl.module diff --git a/app/src/main/java/com/topjohnwu/magisk/di/NetworkingModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/NetworkingModule.kt index 73db91cb9..7ae909000 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/NetworkingModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/NetworkingModule.kt @@ -4,7 +4,7 @@ import android.content.Context import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi import com.topjohnwu.magisk.BuildConfig -import com.topjohnwu.magisk.Const +import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.data.network.GithubApiServices import com.topjohnwu.magisk.data.network.GithubRawServices import com.topjohnwu.magisk.net.Networking diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/XAndroid.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/XAndroid.kt index 78134410a..995405bd1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/XAndroid.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/XAndroid.kt @@ -28,11 +28,11 @@ import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.ContextCompat import androidx.core.net.toFile import androidx.core.net.toUri -import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.FileProvider +import com.topjohnwu.magisk.core.Const +import com.topjohnwu.magisk.core.utils.currentLocale import com.topjohnwu.magisk.utils.DynamicClassLoader -import com.topjohnwu.magisk.utils.Utils -import com.topjohnwu.magisk.utils.currentLocale +import com.topjohnwu.magisk.core.utils.Utils import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.ShellUtils import java.io.File @@ -317,7 +317,9 @@ fun Context.hasPermissions(vararg permissions: String) = permissions.all { ContextCompat.checkSelfPermission(this, it) == PERMISSION_GRANTED } -private val securityLevelFormatter get() = SimpleDateFormat("yyyy-MM-dd", currentLocale) +private val securityLevelFormatter get() = SimpleDateFormat("yyyy-MM-dd", + currentLocale +) /** Friendly reminder to seek newer roms or install oem updates. */ val isDeviceSecure: Boolean diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/XSU.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/XSU.kt index 1e5aef1d9..fa93fa1bf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/XSU.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/XSU.kt @@ -1,6 +1,6 @@ package com.topjohnwu.magisk.extensions -import com.topjohnwu.magisk.Info +import com.topjohnwu.magisk.core.Info import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.io.SuFileInputStream import com.topjohnwu.superuser.io.SuFileOutputStream @@ -13,4 +13,4 @@ fun reboot(reason: String = if (Info.recovery) "recovery" else "") { fun File.suOutputStream() = SuFileOutputStream(this) fun File.suInputStream() = SuFileInputStream(this) -val hasRoot get() = Shell.rootAccess() \ No newline at end of file +val hasRoot get() = Shell.rootAccess() diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/XTime.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/XTime.kt index ce822d5f2..7b513cbed 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/XTime.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/XTime.kt @@ -1,6 +1,6 @@ package com.topjohnwu.magisk.extensions -import com.topjohnwu.magisk.utils.currentLocale +import com.topjohnwu.magisk.core.utils.currentLocale import java.text.DateFormat import java.text.ParseException import java.text.SimpleDateFormat @@ -14,10 +14,18 @@ fun String.toTime(format: DateFormat) = try { -1L } -val timeFormatFull by lazy { SimpleDateFormat("yyyy/MM/dd_HH:mm:ss", currentLocale) } -val timeFormatStandard by lazy { SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", currentLocale) } -val timeFormatMedium by lazy { DateFormat.getDateInstance(DateFormat.MEDIUM, currentLocale) } -val timeFormatTime by lazy { SimpleDateFormat("h:mm a", currentLocale) } +val timeFormatFull by lazy { SimpleDateFormat("yyyy/MM/dd_HH:mm:ss", + currentLocale +) } +val timeFormatStandard by lazy { SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", + currentLocale +) } +val timeFormatMedium by lazy { DateFormat.getDateInstance(DateFormat.MEDIUM, + currentLocale +) } +val timeFormatTime by lazy { SimpleDateFormat("h:mm a", + currentLocale +) } val timeDateFormat by lazy { DateFormat.getDateTimeInstance( DateFormat.DEFAULT, diff --git a/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashActivity.kt b/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashActivity.kt index 6e2761636..e41dadbaf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashActivity.kt @@ -6,22 +6,22 @@ import android.content.pm.ActivityInfo import android.net.Uri import android.os.Bundle import androidx.core.net.toUri -import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.BaseActivity +import com.topjohnwu.magisk.core.Const +import com.topjohnwu.magisk.core.intent import com.topjohnwu.magisk.databinding.ActivityFlashBinding import com.topjohnwu.magisk.extensions.snackbar -import com.topjohnwu.magisk.intent import com.topjohnwu.magisk.model.events.BackPressEvent import com.topjohnwu.magisk.model.events.PermissionEvent import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.model.events.ViewEvent -import com.topjohnwu.magisk.view.Notifications +import com.topjohnwu.magisk.ui.base.BaseUIActivity +import com.topjohnwu.magisk.core.view.Notifications import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf import java.io.File -open class FlashActivity : BaseActivity() { +open class FlashActivity : BaseUIActivity() { override val layoutRes: Int = R.layout.activity_flash override val themeRes: Int = R.style.MagiskTheme_Flashing diff --git a/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashViewModel.kt index b39654507..1c16b4751 100644 --- a/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashViewModel.kt @@ -8,10 +8,9 @@ import android.os.Handler import androidx.core.os.postDelayed import androidx.databinding.ObservableArrayList import com.topjohnwu.magisk.BR -import com.topjohnwu.magisk.Config -import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.BaseViewModel +import com.topjohnwu.magisk.core.Config +import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.* import com.topjohnwu.magisk.model.entity.recycler.ConsoleRvItem @@ -19,6 +18,7 @@ import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.model.flash.FlashResultListener import com.topjohnwu.magisk.model.flash.Flashing import com.topjohnwu.magisk.model.flash.Patching +import com.topjohnwu.magisk.ui.base.BaseViewModel import com.topjohnwu.magisk.utils.DiffObservableList import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.superuser.Shell diff --git a/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestActivity.kt b/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestActivity.kt index df7542c68..337d26fe3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestActivity.kt @@ -6,16 +6,16 @@ import android.os.Build import android.os.Bundle import android.view.Window import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.BaseActivity +import com.topjohnwu.magisk.core.su.SuCallbackHandler +import com.topjohnwu.magisk.core.su.SuCallbackHandler.REQUEST import com.topjohnwu.magisk.databinding.ActivityRequestBinding import com.topjohnwu.magisk.model.events.DieEvent import com.topjohnwu.magisk.model.events.ViewActionEvent import com.topjohnwu.magisk.model.events.ViewEvent -import com.topjohnwu.magisk.utils.SuHandler -import com.topjohnwu.magisk.utils.SuHandler.REQUEST +import com.topjohnwu.magisk.ui.base.BaseUIActivity import org.koin.androidx.viewmodel.ext.android.viewModel -open class SuRequestActivity : BaseActivity() { +open class SuRequestActivity : BaseUIActivity() { override val layoutRes: Int = R.layout.activity_request override val themeRes: Int = R.style.MagiskTheme_SU @@ -36,7 +36,11 @@ open class SuRequestActivity : BaseActivity(null) val title = KObservableField("") val packageName = KObservableField("") - val denyText = KObservableField(resources.getString(R.string.deny)) - val warningText = KObservableField(resources.getString(R.string.su_warning)) + val denyText = KObservableField(res.getString(R.string.deny)) + val warningText = KObservableField(res.getString(R.string.su_warning)) val selectedItemPosition = KObservableField(0) @@ -54,130 +49,74 @@ class SuRequestViewModel( setItems(items) } - private val cancelTasks = mutableListOf<() -> Unit>() - - private lateinit var timer: CountDownTimer - private lateinit var policy: MagiskPolicy - private lateinit var connector: SuConnector - - private fun cancelTimer() { - timer.cancel() - denyText.value = resources.getString(R.string.deny) - } + private val handler = Handler() fun grantPressed() { - cancelTimer() + handler.cancelTimer() if (BiometricHelper.isEnabled) { withView { BiometricHelper.authenticate(this) { - handleAction(MagiskPolicy.ALLOW) + handler.respond(ALLOW) } } } else { - handleAction(MagiskPolicy.ALLOW) + handler.respond(ALLOW) } } fun denyPressed() { - handleAction(MagiskPolicy.DENY) - timer.cancel() + handler.respond(DENY) } fun spinnerTouched(): Boolean { - cancelTimer() + handler.cancelTimer() return false } fun handleRequest(intent: Intent): Boolean { - val socketName = intent.getStringExtra("socket") ?: return false + return handler.start(intent) + } - try { - connector = Connector(socketName) - val map = connector.readRequest() - val uid = map["uid"]?.toIntOrNull() ?: return false - policy = uid.toPolicy(packageManager) - } catch (e: Exception) { - Timber.e(e) - return false + private inner class Handler : SuRequestHandler(pm, policyDB) { + + fun respond(action: Int) { + val pos = selectedItemPosition.value + timeoutPrefs.edit().putInt(policy.packageName, pos).apply() + respond(action, Config.Value.TIMEOUT_LIST[pos]) } - // Never allow com.topjohnwu.magisk (could be malware) - if (policy.packageName == BuildConfig.APPLICATION_ID) - return false + fun cancelTimer() { + timer.cancel() + denyText.value = res.getString(R.string.deny) + } - when (Config.suAutoReponse) { - Config.Value.SU_AUTO_DENY -> { - handleAction(MagiskPolicy.DENY, 0) - return true - } - Config.Value.SU_AUTO_ALLOW -> { - handleAction(MagiskPolicy.ALLOW, 0) - return true + override fun onStart() { + res.getStringArray(R.array.allow_timeout) + .map { SpinnerRvItem(it) } + .let { items.update(it) } + + icon.value = policy.applicationInfo.loadIcon(pm) + title.value = policy.appName + packageName.value = policy.packageName + selectedItemPosition.value = timeoutPrefs.getInt(policy.packageName, 0) + + // Override timer + val millis = SECONDS.toMillis(Config.suDefaultTimeout.toLong()) + timer = object : CountDownTimer(millis, 1000) { + override fun onTick(remains: Long) { + denyText.value = "${res.getString(R.string.deny)} (${remains / 1000})" + } + + override fun onFinish() { + denyText.value = res.getString(R.string.deny) + respond(DENY) + } } } - showUI() - return true - } - - private fun showUI() { - resources.getStringArray(R.array.allow_timeout) - .map { SpinnerRvItem(it) } - .let { items.update(it) } - - icon.value = policy.applicationInfo.loadIcon(packageManager) - title.value = policy.appName - packageName.value = policy.packageName - selectedItemPosition.value = timeoutPrefs.getInt(policy.packageName, 0) - - val millis = SECONDS.toMillis(Config.suDefaultTimeout.toLong()) - timer = object : CountDownTimer(millis, 1000) { - override fun onTick(remains: Long) { - denyText.value = "${resources.getString(R.string.deny)} (${remains / 1000})" - } - - override fun onFinish() { - denyText.value = resources.getString(R.string.deny) - handleAction(MagiskPolicy.DENY) - } - } - timer.start() - cancelTasks.add { cancelTimer() } - } - - private fun handleAction() { - connector.response() - cancelTasks.forEach { it() } - DieEvent().publish() - } - - private fun handleAction(action: Int) { - val pos = selectedItemPosition.value - timeoutPrefs.edit().putInt(policy.packageName, pos).apply() - handleAction(action, Config.Value.TIMEOUT_LIST[pos]) - } - - private fun handleAction(action: Int, time: Int) { - val until = if (time > 0) - MILLISECONDS.toSeconds(now) + MINUTES.toSeconds(time.toLong()) - else - time.toLong() - - policy.policy = action - policy.until = until - policy.uid = policy.uid % 100000 + Const.USER_ID * 100000 - - if (until >= 0) - policyDB.update(policy).blockingAwait() - - handleAction() - } - - private inner class Connector @Throws(Exception::class) - internal constructor(name: String) : SuConnector(name) { - @Throws(IOException::class) - override fun onResponse() { - out.writeInt(policy.policy) + override fun onRespond() { + // Kill activity after response + DieEvent().publish() } } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/MagiskLog.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/MagiskLog.kt index fd72d8869..6eea78783 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/MagiskLog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/MagiskLog.kt @@ -3,10 +3,11 @@ package com.topjohnwu.magisk.model.entity import androidx.room.Entity import androidx.room.Ignore import androidx.room.PrimaryKey +import com.topjohnwu.magisk.core.model.MagiskPolicy +import com.topjohnwu.magisk.core.model.MagiskPolicy.Companion.ALLOW import com.topjohnwu.magisk.extensions.now import com.topjohnwu.magisk.extensions.timeFormatTime import com.topjohnwu.magisk.extensions.toTime -import com.topjohnwu.magisk.model.entity.MagiskPolicy.Companion.ALLOW @Entity(tableName = "logs") data class MagiskLog( @@ -23,11 +24,6 @@ data class MagiskLog( @Ignore val timeString = time.toTime(timeFormatTime) } -data class WrappedMagiskLog( - val time: Long, - val items: List -) - fun MagiskPolicy.toLog( toUid: Int, fromPid: Int, diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/internal/DownloadSubject.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/internal/DownloadSubject.kt index 401253120..fb83bc3be 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/internal/DownloadSubject.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/internal/DownloadSubject.kt @@ -2,13 +2,13 @@ package com.topjohnwu.magisk.model.entity.internal import android.content.Context import android.os.Parcelable -import com.topjohnwu.magisk.Config -import com.topjohnwu.magisk.Info +import com.topjohnwu.magisk.core.Info +import com.topjohnwu.magisk.core.Config +import com.topjohnwu.magisk.core.model.module.Repo import com.topjohnwu.magisk.extensions.cachedFile import com.topjohnwu.magisk.extensions.get -import com.topjohnwu.magisk.model.entity.MagiskJson -import com.topjohnwu.magisk.model.entity.ManagerJson -import com.topjohnwu.magisk.model.entity.module.Repo +import com.topjohnwu.magisk.core.model.MagiskJson +import com.topjohnwu.magisk.core.model.ManagerJson import kotlinx.android.parcel.IgnoredOnParcel import kotlinx.android.parcel.Parcelize import java.io.File @@ -103,4 +103,4 @@ sealed class DownloadSubject : Parcelable { } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt index 885499c33..1281eb0f6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt @@ -1,7 +1,7 @@ package com.topjohnwu.magisk.model.entity.recycler -import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.databinding.ComparableRvItem sealed class HomeItem : ComparableRvItem() { diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt index bf35d15e4..c47dc3ae0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt @@ -7,9 +7,9 @@ import androidx.databinding.ViewDataBinding import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.model.module.Module +import com.topjohnwu.magisk.core.model.module.Repo import com.topjohnwu.magisk.databinding.ComparableRvItem -import com.topjohnwu.magisk.model.entity.module.Module -import com.topjohnwu.magisk.model.entity.module.Repo import com.topjohnwu.magisk.ui.module.ModuleViewModel import com.topjohnwu.magisk.utils.KObservableField diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt index 910c67b3d..1929549c4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt @@ -2,9 +2,9 @@ package com.topjohnwu.magisk.model.entity.recycler import android.graphics.drawable.Drawable import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.model.MagiskPolicy import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.toggle -import com.topjohnwu.magisk.model.entity.MagiskPolicy import com.topjohnwu.magisk.model.events.PolicyUpdateEvent import com.topjohnwu.magisk.ui.superuser.SuperuserViewModel import com.topjohnwu.magisk.utils.KObservableField diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/EventExecutors.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/EventExecutors.kt index a1e3c2e8e..8655aae47 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/EventExecutors.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/EventExecutors.kt @@ -2,7 +2,7 @@ package com.topjohnwu.magisk.model.events import android.content.Context import androidx.fragment.app.Fragment -import com.topjohnwu.magisk.base.BaseActivity +import com.topjohnwu.magisk.core.base.BaseActivity interface ContextExecutor { @@ -12,7 +12,7 @@ interface ContextExecutor { interface ActivityExecutor { - operator fun invoke(activity: BaseActivity<*, *>) + operator fun invoke(activity: BaseActivity) } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt index 1e891912f..308ac927d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt @@ -3,14 +3,14 @@ package com.topjohnwu.magisk.model.events import android.app.Activity import android.content.Context import android.content.Intent -import com.topjohnwu.magisk.Const -import com.topjohnwu.magisk.base.BaseActivity -import com.topjohnwu.magisk.intent +import com.topjohnwu.magisk.core.Const +import com.topjohnwu.magisk.core.base.BaseActivity +import com.topjohnwu.magisk.core.intent import com.topjohnwu.magisk.legacy.flash.FlashActivity class InstallExternalModuleEvent : ViewEvent(), ActivityExecutor { - override fun invoke(activity: BaseActivity<*, *>) { + override fun invoke(activity: BaseActivity) { activity.withExternalRW { onSuccess { val intent = Intent(Intent.ACTION_GET_CONTENT) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/RxEvents.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/RxEvents.kt index 2e67b8c35..fd9081a90 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/RxEvents.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/RxEvents.kt @@ -1,6 +1,6 @@ package com.topjohnwu.magisk.model.events -import com.topjohnwu.magisk.model.entity.MagiskPolicy +import com.topjohnwu.magisk.core.model.MagiskPolicy import com.topjohnwu.magisk.utils.RxBus sealed class PolicyUpdateEvent(val item: MagiskPolicy) : RxBus.Event { diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/SnackbarEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/SnackbarEvent.kt index 4bf757aa3..73b57e1ee 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/SnackbarEvent.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/SnackbarEvent.kt @@ -3,8 +3,9 @@ package com.topjohnwu.magisk.model.events import android.content.Context import androidx.annotation.StringRes import com.google.android.material.snackbar.Snackbar -import com.topjohnwu.magisk.base.BaseActivity +import com.topjohnwu.magisk.core.base.BaseActivity import com.topjohnwu.magisk.extensions.snackbar +import com.topjohnwu.magisk.ui.base.BaseUIActivity class SnackbarEvent private constructor( @StringRes private val messageRes: Int, @@ -27,8 +28,8 @@ class SnackbarEvent private constructor( fun message(context: Context): String = messageString ?: context.getString(messageRes) - override fun invoke(activity: BaseActivity<*, *>) { - if (activity is BaseActivity<*, *>) { + override fun invoke(activity: BaseActivity) { + if (activity is BaseUIActivity<*, *>) { activity.snackbar(activity.snackbarView, message(activity), length, f) } } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt index dbe9caf11..173746fcf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt @@ -3,16 +3,16 @@ package com.topjohnwu.magisk.model.events import android.app.Activity import android.content.Context import android.content.Intent -import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.BaseActivity +import com.topjohnwu.magisk.core.Const +import com.topjohnwu.magisk.core.base.BaseActivity +import com.topjohnwu.magisk.core.model.module.Repo import com.topjohnwu.magisk.data.repository.MagiskRepository import com.topjohnwu.magisk.extensions.DynamicClassLoader import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.extensions.writeTo -import com.topjohnwu.magisk.model.entity.module.Repo import com.topjohnwu.magisk.utils.RxBus -import com.topjohnwu.magisk.utils.SafetyNetHelper +import com.topjohnwu.magisk.core.utils.SafetyNetHelper import com.topjohnwu.magisk.view.MagiskDialog import com.topjohnwu.magisk.view.MarkDownWindow import com.topjohnwu.superuser.Shell @@ -118,8 +118,8 @@ class UpdateSafetyNetEvent : ViewEvent(), ContextExecutor, KoinComponent, Safety } } -class ViewActionEvent(val action: BaseActivity<*, *>.() -> Unit) : ViewEvent(), ActivityExecutor { - override fun invoke(activity: BaseActivity<*, *>) = activity.run(action) +class ViewActionEvent(val action: BaseActivity.() -> Unit) : ViewEvent(), ActivityExecutor { + override fun invoke(activity: BaseActivity) = activity.run(action) } class OpenChangelogEvent(val item: Repo) : ViewEvent(), ContextExecutor { @@ -133,7 +133,7 @@ class PermissionEvent( val callback: PublishSubject ) : ViewEvent(), ActivityExecutor { - override fun invoke(activity: BaseActivity<*, *>) = + override fun invoke(activity: BaseActivity) = activity.withPermissions(*permissions.toTypedArray()) { onSuccess { callback.onNext(true) @@ -146,25 +146,25 @@ class PermissionEvent( } class BackPressEvent : ViewEvent(), ActivityExecutor { - override fun invoke(activity: BaseActivity<*, *>) { + override fun invoke(activity: BaseActivity) { activity.onBackPressed() } } class DieEvent : ViewEvent(), ActivityExecutor { - override fun invoke(activity: BaseActivity<*, *>) { + override fun invoke(activity: BaseActivity) { activity.finish() } } class RecreateEvent : ViewEvent(), ActivityExecutor { - override fun invoke(activity: BaseActivity<*, *>) { + override fun invoke(activity: BaseActivity) { activity.recreate() } } class RequestFileEvent : ViewEvent(), ActivityExecutor { - override fun invoke(activity: BaseActivity<*, *>) { + override fun invoke(activity: BaseActivity) { Intent(Intent.ACTION_GET_CONTENT) .setType("*/*") .addCategory(Intent.CATEGORY_OPENABLE) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt index 5d2258686..db74ef997 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/BiometricDialog.kt @@ -1,9 +1,9 @@ package com.topjohnwu.magisk.model.events.dialog -import com.topjohnwu.magisk.base.BaseActivity +import com.topjohnwu.magisk.core.base.BaseActivity import com.topjohnwu.magisk.model.events.ActivityExecutor import com.topjohnwu.magisk.model.events.ViewEvent -import com.topjohnwu.magisk.utils.BiometricHelper +import com.topjohnwu.magisk.core.utils.BiometricHelper class BiometricDialog( builder: Builder.() -> Unit @@ -16,7 +16,7 @@ class BiometricDialog( builder(Builder()) } - override fun invoke(activity: BaseActivity<*, *>) { + override fun invoke(activity: BaseActivity) { BiometricHelper.authenticate( activity, onError = listenerOnFailure, diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DarkThemeDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DarkThemeDialog.kt index 68e8d0780..4244fdac2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DarkThemeDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/DarkThemeDialog.kt @@ -2,9 +2,9 @@ package com.topjohnwu.magisk.model.events.dialog import android.app.Activity import androidx.appcompat.app.AppCompatDelegate -import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.BaseActivity +import com.topjohnwu.magisk.core.Config +import com.topjohnwu.magisk.core.base.BaseActivity import com.topjohnwu.magisk.model.events.ActivityExecutor import com.topjohnwu.magisk.view.MagiskDialog import java.lang.ref.WeakReference @@ -13,7 +13,7 @@ class DarkThemeDialog : DialogEvent(), ActivityExecutor { private var activity: WeakReference? = null - override fun invoke(activity: BaseActivity<*, *>) { + override fun invoke(activity: BaseActivity) { this.activity = WeakReference(activity) } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/EnvFixDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/EnvFixDialog.kt index 6ea2b5aaf..8571b6518 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/EnvFixDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/EnvFixDialog.kt @@ -1,24 +1,14 @@ package com.topjohnwu.magisk.model.events.dialog -import android.content.Context import android.content.DialogInterface import android.widget.Toast -import androidx.core.net.toUri -import com.topjohnwu.magisk.Info import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.extensions.cachedFile +import com.topjohnwu.magisk.core.tasks.MagiskInstaller import com.topjohnwu.magisk.extensions.reboot -import com.topjohnwu.magisk.net.Networking -import com.topjohnwu.magisk.tasks.MagiskInstaller -import com.topjohnwu.magisk.utils.Utils +import com.topjohnwu.magisk.core.utils.Utils import com.topjohnwu.magisk.view.MagiskDialog -import com.topjohnwu.superuser.Shell -import com.topjohnwu.superuser.ShellUtils import com.topjohnwu.superuser.internal.UiThreadHandler -import com.topjohnwu.superuser.io.SuFile import org.koin.core.KoinComponent -import org.koin.core.get -import java.io.File class EnvFixDialog : DialogEvent() { @@ -48,19 +38,7 @@ class EnvFixDialog : DialogEvent() { private fun fixEnv(dialog: DialogInterface) { object : MagiskInstaller(), KoinComponent { - override fun operations(): Boolean { - val context = get() - val zip: File = context.cachedFile("magisk.zip") - - installDir = SuFile("/data/adb/magisk") - Shell.su("rm -rf /data/adb/magisk/*").exec() - - if (!ShellUtils.checkSum("MD5", zip, Info.remote.magisk.md5)) - Networking.get(Info.remote.magisk.link).execForFile(zip) - - zipUri = zip.toUri() - return extractZip() && Shell.su("fix_env").exec().isSuccess - } + override fun operations() = fixEnv() override fun onResult(success: Boolean) { dialog.dismiss() @@ -74,4 +52,4 @@ class EnvFixDialog : DialogEvent() { }.exec() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt index 87522ee98..25d29ab9b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt @@ -4,16 +4,16 @@ import android.Manifest import android.net.Uri import android.view.LayoutInflater import android.widget.Toast -import com.topjohnwu.magisk.Info +import com.topjohnwu.magisk.core.Info import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.download.DownloadService import com.topjohnwu.magisk.databinding.IncludeInstallOptionsBinding import com.topjohnwu.magisk.extensions.hasPermissions import com.topjohnwu.magisk.extensions.res -import com.topjohnwu.magisk.model.download.DownloadService import com.topjohnwu.magisk.model.entity.internal.Configuration import com.topjohnwu.magisk.model.entity.internal.DownloadSubject import com.topjohnwu.magisk.model.events.OpenInappLinkEvent -import com.topjohnwu.magisk.utils.Utils +import com.topjohnwu.magisk.core.utils.Utils import com.topjohnwu.magisk.view.MagiskDialog import com.topjohnwu.magisk.view.MarkDownWindow import com.topjohnwu.superuser.Shell @@ -128,4 +128,4 @@ class MagiskInstallDialog : DialogEvent() { .fastCmd("grep_prop ro.build.ab_update") .let { it.isNotEmpty() && it.toBoolean() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ManagerInstallDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ManagerInstallDialog.kt index 1eb563602..f1822773a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ManagerInstallDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ManagerInstallDialog.kt @@ -1,9 +1,9 @@ package com.topjohnwu.magisk.model.events.dialog -import com.topjohnwu.magisk.Info +import com.topjohnwu.magisk.core.Info import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.download.DownloadService import com.topjohnwu.magisk.extensions.res -import com.topjohnwu.magisk.model.download.DownloadService import com.topjohnwu.magisk.model.entity.internal.Configuration import com.topjohnwu.magisk.model.entity.internal.DownloadSubject import com.topjohnwu.magisk.view.MagiskDialog @@ -33,4 +33,4 @@ class ManagerInstallDialog : DialogEvent() { } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ModuleInstallDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ModuleInstallDialog.kt index 592e8d089..f27499251 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ModuleInstallDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/ModuleInstallDialog.kt @@ -1,10 +1,10 @@ package com.topjohnwu.magisk.model.events.dialog import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.model.download.DownloadService +import com.topjohnwu.magisk.core.download.DownloadService +import com.topjohnwu.magisk.core.model.module.Repo import com.topjohnwu.magisk.model.entity.internal.Configuration import com.topjohnwu.magisk.model.entity.internal.DownloadSubject -import com.topjohnwu.magisk.model.entity.module.Repo import com.topjohnwu.magisk.view.MagiskDialog class ModuleInstallDialog(private val item: Repo) : DialogEvent() { @@ -34,4 +34,4 @@ class ModuleInstallDialog(private val item: Repo) : DialogEvent() { } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/UninstallDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/UninstallDialog.kt index 7aecaaa51..bdeb0b838 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/UninstallDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/UninstallDialog.kt @@ -1,12 +1,12 @@ package com.topjohnwu.magisk.model.events.dialog import android.widget.Toast -import com.topjohnwu.magisk.Info +import com.topjohnwu.magisk.core.Info import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.model.download.DownloadService +import com.topjohnwu.magisk.core.download.DownloadService import com.topjohnwu.magisk.model.entity.internal.Configuration import com.topjohnwu.magisk.model.entity.internal.DownloadSubject -import com.topjohnwu.magisk.utils.Utils +import com.topjohnwu.magisk.core.utils.Utils import com.topjohnwu.magisk.view.MagiskDialog import com.topjohnwu.superuser.Shell @@ -52,4 +52,4 @@ class UninstallDialog : DialogEvent() { } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/flash/Flashing.kt b/app/src/main/java/com/topjohnwu/magisk/model/flash/Flashing.kt index 046ae6906..21e4672d6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/flash/Flashing.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/flash/Flashing.kt @@ -3,8 +3,8 @@ package com.topjohnwu.magisk.model.flash import android.content.Context import android.net.Uri import androidx.core.os.postDelayed +import com.topjohnwu.magisk.core.tasks.FlashZip import com.topjohnwu.magisk.extensions.inject -import com.topjohnwu.magisk.tasks.FlashZip import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.internal.UiThreadHandler @@ -58,4 +58,4 @@ sealed class Flashing( } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/flash/Patching.kt b/app/src/main/java/com/topjohnwu/magisk/model/flash/Patching.kt index cb63165f5..b3693706b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/flash/Patching.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/flash/Patching.kt @@ -1,7 +1,7 @@ package com.topjohnwu.magisk.model.flash import android.net.Uri -import com.topjohnwu.magisk.tasks.MagiskInstaller +import com.topjohnwu.magisk.core.tasks.MagiskInstaller import com.topjohnwu.superuser.Shell sealed class Patching( @@ -28,8 +28,7 @@ sealed class Patching( logs: MutableList, resultListener: FlashResultListener ) : Patching(file, console, logs, resultListener) { - override fun operations() = - extractZip() && handleFile(uri) && patchBoot() && storeBoot() + override fun operations() = doPatchFile(uri) } class SecondSlot( @@ -38,8 +37,7 @@ sealed class Patching( logs: MutableList, resultListener: FlashResultListener ) : Patching(file, console, logs, resultListener) { - override fun operations() = - findSecondaryImage() && extractZip() && patchBoot() && flashBoot() && postOTA() + override fun operations() = secondSlot() } class Direct( @@ -48,8 +46,7 @@ sealed class Patching( logs: MutableList, resultListener: FlashResultListener ) : Patching(file, console, logs, resultListener) { - override fun operations() = - findImage() && extractZip() && patchBoot() && flashBoot() + override fun operations() = direct() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt index 9dea56b0d..ff2be32e5 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt @@ -4,10 +4,10 @@ import android.os.Bundle import androidx.annotation.AnimRes import androidx.annotation.AnimatorRes import androidx.fragment.app.Fragment -import com.topjohnwu.magisk.base.BaseActivity +import com.topjohnwu.magisk.core.base.BaseActivity import com.topjohnwu.magisk.model.events.ActivityExecutor import com.topjohnwu.magisk.model.events.ViewEvent -import com.topjohnwu.magisk.ui.compat.CompatActivity +import com.topjohnwu.magisk.ui.base.CompatActivity import kotlin.reflect.KClass @DslMarker @@ -23,7 +23,7 @@ class MagiskNavigationEvent( operator fun invoke(builder: Builder.() -> Unit) = Builder().apply(builder).build() } - override fun invoke(activity: BaseActivity<*, *>) { + override fun invoke(activity: BaseActivity) { if (activity !is CompatActivity<*, *>) return activity.navigation?.navigateTo(this) } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt index 69cd99127..12ebe4d7e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt @@ -3,8 +3,8 @@ package com.topjohnwu.magisk.model.navigation import android.content.Context import android.content.Intent import android.os.Build -import com.topjohnwu.magisk.Const -import com.topjohnwu.magisk.intent +import com.topjohnwu.magisk.core.Const +import com.topjohnwu.magisk.core.intent import com.topjohnwu.magisk.ui.MainActivity import com.topjohnwu.magisk.ui.hide.HideFragment import com.topjohnwu.magisk.ui.home.HomeFragment @@ -82,7 +82,9 @@ object Navigation { fun start(launchIntent: Intent, context: Context) { context.intent() - .putExtra(Const.Key.OPEN_SECTION, launchIntent.getStringExtra(Const.Key.OPEN_SECTION)) + .putExtra( + Const.Key.OPEN_SECTION, launchIntent.getStringExtra( + Const.Key.OPEN_SECTION)) .putExtra( Const.Key.OPEN_SETTINGS, launchIntent.action == ACTION_APPLICATION_PREFERENCES diff --git a/app/src/main/java/com/topjohnwu/magisk/model/zip/Zip.kt b/app/src/main/java/com/topjohnwu/magisk/model/zip/Zip.kt deleted file mode 100644 index fc118b493..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/model/zip/Zip.kt +++ /dev/null @@ -1,75 +0,0 @@ -package com.topjohnwu.magisk.model.zip - -import com.topjohnwu.magisk.extensions.forEach -import com.topjohnwu.magisk.extensions.withStreams -import com.topjohnwu.superuser.io.SuFile -import java.io.File -import java.util.zip.ZipInputStream - - -class Zip private constructor(private val values: Builder) { - - companion object { - operator fun invoke(builder: Builder.() -> Unit): Zip { - return Zip(Builder().apply(builder)) - } - } - - class Builder { - lateinit var zip: File - lateinit var destination: File - var excludeDirs = true - } - - data class Path(val path: String, val pullFromDir: Boolean = true) - - fun unzip(vararg paths: Pair) = - unzip(*paths.map { Path(it.first, it.second) }.toTypedArray()) - - @Suppress("RedundantLambdaArrow") - fun unzip(vararg paths: Path) { - ensureRequiredParams() - - values.zip.zipStream().use { - it.forEach { e -> - val currentPath = paths.firstOrNull { e.name.startsWith(it.path) } - val isDirectory = values.excludeDirs && e.isDirectory - if (currentPath == null || isDirectory) { - // Ignore directories, only create files - return@forEach - } - - val name = if (currentPath.pullFromDir) { - e.name.substring(e.name.lastIndexOf('/') + 1) - } else { - e.name - } - - val out = File(values.destination, name) - .ensureExists() - .outputStream() - //.suOutputStream() - - withStreams(it, out) { reader, writer -> - reader.copyTo(writer) - } - } - } - } - - private fun ensureRequiredParams() { - if (!values.zip.exists()) { - throw RuntimeException("Zip file does not exist") - } - } - - private fun File.ensureExists() = - if ((!parentFile.exists() && !parentFile.mkdirs()) || parentFile is SuFile) { - SuFile(parentFile, name).apply { parentFile.mkdirs() } - } else { - this - } - - private fun File.zipStream() = ZipInputStream(inputStream()) - -} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt index 9f54ffcd9..6466b9aa0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt @@ -12,13 +12,13 @@ import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment import com.google.android.material.card.MaterialCardView import com.ncapdevi.fragnav.FragNavController -import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.databinding.ActivityMainMd2Binding import com.topjohnwu.magisk.extensions.startAnimations import com.topjohnwu.magisk.model.navigation.Navigation -import com.topjohnwu.magisk.ui.compat.CompatActivity -import com.topjohnwu.magisk.ui.compat.CompatNavigationDelegate +import com.topjohnwu.magisk.ui.base.CompatActivity +import com.topjohnwu.magisk.ui.base.CompatNavigationDelegate import com.topjohnwu.magisk.ui.home.HomeFragment import com.topjohnwu.magisk.ui.module.ModuleFragment import com.topjohnwu.magisk.ui.superuser.SuperuserFragment diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt index 831449270..5451829da 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt @@ -1,5 +1,5 @@ package com.topjohnwu.magisk.ui -import com.topjohnwu.magisk.base.BaseViewModel +import com.topjohnwu.magisk.ui.base.BaseViewModel class MainViewModel : BaseViewModel() diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseUIActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseUIActivity.kt new file mode 100644 index 000000000..45a251626 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseUIActivity.kt @@ -0,0 +1,39 @@ +package com.topjohnwu.magisk.ui.base + +import android.os.Bundle +import androidx.appcompat.app.AppCompatDelegate +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding +import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.Config +import com.topjohnwu.magisk.core.base.BaseActivity +import com.topjohnwu.magisk.model.events.EventHandler + +abstract class BaseUIActivity : + BaseActivity(), EventHandler { + + protected lateinit var binding: Binding + protected abstract val layoutRes: Int + protected abstract val viewModel: ViewModel + protected open val themeRes: Int = R.style.MagiskTheme + + open val snackbarView get() = binding.root + + init { + val theme = Config.darkThemeExtended + AppCompatDelegate.setDefaultNightMode(theme) + } + + override fun onCreate(savedInstanceState: Bundle?) { + setTheme(themeRes) + super.onCreate(savedInstanceState) + + viewModel.viewEvents.observe(this, viewEventObserver) + + binding = DataBindingUtil.setContentView(this, layoutRes).apply { + setVariable(BR.viewModel, viewModel) + lifecycleOwner = this@BaseUIActivity + } + } +} diff --git a/app/src/main/java/com/topjohnwu/magisk/base/BaseFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseUIFragment.kt similarity index 83% rename from app/src/main/java/com/topjohnwu/magisk/base/BaseFragment.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/base/BaseUIFragment.kt index cd275e8ff..b3ab722f9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/base/BaseFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseUIFragment.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.base +package com.topjohnwu.magisk.ui.base import android.os.Bundle import android.view.LayoutInflater @@ -11,10 +11,10 @@ import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.model.events.EventHandler import com.topjohnwu.magisk.model.events.ViewEvent -abstract class BaseFragment : +abstract class BaseUIFragment : Fragment(), EventHandler { - protected val activity get() = requireActivity() as BaseActivity<*, *> + protected val activity get() = requireActivity() as BaseUIActivity<*, *> protected lateinit var binding: Binding protected abstract val layoutRes: Int protected abstract val viewModel: ViewModel @@ -31,7 +31,7 @@ abstract class BaseFragment(inflater, layoutRes, container, false).apply { setVariable(BR.viewModel, viewModel) - lifecycleOwner = this@BaseFragment + lifecycleOwner = this@BaseUIFragment } return binding.root diff --git a/app/src/main/java/com/topjohnwu/magisk/base/BaseViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseViewModel.kt similarity index 97% rename from app/src/main/java/com/topjohnwu/magisk/base/BaseViewModel.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/base/BaseViewModel.kt index 729c40d41..3f3acf842 100644 --- a/app/src/main/java/com/topjohnwu/magisk/base/BaseViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseViewModel.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.base +package com.topjohnwu.magisk.ui.base import androidx.annotation.CallSuper import androidx.core.graphics.Insets @@ -8,7 +8,8 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.topjohnwu.magisk.BR -import com.topjohnwu.magisk.Info +import com.topjohnwu.magisk.core.Info +import com.topjohnwu.magisk.core.base.BaseActivity import com.topjohnwu.magisk.extensions.doOnSubscribeUi import com.topjohnwu.magisk.model.events.* import com.topjohnwu.magisk.model.observer.Observer @@ -79,7 +80,7 @@ abstract class BaseViewModel( super.onCleared() } - fun withView(action: BaseActivity<*, *>.() -> Unit) { + fun withView(action: BaseActivity.() -> Unit) { ViewActionEvent(action).publish() } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatActivity.kt similarity index 93% rename from app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatActivity.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/base/CompatActivity.kt index 348d47770..9e2e9e58c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatActivity.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.ui.compat +package com.topjohnwu.magisk.ui.base import android.app.Activity import android.content.Intent @@ -10,8 +10,6 @@ import androidx.core.content.getSystemService import androidx.databinding.OnRebindCallback import androidx.databinding.ViewDataBinding import androidx.fragment.app.Fragment -import com.topjohnwu.magisk.base.BaseActivity -import com.topjohnwu.magisk.base.BaseViewModel import com.topjohnwu.magisk.extensions.snackbar import com.topjohnwu.magisk.extensions.startAnimations import com.topjohnwu.magisk.model.events.SnackbarEvent @@ -20,9 +18,10 @@ import com.topjohnwu.magisk.model.navigation.Navigator import com.topjohnwu.magisk.ui.theme.Theme import kotlin.reflect.KClass +// TODO (diareuse): Merge into BaseUIActivity after all legacy UI is migrated abstract class CompatActivity : - BaseActivity(), CompatView, Navigator { + BaseUIActivity(), CompatView, Navigator { override val themeRes = Theme.selected.themeRes override val viewRoot: View get() = binding.root diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatDelegate.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatDelegate.kt similarity index 93% rename from app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatDelegate.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/base/CompatDelegate.kt index 783cfd1c2..081eed217 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatDelegate.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatDelegate.kt @@ -1,11 +1,10 @@ -package com.topjohnwu.magisk.ui.compat +package com.topjohnwu.magisk.ui.base import android.view.View import androidx.core.graphics.Insets import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.Fragment -import com.topjohnwu.magisk.base.BaseActivity import com.topjohnwu.magisk.model.events.ActivityExecutor import com.topjohnwu.magisk.model.events.ContextExecutor import com.topjohnwu.magisk.model.events.FragmentExecutor @@ -26,7 +25,7 @@ class CompatDelegate internal constructor( view.viewModel.requestRefresh() } - fun onEventExecute(event: ViewEvent, activity: BaseActivity<*, *>) { + fun onEventExecute(event: ViewEvent, activity: BaseUIActivity<*, *>) { (event as? ContextExecutor)?.invoke(activity) (event as? ActivityExecutor)?.invoke(activity) (event as? FragmentExecutor)?.let { @@ -37,7 +36,7 @@ class CompatDelegate internal constructor( fun onEventExecute(event: ViewEvent, fragment: Fragment) { (event as? ContextExecutor)?.invoke(fragment.requireContext()) (event as? FragmentExecutor)?.invoke(fragment) - (event as? ActivityExecutor)?.invoke(fragment.requireActivity() as BaseActivity<*, *>) + (event as? ActivityExecutor)?.invoke(fragment.requireActivity() as BaseUIActivity<*, *>) } private fun ensureInsets() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatFragment.kt similarity index 88% rename from app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatFragment.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/base/CompatFragment.kt index decb4c34a..bdc1fcbfe 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatFragment.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.ui.compat +package com.topjohnwu.magisk.ui.base import android.os.Bundle import android.view.View @@ -6,13 +6,13 @@ import android.view.ViewGroup import androidx.databinding.OnRebindCallback import androidx.databinding.ViewDataBinding import androidx.fragment.app.Fragment -import com.topjohnwu.magisk.base.BaseFragment -import com.topjohnwu.magisk.base.BaseViewModel import com.topjohnwu.magisk.extensions.startAnimations import com.topjohnwu.magisk.model.events.ViewEvent +// TODO (diareuse): Merge into BaseUIFragment after all legacy UI is migrated + abstract class CompatFragment - : BaseFragment(), CompatView { + : BaseUIFragment(), CompatView { override val viewRoot: View get() = binding.root override val navigation by lazy { compatActivity.navigation } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatHelpers.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatHelpers.kt similarity index 97% rename from app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatHelpers.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/base/CompatHelpers.kt index 7d2c60246..27fd8c3dc 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatHelpers.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatHelpers.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.ui.compat +package com.topjohnwu.magisk.ui.base import androidx.databinding.ViewDataBinding import com.topjohnwu.magisk.databinding.ComparableRvItem diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatNavigationDelegate.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatNavigationDelegate.kt similarity index 99% rename from app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatNavigationDelegate.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/base/CompatNavigationDelegate.kt index f1c965c70..990b20615 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatNavigationDelegate.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatNavigationDelegate.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.ui.compat +package com.topjohnwu.magisk.ui.base import android.content.Intent import android.os.Bundle diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatView.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatView.kt similarity index 80% rename from app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatView.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/base/CompatView.kt index 84e1724c2..c6d8fe5af 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/compat/CompatView.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatView.kt @@ -1,8 +1,7 @@ -package com.topjohnwu.magisk.ui.compat +package com.topjohnwu.magisk.ui.base import android.view.View import androidx.core.graphics.Insets -import com.topjohnwu.magisk.base.BaseViewModel internal interface CompatView { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/compat/Queryable.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/Queryable.kt similarity index 92% rename from app/src/main/java/com/topjohnwu/magisk/ui/compat/Queryable.kt rename to app/src/main/java/com/topjohnwu/magisk/ui/base/Queryable.kt index ff8d5e508..c7dc2d267 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/compat/Queryable.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/Queryable.kt @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk.ui.compat +package com.topjohnwu.magisk.ui.base import android.os.Handler import android.os.Looper diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt index b32f65456..ccb0a3b14 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt @@ -2,7 +2,7 @@ package com.topjohnwu.magisk.ui.flash import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentFlashMd2Binding -import com.topjohnwu.magisk.ui.compat.CompatFragment +import com.topjohnwu.magisk.ui.base.CompatFragment import org.koin.androidx.viewmodel.ext.android.viewModel class FlashFragment : CompatFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt index bd4938fb3..4f1b716ed 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt @@ -1,5 +1,5 @@ package com.topjohnwu.magisk.ui.flash -import com.topjohnwu.magisk.base.BaseViewModel +import com.topjohnwu.magisk.ui.base.BaseViewModel class FlashViewModel : BaseViewModel() diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideFragment.kt index b45a4f5c1..5ef748129 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideFragment.kt @@ -12,8 +12,8 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentHideMd2Binding -import com.topjohnwu.magisk.ui.compat.CompatFragment -import com.topjohnwu.magisk.ui.compat.hideKeyboard +import com.topjohnwu.magisk.ui.base.CompatFragment +import com.topjohnwu.magisk.ui.base.hideKeyboard import com.topjohnwu.magisk.utils.MotionRevealHelper import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt index 252d95016..605041700 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt @@ -3,6 +3,7 @@ package com.topjohnwu.magisk.ui.hide import android.content.pm.ApplicationInfo import androidx.databinding.Bindable import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.core.utils.currentLocale import com.topjohnwu.magisk.data.repository.MagiskRepository import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.extensions.toggle @@ -12,12 +13,11 @@ import com.topjohnwu.magisk.model.entity.ProcessHideApp import com.topjohnwu.magisk.model.entity.StatefulProcess import com.topjohnwu.magisk.model.entity.recycler.HideItem import com.topjohnwu.magisk.model.entity.recycler.HideProcessItem -import com.topjohnwu.magisk.base.BaseViewModel -import com.topjohnwu.magisk.ui.compat.Queryable -import com.topjohnwu.magisk.ui.compat.filterableListOf -import com.topjohnwu.magisk.ui.compat.itemBindingOf +import com.topjohnwu.magisk.ui.base.BaseViewModel +import com.topjohnwu.magisk.ui.base.Queryable +import com.topjohnwu.magisk.ui.base.filterableListOf +import com.topjohnwu.magisk.ui.base.itemBindingOf import com.topjohnwu.magisk.utils.KObservableField -import com.topjohnwu.magisk.utils.currentLocale class HideViewModel( private val magiskRepo: MagiskRepository diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt index e4e8e49a7..825b9943f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt @@ -7,7 +7,7 @@ import androidx.core.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentHomeMd2Binding import com.topjohnwu.magisk.model.navigation.Navigation -import com.topjohnwu.magisk.ui.compat.CompatFragment +import com.topjohnwu.magisk.ui.base.CompatFragment import org.koin.androidx.viewmodel.ext.android.viewModel class HomeFragment : CompatFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt index f998ff320..64a455047 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt @@ -3,15 +3,15 @@ package com.topjohnwu.magisk.ui.home import android.Manifest import android.os.Build import com.topjohnwu.magisk.BuildConfig -import com.topjohnwu.magisk.Config -import com.topjohnwu.magisk.Info import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.Config +import com.topjohnwu.magisk.core.Info +import com.topjohnwu.magisk.core.download.RemoteFileService import com.topjohnwu.magisk.data.repository.MagiskRepository import com.topjohnwu.magisk.extensions.* -import com.topjohnwu.magisk.model.download.RemoteFileService -import com.topjohnwu.magisk.model.entity.MagiskJson -import com.topjohnwu.magisk.model.entity.ManagerJson -import com.topjohnwu.magisk.model.entity.UpdateInfo +import com.topjohnwu.magisk.core.model.MagiskJson +import com.topjohnwu.magisk.core.model.ManagerJson +import com.topjohnwu.magisk.core.model.UpdateInfo import com.topjohnwu.magisk.model.entity.internal.DownloadSubject.Magisk import com.topjohnwu.magisk.model.entity.internal.DownloadSubject.Manager import com.topjohnwu.magisk.model.entity.recycler.DeveloperItem @@ -22,8 +22,8 @@ import com.topjohnwu.magisk.model.events.dialog.ManagerInstallDialog import com.topjohnwu.magisk.model.events.dialog.UninstallDialog import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.model.observer.Observer -import com.topjohnwu.magisk.base.BaseViewModel -import com.topjohnwu.magisk.ui.compat.itemBindingOf +import com.topjohnwu.magisk.ui.base.BaseViewModel +import com.topjohnwu.magisk.ui.base.itemBindingOf import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.superuser.Shell import me.tatarka.bindingcollectionadapter2.BR diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallFragment.kt index d2e4a5880..6cdfbb1e5 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallFragment.kt @@ -5,7 +5,7 @@ import androidx.core.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentInstallMd2Binding import com.topjohnwu.magisk.model.events.RequestFileEvent -import com.topjohnwu.magisk.ui.compat.CompatFragment +import com.topjohnwu.magisk.ui.base.CompatFragment import org.koin.androidx.viewmodel.ext.android.viewModel class InstallFragment : CompatFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt index 9e6dc3b5d..aec2bafdd 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt @@ -2,13 +2,13 @@ package com.topjohnwu.magisk.ui.install import android.net.Uri import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.download.DownloadService +import com.topjohnwu.magisk.core.download.RemoteFileService import com.topjohnwu.magisk.extensions.addOnPropertyChangedCallback -import com.topjohnwu.magisk.model.download.DownloadService -import com.topjohnwu.magisk.model.download.RemoteFileService import com.topjohnwu.magisk.model.entity.internal.Configuration import com.topjohnwu.magisk.model.entity.internal.DownloadSubject import com.topjohnwu.magisk.model.events.RequestFileEvent -import com.topjohnwu.magisk.base.BaseViewModel +import com.topjohnwu.magisk.ui.base.BaseViewModel import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.ShellUtils diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt index e4a25c4aa..29db680cd 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt @@ -10,7 +10,7 @@ import androidx.core.view.isVisible import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentLogMd2Binding import com.topjohnwu.magisk.ui.MainActivity -import com.topjohnwu.magisk.ui.compat.CompatFragment +import com.topjohnwu.magisk.ui.base.CompatFragment import com.topjohnwu.magisk.utils.MotionRevealHelper import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt index 520094e00..0e39b71c3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt @@ -1,9 +1,9 @@ package com.topjohnwu.magisk.ui.log import com.topjohnwu.magisk.BR -import com.topjohnwu.magisk.Config -import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.Config +import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.data.repository.LogRepository import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.subscribeK @@ -12,9 +12,9 @@ import com.topjohnwu.magisk.model.entity.recycler.ConsoleItem import com.topjohnwu.magisk.model.entity.recycler.LogItem import com.topjohnwu.magisk.model.entity.recycler.TextItem import com.topjohnwu.magisk.model.events.SnackbarEvent -import com.topjohnwu.magisk.base.BaseViewModel -import com.topjohnwu.magisk.ui.compat.diffListOf -import com.topjohnwu.magisk.ui.compat.itemBindingOf +import com.topjohnwu.magisk.ui.base.BaseViewModel +import com.topjohnwu.magisk.ui.base.diffListOf +import com.topjohnwu.magisk.ui.base.itemBindingOf import com.topjohnwu.superuser.Shell import io.reactivex.Completable import io.reactivex.android.schedulers.AndroidSchedulers diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt index ac1008ff6..cc6a1b525 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt @@ -16,8 +16,8 @@ import com.topjohnwu.magisk.model.events.InstallExternalModuleEvent import com.topjohnwu.magisk.model.events.ViewEvent import com.topjohnwu.magisk.ui.MainActivity import com.topjohnwu.magisk.ui.ReselectionTarget -import com.topjohnwu.magisk.ui.compat.CompatFragment -import com.topjohnwu.magisk.ui.compat.hideKeyboard +import com.topjohnwu.magisk.ui.base.CompatFragment +import com.topjohnwu.magisk.ui.base.hideKeyboard import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener import com.topjohnwu.magisk.utils.MotionRevealHelper import com.topjohnwu.magisk.utils.PinchZoomTouchListener diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt index 200473367..db4344620 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt @@ -4,27 +4,26 @@ import androidx.annotation.WorkerThread import androidx.databinding.Bindable import androidx.databinding.ObservableArrayList import com.topjohnwu.magisk.BR -import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.BaseViewModel +import com.topjohnwu.magisk.core.Config +import com.topjohnwu.magisk.core.download.RemoteFileService +import com.topjohnwu.magisk.core.model.module.Module +import com.topjohnwu.magisk.core.model.module.Repo +import com.topjohnwu.magisk.core.tasks.RepoUpdater +import com.topjohnwu.magisk.core.utils.currentLocale import com.topjohnwu.magisk.data.database.RepoByNameDao import com.topjohnwu.magisk.data.database.RepoByUpdatedDao import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.reboot import com.topjohnwu.magisk.extensions.subscribeK -import com.topjohnwu.magisk.model.download.RemoteFileService import com.topjohnwu.magisk.model.entity.internal.DownloadSubject -import com.topjohnwu.magisk.model.entity.module.Module -import com.topjohnwu.magisk.model.entity.module.Repo import com.topjohnwu.magisk.model.entity.recycler.* import com.topjohnwu.magisk.model.events.InstallExternalModuleEvent import com.topjohnwu.magisk.model.events.OpenChangelogEvent import com.topjohnwu.magisk.model.events.dialog.ModuleInstallDialog -import com.topjohnwu.magisk.tasks.RepoUpdater -import com.topjohnwu.magisk.ui.compat.* +import com.topjohnwu.magisk.ui.base.* import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener import com.topjohnwu.magisk.utils.KObservableField -import com.topjohnwu.magisk.utils.currentLocale import io.reactivex.Completable import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers @@ -248,9 +247,7 @@ class ModuleViewModel( } } - private fun downloadRepos() = Single.just(Unit) - .flatMap { repoUpdater() } - .ignoreElement() + private fun downloadRepos() = repoUpdater() // --- diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestActivity.kt index 814d0f312..c660fad7d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestActivity.kt @@ -2,7 +2,7 @@ package com.topjohnwu.magisk.ui.request import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ActivityRequestMd2Binding -import com.topjohnwu.magisk.ui.compat.CompatActivity +import com.topjohnwu.magisk.ui.base.CompatActivity import org.koin.androidx.viewmodel.ext.android.viewModel class RequestActivity : CompatActivity() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestViewModel.kt index 355a6dedf..67f28c8e9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/request/RequestViewModel.kt @@ -1,5 +1,5 @@ package com.topjohnwu.magisk.ui.request -import com.topjohnwu.magisk.base.BaseViewModel +import com.topjohnwu.magisk.ui.base.BaseViewModel class RequestViewModel : BaseViewModel() diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetFragment.kt index f66663ac9..f1de04f02 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetFragment.kt @@ -2,7 +2,7 @@ package com.topjohnwu.magisk.ui.safetynet import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentSafetynetMd2Binding -import com.topjohnwu.magisk.ui.compat.CompatFragment +import com.topjohnwu.magisk.ui.base.CompatFragment import org.koin.androidx.viewmodel.ext.android.viewModel class SafetynetFragment : CompatFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetViewModel.kt index 25eb3d63a..3bf21b61a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetViewModel.kt @@ -6,11 +6,11 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.model.events.SafetyNetResult import com.topjohnwu.magisk.model.events.UpdateSafetyNetEvent -import com.topjohnwu.magisk.base.BaseViewModel +import com.topjohnwu.magisk.ui.base.BaseViewModel import com.topjohnwu.magisk.ui.safetynet.SafetyNetState.* import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.RxBus -import com.topjohnwu.magisk.utils.SafetyNetHelper +import com.topjohnwu.magisk.core.utils.SafetyNetHelper enum class SafetyNetState { LOADING, PASS, FAILED, IDLE diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt index 2a9a3aab0..3d25b1a37 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt @@ -5,7 +5,7 @@ import android.view.View import androidx.core.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentSettingsMd2Binding -import com.topjohnwu.magisk.ui.compat.CompatFragment +import com.topjohnwu.magisk.ui.base.CompatFragment import com.topjohnwu.magisk.utils.PinchZoomTouchListener import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt index 3deaa3302..31f6c5032 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt @@ -6,14 +6,24 @@ import android.os.Environment import android.view.LayoutInflater import android.widget.Toast import androidx.databinding.Bindable -import com.topjohnwu.magisk.* +import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.BuildConfig +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.Config +import com.topjohnwu.magisk.core.Const +import com.topjohnwu.magisk.core.Info +import com.topjohnwu.magisk.core.utils.availableLocales +import com.topjohnwu.magisk.core.utils.currentLocale +import com.topjohnwu.magisk.core.utils.refreshLocale import com.topjohnwu.magisk.databinding.DialogSettingsAppNameBinding import com.topjohnwu.magisk.databinding.DialogSettingsDownloadPathBinding import com.topjohnwu.magisk.databinding.DialogSettingsUpdateChannelBinding import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.model.entity.recycler.SettingsItem -import com.topjohnwu.magisk.utils.* +import com.topjohnwu.magisk.core.utils.BiometricHelper +import com.topjohnwu.magisk.core.utils.Utils +import com.topjohnwu.magisk.utils.asTransitive import com.topjohnwu.superuser.Shell import java.io.File import kotlin.math.max @@ -36,7 +46,9 @@ object Language : SettingsItem.Selector() { init { availableLocales.subscribeK { (names, values) -> setValues(names, values) - val selectedLocale = currentLocale.getDisplayName(currentLocale) + val selectedLocale = currentLocale.getDisplayName( + currentLocale + ) value = names.indexOfFirst { it == selectedLocale }.let { if (it == -1) 0 else it } } } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt index 9f5a90db8..4eeaeafb0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt @@ -5,9 +5,10 @@ import android.view.View import android.widget.Toast import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.download.DownloadService +import com.topjohnwu.magisk.core.utils.PatchAPK import com.topjohnwu.magisk.data.database.RepoDao import com.topjohnwu.magisk.extensions.subscribeK -import com.topjohnwu.magisk.model.download.DownloadService import com.topjohnwu.magisk.model.entity.internal.Configuration import com.topjohnwu.magisk.model.entity.internal.DownloadSubject import com.topjohnwu.magisk.model.entity.recycler.SettingsItem @@ -15,12 +16,11 @@ import com.topjohnwu.magisk.model.events.PermissionEvent import com.topjohnwu.magisk.model.events.RecreateEvent import com.topjohnwu.magisk.model.events.dialog.BiometricDialog import com.topjohnwu.magisk.model.navigation.Navigation -import com.topjohnwu.magisk.base.BaseViewModel -import com.topjohnwu.magisk.ui.compat.adapterOf -import com.topjohnwu.magisk.ui.compat.diffListOf -import com.topjohnwu.magisk.ui.compat.itemBindingOf -import com.topjohnwu.magisk.utils.PatchAPK -import com.topjohnwu.magisk.utils.Utils +import com.topjohnwu.magisk.ui.base.BaseViewModel +import com.topjohnwu.magisk.ui.base.adapterOf +import com.topjohnwu.magisk.ui.base.diffListOf +import com.topjohnwu.magisk.ui.base.itemBindingOf +import com.topjohnwu.magisk.core.utils.Utils import com.topjohnwu.superuser.Shell import io.reactivex.Completable import io.reactivex.subjects.PublishSubject diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserFragment.kt index cc255d513..4e674649c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserFragment.kt @@ -9,7 +9,7 @@ import androidx.core.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentSuperuserMd2Binding import com.topjohnwu.magisk.model.navigation.Navigation -import com.topjohnwu.magisk.ui.compat.CompatFragment +import com.topjohnwu.magisk.ui.base.CompatFragment import com.topjohnwu.magisk.utils.PinchZoomTouchListener import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt index f0b58c24a..a538e3254 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt @@ -5,12 +5,13 @@ import android.content.res.Resources import androidx.databinding.ObservableArrayList import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.data.database.PolicyDao +import com.topjohnwu.magisk.core.magiskdb.PolicyDao +import com.topjohnwu.magisk.core.model.MagiskPolicy +import com.topjohnwu.magisk.core.utils.currentLocale import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.applySchedulers import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.extensions.toggle -import com.topjohnwu.magisk.model.entity.MagiskPolicy import com.topjohnwu.magisk.model.entity.recycler.PolicyItem import com.topjohnwu.magisk.model.entity.recycler.TappableHeadlineItem import com.topjohnwu.magisk.model.entity.recycler.TextItem @@ -19,12 +20,11 @@ import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.model.events.dialog.BiometricDialog import com.topjohnwu.magisk.model.events.dialog.SuperuserRevokeDialog import com.topjohnwu.magisk.model.navigation.Navigation -import com.topjohnwu.magisk.base.BaseViewModel -import com.topjohnwu.magisk.ui.compat.adapterOf -import com.topjohnwu.magisk.ui.compat.diffListOf -import com.topjohnwu.magisk.ui.compat.itemBindingOf -import com.topjohnwu.magisk.utils.BiometricHelper -import com.topjohnwu.magisk.utils.currentLocale +import com.topjohnwu.magisk.ui.base.BaseViewModel +import com.topjohnwu.magisk.ui.base.adapterOf +import com.topjohnwu.magisk.ui.base.diffListOf +import com.topjohnwu.magisk.ui.base.itemBindingOf +import com.topjohnwu.magisk.core.utils.BiometricHelper import io.reactivex.Single import me.tatarka.bindingcollectionadapter2.collections.MergeObservableList diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/theme/Theme.kt b/app/src/main/java/com/topjohnwu/magisk/ui/theme/Theme.kt index 133090e71..822a3db12 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/theme/Theme.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/theme/Theme.kt @@ -1,7 +1,7 @@ package com.topjohnwu.magisk.ui.theme -import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.Config enum class Theme( val themeName: String, diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeFragment.kt index 2c84dd712..73bd2e1c4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeFragment.kt @@ -3,7 +3,7 @@ package com.topjohnwu.magisk.ui.theme import androidx.core.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentThemeMd2Binding -import com.topjohnwu.magisk.ui.compat.CompatFragment +import com.topjohnwu.magisk.ui.base.CompatFragment import org.koin.androidx.viewmodel.ext.android.viewModel class ThemeFragment : CompatFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeViewModel.kt index 3cb572173..af064a006 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeViewModel.kt @@ -3,7 +3,7 @@ package com.topjohnwu.magisk.ui.theme import com.topjohnwu.magisk.model.entity.recycler.TappableHeadlineItem import com.topjohnwu.magisk.model.events.RecreateEvent import com.topjohnwu.magisk.model.events.dialog.DarkThemeDialog -import com.topjohnwu.magisk.base.BaseViewModel +import com.topjohnwu.magisk.ui.base.BaseViewModel class ThemeViewModel : BaseViewModel(), TappableHeadlineItem.Listener { diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/MotionRevealHelper.kt b/app/src/main/java/com/topjohnwu/magisk/utils/MotionRevealHelper.kt index 5fe6fc09e..5b78818ab 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/MotionRevealHelper.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/MotionRevealHelper.kt @@ -14,6 +14,7 @@ import androidx.interpolator.view.animation.FastOutSlowInInterpolator import com.google.android.material.circularreveal.CircularRevealCompat import com.google.android.material.circularreveal.CircularRevealWidget import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.topjohnwu.magisk.core.utils.currentLocale import kotlin.math.hypot object MotionRevealHelper { @@ -80,4 +81,4 @@ object MotionRevealHelper { return CircularRevealWidget.RevealInfo(cX, cY, if (expanded) hypot(cX, cY) else 0f) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/PinchZoomTouchListener.kt b/app/src/main/java/com/topjohnwu/magisk/utils/PinchZoomTouchListener.kt index 58e099709..678be9096 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/PinchZoomTouchListener.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/PinchZoomTouchListener.kt @@ -8,7 +8,7 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.StaggeredGridLayoutManager import androidx.transition.TransitionManager -import com.topjohnwu.magisk.Config +import com.topjohnwu.magisk.core.Config import kotlin.math.max import kotlin.math.min @@ -63,4 +63,4 @@ class PinchZoomTouchListener private constructor( } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt index ec98b0631..5f0ad783d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt @@ -22,7 +22,7 @@ import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.databinding.DialogMagiskBaseBinding -import com.topjohnwu.magisk.ui.compat.itemBindingOf +import com.topjohnwu.magisk.ui.base.itemBindingOf import com.topjohnwu.magisk.utils.KObservableField import me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapters import me.tatarka.bindingcollectionadapter2.ItemBinding diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 6cefd97e9..37b971a38 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -9,11 +9,11 @@ - + - + - + diff --git a/app/src/main/res/layout/fragment_module_md2.xml b/app/src/main/res/layout/fragment_module_md2.xml index 6ad7391b0..73ea22de0 100644 --- a/app/src/main/res/layout/fragment_module_md2.xml +++ b/app/src/main/res/layout/fragment_module_md2.xml @@ -7,7 +7,7 @@ - + - + diff --git a/app/src/main/res/layout/include_install_options.xml b/app/src/main/res/layout/include_install_options.xml index 7874da119..48978cded 100644 --- a/app/src/main/res/layout/include_install_options.xml +++ b/app/src/main/res/layout/include_install_options.xml @@ -5,7 +5,7 @@ - + @@ -55,4 +55,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/item_module_md2.xml b/app/src/main/res/layout/item_module_md2.xml index db37b46a5..9db5ce78b 100644 --- a/app/src/main/res/layout/item_module_md2.xml +++ b/app/src/main/res/layout/item_module_md2.xml @@ -7,7 +7,7 @@ - + Date: Mon, 13 Jan 2020 23:10:17 +0800 Subject: [PATCH 238/254] Consolidate stubs --- app/src/main/java/a/b.kt | 5 ---- app/src/main/java/a/c.java | 7 ----- app/src/main/java/a/e.java | 13 --------- app/src/main/java/a/f.java | 7 ----- app/src/main/java/a/h.java | 7 ----- app/src/main/java/a/j.java | 7 ----- app/src/main/java/a/m.java | 7 ----- app/src/main/java/a/stubs.kt | 55 ++++++++++++++++++++++++++++++++++++ app/src/main/java/a/w.java | 42 --------------------------- 9 files changed, 55 insertions(+), 95 deletions(-) delete mode 100644 app/src/main/java/a/b.kt delete mode 100644 app/src/main/java/a/c.java delete mode 100644 app/src/main/java/a/e.java delete mode 100644 app/src/main/java/a/f.java delete mode 100644 app/src/main/java/a/h.java delete mode 100644 app/src/main/java/a/j.java delete mode 100644 app/src/main/java/a/m.java create mode 100644 app/src/main/java/a/stubs.kt delete mode 100644 app/src/main/java/a/w.java diff --git a/app/src/main/java/a/b.kt b/app/src/main/java/a/b.kt deleted file mode 100644 index 918eeeadf..000000000 --- a/app/src/main/java/a/b.kt +++ /dev/null @@ -1,5 +0,0 @@ -package a - -import com.topjohnwu.magisk.ui.MainActivity - -class b : MainActivity() diff --git a/app/src/main/java/a/c.java b/app/src/main/java/a/c.java deleted file mode 100644 index bc0ad4546..000000000 --- a/app/src/main/java/a/c.java +++ /dev/null @@ -1,7 +0,0 @@ -package a; - -import com.topjohnwu.magisk.core.SplashActivity; - -public class c extends SplashActivity { - /* stub */ -} diff --git a/app/src/main/java/a/e.java b/app/src/main/java/a/e.java deleted file mode 100644 index 773d1dead..000000000 --- a/app/src/main/java/a/e.java +++ /dev/null @@ -1,13 +0,0 @@ -package a; - -import com.topjohnwu.magisk.core.App; - -public class e extends App { - public e() { - super(); - } - - public e(Object o) { - super(o); - } -} diff --git a/app/src/main/java/a/f.java b/app/src/main/java/a/f.java deleted file mode 100644 index 204920535..000000000 --- a/app/src/main/java/a/f.java +++ /dev/null @@ -1,7 +0,0 @@ -package a; - -import com.topjohnwu.magisk.legacy.flash.FlashActivity; - -public class f extends FlashActivity { - /* stub */ -} diff --git a/app/src/main/java/a/h.java b/app/src/main/java/a/h.java deleted file mode 100644 index dbf7751ea..000000000 --- a/app/src/main/java/a/h.java +++ /dev/null @@ -1,7 +0,0 @@ -package a; - -import com.topjohnwu.magisk.core.GeneralReceiver; - -public class h extends GeneralReceiver { - /* stub */ -} diff --git a/app/src/main/java/a/j.java b/app/src/main/java/a/j.java deleted file mode 100644 index 8b3f9830f..000000000 --- a/app/src/main/java/a/j.java +++ /dev/null @@ -1,7 +0,0 @@ -package a; - -import com.topjohnwu.magisk.core.download.DownloadService; - -public class j extends DownloadService { - /* stub */ -} diff --git a/app/src/main/java/a/m.java b/app/src/main/java/a/m.java deleted file mode 100644 index 195a6127c..000000000 --- a/app/src/main/java/a/m.java +++ /dev/null @@ -1,7 +0,0 @@ -package a; - -import com.topjohnwu.magisk.legacy.surequest.SuRequestActivity; - -public class m extends SuRequestActivity { - /* stub */ -} diff --git a/app/src/main/java/a/stubs.kt b/app/src/main/java/a/stubs.kt new file mode 100644 index 000000000..91dffbeb4 --- /dev/null +++ b/app/src/main/java/a/stubs.kt @@ -0,0 +1,55 @@ +package a + +import android.content.Context +import androidx.work.Worker +import androidx.work.WorkerParameters +import com.topjohnwu.magisk.core.App +import com.topjohnwu.magisk.core.GeneralReceiver +import com.topjohnwu.magisk.core.SplashActivity +import com.topjohnwu.magisk.core.base.BaseWorkerWrapper +import com.topjohnwu.magisk.core.download.DownloadService +import com.topjohnwu.magisk.legacy.flash.FlashActivity +import com.topjohnwu.magisk.legacy.surequest.SuRequestActivity +import com.topjohnwu.magisk.ui.MainActivity +import java.lang.reflect.ParameterizedType + +class b : MainActivity() + +class c : SplashActivity() + +class e : App { + constructor() : super() + constructor(o: Any) : super(o) +} + +class f : FlashActivity() + +class h : GeneralReceiver() + +class j : DownloadService() + +class m : SuRequestActivity() + +/** + * Wrapper class to workaround Proguard rule : + * -keep class * extends Worker + * */ +abstract class w( + context: Context, + workerParams: WorkerParameters +) : Worker(context, workerParams) { + + private var base: T? = null + + override fun doWork() = base?.doWork() ?: Result.failure() + + override fun onStopped() = base?.onStopped() ?: Unit + + init { + try { + base = ((javaClass.genericSuperclass as ParameterizedType) + .actualTypeArguments[0] as Class).newInstance() + base?.attachWorker(this) + } catch (e : java.lang.Exception) {} + } +} diff --git a/app/src/main/java/a/w.java b/app/src/main/java/a/w.java deleted file mode 100644 index 076926e7e..000000000 --- a/app/src/main/java/a/w.java +++ /dev/null @@ -1,42 +0,0 @@ -package a; - -import android.content.Context; - -import androidx.annotation.NonNull; -import androidx.work.Worker; -import androidx.work.WorkerParameters; - -import com.topjohnwu.magisk.core.base.BaseWorkerWrapper; - -import java.lang.reflect.ParameterizedType; - -public abstract class w extends Worker { - - /* Wrapper class to workaround Proguard -keep class * extends Worker */ - - private T base; - - @SuppressWarnings("unchecked") - w(@NonNull Context context, @NonNull WorkerParameters workerParams) { - super(context, workerParams); - try { - base = ((Class) ((ParameterizedType) getClass().getGenericSuperclass()) - .getActualTypeArguments()[0]).newInstance(); - base.attachWorker(this); - } catch (Exception ignored) {} - } - - @NonNull - @Override - public Result doWork() { - if (base == null) - return Result.failure(); - return base.doWork(); - } - - @Override - public void onStopped() { - if (base != null) - base.onStopped(); - } -} From 47c3045980aae96a192c3bd03b56c40b8d868019 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Tue, 14 Jan 2020 20:14:20 +0800 Subject: [PATCH 239/254] Log full stack trace for unhandled exception --- app/src/main/java/com/topjohnwu/magisk/core/App.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/core/App.kt b/app/src/main/java/com/topjohnwu/magisk/core/App.kt index 7d59c20f2..89d40442c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/App.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/App.kt @@ -27,6 +27,7 @@ import com.topjohnwu.superuser.Shell import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin import timber.log.Timber +import kotlin.system.exitProcess open class App() : Application() { @@ -49,13 +50,19 @@ open class App() : Application() { else -> null } } + + // Always log full stack trace with Timber + Timber.plant(Timber.DebugTree()) + Thread.setDefaultUncaughtExceptionHandler { _, e -> + Timber.e(e) + exitProcess(1) + } } override fun attachBaseContext(base: Context) { // Basic setup if (BuildConfig.DEBUG) MultiDex.install(base) - Timber.plant(Timber.DebugTree()) // Some context magic val app: Application From de853a2651d12fd44c22fc0e9b0f3bbbab766ea3 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Tue, 14 Jan 2020 22:03:29 +0800 Subject: [PATCH 240/254] Fix crash when manually refresh repo db --- .../magisk/core/tasks/RepoUpdater.kt | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/core/tasks/RepoUpdater.kt b/app/src/main/java/com/topjohnwu/magisk/core/tasks/RepoUpdater.kt index e8b4f2dfd..895a7634a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/tasks/RepoUpdater.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/tasks/RepoUpdater.kt @@ -39,7 +39,7 @@ class RepoUpdater( it.error()?.also { throw it } it.response()?.run { if (code() == HttpURLConnection.HTTP_NOT_MODIFIED) - return@run Flowable.error(CachedException) + return@run Flowable.error(CachedException()) if (page == 1) repoDB.etagKey = headers()[Const.Key.ETAG_KEY].orEmpty().trimEtag() @@ -64,21 +64,23 @@ class RepoUpdater( @Suppress("RedundantLambdaArrow") operator fun invoke(forced: Boolean = false) : Completable { - val cached = Collections.synchronizedSet(HashSet(repoDB.repoIDList)) - return loadPage(cached, etag = repoDB.etagKey).doOnComplete { - repoDB.removeRepos(cached) - }.onErrorResumeNext { it: Throwable -> - if (it is CachedException) { - if (forced) - return@onErrorResumeNext forcedReload(cached) - } else { - Timber.e(it) - } - Flowable.empty() - }.ignoreElements() + return Flowable.fromCallable { Collections.synchronizedSet(HashSet(repoDB.repoIDList)) } + .flatMap { cached -> + loadPage(cached, etag = repoDB.etagKey).doOnComplete { + repoDB.removeRepos(cached) + }.onErrorResumeNext { it: Throwable -> + if (it is CachedException) { + if (forced) + return@onErrorResumeNext forcedReload(cached) + } else { + Timber.e(it) + } + Flowable.empty() + } + }.ignoreElements() } - object CachedException : Exception() + class CachedException : Exception() } private val dateFormat: SimpleDateFormat = From 433ae89e5320577e9016a60a70fded9dc7278e43 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Wed, 15 Jan 2020 00:05:44 +0800 Subject: [PATCH 241/254] Make things run on API 17 --- app/build.gradle | 4 ++- .../magisk/ui/base/BaseUIActivity.kt | 2 +- .../magisk/ui/base/BaseUIFragment.kt | 2 +- app/src/main/res/drawable-v21/bg_appbar.xml | 15 +++++++++++ app/src/main/res/drawable-v21/bg_card.xml | 8 ++++++ .../bg_divider_rounded_on_primary.xml | 7 +++++ app/src/main/res/drawable-v21/bg_shadow.xml | 8 ++++++ .../res/drawable-v21/fast_scroll_thumb.xml | 19 ++++++++++++++ .../res/drawable-v21/progress_determinate.xml | 26 +++++++++++++++++++ app/src/main/res/drawable/bg_appbar.xml | 4 +-- app/src/main/res/drawable/bg_card.xml | 6 ++--- .../bg_divider_rounded_on_primary.xml | 4 +-- app/src/main/res/drawable/bg_selectable.xml | 4 +-- .../res/drawable/bg_selectable_borderless.xml | 4 +-- app/src/main/res/drawable/bg_shadow.xml | 4 +-- .../main/res/drawable/fast_scroll_thumb.xml | 4 +-- .../res/drawable/progress_determinate.xml | 6 ++--- app/src/main/res/values/default_color.xml | 24 +++++++++++++++++ 18 files changed, 130 insertions(+), 21 deletions(-) create mode 100644 app/src/main/res/drawable-v21/bg_appbar.xml create mode 100644 app/src/main/res/drawable-v21/bg_card.xml create mode 100644 app/src/main/res/drawable-v21/bg_divider_rounded_on_primary.xml create mode 100644 app/src/main/res/drawable-v21/bg_shadow.xml create mode 100644 app/src/main/res/drawable-v21/fast_scroll_thumb.xml create mode 100644 app/src/main/res/drawable-v21/progress_determinate.xml create mode 100644 app/src/main/res/values/default_color.xml diff --git a/app/build.gradle b/app/build.gradle index 7faeaddf3..aecd21ea7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,7 +102,9 @@ dependencies { implementation "com.squareup.retrofit2:adapter-rxjava2:${vRetrofit}" def vOkHttp = '3.12.7' - implementation "com.squareup.okhttp3:okhttp:${vOkHttp}" + implementation("com.squareup.okhttp3:okhttp:${vOkHttp}") { + force = true + } implementation "com.squareup.okhttp3:logging-interceptor:${vOkHttp}" def vMoshi = '1.9.2' diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseUIActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseUIActivity.kt index 45a251626..a5a2e877d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseUIActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseUIActivity.kt @@ -15,7 +15,7 @@ abstract class BaseUIActivity protected lateinit var binding: Binding protected abstract val layoutRes: Int - protected abstract val viewModel: ViewModel + abstract val viewModel: ViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/res/drawable-v21/bg_appbar.xml b/app/src/main/res/drawable-v21/bg_appbar.xml new file mode 100644 index 000000000..264dc253c --- /dev/null +++ b/app/src/main/res/drawable-v21/bg_appbar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v21/bg_card.xml b/app/src/main/res/drawable-v21/bg_card.xml new file mode 100644 index 000000000..57de59736 --- /dev/null +++ b/app/src/main/res/drawable-v21/bg_card.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/bg_divider_rounded_on_primary.xml b/app/src/main/res/drawable-v21/bg_divider_rounded_on_primary.xml new file mode 100644 index 000000000..783719e7d --- /dev/null +++ b/app/src/main/res/drawable-v21/bg_divider_rounded_on_primary.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/bg_shadow.xml b/app/src/main/res/drawable-v21/bg_shadow.xml new file mode 100644 index 000000000..4f7bd989b --- /dev/null +++ b/app/src/main/res/drawable-v21/bg_shadow.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/fast_scroll_thumb.xml b/app/src/main/res/drawable-v21/fast_scroll_thumb.xml new file mode 100644 index 000000000..19c3590fa --- /dev/null +++ b/app/src/main/res/drawable-v21/fast_scroll_thumb.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v21/progress_determinate.xml b/app/src/main/res/drawable-v21/progress_determinate.xml new file mode 100644 index 000000000..95b275b5d --- /dev/null +++ b/app/src/main/res/drawable-v21/progress_determinate.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_appbar.xml b/app/src/main/res/drawable/bg_appbar.xml index 264dc253c..9e8232951 100644 --- a/app/src/main/res/drawable/bg_appbar.xml +++ b/app/src/main/res/drawable/bg_appbar.xml @@ -2,13 +2,13 @@ - + - + diff --git a/app/src/main/res/drawable/bg_card.xml b/app/src/main/res/drawable/bg_card.xml index 57de59736..66b0213d7 100644 --- a/app/src/main/res/drawable/bg_card.xml +++ b/app/src/main/res/drawable/bg_card.xml @@ -3,6 +3,6 @@ android:shape="rectangle"> - \ No newline at end of file + android:endColor="@color/defColorSurface" + android:startColor="@color/defColorSurfaceVariant" /> + diff --git a/app/src/main/res/drawable/bg_divider_rounded_on_primary.xml b/app/src/main/res/drawable/bg_divider_rounded_on_primary.xml index 783719e7d..a33cc5fee 100644 --- a/app/src/main/res/drawable/bg_divider_rounded_on_primary.xml +++ b/app/src/main/res/drawable/bg_divider_rounded_on_primary.xml @@ -3,5 +3,5 @@ android:shape="rectangle"> - - \ No newline at end of file + + diff --git a/app/src/main/res/drawable/bg_selectable.xml b/app/src/main/res/drawable/bg_selectable.xml index c7bb35a7f..b626ec142 100644 --- a/app/src/main/res/drawable/bg_selectable.xml +++ b/app/src/main/res/drawable/bg_selectable.xml @@ -3,7 +3,7 @@ - + @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/drawable/bg_selectable_borderless.xml b/app/src/main/res/drawable/bg_selectable_borderless.xml index c7bb35a7f..b626ec142 100644 --- a/app/src/main/res/drawable/bg_selectable_borderless.xml +++ b/app/src/main/res/drawable/bg_selectable_borderless.xml @@ -3,7 +3,7 @@ - + @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/drawable/bg_shadow.xml b/app/src/main/res/drawable/bg_shadow.xml index 4f7bd989b..5d6c86bcf 100644 --- a/app/src/main/res/drawable/bg_shadow.xml +++ b/app/src/main/res/drawable/bg_shadow.xml @@ -3,6 +3,6 @@ android:shape="rectangle"> - \ No newline at end of file + diff --git a/app/src/main/res/drawable/fast_scroll_thumb.xml b/app/src/main/res/drawable/fast_scroll_thumb.xml index 19c3590fa..f0ae9cd31 100644 --- a/app/src/main/res/drawable/fast_scroll_thumb.xml +++ b/app/src/main/res/drawable/fast_scroll_thumb.xml @@ -4,14 +4,14 @@ - + - + diff --git a/app/src/main/res/drawable/progress_determinate.xml b/app/src/main/res/drawable/progress_determinate.xml index 95b275b5d..c50466498 100644 --- a/app/src/main/res/drawable/progress_determinate.xml +++ b/app/src/main/res/drawable/progress_determinate.xml @@ -10,7 +10,7 @@ - + @@ -18,9 +18,9 @@ - + - \ No newline at end of file + diff --git a/app/src/main/res/values/default_color.xml b/app/src/main/res/values/default_color.xml new file mode 100644 index 000000000..93203ddd0 --- /dev/null +++ b/app/src/main/res/values/default_color.xml @@ -0,0 +1,24 @@ + + + + #4EAFF5 + #804EAFF5 + #3E78AF + #803E78AF + #F9F9F9 + #E8E8E8 + @color/defColorOnSurface + #F9F9F9 + #D9E6E6E6 + #F9F9F9 + @color/defColorOnSurface + #CC0047 + #F9F9F9 + #444444 + #80444444 + #808080 + #66808080 + From 7532477a2fccb13ee0f68166500a10911d1de389 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Wed, 15 Jan 2020 00:51:27 +0800 Subject: [PATCH 242/254] Make release builds work --- app/proguard-rules.pro | 12 +++--------- .../com/topjohnwu/magisk/core/GeneralReceiver.kt | 12 ++++-------- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 187850117..44ae7fed2 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -23,21 +23,15 @@ void onResponse(int); } -# Keep all fragment constructors --keepclassmembers class * extends androidx.fragment.app.Fragment { - public (...); -} +# Fragments +-keep,allowobfuscation class * extends androidx.fragment.app.Fragment -# DelegateWorker +# BaseWorkerWrapper -keep,allowobfuscation class * extends com.topjohnwu.magisk.core.base.BaseWorkerWrapper # BootSigner -keep class a.a { *; } -# Workaround R8 bug --keep,allowobfuscation class com.topjohnwu.magisk.core.GeneralReceiver --keepclassmembers class a.e { *; } - # Strip logging -assumenosideeffects class timber.log.Timber.Tree { *; } diff --git a/app/src/main/java/com/topjohnwu/magisk/core/GeneralReceiver.kt b/app/src/main/java/com/topjohnwu/magisk/core/GeneralReceiver.kt index bb2c0eb4a..ac0c384fe 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/GeneralReceiver.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/GeneralReceiver.kt @@ -5,12 +5,12 @@ import android.content.Intent import com.topjohnwu.magisk.core.base.BaseReceiver import com.topjohnwu.magisk.core.download.DownloadService import com.topjohnwu.magisk.core.magiskdb.PolicyDao -import com.topjohnwu.magisk.core.su.SuCallbackHandler -import com.topjohnwu.magisk.extensions.reboot import com.topjohnwu.magisk.core.model.ManagerJson +import com.topjohnwu.magisk.core.su.SuCallbackHandler +import com.topjohnwu.magisk.core.view.Shortcuts +import com.topjohnwu.magisk.extensions.reboot import com.topjohnwu.magisk.model.entity.internal.Configuration import com.topjohnwu.magisk.model.entity.internal.DownloadSubject -import com.topjohnwu.magisk.core.view.Shortcuts import com.topjohnwu.superuser.Shell import org.koin.core.inject @@ -27,11 +27,7 @@ open class GeneralReceiver : BaseReceiver() { when (intent.action ?: return) { Intent.ACTION_REBOOT -> { - SuCallbackHandler( - context, - intent.getStringExtra("action"), - intent.extras - ) + SuCallbackHandler(context, intent.getStringExtra("action"), intent.extras) } Intent.ACTION_PACKAGE_REPLACED -> { // This will only work pre-O From 087ccd69c93ce4d5a5f2d9f2e4ad2dec1f0d4338 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Thu, 16 Jan 2020 00:07:40 +0800 Subject: [PATCH 243/254] Cleanup resources --- .../res/drawable-v21/avd_chevron_more.xml | 29 --------- .../res/drawable-v21/avd_more_chevron.xml | 29 --------- .../res/drawable-v21/ic_more_collapse.xml | 23 ------- .../res/drawable-v26/sc_cloud_download.xml | 9 --- app/src/main/res/drawable/ic_add.xml | 9 --- app/src/main/res/drawable/ic_arrow.xml | 13 ---- app/src/main/res/drawable/ic_arrow_down.xml | 10 --- app/src/main/res/drawable/ic_bug_report.xml | 9 --- app/src/main/res/drawable/ic_cancel.xml | 9 --- app/src/main/res/drawable/ic_check_circle.xml | 9 --- .../main/res/drawable/ic_chevron_down_md2.xml | 10 --- .../main/res/drawable/ic_cloud_download.xml | 9 --- .../main/res/drawable/ic_delete_restore.xml | 5 -- app/src/main/res/drawable/ic_dots_md2.xml | 10 --- .../res/drawable/ic_file_download_black.xml | 9 --- app/src/main/res/drawable/ic_help.xml | 9 --- app/src/main/res/drawable/ic_menu.xml | 10 --- .../main/res/drawable/ic_notifications.xml | 9 --- app/src/main/res/drawable/ic_safetynet.xml | 5 -- app/src/main/res/drawable/ic_save.xml | 9 --- app/src/main/res/drawable/ic_settings.xml | 9 --- app/src/main/res/drawable/ic_sort.xml | 9 --- app/src/main/res/drawable/ic_test.xml | 10 --- app/src/main/res/drawable/ic_undelete.xml | 9 --- app/src/main/res/drawable/ic_update.xml | 4 -- app/src/main/res/drawable/ic_warning.xml | 9 --- .../main/res/drawable/indicator_primary.xml | 9 --- .../main/res/drawable/sc_cloud_download.xml | 13 ---- app/src/main/res/layout/alert_dialog.xml | 65 ------------------- app/src/main/res/layout/markdown_window.xml | 14 ---- app/src/main/res/menu/menu_hide_item.xml | 9 --- app/src/main/res/menu/menu_invisible.xml | 8 --- app/src/main/res/menu/menu_reboot.xml | 30 --------- app/src/main/res/menu/menu_repo.xml | 17 ----- app/src/main/res/values-sw600dp/dimens.xml | 4 -- 35 files changed, 453 deletions(-) delete mode 100644 app/src/main/res/drawable-v21/avd_chevron_more.xml delete mode 100644 app/src/main/res/drawable-v21/avd_more_chevron.xml delete mode 100644 app/src/main/res/drawable-v21/ic_more_collapse.xml delete mode 100644 app/src/main/res/drawable-v26/sc_cloud_download.xml delete mode 100644 app/src/main/res/drawable/ic_add.xml delete mode 100644 app/src/main/res/drawable/ic_arrow.xml delete mode 100644 app/src/main/res/drawable/ic_arrow_down.xml delete mode 100644 app/src/main/res/drawable/ic_bug_report.xml delete mode 100644 app/src/main/res/drawable/ic_cancel.xml delete mode 100644 app/src/main/res/drawable/ic_check_circle.xml delete mode 100644 app/src/main/res/drawable/ic_chevron_down_md2.xml delete mode 100644 app/src/main/res/drawable/ic_cloud_download.xml delete mode 100644 app/src/main/res/drawable/ic_delete_restore.xml delete mode 100644 app/src/main/res/drawable/ic_dots_md2.xml delete mode 100644 app/src/main/res/drawable/ic_file_download_black.xml delete mode 100644 app/src/main/res/drawable/ic_help.xml delete mode 100644 app/src/main/res/drawable/ic_menu.xml delete mode 100644 app/src/main/res/drawable/ic_notifications.xml delete mode 100644 app/src/main/res/drawable/ic_safetynet.xml delete mode 100644 app/src/main/res/drawable/ic_save.xml delete mode 100644 app/src/main/res/drawable/ic_settings.xml delete mode 100644 app/src/main/res/drawable/ic_sort.xml delete mode 100644 app/src/main/res/drawable/ic_test.xml delete mode 100644 app/src/main/res/drawable/ic_undelete.xml delete mode 100644 app/src/main/res/drawable/ic_update.xml delete mode 100644 app/src/main/res/drawable/ic_warning.xml delete mode 100644 app/src/main/res/drawable/indicator_primary.xml delete mode 100644 app/src/main/res/drawable/sc_cloud_download.xml delete mode 100644 app/src/main/res/layout/alert_dialog.xml delete mode 100644 app/src/main/res/layout/markdown_window.xml delete mode 100644 app/src/main/res/menu/menu_hide_item.xml delete mode 100644 app/src/main/res/menu/menu_invisible.xml delete mode 100644 app/src/main/res/menu/menu_reboot.xml delete mode 100644 app/src/main/res/menu/menu_repo.xml delete mode 100644 app/src/main/res/values-sw600dp/dimens.xml diff --git a/app/src/main/res/drawable-v21/avd_chevron_more.xml b/app/src/main/res/drawable-v21/avd_chevron_more.xml deleted file mode 100644 index 91ec08f53..000000000 --- a/app/src/main/res/drawable-v21/avd_chevron_more.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/avd_more_chevron.xml b/app/src/main/res/drawable-v21/avd_more_chevron.xml deleted file mode 100644 index 8c2e437d6..000000000 --- a/app/src/main/res/drawable-v21/avd_more_chevron.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/ic_more_collapse.xml b/app/src/main/res/drawable-v21/ic_more_collapse.xml deleted file mode 100644 index d436b8308..000000000 --- a/app/src/main/res/drawable-v21/ic_more_collapse.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v26/sc_cloud_download.xml b/app/src/main/res/drawable-v26/sc_cloud_download.xml deleted file mode 100644 index 3d3c9114a..000000000 --- a/app/src/main/res/drawable-v26/sc_cloud_download.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_add.xml b/app/src/main/res/drawable/ic_add.xml deleted file mode 100644 index 0258249cc..000000000 --- a/app/src/main/res/drawable/ic_add.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_arrow.xml b/app/src/main/res/drawable/ic_arrow.xml deleted file mode 100644 index 46fd51124..000000000 --- a/app/src/main/res/drawable/ic_arrow.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_arrow_down.xml b/app/src/main/res/drawable/ic_arrow_down.xml deleted file mode 100644 index 569d3a745..000000000 --- a/app/src/main/res/drawable/ic_arrow_down.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bug_report.xml b/app/src/main/res/drawable/ic_bug_report.xml deleted file mode 100644 index 0ac39ddc1..000000000 --- a/app/src/main/res/drawable/ic_bug_report.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_cancel.xml b/app/src/main/res/drawable/ic_cancel.xml deleted file mode 100644 index e6545bf8a..000000000 --- a/app/src/main/res/drawable/ic_cancel.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_check_circle.xml b/app/src/main/res/drawable/ic_check_circle.xml deleted file mode 100644 index 45d1b3076..000000000 --- a/app/src/main/res/drawable/ic_check_circle.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_chevron_down_md2.xml b/app/src/main/res/drawable/ic_chevron_down_md2.xml deleted file mode 100644 index c6b418a90..000000000 --- a/app/src/main/res/drawable/ic_chevron_down_md2.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_cloud_download.xml b/app/src/main/res/drawable/ic_cloud_download.xml deleted file mode 100644 index a198cf0a1..000000000 --- a/app/src/main/res/drawable/ic_cloud_download.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_delete_restore.xml b/app/src/main/res/drawable/ic_delete_restore.xml deleted file mode 100644 index 9ad463424..000000000 --- a/app/src/main/res/drawable/ic_delete_restore.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_dots_md2.xml b/app/src/main/res/drawable/ic_dots_md2.xml deleted file mode 100644 index ef907257c..000000000 --- a/app/src/main/res/drawable/ic_dots_md2.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_file_download_black.xml b/app/src/main/res/drawable/ic_file_download_black.xml deleted file mode 100644 index d05655222..000000000 --- a/app/src/main/res/drawable/ic_file_download_black.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_help.xml b/app/src/main/res/drawable/ic_help.xml deleted file mode 100644 index 98d384f8b..000000000 --- a/app/src/main/res/drawable/ic_help.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_menu.xml b/app/src/main/res/drawable/ic_menu.xml deleted file mode 100644 index d1bac8735..000000000 --- a/app/src/main/res/drawable/ic_menu.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_notifications.xml b/app/src/main/res/drawable/ic_notifications.xml deleted file mode 100644 index be9f8368d..000000000 --- a/app/src/main/res/drawable/ic_notifications.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_safetynet.xml b/app/src/main/res/drawable/ic_safetynet.xml deleted file mode 100644 index f47a5deae..000000000 --- a/app/src/main/res/drawable/ic_safetynet.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_save.xml b/app/src/main/res/drawable/ic_save.xml deleted file mode 100644 index fed1b783b..000000000 --- a/app/src/main/res/drawable/ic_save.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml deleted file mode 100644 index ace746c40..000000000 --- a/app/src/main/res/drawable/ic_settings.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_sort.xml b/app/src/main/res/drawable/ic_sort.xml deleted file mode 100644 index c872f6bd2..000000000 --- a/app/src/main/res/drawable/ic_sort.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_test.xml b/app/src/main/res/drawable/ic_test.xml deleted file mode 100644 index f0d3a427b..000000000 --- a/app/src/main/res/drawable/ic_test.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_undelete.xml b/app/src/main/res/drawable/ic_undelete.xml deleted file mode 100644 index 8546fea72..000000000 --- a/app/src/main/res/drawable/ic_undelete.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml deleted file mode 100644 index 91a4d5abf..000000000 --- a/app/src/main/res/drawable/ic_update.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml deleted file mode 100644 index 87e5f4ac4..000000000 --- a/app/src/main/res/drawable/ic_warning.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/indicator_primary.xml b/app/src/main/res/drawable/indicator_primary.xml deleted file mode 100644 index 0449886d8..000000000 --- a/app/src/main/res/drawable/indicator_primary.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/sc_cloud_download.xml b/app/src/main/res/drawable/sc_cloud_download.xml deleted file mode 100644 index 1a7dae048..000000000 --- a/app/src/main/res/drawable/sc_cloud_download.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/alert_dialog.xml b/app/src/main/res/layout/alert_dialog.xml deleted file mode 100644 index 3a9ef0268..000000000 --- a/app/src/main/res/layout/alert_dialog.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/markdown_window.xml b/app/src/main/res/layout/markdown_window.xml deleted file mode 100644 index f5b3d43be..000000000 --- a/app/src/main/res/layout/markdown_window.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_hide_item.xml b/app/src/main/res/menu/menu_hide_item.xml deleted file mode 100644 index 6973f2634..000000000 --- a/app/src/main/res/menu/menu_hide_item.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_invisible.xml b/app/src/main/res/menu/menu_invisible.xml deleted file mode 100644 index 3638f9a9a..000000000 --- a/app/src/main/res/menu/menu_invisible.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_reboot.xml b/app/src/main/res/menu/menu_reboot.xml deleted file mode 100644 index fe09fd480..000000000 --- a/app/src/main/res/menu/menu_reboot.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_repo.xml b/app/src/main/res/menu/menu_repo.xml deleted file mode 100644 index 38f3e5b23..000000000 --- a/app/src/main/res/menu/menu_repo.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml deleted file mode 100644 index 90ae789ca..000000000 --- a/app/src/main/res/values-sw600dp/dimens.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 24dp - \ No newline at end of file From e6f443cb2419ad2392b8b0fbd4d66d6ad78d6541 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Fri, 17 Jan 2020 00:40:16 +0800 Subject: [PATCH 244/254] More backwards compatibility --- app/src/main/res/drawable-v21/ic_bug_md2.xml | 23 -------- app/src/main/res/drawable-v21/ic_home_md2.xml | 23 -------- .../res/drawable-v21/ic_magisk_delete.xml | 23 -------- .../main/res/drawable-v21/ic_module_md2.xml | 23 -------- .../main/res/drawable-v21/ic_settings_md2.xml | 23 -------- .../res/drawable-v21/ic_superuser_md2.xml | 23 -------- .../avd_bug_from_filled.xml | 2 +- .../avd_bug_to_filled.xml | 2 +- .../drawable/avd_circle_check_from_filled.xml | 2 +- .../drawable/avd_circle_check_to_filled.xml | 2 +- .../res/drawable/avd_circle_from_filled.xml | 2 +- .../res/drawable/avd_circle_to_filled.xml | 2 +- .../avd_delete_magisk.xml | 54 +++++++++---------- .../avd_home_from_filled.xml | 2 +- .../avd_home_to_filled.xml | 2 +- .../avd_magisk_delete.xml | 40 +++++++------- .../avd_module_from_filled.xml | 2 +- .../avd_module_to_filled.xml | 2 +- .../avd_settings_from_filled.xml | 2 +- .../avd_settings_to_filled.xml | 2 +- .../avd_superuser_from_filled.xml | 2 +- .../avd_superuser_to_filled.xml | 2 +- app/src/main/res/drawable/ic_bug_md2.xml | 27 ++++++++-- app/src/main/res/drawable/ic_close.xml | 12 ----- app/src/main/res/drawable/ic_close_md2.xml | 6 ++- app/src/main/res/drawable/ic_home_md2.xml | 27 ++++++++-- .../main/res/drawable/ic_magisk_delete.xml | 23 ++++++-- app/src/main/res/drawable/ic_module_md2.xml | 27 ++++++++-- app/src/main/res/drawable/ic_settings_md2.xml | 27 ++++++++-- .../main/res/drawable/ic_superuser_md2.xml | 27 ++++++++-- .../main/res/layout/fragment_install_md2.xml | 6 +-- app/src/main/res/layout/item_hide_md2.xml | 2 +- 32 files changed, 198 insertions(+), 246 deletions(-) delete mode 100644 app/src/main/res/drawable-v21/ic_bug_md2.xml delete mode 100644 app/src/main/res/drawable-v21/ic_home_md2.xml delete mode 100644 app/src/main/res/drawable-v21/ic_magisk_delete.xml delete mode 100644 app/src/main/res/drawable-v21/ic_module_md2.xml delete mode 100644 app/src/main/res/drawable-v21/ic_settings_md2.xml delete mode 100644 app/src/main/res/drawable-v21/ic_superuser_md2.xml rename app/src/main/res/{drawable-v21 => drawable}/avd_bug_from_filled.xml (97%) rename app/src/main/res/{drawable-v21 => drawable}/avd_bug_to_filled.xml (97%) rename app/src/main/res/{drawable-v21 => drawable}/avd_delete_magisk.xml (92%) rename app/src/main/res/{drawable-v21 => drawable}/avd_home_from_filled.xml (94%) rename app/src/main/res/{drawable-v21 => drawable}/avd_home_to_filled.xml (94%) rename app/src/main/res/{drawable-v21 => drawable}/avd_magisk_delete.xml (94%) rename app/src/main/res/{drawable-v21 => drawable}/avd_module_from_filled.xml (98%) rename app/src/main/res/{drawable-v21 => drawable}/avd_module_to_filled.xml (98%) rename app/src/main/res/{drawable-v21 => drawable}/avd_settings_from_filled.xml (99%) rename app/src/main/res/{drawable-v21 => drawable}/avd_settings_to_filled.xml (99%) rename app/src/main/res/{drawable-v21 => drawable}/avd_superuser_from_filled.xml (94%) rename app/src/main/res/{drawable-v21 => drawable}/avd_superuser_to_filled.xml (95%) delete mode 100644 app/src/main/res/drawable/ic_close.xml diff --git a/app/src/main/res/drawable-v21/ic_bug_md2.xml b/app/src/main/res/drawable-v21/ic_bug_md2.xml deleted file mode 100644 index 8e18eacf0..000000000 --- a/app/src/main/res/drawable-v21/ic_bug_md2.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/ic_home_md2.xml b/app/src/main/res/drawable-v21/ic_home_md2.xml deleted file mode 100644 index a5d90b4d9..000000000 --- a/app/src/main/res/drawable-v21/ic_home_md2.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/ic_magisk_delete.xml b/app/src/main/res/drawable-v21/ic_magisk_delete.xml deleted file mode 100644 index 3feade979..000000000 --- a/app/src/main/res/drawable-v21/ic_magisk_delete.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/ic_module_md2.xml b/app/src/main/res/drawable-v21/ic_module_md2.xml deleted file mode 100644 index d93278f5b..000000000 --- a/app/src/main/res/drawable-v21/ic_module_md2.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/ic_settings_md2.xml b/app/src/main/res/drawable-v21/ic_settings_md2.xml deleted file mode 100644 index 9d294bff8..000000000 --- a/app/src/main/res/drawable-v21/ic_settings_md2.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/ic_superuser_md2.xml b/app/src/main/res/drawable-v21/ic_superuser_md2.xml deleted file mode 100644 index 374959c7c..000000000 --- a/app/src/main/res/drawable-v21/ic_superuser_md2.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/avd_bug_from_filled.xml b/app/src/main/res/drawable/avd_bug_from_filled.xml similarity index 97% rename from app/src/main/res/drawable-v21/avd_bug_from_filled.xml rename to app/src/main/res/drawable/avd_bug_from_filled.xml index b56ed84de..ec6640d2f 100644 --- a/app/src/main/res/drawable-v21/avd_bug_from_filled.xml +++ b/app/src/main/res/drawable/avd_bug_from_filled.xml @@ -18,7 +18,7 @@ - - - - - \ No newline at end of file + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_close.xml b/app/src/main/res/drawable/ic_close.xml deleted file mode 100644 index d76e3bf7a..000000000 --- a/app/src/main/res/drawable/ic_close.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_close_md2.xml b/app/src/main/res/drawable/ic_close_md2.xml index 78e1de996..786303ae0 100644 --- a/app/src/main/res/drawable/ic_close_md2.xml +++ b/app/src/main/res/drawable/ic_close_md2.xml @@ -1,10 +1,12 @@ - \ No newline at end of file + android:pathData="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" + tools:fillColor="#000" /> + diff --git a/app/src/main/res/drawable/ic_home_md2.xml b/app/src/main/res/drawable/ic_home_md2.xml index cc8b40c34..a5d90b4d9 100644 --- a/app/src/main/res/drawable/ic_home_md2.xml +++ b/app/src/main/res/drawable/ic_home_md2.xml @@ -1,6 +1,23 @@ - - - - - \ No newline at end of file + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_magisk_delete.xml b/app/src/main/res/drawable/ic_magisk_delete.xml index 5932b6150..3feade979 100644 --- a/app/src/main/res/drawable/ic_magisk_delete.xml +++ b/app/src/main/res/drawable/ic_magisk_delete.xml @@ -1,8 +1,23 @@ - + - + - + - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_module_md2.xml b/app/src/main/res/drawable/ic_module_md2.xml index 55d94eab3..d93278f5b 100644 --- a/app/src/main/res/drawable/ic_module_md2.xml +++ b/app/src/main/res/drawable/ic_module_md2.xml @@ -1,6 +1,23 @@ - - - - - \ No newline at end of file + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_settings_md2.xml b/app/src/main/res/drawable/ic_settings_md2.xml index 9df992937..9d294bff8 100644 --- a/app/src/main/res/drawable/ic_settings_md2.xml +++ b/app/src/main/res/drawable/ic_settings_md2.xml @@ -1,6 +1,23 @@ - - - - - \ No newline at end of file + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_superuser_md2.xml b/app/src/main/res/drawable/ic_superuser_md2.xml index 4d52c7577..374959c7c 100644 --- a/app/src/main/res/drawable/ic_superuser_md2.xml +++ b/app/src/main/res/drawable/ic_superuser_md2.xml @@ -1,6 +1,23 @@ - - - - - \ No newline at end of file + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_install_md2.xml b/app/src/main/res/layout/fragment_install_md2.xml index 50c1c3eb5..0c50d2fa6 100644 --- a/app/src/main/res/layout/fragment_install_md2.xml +++ b/app/src/main/res/layout/fragment_install_md2.xml @@ -193,7 +193,7 @@ style="@style/WidgetFoundation.RadioButton" android:layout_width="match_parent" android:layout_height="wrap_content" - android:button="@drawable/ic_radio_check_button" + app:buttonCompat="@drawable/ic_radio_check_button" android:text="@string/select_patch_file" /> diff --git a/app/src/main/res/layout/item_hide_md2.xml b/app/src/main/res/layout/item_hide_md2.xml index 37a92c37b..8ae1fc828 100644 --- a/app/src/main/res/layout/item_hide_md2.xml +++ b/app/src/main/res/layout/item_hide_md2.xml @@ -96,7 +96,7 @@ android:id="@+id/hide_expand_icon" style="@style/WidgetFoundation.Icon" invisible="@{item.item.processes.empty}" - srcCompat="@{item.isExpanded ? R.drawable.ic_close : R.drawable.ic_back_md2}" + srcCompat="@{item.isExpanded ? R.drawable.ic_close_md2 : R.drawable.ic_back_md2}" android:background="@null" android:rotation="180" android:rotationX="@{item.isExpanded ? 180 : 0}" From b95cf9b9a34a281b99822f9662d48b99121cb5c3 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Fri, 17 Jan 2020 17:02:40 +0800 Subject: [PATCH 245/254] Show detail descriptions in settings --- .../model/entity/recycler/SettingsItem.kt | 53 +++++++-------- .../magisk/ui/settings/SettingsItems.kt | 66 ++++++++++--------- .../topjohnwu/magisk/utils/TransitiveText.kt | 4 +- 3 files changed, 62 insertions(+), 61 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt index 41e551d52..a209b1905 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt @@ -19,19 +19,14 @@ import kotlin.reflect.KProperty sealed class SettingsItem : ObservableItem() { - @Bindable - open val icon: Int = 0 - @Bindable - open val title: TransitiveText = TransitiveText.empty - @Bindable - open val description: TransitiveText = TransitiveText.empty + open val icon: Int get() = 0 + open val title: TransitiveText get() = TransitiveText.EMPTY - var isEnabled = true - @Bindable get - set(value) { - field = value - notifyChange(BR.enabled) - } + @get:Bindable + open val description: TransitiveText get() = TransitiveText.EMPTY + + @get:Bindable + var isEnabled by bindable(true, BR.enabled) protected open val isFullSpan: Boolean = false @@ -41,8 +36,6 @@ sealed class SettingsItem : ObservableItem() { // notify only after the callback invocation; callback can invalidate the backing data, // which wouldn't be recognized with reverse approach - notifyChange(BR.icon) - notifyChange(BR.title) notifyChange(BR.description) } @@ -59,6 +52,17 @@ sealed class SettingsItem : ObservableItem() { override fun itemSameAs(other: SettingsItem) = this === other override fun contentSameAs(other: SettingsItem) = itemSameAs(other) + protected inline fun bindable( + initialValue: T, + fieldId: Int, + crossinline setter: (T) -> Unit = {} + ) = object : ObservableProperty(initialValue) { + override fun afterChange(property: KProperty<*>, oldValue: T, newValue: T) { + setter(newValue) + notifyChange(fieldId) + } + } + // --- interface Callback { @@ -70,18 +74,13 @@ sealed class SettingsItem : ObservableItem() { abstract class Value : SettingsItem() { + @get:Bindable abstract var value: T - @Bindable get - protected inline fun dataObservable( + protected inline fun bindableValue( initialValue: T, crossinline setter: (T) -> Unit - ) = object : ObservableProperty(initialValue) { - override fun afterChange(property: KProperty<*>, oldValue: T, newValue: T) { - setter(newValue) - notifyChange(BR.value) - } - } + ) = bindable(initialValue, BR.value, setter) } @@ -146,15 +145,15 @@ sealed class SettingsItem : ObservableItem() { protected val resources get() = get() - @Bindable var entries: Array = arrayOf() private set - @Bindable + var entryValues: Array = arrayOf() private set + @get:Bindable val selectedEntry - @Bindable get() = entries.getOrNull(value) + get() = entries.getOrNull(value) fun setValues( entries: Array, @@ -165,8 +164,6 @@ sealed class SettingsItem : ObservableItem() { this.entries = entries this.entryValues = values - notifyChange(BR.entries) - notifyChange(BR.entryValues) notifyChange(BR.selectedEntry) } @@ -206,4 +203,4 @@ sealed class SettingsItem : ObservableItem() { } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt index 31f6c5032..210ab97f8 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt @@ -12,17 +12,13 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.core.Config import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.core.Info -import com.topjohnwu.magisk.core.utils.availableLocales -import com.topjohnwu.magisk.core.utils.currentLocale -import com.topjohnwu.magisk.core.utils.refreshLocale +import com.topjohnwu.magisk.core.utils.* import com.topjohnwu.magisk.databinding.DialogSettingsAppNameBinding import com.topjohnwu.magisk.databinding.DialogSettingsDownloadPathBinding import com.topjohnwu.magisk.databinding.DialogSettingsUpdateChannelBinding import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.model.entity.recycler.SettingsItem -import com.topjohnwu.magisk.core.utils.BiometricHelper -import com.topjohnwu.magisk.core.utils.Utils import com.topjohnwu.magisk.utils.asTransitive import com.topjohnwu.superuser.Shell import java.io.File @@ -36,8 +32,8 @@ object Customization : SettingsItem.Section() { } object Language : SettingsItem.Selector() { - override var value by dataObservable(0) { - Config.locale = entryValues.getOrNull(it)?.toString() ?: return@dataObservable + override var value by bindableValue(0) { + Config.locale = entryValues.getOrNull(it)?.toString() ?: return@bindableValue refreshLocale() } @@ -108,7 +104,7 @@ fun HideOrRestore() = if (get().packageName == BuildConfig.APPLICATION_ID) Hide else Restore object DownloadPath : SettingsItem.Input() { - override var value: String by dataObservable(Config.downloadPath) { Config.downloadPath = it } + override var value: String by bindableValue(Config.downloadPath) { Config.downloadPath = it } override val title = R.string.settings_download_path_title.asTransitive() override val intermediate: String? get() = if (Utils.ensureDownloadPath(result) != null) result else null @@ -130,7 +126,7 @@ object DownloadPath : SettingsItem.Input() { } object GridSize : SettingsItem.Selector() { - override var value by dataObservable(Config.listSpanCount - 1) { + override var value by bindableValue(Config.listSpanCount - 1) { Config.listSpanCount = max(1, min(3, it + 1)) } @@ -146,7 +142,7 @@ object GridSize : SettingsItem.Selector() { } object UpdateChannel : SettingsItem.Selector() { - override var value by dataObservable(Config.updateChannel) { Config.updateChannel = it } + override var value by bindableValue(Config.updateChannel) { Config.updateChannel = it } override val title = R.string.settings_update_channel_title.asTransitive() init { @@ -163,7 +159,7 @@ object UpdateChannel : SettingsItem.Selector() { object UpdateChannelUrl : SettingsItem.Input() { override val title = R.string.settings_update_custom.asTransitive() - override var value: String by dataObservable(Config.customChannelUrl) { + override var value: String by bindableValue(Config.customChannelUrl) { Config.customChannelUrl = it } override val intermediate: String? get() = result @@ -186,7 +182,7 @@ object UpdateChannelUrl : SettingsItem.Input() { object UpdateChecker : SettingsItem.Toggle() { override val title = R.string.settings_check_update_title.asTransitive() override val description = R.string.settings_check_update_summary.asTransitive() - override var value by dataObservable(Config.checkUpdate) { + override var value by bindableValue(Config.checkUpdate) { Config.checkUpdate = it Utils.scheduleUpdateCheck(get()) } @@ -204,13 +200,14 @@ object SystemlessHosts : SettingsItem.Blank() { object Biometrics : SettingsItem.Toggle() { override val title = R.string.settings_su_biometric_title.asTransitive() - override val description = R.string.settings_su_biometric_summary.asTransitive() - override var value by dataObservable(Config.suBiometric) { Config.suBiometric = it } + override var value by bindableValue(Config.suBiometric) { Config.suBiometric = it } + override var description = R.string.settings_su_biometric_summary.asTransitive() override fun refresh() { isEnabled = BiometricHelper.isSupported && Utils.showSuperUser() if (!isEnabled) { value = false + description = R.string.no_biometric.asTransitive() } } } @@ -218,7 +215,7 @@ object Biometrics : SettingsItem.Toggle() { object Reauthenticate : SettingsItem.Toggle() { override val title = R.string.settings_su_reauth_title.asTransitive() override val description = R.string.settings_su_reauth_summary.asTransitive() - override var value by dataObservable(Config.suReAuth) { Config.suReAuth = it } + override var value by bindableValue(Config.suReAuth) { Config.suReAuth = it } override fun refresh() { isEnabled = Build.VERSION.SDK_INT < Build.VERSION_CODES.O && Utils.showSuperUser() @@ -233,9 +230,10 @@ object Magisk : SettingsItem.Section() { object SafeMode : SettingsItem.Toggle() { override val title = R.string.settings_safe_mode_title.asTransitive() - override val description = R.string.settings_safe_mode_summary.asTransitive() - override var value by dataObservable(Config.coreOnly) { - if (Config.coreOnly == it) return@dataObservable + // Use old placeholder for now, will update text once native implementation is changed + override val description = R.string.settings_core_only_summary.asTransitive() + override var value by bindableValue(Config.coreOnly) { + if (Config.coreOnly == it) return@bindableValue Config.coreOnly = it when { it -> runCatching { Const.MAGISK_DISABLE_FILE.createNewFile() } @@ -252,7 +250,7 @@ object SafeMode : SettingsItem.Toggle() { object MagiskHide : SettingsItem.Toggle() { override val title = R.string.magiskhide.asTransitive() override val description = R.string.settings_magiskhide_summary.asTransitive() - override var value by dataObservable(Config.magiskHide) { + override var value by bindableValue(Config.magiskHide) { Config.magiskHide = it when { it -> Shell.su("magiskhide --enable").submit() @@ -273,10 +271,10 @@ object Superuser : SettingsItem.Section() { object AccessMode : SettingsItem.Selector() { override val title = R.string.superuser_access.asTransitive() - override var value by dataObservable(Config.rootMode) { + override var value by bindableValue(Config.rootMode) { Config.rootMode = entryValues.getOrNull(it) ?.toString() - ?.toInt() ?: return@dataObservable + ?.toInt() ?: return@bindableValue } init { @@ -293,11 +291,14 @@ object AccessMode : SettingsItem.Selector() { object MultiuserMode : SettingsItem.Selector() { override val title = R.string.multiuser_mode.asTransitive() - override var value by dataObservable(Config.suMultiuserMode) { + override var value by bindableValue(Config.suMultiuserMode) { Config.suMultiuserMode = entryValues.getOrNull(it) ?.toString() - ?.toInt() ?: return@dataObservable + ?.toInt() ?: return@bindableValue } + private val descArray = resources.getStringArray(R.array.multiuser_summary) + override val description + get() = descArray[value].asTransitive() init { setValues( @@ -313,11 +314,14 @@ object MultiuserMode : SettingsItem.Selector() { object MountNamespaceMode : SettingsItem.Selector() { override val title = R.string.mount_namespace_mode.asTransitive() - override var value by dataObservable(Config.suMntNamespaceMode) { + override var value by bindableValue(Config.suMntNamespaceMode) { Config.suMntNamespaceMode = entryValues.getOrNull(it) ?.toString() - ?.toInt() ?: return@dataObservable + ?.toInt() ?: return@bindableValue } + private val descArray = resources.getStringArray(R.array.namespace_summary) + override val description + get() = descArray[value].asTransitive() init { setValues( @@ -333,10 +337,10 @@ object MountNamespaceMode : SettingsItem.Selector() { object AutomaticResponse : SettingsItem.Selector() { override val title = R.string.auto_response.asTransitive() - override var value by dataObservable(Config.suAutoReponse) { + override var value by bindableValue(Config.suAutoReponse) { Config.suAutoReponse = entryValues.getOrNull(it) ?.toString() - ?.toInt() ?: return@dataObservable + ?.toInt() ?: return@bindableValue } init { @@ -353,10 +357,10 @@ object AutomaticResponse : SettingsItem.Selector() { object RequestTimeout : SettingsItem.Selector() { override val title = R.string.request_timeout.asTransitive() - override var value by dataObservable(-1) { + override var value by bindableValue(-1) { Config.suDefaultTimeout = entryValues.getOrNull(it) ?.toString() - ?.toInt() ?: return@dataObservable + ?.toInt() ?: return@bindableValue } init { @@ -375,10 +379,10 @@ object RequestTimeout : SettingsItem.Selector() { object SUNotification : SettingsItem.Selector() { override val title = R.string.superuser_notification.asTransitive() - override var value by dataObservable(Config.suNotification) { + override var value by bindableValue(Config.suNotification) { Config.suNotification = entryValues.getOrNull(it) ?.toString() - ?.toInt() ?: return@dataObservable + ?.toInt() ?: return@bindableValue } init { diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/TransitiveText.kt b/app/src/main/java/com/topjohnwu/magisk/utils/TransitiveText.kt index f901a5889..9ff4efa6a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/TransitiveText.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/TransitiveText.kt @@ -35,7 +35,7 @@ sealed class TransitiveText { // --- companion object { - val empty = String("") + val EMPTY = String("") } } @@ -51,4 +51,4 @@ fun TextView.setText(text: TransitiveText) { } @InverseBindingAdapter(attribute = "android:text", event = "android:textAttrChanged") -fun TextView.getTransitiveText() = text.asTransitive() \ No newline at end of file +fun TextView.getTransitiveText() = text.asTransitive() From cae43b26f4947e27777b166bf494de468172656e Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sat, 18 Jan 2020 01:34:46 +0800 Subject: [PATCH 246/254] Improve settings item code --- .../model/entity/recycler/SettingsItem.kt | 23 +-- .../magisk/ui/settings/SettingsItems.kt | 156 +++++++----------- 2 files changed, 61 insertions(+), 118 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt index a209b1905..aa7858d6a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt @@ -28,7 +28,7 @@ sealed class SettingsItem : ObservableItem() { @get:Bindable var isEnabled by bindable(true, BR.enabled) - protected open val isFullSpan: Boolean = false + protected open val isFullSpan get() = false @CallSuper open fun onPressed(view: View, callback: Callback) { @@ -145,28 +145,13 @@ sealed class SettingsItem : ObservableItem() { protected val resources get() = get() - var entries: Array = arrayOf() - private set - - var entryValues: Array = arrayOf() - private set + abstract val entries: Array + abstract val entryValues: Array @get:Bindable val selectedEntry get() = entries.getOrNull(value) - fun setValues( - entries: Array, - values: Array - ) { - check(entries.size <= values.size) { "List sizes must match" } - - this.entries = entries - this.entryValues = values - - notifyChange(BR.selectedEntry) - } - override fun onPressed(view: View, callback: Callback) { if (entries.isEmpty() || entryValues.isEmpty()) return callback.onItemPressed(view, this) @@ -199,7 +184,7 @@ sealed class SettingsItem : ObservableItem() { abstract class Section : SettingsItem() { override val layoutRes = R.layout.item_settings_section - override val isFullSpan = true + override val isFullSpan get() = true } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt index 210ab97f8..c80f92d71 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt @@ -33,19 +33,21 @@ object Customization : SettingsItem.Section() { object Language : SettingsItem.Selector() { override var value by bindableValue(0) { - Config.locale = entryValues.getOrNull(it)?.toString() ?: return@bindableValue + Config.locale = entryValues[it] refreshLocale() } override val title = R.string.language.asTransitive() + override var entries = arrayOf() + override var entryValues = arrayOf() init { availableLocales.subscribeK { (names, values) -> - setValues(names, values) - val selectedLocale = currentLocale.getDisplayName( - currentLocale - ) + entries = names + entryValues = values + val selectedLocale = currentLocale.getDisplayName(currentLocale) value = names.indexOfFirst { it == selectedLocale }.let { if (it == -1) 0 else it } + notifyChange(BR.selectedEntry) } } } @@ -80,8 +82,9 @@ object Hide : SettingsItem.Input() { notifyChange(BR.value) notifyChange(BR.error) } - val isError - @Bindable get() = value.length > 14 || value.isBlank() + + @get:Bindable + val isError get() = value.length > 14 || value.isBlank() override val intermediate: String? get() = if (isError) null else value @@ -108,18 +111,18 @@ object DownloadPath : SettingsItem.Input() { override val title = R.string.settings_download_path_title.asTransitive() override val intermediate: String? get() = if (Utils.ensureDownloadPath(result) != null) result else null + + @get:Bindable var result = value - @Bindable get set(value) { field = value notifyChange(BR.result) notifyChange(BR.path) } + + @get:Bindable val path - @Bindable get() = File( - Environment.getExternalStorageDirectory(), - result - ).absolutePath.orEmpty() + get() = File(Environment.getExternalStorageDirectory(), result).absolutePath.orEmpty() override fun getView(context: Context) = DialogSettingsDownloadPathBinding .inflate(LayoutInflater.from(context)).also { it.data = this }.root @@ -132,40 +135,28 @@ object GridSize : SettingsItem.Selector() { override val title = R.string.settings_grid_span_count_title.asTransitive() override val description = R.string.settings_grid_span_count_summary.asTransitive() - - init { - setValues( - resources.getStringArray(R.array.span_count), - resources.getStringArray(R.array.value_array) - ) - } + override val entries = resources.getStringArray(R.array.span_count) + override val entryValues = resources.getStringArray(R.array.value_array) } object UpdateChannel : SettingsItem.Selector() { override var value by bindableValue(Config.updateChannel) { Config.updateChannel = it } - override val title = R.string.settings_update_channel_title.asTransitive() - init { - val entries = resources.getStringArray(R.array.update_channel).let { - if (!Utils.isCanary && Config.updateChannel < Config.Value.CANARY_CHANNEL) - it.take(it.size - 2).toTypedArray() else it - } - setValues( - entries, - resources.getStringArray(R.array.value_array) - ) + override val title = R.string.settings_update_channel_title.asTransitive() + override val entries = resources.getStringArray(R.array.update_channel).let { + if (!Utils.isCanary && Config.updateChannel < Config.Value.CANARY_CHANNEL) + it.take(it.size - 2).toTypedArray() else it } + override val entryValues = resources.getStringArray(R.array.value_array) } object UpdateChannelUrl : SettingsItem.Input() { override val title = R.string.settings_update_custom.asTransitive() - override var value: String by bindableValue(Config.customChannelUrl) { - Config.customChannelUrl = it - } + override var value by bindableValue(Config.customChannelUrl) { Config.customChannelUrl = it } override val intermediate: String? get() = result + @get:Bindable var result = value - @Bindable get set(value) { field = value notifyChange(BR.result) @@ -271,17 +262,11 @@ object Superuser : SettingsItem.Section() { object AccessMode : SettingsItem.Selector() { override val title = R.string.superuser_access.asTransitive() - override var value by bindableValue(Config.rootMode) { - Config.rootMode = entryValues.getOrNull(it) - ?.toString() - ?.toInt() ?: return@bindableValue - } + override val entries = resources.getStringArray(R.array.su_access) + override val entryValues = resources.getStringArray(R.array.value_array) - init { - setValues( - resources.getStringArray(R.array.su_access), - resources.getStringArray(R.array.value_array) - ) + override var value by bindableValue(Config.rootMode) { + Config.rootMode = entryValues[it].toInt() } override fun refresh() { @@ -291,22 +276,17 @@ object AccessMode : SettingsItem.Selector() { object MultiuserMode : SettingsItem.Selector() { override val title = R.string.multiuser_mode.asTransitive() - override var value by bindableValue(Config.suMultiuserMode) { - Config.suMultiuserMode = entryValues.getOrNull(it) - ?.toString() - ?.toInt() ?: return@bindableValue - } + override val entries = resources.getStringArray(R.array.multiuser_mode) + override val entryValues = resources.getStringArray(R.array.value_array) private val descArray = resources.getStringArray(R.array.multiuser_summary) + + override var value by bindableValue(Config.suMultiuserMode) { + Config.suMultiuserMode = entryValues[it].toInt() + } + override val description get() = descArray[value].asTransitive() - init { - setValues( - resources.getStringArray(R.array.multiuser_mode), - resources.getStringArray(R.array.value_array) - ) - } - override fun refresh() { isEnabled = Const.USER_ID <= 0 && Utils.showSuperUser() } @@ -314,22 +294,17 @@ object MultiuserMode : SettingsItem.Selector() { object MountNamespaceMode : SettingsItem.Selector() { override val title = R.string.mount_namespace_mode.asTransitive() - override var value by bindableValue(Config.suMntNamespaceMode) { - Config.suMntNamespaceMode = entryValues.getOrNull(it) - ?.toString() - ?.toInt() ?: return@bindableValue - } + override val entries = resources.getStringArray(R.array.namespace) + override val entryValues = resources.getStringArray(R.array.value_array) private val descArray = resources.getStringArray(R.array.namespace_summary) + + override var value by bindableValue(Config.suMntNamespaceMode) { + Config.suMntNamespaceMode = entryValues[it].toInt() + } + override val description get() = descArray[value].asTransitive() - init { - setValues( - resources.getStringArray(R.array.namespace), - resources.getStringArray(R.array.value_array) - ) - } - override fun refresh() { isEnabled = Utils.showSuperUser() } @@ -337,17 +312,11 @@ object MountNamespaceMode : SettingsItem.Selector() { object AutomaticResponse : SettingsItem.Selector() { override val title = R.string.auto_response.asTransitive() - override var value by bindableValue(Config.suAutoReponse) { - Config.suAutoReponse = entryValues.getOrNull(it) - ?.toString() - ?.toInt() ?: return@bindableValue - } + override val entries = resources.getStringArray(R.array.auto_response) + override val entryValues = resources.getStringArray(R.array.value_array) - init { - setValues( - resources.getStringArray(R.array.auto_response), - resources.getStringArray(R.array.value_array) - ) + override var value by bindableValue(Config.suAutoReponse) { + Config.suAutoReponse = entryValues[it].toInt() } override fun refresh() { @@ -357,20 +326,15 @@ object AutomaticResponse : SettingsItem.Selector() { object RequestTimeout : SettingsItem.Selector() { override val title = R.string.request_timeout.asTransitive() - override var value by bindableValue(-1) { - Config.suDefaultTimeout = entryValues.getOrNull(it) - ?.toString() - ?.toInt() ?: return@bindableValue + override val entries = resources.getStringArray(R.array.request_timeout) + override val entryValues = resources.getStringArray(R.array.request_timeout_value) + + override var value by bindableValue(selected) { + Config.suDefaultTimeout = entryValues[it].toInt() } - init { - setValues( - resources.getStringArray(R.array.request_timeout), - resources.getStringArray(R.array.request_timeout_value) - ) - val currentValue = Config.suDefaultTimeout.toString() - value = entryValues.indexOfFirst { it == currentValue } - } + private val selected: Int + get() = entryValues.indexOfFirst { it.toInt() == Config.suDefaultTimeout } override fun refresh() { isEnabled = Utils.showSuperUser() @@ -379,17 +343,11 @@ object RequestTimeout : SettingsItem.Selector() { object SUNotification : SettingsItem.Selector() { override val title = R.string.superuser_notification.asTransitive() - override var value by bindableValue(Config.suNotification) { - Config.suNotification = entryValues.getOrNull(it) - ?.toString() - ?.toInt() ?: return@bindableValue - } + override val entries = resources.getStringArray(R.array.su_notification) + override val entryValues = resources.getStringArray(R.array.value_array) - init { - setValues( - resources.getStringArray(R.array.su_notification), - resources.getStringArray(R.array.value_array) - ) + override var value by bindableValue(Config.suNotification) { + Config.suNotification = entryValues[it].toInt() } override fun refresh() { From e4bcdbd0c4e693d476ec0f5bea4508269995d95c Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sat, 18 Jan 2020 03:06:33 +0800 Subject: [PATCH 247/254] Make settings page more reasonable --- .../topjohnwu/magisk/ui/base/CompatHelpers.kt | 6 +- .../magisk/ui/settings/SettingsItems.kt | 40 +---------- .../magisk/ui/settings/SettingsViewModel.kt | 66 +++++++++++++++---- 3 files changed, 60 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatHelpers.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatHelpers.kt index 27fd8c3dc..62ed84dcd 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatHelpers.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatHelpers.kt @@ -10,10 +10,14 @@ import me.tatarka.bindingcollectionadapter2.OnItemBind inline fun > diffListOf( vararg newItems: T +) = diffListOf(newItems.toList()) + +inline fun > diffListOf( + newItems: List ) = DiffObservableList(object : DiffObservableList.Callback { override fun areItemsTheSame(oldItem: T, newItem: T) = oldItem.genericItemSameAs(newItem) override fun areContentsTheSame(oldItem: T, newItem: T) = oldItem.genericContentSameAs(newItem) -}).also { it.update(newItems.toList()) } +}).also { it.update(newItems) } inline fun > filterableListOf( vararg newItems: T diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt index c80f92d71..87b6b73b1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt @@ -91,10 +91,6 @@ object Hide : SettingsItem.Input() { override fun getView(context: Context) = DialogSettingsAppNameBinding .inflate(LayoutInflater.from(context)).also { it.data = this }.root - - override fun refresh() { - isEnabled = Info.env.isActive - } } object Restore : SettingsItem.Blank() { @@ -183,10 +179,6 @@ object UpdateChecker : SettingsItem.Toggle() { object SystemlessHosts : SettingsItem.Blank() { override val title = R.string.settings_hosts_title.asTransitive() override val description = R.string.settings_hosts_summary.asTransitive() - - override fun refresh() { - isEnabled = Info.env.isActive - } } object Biometrics : SettingsItem.Toggle() { @@ -195,7 +187,7 @@ object Biometrics : SettingsItem.Toggle() { override var description = R.string.settings_su_biometric_summary.asTransitive() override fun refresh() { - isEnabled = BiometricHelper.isSupported && Utils.showSuperUser() + isEnabled = BiometricHelper.isSupported if (!isEnabled) { value = false description = R.string.no_biometric.asTransitive() @@ -232,10 +224,6 @@ object SafeMode : SettingsItem.Toggle() { } Utils.toast(R.string.settings_reboot_toast, Toast.LENGTH_LONG) } - - override fun refresh() { - isEnabled = Info.env.isActive - } } object MagiskHide : SettingsItem.Toggle() { @@ -248,10 +236,6 @@ object MagiskHide : SettingsItem.Toggle() { else -> Shell.su("magiskhide --disable").submit() } } - - override fun refresh() { - isEnabled = Info.env.isActive - } } // --- Superuser @@ -268,10 +252,6 @@ object AccessMode : SettingsItem.Selector() { override var value by bindableValue(Config.rootMode) { Config.rootMode = entryValues[it].toInt() } - - override fun refresh() { - isEnabled = Utils.showSuperUser() - } } object MultiuserMode : SettingsItem.Selector() { @@ -288,7 +268,7 @@ object MultiuserMode : SettingsItem.Selector() { get() = descArray[value].asTransitive() override fun refresh() { - isEnabled = Const.USER_ID <= 0 && Utils.showSuperUser() + isEnabled = Const.USER_ID == 0 } } @@ -304,10 +284,6 @@ object MountNamespaceMode : SettingsItem.Selector() { override val description get() = descArray[value].asTransitive() - - override fun refresh() { - isEnabled = Utils.showSuperUser() - } } object AutomaticResponse : SettingsItem.Selector() { @@ -318,10 +294,6 @@ object AutomaticResponse : SettingsItem.Selector() { override var value by bindableValue(Config.suAutoReponse) { Config.suAutoReponse = entryValues[it].toInt() } - - override fun refresh() { - isEnabled = Utils.showSuperUser() - } } object RequestTimeout : SettingsItem.Selector() { @@ -335,10 +307,6 @@ object RequestTimeout : SettingsItem.Selector() { private val selected: Int get() = entryValues.indexOfFirst { it.toInt() == Config.suDefaultTimeout } - - override fun refresh() { - isEnabled = Utils.showSuperUser() - } } object SUNotification : SettingsItem.Selector() { @@ -349,8 +317,4 @@ object SUNotification : SettingsItem.Selector() { override var value by bindableValue(Config.suNotification) { Config.suNotification = entryValues[it].toInt() } - - override fun refresh() { - isEnabled = Utils.showSuperUser() - } } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt index 4eeaeafb0..805e04089 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt @@ -1,12 +1,16 @@ package com.topjohnwu.magisk.ui.settings import android.Manifest +import android.os.Build import android.view.View import android.widget.Toast import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.Const +import com.topjohnwu.magisk.core.Info import com.topjohnwu.magisk.core.download.DownloadService import com.topjohnwu.magisk.core.utils.PatchAPK +import com.topjohnwu.magisk.core.utils.Utils import com.topjohnwu.magisk.data.database.RepoDao import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.model.entity.internal.Configuration @@ -20,7 +24,6 @@ import com.topjohnwu.magisk.ui.base.BaseViewModel import com.topjohnwu.magisk.ui.base.adapterOf import com.topjohnwu.magisk.ui.base.diffListOf import com.topjohnwu.magisk.ui.base.itemBindingOf -import com.topjohnwu.magisk.core.utils.Utils import com.topjohnwu.superuser.Shell import io.reactivex.Completable import io.reactivex.subjects.PublishSubject @@ -32,21 +35,58 @@ class SettingsViewModel( val adapter = adapterOf() val itemBinding = itemBindingOf { it.bindExtra(BR.callback, this) } - val items = diffListOf( - Customization, - Theme, Language, DownloadPath, GridSize, + val items = diffListOf(createItems()) - Manager, - UpdateChannel, UpdateChannelUrl, ClearRepoCache, HideOrRestore(), UpdateChecker, - Biometrics, Reauthenticate, + private fun createItems(): List { + // Customization + val list = mutableListOf( + Customization, + Theme, Language, GridSize + ) + if (Build.VERSION.SDK_INT < 21) { + // Pre 5.0 does not support getting colors from attributes, + // making theming a pain in the ass. Just forget about it + list.remove(Theme) + } - Magisk, - SafeMode, MagiskHide, SystemlessHosts, + // Manager + list.addAll(listOf( + Manager, + UpdateChannel, UpdateChannelUrl, UpdateChecker, DownloadPath + )) + if (Info.env.isActive) { + list.add(ClearRepoCache) + if (Const.USER_ID == 0 && Info.isConnected.value) + list.add(HideOrRestore()) + } - Superuser, - AccessMode, MultiuserMode, MountNamespaceMode, AutomaticResponse, RequestTimeout, - SUNotification - ) + // Magisk + if (Info.env.isActive) { + list.addAll(listOf( + Magisk, + MagiskHide, SystemlessHosts, SafeMode + )) + } + + // Superuser + if (Utils.showSuperUser()) { + list.addAll(listOf( + Superuser, + Biometrics, AccessMode, MultiuserMode, MountNamespaceMode, + AutomaticResponse, RequestTimeout, SUNotification + )) + if (Build.VERSION.SDK_INT < 23) { + // Biometric is only available on 6.0+ + list.remove(Biometrics) + } + if (Build.VERSION.SDK_INT < 26) { + // Re-authenticate is not feasible on 8.0+ + list.add(Reauthenticate) + } + } + + return list + } override fun onItemPressed(view: View, item: SettingsItem) = when (item) { is DownloadPath -> requireRWPermission() From cf161a5dd9e7b4d9ed1b2d545fa4dbf233be017d Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sat, 18 Jan 2020 03:59:02 +0800 Subject: [PATCH 248/254] Show url dialog only if necessary --- .../java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt index 805e04089..68bf24abb 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt @@ -110,7 +110,7 @@ class SettingsViewModel( private fun openUrlIfNecessary(view: View) { UpdateChannelUrl.refresh() - if (UpdateChannelUrl.value.isBlank()) { + if (UpdateChannelUrl.isEnabled && UpdateChannelUrl.value.isBlank()) { UpdateChannelUrl.onPressed(view, this@SettingsViewModel) } } From 053251d56672ff8e80103d4a2cc531bc4fb92f75 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sat, 18 Jan 2020 04:07:15 +0800 Subject: [PATCH 249/254] Merge ViewModel Koin modules --- .../java/com/topjohnwu/magisk/di/Modules.kt | 3 +- .../com/topjohnwu/magisk/di/RedesignModule.kt | 32 ------------------- .../topjohnwu/magisk/di/ViewModelsModule.kt | 25 ++++++++++++++- 3 files changed, 25 insertions(+), 35 deletions(-) delete mode 100644 app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/di/Modules.kt b/app/src/main/java/com/topjohnwu/magisk/di/Modules.kt index 45bb22ef9..8fd05268e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/Modules.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/Modules.kt @@ -5,6 +5,5 @@ val koinModules = listOf( networkingModule, databaseModule, repositoryModule, - viewModelModules, - redesignModule + viewModelModules ) diff --git a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt deleted file mode 100644 index a79c9a980..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.topjohnwu.magisk.di - -import com.topjohnwu.magisk.ui.MainViewModel -import com.topjohnwu.magisk.ui.flash.FlashViewModel -import com.topjohnwu.magisk.ui.hide.HideViewModel -import com.topjohnwu.magisk.ui.home.HomeViewModel -import com.topjohnwu.magisk.ui.install.InstallViewModel -import com.topjohnwu.magisk.ui.log.LogViewModel -import com.topjohnwu.magisk.ui.module.ModuleViewModel -import com.topjohnwu.magisk.ui.request.RequestViewModel -import com.topjohnwu.magisk.ui.safetynet.SafetynetViewModel -import com.topjohnwu.magisk.ui.settings.SettingsViewModel -import com.topjohnwu.magisk.ui.superuser.SuperuserViewModel -import com.topjohnwu.magisk.ui.theme.ThemeViewModel -import org.koin.androidx.viewmodel.dsl.viewModel -import org.koin.dsl.module - -val redesignModule = module { - viewModel { FlashViewModel() } - viewModel { HideViewModel(get()) } - viewModel { HomeViewModel(get()) } - viewModel { LogViewModel(get()) } - viewModel { ModuleViewModel(get(), get(), get()) } - viewModel { RequestViewModel() } - viewModel { SafetynetViewModel(get()) } - viewModel { SettingsViewModel(get()) } - viewModel { SuperuserViewModel(get(), get(), get()) } - viewModel { ThemeViewModel() } - viewModel { InstallViewModel() } - - viewModel { MainViewModel() } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt index 547068331..d85f332d5 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt @@ -3,11 +3,34 @@ package com.topjohnwu.magisk.di import android.net.Uri import com.topjohnwu.magisk.legacy.flash.FlashViewModel import com.topjohnwu.magisk.legacy.surequest.SuRequestViewModel +import com.topjohnwu.magisk.ui.MainViewModel +import com.topjohnwu.magisk.ui.hide.HideViewModel +import com.topjohnwu.magisk.ui.home.HomeViewModel +import com.topjohnwu.magisk.ui.install.InstallViewModel +import com.topjohnwu.magisk.ui.log.LogViewModel +import com.topjohnwu.magisk.ui.module.ModuleViewModel +import com.topjohnwu.magisk.ui.request.RequestViewModel +import com.topjohnwu.magisk.ui.safetynet.SafetynetViewModel +import com.topjohnwu.magisk.ui.settings.SettingsViewModel +import com.topjohnwu.magisk.ui.superuser.SuperuserViewModel +import com.topjohnwu.magisk.ui.theme.ThemeViewModel import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module - val viewModelModules = module { + viewModel { HideViewModel(get()) } + viewModel { HomeViewModel(get()) } + viewModel { LogViewModel(get()) } + viewModel { ModuleViewModel(get(), get(), get()) } + viewModel { RequestViewModel() } + viewModel { SafetynetViewModel(get()) } + viewModel { SettingsViewModel(get()) } + viewModel { SuperuserViewModel(get(), get(), get()) } + viewModel { ThemeViewModel() } + viewModel { InstallViewModel() } + viewModel { MainViewModel() } + + // Legacy viewModel { (action: String, file: Uri, additional: Uri) -> FlashViewModel(action, file, additional, get()) } From b2ddba4cbfd5f589c3b4e74332154845fade40a0 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 19 Jan 2020 03:15:51 +0800 Subject: [PATCH 250/254] Proper repo fetching behavior --- .../magisk/core/tasks/RepoUpdater.kt | 13 +-- .../magisk/ui/module/ModuleFragment.kt | 2 +- .../magisk/ui/module/ModuleViewModel.kt | 101 +++++++++--------- 3 files changed, 58 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/core/tasks/RepoUpdater.kt b/app/src/main/java/com/topjohnwu/magisk/core/tasks/RepoUpdater.kt index 895a7634a..b42147228 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/tasks/RepoUpdater.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/tasks/RepoUpdater.kt @@ -24,11 +24,11 @@ class RepoUpdater( // Skip submission if (it.id == "submission") return@map - (repoDB.getRepo(it.id)?.apply { cached.remove(it.id) } ?: - Repo(it.id)).runCatching { + val repo = repoDB.getRepo(it.id)?.apply { cached.remove(it.id) } ?: Repo(it.id) + repo.runCatching { update(it.pushDate) repoDB.addRepo(this) - }.getOrElse { Timber.e(it) } + }.getOrElse(Timber::e) }.sequential() private fun loadPage( @@ -57,14 +57,15 @@ class RepoUpdater( cached.toFlowable().parallel().runOn(Schedulers.io()).map { runCatching { Repo(it).update() - }.getOrElse { Timber.e(it) } + }.getOrElse(Timber::e) }.sequential() private fun String.trimEtag() = substring(indexOf('\"'), lastIndexOf('\"') + 1) @Suppress("RedundantLambdaArrow") - operator fun invoke(forced: Boolean = false) : Completable { - return Flowable.fromCallable { Collections.synchronizedSet(HashSet(repoDB.repoIDList)) } + operator fun invoke(forced: Boolean) : Completable { + return Flowable + .fromCallable { Collections.synchronizedSet(HashSet(repoDB.repoIDList)) } .flatMap { cached -> loadPage(cached, etag = repoDB.etagKey).doOnComplete { repoDB.removeRepos(cached) diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt index cc6a1b525..3167d27cd 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt @@ -107,7 +107,7 @@ class ModuleFragment : CompatFragment override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { - R.id.action_refresh -> viewModel.loadRemoteImplicit() + R.id.action_refresh -> viewModel.forceRefresh() } return super.onOptionsItemSelected(item) } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt index db4344620..7c9528c10 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt @@ -10,7 +10,6 @@ import com.topjohnwu.magisk.core.download.RemoteFileService import com.topjohnwu.magisk.core.model.module.Module import com.topjohnwu.magisk.core.model.module.Repo import com.topjohnwu.magisk.core.tasks.RepoUpdater -import com.topjohnwu.magisk.core.utils.currentLocale import com.topjohnwu.magisk.data.database.RepoByNameDao import com.topjohnwu.magisk.data.database.RepoByUpdatedDao import com.topjohnwu.magisk.databinding.ComparableRvItem @@ -24,7 +23,6 @@ import com.topjohnwu.magisk.model.events.dialog.ModuleInstallDialog import com.topjohnwu.magisk.ui.base.* import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener import com.topjohnwu.magisk.utils.KObservableField -import io.reactivex.Completable import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable @@ -33,6 +31,20 @@ import me.tatarka.bindingcollectionadapter2.collections.MergeObservableList import timber.log.Timber import kotlin.math.roundToInt +/* +* The repo fetching behavior should follow these rules: +* +* For the first time the repo list is queried in the app, it should ALWAYS fetch for +* updates. However, this particular fetch should go through RepoUpdater.invoke(false), +* which internally will set ETAGs when doing GET requests to GitHub's API and will +* only update repo DB only if the GitHub API shows that something is changed remotely. +* +* When a user explicitly requests a full DB refresh, it should ALWAYS do a full force +* refresh, which in code can be done with RepoUpdater.invoke(true). This will update +* every single repo's information regardless whether GitHub's API shows if there is +* anything changed or not. +* */ + class ModuleViewModel( private val repoName: RepoByNameDao, private val repoUpdated: RepoByUpdatedDao, @@ -123,6 +135,7 @@ class ModuleViewModel( // --- private var remoteJob: Disposable? = null + private var refetch = false private val dao get() = when (Config.repoOrder) { Config.Value.ORDER_DATE -> repoUpdated @@ -146,42 +159,34 @@ class ModuleViewModel( // --- override fun refresh(): Disposable { - val installedTask = loadInstalled() - val remoteTask = if (itemsRemote.isEmpty()) { - Completable.fromAction { loadRemote() } - } else { - Completable.complete() - } - return Completable.merge(listOf(installedTask, remoteTask)).subscribeK() + if (itemsRemote.isEmpty()) + loadRemote() + return loadInstalled().subscribeK() } private fun loadInstalled() = Single.fromCallable { Module.loadModules() } .map { it.map { ModuleItem(it) } } - .map { it.order() } .map { it.loadDetail() } .map { it to itemsInstalled.calculateDiff(it) } .applyViewModel(this) .observeOn(AndroidSchedulers.mainThread()) - .doOnSuccess { itemsInstalled.update(it.first, it.second) } - .doOnSuccess { - if (itemsInstalled.isNotEmpty()) itemsInstalledHelpers.remove(itemNoneInstalled) + .map { + itemsInstalled.update(it.first, it.second) + if (itemsInstalled.isNotEmpty()) + itemsInstalledHelpers.remove(itemNoneInstalled) + it.first } .observeOn(Schedulers.io()) - .map { loadUpdates(it.first) } - .observeOn(AndroidSchedulers.mainThread()) + .map { loadUpdates(it) } .map { it to itemsUpdatable.calculateDiff(it) } - .doOnSuccess { itemsUpdatable.update(it.first, it.second) } + .observeOn(AndroidSchedulers.mainThread()) .doOnSuccess { - if (itemsUpdatable.isNotEmpty()) itemsUpdatableHelpers.remove(itemNoneUpdatable) + itemsUpdatable.update(it.first, it.second) + if (itemsUpdatable.isNotEmpty()) + itemsUpdatableHelpers.remove(itemNoneUpdatable) } .ignoreElement()!! - fun loadRemoteImplicit() = let { itemsRemote.clear(); itemsSearch.clear() } - .run { downloadRepos() } - .applyViewModel(this, false) - .subscribeK { refresh(); submitQuery() } - .add() - @Synchronized fun loadRemote() { // check for existing jobs @@ -191,11 +196,28 @@ class ModuleViewModel( if (itemsRemote.isEmpty()) { EndlessRecyclerScrollListener.ResetState().publish() } - remoteJob = Single.fromCallable { itemsRemote.size } - .flatMap { loadRemoteInternal(offset = it) } - .subscribeK(onError = Timber::e) { - itemsRemote.addAll(it) - } + + fun loadRemoteDB(offset: Int) = Single + .fromCallable { dao.getRepos(offset) } + .map { it.map { RepoItem.Remote(it) } } + + remoteJob = if (itemsRemote.isEmpty()) { + repoUpdater(refetch).andThen(loadRemoteDB(0)) + } else { + loadRemoteDB(itemsRemote.size) + }.subscribeK(onError = Timber::e) { + itemsRemote.addAll(it) + } + + refetch = false + } + + fun forceRefresh() { + itemsRemote.clear() + itemsSearch.clear() + refetch = true + refresh() + submitQuery() } // --- @@ -233,29 +255,6 @@ class ModuleViewModel( // --- - private fun loadRemoteInternal( - offset: Int = 0, - downloadRepos: Boolean = offset == 0 - ): Single> = Single.fromCallable { dao.getRepos(offset) } - .map { it.map { RepoItem.Remote(it) } } - .flatMap { - when { - // in case we find result empty and offset is initial we need to refresh the repos. - downloadRepos && it.isEmpty() && offset == 0 -> downloadRepos() - .andThen(loadRemoteInternal(downloadRepos = false)) - else -> Single.just(it) - } - } - - private fun downloadRepos() = repoUpdater() - - // --- - - @WorkerThread - private fun List.order() = asSequence() - .sortedBy { it.item.name.toLowerCase(currentLocale) } - .toList() - @WorkerThread private fun List.loadDetail() = onEach { module -> Single.fromCallable { dao.getRepoById(module.item.id)!! } From 5c1417e27615ca529e4684bc68c8cd3ce63e6099 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Tue, 21 Jan 2020 21:41:11 +0100 Subject: [PATCH 251/254] Updated home layout --- app/src/main/res/layout/fragment_home_md2.xml | 196 ++++++++++-------- 1 file changed, 106 insertions(+), 90 deletions(-) diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 37b971a38..5ec0fc54a 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -289,59 +289,45 @@ + app:layout_constraintWidth_max="400dp"> - - - + app:srcCompat="@drawable/ic_magisk_delete" /> - + app:layout_constraintTop_toBottomOf="@+id/home_magisk_title" + tools:text="@string/up_to_date_md2" /> - + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintWidth_max="150dp"> - + + app:layout_constraintBottom_toBottomOf="@+id/home_magisk_wrapper" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_chainStyle="packed" + app:layout_constraintStart_toEndOf="@+id/home_magisk_wrapper" + app:layout_constraintTop_toTopOf="@+id/home_magisk_wrapper" + app:layout_constraintVertical_bias=".5"> - - + app:backgroundTint="?colorSurface" + app:elevation="0dp" + app:fabSize="mini" + app:srcCompat="@drawable/ic_install" + app:tint="?colorPrimary" /> @@ -530,31 +527,29 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/l1" android:layout_marginTop="@dimen/l1" - android:layout_marginEnd="@dimen/l1" - android:maxWidth="200dp" - android:onClick="@{() -> viewModel.toggle(viewModel.stateManagerExpanded)}" + android:layout_marginEnd="@dimen/l_50" app:layout_constrainedWidth="true" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toStartOf="@+id/home_manager_buttons" app:layout_constraintHorizontal_chainStyle="packed" - app:layout_constraintStart_toEndOf="@+id/home_magisk_wrapper" - app:layout_constraintTop_toBottomOf="@+id/home_device_wrapper" - app:layout_constraintWidth_max="200dp"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/home_magisk_wrapper" + app:layout_constraintWidth_max="400dp"> - - + app:layout_constraintTop_toBottomOf="@+id/home_manager_title" + tools:text="@string/obsolete_md2" /> - + app:layout_constraintTop_toBottomOf="@+id/home_manager_status" + tools:text="10.0.0 > 10.0.1" /> + app:layout_constrainedWidth="true" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintWidth_max="150dp"> - + + android:layout_marginEnd="@dimen/l_50" + app:layout_constraintBottom_toBottomOf="@+id/home_manager_wrapper" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_chainStyle="packed" + app:layout_constraintStart_toEndOf="@+id/home_manager_wrapper" + app:layout_constraintTop_toTopOf="@+id/home_manager_wrapper" + app:layout_constraintVertical_bias=".5"> - + app:backgroundTint="?colorPrimary" + app:elevation="0dp" + app:fabSize="mini" + app:srcCompat="@drawable/ic_update_md2" + app:tint="?colorOnPrimary" /> - @@ -797,6 +802,17 @@ + + From 327b1862406a357cf19255f6f375cd34ac48c4e4 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Tue, 21 Jan 2020 21:50:13 +0100 Subject: [PATCH 252/254] Fixed theme mode title --- .../magisk/model/entity/recycler/TappableHeadlineItem.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TappableHeadlineItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TappableHeadlineItem.kt index 6f7c497da..178f3dbd0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TappableHeadlineItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TappableHeadlineItem.kt @@ -37,7 +37,7 @@ sealed class TappableHeadlineItem : ComparableRvItem() { } object ThemeMode : TappableHeadlineItem() { - override val title = R.string.section_theme + override val title = R.string.settings_dark_mode_title override val icon = R.drawable.ic_day_night } From c5e5b70e08a743497f24fb6a77eb372fd40de522 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Tue, 21 Jan 2020 22:01:55 +0100 Subject: [PATCH 253/254] Added safe mode notice to modules --- .../topjohnwu/magisk/ui/module/ModuleViewModel.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt index 7c9528c10..97c04cf19 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt @@ -81,12 +81,14 @@ class ModuleViewModel( it.add(itemNoneUpdatable) } + private val itemsCoreOnly = ObservableArrayList() private val itemsInstalled = diffListOf() private val itemsUpdatable = diffListOf() private val itemsRemote = diffListOf() val adapter = adapterOf>() val items = MergeObservableList>() + .insertList(itemsCoreOnly) .insertItem(sectionActive) .insertList(itemsInstalledHelpers) .insertList(itemsInstalled) @@ -159,6 +161,7 @@ class ModuleViewModel( // --- override fun refresh(): Disposable { + updateCoreOnlyWarning() if (itemsRemote.isEmpty()) loadRemote() return loadInstalled().subscribeK() @@ -268,6 +271,15 @@ class ModuleViewModel( .subscribeK { it.progress.value = progress } .add() + private fun updateCoreOnlyWarning() { + if (Config.coreOnly) { + if (itemsCoreOnly.isNotEmpty()) return + itemsCoreOnly.add(SafeModeNotice) + } else { + itemsCoreOnly.clear() + } + } + // --- @WorkerThread From 12a9792c7dffbc7ead0e109d9d863fa8121169a3 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Wed, 22 Jan 2020 14:49:46 +0800 Subject: [PATCH 254/254] Remove old install dialog --- .../events/dialog/MagiskInstallDialog.kt | 131 ------------------ 1 file changed, 131 deletions(-) delete mode 100644 app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt deleted file mode 100644 index 25d29ab9b..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/MagiskInstallDialog.kt +++ /dev/null @@ -1,131 +0,0 @@ -package com.topjohnwu.magisk.model.events.dialog - -import android.Manifest -import android.net.Uri -import android.view.LayoutInflater -import android.widget.Toast -import com.topjohnwu.magisk.core.Info -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.core.download.DownloadService -import com.topjohnwu.magisk.databinding.IncludeInstallOptionsBinding -import com.topjohnwu.magisk.extensions.hasPermissions -import com.topjohnwu.magisk.extensions.res -import com.topjohnwu.magisk.model.entity.internal.Configuration -import com.topjohnwu.magisk.model.entity.internal.DownloadSubject -import com.topjohnwu.magisk.model.events.OpenInappLinkEvent -import com.topjohnwu.magisk.core.utils.Utils -import com.topjohnwu.magisk.view.MagiskDialog -import com.topjohnwu.magisk.view.MarkDownWindow -import com.topjohnwu.superuser.Shell -import com.topjohnwu.superuser.ShellUtils - -class MagiskInstallDialog : DialogEvent() { - - override fun build(dialog: MagiskDialog) { - with(dialog) { - val filename = "Magisk v%s (%d)".format( - Info.remote.magisk.version, - Info.remote.magisk.versionCode - ) - applyTitle(R.string.repo_install_title.res(R.string.magisk.res())) - applyMessage(R.string.repo_install_msg.res(filename)) - setCancelable(true) - applyButton(MagiskDialog.ButtonType.POSITIVE) { - titleRes = R.string.install - preventDismiss = true - onClick { - updateForInstallMethod(dialog.reset()) - } - } - - if (Info.remote.magisk.note.isEmpty()) return - applyButton(MagiskDialog.ButtonType.NEGATIVE) { - titleRes = R.string.release_notes - onClick { - if (Info.remote.magisk.note.contains("forum.xda-developers")) { - OpenInappLinkEvent(Info.remote.magisk.note).invoke(context) - } else { - MarkDownWindow.show(context, null, Info.remote.magisk.note) - } - } - } - } - } - - private fun updateForInstallMethod(dialog: MagiskDialog) { - with(dialog) { - applyTitle(R.string.select_method) - applyView(IncludeInstallOptionsBinding.inflate(LayoutInflater.from(dialog.context))) - applyButton(MagiskDialog.ButtonType.POSITIVE) { - titleRes = R.string.download_zip_only - onClick { - preventDismiss = false - download() - } - } - applyButton(MagiskDialog.ButtonType.NEUTRAL) { - isEnabled = false - titleRes = R.string.select_patch_file - // todo maybe leverage rxbus for this? - onClick { Utils.toast("This is not currently possible", Toast.LENGTH_LONG) } - } - - if (!Shell.rootAccess()) return - applyButton(MagiskDialog.ButtonType.NEGATIVE) { - titleRes = R.string.direct_install - onClick { flash() } - } - - if (!isABDevice()) return - applyButton(MagiskDialog.ButtonType.IDGAF) { - titleRes = R.string.install_inactive_slot - preventDismiss = true - onClick { inactiveSlotDialog(dialog.reset()) } - } - } - } - - private fun inactiveSlotDialog(dialog: MagiskDialog) { - dialog.applyTitle(R.string.warning) - .applyMessage(R.string.install_inactive_slot_msg) - .applyButton(MagiskDialog.ButtonType.POSITIVE) { - titleRes = R.string.yes - onClick { - flash(Configuration.Flash.Secondary) - } - } - .applyButton(MagiskDialog.ButtonType.NEGATIVE) { - titleRes = android.R.string.no - } - } - - // --- - - private fun hasPermissions() = dialog.context.hasPermissions( - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) - - private fun patch(data: Uri) = download(DownloadSubject.Magisk(Configuration.Patch(data))) - - private fun flash( - type: Configuration.Flash = Configuration.Flash.Primary - ) = download(DownloadSubject.Magisk(type)) - - private fun download( - type: DownloadSubject.Magisk = DownloadSubject.Magisk(Configuration.Download) - ) { - if (!hasPermissions()) { - Utils.toast("Storage permissions are required for this action", Toast.LENGTH_LONG) - return - } - DownloadService(dialog.context) { subject = type } - } - - // --- - - private fun isABDevice() = ShellUtils - .fastCmd("grep_prop ro.build.ab_update") - .let { it.isNotEmpty() && it.toBoolean() } - -}

    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 JyxFAj{ui*!VcP%z literal 155882 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 T$;gtKUT1q5Su&4rFk}8d^GkdJ From e04f943980b84aff043da2dde378ceaffd3af9a0 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 5 Jan 2020 16:05:22 +0800 Subject: [PATCH 217/254] Backwards support back to API 21 Things still crash pre-21 --- app/build.gradle | 2 +- .../main/java/com/topjohnwu/magisk/redesign/MainActivity.kt | 4 ++-- .../com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt | 2 +- .../java/com/topjohnwu/magisk/redesign/compat/CompatView.kt | 4 ++-- .../com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt | 4 ++-- .../java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt | 4 ++-- .../java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt | 4 ++-- .../com/topjohnwu/magisk/redesign/install/InstallFragment.kt | 4 ++-- .../java/com/topjohnwu/magisk/redesign/log/LogFragment.kt | 4 ++-- .../com/topjohnwu/magisk/redesign/module/ModuleFragment.kt | 4 ++-- .../topjohnwu/magisk/redesign/settings/SettingsFragment.kt | 4 ++-- .../topjohnwu/magisk/redesign/superuser/SuperuserFragment.kt | 4 ++-- .../java/com/topjohnwu/magisk/redesign/theme/ThemeFragment.kt | 4 ++-- 13 files changed, 24 insertions(+), 24 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 14c81d5f2..377e2c62d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -130,7 +130,7 @@ dependencies { implementation 'androidx.work:work-runtime:2.2.0' implementation 'androidx.transition:transition:1.3.0-rc02' implementation 'androidx.multidex:multidex:2.0.1' - implementation 'androidx.core:core-ktx:1.1.0' + implementation 'androidx.core:core-ktx:1.2.0-rc01' // DO NOT UPDATE, 1.2.x has bunch of things broken in functionality against 1.1.x implementation 'com.google.android.material:material:1.1.0-beta02' } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index d08fb6c8b..2f2606cf7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -1,11 +1,11 @@ package com.topjohnwu.magisk.redesign -import android.graphics.Insets import android.os.Bundle import android.view.MenuItem import android.view.View import android.view.ViewTreeObserver import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.graphics.Insets import androidx.core.view.setPadding import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment @@ -155,4 +155,4 @@ open class MainActivity : CompatActivity( binding.mainToolbar.invalidate() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt index 69b8b50cf..d5e97b299 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatDelegate.kt @@ -1,7 +1,7 @@ package com.topjohnwu.magisk.redesign.compat -import android.graphics.Insets import android.view.View +import androidx.core.graphics.Insets import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.Fragment diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatView.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatView.kt index 941fadcc6..cfcf4d9f2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatView.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatView.kt @@ -1,7 +1,7 @@ package com.topjohnwu.magisk.redesign.compat -import android.graphics.Insets import android.view.View +import androidx.core.graphics.Insets internal interface CompatView { @@ -12,4 +12,4 @@ internal interface CompatView { fun peekSystemWindowInsets(insets: Insets) = Unit fun consumeSystemWindowInsets(insets: Insets): Insets? = null -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt index ecdd19044..7868e6014 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatViewModel.kt @@ -1,7 +1,7 @@ package com.topjohnwu.magisk.redesign.compat -import android.graphics.Insets import androidx.annotation.CallSuper +import androidx.core.graphics.Insets import androidx.databinding.Observable import com.topjohnwu.magisk.base.viewmodel.BaseViewModel import com.topjohnwu.magisk.utils.KObservableField @@ -42,4 +42,4 @@ abstract class CompatViewModel( super.onCleared() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt index 57fa96a17..da5efff9d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/hide/HideFragment.kt @@ -1,12 +1,12 @@ package com.topjohnwu.magisk.redesign.hide import android.content.Context -import android.graphics.Insets import android.os.Bundle import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View +import androidx.core.graphics.Insets import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -83,4 +83,4 @@ class HideFragment : CompatFragment() { return super.onOptionsItemSelected(item) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt index fa897882b..ca2ed1fba 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeFragment.kt @@ -1,9 +1,9 @@ package com.topjohnwu.magisk.redesign.home -import android.graphics.Insets import android.view.Menu import android.view.MenuInflater import android.view.MenuItem +import androidx.core.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentHomeMd2Binding import com.topjohnwu.magisk.model.navigation.Navigation @@ -32,4 +32,4 @@ class HomeFragment : CompatFragment() { else -> null }?.let { true } ?: super.onOptionsItemSelected(item) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/install/InstallFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/install/InstallFragment.kt index feff14bf4..34fd1e0c2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/install/InstallFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/install/InstallFragment.kt @@ -1,7 +1,7 @@ package com.topjohnwu.magisk.redesign.install import android.content.Intent -import android.graphics.Insets +import androidx.core.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentInstallMd2Binding import com.topjohnwu.magisk.model.events.RequestFileEvent @@ -25,4 +25,4 @@ class InstallFragment : CompatFragment() { return super.onBackPressed() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt index 0905e9b8e..cee00a054 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt @@ -1,12 +1,12 @@ package com.topjohnwu.magisk.redesign.module import android.content.Intent -import android.graphics.Insets import android.os.Bundle import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View +import androidx.core.graphics.Insets import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.StaggeredGridLayoutManager @@ -140,4 +140,4 @@ class ModuleFragment : CompatFragment listeners.add(listener) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt index 2fdcef756..0f4f66d25 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsFragment.kt @@ -1,8 +1,8 @@ package com.topjohnwu.magisk.redesign.settings -import android.graphics.Insets import android.os.Bundle import android.view.View +import androidx.core.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentSettingsMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment @@ -37,4 +37,4 @@ class SettingsFragment : CompatFragment null }?.let { true } ?: super.onOptionsItemSelected(item) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeFragment.kt index 26cb5e4e2..e5e92a7a1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/theme/ThemeFragment.kt @@ -1,6 +1,6 @@ package com.topjohnwu.magisk.redesign.theme -import android.graphics.Insets +import androidx.core.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentThemeMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment @@ -19,4 +19,4 @@ class ThemeFragment : CompatFragment() activity.title = getString(R.string.section_theme) } -} \ No newline at end of file +} From ea9947081ff08bcf37d238fec4f359e2cd9c0589 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 5 Jan 2020 16:27:28 +0800 Subject: [PATCH 218/254] Use widgets from AndroidX --- app/src/main/res/layout/dialog_magisk_base.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/dialog_magisk_base.xml b/app/src/main/res/layout/dialog_magisk_base.xml index e2d752533..622bbc781 100644 --- a/app/src/main/res/layout/dialog_magisk_base.xml +++ b/app/src/main/res/layout/dialog_magisk_base.xml @@ -144,7 +144,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"> - - + @@ -235,4 +235,4 @@ - \ No newline at end of file + From c0b56b927fe30e7a702da5cd6224972967da568f Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 6 Jan 2020 16:24:27 +0100 Subject: [PATCH 219/254] Updated the material library back to alpha03 version The aforementioned fragment has fixed issue with layouts being oversized on API21 (maybe a bit lower and higher as well, did not test) which was notable on homepage. Unfortunately it deprecated most of the logic behind hiding of the top action view. Since it inherited and overridden the functionality from HideBottomViewOnScrollBehavior it no longer called the old methods and so the whole class was rendered _useless_. Fortunately we didn't need the whole backing implementation so the parent class was changed to the bare minimum. Hopefully this incident will not repeat. Thanks goes to material team for introducing breaking changes in feature update. --- app/build.gradle | 4 +-- .../utils/HideTopViewOnScrollBehavior.kt | 36 +++++++------------ 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 377e2c62d..f9d01ef3c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -121,7 +121,7 @@ dependencies { implementation "androidx.navigation:navigation-ui-ktx:${vNav}" implementation 'androidx.biometric:biometric:1.0.0' - implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta3' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha03' implementation 'androidx.browser:browser:1.0.0' implementation 'androidx.preference:preference:1.1.0' @@ -132,5 +132,5 @@ dependencies { implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.core:core-ktx:1.2.0-rc01' // DO NOT UPDATE, 1.2.x has bunch of things broken in functionality against 1.1.x - implementation 'com.google.android.material:material:1.1.0-beta02' + implementation 'com.google.android.material:material:1.2.0-alpha03' } diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/HideTopViewOnScrollBehavior.kt b/app/src/main/java/com/topjohnwu/magisk/utils/HideTopViewOnScrollBehavior.kt index 66e6701ff..6ce5f5af8 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/HideTopViewOnScrollBehavior.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/HideTopViewOnScrollBehavior.kt @@ -4,23 +4,24 @@ import android.animation.TimeInterpolator import android.view.View import android.view.ViewGroup import android.view.ViewPropertyAnimator -import androidx.annotation.Dimension import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.view.ViewCompat import com.google.android.material.animation.AnimationUtils -import com.google.android.material.behavior.HideBottomViewOnScrollBehavior -class HideTopViewOnScrollBehavior : HideBottomViewOnScrollBehavior(), +class HideTopViewOnScrollBehavior : + CoordinatorLayout.Behavior(), HideableBehavior { companion object { private const val STATE_SCROLLED_DOWN = 1 private const val STATE_SCROLLED_UP = 2 + + private const val ENTER_ANIMATION_DURATION = 225 + private const val EXIT_ANIMATION_DURATION = 175 } private var height = 0 private var currentState = STATE_SCROLLED_UP - private var additionalHiddenOffsetY = 0 private var currentAnimator: ViewPropertyAnimator? = null private var lockState: Boolean = false @@ -34,26 +35,13 @@ class HideTopViewOnScrollBehavior : HideBottomViewOnScrollBehavior( return super.onLayoutChild(parent, child, layoutDirection) } - /** - * Sets an additional offset for the y position used to hide the view. - * - * @param child the child view that is hidden by this behavior - * @param offset the additional offset in pixels that should be added when the view slides away - */ - override fun setAdditionalHiddenOffsetY(child: V, @Dimension offset: Int) { - additionalHiddenOffsetY = offset - - if (currentState == STATE_SCROLLED_DOWN) { - child.translationY = (height + additionalHiddenOffsetY).toFloat() - } - } - override fun onStartNestedScroll( coordinatorLayout: CoordinatorLayout, child: V, directTargetChild: View, target: View, - nestedScrollAxes: Int + nestedScrollAxes: Int, + type: Int ) = nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL override fun onNestedScroll( @@ -63,7 +51,9 @@ class HideTopViewOnScrollBehavior : HideBottomViewOnScrollBehavior( dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, - dyUnconsumed: Int + dyUnconsumed: Int, + type: Int, + consumed: IntArray ) { // when initiating scroll while the view is at the bottom or at the top and pushing it // further, the parent will report consumption of 0 @@ -95,7 +85,7 @@ class HideTopViewOnScrollBehavior : HideBottomViewOnScrollBehavior( * Perform an animation that will slide the child from it's current position to be totally on the * screen. */ - override fun slideDown(child: V) { + private fun slideDown(child: V) { if (currentState == STATE_SCROLLED_UP || lockState) { return } @@ -118,7 +108,7 @@ class HideTopViewOnScrollBehavior : HideBottomViewOnScrollBehavior( * Perform an animation that will slide the child from it's current position to be totally off the * screen. */ - override fun slideUp(child: V) { + private fun slideUp(child: V) { if (currentState == STATE_SCROLLED_DOWN || lockState) { return } @@ -131,7 +121,7 @@ class HideTopViewOnScrollBehavior : HideBottomViewOnScrollBehavior( currentState = STATE_SCROLLED_DOWN animateChildTo( child, - -(height + additionalHiddenOffsetY), + -height, EXIT_ANIMATION_DURATION.toLong(), AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR ) From baf18a876217a25b73526b8119fea31748a9b18c Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 6 Jan 2020 16:33:55 +0100 Subject: [PATCH 220/254] Fixed cardview resizing itself idiotically in constraint layout --- .../main/res/layout/dialog_magisk_base.xml | 385 +++++++++--------- 1 file changed, 196 insertions(+), 189 deletions(-) diff --git a/app/src/main/res/layout/dialog_magisk_base.xml b/app/src/main/res/layout/dialog_magisk_base.xml index 622bbc781..852e0eb31 100644 --- a/app/src/main/res/layout/dialog_magisk_base.xml +++ b/app/src/main/res/layout/dialog_magisk_base.xml @@ -12,225 +12,232 @@ - - + android:layout_height="wrap_content" + app:cardElevation="@dimen/margin_generic" + app:cardUseCompatPadding="true"> - + - + - - - - - - - - - - - - - - - - - + - - - - - - - - + app:layout_constraintBottom_toTopOf="@+id/dialog_base_title" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> - + + + + + + + + + + + + + + + + + + + + + + + + + android:gravity="bottom|center_horizontal" + android:layoutDirection="locale" + android:orientation="horizontal" + android:paddingStart="12dp" + android:paddingTop="4dp" + android:paddingEnd="12dp" + android:paddingBottom="4dp"> - + - + - + - + - + - + - + - + + + + + From 13262fdb18aad0f7f58b210efe5c3c8a7bc7e3a4 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 6 Jan 2020 16:41:44 +0100 Subject: [PATCH 221/254] Fixed the dialog not being actually closed on click outside Misplaced methods ftw --- .../main/java/com/topjohnwu/magisk/view/MagiskDialog.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt index 30107bfbf..3fba7938d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/view/MagiskDialog.kt @@ -37,6 +37,7 @@ class MagiskDialog @JvmOverloads constructor( init { binding.setVariable(BR.data, data) + setCancelable(true) } override fun onCreate(savedInstanceState: Bundle?) { @@ -57,10 +58,16 @@ class MagiskDialog @JvmOverloads constructor( ) insets } + } - binding.dialogBaseOutsideContainer.setOnClickListener { + override fun setCancelable(flag: Boolean) { + val listener = if (!flag) { + null + } else { setCanceledOnTouchOutside(true) + View.OnClickListener { dismiss() } } + binding.dialogBaseOutsideContainer.setOnClickListener(listener) } inner class Data { From ed837ba26fd48dfe97cf00ead1a7c09484ec5418 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 6 Jan 2020 17:46:08 +0100 Subject: [PATCH 222/254] Updated the logic that refreshes the modules Also added empty states for installed and made updatable modules visible all the time to avoid unnecessary transitions --- .../magisk/model/entity/recycler/TextItem.kt | 19 ++++ .../magisk/redesign/module/ModuleViewModel.kt | 93 +++++++++---------- app/src/main/res/layout/item_text.xml | 22 +++++ app/src/main/res/values/strings_md2.xml | 2 + 4 files changed, 89 insertions(+), 47 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TextItem.kt create mode 100644 app/src/main/res/layout/item_text.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TextItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TextItem.kt new file mode 100644 index 000000000..1ce559ab8 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/TextItem.kt @@ -0,0 +1,19 @@ +package com.topjohnwu.magisk.model.entity.recycler + +import androidx.databinding.ViewDataBinding +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.databinding.ComparableRvItem + +class TextItem(val text: Int) : ComparableRvItem() { + override val layoutRes = R.layout.item_text + + override fun onBindingBound(binding: ViewDataBinding) { + super.onBindingBound(binding) + val params = binding.root.layoutParams as? StaggeredGridLayoutManager.LayoutParams + params?.isFullSpan = true + } + + override fun contentSameAs(other: TextItem) = text == other.text + override fun itemSameAs(other: TextItem) = contentSameAs(other) +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index 362802949..5c516aa3b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -22,9 +22,12 @@ import com.topjohnwu.magisk.redesign.compat.* import com.topjohnwu.magisk.tasks.RepoUpdater import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.currentLocale +import io.reactivex.Completable import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers +import me.tatarka.bindingcollectionadapter2.collections.MergeObservableList import timber.log.Timber import kotlin.math.roundToInt @@ -54,8 +57,24 @@ class ModuleViewModel( it.bindExtra(BR.viewModel, this) } + private val itemNoneInstalled = TextItem(R.string.module_install_none) + private val itemNoneUpdatable = TextItem(R.string.module_update_none) + + private val itemsInstalled = diffListOf() + private val itemsUpdatable = diffListOf() + private val itemsRemote = diffListOf() + val adapter = adapterOf>() - val items = diffListOf>() + val items = MergeObservableList>() + .insertItem(sectionActive) + .insertItem(itemNoneInstalled) + .insertList(itemsInstalled) + .insertItem(InstallModule) + .insertItem(sectionUpdate) + .insertItem(itemNoneUpdatable) + .insertList(itemsUpdatable) + .insertItem(sectionRemote) + .insertList(itemsRemote)!! val itemBinding = itemBindingOf> { it.bindExtra(BR.viewModel, this) } @@ -94,15 +113,6 @@ class ModuleViewModel( // --- - private val itemsInstalled - @WorkerThread get() = items.filterIsInstance() - - private val itemsUpdatable - @WorkerThread get() = items.filterIsInstance() - - private val itemsRemote - @WorkerThread get() = items.filterIsInstance() - private var remoteJob: Disposable? = null private val dao get() = when (Config.repoOrder) { @@ -126,22 +136,34 @@ class ModuleViewModel( // --- - override fun refresh() = Single.fromCallable { Module.loadModules() } + override fun refresh(): Disposable { + val installedTask = loadInstalled() + val remoteTask = if (itemsRemote.isEmpty()) { + Completable.fromAction { loadRemote() } + } else { + Completable.complete() + } + return Completable.merge(listOf(installedTask, remoteTask)).subscribeK() + } + + private fun loadInstalled() = Single.fromCallable { Module.loadModules() } .map { it.map { ModuleItem(it) } } .map { it.order() } .map { it.loadDetail() } - .map { build(active = it, updatable = loadUpdates(it)) } - .map { it to items.calculateDiff(it) } + .map { it to itemsInstalled.calculateDiff(it) } .applyViewModel(this) - .subscribeK { - items.update(it.first, it.second) - if (!items.contains(sectionRemote)) { - loadRemote() - } - updateActiveState() - } + .observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess { itemsInstalled.update(it.first, it.second) } + .doOnSuccess { if (itemsInstalled.isNotEmpty()) items.remove(itemNoneInstalled) } + .observeOn(Schedulers.io()) + .map { loadUpdates(it.first) } + .observeOn(AndroidSchedulers.mainThread()) + .map { it to itemsUpdatable.calculateDiff(it) } + .doOnSuccess { itemsUpdatable.update(it.first, it.second) } + .doOnSuccess { if (itemsUpdatable.isNotEmpty()) items.remove(itemNoneUpdatable) } + .ignoreElement()!! - fun loadRemoteImplicit() = let { items.clear(); itemsSearch.clear() } + fun loadRemoteImplicit() = let { itemsRemote.clear(); itemsSearch.clear() } .run { downloadRepos() } .applyViewModel(this, false) .subscribeK { refresh(); submitQuery() } @@ -156,10 +178,7 @@ class ModuleViewModel( remoteJob = Single.fromCallable { itemsRemote.size } .flatMap { loadRemoteInternal(offset = it) } .subscribeK(onError = Timber::e) { - if (!items.contains(sectionRemote)) { - items.add(sectionRemote) - } - items.addAll(it) + itemsRemote.addAll(it) } } @@ -201,7 +220,7 @@ class ModuleViewModel( private fun loadRemoteInternal( offset: Int = 0, downloadRepos: Boolean = offset == 0 - ): Single> = Single.fromCallable { dao.getRepos(offset) } + ): Single> = Single.fromCallable { dao.getRepos(offset) } .map { it.map { RepoItem.Remote(it) } } .flatMap { when { @@ -260,7 +279,7 @@ class ModuleViewModel( updateOrderIcon() Single.fromCallable { itemsRemote } .subscribeK { - items.removeAll(it) + itemsRemote.removeAll(it) remoteJob?.dispose() loadRemote() }.add() @@ -275,24 +294,4 @@ class ModuleViewModel( OpenChangelogEvent(item.repo ?: return).publish() } - // --- - - /** Callable only from worker thread because of expensive list filtering */ - @WorkerThread - private fun build( - active: List = itemsInstalled, - updatable: List = itemsUpdatable, - remote: List = itemsRemote - ) = (active + InstallModule) - .prependIfNotEmpty { sectionActive } - .prependIf(Config.coreOnly) { SafeModeNotice } + - updatable.prependIfNotEmpty { sectionUpdate } + - remote.prependIfNotEmpty { sectionRemote } - - private fun List.prependIf(condition: Boolean, item: () -> T) = - if (condition) listOf(item()) + this else this - - private fun List.prependIfNotEmpty(item: () -> T) = - prependIf(isNotEmpty(), item) - } \ No newline at end of file diff --git a/app/src/main/res/layout/item_text.xml b/app/src/main/res/layout/item_text.xml new file mode 100644 index 000000000..7bf74922f --- /dev/null +++ b/app/src/main/res/layout/item_text.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index 272950e7a..a49909a1a 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -85,6 +85,8 @@ Remove Restore Install from storage + Your modules are up to date! + No modules detected, try installing one from the list below. Logs Notifications From 7342509b2ef043f30d6fd0adf16f747154565998 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 6 Jan 2020 18:20:01 +0100 Subject: [PATCH 223/254] Added resetting state of the recyclerview scroll listener In some edge-cases the listener can still think that the content is loading. --- .../topjohnwu/magisk/base/viewmodel/TeanityViewModel.kt | 4 ++-- .../topjohnwu/magisk/redesign/module/ModuleFragment.kt | 8 ++++++++ .../topjohnwu/magisk/redesign/module/ModuleViewModel.kt | 4 ++++ .../magisk/utils/EndlessRecyclerScrollListener.kt | 3 +++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/TeanityViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/TeanityViewModel.kt index 4fb10599a..17449a115 100644 --- a/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/TeanityViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/base/viewmodel/TeanityViewModel.kt @@ -20,11 +20,11 @@ abstract class TeanityViewModel : ViewModel() { } fun Event.publish() { - _viewEvents.value = this + _viewEvents.postValue(this) } fun Int.publish() { - _viewEvents.value = SimpleViewEvent(this) + _viewEvents.postValue(SimpleViewEvent(this)) } fun Disposable.add() { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt index cee00a054..bb33a86f9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleFragment.kt @@ -13,6 +13,7 @@ import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentModuleMd2Binding import com.topjohnwu.magisk.model.events.InstallExternalModuleEvent +import com.topjohnwu.magisk.model.events.ViewEvent import com.topjohnwu.magisk.redesign.MainActivity import com.topjohnwu.magisk.redesign.ReselectionTarget import com.topjohnwu.magisk.redesign.compat.CompatFragment @@ -93,6 +94,13 @@ class ModuleFragment : CompatFragment // --- + override fun onEventDispatched(event: ViewEvent) = when (event) { + is EndlessRecyclerScrollListener.ResetState -> listeners.forEach { it.resetState() } + else -> super.onEventDispatched(event) + } + + // --- + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.menu_module_md2, menu) } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index 5c516aa3b..25c50cc80 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -20,6 +20,7 @@ import com.topjohnwu.magisk.model.events.OpenChangelogEvent import com.topjohnwu.magisk.model.events.dialog.ModuleInstallDialog import com.topjohnwu.magisk.redesign.compat.* import com.topjohnwu.magisk.tasks.RepoUpdater +import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.currentLocale import io.reactivex.Completable @@ -175,6 +176,9 @@ class ModuleViewModel( if (remoteJob?.isDisposed?.not() == true) { return } + if (itemsRemote.isEmpty()) { + EndlessRecyclerScrollListener.ResetState().publish() + } remoteJob = Single.fromCallable { itemsRemote.size } .flatMap { loadRemoteInternal(offset = it) } .subscribeK(onError = Timber::e) { diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/EndlessRecyclerScrollListener.kt b/app/src/main/java/com/topjohnwu/magisk/utils/EndlessRecyclerScrollListener.kt index 869f12444..624e40a7d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/EndlessRecyclerScrollListener.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/EndlessRecyclerScrollListener.kt @@ -4,6 +4,7 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.StaggeredGridLayoutManager +import com.topjohnwu.magisk.model.events.ViewEvent class EndlessRecyclerScrollListener( private val layoutManager: RecyclerView.LayoutManager, @@ -110,4 +111,6 @@ class EndlessRecyclerScrollListener( previousTotalItemCount = 0 loading = true } + + class ResetState : ViewEvent() } \ No newline at end of file From 904948dc7dab54ad3a6082345b44ced532dd1cf2 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 6 Jan 2020 19:03:36 +0100 Subject: [PATCH 224/254] Added empty states for all remaining screens Fixed some issues in the process as the MergeObservableList doesn't support additions or deletions, duh... --- .../magisk/redesign/log/LogViewModel.kt | 6 +++ .../magisk/redesign/module/ModuleViewModel.kt | 20 ++++++-- .../redesign/superuser/SuperuserViewModel.kt | 42 +++++++++++----- app/src/main/res/layout/fragment_log_md2.xml | 14 ++++++ .../res/layout/fragment_superuser_md2.xml | 3 +- .../main/res/layout/include_log_magisk.xml | 50 +++++++++++++------ app/src/main/res/values/strings_md2.xml | 4 ++ 7 files changed, 107 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt index 36d3df982..5993c161c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt @@ -10,6 +10,7 @@ import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.model.binding.BindingAdapter import com.topjohnwu.magisk.model.entity.recycler.ConsoleItem import com.topjohnwu.magisk.model.entity.recycler.LogItem +import com.topjohnwu.magisk.model.entity.recycler.TextItem import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.redesign.compat.diffListOf @@ -27,6 +28,11 @@ class LogViewModel( private val repo: LogRepository ) : CompatViewModel() { + // --- empty view + + val itemEmpty = TextItem(R.string.log_data_none) + val itemMagiskEmpty = TextItem(R.string.log_data_magisk_none) + // --- main view val items = diffListOf() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt index 25c50cc80..0c01db6f9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/module/ModuleViewModel.kt @@ -2,6 +2,7 @@ package com.topjohnwu.magisk.redesign.module import androidx.annotation.WorkerThread import androidx.databinding.Bindable +import androidx.databinding.ObservableArrayList import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R @@ -61,6 +62,13 @@ class ModuleViewModel( private val itemNoneInstalled = TextItem(R.string.module_install_none) private val itemNoneUpdatable = TextItem(R.string.module_update_none) + private val itemsInstalledHelpers = ObservableArrayList().also { + it.add(itemNoneInstalled) + } + private val itemsUpdatableHelpers = ObservableArrayList().also { + it.add(itemNoneUpdatable) + } + private val itemsInstalled = diffListOf() private val itemsUpdatable = diffListOf() private val itemsRemote = diffListOf() @@ -68,11 +76,11 @@ class ModuleViewModel( val adapter = adapterOf>() val items = MergeObservableList>() .insertItem(sectionActive) - .insertItem(itemNoneInstalled) + .insertList(itemsInstalledHelpers) .insertList(itemsInstalled) .insertItem(InstallModule) .insertItem(sectionUpdate) - .insertItem(itemNoneUpdatable) + .insertList(itemsUpdatableHelpers) .insertList(itemsUpdatable) .insertItem(sectionRemote) .insertList(itemsRemote)!! @@ -155,13 +163,17 @@ class ModuleViewModel( .applyViewModel(this) .observeOn(AndroidSchedulers.mainThread()) .doOnSuccess { itemsInstalled.update(it.first, it.second) } - .doOnSuccess { if (itemsInstalled.isNotEmpty()) items.remove(itemNoneInstalled) } + .doOnSuccess { + if (itemsInstalled.isNotEmpty()) itemsInstalledHelpers.remove(itemNoneInstalled) + } .observeOn(Schedulers.io()) .map { loadUpdates(it.first) } .observeOn(AndroidSchedulers.mainThread()) .map { it to itemsUpdatable.calculateDiff(it) } .doOnSuccess { itemsUpdatable.update(it.first, it.second) } - .doOnSuccess { if (itemsUpdatable.isNotEmpty()) items.remove(itemNoneUpdatable) } + .doOnSuccess { + if (itemsUpdatable.isNotEmpty()) itemsUpdatableHelpers.remove(itemNoneUpdatable) + } .ignoreElement()!! fun loadRemoteImplicit() = let { itemsRemote.clear(); itemsSearch.clear() } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt index 7a22b1e2a..2a994df2e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/superuser/SuperuserViewModel.kt @@ -2,6 +2,7 @@ package com.topjohnwu.magisk.redesign.superuser import android.content.pm.PackageManager import android.content.res.Resources +import androidx.databinding.ObservableArrayList import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.database.PolicyDao @@ -12,17 +13,20 @@ import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.model.entity.MagiskPolicy import com.topjohnwu.magisk.model.entity.recycler.PolicyItem import com.topjohnwu.magisk.model.entity.recycler.TappableHeadlineItem +import com.topjohnwu.magisk.model.entity.recycler.TextItem import com.topjohnwu.magisk.model.events.PolicyUpdateEvent import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.model.events.dialog.BiometricDialog import com.topjohnwu.magisk.model.events.dialog.SuperuserRevokeDialog import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.redesign.compat.CompatViewModel +import com.topjohnwu.magisk.redesign.compat.adapterOf import com.topjohnwu.magisk.redesign.compat.diffListOf import com.topjohnwu.magisk.redesign.compat.itemBindingOf import com.topjohnwu.magisk.utils.BiometricHelper import com.topjohnwu.magisk.utils.currentLocale import io.reactivex.Single +import me.tatarka.bindingcollectionadapter2.collections.MergeObservableList class SuperuserViewModel( private val db: PolicyDao, @@ -30,19 +34,24 @@ class SuperuserViewModel( private val resources: Resources ) : CompatViewModel(), TappableHeadlineItem.Listener { - val items = diffListOf>() + private val itemNoData = TextItem(R.string.superuser_policy_none) + + private val itemsPolicies = diffListOf() + private val itemsHelpers = ObservableArrayList().also { + it.add(itemNoData) + } + + val adapter = adapterOf>() + val items = MergeObservableList>() + .insertItem(TappableHeadlineItem.Hide) + .insertItem(TappableHeadlineItem.Safetynet) + .insertList(itemsHelpers) + .insertList(itemsPolicies) val itemBinding = itemBindingOf> { it.bindExtra(BR.viewModel, this) it.bindExtra(BR.listener, this) } - companion object { - private val menuOptions = listOf( - TappableHeadlineItem.Hide, - TappableHeadlineItem.Safetynet - ) - } - // --- override fun refresh() = db.fetchAll() @@ -57,11 +66,15 @@ class SuperuserViewModel( ).compare(o1, o2) } .toList() - .map { menuOptions + it } - .map { it to items.calculateDiff(it) } + .map { it to itemsPolicies.calculateDiff(it) } .applySchedulers() .applyViewModel(this) - .subscribeK { items.update(it.first, it.second) } + .subscribeK { + itemsPolicies.update(it.first, it.second) + if (itemsPolicies.isNotEmpty()) { + itemsHelpers.remove(itemNoData) + } + } // --- @@ -77,7 +90,12 @@ class SuperuserViewModel( fun deletePressed(item: PolicyItem) { fun updateState() = deletePolicy(item.item) - .subscribeK { items.removeAll { it.genericItemSameAs(item) } } + .subscribeK { + itemsPolicies.removeAll { it.genericItemSameAs(item) } + if (itemsPolicies.isEmpty() && itemsHelpers.isEmpty()) { + itemsHelpers.add(itemNoData) + } + } .add() if (BiometricHelper.isEnabled) { diff --git a/app/src/main/res/layout/fragment_log_md2.xml b/app/src/main/res/layout/fragment_log_md2.xml index acfe2264c..4fa3d9c4e 100644 --- a/app/src/main/res/layout/fragment_log_md2.xml +++ b/app/src/main/res/layout/fragment_log_md2.xml @@ -61,6 +61,20 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_superuser_md2.xml b/app/src/main/res/layout/fragment_superuser_md2.xml index 44cb4c2e8..08eecdd8e 100644 --- a/app/src/main/res/layout/fragment_superuser_md2.xml +++ b/app/src/main/res/layout/fragment_superuser_md2.xml @@ -18,6 +18,8 @@ android:layout_height="match_parent"> - - + - + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index a49909a1a..9ac599291 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -91,10 +91,14 @@ Logs Notifications Revoke + No app has asked for superuser permission yet. Filter by name Scroll up Filters Search + You\'re log-free, try using your SU enabled apps more. + Magisk logs are empty, that\'s weird. + \ No newline at end of file From 4cfff40475eea79da600e5f28bb3f1515994f387 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 6 Jan 2020 19:06:01 +0100 Subject: [PATCH 225/254] Updated special chars to their full-width variants Close #2219 --- app/src/main/java/com/topjohnwu/magisk/extensions/XString.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/XString.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/XString.kt index 0968ffd65..4f817e035 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/XString.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/XString.kt @@ -2,7 +2,7 @@ package com.topjohnwu.magisk.extensions import android.content.res.Resources -val specialChars = arrayOf('!', '@', '#', '$', '%', '&', '?') +val specialChars = arrayOf('!', '@', '#', '$', '%', '&', '?') fun String.replaceRandomWithSpecial(passes: Int): String { var string = this From 6a2acbe92928545c9077df47fcc6ae2c60aca5d7 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 6 Jan 2020 19:31:06 +0100 Subject: [PATCH 226/254] Added tiny hint that magisk can be uninstalled using the icon --- .../topjohnwu/magisk/utils/DataBindingAdapters.kt | 14 ++++++++++++++ app/src/main/res/layout/fragment_home_md2.xml | 9 +++++++++ app/src/main/res/values/ids.xml | 1 + 3 files changed, 24 insertions(+) diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index a3fe1b070..919abc2a5 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -253,9 +253,21 @@ fun TextInputLayout.setErrorString(error: String) { @BindingAdapter("onSelectClick", "onSelectReset", requireAll = false) fun View.setOnSelectClickListener(listener: View.OnClickListener, resetTime: Long) { + + fun getHideTarget() = (parent as? ViewGroup)?.findViewWithTag(R.id.hideWhenSelected) + fun animateVisibility(hide: Boolean, target: View? = getHideTarget()) { + target ?: return + val targetScale = if (hide) 0f else 1f + target.animate() + .scaleY(targetScale) + .scaleX(targetScale) + .start() + } + setOnClickListener { when { it.isSelected -> { + animateVisibility(false) listener.onClick(it) (it.tag as? Runnable)?.let { task -> it.handler.removeCallbacks(task) @@ -263,8 +275,10 @@ fun View.setOnSelectClickListener(listener: View.OnClickListener, resetTime: Lon it.isSelected = false } else -> { + animateVisibility(true) it.isSelected = true it.tag = it.postDelayed(resetTime) { + animateVisibility(false) it.tag = null it.isSelected = false } diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 5c922ea50..023cec564 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -334,6 +334,15 @@ app:srcCompat="@drawable/ic_magisk_delete" app:tint="@color/color_primary_error_transient" /> + + + From fcedd06e72db0f13494deacff1eaf23a9c3853b2 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 6 Jan 2020 19:59:41 +0100 Subject: [PATCH 227/254] Added grid column count settings *Cough, cough* Use pinch to zoom gesture instead, not a fan of this. --- .../magisk/redesign/settings/SettingsItems.kt | 18 ++++++++++++++++++ .../redesign/settings/SettingsViewModel.kt | 2 +- app/src/main/res/values/arrays.xml | 6 ++++++ app/src/main/res/values/strings_md2.xml | 5 +++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt index 882ee4262..74ad13a29 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt @@ -16,6 +16,8 @@ import com.topjohnwu.magisk.model.entity.recycler.SettingsItem import com.topjohnwu.magisk.utils.* import com.topjohnwu.superuser.Shell import java.io.File +import kotlin.math.max +import kotlin.math.min // --- Customization @@ -122,6 +124,22 @@ object DownloadPath : SettingsItem.Input() { .inflate(LayoutInflater.from(context)).also { it.data = this }.root } +object GridSize : SettingsItem.Selector() { + override var value by dataObservable(Config.listSpanCount - 1) { + Config.listSpanCount = max(1, min(3, it + 1)) + } + + override val title = R.string.settings_grid_span_count_title.asTransitive() + override val description = R.string.settings_grid_span_count_summary.asTransitive() + + init { + setValues( + resources.getStringArray(R.array.span_count), + resources.getStringArray(R.array.value_array) + ) + } +} + object UpdateChannel : SettingsItem.Selector() { override var value by dataObservable(Config.updateChannel) { Config.updateChannel = it } override val title = R.string.settings_update_channel_title.asTransitive() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt index f0013009f..eb8434cdc 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt @@ -35,7 +35,7 @@ class SettingsViewModel( val itemBinding = itemBindingOf { it.bindExtra(BR.callback, this) } val items = diffListOf( Customization, - Theme, Language, Redesign, DownloadPath, + Theme, Language, Redesign, DownloadPath, GridSize, Manager, UpdateChannel, UpdateChannelUrl, ClearRepoCache, HideOrRestore(), UpdateChecker, diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 0beedc71e..aac4b4a38 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -91,4 +91,10 @@ @string/sort_by_update + + @string/settings_grid_span_count_1 + @string/settings_grid_span_count_2 + @string/settings_grid_span_count_3 + + \ No newline at end of file diff --git a/app/src/main/res/values/strings_md2.xml b/app/src/main/res/values/strings_md2.xml index 9ac599291..e013ca4f2 100644 --- a/app/src/main/res/values/strings_md2.xml +++ b/app/src/main/res/values/strings_md2.xml @@ -70,6 +70,11 @@ Always Dark Safe Mode Disables everything but essential functionality within Magisk and Magisk Manager. Magisk Hide, as a separate subsystem, will stand unaffected. + Grid Column Size + Sets column size for all eligible grid lists. You can set this outside settings by performing pinch gesture. + One item per line (Small Screens) + Two items per line (Recommended) + Three item per line (Tablet/TV) Options Method From fc690b9f027d736104381a2d7b729c8ae984fe6d Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 12 Jan 2020 03:50:12 +0800 Subject: [PATCH 228/254] Update dependencies --- app/build.gradle | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f9d01ef3c..9fdd2be74 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -62,7 +62,7 @@ dependencies { implementation 'com.ncapdevi:frag-nav:3.2.0' implementation 'com.github.pwittchen:reactivenetwork-rx2:3.0.6' - implementation 'io.reactivex.rxjava2:rxjava:2.2.13' + implementation 'io.reactivex.rxjava2:rxjava:2.2.16' implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' @@ -89,13 +89,13 @@ dependencies { implementation "org.koin:koin-android:${vKoin}" implementation "org.koin:koin-androidx-viewmodel:${vKoin}" - def vRetrofit = '2.6.2' + def vRetrofit = '2.7.1' implementation "com.squareup.retrofit2:retrofit:${vRetrofit}" implementation "com.squareup.retrofit2:converter-moshi:${vRetrofit}" implementation "com.squareup.retrofit2:converter-scalars:${vRetrofit}" implementation "com.squareup.retrofit2:adapter-rxjava2:${vRetrofit}" - def vOkHttp = '3.12.6' + def vOkHttp = '3.12.7' implementation "com.squareup.okhttp3:okhttp:${vOkHttp}" implementation "com.squareup.okhttp3:logging-interceptor:${vOkHttp}" @@ -111,7 +111,7 @@ dependencies { replacedBy('com.github.topjohnwu:room-runtime') } } - def vRoom = '2.2.2' + def vRoom = '2.2.3' implementation "com.github.topjohnwu:room-runtime:${vRoom}" implementation "androidx.room:room-rxjava2:${vRoom}" kapt "androidx.room:room-compiler:${vRoom}" @@ -120,17 +120,16 @@ dependencies { implementation "androidx.navigation:navigation-fragment-ktx:${vNav}" implementation "androidx.navigation:navigation-ui-ktx:${vNav}" - implementation 'androidx.biometric:biometric:1.0.0' + implementation 'androidx.biometric:biometric:1.0.1' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha03' - implementation 'androidx.browser:browser:1.0.0' + implementation 'androidx.browser:browser:1.2.0' implementation 'androidx.preference:preference:1.1.0' implementation 'androidx.recyclerview:recyclerview:1.1.0' - implementation 'androidx.fragment:fragment-ktx:1.2.0-rc03' + implementation 'androidx.fragment:fragment-ktx:1.2.0-rc05' implementation 'androidx.work:work-runtime:2.2.0' implementation 'androidx.transition:transition:1.3.0-rc02' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.core:core-ktx:1.2.0-rc01' - // DO NOT UPDATE, 1.2.x has bunch of things broken in functionality against 1.1.x implementation 'com.google.android.material:material:1.2.0-alpha03' } From 342ae7c8cd21b1f4adff1d470458258ab55ab24f Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 12 Jan 2020 04:51:52 +0800 Subject: [PATCH 229/254] Update AS --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 7e16c37fa..fdf406baa 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ buildscript { maven { url 'https://kotlin.bintray.com/kotlinx' } } dependencies { - classpath 'com.android.tools.build:gradle:3.5.3' + classpath 'com.android.tools.build:gradle:3.6.0-rc01' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${vKotlin}" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ca9d62814..e867a4ae8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Sun Jan 12 04:46:30 CST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip From 0827044caf7896ef7b71462e2d3303e4edc7cd53 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 12 Jan 2020 04:54:20 +0800 Subject: [PATCH 230/254] Make Room incremental --- app/build.gradle | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 9fdd2be74..7faeaddf3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,6 +19,12 @@ android { multiDexEnabled true versionName props['appVersion'] versionCode props['appVersionCode'] as Integer + + javaCompileOptions { + annotationProcessorOptions { + arguments = ["room.incremental":"true"] + } + } } buildTypes { From df0a5b59f8cc4df7345e09ea27620729f78ca2e2 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 12 Jan 2020 15:00:49 +0800 Subject: [PATCH 231/254] Replace old design with redesign (p1) --- app/src/main/AndroidManifest.xml | 5 -- app/src/main/java/a/b.java | 7 --- app/src/main/java/a/{i.kt => b.kt} | 4 +- .../main/java/com/topjohnwu/magisk/Config.kt | 3 - .../main/java/com/topjohnwu/magisk/Hacks.kt | 2 +- .../com/topjohnwu/magisk/base/BaseActivity.kt | 9 +-- .../magisk/model/navigation/Navigation.kt | 61 +++++-------------- .../topjohnwu/magisk/redesign/MainActivity.kt | 3 + .../magisk/redesign/settings/SettingsItems.kt | 9 +-- .../redesign/settings/SettingsViewModel.kt | 6 +- .../topjohnwu/magisk/view/MarkDownWindow.kt | 27 +++----- 11 files changed, 33 insertions(+), 103 deletions(-) delete mode 100644 app/src/main/java/a/b.java rename app/src/main/java/a/{i.kt => b.kt} (59%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f8512c230..033ceef1f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,11 +29,6 @@ - - diff --git a/app/src/main/java/a/b.java b/app/src/main/java/a/b.java deleted file mode 100644 index db9475e9c..000000000 --- a/app/src/main/java/a/b.java +++ /dev/null @@ -1,7 +0,0 @@ -package a; - -import com.topjohnwu.magisk.ui.MainActivity; - -public class b extends MainActivity { - /* stub */ -} diff --git a/app/src/main/java/a/i.kt b/app/src/main/java/a/b.kt similarity index 59% rename from app/src/main/java/a/i.kt rename to app/src/main/java/a/b.kt index b02385431..150f876fc 100644 --- a/app/src/main/java/a/i.kt +++ b/app/src/main/java/a/b.kt @@ -2,6 +2,4 @@ package a import com.topjohnwu.magisk.redesign.MainActivity -class i : MainActivity() { - /* stub */ -} \ No newline at end of file +class b : MainActivity() diff --git a/app/src/main/java/com/topjohnwu/magisk/Config.kt b/app/src/main/java/com/topjohnwu/magisk/Config.kt index 2cbb18d56..6134b4b45 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Config.kt +++ b/app/src/main/java/com/topjohnwu/magisk/Config.kt @@ -123,9 +123,6 @@ object Config : PreferenceModel, DBConfig { var updateChannel by preferenceStrInt(Key.UPDATE_CHANNEL, defaultChannel) var safetyNotice by preference(Key.SAFETY, true) - var redesign by preference(Key.REDESIGN, false) - @Deprecated("Use extended dark theme") - var darkTheme by preference(Key.DARK_THEME, true) var darkThemeExtended by preference( Key.DARK_THEME_EXTENDED, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM diff --git a/app/src/main/java/com/topjohnwu/magisk/Hacks.kt b/app/src/main/java/com/topjohnwu/magisk/Hacks.kt index d3a683760..18bdf85c7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Hacks.kt +++ b/app/src/main/java/com/topjohnwu/magisk/Hacks.kt @@ -151,7 +151,7 @@ object ClassMap { DownloadService::class.java to a.j::class.java, SuRequestActivity::class.java to a.m::class.java, ProcessPhoenix::class.java to a.r::class.java, - RedesignActivity::class.java to a.i::class.java + RedesignActivity::class.java to a.b::class.java ) operator fun get(c: Class<*>) = map.getOrElse(c) { c } diff --git a/app/src/main/java/com/topjohnwu/magisk/base/BaseActivity.kt b/app/src/main/java/com/topjohnwu/magisk/base/BaseActivity.kt index 2c4367bdf..667c39b62 100644 --- a/app/src/main/java/com/topjohnwu/magisk/base/BaseActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/base/BaseActivity.kt @@ -39,14 +39,7 @@ abstract class BaseActivity() } init { - val theme = if (Config.redesign) { - Config.darkThemeExtended - } else { - when { - Config.darkTheme -> AppCompatDelegate.MODE_NIGHT_YES - else -> AppCompatDelegate.MODE_NIGHT_NO - } - } + val theme = Config.darkThemeExtended AppCompatDelegate.setDefaultNightMode(theme) } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt index dfa2da71b..11091b728 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt @@ -3,60 +3,40 @@ package com.topjohnwu.magisk.model.navigation import android.content.Context import android.content.Intent import android.os.Build -import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.intent +import com.topjohnwu.magisk.redesign.MainActivity +import com.topjohnwu.magisk.redesign.hide.HideFragment +import com.topjohnwu.magisk.redesign.home.HomeFragment import com.topjohnwu.magisk.redesign.install.InstallFragment +import com.topjohnwu.magisk.redesign.log.LogFragment import com.topjohnwu.magisk.redesign.safetynet.SafetynetFragment +import com.topjohnwu.magisk.redesign.settings.SettingsFragment +import com.topjohnwu.magisk.redesign.superuser.SuperuserFragment import com.topjohnwu.magisk.redesign.theme.ThemeFragment -import com.topjohnwu.magisk.ui.MainActivity -import com.topjohnwu.magisk.ui.hide.MagiskHideFragment -import com.topjohnwu.magisk.ui.home.HomeFragment -import com.topjohnwu.magisk.ui.log.LogFragment import com.topjohnwu.magisk.ui.module.ModulesFragment import com.topjohnwu.magisk.ui.module.ReposFragment -import com.topjohnwu.magisk.ui.settings.SettingsFragment -import com.topjohnwu.magisk.ui.superuser.SuperuserFragment -import com.topjohnwu.magisk.redesign.MainActivity as RedesignActivity -import com.topjohnwu.magisk.redesign.hide.HideFragment as RedesignHideFragment -import com.topjohnwu.magisk.redesign.home.HomeFragment as RedesignHomeFragment -import com.topjohnwu.magisk.redesign.log.LogFragment as RedesignLogFragment -import com.topjohnwu.magisk.redesign.module.ModuleFragment as RedesignModulesFragment -import com.topjohnwu.magisk.redesign.settings.SettingsFragment as RedesignSettingsFragment -import com.topjohnwu.magisk.redesign.superuser.SuperuserFragment as RedesignSuperuserFragment object Navigation { fun home() = MagiskNavigationEvent { navDirections { - destination = when { - Config.redesign -> RedesignHomeFragment::class - else -> HomeFragment::class - } + destination = HomeFragment::class } navOptions { - popUpTo = when { - Config.redesign -> RedesignHomeFragment::class - else -> HomeFragment::class - } + popUpTo = HomeFragment::class } } fun superuser() = MagiskNavigationEvent { navDirections { - destination = when { - Config.redesign -> RedesignSuperuserFragment::class - else -> SuperuserFragment::class - } + destination = SuperuserFragment::class } } fun modules() = MagiskNavigationEvent { navDirections { - destination = when { - Config.redesign -> RedesignModulesFragment::class - else -> ModulesFragment::class - } + destination = ModulesFragment::class } } @@ -66,10 +46,7 @@ object Navigation { fun hide() = MagiskNavigationEvent { navDirections { - destination = when { - Config.redesign -> RedesignHideFragment::class - else -> MagiskHideFragment::class - } + destination = HideFragment::class } } @@ -79,19 +56,13 @@ object Navigation { fun log() = MagiskNavigationEvent { navDirections { - destination = when { - Config.redesign -> RedesignLogFragment::class - else -> LogFragment::class - } + destination = LogFragment::class } } fun settings() = MagiskNavigationEvent { navDirections { - destination = when { - Config.redesign -> RedesignSettingsFragment::class - else -> SettingsFragment::class - } + destination = SettingsFragment::class } } @@ -116,10 +87,8 @@ object Navigation { // redesign starts here fun start(launchIntent: Intent, context: Context) { - when { - Config.redesign -> context.intent() - else -> context.intent() - }.putExtra(Const.Key.OPEN_SECTION, launchIntent.getStringExtra(Const.Key.OPEN_SECTION)) + context.intent() + .putExtra(Const.Key.OPEN_SECTION, launchIntent.getStringExtra(Const.Key.OPEN_SECTION)) .putExtra( Const.Key.OPEN_SETTINGS, launchIntent.action == ACTION_APPLICATION_PREFERENCES diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index 2f2606cf7..fb4057ef3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.MenuItem import android.view.View import android.view.ViewTreeObserver +import android.view.WindowManager import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.graphics.Insets import androidx.core.view.setPadding @@ -54,6 +55,8 @@ open class MainActivity : CompatActivity( override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) + setSupportActionBar(binding.mainToolbar) binding.mainToolbarWrapper.updateLayoutParams { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt index 74ad13a29..c39be731e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsItems.kt @@ -42,13 +42,6 @@ object Language : SettingsItem.Selector() { } } -object Redesign : SettingsItem.Toggle() { - override val title = "Redesign".asTransitive() - override val description = - "Select this to disable redesign. App will automatically shut down".asTransitive() - override var value: Boolean by dataObservable(Config.redesign) { Config.redesign = it } -} - object Theme : SettingsItem.Blank() { override val icon = R.drawable.ic_paint override val title = R.string.section_theme.asTransitive() @@ -386,4 +379,4 @@ object SUNotification : SettingsItem.Selector() { override fun refresh() { isEnabled = Utils.showSuperUser() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt index eb8434cdc..db21a2a4a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/settings/SettingsViewModel.kt @@ -11,7 +11,6 @@ import com.topjohnwu.magisk.model.download.DownloadService import com.topjohnwu.magisk.model.entity.internal.Configuration import com.topjohnwu.magisk.model.entity.internal.DownloadSubject import com.topjohnwu.magisk.model.entity.recycler.SettingsItem -import com.topjohnwu.magisk.model.events.DieEvent import com.topjohnwu.magisk.model.events.PermissionEvent import com.topjohnwu.magisk.model.events.RecreateEvent import com.topjohnwu.magisk.model.events.dialog.BiometricDialog @@ -35,7 +34,7 @@ class SettingsViewModel( val itemBinding = itemBindingOf { it.bindExtra(BR.callback, this) } val items = diffListOf( Customization, - Theme, Language, Redesign, DownloadPath, GridSize, + Theme, Language, DownloadPath, GridSize, Manager, UpdateChannel, UpdateChannelUrl, ClearRepoCache, HideOrRestore(), UpdateChecker, @@ -57,7 +56,6 @@ class SettingsViewModel( override fun onItemChanged(view: View, item: SettingsItem) = when (item) { // use only instances you want, don't declare everything is Theme -> Navigation.theme().publish() - is Redesign -> DieEvent().publish() is Language -> RecreateEvent().publish() is UpdateChannel -> openUrlIfNecessary(view) @@ -118,4 +116,4 @@ class SettingsViewModel( } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/view/MarkDownWindow.kt b/app/src/main/java/com/topjohnwu/magisk/view/MarkDownWindow.kt index 6b323a34c..c2304f863 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/MarkDownWindow.kt +++ b/app/src/main/java/com/topjohnwu/magisk/view/MarkDownWindow.kt @@ -3,8 +3,6 @@ package com.topjohnwu.magisk.view import android.content.Context import android.view.LayoutInflater import android.widget.TextView -import androidx.appcompat.app.AlertDialog -import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.repository.StringRepository import com.topjohnwu.magisk.extensions.subscribeK @@ -35,7 +33,7 @@ object MarkDownWindow : KoinComponent { } fun show(activity: Context, title: String?, content: Single) { - val mdRes = if (Config.redesign) R.layout.markdown_window_md2 else R.layout.markdown_window + val mdRes = R.layout.markdown_window_md2 val mv = LayoutInflater.from(activity).inflate(mdRes, null) val tv = mv.findViewById(R.id.md_txt) @@ -47,21 +45,14 @@ object MarkDownWindow : KoinComponent { tv.setText(R.string.download_file_error) Completable.complete() }.subscribeK { - if (Config.redesign) { - MagiskDialog(activity) - .applyTitle(title ?: "") - .applyView(mv) - .applyButton(MagiskDialog.ButtonType.NEGATIVE) { - titleRes = android.R.string.cancel - } - .reveal() - return@subscribeK - } - AlertDialog.Builder(activity) - .setTitle(title) - .setView(mv) - .setNegativeButton(android.R.string.cancel) { dialog, _ -> dialog.dismiss() } - .show() + MagiskDialog(activity) + .applyTitle(title ?: "") + .applyView(mv) + .applyButton(MagiskDialog.ButtonType.NEGATIVE) { + titleRes = android.R.string.cancel + } + .reveal() + return@subscribeK } } } From 9094cf7ce3f15242b9b166f4d6d8005880da781b Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 12 Jan 2020 16:07:30 +0800 Subject: [PATCH 232/254] Replace old design with redesign (p2) --- app/src/main/java/a/g.java | 4 +- .../main/java/com/topjohnwu/magisk/Hacks.kt | 6 +- .../topjohnwu/magisk/di/ViewModelsModule.kt | 12 - .../model/entity/recycler/HideRvItem.kt | 85 --- .../magisk/model/entity/recycler/LogRvItem.kt | 72 +-- .../model/entity/recycler/ModuleRvItem.kt | 70 +-- .../model/entity/recycler/PolicyRvItem.kt | 45 +- .../topjohnwu/magisk/model/events/RxEvents.kt | 10 +- .../magisk/model/navigation/Navigation.kt | 10 +- .../magisk/redesign/home/HomeViewModel.kt | 5 +- .../redesign/safetynet/SafetynetViewModel.kt | 8 +- .../com/topjohnwu/magisk/ui/MainActivity.kt | 252 --------- .../com/topjohnwu/magisk/ui/MainViewModel.kt | 29 - .../topjohnwu/magisk/ui/hide/HideViewModel.kt | 96 ---- .../magisk/ui/hide/MagiskHideFragment.kt | 71 --- .../topjohnwu/magisk/ui/home/HomeFragment.kt | 132 ----- .../topjohnwu/magisk/ui/home/HomeViewModel.kt | 259 --------- .../topjohnwu/magisk/ui/log/LogFragment.kt | 57 -- .../topjohnwu/magisk/ui/log/LogViewModel.kt | 120 ----- .../magisk/ui/module/ModuleViewModel.kt | 111 ---- .../magisk/ui/module/ModulesFragment.kt | 99 ---- .../magisk/ui/module/ReposFragment.kt | 116 ---- .../magisk/ui/settings/SettingsFragment.kt | 347 ------------ .../magisk/ui/superuser/SuperuserFragment.kt | 25 - .../magisk/ui/superuser/SuperuserViewModel.kt | 151 ------ .../com/topjohnwu/magisk/view/Shortcuts.kt | 13 - app/src/main/res/layout/activity_main.xml | 38 -- .../main/res/layout/activity_main_content.xml | 46 -- .../main/res/layout/custom_channel_dialog.xml | 24 - .../res/layout/custom_download_dialog.xml | 46 -- .../main/res/layout/dialog_custom_name.xml | 46 -- app/src/main/res/layout/fragment_home_md2.xml | 4 +- app/src/main/res/layout/fragment_log.xml | 37 -- app/src/main/res/layout/fragment_magisk.xml | 503 ------------------ .../main/res/layout/fragment_magisk_hide.xml | 36 -- app/src/main/res/layout/fragment_modules.xml | 70 --- app/src/main/res/layout/fragment_repos.xml | 56 -- .../main/res/layout/fragment_superuser.xml | 53 -- .../main/res/layout/include_update_card.xml | 151 ------ app/src/main/res/layout/item_hide_app.xml | 126 ----- app/src/main/res/layout/item_hide_process.xml | 57 -- app/src/main/res/layout/item_module.xml | 149 ------ app/src/main/res/layout/item_page_log.xml | 37 -- .../main/res/layout/item_page_magisk_log.xml | 56 -- app/src/main/res/layout/item_policy.xml | 211 -------- app/src/main/res/layout/item_repo.xml | 130 ----- .../main/res/layout/item_superuser_log.xml | 84 --- .../res/layout/item_superuser_log_entry.xml | 112 ---- app/src/main/res/menu/drawer.xml | 59 -- app/src/main/res/menu/menu_log.xml | 24 - app/src/main/res/menu/menu_magiskhide.xml | 16 - 51 files changed, 22 insertions(+), 4354 deletions(-) delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/hide/MagiskHideFragment.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/module/ModulesFragment.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/module/ReposFragment.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserFragment.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt delete mode 100644 app/src/main/res/layout/activity_main.xml delete mode 100644 app/src/main/res/layout/activity_main_content.xml delete mode 100644 app/src/main/res/layout/custom_channel_dialog.xml delete mode 100644 app/src/main/res/layout/custom_download_dialog.xml delete mode 100644 app/src/main/res/layout/dialog_custom_name.xml delete mode 100644 app/src/main/res/layout/fragment_log.xml delete mode 100644 app/src/main/res/layout/fragment_magisk.xml delete mode 100644 app/src/main/res/layout/fragment_magisk_hide.xml delete mode 100644 app/src/main/res/layout/fragment_modules.xml delete mode 100644 app/src/main/res/layout/fragment_repos.xml delete mode 100644 app/src/main/res/layout/fragment_superuser.xml delete mode 100644 app/src/main/res/layout/include_update_card.xml delete mode 100644 app/src/main/res/layout/item_hide_app.xml delete mode 100644 app/src/main/res/layout/item_hide_process.xml delete mode 100644 app/src/main/res/layout/item_module.xml delete mode 100644 app/src/main/res/layout/item_page_log.xml delete mode 100644 app/src/main/res/layout/item_page_magisk_log.xml delete mode 100644 app/src/main/res/layout/item_policy.xml delete mode 100644 app/src/main/res/layout/item_repo.xml delete mode 100644 app/src/main/res/layout/item_superuser_log.xml delete mode 100644 app/src/main/res/layout/item_superuser_log_entry.xml delete mode 100644 app/src/main/res/menu/drawer.xml delete mode 100644 app/src/main/res/menu/menu_log.xml delete mode 100644 app/src/main/res/menu/menu_magiskhide.xml diff --git a/app/src/main/java/a/g.java b/app/src/main/java/a/g.java index ceaf4ff41..168ceb9fb 100644 --- a/app/src/main/java/a/g.java +++ b/app/src/main/java/a/g.java @@ -2,11 +2,11 @@ package a; import android.content.Context; -import com.topjohnwu.magisk.model.update.UpdateCheckService; - import androidx.annotation.NonNull; import androidx.work.WorkerParameters; +import com.topjohnwu.magisk.model.update.UpdateCheckService; + public class g extends w { /* Stub */ public g(@NonNull Context context, @NonNull WorkerParameters workerParams) { diff --git a/app/src/main/java/com/topjohnwu/magisk/Hacks.kt b/app/src/main/java/com/topjohnwu/magisk/Hacks.kt index 18bdf85c7..df21b4d2c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/Hacks.kt +++ b/app/src/main/java/com/topjohnwu/magisk/Hacks.kt @@ -18,13 +18,12 @@ import com.topjohnwu.magisk.extensions.forceGetDeclaredField import com.topjohnwu.magisk.model.download.DownloadService import com.topjohnwu.magisk.model.receiver.GeneralReceiver import com.topjohnwu.magisk.model.update.UpdateCheckService -import com.topjohnwu.magisk.ui.MainActivity +import com.topjohnwu.magisk.redesign.MainActivity import com.topjohnwu.magisk.ui.SplashActivity import com.topjohnwu.magisk.ui.flash.FlashActivity import com.topjohnwu.magisk.ui.surequest.SuRequestActivity import com.topjohnwu.magisk.utils.refreshLocale import com.topjohnwu.magisk.utils.updateConfig -import com.topjohnwu.magisk.redesign.MainActivity as RedesignActivity fun AssetManager.addAssetPath(path: String) { DynAPK.addAssetPath(this, path) @@ -150,8 +149,7 @@ object ClassMap { GeneralReceiver::class.java to a.h::class.java, DownloadService::class.java to a.j::class.java, SuRequestActivity::class.java to a.m::class.java, - ProcessPhoenix::class.java to a.r::class.java, - RedesignActivity::class.java to a.b::class.java + ProcessPhoenix::class.java to a.r::class.java ) operator fun get(c: Class<*>) = map.getOrElse(c) { c } diff --git a/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt index b76c897f0..8df400983 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt @@ -1,25 +1,13 @@ package com.topjohnwu.magisk.di import android.net.Uri -import com.topjohnwu.magisk.ui.MainViewModel import com.topjohnwu.magisk.ui.flash.FlashViewModel -import com.topjohnwu.magisk.ui.hide.HideViewModel -import com.topjohnwu.magisk.ui.home.HomeViewModel -import com.topjohnwu.magisk.ui.log.LogViewModel -import com.topjohnwu.magisk.ui.module.ModuleViewModel -import com.topjohnwu.magisk.ui.superuser.SuperuserViewModel import com.topjohnwu.magisk.ui.surequest.SuRequestViewModel import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module val viewModelModules = module { - viewModel { MainViewModel() } - viewModel { HomeViewModel(get()) } - viewModel { SuperuserViewModel(get(), get(), get(), get()) } - viewModel { HideViewModel(get(), get()) } - viewModel { ModuleViewModel(get(), get(), get()) } - viewModel { LogViewModel(get(), get()) } viewModel { (action: String, file: Uri, additional: Uri) -> FlashViewModel(action, file, additional, get()) } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt index 6a32beb51..30befa36e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HideRvItem.kt @@ -5,20 +5,13 @@ import android.view.ViewGroup import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.addOnPropertyChangedCallback -import com.topjohnwu.magisk.extensions.inject import com.topjohnwu.magisk.extensions.startAnimations import com.topjohnwu.magisk.extensions.toggle -import com.topjohnwu.magisk.model.entity.HideAppInfo -import com.topjohnwu.magisk.model.entity.HideTarget import com.topjohnwu.magisk.model.entity.ProcessHideApp import com.topjohnwu.magisk.model.entity.StatefulProcess -import com.topjohnwu.magisk.model.entity.state.IndeterminateState -import com.topjohnwu.magisk.model.events.HideProcessEvent import com.topjohnwu.magisk.model.observer.Observer import com.topjohnwu.magisk.redesign.hide.HideViewModel -import com.topjohnwu.magisk.utils.DiffObservableList import com.topjohnwu.magisk.utils.KObservableField -import com.topjohnwu.magisk.utils.RxBus import kotlin.math.roundToInt class HideItem(val item: ProcessHideApp) : ComparableRvItem() { @@ -86,81 +79,3 @@ class HideProcessItem(val item: StatefulProcess) : ComparableRvItem) : - ComparableRvItem() { - - override val layoutRes: Int = R.layout.item_hide_app - - val packageName = item.info.packageName.orEmpty() - val items = DiffObservableList(callback).also { - val items = item.processes.map { - val isHidden = targets.any { target -> - packageName == target.packageName && it == target.process - } - HideProcessRvItem(packageName, it, isHidden) - } - it.update(items) - } - val isHiddenState = KObservableField(currentState) - val isExpanded = KObservableField(false) - - private val itemsProcess get() = items.filterIsInstance() - - private val currentState - get() = when (itemsProcess.count { it.isHidden.value }) { - items.size -> IndeterminateState.CHECKED - in 1 until items.size -> IndeterminateState.INDETERMINATE - else -> IndeterminateState.UNCHECKED - } - - init { - itemsProcess.forEach { - it.isHidden.addOnPropertyChangedCallback { isHiddenState.value = currentState } - } - } - - fun toggle() { - val desiredState = when (isHiddenState.value) { - IndeterminateState.INDETERMINATE, - IndeterminateState.UNCHECKED -> true - IndeterminateState.CHECKED -> false - } - itemsProcess.forEach { it.isHidden.value = desiredState } - isHiddenState.value = currentState - } - - fun toggleExpansion() { - if (items.size <= 1) return - isExpanded.toggle() - } - - override fun contentSameAs(other: HideRvItem): Boolean = items.all { other.items.contains(it) } - override fun itemSameAs(other: HideRvItem): Boolean = item.info == other.item.info - -} - -class HideProcessRvItem( - val packageName: String, - val process: String, - isHidden: Boolean -) : ComparableRvItem() { - - override val layoutRes: Int = R.layout.item_hide_process - - val isHidden = KObservableField(isHidden) - - private val rxBus: RxBus by inject() - - init { - this.isHidden.addOnPropertyChangedCallback { - rxBus.post(HideProcessEvent(this@HideProcessRvItem)) - } - } - - fun toggle() = isHidden.toggle() - - override fun contentSameAs(other: HideProcessRvItem): Boolean = itemSameAs(other) - override fun itemSameAs(other: HideProcessRvItem): Boolean = - packageName == other.packageName && process == other.process -} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt index c4aef525a..fe919e39a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt @@ -3,79 +3,9 @@ package com.topjohnwu.magisk.model.entity.recycler import androidx.databinding.Bindable import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.databinding.ComparableRvItem import com.topjohnwu.magisk.extensions.timeDateFormat -import com.topjohnwu.magisk.extensions.timeFormatMedium import com.topjohnwu.magisk.extensions.toTime -import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.model.entity.MagiskLog -import com.topjohnwu.magisk.model.entity.WrappedMagiskLog -import com.topjohnwu.magisk.utils.DiffObservableList -import com.topjohnwu.magisk.utils.KObservableField - -class LogRvItem : ComparableRvItem() { - override val layoutRes: Int = R.layout.item_page_log - - val items = DiffObservableList(callback) - - fun update(list: List) { - list.firstOrNull()?.isExpanded?.value = true - items.update(list) - } - - //two of these will never be present, safe to assume it's unique - override fun contentSameAs(other: LogRvItem): Boolean = false - - override fun itemSameAs(other: LogRvItem): Boolean = false -} - -class LogItemRvItem( - item: WrappedMagiskLog -) : ComparableRvItem() { - override val layoutRes: Int = R.layout.item_superuser_log - - val date = item.time.toTime(timeFormatMedium) - val items: List> = item.items.map { LogItemEntryRvItem(it) } - val isExpanded = KObservableField(false) - - fun toggle() = isExpanded.toggle() - - override fun contentSameAs(other: LogItemRvItem): Boolean { - if (items.size != other.items.size) return false - return items.all { it in other.items } - } - - override fun itemSameAs(other: LogItemRvItem): Boolean = date == other.date -} - -class LogItemEntryRvItem(val item: MagiskLog) : ComparableRvItem() { - override val layoutRes: Int = R.layout.item_superuser_log_entry - - val isExpanded = KObservableField(false) - - fun toggle() = isExpanded.toggle() - - override fun contentSameAs(other: LogItemEntryRvItem) = item == other.item - - override fun itemSameAs(other: LogItemEntryRvItem) = item.appName == other.item.appName -} - -class MagiskLogRvItem : ComparableRvItem() { - override val layoutRes: Int = R.layout.item_page_magisk_log - - val items = DiffObservableList(callback) - - fun update(list: List) { - items.update(list) - } - - //two of these will never be present, safe to assume it's unique - override fun contentSameAs(other: MagiskLogRvItem): Boolean = false - - override fun itemSameAs(other: MagiskLogRvItem): Boolean = false -} - -// --- class LogItem(val item: MagiskLog) : ObservableItem() { @@ -106,4 +36,4 @@ class LogItem(val item: MagiskLog) : ObservableItem() { item.time == other.item.time && isTop == other.isTop && isBottom == other.isBottom -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt index 3d4bb21a7..1a8a2f2c3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ModuleRvItem.kt @@ -1,7 +1,5 @@ package com.topjohnwu.magisk.model.entity.recycler -import android.content.res.Resources -import androidx.annotation.StringRes import androidx.databinding.Bindable import androidx.databinding.Observable import androidx.databinding.PropertyChangeRegistry @@ -10,77 +8,11 @@ import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem -import com.topjohnwu.magisk.extensions.addOnPropertyChangedCallback -import com.topjohnwu.magisk.extensions.get -import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.model.entity.module.Module import com.topjohnwu.magisk.model.entity.module.Repo import com.topjohnwu.magisk.redesign.module.ModuleViewModel import com.topjohnwu.magisk.utils.KObservableField -class ModuleRvItem(val item: Module) : ComparableRvItem() { - - override val layoutRes: Int = R.layout.item_module - - val lastActionNotice = KObservableField("") - val isChecked = KObservableField(item.enable) - val isDeletable = KObservableField(item.remove) - - init { - isChecked.addOnPropertyChangedCallback { - when (it) { - true -> { - item.enable = true - notice(R.string.disable_file_removed) - } - false -> { - item.enable = false - notice(R.string.disable_file_created) - } - } - } - isDeletable.addOnPropertyChangedCallback { - when (it) { - true -> { - item.remove = true - notice(R.string.remove_file_created) - } - false -> { - item.remove = false - notice(R.string.remove_file_deleted) - } - } - } - when { - item.updated -> notice(R.string.update_file_created) - item.remove -> notice(R.string.remove_file_created) - } - } - - fun toggle() = isChecked.toggle() - fun toggleDelete() = isDeletable.toggle() - - private fun notice(@StringRes info: Int) { - lastActionNotice.value = get().getString(info) - } - - override fun contentSameAs(other: ModuleRvItem): Boolean = item.version == other.item.version - && item.versionCode == other.item.versionCode - && item.description == other.item.description - && item.name == other.item.name - - override fun itemSameAs(other: ModuleRvItem): Boolean = item.id == other.item.id -} - -class RepoRvItem(val item: Repo) : ComparableRvItem() { - - override val layoutRes: Int = R.layout.item_repo - - override fun contentSameAs(other: RepoRvItem): Boolean = item == other.item - - override fun itemSameAs(other: RepoRvItem): Boolean = item.id == other.item.id -} - object SafeModeNotice : ComparableRvItem() { override val layoutRes = R.layout.item_safe_mode_notice @@ -227,4 +159,4 @@ abstract class ObservableItem : ComparableRvItem(), Observable { fun notifyChange(id: Int) = list.notifyChange(this, id) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt index c6f1593df..6d12c729e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/PolicyRvItem.kt @@ -3,54 +3,11 @@ package com.topjohnwu.magisk.model.entity.recycler import android.graphics.drawable.Drawable import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem -import com.topjohnwu.magisk.extensions.addOnPropertyChangedCallback -import com.topjohnwu.magisk.extensions.inject import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.model.entity.MagiskPolicy -import com.topjohnwu.magisk.model.events.PolicyEnableEvent import com.topjohnwu.magisk.model.events.PolicyUpdateEvent import com.topjohnwu.magisk.redesign.superuser.SuperuserViewModel import com.topjohnwu.magisk.utils.KObservableField -import com.topjohnwu.magisk.utils.RxBus - -class PolicyRvItem(val item: MagiskPolicy, val icon: Drawable) : ComparableRvItem() { - - override val layoutRes = R.layout.item_policy - - val isExpanded = KObservableField(false) - val isEnabled = KObservableField(item.policy == MagiskPolicy.ALLOW) - val shouldNotify = KObservableField(item.notification) - val shouldLog = KObservableField(item.logging) - - fun toggle() = isExpanded.toggle() - - private val rxBus: RxBus by inject() - - private val currentStateItem - get() = item.copy( - policy = if (isEnabled.value) MagiskPolicy.ALLOW else MagiskPolicy.DENY, - notification = shouldNotify.value, - logging = shouldLog.value - ) - - init { - isEnabled.addOnPropertyChangedCallback { - it ?: return@addOnPropertyChangedCallback - rxBus.post(PolicyEnableEvent(this@PolicyRvItem, it)) - } - shouldNotify.addOnPropertyChangedCallback { - it ?: return@addOnPropertyChangedCallback - rxBus.post(PolicyUpdateEvent.Notification(currentStateItem)) - } - shouldLog.addOnPropertyChangedCallback { - it ?: return@addOnPropertyChangedCallback - rxBus.post(PolicyUpdateEvent.Log(currentStateItem)) - } - } - - override fun contentSameAs(other: PolicyRvItem): Boolean = itemSameAs(other) - override fun itemSameAs(other: PolicyRvItem): Boolean = item.uid == other.item.uid -} class PolicyItem(val item: MagiskPolicy, val icon: Drawable) : ComparableRvItem() { override val layoutRes = R.layout.item_policy_md2 @@ -93,4 +50,4 @@ class PolicyItem(val item: MagiskPolicy, val icon: Drawable) : ComparableRvItem< override fun contentSameAs(other: PolicyItem) = itemSameAs(other) override fun itemSameAs(other: PolicyItem) = item.uid == other.item.uid -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/RxEvents.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/RxEvents.kt index c3171db84..2e67b8c35 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/events/RxEvents.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/RxEvents.kt @@ -1,19 +1,11 @@ package com.topjohnwu.magisk.model.events import com.topjohnwu.magisk.model.entity.MagiskPolicy -import com.topjohnwu.magisk.model.entity.recycler.HideProcessRvItem -import com.topjohnwu.magisk.model.entity.recycler.ModuleRvItem -import com.topjohnwu.magisk.model.entity.recycler.PolicyRvItem import com.topjohnwu.magisk.utils.RxBus -class HideProcessEvent(val item: HideProcessRvItem) : RxBus.Event - -class PolicyEnableEvent(val item: PolicyRvItem, val enable: Boolean) : RxBus.Event sealed class PolicyUpdateEvent(val item: MagiskPolicy) : RxBus.Event { class Notification(item: MagiskPolicy) : PolicyUpdateEvent(item) class Log(item: MagiskPolicy) : PolicyUpdateEvent(item) } -class ModuleUpdatedEvent(val item: ModuleRvItem) : RxBus.Event - -data class SafetyNetResult(val responseCode: Int) : RxBus.Event \ No newline at end of file +data class SafetyNetResult(val responseCode: Int) : RxBus.Event diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt index 11091b728..1675df86b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt @@ -10,12 +10,11 @@ import com.topjohnwu.magisk.redesign.hide.HideFragment import com.topjohnwu.magisk.redesign.home.HomeFragment import com.topjohnwu.magisk.redesign.install.InstallFragment import com.topjohnwu.magisk.redesign.log.LogFragment +import com.topjohnwu.magisk.redesign.module.ModuleFragment import com.topjohnwu.magisk.redesign.safetynet.SafetynetFragment import com.topjohnwu.magisk.redesign.settings.SettingsFragment import com.topjohnwu.magisk.redesign.superuser.SuperuserFragment import com.topjohnwu.magisk.redesign.theme.ThemeFragment -import com.topjohnwu.magisk.ui.module.ModulesFragment -import com.topjohnwu.magisk.ui.module.ReposFragment object Navigation { @@ -36,14 +35,10 @@ object Navigation { fun modules() = MagiskNavigationEvent { navDirections { - destination = ModulesFragment::class + destination = ModuleFragment::class } } - fun repos() = MagiskNavigationEvent { - navDirections { destination = ReposFragment::class } - } - fun hide() = MagiskNavigationEvent { navDirections { destination = HideFragment::class @@ -77,7 +72,6 @@ object Navigation { fun fromSection(section: String) = when (section) { "superuser" -> superuser() "modules" -> modules() - "downloads" -> repos() "magiskhide" -> hide() "log" -> log() "settings" -> settings() diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 509c42de8..07b57f127 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -24,12 +24,15 @@ import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.model.observer.Observer import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.redesign.compat.itemBindingOf -import com.topjohnwu.magisk.ui.home.MagiskState import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.superuser.Shell import me.tatarka.bindingcollectionadapter2.BR import kotlin.math.roundToInt +enum class MagiskState { + NOT_INSTALLED, UP_TO_DATE, OBSOLETE, LOADING +} + class HomeViewModel( private val repoMagisk: MagiskRepository ) : CompatViewModel() { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetViewModel.kt index 41b2d349b..7c0900f2a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/safetynet/SafetynetViewModel.kt @@ -7,11 +7,15 @@ import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.model.events.SafetyNetResult import com.topjohnwu.magisk.model.events.UpdateSafetyNetEvent import com.topjohnwu.magisk.redesign.compat.CompatViewModel -import com.topjohnwu.magisk.ui.home.SafetyNetState.* +import com.topjohnwu.magisk.redesign.safetynet.SafetyNetState.* import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.RxBus import com.topjohnwu.magisk.utils.SafetyNetHelper +enum class SafetyNetState { + LOADING, PASS, FAILED, IDLE +} + class SafetynetViewModel( rxBus: RxBus ) : CompatViewModel() { @@ -89,4 +93,4 @@ class SafetynetViewModel( private var safetyNetResult = -1 } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt deleted file mode 100644 index e1d83a2a5..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt +++ /dev/null @@ -1,252 +0,0 @@ -package com.topjohnwu.magisk.ui - -import android.content.Intent -import android.os.Bundle -import androidx.appcompat.app.AlertDialog -import androidx.core.view.GravityCompat -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentTransaction -import com.ncapdevi.fragnav.FragNavController -import com.ncapdevi.fragnav.FragNavTransactionOptions -import com.topjohnwu.magisk.Const -import com.topjohnwu.magisk.Const.Key.OPEN_SECTION -import com.topjohnwu.magisk.Info -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.BaseActivity -import com.topjohnwu.magisk.base.BaseFragment -import com.topjohnwu.magisk.databinding.ActivityMainBinding -import com.topjohnwu.magisk.extensions.addOnPropertyChangedCallback -import com.topjohnwu.magisk.extensions.snackbar -import com.topjohnwu.magisk.intent -import com.topjohnwu.magisk.model.events.* -import com.topjohnwu.magisk.model.navigation.MagiskAnimBuilder -import com.topjohnwu.magisk.model.navigation.MagiskNavigationEvent -import com.topjohnwu.magisk.model.navigation.Navigation -import com.topjohnwu.magisk.model.navigation.Navigator -import com.topjohnwu.magisk.ui.hide.MagiskHideFragment -import com.topjohnwu.magisk.ui.home.HomeFragment -import com.topjohnwu.magisk.ui.log.LogFragment -import com.topjohnwu.magisk.ui.module.ModulesFragment -import com.topjohnwu.magisk.ui.module.ReposFragment -import com.topjohnwu.magisk.ui.settings.SettingsFragment -import com.topjohnwu.magisk.ui.superuser.SuperuserFragment -import com.topjohnwu.magisk.utils.Utils -import org.koin.androidx.viewmodel.ext.android.viewModel -import timber.log.Timber -import kotlin.reflect.KClass - -open class MainActivity : BaseActivity(), Navigator, - FragNavController.RootFragmentListener, FragNavController.TransactionListener { - - override val layoutRes: Int = R.layout.activity_main - override val viewModel: MainViewModel by viewModel() - private val navHostId: Int = R.id.main_nav_host - private val defaultPosition: Int = 0 - - private val navigationController by lazy { - FragNavController(supportFragmentManager, navHostId) - } - private val isRootFragment get() = - navigationController.currentStackIndex != defaultPosition - - override val baseFragments: List> = listOf( - HomeFragment::class, - SuperuserFragment::class, - MagiskHideFragment::class, - ModulesFragment::class, - ReposFragment::class, - LogFragment::class, - SettingsFragment::class - ) - - override fun onCreate(savedInstanceState: Bundle?) { - if (!SplashActivity.DONE) { - startActivity(intent()) - finish() - } - - super.onCreate(savedInstanceState) - - if (Info.env.isUnsupported && !viewModel.shownUnsupportedDialog) { - viewModel.shownUnsupportedDialog = true - AlertDialog.Builder(this) - .setTitle(R.string.unsupport_magisk_title) - .setMessage(getString(R.string.unsupport_magisk_msg, Const.Version.MIN_VERSION)) - .setPositiveButton(android.R.string.ok, null) - .show() - } - - navigationController.apply { - rootFragmentListener = this@MainActivity - transactionListener = this@MainActivity - initialize(defaultPosition, savedInstanceState) - } - - checkHideSection() - setSupportActionBar(binding.mainInclude.mainToolbar) - - viewModel.isConnected.addOnPropertyChangedCallback { - checkHideSection() - } - - if (savedInstanceState == null) { - intent.getStringExtra(OPEN_SECTION)?.let { - onEventDispatched(Navigation.fromSection(it)) - } - } - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - navigationController.onSaveInstanceState(outState) - } - - override fun setTitle(title: CharSequence?) { - supportActionBar?.title = title - } - - override fun setTitle(titleId: Int) { - supportActionBar?.setTitle(titleId) - } - - override fun onBackPressed() { - if (binding.drawerLayout.isDrawerOpen(binding.navView)) { - binding.drawerLayout.closeDrawer(binding.navView) - } else { - val fragment = navigationController.currentFrag as? BaseFragment<*, *> - - if (fragment?.onBackPressed() == true) { - return - } - - try { - navigationController.popFragment() - } catch (e: UnsupportedOperationException) { - when { - isRootFragment -> { - val options = FragNavTransactionOptions.newBuilder() - .transition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE) - .build() - navigationController.switchTab(defaultPosition, options) - } - else -> super.onBackPressed() - } - } - } - } - - override fun onEventDispatched(event: ViewEvent) { - super.onEventDispatched(event) - when (event) { - is SnackbarEvent -> snackbar(snackbarView, event.message(this), event.length, event.f) - is BackPressEvent -> onBackPressed() - is MagiskNavigationEvent -> navigateTo(event) - is ViewActionEvent -> event.action(this) - is PermissionEvent -> withPermissions(*event.permissions.toTypedArray()) { - onSuccess { event.callback.onNext(true) } - onFailure { - event.callback.onNext(false) - event.callback.onError(SecurityException("User refused permissions")) - } - } - } - } - - override fun onSimpleEventDispatched(event: Int) { - super.onSimpleEventDispatched(event) - when (event) { - Navigation.Main.OPEN_NAV -> openNav() - } - } - - private fun openNav() = binding.drawerLayout.openDrawer(GravityCompat.START) - - private fun checkHideSection() { - val menu = binding.navView.menu - menu.findItem(R.id.magiskHideFragment).isVisible = Info.env.isActive && Info.env.magiskHide - menu.findItem(R.id.modulesFragment).isVisible = Info.env.isActive - menu.findItem(R.id.reposFragment).isVisible = Info.isConnected.value && Info.env.isActive - menu.findItem(R.id.logFragment).isVisible = Info.env.isActive - menu.findItem(R.id.superuserFragment).isVisible = Utils.showSuperUser() - } - - private fun FragNavTransactionOptions.Builder.customAnimations(options: MagiskAnimBuilder) = - customAnimations(options.enter, options.exit, options.popEnter, options.popExit).apply { - if (!options.anySet) { - transition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) - } - } - - override val numberOfRootFragments: Int get() = baseFragments.size - - override fun getRootFragment(index: Int) = baseFragments[index].java.newInstance() - - override fun onTabTransaction(fragment: Fragment?, index: Int) { - val fragmentId = when (fragment) { - is HomeFragment -> R.id.magiskFragment - is SuperuserFragment -> R.id.superuserFragment - is MagiskHideFragment -> R.id.magiskHideFragment - is ModulesFragment -> R.id.modulesFragment - is ReposFragment -> R.id.reposFragment - is LogFragment -> R.id.logFragment - is SettingsFragment -> R.id.settings - else -> return - } - binding.navView.setCheckedItem(fragmentId) - } - - override fun navigateTo(event: MagiskNavigationEvent) { - val directions = event.navDirections - - navigationController.defaultTransactionOptions = FragNavTransactionOptions.newBuilder() - .customAnimations(event.animOptions) - .build() - - navigationController.currentStack - ?.indexOfFirst { it.javaClass == event.navOptions.popUpTo } - ?.let { if (it == -1) null else it } // invalidate if class is not found - ?.let { if (event.navOptions.inclusive) it + 1 else it } - ?.let { navigationController.popFragments(it) } - - when (directions.isActivity) { - true -> navigateToActivity(event) - else -> navigateToFragment(event) - } - } - - private fun navigateToActivity(event: MagiskNavigationEvent) { - val destination = event.navDirections.destination?.java ?: let { - Timber.e("Cannot navigate to null destination") - return - } - val options = event.navOptions - - Intent(this, destination) - .putExtras(event.navDirections.args) - .apply { - if (options.singleTop) addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) - if (options.clearTask) addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) - } - .let { startActivity(it) } - } - - private fun navigateToFragment(event: MagiskNavigationEvent) { - val destination = event.navDirections.destination?.java ?: let { - Timber.e("Cannot navigate to null destination") - return - } - - when (val index = baseFragments.indexOfFirst { it.java.name == destination.name }) { - -1 -> destination.newInstance() - .apply { arguments = event.navDirections.args } - .let { navigationController.pushFragment(it) } - // When it's desired that fragments of same class are put on top of one another edit this - else -> navigationController.switchTab(index) - } - } - - override fun onFragmentTransaction( - fragment: Fragment?, - transactionType: FragNavController.TransactionType - ) = Unit -} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt deleted file mode 100644 index 8bb5bf5a1..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/MainViewModel.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.topjohnwu.magisk.ui - -import android.view.MenuItem -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.viewmodel.BaseViewModel -import com.topjohnwu.magisk.model.navigation.Navigation - - -class MainViewModel : BaseViewModel() { - - var shownUnsupportedDialog = false - - fun navPressed() = Navigation.Main.OPEN_NAV.publish() - - fun navigationItemPressed(item: MenuItem): Boolean { - when (item.itemId) { - R.id.magiskFragment -> Navigation.home() - R.id.superuserFragment -> Navigation.superuser() - R.id.magiskHideFragment -> Navigation.hide() - R.id.modulesFragment -> Navigation.modules() - R.id.reposFragment -> Navigation.repos() - R.id.logFragment -> Navigation.log() - R.id.settings -> Navigation.settings() - else -> null - }?.publish()?.let { return@navigationItemPressed true } - return false - } - -} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt deleted file mode 100644 index 2640abcad..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt +++ /dev/null @@ -1,96 +0,0 @@ -package com.topjohnwu.magisk.ui.hide - -import android.content.pm.ApplicationInfo -import com.topjohnwu.magisk.BR -import com.topjohnwu.magisk.base.viewmodel.BaseViewModel -import com.topjohnwu.magisk.data.repository.MagiskRepository -import com.topjohnwu.magisk.databinding.ComparableRvItem -import com.topjohnwu.magisk.extensions.addOnPropertyChangedCallback -import com.topjohnwu.magisk.extensions.subscribeK -import com.topjohnwu.magisk.extensions.toSingle -import com.topjohnwu.magisk.extensions.update -import com.topjohnwu.magisk.model.entity.recycler.HideProcessRvItem -import com.topjohnwu.magisk.model.entity.recycler.HideRvItem -import com.topjohnwu.magisk.model.entity.state.IndeterminateState -import com.topjohnwu.magisk.model.events.HideProcessEvent -import com.topjohnwu.magisk.utils.DiffObservableList -import com.topjohnwu.magisk.utils.KObservableField -import com.topjohnwu.magisk.utils.RxBus -import me.tatarka.bindingcollectionadapter2.OnItemBind -import timber.log.Timber - -class HideViewModel( - private val magiskRepo: MagiskRepository, - rxBus: RxBus -) : BaseViewModel() { - - val query = KObservableField("") - val isShowSystem = KObservableField(false) - - private val allItems = mutableListOf>() - val items = DiffObservableList(ComparableRvItem.callback) - val itemBinding = OnItemBind> { itemBinding, _, item -> - item.bind(itemBinding) - itemBinding.bindExtra(BR.viewModel, this@HideViewModel) - } - - init { - rxBus.register() - .subscribeK { toggleItem(it.item) } - .add() - - isShowSystem.addOnPropertyChangedCallback { query() } - query.addOnPropertyChangedCallback { query() } - - refresh() - } - - fun refresh() { - // fetching this for every item is nonsensical, so we add .cache() so the response is all - // the same for every single mapped item, it only actually executes the whole thing the - // first time around. - val hideTargets = magiskRepo.fetchHideTargets().cache() - - magiskRepo.fetchApps() - .flattenAsFlowable { it } - .map { HideRvItem(it, hideTargets.blockingGet()) } - .toList() - .map { - it.sortedWith(compareBy( - { it.isHiddenState.value }, - { it.item.name.toLowerCase() }, - { it.packageName } - )) - } - .doOnSuccess { allItems.update(it) } - .flatMap { queryRaw() } - .applyViewModel(this) - .subscribeK(onError = Timber::e) { items.update(it.first, it.second) } - .add() - } - - private fun query() = queryRaw() - .subscribeK { items.update(it.first, it.second) } - .add() - - private fun queryRaw( - showSystem: Boolean = isShowSystem.value, - query: String = this.query.value - ) = allItems.toSingle() - .map { it.filterIsInstance() } - .flattenAsFlowable { it } - .filter { - it.item.name.contains(query, ignoreCase = true) || - it.item.processes.any { it.contains(query, ignoreCase = true) } - } - .filter { - showSystem || (it.isHiddenState.value != IndeterminateState.UNCHECKED) || - (it.item.info.flags and ApplicationInfo.FLAG_SYSTEM == 0) - } - .toList() - .map { it to items.calculateDiff(it) } - - private fun toggleItem(item: HideProcessRvItem) = - magiskRepo.toggleHide(item.isHidden.value, item.packageName, item.process) - -} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/hide/MagiskHideFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/hide/MagiskHideFragment.kt deleted file mode 100644 index f9d4c67f3..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/hide/MagiskHideFragment.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.topjohnwu.magisk.ui.hide - -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem -import android.widget.SearchView -import com.topjohnwu.magisk.Config -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.BaseFragment -import com.topjohnwu.magisk.databinding.FragmentMagiskHideBinding -import org.koin.androidx.viewmodel.ext.android.viewModel - -class MagiskHideFragment : BaseFragment(), - SearchView.OnQueryTextListener { - - override val layoutRes: Int = R.layout.fragment_magisk_hide - override val viewModel: HideViewModel by viewModel() - - override fun onStart() { - super.onStart() - setHasOptionsMenu(true) - requireActivity().setTitle(R.string.magiskhide) - } - - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.menu_magiskhide, menu) - menu.apply { - val query = viewModel.query.value - val searchItem = menu.findItem(R.id.app_search) - val searchView = searchItem.actionView as? SearchView - - searchView?.run { - setOnQueryTextListener(this@MagiskHideFragment) - setQuery(query, false) - } - - if (query.isNotBlank()) { - searchItem.expandActionView() - searchView?.isIconified = false - } else { - searchItem.collapseActionView() - searchView?.isIconified = true - } - - val showSystem = Config.showSystemApp - - findItem(R.id.show_system).isChecked = showSystem - viewModel.isShowSystem.value = showSystem - } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (item.itemId == R.id.show_system) { - val showSystem = !item.isChecked - item.isChecked = showSystem - Config.showSystemApp = showSystem - viewModel.isShowSystem.value = showSystem - } - return true - } - - override fun onQueryTextSubmit(query: String?): Boolean { - viewModel.query.value = query.orEmpty() - return false - } - - override fun onQueryTextChange(query: String?): Boolean { - viewModel.query.value = query.orEmpty() - return false - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt deleted file mode 100644 index d9cd0df8b..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.topjohnwu.magisk.ui.home - -import android.content.Context -import com.topjohnwu.magisk.BuildConfig -import com.topjohnwu.magisk.Const -import com.topjohnwu.magisk.Info -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.BaseActivity -import com.topjohnwu.magisk.base.BaseFragment -import com.topjohnwu.magisk.data.repository.MagiskRepository -import com.topjohnwu.magisk.databinding.FragmentMagiskBinding -import com.topjohnwu.magisk.extensions.DynamicClassLoader -import com.topjohnwu.magisk.extensions.openUrl -import com.topjohnwu.magisk.extensions.subscribeK -import com.topjohnwu.magisk.extensions.writeTo -import com.topjohnwu.magisk.model.events.* -import com.topjohnwu.magisk.utils.SafetyNetHelper -import com.topjohnwu.magisk.view.MarkDownWindow -import com.topjohnwu.magisk.view.dialogs.* -import com.topjohnwu.superuser.Shell -import dalvik.system.DexFile -import io.reactivex.Completable -import org.koin.android.ext.android.inject -import org.koin.androidx.viewmodel.ext.android.viewModel -import java.io.File -import java.lang.reflect.InvocationHandler - -class HomeFragment : BaseFragment(), - SafetyNetHelper.Callback { - - override val layoutRes: Int = R.layout.fragment_magisk - override val viewModel: HomeViewModel by viewModel() - - private val magiskRepo: MagiskRepository by inject() - private val EXT_APK by lazy { File("${activity.filesDir.parent}/snet", "snet.jar") } - private val EXT_DEX by lazy { File(EXT_APK.parent, "snet.dex") } - - override fun onResponse(responseCode: Int) = viewModel.finishSafetyNetCheck(responseCode) - - override fun onEventDispatched(event: ViewEvent) { - super.onEventDispatched(event) - when (event) { - is OpenLinkEvent -> activity.openUrl(event.url) - is ManagerInstallEvent -> installManager() - is MagiskInstallEvent -> installMagisk() - is UninstallEvent -> uninstall() - is ManagerChangelogEvent -> changelogManager() - is EnvFixEvent -> fixEnv() - is UpdateSafetyNetEvent -> updateSafetyNet(false) - } - } - - override fun onStart() { - super.onStart() - setHasOptionsMenu(true) - requireActivity().setTitle(R.string.magisk) - } - - private fun installMagisk() { - // Show Manager update first - if (Info.remote.app.versionCode > BuildConfig.VERSION_CODE) { - installManager() - return - } - - MagiskInstallDialog(requireActivity() as BaseActivity<*, *>).show() - } - - private fun installManager() = ManagerInstallDialog(requireActivity()).show() - private fun uninstall() = UninstallDialog(requireActivity()).show() - private fun fixEnv() = EnvFixDialog(requireActivity()).show() - - private fun changelogManager() = MarkDownWindow - .show(requireActivity(), null, resources.openRawResource(R.raw.changelog)) - - private fun downloadSafetyNet(requiresUserInput: Boolean = true) { - fun download() = magiskRepo.fetchSafetynet() - .map { it.byteStream().writeTo(EXT_APK) } - .subscribeK { updateSafetyNet(true) } - - if (!requiresUserInput) { - download() - return - } - - CustomAlertDialog(requireActivity()) - .setTitle(R.string.proprietary_title) - .setMessage(R.string.proprietary_notice) - .setCancelable(false) - .setPositiveButton(android.R.string.yes) { _, _ -> download() } - .setNegativeButton(android.R.string.no) { _, _ -> viewModel.finishSafetyNetCheck(-2) } - .show() - } - - private fun updateSafetyNet(dieOnError: Boolean) { - Completable.fromAction { - val loader = DynamicClassLoader(EXT_APK) - val dex = DexFile.loadDex(EXT_APK.path, EXT_DEX.path, 0) - - // Scan through the dex and find our helper class - var helperClass: Class<*>? = null - for (className in dex.entries()) { - if (className.startsWith("x.")) { - val cls = loader.loadClass(className) - if (InvocationHandler::class.java.isAssignableFrom(cls)) { - helperClass = cls - break - } - } - } - helperClass ?: throw Exception() - - val helper = helperClass.getMethod("get", - Class::class.java, Context::class.java, Any::class.java) - .invoke(null, SafetyNetHelper::class.java, activity, this) as SafetyNetHelper - - if (helper.version < Const.SNET_EXT_VER) - throw Exception() - - helper.attest() - }.subscribeK(onError = { - if (dieOnError) { - viewModel.finishSafetyNetCheck(-1) - } else { - Shell.sh("rm -rf " + EXT_APK.parent).exec() - EXT_APK.parentFile?.mkdir() - downloadSafetyNet(!dieOnError) - } - }) - } -} - diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt deleted file mode 100644 index 2b8fc887f..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt +++ /dev/null @@ -1,259 +0,0 @@ -package com.topjohnwu.magisk.ui.home - -import android.content.pm.PackageManager -import com.topjohnwu.magisk.* -import com.topjohnwu.magisk.base.viewmodel.BaseViewModel -import com.topjohnwu.magisk.data.repository.MagiskRepository -import com.topjohnwu.magisk.extensions.* -import com.topjohnwu.magisk.model.events.* -import com.topjohnwu.magisk.model.observer.Observer -import com.topjohnwu.magisk.utils.KObservableField -import com.topjohnwu.magisk.utils.SafetyNetHelper -import com.topjohnwu.superuser.Shell -import io.reactivex.Completable - -enum class SafetyNetState { - LOADING, PASS, FAILED, IDLE -} - -enum class MagiskState { - NOT_INSTALLED, UP_TO_DATE, OBSOLETE, LOADING -} - -enum class MagiskItem { - MANAGER, MAGISK -} - -class HomeViewModel( - private val magiskRepo: MagiskRepository -) : BaseViewModel(State.LOADED) { - - val hasGMS = runCatching { - get().getPackageInfo("com.google.android.gms", 0); true - }.getOrElse { false } - - val isAdvancedExpanded = KObservableField(false) - - val isForceEncryption = KObservableField(Info.keepEnc) - val isKeepVerity = KObservableField(Info.keepVerity) - val isRecovery = KObservableField(Info.recovery) - - val magiskState = KObservableField(MagiskState.LOADING) - val magiskStateText = Observer(magiskState) { - when (magiskState.value) { - MagiskState.NOT_INSTALLED -> R.string.magisk_version_error.res() - MagiskState.UP_TO_DATE -> R.string.magisk_up_to_date.res() - MagiskState.LOADING -> R.string.checking_for_updates.res() - MagiskState.OBSOLETE -> R.string.magisk_update_title.res() - } - } - val magiskCurrentVersion = KObservableField("") - val magiskLatestVersion = KObservableField("") - val magiskAdditionalInfo = Observer(magiskState) { - if (Config.coreOnly) - R.string.core_only_enabled.res() - else - "" - } - - private val _managerState = KObservableField(MagiskState.LOADING) - val managerState = Observer(_managerState, isConnected) { - if (isConnected.value) _managerState.value else MagiskState.UP_TO_DATE - } - val managerStateText = Observer(managerState) { - when (managerState.value) { - MagiskState.NOT_INSTALLED -> R.string.invalid_update_channel.res() - MagiskState.UP_TO_DATE -> R.string.manager_up_to_date.res() - MagiskState.LOADING -> R.string.checking_for_updates.res() - MagiskState.OBSOLETE -> R.string.manager_update_title.res() - } - } - val managerCurrentVersion = KObservableField("") - val managerLatestVersion = KObservableField("") - val managerAdditionalInfo = Observer(managerState) { - if (packageName != BuildConfig.APPLICATION_ID) - "($packageName)" - else - "" - } - - val safetyNetTitle = KObservableField(R.string.safetyNet_check_text.res()) - val ctsState = KObservableField(SafetyNetState.IDLE) - val basicIntegrityState = KObservableField(SafetyNetState.IDLE) - val safetyNetState = Observer(ctsState, basicIntegrityState) { - val cts = ctsState.value - val basic = basicIntegrityState.value - val states = listOf(cts, basic) - - when { - states.any { it == SafetyNetState.LOADING } -> State.LOADING - states.any { it == SafetyNetState.IDLE } -> State.LOADING - else -> State.LOADED - } - } - - val isActive = KObservableField(false) - - private var shownDialog = false - - init { - isForceEncryption.addOnPropertyChangedCallback { - Info.keepEnc = it ?: return@addOnPropertyChangedCallback - } - isKeepVerity.addOnPropertyChangedCallback { - Info.keepVerity = it ?: return@addOnPropertyChangedCallback - } - isRecovery.addOnPropertyChangedCallback { - Info.recovery = it ?: return@addOnPropertyChangedCallback - } - isConnected.addOnPropertyChangedCallback { - if (it == true) refresh(false) - } - - refresh(false) - } - - fun paypalPressed() = OpenLinkEvent(Const.Url.PAYPAL_URL).publish() - fun patreonPressed() = OpenLinkEvent(Const.Url.PATREON_URL).publish() - fun twitterPressed() = OpenLinkEvent(Const.Url.TWITTER_URL).publish() - fun githubPressed() = OpenLinkEvent(Const.Url.SOURCE_CODE_URL).publish() - fun xdaPressed() = OpenLinkEvent(Const.Url.XDA_THREAD).publish() - fun uninstallPressed() = UninstallEvent().publish() - - fun advancedPressed() = isAdvancedExpanded.toggle() - - fun installPressed(item: MagiskItem) = when (item) { - MagiskItem.MANAGER -> ManagerInstallEvent().publish() - MagiskItem.MAGISK -> MagiskInstallEvent().publish() - } - - fun cardPressed(item: MagiskItem) = when (item) { - MagiskItem.MANAGER -> ManagerChangelogEvent().publish() - MagiskItem.MAGISK -> MagiskChangelogEvent().publish() - } - - fun safetyNetPressed() { - ctsState.value = SafetyNetState.LOADING - basicIntegrityState.value = SafetyNetState.LOADING - safetyNetTitle.value = R.string.checking_safetyNet_status.res() - - UpdateSafetyNetEvent().publish() - } - - fun finishSafetyNetCheck(response: Int) = when { - response and 0x0F == 0 -> { - val hasCtsPassed = response and SafetyNetHelper.CTS_PASS != 0 - val hasBasicIntegrityPassed = response and SafetyNetHelper.BASIC_PASS != 0 - safetyNetTitle.value = R.string.safetyNet_check_success.res() - ctsState.value = if (hasCtsPassed) { - SafetyNetState.PASS - } else { - SafetyNetState.FAILED - } - basicIntegrityState.value = if (hasBasicIntegrityPassed) { - SafetyNetState.PASS - } else { - SafetyNetState.FAILED - } - } - response == -2 -> { - ctsState.value = SafetyNetState.IDLE - basicIntegrityState.value = SafetyNetState.IDLE - } - else -> { - ctsState.value = SafetyNetState.IDLE - basicIntegrityState.value = SafetyNetState.IDLE - safetyNetTitle.value = when (response) { - SafetyNetHelper.RESPONSE_ERR -> R.string.safetyNet_res_invalid.res() - else -> R.string.safetyNet_api_error.res() - } - } - } - - @JvmOverloads - fun refresh(invalidate: Boolean = true) { - if (invalidate) - Info.envRef.invalidate() - - isActive.value = Info.env.isActive - - val fetchUpdate = if (isConnected.value) - magiskRepo.fetchUpdate().ignoreElement() - else - Completable.complete() - - Completable.fromAction { - // Ensure value is ready - Info.env - }.andThen(fetchUpdate) - .applyViewModel(this) - .doOnSubscribeUi { - magiskState.value = MagiskState.LOADING - _managerState.value = MagiskState.LOADING - ctsState.value = SafetyNetState.IDLE - basicIntegrityState.value = SafetyNetState.IDLE - safetyNetTitle.value = R.string.safetyNet_check_text.res() - }.subscribeK { - updateSelf() - ensureEnv() - refreshVersions() - } - } - - private fun refreshVersions() { - magiskCurrentVersion.value = if (magiskState.value != MagiskState.NOT_INSTALLED) { - VERSION_FMT.format(Info.env.magiskVersionString, Info.env.magiskVersionCode) - } else { - "" - } - - managerCurrentVersion.value = if (isRunningAsStub) MGR_VER_FMT - .format(BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE, Info.stub!!.version) - else - VERSION_FMT.format(BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE) - } - - private fun updateSelf() { - magiskState.value = when (Info.env.magiskVersionCode) { - in Int.MIN_VALUE .. 0 -> MagiskState.NOT_INSTALLED - in 1 until Info.remote.magisk.versionCode -> MagiskState.OBSOLETE - else -> MagiskState.UP_TO_DATE - } - - magiskLatestVersion.value = - VERSION_FMT.format(Info.remote.magisk.version, Info.remote.magisk.versionCode) - - _managerState.value = when (Info.remote.app.versionCode) { - in Int.MIN_VALUE .. 0 -> MagiskState.NOT_INSTALLED //wrong update channel - in (BuildConfig.VERSION_CODE + 1) .. Int.MAX_VALUE -> MagiskState.OBSOLETE - else -> { - if (Info.stub?.version ?: Int.MAX_VALUE < Info.remote.stub.versionCode) - MagiskState.OBSOLETE - else - MagiskState.UP_TO_DATE - } - } - - managerLatestVersion.value = MGR_VER_FMT - .format(Info.remote.app.version, Info.remote.app.versionCode, Info.remote.stub.versionCode) - } - - private fun ensureEnv() { - val invalidStates = - listOf(MagiskState.NOT_INSTALLED, MagiskState.LOADING) - - // Don't bother checking env when magisk is not installed, loading or already has been shown - if (invalidStates.any { it == magiskState.value } || shownDialog) return - - if (!Shell.su("env_check").exec().isSuccess) { - shownDialog = true - EnvFixEvent().publish() - } - } - - companion object { - private const val VERSION_FMT = "%s (%d)" - private const val MGR_VER_FMT = "%s (%d) (%d)" - } - -} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt deleted file mode 100644 index 24f0e1db2..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.topjohnwu.magisk.ui.log - - -import android.os.Bundle -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem -import android.view.View -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.BaseFragment -import com.topjohnwu.magisk.databinding.FragmentLogBinding -import com.topjohnwu.magisk.model.events.PageChangedEvent -import com.topjohnwu.magisk.model.events.ViewEvent -import org.koin.androidx.viewmodel.ext.android.viewModel - -class LogFragment : BaseFragment() { - - override val layoutRes: Int = R.layout.fragment_log - override val viewModel: LogViewModel by viewModel() - - override fun onEventDispatched(event: ViewEvent) { - super.onEventDispatched(event) - when (event) { - is PageChangedEvent -> activity.invalidateOptionsMenu() - } - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding.logTabs.setupWithViewPager(binding.logContainer, true) - } - - override fun onStart() { - super.onStart() - setHasOptionsMenu(true) - activity.setTitle(R.string.log) - } - - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.menu_log, menu) - menu.findItem(R.id.menu_save).isVisible = viewModel.currentPage.value == 1 - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - R.id.menu_save -> activity.withExternalRW { - onSuccess { - viewModel.saveLog() - } - } - R.id.menu_clear -> viewModel.clearLog() - R.id.menu_refresh -> viewModel.refresh() - } - return true - } - -} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt deleted file mode 100644 index d3d50e3fd..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt +++ /dev/null @@ -1,120 +0,0 @@ -package com.topjohnwu.magisk.ui.log - -import android.content.res.Resources -import com.topjohnwu.magisk.BR -import com.topjohnwu.magisk.Config -import com.topjohnwu.magisk.Const -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.viewmodel.BaseViewModel -import com.topjohnwu.magisk.data.repository.LogRepository -import com.topjohnwu.magisk.databinding.ComparableRvItem -import com.topjohnwu.magisk.extensions.addOnPropertyChangedCallback -import com.topjohnwu.magisk.extensions.doOnSubscribeUi -import com.topjohnwu.magisk.extensions.subscribeK -import com.topjohnwu.magisk.model.binding.BindingAdapter -import com.topjohnwu.magisk.model.entity.recycler.ConsoleRvItem -import com.topjohnwu.magisk.model.entity.recycler.LogItemRvItem -import com.topjohnwu.magisk.model.entity.recycler.LogRvItem -import com.topjohnwu.magisk.model.entity.recycler.MagiskLogRvItem -import com.topjohnwu.magisk.model.events.PageChangedEvent -import com.topjohnwu.magisk.model.events.SnackbarEvent -import com.topjohnwu.magisk.utils.DiffObservableList -import com.topjohnwu.magisk.utils.KObservableField -import com.topjohnwu.superuser.Shell -import me.tatarka.bindingcollectionadapter2.BindingViewPagerAdapter -import me.tatarka.bindingcollectionadapter2.OnItemBind -import timber.log.Timber -import java.io.File -import java.util.* - -class LogViewModel( - private val resources: Resources, - private val logRepo: LogRepository -) : BaseViewModel(), BindingViewPagerAdapter.PageTitles> { - - val itemsAdapter = BindingAdapter() - val items = DiffObservableList(ComparableRvItem.callback) - val itemBinding = OnItemBind> { itemBinding, _, item -> - item.bind(itemBinding) - itemBinding.bindExtra(BR.viewModel, this@LogViewModel) - } - val currentPage = KObservableField(0) - private val currentItem get() = items[currentPage.value] - - private val logItem get() = items[0] as LogRvItem - private val magiskLogItem get() = items[1] as MagiskLogRvItem - - val scrollPosition = KObservableField(0) - - init { - currentPage.addOnPropertyChangedCallback { - it ?: return@addOnPropertyChangedCallback - PageChangedEvent().publish() - } - - items.addAll(listOf(LogRvItem(), MagiskLogRvItem())) - refresh() - } - - override fun getPageTitle(position: Int, item: ComparableRvItem<*>?) = when (item) { - is LogRvItem -> resources.getString(R.string.superuser) - is MagiskLogRvItem -> resources.getString(R.string.magisk) - else -> "" - } - - fun scrollDownPressed() { - scrollPosition.value = magiskLogItem.items.size - 1 - } - - fun refresh() { - fetchLogs().subscribeK { logItem.update(it) } - fetchMagiskLog().subscribeK { magiskLogItem.update(it) } - } - - fun saveLog() { - val now = Calendar.getInstance() - val filename = "magisk_log_%04d%02d%02d_%02d%02d%02d.log".format( - now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1, - now.get(Calendar.DAY_OF_MONTH), now.get(Calendar.HOUR_OF_DAY), - now.get(Calendar.MINUTE), now.get(Calendar.SECOND) - ) - - val logFile = File(Config.downloadDirectory, filename) - runCatching { - logFile.createNewFile() - }.onFailure { - Timber.e(it) - return - } - - Shell.su("cat ${Const.MAGISK_LOG} > $logFile").submit { - SnackbarEvent(logFile.path).publish() - } - } - - fun clearLog() = when (currentItem) { - is LogRvItem -> clearLogs { refresh() } - is MagiskLogRvItem -> clearMagiskLogs { refresh() } - else -> Unit - } - - private fun clearLogs(callback: () -> Unit) = logRepo.clearLogs() - .doOnSubscribeUi(callback) - .subscribeK { SnackbarEvent(R.string.logs_cleared).publish() } - .add() - - private fun clearMagiskLogs(callback: () -> Unit) = logRepo.clearMagiskLogs() - .doOnComplete(callback) - .subscribeK { SnackbarEvent(R.string.logs_cleared).publish() } - .add() - - private fun fetchLogs() = logRepo.fetchLogs() - .flattenAsFlowable { it } - .map { LogItemRvItem(it) } - .toList() - - private fun fetchMagiskLog() = logRepo.fetchMagiskLogs() - .map { ConsoleRvItem(it) } - .toList() - -} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt deleted file mode 100644 index 1ac4ed62b..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt +++ /dev/null @@ -1,111 +0,0 @@ -package com.topjohnwu.magisk.ui.module - -import android.content.res.Resources -import com.topjohnwu.magisk.BR -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.viewmodel.BaseViewModel -import com.topjohnwu.magisk.data.database.RepoDao -import com.topjohnwu.magisk.databinding.ComparableRvItem -import com.topjohnwu.magisk.extensions.* -import com.topjohnwu.magisk.model.entity.module.Module -import com.topjohnwu.magisk.model.entity.recycler.ModuleRvItem -import com.topjohnwu.magisk.model.entity.recycler.RepoRvItem -import com.topjohnwu.magisk.model.entity.recycler.SectionRvItem -import com.topjohnwu.magisk.model.events.InstallModuleEvent -import com.topjohnwu.magisk.model.events.OpenChangelogEvent -import com.topjohnwu.magisk.model.events.OpenFilePickerEvent -import com.topjohnwu.magisk.tasks.RepoUpdater -import com.topjohnwu.magisk.utils.DiffObservableList -import com.topjohnwu.magisk.utils.KObservableField -import io.reactivex.Single -import io.reactivex.disposables.Disposable -import me.tatarka.bindingcollectionadapter2.OnItemBind - -class ModuleViewModel( - private val resources: Resources, - private val repoUpdater: RepoUpdater, - private val repoDB: RepoDao -) : BaseViewModel() { - - val query = KObservableField("") - - private val allItems = mutableListOf>() - - val itemsInstalled = DiffObservableList(ComparableRvItem.callback) - val itemsRemote = DiffObservableList(ComparableRvItem.callback) - val itemBinding = OnItemBind> { itemBinding, _, item -> - item.bind(itemBinding) - itemBinding.bindExtra(BR.viewModel, this@ModuleViewModel) - } - - private var queryDisposable: Disposable? = null - - init { - query.addOnPropertyChangedCallback { - queryDisposable?.dispose() - queryDisposable = query() - } - refresh(false) - } - - fun fabPressed() = OpenFilePickerEvent().publish() - fun repoPressed(item: RepoRvItem) = OpenChangelogEvent(item.item).publish() - fun downloadPressed(item: RepoRvItem) = InstallModuleEvent(item.item).publish() - - fun refresh(force: Boolean) { - Single.fromCallable { Module.loadModules() } - .flattenAsFlowable { it } - .map { ModuleRvItem(it) } - .toList() - .map { it to itemsInstalled.calculateDiff(it) } - .doOnSuccessUi { itemsInstalled.update(it.first, it.second) } - .flatMap { repoUpdater(force) } - .flattenAsFlowable { repoDB.repos } - .map { RepoRvItem(it) } - .toList() - .doOnSuccess { allItems.update(it) } - .flatMap { queryRaw() } - .applyViewModel(this) - .subscribeK { itemsRemote.update(it.first, it.second) } - } - - private fun query() = queryRaw() - .subscribeK { itemsRemote.update(it.first, it.second) } - - private fun queryRaw(query: String = this.query.value) = allItems.toSingle() - .map { it.filterIsInstance() } - .flattenAsFlowable { it } - .filter { - it.item.name.contains(query, ignoreCase = true) || - it.item.author.contains(query, ignoreCase = true) || - it.item.description.contains(query, ignoreCase = true) - } - .toList() - .map { if (query.isEmpty()) it.divide() else it } - .map { it to itemsRemote.calculateDiff(it) } - - private fun List.divide(): List> { - val installed = itemsInstalled.filterIsInstance() - - fun > List.withTitle(text: Int) = - if (isEmpty()) this else listOf(SectionRvItem(resources.getString(text))) + this - - val groupedItems = groupBy { repo -> - installed.firstOrNull { it.item.id == repo.item.id }?.let { - if (it.item.versionCode < repo.item.versionCode) MODULE_UPDATABLE - else MODULE_INSTALLED - } ?: MODULE_REMOTE - } - - return groupedItems.getOrElse(MODULE_UPDATABLE) { listOf() }.withTitle(R.string.update_available) + - groupedItems.getOrElse(MODULE_INSTALLED) { listOf() }.withTitle(R.string.installed) + - groupedItems.getOrElse(MODULE_REMOTE) { listOf() }.withTitle(R.string.not_installed) - } - - companion object { - protected const val MODULE_INSTALLED = 0 - protected const val MODULE_REMOTE = 1 - protected const val MODULE_UPDATABLE = 2 - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModulesFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModulesFragment.kt deleted file mode 100644 index ba2520707..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModulesFragment.kt +++ /dev/null @@ -1,99 +0,0 @@ -package com.topjohnwu.magisk.ui.module - -import android.app.Activity -import android.content.Intent -import android.os.Bundle -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem -import android.view.View -import androidx.recyclerview.widget.RecyclerView -import com.topjohnwu.magisk.Const -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.BaseFragment -import com.topjohnwu.magisk.databinding.FragmentModulesBinding -import com.topjohnwu.magisk.extensions.reboot -import com.topjohnwu.magisk.intent -import com.topjohnwu.magisk.model.events.OpenFilePickerEvent -import com.topjohnwu.magisk.model.events.ViewEvent -import com.topjohnwu.magisk.ui.flash.FlashActivity -import com.topjohnwu.superuser.Shell -import org.koin.androidx.viewmodel.ext.android.sharedViewModel - -class ModulesFragment : BaseFragment() { - - override val layoutRes: Int = R.layout.fragment_modules - override val viewModel: ModuleViewModel by sharedViewModel() - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - if (requestCode == Const.ID.FETCH_ZIP && resultCode == Activity.RESULT_OK && data != null) { - // Get the URI of the selected file - val intent = activity.intent() - intent.setData(data.data).putExtra(Const.Key.FLASH_ACTION, Const.Value.FLASH_ZIP) - startActivity(intent) - } - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - binding.modulesContent.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - binding.modulesRefreshLayout.isEnabled = recyclerView.getChildAt(0).top >= 0 - } - }) - } - - override fun onEventDispatched(event: ViewEvent) { - super.onEventDispatched(event) - when (event) { - is OpenFilePickerEvent -> selectFile() - } - } - - override fun onStart() { - super.onStart() - setHasOptionsMenu(true) - requireActivity().setTitle(R.string.modules) - } - - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.menu_reboot, menu) - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - R.id.reboot -> { - reboot() - return true - } - R.id.reboot_recovery -> { - Shell.su("/system/bin/reboot recovery").submit() - return true - } - R.id.reboot_bootloader -> { - reboot("bootloader") - return true - } - R.id.reboot_download -> { - reboot("download") - return true - } - R.id.reboot_edl -> { - reboot("edl") - return true - } - else -> return false - } - } - - private fun selectFile() { - activity.withExternalRW { - onSuccess { - val intent = Intent(Intent.ACTION_GET_CONTENT) - intent.type = "application/zip" - startActivityForResult(intent, Const.ID.FETCH_ZIP) - } - } - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/module/ReposFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ReposFragment.kt deleted file mode 100644 index 70ebb78c5..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/module/ReposFragment.kt +++ /dev/null @@ -1,116 +0,0 @@ -package com.topjohnwu.magisk.ui.module - -import android.annotation.SuppressLint -import android.app.AlertDialog -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem -import android.widget.SearchView -import com.topjohnwu.magisk.Config -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.BaseFragment -import com.topjohnwu.magisk.databinding.FragmentReposBinding -import com.topjohnwu.magisk.model.download.DownloadService -import com.topjohnwu.magisk.model.entity.internal.Configuration -import com.topjohnwu.magisk.model.entity.internal.DownloadSubject -import com.topjohnwu.magisk.model.entity.module.Repo -import com.topjohnwu.magisk.model.events.InstallModuleEvent -import com.topjohnwu.magisk.model.events.OpenChangelogEvent -import com.topjohnwu.magisk.model.events.ViewEvent -import com.topjohnwu.magisk.view.MarkDownWindow -import com.topjohnwu.magisk.view.dialogs.CustomAlertDialog -import org.koin.androidx.viewmodel.ext.android.sharedViewModel - -class ReposFragment : BaseFragment(), - SearchView.OnQueryTextListener { - - override val layoutRes: Int = R.layout.fragment_repos - override val viewModel: ModuleViewModel by sharedViewModel() - - override fun onStart() { - super.onStart() - setHasOptionsMenu(true) - requireActivity().setTitle(R.string.downloads) - } - - override fun onEventDispatched(event: ViewEvent) { - super.onEventDispatched(event) - when (event) { - is OpenChangelogEvent -> openChangelog(event.item) - is InstallModuleEvent -> installModule(event.item) - } - } - - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.menu_repo, menu) - - val query = viewModel.query.value - val searchItem = menu.findItem(R.id.repo_search) - val searchView = searchItem.actionView as? SearchView - - searchView?.run { - setOnQueryTextListener(this@ReposFragment) - setQuery(query, false) - } - - if (query.isNotBlank()) { - searchItem.expandActionView() - searchView?.isIconified = false - } else { - searchItem.collapseActionView() - searchView?.isIconified = true - } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (item.itemId == R.id.repo_sort) { - AlertDialog.Builder(activity) - .setTitle(R.string.sorting_order) - .setSingleChoiceItems( - R.array.sorting_orders, - Config.repoOrder - ) { d, which -> - Config.repoOrder = which - viewModel.refresh(false) - d.dismiss() - }.show() - } - return true - } - - override fun onQueryTextSubmit(p0: String?): Boolean { - viewModel.query.value = p0.orEmpty() - return false - } - - override fun onQueryTextChange(p0: String?): Boolean { - viewModel.query.value = p0.orEmpty() - return false - } - - private fun openChangelog(item: Repo) { - MarkDownWindow.show(requireActivity(), null, item.readme) - } - - @SuppressLint("MissingPermission") - private fun installModule(item: Repo) { - val context = activity - - fun download(install: Boolean) = context.withExternalRW { - onSuccess { - DownloadService(context) { - val config = if (install) Configuration.Flash.Primary else Configuration.Download - subject = DownloadSubject.Module(item, config) - } - } - } - - CustomAlertDialog(context) - .setTitle(context.getString(R.string.repo_install_title, item.name)) - .setMessage(context.getString(R.string.repo_install_msg, item.downloadFilename)) - .setCancelable(true) - .setPositiveButton(R.string.install) { _, _ -> download(true) } - .setNeutralButton(R.string.download) { _, _ -> download(false) } - .show() - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt deleted file mode 100644 index 399874402..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt +++ /dev/null @@ -1,347 +0,0 @@ -package com.topjohnwu.magisk.ui.settings - -import android.content.SharedPreferences -import android.os.Build -import android.os.Bundle -import android.os.Environment -import android.view.LayoutInflater -import android.widget.EditText -import android.widget.Toast -import androidx.appcompat.app.AlertDialog -import androidx.databinding.DataBindingUtil -import androidx.preference.ListPreference -import androidx.preference.Preference -import androidx.preference.PreferenceCategory -import androidx.preference.SwitchPreferenceCompat -import com.topjohnwu.magisk.* -import com.topjohnwu.magisk.base.BasePreferenceFragment -import com.topjohnwu.magisk.data.database.RepoDao -import com.topjohnwu.magisk.databinding.CustomDownloadDialogBinding -import com.topjohnwu.magisk.databinding.DialogCustomNameBinding -import com.topjohnwu.magisk.extensions.subscribeK -import com.topjohnwu.magisk.model.download.DownloadService -import com.topjohnwu.magisk.model.entity.internal.Configuration -import com.topjohnwu.magisk.model.entity.internal.DownloadSubject -import com.topjohnwu.magisk.model.observer.Observer -import com.topjohnwu.magisk.utils.* -import com.topjohnwu.superuser.Shell -import io.reactivex.Completable -import org.koin.android.ext.android.inject -import java.io.File - -class SettingsFragment : BasePreferenceFragment() { - - private val repoDB: RepoDao by inject() - - private lateinit var updateChannel: ListPreference - private lateinit var autoRes: ListPreference - private lateinit var suNotification: ListPreference - private lateinit var requestTimeout: ListPreference - private lateinit var rootConfig: ListPreference - private lateinit var multiuserConfig: ListPreference - private lateinit var nsConfig: ListPreference - - override fun onStart() { - super.onStart() - setHasOptionsMenu(true) - requireActivity().setTitle(R.string.settings) - } - - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - preferenceManager.setStorageDeviceProtected() - setPreferencesFromResource(R.xml.app_settings, rootKey) - - findPreference("redesign_cat")?.isVisible = BuildConfig.DEBUG - - // Get preferences - updateChannel = findPreference(Config.Key.UPDATE_CHANNEL)!! - rootConfig = findPreference(Config.Key.ROOT_ACCESS)!! - autoRes = findPreference(Config.Key.SU_AUTO_RESPONSE)!! - requestTimeout = findPreference(Config.Key.SU_REQUEST_TIMEOUT)!! - suNotification = findPreference(Config.Key.SU_NOTIFICATION)!! - multiuserConfig = findPreference(Config.Key.SU_MULTIUSER_MODE)!! - nsConfig = findPreference(Config.Key.SU_MNT_NS)!! - val reauth = findPreference(Config.Key.SU_REAUTH)!! - val biometric = findPreference(Config.Key.SU_BIOMETRIC)!! - val generalCategory = findPreference("general")!! - val magiskCategory = findPreference("magisk")!! - val suCategory = findPreference("superuser")!! - val hideManager = findPreference("hide")!! - val restoreManager = findPreference("restore")!! - - // Remove/Disable entries - - // Only show canary channels if user is already on canary channel - // or the user have already chosen canary channel - if (!Utils.isCanary && Config.updateChannel < Config.Value.CANARY_CHANNEL) { - // Remove the last 2 entries - val entries = updateChannel.entries - updateChannel.entries = entries.copyOf(entries.size - 2) - } - - // Remove dangerous settings in secondary user - if (Const.USER_ID > 0) { - suCategory.removePreference(multiuserConfig) - } - - // Remove re-authentication option on Android O, it will not work - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - suCategory.removePreference(reauth) - } - - // Disable biometric option if not possible - if (!BiometricHelper.isSupported) { - biometric.isEnabled = false - biometric.isChecked = false - biometric.setSummary(R.string.no_biometric) - } - - if (Const.USER_ID == 0 && Info.isConnected.value && Info.env.isActive) { - if (activity.packageName == BuildConfig.APPLICATION_ID) { - generalCategory.removePreference(restoreManager) - hideManager.setOnPreferenceClickListener { - showManagerNameDialog { - PatchAPK.hideManager(requireContext(), it) - } - true - } - } else { - generalCategory.removePreference(hideManager) - restoreManager.setOnPreferenceClickListener { - DownloadService(requireContext()) { - subject = DownloadSubject.Manager(Configuration.APK.Restore) - } - true - } - } - } else { - // Remove if not primary user, no connection, or no root - generalCategory.removePreference(restoreManager) - generalCategory.removePreference(hideManager) - } - - if (!Utils.showSuperUser()) { - preferenceScreen.removePreference(suCategory) - } - - if (!Info.env.isActive) { - preferenceScreen.removePreference(magiskCategory) - generalCategory.removePreference(hideManager) - } - - findPreference("clear")?.also { - if (Info.env.isActive) { - it.setOnPreferenceClickListener { - Completable.fromAction { repoDB.clear() }.subscribeK { - Utils.toast(R.string.repo_cache_cleared, Toast.LENGTH_SHORT) - } - true - } - } else { - generalCategory.removePreference(it) - } - } - - findPreference("hosts")?.setOnPreferenceClickListener { - Shell.su("add_hosts_module").submit { - Utils.toast(R.string.settings_hosts_toast, Toast.LENGTH_SHORT) - } - true - } - - findPreference(Config.Key.DOWNLOAD_PATH)?.apply { - summary = Config.downloadPath - setOnPreferenceClickListener { pref -> - activity.withExternalRW { - onSuccess { - showDownloadDialog { - Config.downloadPath = it - pref.summary = it - } - } - } - true - } - } - - updateChannel.setOnPreferenceChangeListener { _, value -> - val channel = value.toString().toInt() - val previous = Config.updateChannel - - if (channel == Config.Value.CUSTOM_CHANNEL) { - showUrlDialog(Config.customChannelUrl, { - Config.updateChannel = previous - }, { - Config.customChannelUrl = it - }) - } - true - } - - setLocalePreference(findPreference(Config.Key.LOCALE)!!) - - setSummary() - } - - override fun onSharedPreferenceChanged(prefs: SharedPreferences, key: String) { - fun getStrInt() = prefs.getString(key, null)?.toInt() ?: 0 - - when (key) { - Config.Key.ROOT_ACCESS -> Config.rootMode = getStrInt() - Config.Key.SU_MULTIUSER_MODE -> Config.suMultiuserMode = getStrInt() - Config.Key.SU_MNT_NS -> Config.suMntNamespaceMode = getStrInt() - Config.Key.DARK_THEME -> requireActivity().recreate() - Config.Key.COREONLY -> { - if (prefs.getBoolean(key, false)) { - runCatching { - Const.MAGISK_DISABLE_FILE.createNewFile() - } - } else { - Const.MAGISK_DISABLE_FILE.delete() - } - Utils.toast(R.string.settings_reboot_toast, Toast.LENGTH_LONG) - } - Config.Key.MAGISKHIDE -> if (prefs.getBoolean(key, false)) { - Shell.su("magiskhide --enable").submit() - } else { - Shell.su("magiskhide --disable").submit() - } - Config.Key.LOCALE -> { - refreshLocale() - activity.recreate() - } - Config.Key.CHECK_UPDATES -> Utils.scheduleUpdateCheck(activity) - } - setSummary(key) - } - - override fun onPreferenceTreeClick(preference: Preference): Boolean { - when (preference.key) { - Config.Key.SU_BIOMETRIC -> { - val checked = (preference as SwitchPreferenceCompat).isChecked - preference.isChecked = !checked - BiometricHelper.authenticate(requireActivity()) { - preference.isChecked = checked - Config.suBiometric = checked - } - } - } - return true - } - - private fun setLocalePreference(lp: ListPreference) { - lp.isEnabled = false - availableLocales.subscribeK { (names, values) -> - lp.isEnabled = true - lp.entries = names - lp.entryValues = values - lp.summary = currentLocale.getDisplayName(currentLocale) - } - } - - private fun setSummary(key: String) { - when (key) { - Config.Key.ROOT_ACCESS -> rootConfig.summary = resources - .getStringArray(R.array.su_access)[Config.rootMode] - Config.Key.SU_MULTIUSER_MODE -> multiuserConfig.summary = resources - .getStringArray(R.array.multiuser_summary)[Config.suMultiuserMode] - Config.Key.SU_MNT_NS -> nsConfig.summary = resources - .getStringArray(R.array.namespace_summary)[Config.suMntNamespaceMode] - Config.Key.UPDATE_CHANNEL -> { - var ch = Config.updateChannel - ch = if (ch < 0) Config.Value.STABLE_CHANNEL else ch - updateChannel.summary = resources - .getStringArray(R.array.update_channel)[ch] - } - Config.Key.SU_AUTO_RESPONSE -> autoRes.summary = resources - .getStringArray(R.array.auto_response)[Config.suAutoReponse] - Config.Key.SU_NOTIFICATION -> suNotification.summary = resources - .getStringArray(R.array.su_notification)[Config.suNotification] - Config.Key.SU_REQUEST_TIMEOUT -> requestTimeout.summary = - getString(R.string.request_timeout_summary, Config.suDefaultTimeout) - } - } - - private fun setSummary() { - setSummary(Config.Key.ROOT_ACCESS) - setSummary(Config.Key.SU_MULTIUSER_MODE) - setSummary(Config.Key.SU_MNT_NS) - setSummary(Config.Key.UPDATE_CHANNEL) - setSummary(Config.Key.SU_AUTO_RESPONSE) - setSummary(Config.Key.SU_NOTIFICATION) - setSummary(Config.Key.SU_REQUEST_TIMEOUT) - } - - private inline fun showUrlDialog( - initialValue: String, - crossinline onCancel: () -> Unit = {}, - crossinline onSuccess: (String) -> Unit - ) { - val v = LayoutInflater - .from(requireActivity()) - .inflate(R.layout.custom_channel_dialog, null) - - val url = v.findViewById(R.id.custom_url).apply { - setText(initialValue) - } - - AlertDialog.Builder(requireActivity()) - .setTitle(R.string.settings_update_custom) - .setView(v) - .setPositiveButton(android.R.string.ok) { _, _ -> onSuccess(url.text.toString()) } - .setNegativeButton(android.R.string.cancel) { _, _ -> onCancel() } - .setOnCancelListener { onCancel() } - .show() - } - - inner class DownloadDialogData(initialValue: String) { - val text = KObservableField(initialValue) - val path = Observer(text) { - File(Environment.getExternalStorageDirectory(), text.value).absolutePath - } - } - - private inline fun showDownloadDialog( - initialValue: String = Config.downloadPath, - crossinline onSuccess: (String) -> Unit - ) { - val data = DownloadDialogData(initialValue) - val binding: CustomDownloadDialogBinding = DataBindingUtil - .inflate(layoutInflater, R.layout.custom_download_dialog, null, false) - binding.also { it.data = data } - - AlertDialog.Builder(requireActivity()) - .setTitle(R.string.settings_download_path_title) - .setView(binding.root) - .setPositiveButton(android.R.string.ok) { _, _ -> - Utils.ensureDownloadPath(data.text.value)?.let { onSuccess(data.text.value) } - ?: Utils.toast(R.string.settings_download_path_error, Toast.LENGTH_SHORT) - } - .setNegativeButton(android.R.string.cancel, null) - .show() - } - - private inline fun showManagerNameDialog( - crossinline onSuccess: (String) -> Unit - ) { - val data = ManagerNameData() - val view = DialogCustomNameBinding - .inflate(LayoutInflater.from(requireContext())) - .also { it.data = data } - - AlertDialog.Builder(requireActivity()) - .setTitle(R.string.settings_app_name) - .setView(view.root) - .setPositiveButton(android.R.string.ok) { _, _ -> - if (view.dialogNameInput.error.isNullOrBlank()) { - onSuccess(data.name.value) - } - } - .setNegativeButton(android.R.string.cancel, null) - .show() - } - - inner class ManagerNameData { - val name = KObservableField(resources.getString(R.string.re_app_name)) - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserFragment.kt deleted file mode 100644 index 00386b01e..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserFragment.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.topjohnwu.magisk.ui.superuser - -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.BaseFragment -import com.topjohnwu.magisk.databinding.FragmentSuperuserBinding -import org.koin.androidx.viewmodel.ext.android.viewModel - -class SuperuserFragment : - BaseFragment() { - - override val layoutRes: Int = R.layout.fragment_superuser - override val viewModel: SuperuserViewModel by viewModel() - - override fun onStart() { - super.onStart() - setHasOptionsMenu(true) - requireActivity().setTitle(R.string.superuser) - } - - override fun onResume() { - super.onResume() - viewModel.updatePolicies() - } - -} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt deleted file mode 100644 index 57f24bcc5..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt +++ /dev/null @@ -1,151 +0,0 @@ -package com.topjohnwu.magisk.ui.superuser - -import android.content.pm.PackageManager -import android.content.res.Resources -import com.topjohnwu.magisk.BR -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.base.viewmodel.BaseViewModel -import com.topjohnwu.magisk.data.database.PolicyDao -import com.topjohnwu.magisk.databinding.ComparableRvItem -import com.topjohnwu.magisk.extensions.applySchedulers -import com.topjohnwu.magisk.extensions.subscribeK -import com.topjohnwu.magisk.extensions.toggle -import com.topjohnwu.magisk.model.entity.MagiskPolicy -import com.topjohnwu.magisk.model.entity.recycler.PolicyRvItem -import com.topjohnwu.magisk.model.events.PolicyEnableEvent -import com.topjohnwu.magisk.model.events.PolicyUpdateEvent -import com.topjohnwu.magisk.model.events.SnackbarEvent -import com.topjohnwu.magisk.utils.BiometricHelper -import com.topjohnwu.magisk.utils.DiffObservableList -import com.topjohnwu.magisk.utils.RxBus -import com.topjohnwu.magisk.view.dialogs.CustomAlertDialog -import io.reactivex.Single -import io.reactivex.disposables.Disposable -import me.tatarka.bindingcollectionadapter2.ItemBinding - -class SuperuserViewModel( - private val policyDB: PolicyDao, - private val packageManager: PackageManager, - private val resources: Resources, - rxBus: RxBus -) : BaseViewModel() { - - val items = DiffObservableList(ComparableRvItem.callback) - val itemBinding = ItemBinding.of> { itemBinding, _, item -> - item.bind(itemBinding) - itemBinding.bindExtra(BR.viewModel, this@SuperuserViewModel) - } - - private var ignoreNext: PolicyRvItem? = null - private var fetchTask: Disposable? = null - - init { - rxBus.register() - .filter { - val isIgnored = it.item == ignoreNext - if (isIgnored) ignoreNext = null - !isIgnored - } - .subscribeK { togglePolicy(it.item, it.enable) } - .add() - rxBus.register() - .subscribeK { updatePolicy(it) } - .add() - - updatePolicies() - } - - fun updatePolicies() { - if (fetchTask?.isDisposed?.not() == true) return - fetchTask = policyDB.fetchAll() - .flattenAsFlowable { it } - .map { PolicyRvItem(it, it.applicationInfo.loadIcon(packageManager)) } - .toList() - .map { - it.sortedWith(compareBy( - { it.item.appName.toLowerCase() }, - { it.item.packageName } - )) - } - .map { it to items.calculateDiff(it) } - .applySchedulers() - .applyViewModel(this) - .subscribeK { items.update(it.first, it.second) } - } - - fun deletePressed(item: PolicyRvItem) { - fun updateState() = deletePolicy(item.item) - .map { items.filterIsInstance().toMutableList() } - .map { it.removeAll { it.item.packageName == item.item.packageName }; it } - .map { it to items.calculateDiff(it) } - .subscribeK { items.update(it.first, it.second) } - .add() - - withView { - if (BiometricHelper.isEnabled) { - BiometricHelper.authenticate(this) { updateState() } - } else { - CustomAlertDialog(this) - .setTitle(R.string.su_revoke_title) - .setMessage(getString(R.string.su_revoke_msg, item.item.appName)) - .setPositiveButton(android.R.string.yes) { _, _ -> updateState() } - .setNegativeButton(android.R.string.no, null) - .setCancelable(true) - .show() - } - } - } - - private fun updatePolicy(it: PolicyUpdateEvent) = when (it) { - is PolicyUpdateEvent.Notification -> updatePolicy(it.item) { - val textId = - if (it.notification) R.string.su_snack_notif_on else R.string.su_snack_notif_off - val text = resources.getString(textId).format(it.appName) - SnackbarEvent(text).publish() - } - is PolicyUpdateEvent.Log -> updatePolicy(it.item) { - val textId = - if (it.logging) R.string.su_snack_log_on else R.string.su_snack_log_off - val text = resources.getString(textId).format(it.appName) - SnackbarEvent(text).publish() - } - } - - private fun updatePolicy(item: MagiskPolicy, onSuccess: (MagiskPolicy) -> Unit) = - updatePolicy(item) - .subscribeK { onSuccess(it) } - .add() - - private fun togglePolicy(item: PolicyRvItem, enable: Boolean) { - fun updateState() { - val app = item.item.copy(policy = if (enable) MagiskPolicy.ALLOW else MagiskPolicy.DENY) - - updatePolicy(app) - .map { it.policy == MagiskPolicy.ALLOW } - .subscribeK { - val textId = if (it) R.string.su_snack_grant else R.string.su_snack_deny - val text = resources.getString(textId).format(item.item.appName) - SnackbarEvent(text).publish() - } - .add() - } - - if (BiometricHelper.isEnabled) { - withView { - BiometricHelper.authenticate(this, onError = { - ignoreNext = item - item.isEnabled.toggle() - }) { updateState() } - } - } else { - updateState() - } - } - - private fun updatePolicy(policy: MagiskPolicy) = - policyDB.update(policy).andThen(Single.just(policy)) - - private fun deletePolicy(policy: MagiskPolicy) = - policyDB.delete(policy.uid).andThen(Single.just(policy)) - -} diff --git a/app/src/main/java/com/topjohnwu/magisk/view/Shortcuts.kt b/app/src/main/java/com/topjohnwu/magisk/view/Shortcuts.kt index 829cb5e8c..d8bfa7e0a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/Shortcuts.kt +++ b/app/src/main/java/com/topjohnwu/magisk/view/Shortcuts.kt @@ -77,19 +77,6 @@ object Shortcuts { .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) ) .setIcon(getIcon(R.drawable.sc_extension)) - .setRank(3) - .build() - ) - shortCuts.add( - ShortcutInfo.Builder(context, "downloads") - .setShortLabel(context.getString(R.string.downloads)) - .setIntent( - Intent(intent) - .putExtra(Const.Key.OPEN_SECTION, "downloads") - .setAction(Intent.ACTION_VIEW) - .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) - ) - .setIcon(getIcon(R.drawable.sc_cloud_download)) .setRank(2) .build() ) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index f2300aafb..000000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_main_content.xml b/app/src/main/res/layout/activity_main_content.xml deleted file mode 100644 index ab5775c0d..000000000 --- a/app/src/main/res/layout/activity_main_content.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/custom_channel_dialog.xml b/app/src/main/res/layout/custom_channel_dialog.xml deleted file mode 100644 index 95aab1637..000000000 --- a/app/src/main/res/layout/custom_channel_dialog.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/custom_download_dialog.xml b/app/src/main/res/layout/custom_download_dialog.xml deleted file mode 100644 index f182f8ff0..000000000 --- a/app/src/main/res/layout/custom_download_dialog.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_custom_name.xml b/app/src/main/res/layout/dialog_custom_name.xml deleted file mode 100644 index 45d4ffafd..000000000 --- a/app/src/main/res/layout/dialog_custom_name.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 023cec564..0c8209012 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -17,7 +17,7 @@ - + @@ -801,4 +801,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_log.xml b/app/src/main/res/layout/fragment_log.xml deleted file mode 100644 index a07621cc6..000000000 --- a/app/src/main/res/layout/fragment_log.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_magisk.xml b/app/src/main/res/layout/fragment_magisk.xml deleted file mode 100644 index 70b580dca..000000000 --- a/app/src/main/res/layout/fragment_magisk.xml +++ /dev/null @@ -1,503 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_magisk_hide.xml b/app/src/main/res/layout/fragment_magisk_hide.xml deleted file mode 100644 index 81b380f88..000000000 --- a/app/src/main/res/layout/fragment_magisk_hide.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_modules.xml b/app/src/main/res/layout/fragment_modules.xml deleted file mode 100644 index 7439ca496..000000000 --- a/app/src/main/res/layout/fragment_modules.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_repos.xml b/app/src/main/res/layout/fragment_repos.xml deleted file mode 100644 index f1c605ae8..000000000 --- a/app/src/main/res/layout/fragment_repos.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_superuser.xml b/app/src/main/res/layout/fragment_superuser.xml deleted file mode 100644 index c67588746..000000000 --- a/app/src/main/res/layout/fragment_superuser.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/include_update_card.xml b/app/src/main/res/layout/include_update_card.xml deleted file mode 100644 index cc4bb272f..000000000 --- a/app/src/main/res/layout/include_update_card.xml +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/item_hide_app.xml b/app/src/main/res/layout/item_hide_app.xml deleted file mode 100644 index a3512e113..000000000 --- a/app/src/main/res/layout/item_hide_app.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/item_hide_process.xml b/app/src/main/res/layout/item_hide_process.xml deleted file mode 100644 index d0dfd0597..000000000 --- a/app/src/main/res/layout/item_hide_process.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/item_module.xml b/app/src/main/res/layout/item_module.xml deleted file mode 100644 index 51b46f9a0..000000000 --- a/app/src/main/res/layout/item_module.xml +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/item_page_log.xml b/app/src/main/res/layout/item_page_log.xml deleted file mode 100644 index eff2e06b5..000000000 --- a/app/src/main/res/layout/item_page_log.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_page_magisk_log.xml b/app/src/main/res/layout/item_page_magisk_log.xml deleted file mode 100644 index b2f4f8c91..000000000 --- a/app/src/main/res/layout/item_page_magisk_log.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/item_policy.xml b/app/src/main/res/layout/item_policy.xml deleted file mode 100644 index e076a6538..000000000 --- a/app/src/main/res/layout/item_policy.xml +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_repo.xml b/app/src/main/res/layout/item_repo.xml deleted file mode 100644 index efada5183..000000000 --- a/app/src/main/res/layout/item_repo.xml +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/item_superuser_log.xml b/app/src/main/res/layout/item_superuser_log.xml deleted file mode 100644 index 332d1d30f..000000000 --- a/app/src/main/res/layout/item_superuser_log.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_superuser_log_entry.xml b/app/src/main/res/layout/item_superuser_log_entry.xml deleted file mode 100644 index da660d8fc..000000000 --- a/app/src/main/res/layout/item_superuser_log_entry.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/drawer.xml b/app/src/main/res/menu/drawer.xml deleted file mode 100644 index 6710d2ddc..000000000 --- a/app/src/main/res/menu/drawer.xml +++ /dev/null @@ -1,59 +0,0 @@ - -

    =&c3{kC+Oem3U7uH7 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 diff --git a/app/src/main/res/values/styles_md2_appearance.xml b/app/src/main/res/values/styles_md2_appearance.xml index 6cc04d5a1..dff90120a 100644 --- a/app/src/main/res/values/styles_md2_appearance.xml +++ b/app/src/main/res/values/styles_md2_appearance.xml @@ -23,6 +23,7 @@ \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index ba79b71f0..e4852ada1 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -21,13 +21,17 @@ + + + + @@ -70,6 +74,7 @@ + diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index a260074f6..f500498f3 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -33,12 +33,16 @@ @style/WidgetFoundation.Card.OnPrimary @style/WidgetFoundation.Button + @style/WidgetFoundation.Button.OnPrimary @style/WidgetFoundation.Button.Flat + @style/WidgetFoundation.Button.Flat.OnPrimary @style/WidgetFoundation.Button.Text + @style/WidgetFoundation.Button.Text.OnPrimary @style/WidgetFoundation.Button.Error @style/WidgetFoundation.Icon @style/WidgetFoundation.Icon.Primary + @style/WidgetFoundation.Icon.OnPrimary @style/WidgetFoundation.Icon.Error @style/WidgetFoundation.Image.Big @@ -97,6 +101,7 @@ @color/color_text_transient @color/color_primary_transient @color/color_error_transient + @color/color_on_primary_transient \ No newline at end of file diff --git a/app/src/main/res/values/styles_md2_impl.xml b/app/src/main/res/values/styles_md2_impl.xml index 22f6373ff..524680d44 100644 --- a/app/src/main/res/values/styles_md2_impl.xml +++ b/app/src/main/res/values/styles_md2_impl.xml @@ -42,14 +42,34 @@ variant. Make sure to use style referenced by attribute defined it attrs.xml. bold + + + + + + + + From 5e01f785ae5e2bb6573199741f88417a6ff0a4e5 Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sun, 6 Oct 2019 12:06:09 +0200 Subject: [PATCH 032/254] Added handling for state with no connection --- .../magisk/redesign/home/HomeViewModel.kt | 3 +- app/src/main/res/layout/activity_main_md2.xml | 40 ++++++++++++++----- app/src/main/res/layout/fragment_home_md2.xml | 9 +++-- app/src/main/res/values/strings_md2.xml | 2 + 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 3a1da8894..73431298e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -54,6 +54,7 @@ class HomeViewModel( } override fun refresh() = repoMagisk.fetchUpdate() + .onErrorReturn { Info.remote } .subscribeK { updateBy(it) } private fun updateBy(info: UpdateInfo) { @@ -64,7 +65,7 @@ class HomeViewModel( } stateManager.value = when { - !info.app.isUpdateChannelCorrect -> MagiskState.NOT_INSTALLED + !info.app.isUpdateChannelCorrect && isConnected.value -> MagiskState.NOT_INSTALLED info.app.isObsolete -> MagiskState.OBSOLETE else -> MagiskState.UP_TO_DATE } diff --git a/app/src/main/res/layout/activity_main_md2.xml b/app/src/main/res/layout/activity_main_md2.xml index 1fe7d72de..c31880f10 100644 --- a/app/src/main/res/layout/activity_main_md2.xml +++ b/app/src/main/res/layout/activity_main_md2.xml @@ -61,18 +61,38 @@ app:hideOnScroll="true" tools:paddingBottom="48dp"> - + android:animateLayoutChanges="true" + android:orientation="vertical"> + + + + + + diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index a4e833d01..136edee2b 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -79,7 +79,7 @@ app:layout_constraintTop_toBottomOf="@+id/home_magisk_title" /> + app:layout_constraintTop_toBottomOf="@+id/home_manager_icon" + tools:text="@string/manager" /> Manager Magisk + No connection available + Home @string/modules @string/superuser From 8024089bde7657270dce1f4cd530a46a3f7f854f Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sun, 6 Oct 2019 12:06:31 +0200 Subject: [PATCH 033/254] Added indication of whether the manager is hidden --- .../java/com/topjohnwu/magisk/extensions/XString.kt | 8 ++++++++ .../topjohnwu/magisk/redesign/home/HomeViewModel.kt | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/XString.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/XString.kt index fb0a65840..ad24a1a9e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/XString.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/XString.kt @@ -4,6 +4,14 @@ import android.content.res.Resources val specialChars = arrayOf('!', '@', '#', '$', '%', '&', '?') +fun String.replaceRandomWithSpecial(passes: Int): String { + var string = this + repeat(passes) { + string = string.replaceRandomWithSpecial() + } + return string +} + fun String.replaceRandomWithSpecial(): String { var random: Char do { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 73431298e..2eb5b60cb 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -7,6 +7,8 @@ import com.topjohnwu.magisk.BuildConfig import com.topjohnwu.magisk.Info import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.repository.MagiskRepository +import com.topjohnwu.magisk.extensions.packageName +import com.topjohnwu.magisk.extensions.replaceRandomWithSpecial import com.topjohnwu.magisk.extensions.res import com.topjohnwu.magisk.model.entity.MagiskJson import com.topjohnwu.magisk.model.entity.ManagerJson @@ -43,6 +45,15 @@ class HomeViewModel( } } + val stateHideManagerName = R.string.manager.res().let { + val result = R.string.manager.res() + if (packageName != BuildConfig.APPLICATION_ID) { + result.replaceRandomWithSpecial(3) + } else { + result + } + } + val itemsMainline = listOf(HomeItem.PayPal.Mainline, HomeItem.Patreon, HomeItem.Twitter.Mainline) val itemsApp = From 8999a57f06b5d4612436f7cc4517c862fb50ddcc Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sun, 6 Oct 2019 12:20:05 +0200 Subject: [PATCH 034/254] Added in-app settings shortcut from system settings --- app/src/main/AndroidManifest.xml | 10 ++++++++++ .../main/java/com/topjohnwu/magisk/Const.kt | 1 + .../magisk/model/navigation/Navigation.kt | 18 +++++++++++++++--- .../topjohnwu/magisk/redesign/MainActivity.kt | 7 ++++++- .../magisk/redesign/compat/CompatActivity.kt | 2 ++ 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 311368cef..aa809b3b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -36,6 +36,16 @@ + + + + + + + + RedesignActivity::class.java else -> MainActivity::class.java } - val intent = Intent(context, ClassMap[destination]) - intent.putExtra(Const.Key.OPEN_SECTION, launchIntent.getStringExtra(Const.Key.OPEN_SECTION)) - context.startActivity(intent) + Intent(context, ClassMap[destination]) + .putExtra(Const.Key.OPEN_SECTION, launchIntent.getStringExtra(Const.Key.OPEN_SECTION)) + .putExtra( + Const.Key.OPEN_SETTINGS, + launchIntent.action == ACTION_APPLICATION_PREFERENCES + ) + .also { context.startActivity(it) } } object Main { const val OPEN_NAV = 1 } + + private val ACTION_APPLICATION_PREFERENCES + get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + Intent.ACTION_APPLICATION_PREFERENCES + } else { + "cannot be null, cannot be empty" + } } diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt index 9ccdaca87..d92bd0134 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/MainActivity.kt @@ -4,6 +4,7 @@ import android.graphics.Insets import android.os.Bundle import androidx.fragment.app.Fragment import com.ncapdevi.fragnav.FragNavController +import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ActivityMainMd2Binding import com.topjohnwu.magisk.model.navigation.Navigation @@ -44,9 +45,13 @@ open class MainActivity : CompatActivity( R.id.logFragment -> Navigation.log() R.id.settingsFragment -> Navigation.settings() else -> throw NotImplementedError("Id ${it.itemId} is not defined as selectable") - }.also { onEventDispatched(it) } + }.dispatchOnSelf() true } + + if (intent.getBooleanExtra(Const.Key.OPEN_SETTINGS, false)) { + binding.mainNavigation.selectedItemId = R.id.settingsFragment + } } override fun onTabTransaction(fragment: Fragment?, index: Int) { diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt index 4ba995450..a10b51e8e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/compat/CompatActivity.kt @@ -31,4 +31,6 @@ abstract class CompatActivity Date: Mon, 7 Oct 2019 19:23:57 +0200 Subject: [PATCH 035/254] Fixed fonts for the thousandth time --- app/src/main/res/font/exo_bold.ttf | Bin 109131 -> 162779 bytes app/src/main/res/font/exo_bold_italic.ttf | Bin 111045 -> 164164 bytes app/src/main/res/font/exo_regular.ttf | Bin 106376 -> 154154 bytes app/src/main/res/font/exo_regular_italic.ttf | Bin 111126 -> 155882 bytes 4 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 app/src/main/res/font/exo_bold.ttf mode change 100644 => 100755 app/src/main/res/font/exo_bold_italic.ttf mode change 100644 => 100755 app/src/main/res/font/exo_regular.ttf mode change 100644 => 100755 app/src/main/res/font/exo_regular_italic.ttf diff --git a/app/src/main/res/font/exo_bold.ttf b/app/src/main/res/font/exo_bold.ttf old mode 100644 new mode 100755 index bf75f77e98a5d9fcfaa45af97253bde49906226a..5938d4ce02120ee7f149486ae4275e1c22a31335 GIT binary patch literal 162779 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 W)~*1IHdz656_C*;vwO8S_5T5pibQt+ literal 109131 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 eQmd*(^9~=n59H;w=yi3R+*a diff --git a/app/src/main/res/font/exo_bold_italic.ttf b/app/src/main/res/font/exo_bold_italic.ttf old mode 100644 new mode 100755 index c6fc2a8cc0c29d19a5d286f52ebccd854c457c69..74c02b21e06247cbf04c6449d7e7d38344612002 GIT binary patch literal 164164 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 z%0D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 literal 111045 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 XK2VT1Vb<02DED72sSnL)SkwOlT{)$_ diff --git a/app/src/main/res/font/exo_regular.ttf b/app/src/main/res/font/exo_regular.ttf old mode 100644 new mode 100755 index ca6b0603279ebefc5741b2a0a36358b300b3385b..b20730485857647bb1607bcedad5973b0c942e3b GIT binary patch literal 154154 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 K(z|c-C;UI0?i5G> literal 106376 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 diff --git a/app/src/main/res/font/exo_regular_italic.ttf b/app/src/main/res/font/exo_regular_italic.ttf old mode 100644 new mode 100755 index e99de0b47cc688e33f02dc7836514d3ba1a6a0c5..20b02d044dcb521c27cafb8b607a235e3b3b6286 GIT binary patch literal 155882 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 T$;gtKUT1q5Su&4rFk}8d^GkdJ literal 111126 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

  • jnU%M{dXr472tXmI+;5+Ok-E51!HpLUx{ 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 YN=(pRW*Pi3`;l)DVw3yPX?!#I3qS8~{{R30 literal 87435 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 J=rrC8{su1T76kwR diff --git a/app/src/main/res/font/exo_regular_italic.ttf b/app/src/main/res/font/exo_regular_italic.ttf index cfd93e0b1d0a7764fbd72385b1265c3e720ce090..d6ea317f8b8b7d022f9473c99a72cae01f182616 100755 GIT binary patch literal 93350 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 Dg@!C? From 88027f2151e33861b732b61e7ddcf201b07b54ee Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Sat, 5 Oct 2019 23:31:05 +0200 Subject: [PATCH 030/254] Fixed fonts --- app/src/main/res/font/exo.xml | 8 ++++---- app/src/main/res/font/exo_bold.ttf | Bin 87075 -> 109131 bytes app/src/main/res/font/exo_bold_italic.ttf | Bin 92438 -> 111045 bytes app/src/main/res/font/exo_regular.ttf | Bin 87735 -> 106376 bytes app/src/main/res/font/exo_regular_italic.ttf | Bin 93350 -> 111126 bytes app/src/main/res/layout/fragment_home_md2.xml | 1 - .../main/res/values/styles_md2_appearance.xml | 1 + 7 files changed, 5 insertions(+), 5 deletions(-) mode change 100755 => 100644 app/src/main/res/font/exo_bold.ttf mode change 100755 => 100644 app/src/main/res/font/exo_bold_italic.ttf mode change 100755 => 100644 app/src/main/res/font/exo_regular.ttf mode change 100755 => 100644 app/src/main/res/font/exo_regular_italic.ttf diff --git a/app/src/main/res/font/exo.xml b/app/src/main/res/font/exo.xml index a0e6f8ec3..e58a4ba9c 100644 --- a/app/src/main/res/font/exo.xml +++ b/app/src/main/res/font/exo.xml @@ -5,18 +5,18 @@ + app:fontWeight="400" /> + app:fontWeight="400" /> KaEl*%jr%=LX-&L219 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 eQmd*(^9~=n59H;w=yi3R+*a literal 87075 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 JbQ<3b{sv#2U#I{8 diff --git a/app/src/main/res/font/exo_bold_italic.ttf b/app/src/main/res/font/exo_bold_italic.ttf old mode 100755 new mode 100644 index dea01bfd3abd14df6e03fb2a8b7910eddd287def..c6fc2a8cc0c29d19a5d286f52ebccd854c457c69 GIT binary patch literal 111045 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 XK2VT1Vb<02DED72sSnL)SkwOlT{)$_ literal 92438 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 `w6O+vq|^$HSH^toPn0Gez-cAYqF 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 literal 87735 zcmcHi2Vh*q@du8--6!3tShk8!C)rlHJLyj4bSK^E?$moPR(0>)2HTk8Lba);_ht;C z1qd~vgb;cNNq_`G_=cFTLxKYa1EwSn5Q_Em`^@fpPj|LS^8NpRKZA6-x!u{B*_qkd z*?D^kQxs*gvO`gorJZf<9aYy>cPT98LO^fp92^+Ae(EVr3Y%P{D3OyoM`pEL+xDZw z3TwYvQPOe;M*M+gMYlh$DF2&^_Dff6Shi{D`N!4b{U$}R?pw3$WV|Y=z_$ah32WA$ zy85!Whu_8DpD4<6mbI&vtsK8#cZ;ID)CX92EdW-x^-V>23!f_mYd4&-&GE_!f5zwM z0nOU=C#+ajPtqC7tp=)xP8ZQB%AqC5j!U!Z;d#$_8;&HUA=HHz}LK}At7-E_jq zryMAFwOCR1zpW@mcY??2@i9J&XX7uclA$Op&5;)GNOO3so`@%6kJzntE1xyCpZ#5{ zWxsm&oWgU@Ej;Jkf^*I(;MrsQ`3$dC`>X*u_nbmS;ffQ#cJO_`mjryl4421Ybum?C zxvLKk_h@f*4YP-~pUwA;<-hR;o5pr%JCyNp*-O0@uW_JURo~}}l?nJACj6slcwCAO zx5lLbejDK#_wgO7(cYzs_P}?DFPy*^)i2%XM^wipn)ouJ;p$f=d}<8*2PRzy0H2`u zeY3sIXfNn8+PhTI{z$siiGGdfsdK+tQh!&96#e5qv+ag()%vj3wntz z%$6bd7&%4F$9|)|pywxM`%n4KDExPt@Xuq~pJ2j2G2r9v(c{KVW)DT-dBbe~F|~(I z2(60ihhnZNS zaFyHTa=Y{M-OMM|@bKzB=;7h=nyLUl{VYqcyr%r8j*{a1ypj^f;ej{a;QO>1QcqJm zuQjPU$d`cv==%6!^>m*zGol(_*v5<3G^luvslGHBIHdUiGuH z2iPk2n!yz}mTCt)4i?s4Dfcrz?dHYTzZ_T9vfvMVUT0GRZ_Ic7GQK|kL4Q#rOJdn< zSbIp$7e*BGk|XUz&7)VPALRH!Ns3}qaup@R5r9;5**F-<#pSYPNcp(Z`dQMmwPk_9 zwX3yH*p!O8lb(E`sjavA1-|c@mf0!Ea|bppWH)u!Z_~5~n}+K;v`-)dF@mrxF{1h& z4`5`b)Q*44?fe5}hN5J;X;Q#`rrqXtyPOu96wFG*X0f>5*%+=mX^C&E&$Th!JL)MM z?%&?yJGshId≪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