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