Improve D-Pad accessiblity of the call details.

We are doing something fancy with the layout, to scroll the header when
the list view is scrolled: a list view is shown under the controls, with
a first header item which is invisible as it is behind the controls; the
controls are then scrolled up when the list is scrolled. This is similar
to what is done in the tab carousel in the contact details/updates.

Unfortunately, this broke the accessibility of the call details.

In this commit I have a partial fix: whenever the hidden header is
focused, focus is transfered to the controls. This makes the history
items not accessible, but makes the more crucial controls accessible
again.

Bug: 5323306
Change-Id: I342e58b9052e2aba3d5d8c8ea1b178108741de91
diff --git a/res/layout/call_detail.xml b/res/layout/call_detail.xml
index a890ddf..13124f2 100644
--- a/res/layout/call_detail.xml
+++ b/res/layout/call_detail.xml
@@ -79,16 +79,6 @@
             android:background="@android:color/holo_blue_light"
             android:layout_below="@+id/contact_background_sizer"
         />
-        <LinearLayout
-            android:id="@+id/voicemail_container"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:paddingBottom="@dimen/call_detail_button_spacing"
-            android:layout_below="@id/blue_separator"
-            android:background="@android:color/black"
-        >
-            <!-- The voicemail fragment will be put here. -->
-        </LinearLayout>
         <View
             android:id="@+id/photo_text_bar"
             android:layout_width="match_parent"
@@ -132,6 +122,16 @@
             android:layout_alignBottom="@id/contact_background_sizer"
             android:background="?android:attr/selectableItemBackground"
         />
+        <LinearLayout
+            android:id="@+id/voicemail_container"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/call_detail_button_spacing"
+            android:layout_below="@id/blue_separator"
+            android:background="@android:color/black"
+        >
+            <!-- The voicemail fragment will be put here. -->
+        </LinearLayout>
         <FrameLayout android:id="@+id/call_and_sms_container"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
diff --git a/src/com/android/contacts/CallDetailActivity.java b/src/com/android/contacts/CallDetailActivity.java
index b7ccffc..8d7561a 100644
--- a/src/com/android/contacts/CallDetailActivity.java
+++ b/src/com/android/contacts/CallDetailActivity.java
@@ -507,7 +507,8 @@
                 ListView historyList = (ListView) findViewById(R.id.history);
                 historyList.setAdapter(
                         new CallDetailHistoryAdapter(CallDetailActivity.this, mInflater,
-                                mCallTypeHelper, details, hasVoicemail(), canPlaceCallsTo));
+                                mCallTypeHelper, details, hasVoicemail(), canPlaceCallsTo,
+                                findViewById(R.id.controls)));
                 BackScrollManager.bind(
                         new ScrollableHeader() {
                             private View controls = findViewById(R.id.controls);
diff --git a/src/com/android/contacts/calllog/CallDetailHistoryAdapter.java b/src/com/android/contacts/calllog/CallDetailHistoryAdapter.java
index ed9c2e0..22b85d7 100644
--- a/src/com/android/contacts/calllog/CallDetailHistoryAdapter.java
+++ b/src/com/android/contacts/calllog/CallDetailHistoryAdapter.java
@@ -45,16 +45,30 @@
     private final boolean mShowVoicemail;
     /** Whether the call and SMS controls are shown. */
     private final boolean mShowCallAndSms;
+    /** The controls that are shown on top of the history list. */
+    private final View mControls;
+    /** The listener to changes of focus of the header. */
+    private View.OnFocusChangeListener mHeaderFocusChangeListener =
+            new View.OnFocusChangeListener() {
+        @Override
+        public void onFocusChange(View v, boolean hasFocus) {
+            // When the header is focused, focus the controls above it instead.
+            if (hasFocus) {
+                mControls.requestFocus();
+            }
+        }
+    };
 
     public CallDetailHistoryAdapter(Context context, LayoutInflater layoutInflater,
             CallTypeHelper callTypeHelper, PhoneCallDetails[] phoneCallDetails,
-            boolean showVoicemail, boolean showCallAndSms) {
+            boolean showVoicemail, boolean showCallAndSms, View controls) {
         mContext = context;
         mLayoutInflater = layoutInflater;
         mCallTypeHelper = callTypeHelper;
         mPhoneCallDetails = phoneCallDetails;
         mShowVoicemail = showVoicemail;
         mShowCallAndSms = showCallAndSms;
+        mControls = controls;
     }
 
     @Override
@@ -103,6 +117,8 @@
             // Call and SMS controls are only shown in the main UI if there is a known number.
             View callAndSmsContainer = header.findViewById(R.id.header_call_and_sms_container);
             callAndSmsContainer.setVisibility(mShowCallAndSms ? View.VISIBLE : View.GONE);
+            header.setFocusable(true);
+            header.setOnFocusChangeListener(mHeaderFocusChangeListener);
             return header;
         }