Skip to content

Commit 9cd46d1

Browse files
committed
for android q: go edge to edge, draw under the content
1 parent 2572ed0 commit 9cd46d1

File tree

9 files changed

+88
-4
lines changed

9 files changed

+88
-4
lines changed

library/src/main/java/xyz/klinker/android/drag_dismiss/activity/AbstractDragDismissActivity.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@
1818

1919
import android.os.Bundle;
2020
import android.view.MenuItem;
21+
import android.view.View;
2122
import android.widget.ProgressBar;
2223

2324
import androidx.appcompat.app.AppCompatActivity;
25+
import androidx.core.view.ViewCompat;
26+
2427
import xyz.klinker.android.drag_dismiss.delegate.AbstractDragDismissDelegate;
2528

2629
/**

library/src/main/java/xyz/klinker/android/drag_dismiss/delegate/AbstractDragDismissDelegate.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,15 @@
3030
import androidx.appcompat.app.AppCompatDelegate;
3131
import androidx.appcompat.widget.Toolbar;
3232
import androidx.coordinatorlayout.widget.CoordinatorLayout;
33+
import androidx.core.view.ViewCompat;
34+
3335
import xyz.klinker.android.drag_dismiss.DragDismissIntentBuilder;
3436
import xyz.klinker.android.drag_dismiss.R;
37+
import xyz.klinker.android.drag_dismiss.util.AndroidVersionUtils;
3538
import xyz.klinker.android.drag_dismiss.util.ColorUtils;
3639
import xyz.klinker.android.drag_dismiss.util.StatusBarHelper;
3740
import xyz.klinker.android.drag_dismiss.view.ElasticDragDismissFrameLayout;
41+
import xyz.klinker.android.drag_dismiss.view.TransparentStatusBarInsetLayout;
3842

3943
public abstract class AbstractDragDismissDelegate {
4044

@@ -46,6 +50,7 @@ public abstract class AbstractDragDismissDelegate {
4650
private Toolbar toolbar;
4751
private AppBarLayout appBarLayout;
4852
private View statusBar;
53+
protected TransparentStatusBarInsetLayout transparentStatusBarLayout;
4954

5055
private String dragElasticity;
5156
private String theme;
@@ -69,10 +74,16 @@ public void onCreate(Bundle savedInstanceState) {
6974
toolbar = (Toolbar) activity.findViewById(R.id.dragdismiss_toolbar);
7075
appBarLayout = (AppBarLayout) activity.findViewById(R.id.dragdismiss_app_bar);
7176
statusBar = activity.findViewById(R.id.dragdismiss_status_bar);
77+
transparentStatusBarLayout = activity.findViewById(R.id.dragdismiss_transparentStatusBarLayout);
7278

7379
setupToolbar();
7480
setupDragDismiss();
7581
changeColors();
82+
83+
if (AndroidVersionUtils.isAndroidQ()) {
84+
int newSystemUiFlags = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
85+
statusBar.setSystemUiVisibility(newSystemUiFlags);
86+
}
7687
}
7788

7889
/**

library/src/main/java/xyz/klinker/android/drag_dismiss/delegate/DragDismissDelegate.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,25 @@
1616

1717
package xyz.klinker.android.drag_dismiss.delegate;
1818

19+
import android.annotation.SuppressLint;
1920
import android.os.Bundle;
2021
import android.view.LayoutInflater;
2122
import android.view.View;
2223
import android.view.ViewGroup;
24+
import android.view.WindowInsets;
2325
import android.widget.FrameLayout;
2426

2527
import androidx.appcompat.app.AppCompatActivity;
28+
import androidx.core.view.OnApplyWindowInsetsListener;
29+
import androidx.core.view.ViewCompat;
30+
import androidx.core.view.WindowInsetsCompat;
2631
import androidx.core.widget.NestedScrollView;
2732
import xyz.klinker.android.drag_dismiss.R;
33+
import xyz.klinker.android.drag_dismiss.util.AndroidVersionUtils;
2834
import xyz.klinker.android.drag_dismiss.util.StatusBarHelper;
2935
import xyz.klinker.android.drag_dismiss.view.ElasticDragDismissFrameLayout;
3036
import xyz.klinker.android.drag_dismiss.view.ToolbarScrollListener;
37+
import xyz.klinker.android.drag_dismiss.view.TransparentStatusBarInsetLayout;
3138

3239
public class DragDismissDelegate extends AbstractDragDismissDelegate {
3340

@@ -61,6 +68,14 @@ public void onDrag(float elasticOffset, float elasticOffsetPixels, float rawOffs
6168
}
6269
}
6370
});
71+
if (AndroidVersionUtils.isAndroidQ()) {
72+
transparentStatusBarLayout.setOnApplyInsetsListener(new TransparentStatusBarInsetLayout.AppliedInsets() {
73+
@Override @SuppressLint("NewApi")
74+
public void onApplyInsets(WindowInsets insets) {
75+
scrollView.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom());
76+
}
77+
});
78+
}
6479
} else {
6580
getToolbar().setBackgroundColor(getPrimaryColor());
6681
getStatusBar().setBackgroundColor(getPrimaryColor());

library/src/main/java/xyz/klinker/android/drag_dismiss/delegate/DragDismissRecyclerViewDelegate.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,17 @@
1616

1717
package xyz.klinker.android.drag_dismiss.delegate;
1818

19+
import android.annotation.SuppressLint;
1920
import android.os.Bundle;
21+
import android.view.WindowInsets;
2022

2123
import androidx.appcompat.app.AppCompatActivity;
2224
import androidx.recyclerview.widget.RecyclerView;
2325
import xyz.klinker.android.drag_dismiss.R;
26+
import xyz.klinker.android.drag_dismiss.util.AndroidVersionUtils;
2427
import xyz.klinker.android.drag_dismiss.util.ColorUtils;
2528
import xyz.klinker.android.drag_dismiss.view.ToolbarScrollListener;
29+
import xyz.klinker.android.drag_dismiss.view.TransparentStatusBarInsetLayout;
2630

2731
public class DragDismissRecyclerViewDelegate extends AbstractDragDismissDelegate {
2832

@@ -41,7 +45,7 @@ public DragDismissRecyclerViewDelegate(AppCompatActivity activity, Callback call
4145
public void onCreate(Bundle savedInstanceState) {
4246
super.onCreate(savedInstanceState);
4347

44-
RecyclerView recyclerView = (RecyclerView) activity.findViewById(R.id.dragdismiss_recycler);
48+
final RecyclerView recyclerView = (RecyclerView) activity.findViewById(R.id.dragdismiss_recycler);
4549

4650
if (shouldScrollToolbar() && shouldShowToolbar()) {
4751
recyclerView.addOnScrollListener(new ToolbarScrollListener(getToolbar(), getStatusBar(), getPrimaryColor()));
@@ -50,6 +54,15 @@ public void onCreate(Bundle savedInstanceState) {
5054
getStatusBar().setBackgroundColor(getPrimaryColor());
5155
}
5256

57+
if (AndroidVersionUtils.isAndroidQ()) {
58+
transparentStatusBarLayout.setOnApplyInsetsListener(new TransparentStatusBarInsetLayout.AppliedInsets() {
59+
@Override @SuppressLint("NewApi")
60+
public void onApplyInsets(WindowInsets insets) {
61+
recyclerView.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom());
62+
}
63+
});
64+
}
65+
5366
ColorUtils.changeRecyclerOverscrollColors(recyclerView, getPrimaryColor());
5467
callback.setupRecyclerView(recyclerView);
5568
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package xyz.klinker.android.drag_dismiss.util;
2+
3+
import android.os.Build;
4+
5+
public class AndroidVersionUtils {
6+
7+
public static boolean isAndroidQ() {
8+
return Build.VERSION.SDK_INT > Build.VERSION_CODES.P || Build.VERSION.CODENAME.equals("Q");
9+
}
10+
11+
}

library/src/main/java/xyz/klinker/android/drag_dismiss/view/TransparentStatusBarInsetLayout.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,11 @@
2424

2525
import androidx.annotation.Nullable;
2626

27+
import xyz.klinker.android.drag_dismiss.util.AndroidVersionUtils;
28+
2729
public class TransparentStatusBarInsetLayout extends LinearLayout {
2830
private int[] mInsets = new int[4];
31+
private AppliedInsets appliedInsetsListener = null;
2932

3033
public TransparentStatusBarInsetLayout(Context context) {
3134
super(context);
@@ -39,16 +42,31 @@ public TransparentStatusBarInsetLayout(Context context, @Nullable AttributeSet a
3942
super(context, attrs, defStyleAttr);
4043
}
4144

45+
public void setOnApplyInsetsListener(AppliedInsets listener) {
46+
this.appliedInsetsListener = listener;
47+
}
48+
4249
@Override
4350
public final WindowInsets onApplyWindowInsets(WindowInsets insets) {
4451
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
4552
mInsets[0] = insets.getSystemWindowInsetLeft();
4653
mInsets[1] = insets.getSystemWindowInsetTop();
4754
mInsets[2] = insets.getSystemWindowInsetRight();
48-
return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, 0, 0,
49-
insets.getSystemWindowInsetBottom()));
55+
if (AndroidVersionUtils.isAndroidQ()) {
56+
if (appliedInsetsListener != null) {
57+
appliedInsetsListener.onApplyInsets(insets);
58+
}
59+
return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, 0, 0, 0));
60+
} else {
61+
return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, 0, 0,
62+
insets.getSystemWindowInsetBottom()));
63+
}
5064
} else {
5165
return insets;
5266
}
5367
}
68+
69+
public interface AppliedInsets {
70+
void onApplyInsets(WindowInsets insets);
71+
}
5472
}

library/src/main/res/layout/dragdismiss_activity.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
<xyz.klinker.android.drag_dismiss.view.TransparentStatusBarInsetLayout
1919
xmlns:android="http://schemas.android.com/apk/res/android"
20+
android:id="@+id/dragdismiss_transparentStatusBarLayout"
2021
android:layout_width="match_parent"
2122
android:layout_height="match_parent"
2223
android:orientation="horizontal"
@@ -46,7 +47,8 @@
4647
android:layout_width="match_parent"
4748
android:layout_height="match_parent"
4849
android:fillViewport="true"
49-
android:overScrollMode="never" >
50+
android:overScrollMode="never"
51+
android:clipToPadding="false">
5052

5153
<FrameLayout
5254
android:id="@+id/dragdismiss_content"

library/src/main/res/layout/dragdismiss_activity_recycler.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
<xyz.klinker.android.drag_dismiss.view.TransparentStatusBarInsetLayout
1919
xmlns:android="http://schemas.android.com/apk/res/android"
20+
android:id="@+id/dragdismiss_transparentStatusBarLayout"
2021
android:layout_width="match_parent"
2122
android:layout_height="match_parent"
2223
android:orientation="horizontal"
@@ -46,6 +47,7 @@
4647
android:layout_width="match_parent"
4748
android:layout_height="match_parent"
4849
android:scrollbars="vertical"
50+
android:clipToPadding="false"
4951
app:behavior_overlapTop="?attr/actionBarSize" />
5052

5153
<ProgressBar
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
4+
<style name="DragDismissTheme" parent="DragDismissTheme.Base">
5+
<item name="android:windowTranslucentStatus">true</item>
6+
<item name="android:navigationBarColor">@android:color/transparent</item>
7+
</style>
8+
9+
</resources>

0 commit comments

Comments
 (0)