17149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas/* 27149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * Copyright (C) 2017 The Android Open Source Project 37149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * 47149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * Licensed under the Apache License, Version 2.0 (the "License"); 57149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * you may not use this file except in compliance with the License. 67149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * You may obtain a copy of the License at 77149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * 87149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * http://www.apache.org/licenses/LICENSE-2.0 97149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * 107149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * Unless required by applicable law or agreed to in writing, software 117149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * distributed under the License is distributed on an "AS IS" BASIS, 127149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * See the License for the specific language governing permissions and 147149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * limitations under the License. 157149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas */ 167149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas 177149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikaspackage com.android.internal.widget.helper; 187149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas 197149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikasimport android.graphics.Canvas; 207149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikasimport android.view.View; 217149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas 227149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikasimport com.android.internal.R; 237149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikasimport com.android.internal.widget.RecyclerView; 247149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas 257149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas/** 267149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * Package private class to keep implementations. Putting them inside ItemTouchUIUtil makes them 277149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas * public API, which is not desired in this case. 287149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas */ 297149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikasclass ItemTouchUIUtilImpl implements ItemTouchUIUtil { 307149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas @Override 317149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas public void onDraw(Canvas c, RecyclerView recyclerView, View view, 327149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas float dX, float dY, int actionState, boolean isCurrentlyActive) { 337149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas if (isCurrentlyActive) { 347149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas Object originalElevation = view.getTag( 357149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas R.id.item_touch_helper_previous_elevation); 367149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas if (originalElevation == null) { 377149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas originalElevation = view.getElevation(); 387149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas float newElevation = 1f + findMaxElevation(recyclerView, view); 397149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas view.setElevation(newElevation); 407149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas view.setTag(R.id.item_touch_helper_previous_elevation, 417149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas originalElevation); 427149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas } 437149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas } 447149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas view.setTranslationX(dX); 457149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas view.setTranslationY(dY); 467149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas } 477149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas 487149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas private float findMaxElevation(RecyclerView recyclerView, View itemView) { 497149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas final int childCount = recyclerView.getChildCount(); 507149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas float max = 0; 517149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas for (int i = 0; i < childCount; i++) { 527149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas final View child = recyclerView.getChildAt(i); 537149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas if (child == itemView) { 547149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas continue; 557149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas } 567149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas final float elevation = child.getElevation(); 577149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas if (elevation > max) { 587149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas max = elevation; 597149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas } 607149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas } 617149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas return max; 627149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas } 637149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas 647149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas @Override 657149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas public void clearView(View view) { 667149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas final Object tag = view.getTag( 677149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas R.id.item_touch_helper_previous_elevation); 687149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas if (tag != null && tag instanceof Float) { 697149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas view.setElevation((Float) tag); 707149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas } 717149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas view.setTag(R.id.item_touch_helper_previous_elevation, null); 727149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas view.setTranslationX(0f); 737149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas view.setTranslationY(0f); 747149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas } 757149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas 767149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas @Override 777149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas public void onSelected(View view) { 787149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas } 797149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas 807149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas @Override 817149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas public void onDrawOver(Canvas c, RecyclerView recyclerView, 827149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas View view, float dX, float dY, int actionState, boolean isCurrentlyActive) { 837149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas } 847149a63961c5fe6706160bc717a3b6cbb083ca54Aurimas Liutikas} 85