Change widget host view background when giving focus to child.

Before, the FocusIndicatorView stayed on the widget host unless the
widget had its own focus change listener, which caused a couple of
problems, namely  (1) it was hard to know where the focus was from
a user's standpoint, and (2) the focus indicator could get stuck on
the screen if you entered a widget and then long-pressed workspace.
Now, the focus indicator goes away and instead the widget is framed
with a white border to indicate that the focus is inside it. The
frame goes away when pressing ESC or when touching the screen.

Bug: 26744224

Change-Id: I14025576fd7a9f901b4d969b878af0bebad79a70
This commit is contained in:
Tony Wickham 2016-02-10 12:15:41 -08:00
parent 6362683acb
commit fb78856466
2 changed files with 37 additions and 4 deletions

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2015, 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.
*/
-->
<!-- Used as the widget host view background when giving focus to a child via keyboard. -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true">
<shape android:shape="rectangle">
<stroke android:color="#fff" android:width="2dp" />
</shape>
</item>
</selector>

View File

@ -57,6 +57,8 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mDragLayer = ((Launcher) context).getDragLayer();
setAccessibilityDelegate(LauncherAppState.getInstance().getAccessibilityDelegate());
setBackgroundResource(R.drawable.widget_internal_focus_bg);
}
@Override
@ -241,6 +243,7 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
if (gainFocus) {
mChildrenFocused = false;
dispatchChildFocus(false);
}
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
}
@ -249,6 +252,9 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc
public void requestChildFocus(View child, View focused) {
super.requestChildFocus(child, focused);
dispatchChildFocus(focused != null);
if (focused != null) {
focused.setFocusableInTouchMode(false);
}
}
@Override
@ -262,10 +268,9 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc
return mChildrenFocused;
}
private void dispatchChildFocus(boolean focused) {
if (getOnFocusChangeListener() != null) {
getOnFocusChangeListener().onFocusChange(this, focused || isFocused());
}
private void dispatchChildFocus(boolean childIsFocused) {
// The host view's background changes when selected, to indicate the focus is inside.
setSelected(childIsFocused);
}
@Override