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