diff --git a/.gitignore b/.gitignore index c6cbe56..e248586 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ *.iml .gradle +.idea +/.idea /local.properties /.idea/workspace.xml /.idea/libraries diff --git a/README.md b/README.md index 78df2f1..1d4598b 100644 --- a/README.md +++ b/README.md @@ -32,14 +32,10 @@ allprojects { Add the dependency: ```Groovy dependencies { - compile 'com.github.yalantis:multi-selection:v0.1' + implementation 'com.github.yalantis:multi-selection:v0.2' } ``` -## How to use this library - -Instructions can be found [here](https://yalantis.com/blog/how-we-created-a-multiselection-solution-for-android/) in section How to use MultiSelect - ## Let us know! We’d be really happy if you sent us links to your projects where you use our component. Just send an email to github@yalantis.com And do let us know if you have any questions or suggestion regarding the animation. diff --git a/app/build.gradle b/app/build.gradle index b072008..7528da8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,19 +1,15 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 24 - buildToolsVersion "24.0.2" + compileSdkVersion 33 + buildToolsVersion "30.0.3" defaultConfig { applicationId "com.yalantis.multiselect.demo" - targetSdkVersion 24 + targetSdkVersion 33 minSdkVersion 17 - versionCode 1 - versionName "1.0" - jackOptions { - enabled true - additionalParameters('jack.incremental': 'true') - } + versionCode 2 + versionName "1.1" } compileOptions { @@ -21,16 +17,12 @@ android { targetCompatibility JavaVersion.VERSION_1_8 } - dexOptions { - javaMaxHeapSize '4096m' - } - signingConfigs { release { - storeFile file(RELEASE_STORE_FILE) - storePassword RELEASE_KEYSTORE_PASSWORD - keyAlias RELEASE_KEY_ALIAS_NAME - keyPassword RELEASE_KEY_ALIAS_PASSWORD + storeFile file("$project.rootDir/keys/keystore.jks") + storePassword "CevXpj2w6Pd_Updrkpw4" + keyAlias "multiselect" + keyPassword "CevXpj2w6Pd_Updrkpw4" } } @@ -45,16 +37,15 @@ android { } dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') + implementation fileTree(include: ['*.jar'], dir: 'libs') - compile project(path: ':multiselection') + implementation project(path: ':multiselection') // in real project use this: - //compile 'com.github.yalantis:multi-selection:v0.1' +// implementation 'com.github.yalantis:multi-selection:v0.2' - compile "com.android.support:support-v4:$support_version" - compile "com.android.support:appcompat-v7:$support_version" - compile "com.android.support:recyclerview-v7:$support_version" - compile 'com.android.support:design:24.2.0' + implementation "androidx.appcompat:appcompat:$androidx_version" + implementation "androidx.recyclerview:recyclerview:$androidx_recycler_view_version" + implementation "com.google.android.material:material:$androidx_material_version" } repositories { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b228fc1..6e31ac6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,20 +1,22 @@ - + - + - - - - - - + + + + + + - + diff --git a/app/src/main/java/com/yalantis/multiselectdemo/demo/DemoActivity.java b/app/src/main/java/com/yalantis/multiselectdemo/demo/DemoActivity.java index 1c60064..dbd9b5d 100644 --- a/app/src/main/java/com/yalantis/multiselectdemo/demo/DemoActivity.java +++ b/app/src/main/java/com/yalantis/multiselectdemo/demo/DemoActivity.java @@ -1,17 +1,16 @@ package com.yalantis.multiselectdemo.demo; import android.os.Bundle; -import android.support.design.widget.Snackbar; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; -import android.view.MenuItem; -import android.view.ViewGroup; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + +import com.google.android.material.snackbar.Snackbar; import com.yalantis.multiselectdemo.R; import com.yalantis.multiselectdemo.demo.model.Track; import com.yalantis.multiselectdemo.demo.model.TrackList; -import com.yalantis.multiselection.lib.MultiSelectBuilder; import com.yalantis.multiselection.lib.MultiSelect; +import com.yalantis.multiselection.lib.MultiSelectBuilder; import java.util.List; @@ -26,11 +25,11 @@ public class DemoActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - setUpToolbar((Toolbar) findViewById(R.id.toolbar)); + setUpToolbar(findViewById(R.id.toolbar)); MultiSelectBuilder builder = new MultiSelectBuilder<>(Track.class) .withContext(this) - .mountOn((ViewGroup) findViewById(R.id.mount_point)) + .mountOn(findViewById(R.id.mount_point)) .withSidebarWidth(46 + 8 * 2); // ImageView width with paddings setUpAdapters(builder); diff --git a/app/src/main/java/com/yalantis/multiselectdemo/demo/LeftAdapter.java b/app/src/main/java/com/yalantis/multiselectdemo/demo/LeftAdapter.java index 1c72661..5564869 100644 --- a/app/src/main/java/com/yalantis/multiselectdemo/demo/LeftAdapter.java +++ b/app/src/main/java/com/yalantis/multiselectdemo/demo/LeftAdapter.java @@ -1,10 +1,11 @@ package com.yalantis.multiselectdemo.demo; -import android.support.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; + import com.yalantis.multiselectdemo.R; import com.yalantis.multiselectdemo.demo.model.Track; import com.yalantis.multiselection.lib.adapter.BaseLeftAdapter; @@ -12,7 +13,7 @@ /** * Created by Artem Kholodnyi on 9/3/16. */ -public class LeftAdapter extends BaseLeftAdapter{ +public class LeftAdapter extends BaseLeftAdapter { private final Callback callback; @@ -23,7 +24,7 @@ public LeftAdapter(Callback callback) { @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false); + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false); return new ViewHolder(view); } diff --git a/app/src/main/java/com/yalantis/multiselectdemo/demo/RightAdapter.java b/app/src/main/java/com/yalantis/multiselectdemo/demo/RightAdapter.java index e802321..4f99967 100644 --- a/app/src/main/java/com/yalantis/multiselectdemo/demo/RightAdapter.java +++ b/app/src/main/java/com/yalantis/multiselectdemo/demo/RightAdapter.java @@ -8,8 +8,6 @@ import com.yalantis.multiselectdemo.demo.model.Track; import com.yalantis.multiselection.lib.adapter.BaseRightAdapter; -import org.jetbrains.annotations.NotNull; - /** * Created by Artem Kholodnyi on 9/6/16. */ @@ -28,7 +26,7 @@ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { } @Override - public void onBindViewHolder(@NotNull final ViewHolder holder, int position) { + public void onBindViewHolder(ViewHolder holder, int position) { super.onBindViewHolder(holder, position); ViewHolder.bind(holder, getItemAt(position)); diff --git a/app/src/main/java/com/yalantis/multiselectdemo/demo/TracksItemDecorator.java b/app/src/main/java/com/yalantis/multiselectdemo/demo/TracksItemDecorator.java index 12d0c48..416f9a1 100644 --- a/app/src/main/java/com/yalantis/multiselectdemo/demo/TracksItemDecorator.java +++ b/app/src/main/java/com/yalantis/multiselectdemo/demo/TracksItemDecorator.java @@ -1,9 +1,11 @@ package com.yalantis.multiselectdemo.demo; import android.graphics.Rect; -import android.support.v7.widget.RecyclerView; import android.view.View; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + /** * Created by Artem Kholodnyi on 9/6/16. */ @@ -16,7 +18,7 @@ public TracksItemDecorator(int size) { } @Override - public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + public void getItemOffsets(Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { outRect.bottom = size; outRect.top = 0; outRect.left = 0; diff --git a/app/src/main/java/com/yalantis/multiselectdemo/demo/ViewHolder.java b/app/src/main/java/com/yalantis/multiselectdemo/demo/ViewHolder.java index 03e88b7..484c698 100644 --- a/app/src/main/java/com/yalantis/multiselectdemo/demo/ViewHolder.java +++ b/app/src/main/java/com/yalantis/multiselectdemo/demo/ViewHolder.java @@ -1,10 +1,11 @@ package com.yalantis.multiselectdemo.demo; -import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.ImageView; import android.widget.TextView; +import androidx.recyclerview.widget.RecyclerView; + import com.yalantis.multiselectdemo.R; import com.yalantis.multiselectdemo.demo.model.Track; @@ -18,9 +19,9 @@ class ViewHolder extends RecyclerView.ViewHolder { public ViewHolder(View view) { super(view); - track = (TextView) view.findViewById(R.id.track); - artist = (TextView) view.findViewById(R.id.artist); - avatar = (ImageView) view.findViewById(R.id.yal_ms_avatar); + track = view.findViewById(R.id.track); + artist = view.findViewById(R.id.artist); + avatar = view.findViewById(R.id.yal_ms_avatar); } public static void bind(ViewHolder viewHolder, Track track) { diff --git a/app/src/main/java/com/yalantis/multiselectdemo/demo/model/Track.java b/app/src/main/java/com/yalantis/multiselectdemo/demo/model/Track.java index 81946b5..5506701 100644 --- a/app/src/main/java/com/yalantis/multiselectdemo/demo/model/Track.java +++ b/app/src/main/java/com/yalantis/multiselectdemo/demo/model/Track.java @@ -1,7 +1,7 @@ package com.yalantis.multiselectdemo.demo.model; -import android.support.annotation.DrawableRes; -import android.support.v4.app.Fragment; + +import androidx.annotation.DrawableRes; import java.io.Serializable; @@ -10,7 +10,8 @@ */ public class Track implements Comparable, Serializable { private String trackName; - private @DrawableRes int album; + private @DrawableRes + int album; private String artist; public Track(String trackName, String artist, @DrawableRes int album) { diff --git a/app/src/main/java/com/yalantis/multiselectdemo/demo/model/TrackList.java b/app/src/main/java/com/yalantis/multiselectdemo/demo/model/TrackList.java index a0fccb0..282b8fa 100644 --- a/app/src/main/java/com/yalantis/multiselectdemo/demo/model/TrackList.java +++ b/app/src/main/java/com/yalantis/multiselectdemo/demo/model/TrackList.java @@ -9,7 +9,7 @@ * Created by Artem Kholodnyi on 9/6/16. */ public class TrackList { - public final static List TRACKS = new ArrayList(){{ + public final static List TRACKS = new ArrayList() {{ add(new Track("Dead Inside", "Muse", R.drawable.img_dead)); add(new Track("Sandman", "Hurts", R.drawable.img_sandman)); add(new Track("Doing It to Death", "The Kills", R.drawable.img_doing_it)); diff --git a/app/src/main/res/drawable/ripple.xml b/app/src/main/res/drawable/ripple.xml index 441cd8c..daefe40 100644 --- a/app/src/main/res/drawable/ripple.xml +++ b/app/src/main/res/drawable/ripple.xml @@ -1,6 +1,5 @@ - @@ -11,9 +10,9 @@ - - - + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/toolbar_bg.xml b/app/src/main/res/drawable/toolbar_bg.xml index 83cefc1..a497591 100644 --- a/app/src/main/res/drawable/toolbar_bg.xml +++ b/app/src/main/res/drawable/toolbar_bg.xml @@ -1,7 +1,6 @@ + android:startColor="#BB66CC" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 6385602..a360be6 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,32 +1,30 @@ - + android:background="@android:color/black"> - + - + - + - + \ No newline at end of file diff --git a/app/src/main/res/layout/item_view.xml b/app/src/main/res/layout/item_view.xml index 9d09665..40ffec6 100644 --- a/app/src/main/res/layout/item_view.xml +++ b/app/src/main/res/layout/item_view.xml @@ -1,48 +1,42 @@ - - - + android:orientation="horizontal" + android:padding="@dimen/padding"> - + - + android:layout_centerVertical="true" + android:layout_toEndOf="@id/yal_ms_avatar" + android:orientation="vertical"> - + + + - + \ No newline at end of file diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml index 7d1088f..b0362af 100644 --- a/app/src/main/res/menu/menu.xml +++ b/app/src/main/res/menu/menu.xml @@ -1,8 +1,9 @@ - + android:title="" + app:showAsAction="always" /> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 668b0db..a00f51d 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,7 +1,7 @@ - #3F51B5 - #303F9F - #FF4081 - #161618 + #3F51B5 + #303F9F + #FF4081 + #161618 diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index eaa908f..8c25edc 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1c090a6..2ae9ef4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,11 +1,11 @@ - Multi Select - Create Playlist - Don\'t you like anything? :\'( + Multi Select + Create Playlist + Don\'t you like anything? :\'( - - You selected %d song. Good taste! - You selected %d songs. Good taste! - + + You selected %d song. Good taste! + You selected %d songs. Good taste! + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 9db6c37..055bb14 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,12 +1,12 @@ - - + + diff --git a/build.gradle b/build.gradle index 62928ed..c908b77 100644 --- a/build.gradle +++ b/build.gradle @@ -1,27 +1,30 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.0.4' - ext.support_version = '24.2.0' - repositories { - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:2.2.1' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + ext.kotlin_version = '1.7.10' + ext.androidx_version = '1.5.1' + ext.androidx_recycler_view_version = '1.2.1' + ext.androidx_material_version = '1.6.1' + repositories { + mavenCentral() + google() + } + dependencies { + classpath 'com.android.tools.build:gradle:7.3.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } } allprojects { - repositories { - jcenter() - maven { url "https://jitpack.io" } - } + repositories { + maven { url "https://jitpack.io" } + google() + } } task clean(type: Delete) { - delete rootProject.buildDir + delete rootProject.buildDir } diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..571f6dd --- /dev/null +++ b/gradle.properties @@ -0,0 +1,24 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a8461a1..41dfb87 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Wed Aug 17 19:15:26 EEST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/keys/keystore.jks b/keys/keystore.jks index 391a1c5..700b01c 100644 Binary files a/keys/keystore.jks and b/keys/keystore.jks differ diff --git a/multiselection/build.gradle b/multiselection/build.gradle index 92e2990..832ff5c 100644 --- a/multiselection/build.gradle +++ b/multiselection/build.gradle @@ -2,14 +2,14 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' android { - compileSdkVersion 24 - buildToolsVersion "24.0.2" + compileSdkVersion 33 + buildToolsVersion "30.0.3" defaultConfig { minSdkVersion 17 - targetSdkVersion 24 - versionCode 1 - versionName "1.0" + targetSdkVersion 33 + versionCode 2 + versionName "1.1" } buildTypes { release { @@ -25,11 +25,11 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - testCompile 'junit:junit:4.12' - compile "com.android.support:appcompat-v7:$support_version" - compile "com.android.support:recyclerview-v7:$support_version" - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation fileTree(dir: 'libs', include: ['*.jar']) + testImplementation 'junit:junit:4.13.2' + implementation "androidx.appcompat:appcompat:$androidx_version" + implementation "androidx.recyclerview:recyclerview:$androidx_recycler_view_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } repositories { mavenCentral() diff --git a/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelect.kt b/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelect.kt index 697eca1..8e98358 100644 --- a/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelect.kt +++ b/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelect.kt @@ -1,6 +1,6 @@ package com.yalantis.multiselection.lib -import android.support.v7.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView import com.yalantis.multiselection.lib.adapter.BaseLeftAdapter import com.yalantis.multiselection.lib.adapter.BaseRightAdapter diff --git a/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectBuilder.kt b/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectBuilder.kt index 3f9a939..ace5cd1 100644 --- a/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectBuilder.kt +++ b/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectBuilder.kt @@ -1,9 +1,8 @@ package com.yalantis.multiselection.lib import android.content.Context -import android.support.annotation.LayoutRes -import android.support.v7.widget.RecyclerView import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView import com.yalantis.multiselection.R import com.yalantis.multiselection.lib.adapter.BaseLeftAdapter import com.yalantis.multiselection.lib.adapter.BaseRightAdapter diff --git a/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectImpl.kt b/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectImpl.kt index c33cca8..ca5caf8 100644 --- a/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectImpl.kt +++ b/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectImpl.kt @@ -5,17 +5,15 @@ import android.animation.ValueAnimator import android.content.Context import android.os.Bundle import android.os.Parcelable -import android.support.annotation.NonNull -import android.support.v7.widget.LinearLayoutManager -import android.support.v7.widget.RecyclerView import android.util.DisplayMetrics -import android.util.Rational import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.WindowManager import android.view.animation.OvershootInterpolator import android.widget.FrameLayout +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.yalantis.multiselection.R import com.yalantis.multiselection.lib.adapter.BaseAdapter import com.yalantis.multiselection.lib.adapter.BaseLeftAdapter @@ -29,9 +27,10 @@ import java.io.Serializable * Created by Artem Kholodnyi on 8/21/16. */ -internal class MultiSelectImpl>(myContext: Context, - val parent: ViewGroup) - : FrameLayout(myContext), MultiSelect { +internal class MultiSelectImpl>( + myContext: Context, + val parent: ViewGroup +) : FrameLayout(myContext), MultiSelect { init { isSaveEnabled = true @@ -49,7 +48,6 @@ internal class MultiSelectImpl>(myContext: Context, override val selectedItems: List? - @NonNull get() { @Suppress("UNCHECKED_CAST") return (recyclerRight.adapter as BaseRightAdapter).items @@ -132,19 +130,21 @@ internal class MultiSelectImpl>(myContext: Context, private fun setUpViews() { val inflater = LayoutInflater.from(context) - pagesAdapter.pageLeft = inflater.inflate(R.layout.yal_ms_page_left, viewPager, false).apply { - (findViewById(R.id.yal_ms_recycler) as RecyclerView).apply { - layoutManager = LinearLayoutManager(context) - itemAnimator = MultiSelectItemAnimator() + pagesAdapter.pageLeft = + inflater.inflate(R.layout.yal_ms_page_left, viewPager, false).apply { + (findViewById(R.id.yal_ms_recycler) as RecyclerView).apply { + layoutManager = LinearLayoutManager(context) + itemAnimator = MultiSelectItemAnimator() + } } - } - pagesAdapter.pageRight = inflater.inflate(R.layout.yal_ms_page_right, viewPager, false).apply { - (findViewById(R.id.yal_ms_recycler) as RecyclerView).apply { - layoutManager = LinearLayoutManager(context) - itemAnimator = MultiSelectItemAnimator() + pagesAdapter.pageRight = + inflater.inflate(R.layout.yal_ms_page_right, viewPager, false).apply { + (findViewById(R.id.yal_ms_recycler) as RecyclerView).apply { + layoutManager = LinearLayoutManager(context) + itemAnimator = MultiSelectItemAnimator() + } } - } } override fun select(position: Int) = animate(recyclerLeft, recyclerRight, position) @@ -152,13 +152,13 @@ internal class MultiSelectImpl>(myContext: Context, override fun deselect(position: Int) = animate(recyclerRight, recyclerLeft, position) private fun animate(sourceRecycler: RecyclerView, targetRecycler: RecyclerView, position: Int) { - val view = sourceRecycler.layoutManager.findViewByPosition(position) ?: return + val view = sourceRecycler.layoutManager?.findViewByPosition(position) ?: return view.isClickable = false val initial = view.getLocationOnScreen() - sourceRecycler.layoutManager.removeViewAt(position) + sourceRecycler.layoutManager?.removeViewAt(position) @Suppress("UNCHECKED_CAST") val removedItem: I = (sourceRecycler.adapter as BaseAdapter).removeItemAt(position) @@ -223,28 +223,35 @@ internal class MultiSelectImpl>(myContext: Context, viewPager.currentItem = 0 } - internal fun animateAlpha(removedItem: I, targetRecycler: RecyclerView, view: View, duration: Long) { + internal fun animateAlpha( + removedItem: I, + targetRecycler: RecyclerView, + view: View, + duration: Long + ) { ValueAnimator.ofFloat(1f, 0f).setDuration(duration).apply { addUpdateListener { val value = it.animatedValue as Float if (view is ViewGroup) { (0..view.childCount - 1) - .map { view.getChildAt(it) } - .filter { it.id != R.id.yal_ms_avatar } - .forEach { it?.alpha = value } + .map { view.getChildAt(it) } + .filter { it.id != R.id.yal_ms_avatar } + .forEach { it?.alpha = value } } } addListener(object : Animator.AnimatorListener { - override fun onAnimationStart(p0: Animator?) = Unit - override fun onAnimationRepeat(p0: Animator?) = Unit - override fun onAnimationEnd(p0: Animator?) = finallyDo() - override fun onAnimationCancel(p0: Animator?) = finallyDo() + override fun onAnimationStart(p0: Animator) = Unit + override fun onAnimationRepeat(p0: Animator) = Unit + override fun onAnimationEnd(p0: Animator) = finallyDo() + override fun onAnimationCancel(p0: Animator) = finallyDo() val finallyDo = { view.removeFromParent() @Suppress("UNCHECKED_CAST") - (targetRecycler.adapter as BaseAdapter).showItem(removedItem) + (targetRecycler.adapter as BaseAdapter).showItem( + removedItem + ) Unit } }) @@ -253,10 +260,10 @@ internal class MultiSelectImpl>(myContext: Context, internal fun animateTranslation(view: View, deltaX: Float, deltaY: Float, duration: Long) { view.animate().setDuration(duration) - .setInterpolator(OvershootInterpolator(1.1f)) - .translationXBy(deltaX) - .translationYBy(deltaY) - .start() + .setInterpolator(OvershootInterpolator(1.1f)) + .translationXBy(deltaX) + .translationYBy(deltaY) + .start() } override fun onSaveInstanceState(): Parcelable { @@ -291,12 +298,12 @@ internal class MultiSelectImpl>(myContext: Context, val leftScrollPos = state.getInt(STATE_LEFT_POS, -1) if (leftScrollPos != -1) { - recyclerLeft.layoutManager.scrollToPosition(leftScrollPos) + recyclerLeft.layoutManager?.scrollToPosition(leftScrollPos) } val rightScrollPos = state.getInt(STATE_RIGHT_POS, -1) if (rightScrollPos != -1) { - recyclerRight.layoutManager.scrollToPosition(rightScrollPos) + recyclerRight.layoutManager?.scrollToPosition(rightScrollPos) } } } diff --git a/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectItemAnimator.kt b/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectItemAnimator.kt index c2e0ecc..1f285e5 100644 --- a/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectItemAnimator.kt +++ b/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectItemAnimator.kt @@ -1,16 +1,16 @@ package com.yalantis.multiselection.lib - -import android.support.v4.animation.AnimatorCompatHelper -import android.support.v4.view.ViewCompat -import android.support.v4.view.ViewPropertyAnimatorListener -import android.support.v7.widget.RecyclerView -import android.support.v7.widget.RecyclerView.ViewHolder -import android.support.v7.widget.SimpleItemAnimator +import android.animation.ValueAnimator import android.util.Log import android.view.View +import androidx.core.view.ViewCompat +import androidx.core.view.ViewPropertyAnimatorListener +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.ViewHolder +import androidx.recyclerview.widget.SimpleItemAnimator import java.util.* + /** * This implementation of [RecyclerView.ItemAnimator] provides basic * animations on remove, add, and move events that happen to the items in @@ -48,13 +48,21 @@ class MultiSelectItemAnimator : SimpleItemAnimator() { private val mRemoveAnimations = mutableListOf() private val mChangeAnimations = mutableListOf() - data class MoveInfo(var holder: ViewHolder, var fromX: Int, var fromY: Int, var toX: Int, var toY: Int) + data class MoveInfo( + var holder: ViewHolder, + var fromX: Int, + var fromY: Int, + var toX: Int, + var toY: Int + ) - data class ChangeInfo(var oldHolder: ViewHolder?, var newHolder: ViewHolder?, - var fromX: Int = 0, - var fromY: Int = 0, - var toX: Int = 0, - var toY: Int = 0) + data class ChangeInfo( + var oldHolder: ViewHolder?, var newHolder: ViewHolder?, + var fromX: Int = 0, + var fromY: Int = 0, + var toX: Int = 0, + var toY: Int = 0 + ) override fun runPendingAnimations() { @@ -79,8 +87,10 @@ class MultiSelectItemAnimator : SimpleItemAnimator() { mPendingMoves.clear() val mover = Runnable { for (moveInfo in moves) { - animateMoveImpl(moveInfo.holder, moveInfo.fromX, moveInfo.fromY, - moveInfo.toX, moveInfo.toY) + animateMoveImpl( + moveInfo.holder, moveInfo.fromX, moveInfo.fromY, + moveInfo.toX, moveInfo.toY + ) } moves.clear() mMovesList.remove(moves) @@ -148,19 +158,20 @@ class MultiSelectItemAnimator : SimpleItemAnimator() { val view = holder.itemView val animation = ViewCompat.animate(view) mRemoveAnimations.add(holder) - animation.setDuration(getRemoveDuration()).alpha(0f).setListener(object : VpaListenerAdapter() { - override fun onAnimationStart(view: View) { - dispatchRemoveStarting(holder) - } + animation.setDuration(getRemoveDuration()).alpha(0f) + .setListener(object : VpaListenerAdapter() { + override fun onAnimationStart(view: View) { + dispatchRemoveStarting(holder) + } - override fun onAnimationEnd(view: View) { - animation.setListener(null) - ViewCompat.setAlpha(view, 1f) - dispatchRemoveFinished(holder) - mRemoveAnimations.remove(holder) - dispatchFinishedWhenDone() - } - }).start() + override fun onAnimationEnd(view: View) { + animation.setListener(null) + ViewCompat.setAlpha(view, 1f) + dispatchRemoveFinished(holder) + mRemoveAnimations.remove(holder) + dispatchFinishedWhenDone() + } + }).start() } override fun animateAdd(holder: ViewHolder): Boolean { @@ -195,8 +206,10 @@ class MultiSelectItemAnimator : SimpleItemAnimator() { }).start() } - override fun animateMove(holder: ViewHolder, fromX: Int, fromY: Int, - toX: Int, toY: Int): Boolean { + override fun animateMove( + holder: ViewHolder, fromX: Int, fromY: Int, + toX: Int, toY: Int + ): Boolean { var fromX = fromX var fromY = fromY val view = holder.itemView @@ -259,8 +272,10 @@ class MultiSelectItemAnimator : SimpleItemAnimator() { }).start() } - override fun animateChange(oldHolder: ViewHolder, newHolder: ViewHolder?, - fromX: Int, fromY: Int, toX: Int, toY: Int): Boolean { + override fun animateChange( + oldHolder: ViewHolder, newHolder: ViewHolder?, + fromX: Int, fromY: Int, toX: Int, toY: Int + ): Boolean { if (oldHolder === newHolder) { // Don't know how to run change animations when the same view holder is re-used. // run a move animation to handle position changes. @@ -294,7 +309,8 @@ class MultiSelectItemAnimator : SimpleItemAnimator() { val newView = newHolder?.itemView if (view != null) { val oldViewAnim = ViewCompat.animate(view).setDuration( - changeDuration) + changeDuration + ) mChangeAnimations.add(changeInfo.oldHolder!!) oldViewAnim.translationX((changeInfo.toX - changeInfo.fromX).toFloat()) oldViewAnim.translationY((changeInfo.toY - changeInfo.fromY).toFloat()) @@ -317,21 +333,22 @@ class MultiSelectItemAnimator : SimpleItemAnimator() { if (newView != null) { val newViewAnimation = ViewCompat.animate(newView) mChangeAnimations.add(changeInfo.newHolder!!) - newViewAnimation.translationX(0f).translationY(0f).setDuration(getChangeDuration()).alpha(1f).setListener(object : VpaListenerAdapter() { - override fun onAnimationStart(view: View) { - dispatchChangeStarting(changeInfo.newHolder, false) - } + newViewAnimation.translationX(0f).translationY(0f).setDuration(getChangeDuration()) + .alpha(1f).setListener(object : VpaListenerAdapter() { + override fun onAnimationStart(view: View) { + dispatchChangeStarting(changeInfo.newHolder, false) + } - override fun onAnimationEnd(view: View) { - newViewAnimation.setListener(null) - ViewCompat.setAlpha(newView, 1f) - ViewCompat.setTranslationX(newView, 0f) - ViewCompat.setTranslationY(newView, 0f) - dispatchChangeFinished(changeInfo.newHolder, false) - mChangeAnimations.remove(changeInfo.newHolder!!) - dispatchFinishedWhenDone() - } - }).start() + override fun onAnimationEnd(view: View) { + newViewAnimation.setListener(null) + ViewCompat.setAlpha(newView, 1f) + ViewCompat.setTranslationX(newView, 0f) + ViewCompat.setTranslationY(newView, 0f) + dispatchChangeFinished(changeInfo.newHolder, false) + mChangeAnimations.remove(changeInfo.newHolder!!) + dispatchFinishedWhenDone() + } + }).start() } } @@ -454,7 +471,7 @@ class MultiSelectItemAnimator : SimpleItemAnimator() { } private fun resetAnimation(holder: ViewHolder) { - AnimatorCompatHelper.clearInterpolator(holder.itemView) + holder.itemView.animate().interpolator = ValueAnimator().interpolator endAnimation(holder) } @@ -578,8 +595,10 @@ class MultiSelectItemAnimator : SimpleItemAnimator() { * * */ - override fun canReuseUpdatedViewHolder(viewHolder: ViewHolder, - payloads: List): Boolean { + override fun canReuseUpdatedViewHolder( + viewHolder: ViewHolder, + payloads: List + ): Boolean { return !payloads.isEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads) } diff --git a/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectViewPager.kt b/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectViewPager.kt index 0294a76..7adc9b9 100644 --- a/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectViewPager.kt +++ b/multiselection/src/main/java/com/yalantis/multiselection/lib/MultiSelectViewPager.kt @@ -1,10 +1,10 @@ package com.yalantis.multiselection.lib import android.content.Context -import android.support.v4.view.ViewPager import android.util.AttributeSet import android.util.Log import android.view.MotionEvent +import androidx.viewpager.widget.ViewPager /** * Created by Artem Kholodnyi on 9/2/16. @@ -17,8 +17,8 @@ class MultiSelectViewPager : ViewPager { */ var onClickCallback: (Float, Float) -> Boolean = { x, y -> false } - constructor(context: Context?) : super(context) - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) + constructor(context: Context) : super(context) + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) private var lastDownX: Float = -1f private var lastDownY: Float = -1f diff --git a/multiselection/src/main/java/com/yalantis/multiselection/lib/ZoomPageTransformer.kt b/multiselection/src/main/java/com/yalantis/multiselection/lib/ZoomPageTransformer.kt index b671672..8ec3591 100644 --- a/multiselection/src/main/java/com/yalantis/multiselection/lib/ZoomPageTransformer.kt +++ b/multiselection/src/main/java/com/yalantis/multiselection/lib/ZoomPageTransformer.kt @@ -1,7 +1,7 @@ package com.yalantis.multiselection.lib -import android.support.v4.view.ViewPager import android.view.View +import androidx.viewpager.widget.ViewPager import com.yalantis.multiselection.lib.util.mix import com.yalantis.multiselection.lib.util.setScaleXY import com.yalantis.multiselection.lib.util.smoothstep diff --git a/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/BaseAdapter.kt b/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/BaseAdapter.kt index c122662..c72a326 100644 --- a/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/BaseAdapter.kt +++ b/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/BaseAdapter.kt @@ -1,8 +1,8 @@ package com.yalantis.multiselection.lib.adapter -import android.support.annotation.CallSuper -import android.support.v7.widget.RecyclerView import android.view.View +import androidx.annotation.CallSuper +import androidx.recyclerview.widget.RecyclerView /** * Created by Artem Kholodnyi on 9/6/16. diff --git a/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/BaseLeftAdapter.kt b/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/BaseLeftAdapter.kt index 65d945d..11174b7 100644 --- a/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/BaseLeftAdapter.kt +++ b/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/BaseLeftAdapter.kt @@ -1,21 +1,21 @@ package com.yalantis.multiselection.lib.adapter -import android.support.v7.util.SortedList -import android.support.v7.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.SortedList import com.yalantis.multiselection.lib.callbacks.SortedListCallback /** * Created by Artem Kholodnyi on 9/3/16. */ -abstract class BaseLeftAdapter, VH : RecyclerView.ViewHolder> -: BaseAdapter { +abstract class BaseLeftAdapter, VH : RecyclerView.ViewHolder> : + BaseAdapter { lateinit var items: SortedList private constructor() : super() constructor(klass: Class) : super() { - items = SortedList(klass, object: SortedListCallback() {}) + items = SortedList(klass, object : SortedListCallback() {}) } override fun getItemCount(): Int = items.size() diff --git a/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/BaseRightAdapter.kt b/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/BaseRightAdapter.kt index 86e6bf8..1a1cfa2 100644 --- a/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/BaseRightAdapter.kt +++ b/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/BaseRightAdapter.kt @@ -1,6 +1,7 @@ package com.yalantis.multiselection.lib.adapter -import android.support.v7.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView + /** * Created by Artem Kholodnyi on 9/6/16. diff --git a/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/ViewPagerAdapter.kt b/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/ViewPagerAdapter.kt index f12b327..e45475d 100644 --- a/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/ViewPagerAdapter.kt +++ b/multiselection/src/main/java/com/yalantis/multiselection/lib/adapter/ViewPagerAdapter.kt @@ -1,11 +1,9 @@ package com.yalantis.multiselection.lib.adapter -import android.support.v4.view.PagerAdapter -import android.support.v4.view.ViewPager -import android.support.v7.widget.RecyclerView import android.view.View import android.view.ViewGroup -import java.io.Serializable +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager /** * Created by Artem Kholodnyi on 8/17/16. @@ -25,7 +23,7 @@ class ViewPagerAdapter(val pageWidth: Float) : PagerAdapter() { return view == `object` } - override fun instantiateItem(container: ViewGroup?, position: Int): Any { + override fun instantiateItem(container: ViewGroup, position: Int): Any { val pager = container as ViewPager val view = getView(position, pager) pager.addView(view) diff --git a/multiselection/src/main/java/com/yalantis/multiselection/lib/callbacks/SortedListCallback.kt b/multiselection/src/main/java/com/yalantis/multiselection/lib/callbacks/SortedListCallback.kt index 93d6c59..bcbb636 100644 --- a/multiselection/src/main/java/com/yalantis/multiselection/lib/callbacks/SortedListCallback.kt +++ b/multiselection/src/main/java/com/yalantis/multiselection/lib/callbacks/SortedListCallback.kt @@ -1,11 +1,11 @@ package com.yalantis.multiselection.lib.callbacks -import android.support.v7.util.SortedList.Callback +import androidx.recyclerview.widget.SortedList /** * Created by Artem Kholodnyi on 9/4/16. */ -open class SortedListCallback> : Callback() { +open class SortedListCallback> : SortedList.Callback() { override fun areItemsTheSame(item1: T, item2: T): Boolean { return item1 == item2 diff --git a/multiselection/src/main/java/com/yalantis/multiselection/lib/util/Extesions.kt b/multiselection/src/main/java/com/yalantis/multiselection/lib/util/Extesions.kt index cb316cc..b72918e 100644 --- a/multiselection/src/main/java/com/yalantis/multiselection/lib/util/Extesions.kt +++ b/multiselection/src/main/java/com/yalantis/multiselection/lib/util/Extesions.kt @@ -15,8 +15,8 @@ fun View.removeFromParent() { } } -inline fun T.afterMeasured(crossinline f: T.() -> Unit) { - viewTreeObserver.addOnGlobalLayoutListener(object: ViewTreeObserver.OnGlobalLayoutListener { +inline fun T.afterMeasured(crossinline f: T.() -> Unit) { + viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { if (measuredHeight > 0 && measuredWidth > 0) { viewTreeObserver.removeOnGlobalLayoutListener(this) diff --git a/multiselection/src/main/res/drawable/yal_ms_left_side.xml b/multiselection/src/main/res/drawable/yal_ms_left_side.xml index 5fc16e5..55f006d 100644 --- a/multiselection/src/main/res/drawable/yal_ms_left_side.xml +++ b/multiselection/src/main/res/drawable/yal_ms_left_side.xml @@ -1,11 +1,14 @@ - - - - - - + + + + + + diff --git a/multiselection/src/main/res/drawable/yal_ms_right_side.xml b/multiselection/src/main/res/drawable/yal_ms_right_side.xml index d1baa04..4c40a6a 100644 --- a/multiselection/src/main/res/drawable/yal_ms_right_side.xml +++ b/multiselection/src/main/res/drawable/yal_ms_right_side.xml @@ -1,10 +1,13 @@ - + android:right="@dimen/yal_ms_divider_width_half_negative" + android:top="@dimen/yal_ms_divider_width_half_negative"> - + diff --git a/multiselection/src/main/res/drawable/yal_ms_round_left.xml b/multiselection/src/main/res/drawable/yal_ms_round_left.xml index 5908ffc..96c8797 100644 --- a/multiselection/src/main/res/drawable/yal_ms_round_left.xml +++ b/multiselection/src/main/res/drawable/yal_ms_round_left.xml @@ -2,8 +2,10 @@ - - + + \ No newline at end of file diff --git a/multiselection/src/main/res/drawable/yal_ms_round_right.xml b/multiselection/src/main/res/drawable/yal_ms_round_right.xml index 9104696..588fdaf 100644 --- a/multiselection/src/main/res/drawable/yal_ms_round_right.xml +++ b/multiselection/src/main/res/drawable/yal_ms_round_right.xml @@ -2,8 +2,10 @@ - - + + \ No newline at end of file diff --git a/multiselection/src/main/res/layout/yal_ms_multiselect.xml b/multiselection/src/main/res/layout/yal_ms_multiselect.xml index d34e43a..7c93238 100644 --- a/multiselection/src/main/res/layout/yal_ms_multiselect.xml +++ b/multiselection/src/main/res/layout/yal_ms_multiselect.xml @@ -1,11 +1,11 @@ + android:layout_width="match_parent" + android:layout_height="match_parent"> - + diff --git a/multiselection/src/main/res/layout/yal_ms_page_left.xml b/multiselection/src/main/res/layout/yal_ms_page_left.xml index 786ea13..a56b683 100644 --- a/multiselection/src/main/res/layout/yal_ms_page_left.xml +++ b/multiselection/src/main/res/layout/yal_ms_page_left.xml @@ -4,17 +4,16 @@ android:layout_height="match_parent" android:background="@drawable/yal_ms_left_side"> - + android:layout_marginEnd="@dimen/yal_ms_knob_width_half" /> + android:layout_gravity="end|center_vertical" + android:background="@drawable/yal_ms_round_left" /> \ No newline at end of file diff --git a/multiselection/src/main/res/layout/yal_ms_page_right.xml b/multiselection/src/main/res/layout/yal_ms_page_right.xml index e6bb616..b9f3e36 100644 --- a/multiselection/src/main/res/layout/yal_ms_page_right.xml +++ b/multiselection/src/main/res/layout/yal_ms_page_right.xml @@ -4,17 +4,16 @@ android:layout_height="match_parent" android:background="@drawable/yal_ms_right_side"> - + android:layout_marginStart="@dimen/yal_ms_knob_width_half" /> + android:layout_gravity="start|center_vertical" + android:background="@drawable/yal_ms_round_right" /> diff --git a/multiselection/src/main/res/values/ids.xml b/multiselection/src/main/res/values/ids.xml index 8cdf61b..ef6a0b9 100644 --- a/multiselection/src/main/res/values/ids.xml +++ b/multiselection/src/main/res/values/ids.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file