Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fb788564 authored by Tony Wickham's avatar Tony Wickham
Browse files

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
parent 6362683a
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
<?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>
 No newline at end of file
+9 −4
Original line number Diff line number Diff line
@@ -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