184769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay/*
284769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * Copyright (C) 2016 The Android Open Source Project
384769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay *
484769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * Licensed under the Apache License, Version 2.0 (the "License");
584769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * you may not use this file except in compliance with the License.
684769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * You may obtain a copy of the License at
784769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay *
884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay *      http://www.apache.org/licenses/LICENSE-2.0
984769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay *
1084769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * Unless required by applicable law or agreed to in writing, software
1184769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * distributed under the License is distributed on an "AS IS" BASIS,
1284769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1384769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * See the License for the specific language governing permissions and
1484769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * limitations under the License.
1584769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay */
1684769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay
171c45629929c31cf7903cf955a48f170a8cdee255Ben Linpackage com.android.documentsui;
1884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay
19da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanimport com.android.documentsui.DragAndDropManager.State;
20da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan
2184769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.content.Context;
2284769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.graphics.Canvas;
23d8d7c255cde4da887bb83667520a54e01726b6b1Ben Linimport android.graphics.Color;
24d8d7c255cde4da887bb83667520a54e01726b6b1Ben Linimport android.graphics.Paint;
2584769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.graphics.Point;
2684769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.graphics.Rect;
2784769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.graphics.drawable.Drawable;
2884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.view.LayoutInflater;
2984769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.view.View;
3084769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.widget.TextView;
3184769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay
32da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanclass DragShadowBuilder extends View.DragShadowBuilder {
3384769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay
3484769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay    private final View mShadowView;
3584769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay    private final TextView mTitle;
36166c5c6fc17461cb52f2b83eaec86cfc15b53004Ben Lin    private final DropBadgeView mIcon;
3784769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay    private final int mWidth;
3884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay    private final int mHeight;
39d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin    private final int mShadowRadius;
40d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin    private int mPadding;
41d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin    private Paint paint;
4284769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay
43da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan    DragShadowBuilder(Context context) {
4484769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay        mWidth = context.getResources().getDimensionPixelSize(R.dimen.drag_shadow_width);
451c45629929c31cf7903cf955a48f170a8cdee255Ben Lin        mHeight = context.getResources().getDimensionPixelSize(R.dimen.drag_shadow_height);
46d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        mShadowRadius = context.getResources().getDimensionPixelSize(R.dimen.drag_shadow_radius);
47d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        mPadding = context.getResources().getDimensionPixelSize(R.dimen.drag_shadow_padding);
4884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay
4984769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay        mShadowView = LayoutInflater.from(context).inflate(R.layout.drag_shadow_layout, null);
5084769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay        mTitle = (TextView) mShadowView.findViewById(android.R.id.title);
51166c5c6fc17461cb52f2b83eaec86cfc15b53004Ben Lin        mIcon = (DropBadgeView) mShadowView.findViewById(android.R.id.icon);
5284769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay
53d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        // Important for certain APIs
54d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        mShadowView.setLayerType(View.LAYER_TYPE_SOFTWARE, paint);
55d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
5684769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay    }
5784769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay
5884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay    @Override
5984769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay    public void onProvideShadowMetrics(
6084769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay            Point shadowSize, Point shadowTouchPoint) {
6184769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay        shadowSize.set(mWidth, mHeight);
6284769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay        shadowTouchPoint.set(mWidth, mHeight);
6384769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay    }
6484769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay
6584769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay    @Override
6684769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay    public void onDrawShadow(Canvas canvas) {
6784769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay        Rect r = canvas.getClipBounds();
6884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay        // Calling measure is necessary in order for all child views to get correctly laid out.
6984769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay        mShadowView.measure(
7084769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay                View.MeasureSpec.makeMeasureSpec(r.right- r.left, View.MeasureSpec.EXACTLY),
71d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin                View.MeasureSpec.makeMeasureSpec(r.bottom - r.top , View.MeasureSpec.EXACTLY));
7284769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay        mShadowView.layout(r.left, r.top, r.right, r.bottom);
73d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin
74d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        // Since DragShadow is not an actual view drawn in hardware-accelerated window,
75d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        // android:elevation does not work; we need to draw the shadow ourselves manually.
76d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        paint.setColor(Color.TRANSPARENT);
77d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        // Shadow 1
78d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        int opacity = (int) (255 * 0.1);
79d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        paint.setShadowLayer(mShadowRadius, 0, 0, Color.argb(opacity, 0, 0, 0));
80d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        canvas.drawRect(r.left + mPadding, r.top + mPadding, r.right - mPadding,
81d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin                r.bottom - mPadding, paint);
82d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        // Shadow 2
83d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        opacity = (int) (255 * 0.24);
84d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        paint.setShadowLayer(mShadowRadius, 0, mShadowRadius, Color.argb(opacity, 0, 0, 0));
85d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin        canvas.drawRect(r.left + mPadding, r.top + mPadding, r.right - mPadding,
86d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin                r.bottom - mPadding, paint);
8784769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay        mShadowView.draw(canvas);
8884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay    }
89f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay
90da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan    void updateTitle(String title) {
911c45629929c31cf7903cf955a48f170a8cdee255Ben Lin        mTitle.setText(title);
921c45629929c31cf7903cf955a48f170a8cdee255Ben Lin    }
931c45629929c31cf7903cf955a48f170a8cdee255Ben Lin
94da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan    void updateIcon(Drawable icon) {
95166c5c6fc17461cb52f2b83eaec86cfc15b53004Ben Lin        mIcon.updateIcon(icon);
961c45629929c31cf7903cf955a48f170a8cdee255Ben Lin    }
971c45629929c31cf7903cf955a48f170a8cdee255Ben Lin
98da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan    void onStateUpdated(@State int state) {
99da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan        mIcon.updateState(state);
100f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay    }
10184769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay}
102