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:
parent
6362683acb
commit
fb78856466
|
@ -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>
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue