Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Api to set LifecycleOwner for BlurLayout #68

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions blurkit/build.gradle
Expand Up @@ -41,6 +41,8 @@ dependencies {
androidTestImplementation 'com.android.support.test:rules:1.0.2'
androidTestImplementation 'org.hamcrest:hamcrest-library:1.3'

// lifecycle
implementation "android.arch.lifecycle:runtime:1.1.1"
}

install {
Expand Down
44 changes: 43 additions & 1 deletion blurkit/src/main/java/io/alterac/blurkit/BlurLayout.java
@@ -1,6 +1,10 @@
package io.alterac.blurkit;

import android.app.Activity;
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.OnLifecycleEvent;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
Expand All @@ -9,6 +13,8 @@
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.Choreographer;
import android.view.View;
Expand All @@ -23,7 +29,7 @@
* and finds its relative position to the top parent to draw properly regardless of where the layout is
* placed.
*/
public class BlurLayout extends FrameLayout {
public class BlurLayout extends FrameLayout implements LifecycleObserver {

public static final float DEFAULT_DOWNSCALE_FACTOR = 0.12f;
public static final int DEFAULT_BLUR_RADIUS = 12;
Expand Down Expand Up @@ -74,6 +80,10 @@ public class BlurLayout extends FrameLayout {
/** A saved bitmap for the view to re-use when {@link #lockView()} called. */
private Bitmap mLockedBitmap;

/** A {@link Lifecycle} for this layout. **/
@Nullable
private Lifecycle mLifecycle;

public BlurLayout(Context context) {
super(context, null);
}
Expand Down Expand Up @@ -107,6 +117,36 @@ public BlurLayout(Context context, AttributeSet attrs) {
setCornerRadius(mCornerRadius);
}

/**
* Sets the {@link LifecycleOwner} for this layout. No need to call {@link #startBlur()}
* or {@link #pauseBlur()}.
*
* Since this works due to {@link LifecycleObserver} which relies on {@link OnLifecycleEvent}
* annotated methods, it is not advisable to use this while using Java 8
*
* @param lifecycleOwner the LifecycleOwner for this layout
*/
public void setLifecycleOwner(@NonNull LifecycleOwner lifecycleOwner) {
if (mLifecycle != null) {
mLifecycle.removeObserver(this);
}
mLifecycle = lifecycleOwner.getLifecycle();
mLifecycle.addObserver(this);
}

/**
* Get the {@link Lifecycle} associated with this layout. This is only applicable if
* we have set the {@link LifecycleOwner}.
*
* @see #setLifecycleOwner(LifecycleOwner)
*
* @return the Lifecycle associated with this layout, {@code null} if no Lifecyle is associated
*/
@Nullable
public Lifecycle getLifecycle() {
return mLifecycle;
}

/** Choreographer callback that re-draws the blur and schedules another callback. */
private Choreographer.FrameCallback invalidationLoop = new Choreographer.FrameCallback() {
@Override
Expand All @@ -117,6 +157,7 @@ public void doFrame(long frameTimeNanos) {
};

/** Start BlurLayout continuous invalidation. **/
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void startBlur() {
if (mRunning) {
return;
Expand All @@ -129,6 +170,7 @@ public void startBlur() {
}

/** Pause BlurLayout continuous invalidation. **/
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void pauseBlur() {
if (!mRunning) {
return;
Expand Down
35 changes: 35 additions & 0 deletions blurkit/src/test/java/io/alterac/blurkit/BlurLayoutTest.java
@@ -1,6 +1,10 @@
package io.alterac.blurkit;

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.LifecycleOwner;
import android.content.Context;
import android.support.annotation.NonNull;

import org.junit.Before;
import org.junit.Test;
Expand All @@ -16,6 +20,32 @@ public class BlurLayoutTest {

public static final int TEST_INT = 1;
private static final float TEST_FLOAT = 1.1f;
private static final LifecycleOwner LIFECYCLE_OWNER = new LifecycleOwner() {

private final Lifecycle lifecycle = new Lifecycle() {
@Override
public void addObserver(@NonNull LifecycleObserver observer) {

}

@Override
public void removeObserver(@NonNull LifecycleObserver observer) {

}

@NonNull
@Override
public Lifecycle.State getCurrentState() {
return State.DESTROYED;
}
};

@NonNull
@Override
public Lifecycle getLifecycle() {
return lifecycle;
}
};

private BlurLayout blurLayout;

Expand Down Expand Up @@ -60,4 +90,9 @@ public void lockViewTest() {
blurLayout.lockView();
}

@Test
public void setLifecycleOwnerTest() {
blurLayout.setLifecycleOwner(LIFECYCLE_OWNER);
assertEquals(blurLayout.getLifecycle(), LIFECYCLE_OWNER.getLifecycle());
}
}
10 changes: 2 additions & 8 deletions demo/src/main/java/io/alterac/blurkit/demo/MainActivity.java
Expand Up @@ -16,8 +16,9 @@ public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
blurLayout = (BlurLayout) findViewById(R.id.blurLayout);
blurLayout = findViewById(R.id.blurLayout);

blurLayout.setLifecycleOwner(this);
blurLayout.animate().translationY(movement).setDuration(1500).setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
Expand All @@ -31,13 +32,6 @@ public void onAnimationEnd(Animator animation) {
@Override
protected void onStart() {
super.onStart();
blurLayout.startBlur();
blurLayout.lockView();
}

@Override
protected void onStop() {
super.onStop();
blurLayout.pauseBlur();
}
}