diff --git a/README.md b/README.md index 580adff..935eadf 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,6 @@ This component implements transition animation to crumble view into tiny pieces.
Check this project on dribbble. -Also, read how it was done in [our blog](https://yalantis.com/blog/star-wars-the-force-awakens-or-how-to-crumble-view-into-tiny-pieces-on-android) - ##Requirements - Android SDK 15+ - OpenGL ES 2.0+ @@ -24,7 +22,7 @@ Add to your module's build.gradle: ```Groovy dependencies { //... - compile 'com.yalantis:starwarstiles:0.1.1' + implementation 'com.yalantis:starwarstiles:0.1.2' } ``` diff --git a/build.gradle b/build.gradle index e370516..2a7aacb 100644 --- a/build.gradle +++ b/build.gradle @@ -2,12 +2,11 @@ buildscript { repositories { - jcenter() - maven { url 'https://maven.fabric.io/public' } + google() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0-alpha3' - classpath 'io.fabric.tools:gradle:1.21.0' + classpath 'com.android.tools.build:gradle:7.3.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -16,7 +15,8 @@ buildscript { allprojects { repositories { - jcenter() + google() + mavenCentral() } } diff --git a/demo/build.gradle b/demo/build.gradle index ad840a5..276c448 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -1,31 +1,15 @@ -buildscript { - repositories { - maven { url 'https://maven.fabric.io/public' } - } - - dependencies { - classpath 'io.fabric.tools:gradle:1.21.0' - } -} apply plugin: 'com.android.application' -repositories { - maven { url 'https://maven.fabric.io/public' } -} - -apply plugin: 'io.fabric' - - android { - compileSdkVersion 23 - buildToolsVersion '23.0.2' + compileSdkVersion 33 + buildToolsVersion '30.0.3' defaultConfig { applicationId "com.yalantis.starwarsdemo" minSdkVersion 15 - targetSdkVersion 23 - versionCode 1 - versionName "0.1.0" + targetSdkVersion 33 + versionCode 2 + versionName "0.1.2" } buildTypes { release { @@ -33,22 +17,20 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } - dataBinding { - enabled = false + buildFeatures { + viewBinding = true } } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:23.1.1' - compile 'com.android.support:design:23.1.1' - compile 'com.jakewharton.timber:timber:4.1.0' - compile 'com.jakewharton:butterknife:7.0.1' - compile 'com.android.support:recyclerview-v7:23.1.1' - compile 'com.android.support:percent:23.1.1' - compile project(':library') - compile('com.crashlytics.sdk.android:crashlytics:2.5.3@aar') { - transitive = true; - } + implementation project(':library') + implementation fileTree(dir: 'libs', include: ['*.jar']) + + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'com.google.android.material:material:1.6.1' + implementation 'androidx.recyclerview:recyclerview:1.2.1' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + + implementation "com.jakewharton.timber:timber:4.7.1" + testImplementation 'junit:junit:4.13.2' } diff --git a/demo/src/main/AndroidManifest.xml b/demo/src/main/AndroidManifest.xml index fb9d454..0630180 100644 --- a/demo/src/main/AndroidManifest.xml +++ b/demo/src/main/AndroidManifest.xml @@ -1,22 +1,22 @@ + package="com.yalantis.starwarsdemo"> - + + android:label="@string/sw_lib_name"> + android:exported="true"> diff --git a/demo/src/main/java/com/yalantis/starwarsdemo/App.java b/demo/src/main/java/com/yalantis/starwarsdemo/App.java index dddbbbf..d14a032 100644 --- a/demo/src/main/java/com/yalantis/starwarsdemo/App.java +++ b/demo/src/main/java/com/yalantis/starwarsdemo/App.java @@ -3,22 +3,18 @@ import android.app.Application; import android.content.Context; -import com.crashlytics.android.Crashlytics; -import io.fabric.sdk.android.Fabric; import timber.log.Timber; /** * Created by Artem Kholodnyi on 11/2/15. */ -public class App extends Application{ +public class App extends Application { private static App app; @Override public void onCreate() { super.onCreate(); - Fabric.with(this, new Crashlytics()); app = this; - Timber.plant(new Timber.DebugTree()); } diff --git a/demo/src/main/java/com/yalantis/starwarsdemo/adapter/ProfileAdapter.java b/demo/src/main/java/com/yalantis/starwarsdemo/adapter/ProfileAdapter.java index cb43260..aa21c6a 100644 --- a/demo/src/main/java/com/yalantis/starwarsdemo/adapter/ProfileAdapter.java +++ b/demo/src/main/java/com/yalantis/starwarsdemo/adapter/ProfileAdapter.java @@ -1,23 +1,23 @@ package com.yalantis.starwarsdemo.adapter; import android.content.Context; -import android.support.annotation.LayoutRes; -import android.support.annotation.Nullable; -import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import android.widget.CompoundButton; import android.widget.TextView; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewbinding.ViewBinding; + import com.yalantis.starwarsdemo.R; +import com.yalantis.starwarsdemo.databinding.ItemProfileGenderBinding; +import com.yalantis.starwarsdemo.databinding.ItemProfileOtherBinding; +import com.yalantis.starwarsdemo.databinding.ItemProfileSideBinding; import com.yalantis.starwarsdemo.interfaces.ProfileAdapterListener; import com.yalantis.starwarsdemo.model.User; import com.yalantis.starwarsdemo.widget.BackgroundDrawableSwitchCompat; -import butterknife.Bind; -import butterknife.ButterKnife; - /** * Created by Artem Kholodnyi on 11/17/15. */ @@ -26,7 +26,7 @@ public class ProfileAdapter extends RecyclerView.Adapter + mListener.onSideSwitch(holder.mySwitch)); holder.label.setText(mUser.getSideText()); break; case 1: @@ -122,22 +116,25 @@ public int getItemCount() { return 5; } - public class ViewHolder extends RecyclerView.ViewHolder { + class ViewHolder extends RecyclerView.ViewHolder { @Nullable - @Bind(R.id.side_switch) BackgroundDrawableSwitchCompat mySwitch; - @Nullable - @Bind(R.id.tv_label) TextView label; - @Nullable - @Bind(R.id.tv_value) TextView value; - public ViewHolder(View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); + public ViewHolder(ViewBinding binding) { + super(binding.getRoot()); + if (binding instanceof ItemProfileSideBinding) { + mySwitch = ((ItemProfileSideBinding) binding).sideSwitch; + label = ((ItemProfileSideBinding) binding).tvLabel; + } else if (binding instanceof ItemProfileOtherBinding) { + label = ((ItemProfileOtherBinding) binding).tvLabel; + value = ((ItemProfileOtherBinding) binding).tvValue; + } else if (binding instanceof ItemProfileGenderBinding) { + label = ((ItemProfileGenderBinding) binding).tvLabel; + } } } } diff --git a/demo/src/main/java/com/yalantis/starwarsdemo/interfaces/ProfileAdapterListener.java b/demo/src/main/java/com/yalantis/starwarsdemo/interfaces/ProfileAdapterListener.java index eae06cd..9ab5c1a 100644 --- a/demo/src/main/java/com/yalantis/starwarsdemo/interfaces/ProfileAdapterListener.java +++ b/demo/src/main/java/com/yalantis/starwarsdemo/interfaces/ProfileAdapterListener.java @@ -1,6 +1,6 @@ package com.yalantis.starwarsdemo.interfaces; -import android.support.v7.widget.SwitchCompat; +import androidx.appcompat.widget.SwitchCompat; /** * Created by Artem Kholodnyi on 11/17/15. diff --git a/demo/src/main/java/com/yalantis/starwarsdemo/model/User.java b/demo/src/main/java/com/yalantis/starwarsdemo/model/User.java index 599d5b0..f7ce0d1 100644 --- a/demo/src/main/java/com/yalantis/starwarsdemo/model/User.java +++ b/demo/src/main/java/com/yalantis/starwarsdemo/model/User.java @@ -1,7 +1,7 @@ package com.yalantis.starwarsdemo.model; -import android.support.annotation.DrawableRes; -import android.support.annotation.StringRes; +import androidx.annotation.DrawableRes; +import androidx.annotation.StringRes; import com.yalantis.starwarsdemo.R; @@ -21,7 +21,8 @@ public User(boolean darkSide, String fullName, String homeworld, String birthday mBirthday = birthday; } - public @DrawableRes int getPhotoRes() { + public @DrawableRes + int getPhotoRes() { return mDarkSide ? R.drawable.darth : R.drawable.anakin; } @@ -41,7 +42,8 @@ public String getBirthday() { return mBirthday; } - public @StringRes int getSideText() { + public @StringRes + int getSideText() { return isDarkSide() ? R.string.dark_side_label : R.string.light_side_label; } } diff --git a/demo/src/main/java/com/yalantis/starwarsdemo/particlesys/ParticleSystem.java b/demo/src/main/java/com/yalantis/starwarsdemo/particlesys/ParticleSystem.java index 7bc497e..aca12b8 100644 --- a/demo/src/main/java/com/yalantis/starwarsdemo/particlesys/ParticleSystem.java +++ b/demo/src/main/java/com/yalantis/starwarsdemo/particlesys/ParticleSystem.java @@ -24,7 +24,7 @@ public class ParticleSystem implements Renderable { private final ParticleSystemRenderer mRenderer; public static final int PARTICLE_COUNT = 1_000; - private int mBufferId; + private final int mBufferId; public static final int POS_DATA_SIZE = 3; public static final int TEXTURE_COORDS_DATA_SIZE = 2; @@ -39,7 +39,7 @@ public ParticleSystem(ParticleSystemRenderer renderer, FloatBuffer vertexBuffer) Timber.d("generated in %d ms", System.currentTimeMillis() - startTime); // Copy buffer into OpenGL's memory. After, we don't need to keep the client-side buffers around. - final int buffers[] = new int[1]; + final int[] buffers = new int[1]; glGenBuffers(1, buffers, 0); glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); diff --git a/demo/src/main/java/com/yalantis/starwarsdemo/particlesys/ParticleSystemRenderer.java b/demo/src/main/java/com/yalantis/starwarsdemo/particlesys/ParticleSystemRenderer.java index ab2a642..d8a002b 100644 --- a/demo/src/main/java/com/yalantis/starwarsdemo/particlesys/ParticleSystemRenderer.java +++ b/demo/src/main/java/com/yalantis/starwarsdemo/particlesys/ParticleSystemRenderer.java @@ -34,22 +34,22 @@ public class ParticleSystemRenderer implements GLSurfaceView.Renderer { public int sizeX = 35; public int sizeY = 70; public float mTime; - private GLSurfaceView mGlSurfaceView; + private final GLSurfaceView mGlSurfaceView; /** * Store the model matrix. This matrix is used to move models from object space (where each model can be thought * of being located at the center of the universe) to world space. */ - private float[] mModelMatrix = new float[16]; + private final float[] mModelMatrix = new float[16]; /** * Store the view matrix. This can be thought of as our camera. This matrix transforms world space to eye space; * it positions things relative to our eye. */ - private float[] mViewMatrix = new float[16]; + private final float[] mViewMatrix = new float[16]; /** Store the projection matrix. This is used to project the scene onto a 2D viewport. */ - private float[] mProjectionMatrix = new float[16]; + private final float[] mProjectionMatrix = new float[16]; /** Allocate storage for the final combined matrix. This will be passed into the shader program. */ - private float[] mMVPMatrix = new float[16]; - private float[] mTemporaryMatrix = new float[16]; + private final float[] mMVPMatrix = new float[16]; + private final float[] mTemporaryMatrix = new float[16]; private int timeHandle; private long mStartTime; private int frames; @@ -59,7 +59,7 @@ public class ParticleSystemRenderer implements GLSurfaceView.Renderer { private float dt; private long t_current; private long t_prev; - private float dt_prev = 1; + private final float dt_prev = 1; private ValueAnimator animator; private Bitmap mBitmap; private ParticleSystem mParticleSystem; @@ -68,7 +68,7 @@ public class ParticleSystemRenderer implements GLSurfaceView.Renderer { private int mHeight; private int timesRepeated; private float delta; - private ExecutorService mExecutor = Executors.newSingleThreadExecutor(); + private final ExecutorService mExecutor = Executors.newSingleThreadExecutor(); public ParticleSystemRenderer(GLSurfaceView glSurfaceView) { diff --git a/demo/src/main/java/com/yalantis/starwarsdemo/view/DemoActivity.java b/demo/src/main/java/com/yalantis/starwarsdemo/view/DemoActivity.java index a6b7a3a..47892fa 100644 --- a/demo/src/main/java/com/yalantis/starwarsdemo/view/DemoActivity.java +++ b/demo/src/main/java/com/yalantis/starwarsdemo/view/DemoActivity.java @@ -6,12 +6,14 @@ import android.opengl.GLSurfaceView; import android.os.Bundle; import android.os.Handler; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; -import android.support.v7.app.AppCompatActivity; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; import com.yalantis.starwarsdemo.R; +import com.yalantis.starwarsdemo.databinding.ActivityDemoBinding; import com.yalantis.starwarsdemo.interfaces.DemoActivityInterface; import com.yalantis.starwarsdemo.interfaces.GreetingFragmentInterface; import com.yalantis.starwarsdemo.interfaces.TilesRendererInterface; @@ -19,16 +21,14 @@ import java.util.List; -import butterknife.Bind; -import butterknife.ButterKnife; /** * Created by Artem Kholodnyi on 11/11/15. */ public class DemoActivity extends AppCompatActivity implements GreetingFragmentInterface, DemoActivityInterface, TilesRendererInterface { - @Bind(R.id.gl_surface_view) - GLSurfaceView mGlSurfaceView; + + private ActivityDemoBinding binding; private SideFragment mDarkFragment; private SideFragment mBrightFragment; @@ -37,9 +37,8 @@ public class DemoActivity extends AppCompatActivity implements GreetingFragmentI @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - - setContentView(R.layout.activity_demo); - ButterKnife.bind(this); + binding = ActivityDemoBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); // Check if the system supports OpenGL ES 2.0. final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); @@ -48,12 +47,12 @@ protected void onCreate(Bundle savedInstanceState) { if (supportsEs2) { // Request an OpenGL ES 2.0 compatible context. - mGlSurfaceView.setEGLContextClientVersion(2); + binding.glSurfaceView.setEGLContextClientVersion(2); // Set the renderer to our demo renderer, defined below. - ParticleSystemRenderer mRenderer = new ParticleSystemRenderer(mGlSurfaceView); - mGlSurfaceView.setRenderer(mRenderer); - mGlSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); + ParticleSystemRenderer mRenderer = new ParticleSystemRenderer(binding.glSurfaceView); + binding.glSurfaceView.setRenderer(mRenderer); + binding.glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); } else { throw new UnsupportedOperationException(); } @@ -67,13 +66,13 @@ protected void onCreate(Bundle savedInstanceState) { @Override protected void onPause() { super.onPause(); - mGlSurfaceView.onPause(); + binding.glSurfaceView.onPause(); } @Override protected void onResume() { super.onResume(); - mGlSurfaceView.onResume(); + binding.glSurfaceView.onResume(); } private void showGreetings() { @@ -86,15 +85,10 @@ private void showGreetings() { @Override public void onSetupProfileClick() { - new Handler().post(new Runnable() { - @Override - public void run() { - getSupportFragmentManager().beginTransaction() - .setCustomAnimations(R.anim.slide_upward, 0) - .add(R.id.container, BrightSideFragment.newInstance(), "bright") - .commit(); - } - }); + new Handler().post(() -> getSupportFragmentManager().beginTransaction() + .setCustomAnimations(R.anim.slide_upward, 0) + .add(R.id.container, BrightSideFragment.newInstance(), "bright") + .commit()); } diff --git a/demo/src/main/java/com/yalantis/starwarsdemo/view/GreetingsFragment.java b/demo/src/main/java/com/yalantis/starwarsdemo/view/GreetingsFragment.java index 1dd1de7..747a43c 100644 --- a/demo/src/main/java/com/yalantis/starwarsdemo/view/GreetingsFragment.java +++ b/demo/src/main/java/com/yalantis/starwarsdemo/view/GreetingsFragment.java @@ -1,29 +1,24 @@ package com.yalantis.starwarsdemo.view; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + import com.yalantis.starwarsdemo.R; +import com.yalantis.starwarsdemo.databinding.FragmentGreetingsBinding; import com.yalantis.starwarsdemo.interfaces.GreetingFragmentInterface; -import butterknife.Bind; -import butterknife.ButterKnife; -import butterknife.OnClick; - /** * Created by Artem Kholodnyi on 11/17/15. */ public class GreetingsFragment extends Fragment { public final static String TAG = GreetingsFragment.class.getCanonicalName(); - @Bind(R.id.toolbar) - Toolbar mToolbar; - + private FragmentGreetingsBinding binding; private GreetingFragmentInterface mListener; public static GreetingsFragment newInstance() { @@ -39,26 +34,14 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_greetings, container, false); - ButterKnife.bind(this, view); - return view; + binding = FragmentGreetingsBinding.inflate(onGetLayoutInflater(savedInstanceState), container, false); + return binding.getRoot(); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - mToolbar.setNavigationIcon(R.drawable.ic_menu); + binding.toolbar.setNavigationIcon(R.drawable.ic_menu); + binding.btnSetupProfile.setOnClickListener(v -> mListener.onSetupProfileClick()); } - - @Override - public void onDestroyView() { - super.onDestroyView(); - ButterKnife.unbind(this); - } - - @OnClick(R.id.btn_setup_profile) - void onClick() { - mListener.onSetupProfileClick(); - } - } diff --git a/demo/src/main/java/com/yalantis/starwarsdemo/view/SideFragment.java b/demo/src/main/java/com/yalantis/starwarsdemo/view/SideFragment.java index 3865fa2..bec42d8 100644 --- a/demo/src/main/java/com/yalantis/starwarsdemo/view/SideFragment.java +++ b/demo/src/main/java/com/yalantis/starwarsdemo/view/SideFragment.java @@ -2,41 +2,34 @@ import android.animation.Animator; import android.animation.ObjectAnimator; -import android.app.Activity; +import android.content.Context; import android.graphics.Rect; import android.os.Build; import android.os.Bundle; -import android.support.annotation.StyleRes; -import android.support.design.widget.AppBarLayout; -import android.support.design.widget.CollapsingToolbarLayout; -import android.support.v4.app.Fragment; -import android.support.v7.view.ContextThemeWrapper; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.SwitchCompat; -import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewAnimationUtils; import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; -import android.widget.ImageView; -import com.yalantis.starwars.TilesFrameLayout; +import androidx.annotation.NonNull; +import androidx.annotation.StyleRes; +import androidx.appcompat.view.ContextThemeWrapper; +import androidx.appcompat.widget.SwitchCompat; +import androidx.appcompat.widget.Toolbar; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; + import com.yalantis.starwars.interfaces.TilesFrameLayoutListener; import com.yalantis.starwarsdemo.R; import com.yalantis.starwarsdemo.adapter.ProfileAdapter; +import com.yalantis.starwarsdemo.databinding.FragmentSideBinding; import com.yalantis.starwarsdemo.interfaces.DemoActivityInterface; import com.yalantis.starwarsdemo.interfaces.ProfileAdapterListener; import com.yalantis.starwarsdemo.interfaces.TilesRendererInterface; import com.yalantis.starwarsdemo.model.User; import com.yalantis.starwarsdemo.widget.ClipRevealFrame; -import butterknife.Bind; -import butterknife.ButterKnife; -import butterknife.OnClick; - /** * Created by Artem Kholodnyi on 11/19/15. */ @@ -47,27 +40,14 @@ public abstract class SideFragment extends Fragment implements ProfileAdapterLis public static final String ARG_SHOULD_EXPAND = "should expand"; private static final long ANIM_DURATION = 250L; protected float mRadius; - @Bind(R.id.recycler) - RecyclerView mRecycler; - @Bind(R.id.toolbar) - Toolbar mToolbar; - @Bind(R.id.header) - ImageView mHeader; - @Bind(R.id.tessellation_frame_layout) - TilesFrameLayout mTilesFrameLayout; - @Bind(R.id.collapsing_toolbar_layout) - CollapsingToolbarLayout mCollapsingToolbarLayout; - @Bind(R.id.app_bar_layout) - AppBarLayout mAppBarLayout; - private View mRootView; - private Toolbar.OnMenuItemClickListener onMenuItemClickListener = new Toolbar.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(final MenuItem item) { - if (R.id.action_close == item.getItemId()) { - doBreak(); - } - return false; + + private FragmentSideBinding binding; + + private final Toolbar.OnMenuItemClickListener onMenuItemClickListener = item -> { + if (R.id.action_close == item.getItemId()) { + doBreak(); } + return false; }; private TilesRendererInterface mTilesListener; private DemoActivityInterface mDemoActivityInterface; @@ -81,23 +61,22 @@ public void onResume() { @Override public void onPause() { super.onPause(); - mTilesFrameLayout.onPause(); + binding.tessellationFrameLayout.onPause(); } @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - if (activity instanceof TilesRendererInterface) { - if (activity instanceof TilesRendererInterface) { - mTilesListener = (TilesRendererInterface) activity; - } - if (activity instanceof DemoActivityInterface) { - mDemoActivityInterface = (DemoActivityInterface) activity; - } + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof TilesRendererInterface) { + mTilesListener = (TilesRendererInterface) context; + } + if (context instanceof DemoActivityInterface) { + mDemoActivityInterface = (DemoActivityInterface) context; } } - abstract @StyleRes int getTheme(); + abstract @StyleRes + int getTheme(); protected Animator createCheckoutRevealAnimator(final ClipRevealFrame view, int x, int y, float startRadius, float endRadius) { setMenuVisibility(false); @@ -147,12 +126,12 @@ private void removeOldSideFragment() { } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - mRootView = inflater.cloneInContext(new ContextThemeWrapper(getContext(), getTheme())) - .inflate(R.layout.fragment_side, container, false); + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + binding = FragmentSideBinding.inflate(onGetLayoutInflater(savedInstanceState).cloneInContext(new ContextThemeWrapper(getContext(), getTheme())), container, false); + final Bundle args = getArguments(); if (args != null) { - mRootView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { + binding.getRoot().addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { @@ -174,25 +153,25 @@ public void onLayoutChange(View v, int left, int top, int right, int bottom, int }); } - ButterKnife.bind(this, mRootView); - return mRootView; + return binding.getRoot(); } - - - @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - mTilesFrameLayout.setOnAnimationFinishedListener(this); - mRecycler.setLayoutManager(new LinearLayoutManager(getContext())); - mRecycler.setAdapter(new ProfileAdapter(getContext(), getUser(), this)); - setUpToolbar(mToolbar); - mHeader.setImageResource(getUser().getPhotoRes()); + binding.tessellationFrameLayout.setOnAnimationFinishedListener(this); + binding.recycler.setLayoutManager(new LinearLayoutManager(getContext())); + binding.recycler.setAdapter(new ProfileAdapter(getContext(), getUser(), this)); + setUpToolbar(binding.toolbar); + binding.header.setImageResource(getUser().getPhotoRes()); if (getArguments() != null) { - mAppBarLayout.setExpanded(getArguments().getBoolean(ARG_SHOULD_EXPAND), false); + binding.appBarLayout.setExpanded(getArguments().getBoolean(ARG_SHOULD_EXPAND), false); } + + binding.btnSave.setOnClickListener(v -> { + doBreak(); + }); } @Override @@ -212,13 +191,6 @@ private void setUpToolbar(final Toolbar toolbar) { abstract User getUser(); - - @Override - public void onDestroyView() { - super.onDestroyView(); - ButterKnife.unbind(this); - } - @Override public void onSideSwitch(SwitchCompat v) { Rect rect = new Rect(); @@ -230,7 +202,7 @@ public void onSideSwitch(SwitchCompat v) { if (this instanceof BrightSideFragment && v.isChecked()) { cx = rect.right - halfThumbWidth; postGoToSide(cy, cx, "dark"); - } else if (!v.isChecked()){ + } else if (!v.isChecked()) { cx = rect.left + halfThumbWidth; postGoToSide(cy, cx, "bright"); } @@ -248,7 +220,7 @@ public void run() { } private boolean isAppBarExpanded() { - return mAppBarLayout != null && mAppBarLayout.getBottom() == mAppBarLayout.getHeight(); + return binding.appBarLayout.getBottom() == binding.appBarLayout.getHeight(); } public int getStatusBarHeight() { @@ -264,9 +236,7 @@ public void doBreak() { if (mDemoActivityInterface != null) { mDemoActivityInterface.removeAllFragmentExcept(getTagString()); } - if (mTilesFrameLayout != null) { - mTilesFrameLayout.startAnimation(); - } + binding.tessellationFrameLayout.startAnimation(); } @Override @@ -277,9 +247,4 @@ public void onAnimationFinished() { } public abstract String getTagString(); - - @OnClick(R.id.btn_save) - void onClick() { - doBreak(); - } } diff --git a/demo/src/main/java/com/yalantis/starwarsdemo/widget/BackgroundDrawableSwitchCompat.java b/demo/src/main/java/com/yalantis/starwarsdemo/widget/BackgroundDrawableSwitchCompat.java index c2aaee2..3bb24dc 100644 --- a/demo/src/main/java/com/yalantis/starwarsdemo/widget/BackgroundDrawableSwitchCompat.java +++ b/demo/src/main/java/com/yalantis/starwarsdemo/widget/BackgroundDrawableSwitchCompat.java @@ -1,5 +1,7 @@ package com.yalantis.starwarsdemo.widget; +import static android.graphics.PixelFormat.UNKNOWN; + import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; @@ -7,13 +9,14 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.graphics.drawable.LevelListDrawable; -import android.support.annotation.IntRange; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.SwitchCompat; import android.util.AttributeSet; import android.view.animation.Animation; import android.view.animation.LinearInterpolator; +import androidx.annotation.IntRange; +import androidx.appcompat.widget.SwitchCompat; +import androidx.core.content.ContextCompat; + import com.yalantis.starwarsdemo.R; /** @@ -103,7 +106,7 @@ public void setColorFilter(ColorFilter colorFilter) { @Override public int getOpacity() { - return 0; + return UNKNOWN; } private void setBlend(@IntRange(from = TRANSPARENT, to = OPAQUE) int k) { diff --git a/demo/src/main/java/com/yalantis/starwarsdemo/widget/CenterTopImageView.java b/demo/src/main/java/com/yalantis/starwarsdemo/widget/CenterTopImageView.java index 733a31e..e8f1272 100644 --- a/demo/src/main/java/com/yalantis/starwarsdemo/widget/CenterTopImageView.java +++ b/demo/src/main/java/com/yalantis/starwarsdemo/widget/CenterTopImageView.java @@ -3,13 +3,14 @@ import android.content.Context; import android.graphics.Matrix; import android.util.AttributeSet; -import android.widget.ImageView; + +import androidx.appcompat.widget.AppCompatImageView; /** * Created by Artem Kholodnyi on 11/23/15. */ -public class CenterTopImageView extends ImageView { - private Matrix matrix = new Matrix(); +public class CenterTopImageView extends AppCompatImageView { + private final Matrix matrix = new Matrix(); public CenterTopImageView(Context context) { super(context); @@ -33,7 +34,7 @@ private void init() { protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if (getDrawable() != null) { - float k = (right - left) / (float)getDrawable().getIntrinsicWidth(); + float k = (right - left) / (float) getDrawable().getIntrinsicWidth(); matrix.setScale(k, k); setImageMatrix(matrix); } diff --git a/demo/src/main/res/anim/slide_downward.xml b/demo/src/main/res/anim/slide_downward.xml index 2549e57..cc9324e 100644 --- a/demo/src/main/res/anim/slide_downward.xml +++ b/demo/src/main/res/anim/slide_downward.xml @@ -1,10 +1,10 @@ + android:duration="@android:integer/config_mediumAnimTime" + android:interpolator="@android:interpolator/linear"> - + diff --git a/demo/src/main/res/anim/slide_upward.xml b/demo/src/main/res/anim/slide_upward.xml index 29f71ab..8f2be35 100644 --- a/demo/src/main/res/anim/slide_upward.xml +++ b/demo/src/main/res/anim/slide_upward.xml @@ -3,8 +3,7 @@ android:duration="@android:integer/config_mediumAnimTime"> - + android:fromYDelta="100%p" + android:startOffset="0" + android:toYDelta="0" /> diff --git a/demo/src/main/res/layout/activity_demo.xml b/demo/src/main/res/layout/activity_demo.xml index 5974871..11c8d68 100644 --- a/demo/src/main/res/layout/activity_demo.xml +++ b/demo/src/main/res/layout/activity_demo.xml @@ -1,19 +1,17 @@ + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + android:layout_height="match_parent" /> + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/demo/src/main/res/layout/fragment_greetings.xml b/demo/src/main/res/layout/fragment_greetings.xml index b39d3fe..d6d6cdf 100644 --- a/demo/src/main/res/layout/fragment_greetings.xml +++ b/demo/src/main/res/layout/fragment_greetings.xml @@ -1,60 +1,67 @@ - + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> - + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/logo" />