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
diff --git a/res/drawable/widget_internal_focus_bg.xml b/res/drawable/widget_internal_focus_bg.xml
new file mode 100644
index 0000000..4d4bea6
--- /dev/null
+++ b/res/drawable/widget_internal_focus_bg.xml
@@ -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>
\ No newline at end of file
diff --git a/src/com/android/launcher3/LauncherAppWidgetHostView.java b/src/com/android/launcher3/LauncherAppWidgetHostView.java
index 18ae753..4185257 100644
--- a/src/com/android/launcher3/LauncherAppWidgetHostView.java
+++ b/src/com/android/launcher3/LauncherAppWidgetHostView.java
@@ -57,6 +57,8 @@
         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 @@
     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 void requestChildFocus(View child, View focused) {
         super.requestChildFocus(child, focused);
         dispatchChildFocus(focused != null);
+        if (focused != null) {
+            focused.setFocusableInTouchMode(false);
+        }
     }
 
     @Override
@@ -262,10 +268,9 @@
         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