Merge "Add AiAi overview chips to Launcher" into ub-launcher3-master

This commit is contained in:
Miranda Kephart
2019-03-04 19:07:50 +00:00
committed by Android (Google) Code Review
5 changed files with 90 additions and 284 deletions
@@ -1,55 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2019 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.
-->
<com.android.quickstep.hints.HintView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="@dimen/chip_hint_height"
android:layout_gravity="center_horizontal|bottom"
android:paddingStart="@dimen/chip_hint_start_padding"
android:paddingEnd="@dimen/chip_hint_end_padding"
android:background="@drawable/chip_hint_background_light"
android:gravity="center"
android:layout_marginHorizontal="@dimen/chip_hint_horizontal_margin"
android:orientation="horizontal"
android:elevation="@dimen/chip_hint_elevation"
android:layoutDirection="ltr">
<ImageView
android:id="@+id/icon"
android:layout_width="@dimen/chip_icon_size"
android:layout_height="@dimen/chip_icon_size"
android:visibility="gone"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:contentDescription="@null"/>
<TextView
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="@dimen/chip_text_height"
android:paddingTop="@dimen/chip_text_top_padding"
android:paddingStart="@dimen/chip_text_start_padding"
android:fontFamily="google-sans-medium"
android:textAlignment="textStart"
android:singleLine="true"
android:textColor="@color/chip_hint_foreground_color"
android:textSize="@dimen/chip_text_size"
android:ellipsize="none"
android:includeFontPadding="true"/>
</com.android.quickstep.hints.HintView>
@@ -14,9 +14,10 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.android.quickstep.hints.HintsContainer
<com.android.quickstep.hints.ChipsContainer
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="@dimen/chip_hint_height"
android:layout_gravity="bottom"
android:gravity="center_horizontal"
android:orientation="horizontal"/>
@@ -0,0 +1,72 @@
/*
* Copyright (C) 2019 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.quickstep.hints;
import android.content.Context;
import android.util.AttributeSet;
import android.util.FloatProperty;
import android.view.View;
import android.widget.FrameLayout;
public class ChipsContainer extends FrameLayout {
private static final String TAG = "ChipsContainer";
public static final FloatProperty<ChipsContainer> HINT_VISIBILITY =
new FloatProperty<ChipsContainer>("hint_visibility") {
@Override
public void setValue(ChipsContainer chipsContainer, float v) {
chipsContainer.setHintVisibility(v);
}
@Override
public Float get(ChipsContainer chipsContainer) {
return chipsContainer.mHintVisibility;
}
};
private float mHintVisibility;
public ChipsContainer(Context context) {
super(context);
}
public ChipsContainer(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ChipsContainer(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public ChipsContainer(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public void setView(View v) {
removeAllViews();
addView(v);
}
public void setHintVisibility(float v) {
if (v == 1) {
setVisibility(VISIBLE);
} else {
setVisibility(GONE);
}
mHintVisibility = v;
}
}
@@ -1,218 +0,0 @@
/*
* Copyright (C) 2019 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.quickstep.hints;
import static com.android.quickstep.hints.UiHintListenerConstants.HINTS_KEY;
import static com.android.quickstep.hints.UiHintListenerConstants.ON_HINTS_RETURNED_CODE;
import static com.android.quickstep.hints.UiInterfaceConstants.REQUEST_HINTS_CODE;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.AttributeSet;
import android.util.FloatProperty;
import android.util.Log;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import com.android.launcher3.R;
import java.util.ArrayList;
public class HintsContainer extends LinearLayout {
private static final String TAG = "HintsView";
public static final FloatProperty<HintsContainer> HINT_VISIBILITY =
new FloatProperty<HintsContainer>("hint_visibility") {
@Override
public void setValue(HintsContainer hintsContainer, float v) {
hintsContainer.setHintVisibility(v);
}
@Override
public Float get(HintsContainer hintsContainer) {
return hintsContainer.mHintVisibility;
}
};
private static Intent mServiceIntent =
new Intent("com.android.systemui.action.UI_PULL_INTERFACE")
.setClassName(
"com.android.systemui.navbarhint",
"com.android.systemui.navbarhint.service.HintService");
@Nullable
private Messenger mHintServiceInterface;
private UiHintListener mUiHintListener;
private boolean mBound = false;
private float mHintVisibility;
private final ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
mHintServiceInterface = new Messenger(iBinder);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
mHintServiceInterface = null;
attemptBinding();
}
@Override
public void onBindingDied(ComponentName componentName) {
mHintServiceInterface = null;
attemptBinding();
}
};
public HintsContainer(Context context) {
super(context);
}
public HintsContainer(Context context, AttributeSet attrs) {
super(context, attrs);
}
public HintsContainer(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public HintsContainer(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (mUiHintListener == null) {
mUiHintListener = new UiHintListener(this);
}
if (!mBound) {
attemptBinding();
}
}
@Override
protected void onDetachedFromWindow() {
if (mBound) {
getContext().unbindService(mServiceConnection);
mBound = false;
}
super.onDetachedFromWindow();
}
public void setHintVisibility(float v) {
if (v == 1) {
getHints();
setVisibility(VISIBLE);
} else {
setVisibility(GONE);
}
mHintVisibility = v;
}
private void attemptBinding() {
if (mBound) {
getContext().unbindService(mServiceConnection);
mBound = false;
}
boolean success = getContext().bindService(mServiceIntent,
mServiceConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT);
if (success) {
mBound = true;
} else {
Log.w(TAG, "Binding to hint supplier failed");
}
}
private void sendOnHintTap(Bundle hint) {
if (mHintServiceInterface != null) {
Message msg = Message.obtain(null, UiInterfaceConstants.ON_HINT_TAP_CODE);
Bundle data = new Bundle();
data.putString(UiInterfaceConstants.HINT_ID_KEY, HintUtil.getId(hint));
data.putInt(UiInterfaceConstants.WIDTH_PX_KEY, getWidth());
data.putInt(UiInterfaceConstants.HEIGHT_PX_KEY, getHeight());
data.putInt(UiInterfaceConstants.HINT_SPACE_WIDTH_PX_KEY, 0);
data.putInt(UiInterfaceConstants.HINT_SPACE_HEIGHT_PX_KEY, 0);
msg.setData(data);
try {
mHintServiceInterface.send(msg);
} catch (RemoteException e) {
Log.e(TAG, "Failed to send hint tap", e);
}
}
}
private void getHints() {
if (mHintServiceInterface != null) {
try {
Message m = Message.obtain(null, REQUEST_HINTS_CODE);
m.replyTo = new Messenger(mUiHintListener);
mHintServiceInterface.send(m);
} catch (RemoteException e) {
Log.e(TAG, "Failed to send message", e);
}
}
}
private static class UiHintListener extends Handler {
private HintsContainer mView;
UiHintListener(HintsContainer v) {
mView = v;
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case ON_HINTS_RETURNED_CODE:
handleHints(msg);
break;
default:
Log.e(TAG, "UiPullInterface got unrecognized code: " + msg.what);
break;
}
}
private void handleHints(Message msg) {
Bundle bundle = msg.getData();
ArrayList<Bundle> hints = bundle.getParcelableArrayList(HINTS_KEY);
if (hints != null) {
mView.removeAllViews();
for (Bundle hint : hints) {
HintView h = (HintView) LayoutInflater.from(mView.getContext()).inflate(
R.layout.hint, mView, false);
h.setHint(hint);
h.setOnClickListener((v) -> mView.sendOnHintTap(hint));
mView.addView(h);
}
}
}
}
}
@@ -42,9 +42,10 @@ import com.android.launcher3.LauncherState;
import com.android.launcher3.R;
import com.android.launcher3.anim.Interpolators;
import com.android.launcher3.util.PendingAnimation;
import com.android.launcher3.views.BaseDragLayer;
import com.android.launcher3.views.ScrimView;
import com.android.quickstep.OverviewInteractionState;
import com.android.quickstep.hints.HintsContainer;
import com.android.quickstep.hints.ChipsContainer;
import com.android.quickstep.util.ClipAnimationHelper;
import com.android.quickstep.util.ClipAnimationHelper.TransformParams;
import com.android.quickstep.util.LayoutUtils;
@@ -77,7 +78,7 @@ public class LauncherRecentsView extends RecentsView<Launcher> {
private float mTranslationYFactor;
private final TransformParams mTransformParams = new TransformParams();
private HintsContainer mHintsContainer;
private ChipsContainer mChipsContainer;
public LauncherRecentsView(Context context) {
this(context, null);
@@ -111,8 +112,9 @@ public class LauncherRecentsView extends RecentsView<Launcher> {
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mHintsContainer = mActivity.findViewById(R.id.hints);
mHintsContainer.setPadding(0, 0, 0, mActivity.getDeviceProfile().chipHintBottomMarginPx);
mChipsContainer = mActivity.findViewById(R.id.hints);
BaseDragLayer.LayoutParams params = (BaseDragLayer.LayoutParams) mChipsContainer.getLayoutParams();
params.bottomMargin = mActivity.getDeviceProfile().chipHintBottomMarginPx;
}
public void setTranslationYFactor(float translationFactor) {
@@ -131,11 +133,15 @@ public class LauncherRecentsView extends RecentsView<Launcher> {
}
public void setHintVisibility(float v) {
if (mHintsContainer != null && ENABLE_HINTS_IN_OVERVIEW.get()) {
mHintsContainer.setHintVisibility(v);
if (mChipsContainer != null && ENABLE_HINTS_IN_OVERVIEW.get()) {
mChipsContainer.setHintVisibility(v);
}
}
public ChipsContainer getChipsContainer() {
return mChipsContainer;
}
@Override
public void draw(Canvas canvas) {
maybeDrawEmptyMessage(canvas);
@@ -192,7 +198,7 @@ public class LauncherRecentsView extends RecentsView<Launcher> {
if (ENABLE_HINTS_IN_OVERVIEW.get()) {
anim.anim.play(ObjectAnimator.ofFloat(
mHintsContainer, HintsContainer.HINT_VISIBILITY, 0));
mChipsContainer, ChipsContainer.HINT_VISIBILITY, 0));
}
return anim;
@@ -206,10 +212,10 @@ public class LauncherRecentsView extends RecentsView<Launcher> {
if (ENABLE_HINTS_IN_OVERVIEW.get()) {
anim.anim.play(ObjectAnimator.ofFloat(
mHintsContainer, HintsContainer.HINT_VISIBILITY, 0));
mChipsContainer, ChipsContainer.HINT_VISIBILITY, 0));
anim.addEndListener(onEndListener -> {
if (!onEndListener.isSuccess) {
mHintsContainer.setHintVisibility(1);
mChipsContainer.setHintVisibility(1);
}
});
}