blob: 42bab4705332e541c678b5b6415314bf95c535de [file] [log] [blame]
Sunny Goyal47328fd2016-05-25 18:56:41 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.launcher3;
18
19import android.animation.TimeInterpolator;
20import android.content.Context;
21import android.util.AttributeSet;
22import android.view.View;
23import android.view.ViewDebug;
24import android.view.ViewPropertyAnimator;
25import android.view.accessibility.AccessibilityManager;
26import android.view.animation.AccelerateInterpolator;
27import android.widget.LinearLayout;
28
29import com.android.launcher3.dragndrop.DragController;
Sunny Goyal94b510c2016-08-16 15:36:48 -070030import com.android.launcher3.dragndrop.DragOptions;
Sunny Goyal47328fd2016-05-25 18:56:41 -070031
32/*
33 * The top bar containing various drop targets: Delete/App Info/Uninstall.
34 */
35public class DropTargetBar extends LinearLayout implements DragController.DragListener {
36
37 protected static final int DEFAULT_DRAG_FADE_DURATION = 175;
38 protected static final TimeInterpolator DEFAULT_INTERPOLATOR = new AccelerateInterpolator();
39
40 private final Runnable mFadeAnimationEndRunnable = new Runnable() {
41
42 @Override
43 public void run() {
44 AccessibilityManager am = (AccessibilityManager)
45 getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
46 boolean accessibilityEnabled = am.isEnabled();
47 AlphaUpdateListener.updateVisibility(DropTargetBar.this, accessibilityEnabled);
48 }
49 };
50
51 @ViewDebug.ExportedProperty(category = "launcher")
52 protected boolean mDeferOnDragEnd;
53
54 @ViewDebug.ExportedProperty(category = "launcher")
55 protected boolean mVisible = false;
56
57 private ViewPropertyAnimator mCurrentAnimation;
58
59 // Drop targets
60 private ButtonDropTarget mDeleteDropTarget;
61 private ButtonDropTarget mAppInfoDropTarget;
62 private ButtonDropTarget mUninstallDropTarget;
63
64 public DropTargetBar(Context context, AttributeSet attrs) {
65 super(context, attrs);
66 }
67
68 public DropTargetBar(Context context, AttributeSet attrs, int defStyle) {
69 super(context, attrs, defStyle);
70 }
71
72 @Override
73 protected void onFinishInflate() {
74 super.onFinishInflate();
75
76 // Get the individual components
77 mDeleteDropTarget = (ButtonDropTarget) findViewById(R.id.delete_target_text);
78 mAppInfoDropTarget = (ButtonDropTarget) findViewById(R.id.info_target_text);
79 mUninstallDropTarget = (ButtonDropTarget) findViewById(R.id.uninstall_target_text);
80
81 mDeleteDropTarget.setDropTargetBar(this);
82 mAppInfoDropTarget.setDropTargetBar(this);
83 mUninstallDropTarget.setDropTargetBar(this);
84
85 // Initialize with hidden state
86 setAlpha(0f);
87 }
88
89 public void setup(DragController dragController) {
90 dragController.addDragListener(this);
91 dragController.setFlingToDeleteDropTarget(mDeleteDropTarget);
92
93 dragController.addDragListener(mDeleteDropTarget);
94 dragController.addDragListener(mAppInfoDropTarget);
95 dragController.addDragListener(mUninstallDropTarget);
96
97 dragController.addDropTarget(mDeleteDropTarget);
98 dragController.addDropTarget(mAppInfoDropTarget);
99 dragController.addDropTarget(mUninstallDropTarget);
100 }
101
102 private void animateToVisibility(boolean isVisible) {
103 if (mVisible != isVisible) {
104 mVisible = isVisible;
105
106 // Cancel any existing animation
107 if (mCurrentAnimation != null) {
108 mCurrentAnimation.cancel();
109 mCurrentAnimation = null;
110 }
111
112 float finalAlpha = mVisible ? 1 : 0;
113 if (Float.compare(getAlpha(), finalAlpha) != 0) {
114 setVisibility(View.VISIBLE);
115 mCurrentAnimation = animate().alpha(finalAlpha)
116 .setInterpolator(DEFAULT_INTERPOLATOR)
117 .setDuration(DEFAULT_DRAG_FADE_DURATION)
118 .withEndAction(mFadeAnimationEndRunnable);
119 }
120
121 }
122 }
123
Sunny Goyal47328fd2016-05-25 18:56:41 -0700124 /*
125 * DragController.DragListener implementation
126 */
127 @Override
Sunny Goyal94b510c2016-08-16 15:36:48 -0700128 public void onDragStart(DropTarget.DragObject dragObject, DragOptions options) {
Sunny Goyal47328fd2016-05-25 18:56:41 -0700129 animateToVisibility(true);
130 }
131
132 /**
133 * This is called to defer hiding the delete drop target until the drop animation has completed,
134 * instead of hiding immediately when the drag has ended.
135 */
136 protected void deferOnDragEnd() {
137 mDeferOnDragEnd = true;
138 }
139
140 @Override
141 public void onDragEnd() {
142 if (!mDeferOnDragEnd) {
143 animateToVisibility(false);
144 } else {
145 mDeferOnDragEnd = false;
146 }
147 }
148}