• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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 
17 package com.android.launcher3.shortcuts;
18 
19 import android.content.Context;
20 import android.graphics.Point;
21 import android.graphics.Rect;
22 import android.text.TextUtils;
23 import android.util.AttributeSet;
24 import android.view.View;
25 import android.widget.FrameLayout;
26 
27 import com.android.launcher3.BubbleTextView;
28 import com.android.launcher3.Launcher;
29 import com.android.launcher3.R;
30 import com.android.launcher3.ShortcutInfo;
31 import com.android.launcher3.Utilities;
32 import com.android.launcher3.popup.PopupContainerWithArrow;
33 import com.android.launcher3.touch.ItemClickHandler;
34 
35 /**
36  * A {@link android.widget.FrameLayout} that contains a {@link DeepShortcutView}.
37  * This lets us animate the DeepShortcutView (icon and text) separately from the background.
38  */
39 public class DeepShortcutView extends FrameLayout {
40 
41     private static final Point sTempPoint = new Point();
42 
43     private final Rect mPillRect;
44 
45     private BubbleTextView mBubbleText;
46     private View mIconView;
47     private View mDivider;
48 
49     private ShortcutInfo mInfo;
50     private ShortcutInfoCompat mDetail;
51 
DeepShortcutView(Context context)52     public DeepShortcutView(Context context) {
53         this(context, null, 0);
54     }
55 
DeepShortcutView(Context context, AttributeSet attrs)56     public DeepShortcutView(Context context, AttributeSet attrs) {
57         this(context, attrs, 0);
58     }
59 
DeepShortcutView(Context context, AttributeSet attrs, int defStyle)60     public DeepShortcutView(Context context, AttributeSet attrs, int defStyle) {
61         super(context, attrs, defStyle);
62 
63         mPillRect = new Rect();
64     }
65 
66     @Override
onFinishInflate()67     protected void onFinishInflate() {
68         super.onFinishInflate();
69         mBubbleText = findViewById(R.id.bubble_text);
70         mIconView = findViewById(R.id.icon);
71         mDivider = findViewById(R.id.divider);
72     }
73 
setDividerVisibility(int visibility)74     public void setDividerVisibility(int visibility) {
75         mDivider.setVisibility(visibility);
76     }
77 
getBubbleText()78     public BubbleTextView getBubbleText() {
79         return mBubbleText;
80     }
81 
setWillDrawIcon(boolean willDraw)82     public void setWillDrawIcon(boolean willDraw) {
83         mIconView.setVisibility(willDraw ? View.VISIBLE : View.INVISIBLE);
84     }
85 
willDrawIcon()86     public boolean willDrawIcon() {
87         return mIconView.getVisibility() == View.VISIBLE;
88     }
89 
90     /**
91      * Returns the position of the center of the icon relative to the container.
92      */
getIconCenter()93     public Point getIconCenter() {
94         sTempPoint.y = sTempPoint.x = getMeasuredHeight() / 2;
95         if (Utilities.isRtl(getResources())) {
96             sTempPoint.x = getMeasuredWidth() - sTempPoint.x;
97         }
98         return sTempPoint;
99     }
100 
101     @Override
onMeasure(int widthMeasureSpec, int heightMeasureSpec)102     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
103         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
104         mPillRect.set(0, 0, getMeasuredWidth(), getMeasuredHeight());
105     }
106 
107     /** package private **/
applyShortcutInfo(ShortcutInfo info, ShortcutInfoCompat detail, PopupContainerWithArrow container)108     public void applyShortcutInfo(ShortcutInfo info, ShortcutInfoCompat detail,
109             PopupContainerWithArrow container) {
110         mInfo = info;
111         mDetail = detail;
112         mBubbleText.applyFromShortcutInfo(info);
113         mIconView.setBackground(mBubbleText.getIcon());
114 
115         // Use the long label as long as it exists and fits.
116         CharSequence longLabel = mDetail.getLongLabel();
117         int availableWidth = mBubbleText.getWidth() - mBubbleText.getTotalPaddingLeft()
118                 - mBubbleText.getTotalPaddingRight();
119         boolean usingLongLabel = !TextUtils.isEmpty(longLabel)
120                 && mBubbleText.getPaint().measureText(longLabel.toString()) <= availableWidth;
121         mBubbleText.setText(usingLongLabel ? longLabel : mDetail.getShortLabel());
122 
123         // TODO: Add the click handler to this view directly and not the child view.
124         mBubbleText.setOnClickListener(ItemClickHandler.INSTANCE);
125         mBubbleText.setOnLongClickListener(container);
126         mBubbleText.setOnTouchListener(container);
127     }
128 
129     /**
130      * Returns the shortcut info that is suitable to be added on the homescreen
131      */
getFinalInfo()132     public ShortcutInfo getFinalInfo() {
133         final ShortcutInfo badged = new ShortcutInfo(mInfo);
134         // Queue an update task on the worker thread. This ensures that the badged
135         // shortcut eventually gets its icon updated.
136         Launcher.getLauncher(getContext()).getModel()
137                 .updateAndBindShortcutInfo(badged, mDetail);
138         return badged;
139     }
140 
getIconView()141     public View getIconView() {
142         return mIconView;
143     }
144 }
145