Inflate action drawer menu only when needed.

Remove unnecessary inflation of the unseen menu by setting the Adapter and DrawerContent to when the drawer is opened for the first time.

Test: WearableDrawerLayoutEspressoTest.java

Change-Id: Iea241cfaddbc0545955c2aa53ba6ac503fd13796
diff --git a/wear/wear/src/androidTest/java/androidx/wear/widget/drawer/WearableDrawerLayoutEspressoTest.java b/wear/wear/src/androidTest/java/androidx/wear/widget/drawer/WearableDrawerLayoutEspressoTest.java
index 6887f25..8b0cfa9 100644
--- a/wear/wear/src/androidTest/java/androidx/wear/widget/drawer/WearableDrawerLayoutEspressoTest.java
+++ b/wear/wear/src/androidTest/java/androidx/wear/widget/drawer/WearableDrawerLayoutEspressoTest.java
@@ -250,6 +250,33 @@
     }
 
     @Test
+    public void drawerContentViewShouldOnlyInflateOnceOpened() {
+        // GIVEN a launched activity with only an action drawer
+        activityRule.launchActivity(
+                new DrawerTestActivity.Builder()
+                        .setStyle(DrawerStyle.ONLY_ACTION_DRAWER_WITH_TITLE)
+                        .build());
+        // WHEN it is opened
+        WearableDrawerView actionDrawer = activityRule.getActivity().findViewById(
+                R.id.action_drawer);
+        openDrawer(actionDrawer);
+
+        // THEN the drawer content view should be displayed
+        onView(allOf(withId(R.id.action_list), isCompletelyDisplayed()));
+    }
+
+    @Test
+    public void drawerContentViewShouldNotInflateAfterLaunch() {
+        // GIVEN a launched activity with only an action drawer
+        activityRule.launchActivity(
+                new DrawerTestActivity.Builder()
+                        .setStyle(DrawerStyle.ONLY_ACTION_DRAWER_WITH_TITLE)
+                        .build());
+        // THEN the drawer content view should not exist
+        onView(allOf(withId(R.id.action_list), not(isDisplayed())));
+    }
+
+    @Test
     public void navDrawerShouldOpenWhenCalledInOnCreateAndThenCloseWhenRequested() {
         // GIVEN an activity which calls openDrawer(Gravity.TOP) in onCreate, then closes it
         // WHEN it is launched
@@ -298,11 +325,10 @@
         WearableActionDrawerView actionDrawer =
                 (WearableActionDrawerView) activityRule.getActivity()
                         .findViewById(R.id.action_drawer);
-        RecyclerView recyclerView = (RecyclerView) actionDrawer.getDrawerContent();
 
         // WHEN the action drawer is opened and scrolled to the last item (Item 6)
         openDrawer(actionDrawer);
-        scrollToPosition(recyclerView, 5);
+        scrollToPosition(actionDrawer, 5);
         onView(withId(R.id.action_drawer))
                 .perform(
                         waitForMatchingView(allOf(withId(R.id.action_drawer), isOpened(true)),
@@ -473,11 +499,11 @@
                 .perform(waitForMatchingView(withText("New Item"), MAX_WAIT_MS));
     }
 
-    private void scrollToPosition(final RecyclerView recyclerView, final int position) {
-        recyclerView.post(new Runnable() {
+    private void scrollToPosition(final WearableActionDrawerView actionDrawer, final int position) {
+        actionDrawer.post(new Runnable() {
             @Override
             public void run() {
-                recyclerView.scrollToPosition(position);
+                ((RecyclerView) actionDrawer.getDrawerContent()).scrollToPosition(position);
             }
         });
     }
diff --git a/wear/wear/src/main/java/androidx/wear/widget/drawer/WearableActionDrawerView.java b/wear/wear/src/main/java/androidx/wear/widget/drawer/WearableActionDrawerView.java
index 4d8439e..bde4629 100644
--- a/wear/wear/src/main/java/androidx/wear/widget/drawer/WearableActionDrawerView.java
+++ b/wear/wear/src/main/java/androidx/wear/widget/drawer/WearableActionDrawerView.java
@@ -185,14 +185,14 @@
                 .getDimensionPixelOffset(R.dimen.ws_action_drawer_item_icon_right_margin);
 
         mActionList = new RecyclerView(context);
+        mActionList.setId(R.id.action_list);
         mActionList.setLayoutManager(new LinearLayoutManager(context));
         mActionListAdapter = new ActionListAdapter(getMenu());
-        mActionList.setAdapter(mActionListAdapter);
-        setDrawerContent(mActionList);
     }
 
     @Override
     public void onDrawerOpened() {
+        setContentIfFirstCall();
         if (mActionListAdapter.getItemCount() > 0) {
             RecyclerView.ViewHolder holder = mActionList.findViewHolderForAdapterPosition(0);
             if (holder != null && holder.itemView != null) {
@@ -201,6 +201,13 @@
         }
     }
 
+    private void setContentIfFirstCall() {
+        if (mActionList.getAdapter() == null) {
+            mActionList.setAdapter(mActionListAdapter);
+            setDrawerContent(mActionList);
+        }
+    }
+
     @Override
     public boolean canScrollHorizontally(int direction) {
         // Prevent the window from being swiped closed while it is open by saying that it can scroll
diff --git a/wear/wear/src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java b/wear/wear/src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java
index c3ebdc0..e7ddbfb 100644
--- a/wear/wear/src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java
+++ b/wear/wear/src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java
@@ -289,6 +289,7 @@
      * peek view and fade in the drawer content.
      */
     static void showDrawerContentMaybeAnimate(WearableDrawerView drawerView) {
+        drawerView.onDrawerOpened();
         drawerView.bringToFront();
         final View contentView = drawerView.getDrawerContent();
         if (contentView != null) {
diff --git a/wear/wear/src/main/res/values/ids.xml b/wear/wear/src/main/res/values/ids.xml
index 8a7324e..6341805 100644
--- a/wear/wear/src/main/res/values/ids.xml
+++ b/wear/wear/src/main/res/values/ids.xml
@@ -15,4 +15,5 @@
 -->
 <resources>
     <item name="ws_navigation_drawer_view_pager" type="id" />
+    <item name="action_list" type="id" />
 </resources>