/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.launcher3.shortcuts; import android.content.Context; import android.graphics.Point; import android.graphics.Rect; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; import com.android.launcher3.BubbleTextView; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; /** * A {@link android.widget.FrameLayout} that contains a {@link DeepShortcutView}. * This lets us animate the DeepShortcutView (icon and text) separately from the background. */ public class DeepShortcutView extends FrameLayout { private static final Point sTempPoint = new Point(); private final Rect mPillRect; private BubbleTextView mBubbleText; private View mIconView; private ShortcutInfo mInfo; private ShortcutInfoCompat mDetail; public DeepShortcutView(Context context) { this(context, null, 0); } public DeepShortcutView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public DeepShortcutView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mPillRect = new Rect(); } @Override protected void onFinishInflate() { super.onFinishInflate(); mBubbleText = findViewById(R.id.bubble_text); mIconView = findViewById(R.id.icon); } public BubbleTextView getBubbleText() { return mBubbleText; } public void setWillDrawIcon(boolean willDraw) { mIconView.setVisibility(willDraw ? View.VISIBLE : View.INVISIBLE); } public boolean willDrawIcon() { return mIconView.getVisibility() == View.VISIBLE; } /** * Returns the position of the center of the icon relative to the container. */ public Point getIconCenter() { sTempPoint.y = sTempPoint.x = getMeasuredHeight() / 2; if (Utilities.isRtl(getResources())) { sTempPoint.x = getMeasuredWidth() - sTempPoint.x; } return sTempPoint; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); mPillRect.set(0, 0, getMeasuredWidth(), getMeasuredHeight()); } /** package private **/ public void applyShortcutInfo(ShortcutInfo info, ShortcutInfoCompat detail, ShortcutsItemView container) { mInfo = info; mDetail = detail; mBubbleText.applyFromShortcutInfo(info); mIconView.setBackground(mBubbleText.getIcon()); // Use the long label as long as it exists and fits. CharSequence longLabel = mDetail.getLongLabel(); int availableWidth = mBubbleText.getWidth() - mBubbleText.getTotalPaddingLeft() - mBubbleText.getTotalPaddingRight(); boolean usingLongLabel = !TextUtils.isEmpty(longLabel) && mBubbleText.getPaint().measureText(longLabel.toString()) <= availableWidth; mBubbleText.setText(usingLongLabel ? longLabel : mDetail.getShortLabel()); // TODO: Add the click handler to this view directly and not the child view. mBubbleText.setOnClickListener(Launcher.getLauncher(getContext())); mBubbleText.setOnLongClickListener(container); mBubbleText.setOnTouchListener(container); } /** * Returns the shortcut info that is suitable to be added on the homescreen */ public ShortcutInfo getFinalInfo() { final ShortcutInfo badged = new ShortcutInfo(mInfo); // Queue an update task on the worker thread. This ensures that the badged // shortcut eventually gets its icon updated. Launcher.getLauncher(getContext()).getModel() .updateAndBindShortcutInfo(badged, mDetail); return badged; } public View getIconView() { return mIconView; } }