From 52cee7feece5cc38d8111e8d566f9e22f107ba54 Mon Sep 17 00:00:00 2001 From: Ilya Fomichev Date: Thu, 3 Oct 2024 12:28:53 +0500 Subject: [PATCH 01/10] update project website link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 938122e05..bf7818f81 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ _**Ackpine** - **A**ndroid **C**oroutines-friendly **K**otlin-first **P**ackage **In**staller **e**xtensions_ -See the [project website](https://solrudev.github.io/Ackpine/) for documentation and API reference. +See the [project website](https://ackpine.solrudev.ru) for documentation and API reference. A library providing consistent APIs for installing and uninstalling apps on an Android device. From fc7859a81593dcd49ad0fba4e572fff96a76a064 Mon Sep 17 00:00:00 2001 From: Ilya Fomichev Date: Fri, 4 Oct 2024 10:02:48 +0500 Subject: [PATCH 02/10] fix incorrect progress in recycled view holders --- .../ackpine/sample/install/InstallSessionsAdapter.java | 6 +++++- .../ackpine/sample/install/InstallSessionsAdapter.kt | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/sample-java/src/main/java/ru/solrudev/ackpine/sample/install/InstallSessionsAdapter.java b/sample-java/src/main/java/ru/solrudev/ackpine/sample/install/InstallSessionsAdapter.java index 57b0b090e..827d0dd06 100644 --- a/sample-java/src/main/java/ru/solrudev/ackpine/sample/install/InstallSessionsAdapter.java +++ b/sample-java/src/main/java/ru/solrudev/ackpine/sample/install/InstallSessionsAdapter.java @@ -46,6 +46,7 @@ public final class InstallSessionsAdapter extends ListAdapter onClick; private final Handler handler = new Handler(Looper.getMainLooper()); private boolean isReattaching = false; + private List currentProgress = Collections.emptyList(); public InstallSessionsAdapter(Consumer onClick) { super(DIFF_CALLBACK); @@ -131,8 +132,10 @@ public void onBindViewHolder(@NonNull SessionViewHolder holder, int position) { @Override public void onBindViewHolder(@NonNull SessionViewHolder holder, int position, @NonNull List payloads) { final var sessionData = getItem(position); + holder.bind(sessionData); if (payloads.isEmpty()) { - holder.bind(sessionData); + final var progress = currentProgress.get(position); + holder.setProgress(progress.toProgress(), false); } else { final var progressUpdate = (ProgressUpdate) payloads.get(0); holder.setProgress(progressUpdate.progress(), progressUpdate.animate()); @@ -140,6 +143,7 @@ public void onBindViewHolder(@NonNull SessionViewHolder holder, int position, @N } public void submitProgress(@NonNull List progress) { + currentProgress = progress; if (isReattaching) { handler.post(() -> { notifyProgressChanged(progress); diff --git a/sample-ktx/src/main/kotlin/ru/solrudev/ackpine/sample/install/InstallSessionsAdapter.kt b/sample-ktx/src/main/kotlin/ru/solrudev/ackpine/sample/install/InstallSessionsAdapter.kt index e3f29db4c..9636e54b1 100644 --- a/sample-ktx/src/main/kotlin/ru/solrudev/ackpine/sample/install/InstallSessionsAdapter.kt +++ b/sample-ktx/src/main/kotlin/ru/solrudev/ackpine/sample/install/InstallSessionsAdapter.kt @@ -38,6 +38,7 @@ class InstallSessionsAdapter( private val handler = Handler(Looper.getMainLooper()) private var isReattaching = false + private var currentProgress = emptyList() class SessionViewHolder( private val itemBinding: ItemInstallSessionBinding, @@ -109,8 +110,10 @@ class InstallSessionsAdapter( override fun onBindViewHolder(holder: SessionViewHolder, position: Int, payloads: List) { val sessionData = getItem(position) + holder.bind(sessionData) if (payloads.isEmpty()) { - holder.bind(sessionData) + val progress = currentProgress[position] + holder.setProgress(progress.progress, animate = false) } else { val progressUpdate = payloads.first() as ProgressUpdate holder.setProgress(progressUpdate.progress, progressUpdate.animate) @@ -118,6 +121,7 @@ class InstallSessionsAdapter( } fun submitProgress(progress: List) { + currentProgress = progress if (isReattaching) { handler.post { notifyProgressChanged(progress) From d91439581285bac92846c5b296fffbc23690e300 Mon Sep 17 00:00:00 2001 From: Ilya Fomichev Date: Fri, 4 Oct 2024 10:10:07 +0500 Subject: [PATCH 03/10] hide install fab on scroll --- sample-java/src/main/res/layout/fragment_install.xml | 5 +++-- sample-ktx/src/main/res/layout/fragment_install.xml | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/sample-java/src/main/res/layout/fragment_install.xml b/sample-java/src/main/res/layout/fragment_install.xml index 6249ed70a..480f4c0eb 100644 --- a/sample-java/src/main/res/layout/fragment_install.xml +++ b/sample-java/src/main/res/layout/fragment_install.xml @@ -15,7 +15,7 @@ ~ limitations under the License. --> - - \ No newline at end of file + \ No newline at end of file diff --git a/sample-ktx/src/main/res/layout/fragment_install.xml b/sample-ktx/src/main/res/layout/fragment_install.xml index 6249ed70a..480f4c0eb 100644 --- a/sample-ktx/src/main/res/layout/fragment_install.xml +++ b/sample-ktx/src/main/res/layout/fragment_install.xml @@ -15,7 +15,7 @@ ~ limitations under the License. --> - - \ No newline at end of file + \ No newline at end of file From 6b7a905b43e582b9669c02df52dc4645c285e8f1 Mon Sep 17 00:00:00 2001 From: Ilya Fomichev Date: Fri, 4 Oct 2024 10:12:10 +0500 Subject: [PATCH 04/10] update coordinatorlayout to 1.2.0 --- gradle/androidx.versions.toml | 1 + sample-java/build.gradle.kts | 1 + sample-ktx/build.gradle.kts | 1 + 3 files changed, 3 insertions(+) diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index 0de476d57..105cbe6ce 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -11,6 +11,7 @@ appcompat = { module = "androidx.appcompat:appcompat", version = "1.7.0" } concurrent-futures-core = { module = "androidx.concurrent:concurrent-futures", version.ref = "concurrent" } concurrent-futures-ktx = { module = "androidx.concurrent:concurrent-futures-ktx", version.ref = "concurrent" } constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version = "2.1.4" } +coordinatorlayout = { module = "androidx.coordinatorlayout:coordinatorlayout", version = "1.2.0" } core-ktx = { module = "androidx.core:core-ktx", version = "1.12.0" } lifecycle-livedata = { module = "androidx.lifecycle:lifecycle-livedata", version.ref = "lifecycle" } lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel", version.ref = "lifecycle" } diff --git a/sample-java/build.gradle.kts b/sample-java/build.gradle.kts index c043eacd3..6c948d83b 100644 --- a/sample-java/build.gradle.kts +++ b/sample-java/build.gradle.kts @@ -68,6 +68,7 @@ dependencies { implementation(androidx.appcompat) implementation(androidx.recyclerview) implementation(androidx.constraintlayout) + implementation(androidx.coordinatorlayout) implementation(androidx.bundles.lifecycle) implementation(androidx.bundles.navigation) implementation(androidx.swiperefreshlayout) diff --git a/sample-ktx/build.gradle.kts b/sample-ktx/build.gradle.kts index f84f6517c..06d72baa4 100644 --- a/sample-ktx/build.gradle.kts +++ b/sample-ktx/build.gradle.kts @@ -74,6 +74,7 @@ dependencies { implementation(androidx.appcompat) implementation(androidx.recyclerview) implementation(androidx.constraintlayout) + implementation(androidx.coordinatorlayout) implementation(androidx.lifecycle.viewmodel) implementation(androidx.bundles.navigation) implementation(androidx.swiperefreshlayout) From 8082f9cfa3151dc5a4d33c5505b593064e0624e7 Mon Sep 17 00:00:00 2001 From: Ilya Fomichev Date: Fri, 4 Oct 2024 11:47:45 +0500 Subject: [PATCH 05/10] show fab again if it was hidden and when sessions list becomes unscrollable --- .../install/HideFabOnScrollBehavior.java | 62 +++++++++++++++++++ .../src/main/res/layout/fragment_install.xml | 4 +- .../sample/install/HideFabOnScrollBehavior.kt | 47 ++++++++++++++ .../src/main/res/layout/fragment_install.xml | 4 +- 4 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 sample-java/src/main/java/ru/solrudev/ackpine/sample/install/HideFabOnScrollBehavior.java create mode 100644 sample-ktx/src/main/kotlin/ru/solrudev/ackpine/sample/install/HideFabOnScrollBehavior.kt diff --git a/sample-java/src/main/java/ru/solrudev/ackpine/sample/install/HideFabOnScrollBehavior.java b/sample-java/src/main/java/ru/solrudev/ackpine/sample/install/HideFabOnScrollBehavior.java new file mode 100644 index 000000000..4fc4854d4 --- /dev/null +++ b/sample-java/src/main/java/ru/solrudev/ackpine/sample/install/HideFabOnScrollBehavior.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2024 Ilya Fomichev + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ru.solrudev.ackpine.sample.install; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.behavior.HideBottomViewOnScrollBehavior; +import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; + +@SuppressWarnings("unused") +public class HideFabOnScrollBehavior extends HideBottomViewOnScrollBehavior { + + public HideFabOnScrollBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public HideFabOnScrollBehavior() { + super(); + } + + @Override + public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull V child, @NonNull View dependency) { + return child instanceof ExtendedFloatingActionButton && dependency instanceof RecyclerView; + } + + @Override + public boolean onLayoutChild(@NonNull CoordinatorLayout parent, @NonNull V child, int layoutDirection) { + var canScroll = false; + final var childCount = parent.getChildCount(); + for (var i = 0; i < childCount; i++) { + final var dependency = parent.getChildAt(i); + if (dependency instanceof RecyclerView) { + canScroll = dependency.canScrollVertically(1) || dependency.canScrollVertically(-1); + break; + } + } + if (child instanceof ExtendedFloatingActionButton && !canScroll && isScrolledDown()) { + slideUp(child); + } + return super.onLayoutChild(parent, child, layoutDirection); + } +} \ No newline at end of file diff --git a/sample-java/src/main/res/layout/fragment_install.xml b/sample-java/src/main/res/layout/fragment_install.xml index 480f4c0eb..c6d5273a6 100644 --- a/sample-java/src/main/res/layout/fragment_install.xml +++ b/sample-java/src/main/res/layout/fragment_install.xml @@ -1,6 +1,6 @@