Merge "Improve text scaling animation for BottomNavigationView." into nyc-mr1-dev
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
index 802c4d3..c601ca8 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
@@ -67,7 +67,6 @@
         setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
         setTitle("Leanback Sample App");
         setHeadersState(HEADERS_ENABLED);
-        setupRows();
         setOnSearchClickedListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -101,6 +100,7 @@
         // simulates in a real world use case  data being loaded two seconds later
         new Handler().postDelayed(new Runnable() {
             public void run() {
+                setupRows();
                 loadData();
                 startEntranceTransition();
             }
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java
index 48c1462..7719b0e 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java
@@ -69,7 +69,6 @@
         setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
         setTitle("Leanback Sample App");
         setHeadersState(HEADERS_ENABLED);
-        setupRows();
         setOnSearchClickedListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -103,6 +102,7 @@
         // simulates in a real world use case  data being loaded two seconds later
         new Handler().postDelayed(new Runnable() {
             public void run() {
+                setupRows();
                 loadData();
                 startEntranceTransition();
             }
diff --git a/v17/leanback/res/values/styles.xml b/v17/leanback/res/values/styles.xml
index 491364e..59bf520 100644
--- a/v17/leanback/res/values/styles.xml
+++ b/v17/leanback/res/values/styles.xml
@@ -168,7 +168,7 @@
         <item name="android:layout_toStartOf">@+id/extra_badge</item>
         <item name="android:maxLines">1</item>
         <item name="android:textAlignment">viewStart</item>
-        <item name="android:ellipsize">none</item>
+        <item name="android:ellipsize">end</item>
         <item name="android:textAppearance">@style/TextAppearance.Leanback.ImageCardView.Content</item>
     </style>
 
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java
index e2cb22f8..fa3aae3 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java
@@ -1187,7 +1187,9 @@
 
     private void setupMainFragment() {
         if (mMainFragmentRowsAdapter != null) {
-            mMainFragmentRowsAdapter.setAdapter(new ListRowDataAdapter(mAdapter));
+            if (mAdapter != null) {
+                mMainFragmentRowsAdapter.setAdapter(new ListRowDataAdapter(mAdapter));
+            }
             mMainFragmentRowsAdapter.setOnItemViewSelectedListener(
                     new MainFragmentItemViewSelectedListener(mMainFragmentRowsAdapter));
             mMainFragmentRowsAdapter.setOnItemViewClickedListener(mOnItemViewClickedListener);
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java
index 5be65a7..53d53a3 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java
@@ -1189,7 +1189,9 @@
 
     private void setupMainFragment() {
         if (mMainFragmentRowsAdapter != null) {
-            mMainFragmentRowsAdapter.setAdapter(new ListRowDataAdapter(mAdapter));
+            if (mAdapter != null) {
+                mMainFragmentRowsAdapter.setAdapter(new ListRowDataAdapter(mAdapter));
+            }
             mMainFragmentRowsAdapter.setOnItemViewSelectedListener(
                     new MainFragmentItemViewSelectedListener(mMainFragmentRowsAdapter));
             mMainFragmentRowsAdapter.setOnItemViewClickedListener(mOnItemViewClickedListener);
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTest.java
index c9a33ff..afeb175 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTest.java
@@ -132,6 +132,26 @@
         assertEquals(selectItem, row.getGridView().getSelectedPosition());
     }
 
+    @Test
+    public void activityRecreate_notCrash() throws InterruptedException {
+        final long dataLoadingDelay = 1000;
+        Intent intent = new Intent();
+        intent.putExtra(BrowseFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, dataLoadingDelay);
+        intent.putExtra(BrowseFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , false);
+        intent.putExtra(BrowseFragmentTestActivity.EXTRA_SET_ADAPTER_AFTER_DATA_LOAD, true);
+        mActivity = activityTestRule.launchActivity(intent);
+
+        Thread.sleep(dataLoadingDelay + TRANSITION_LENGTH);
+
+        InstrumentationRegistry.getInstrumentation().callActivityOnRestart(mActivity);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.recreate();
+            }
+        });
+    }
+
     private void sendKeys(int ...keys) {
         for (int i = 0; i < keys.length; i++) {
             InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(keys[i]);
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTestActivity.java b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
index d867c9d..1fe145e 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
@@ -32,6 +32,7 @@
     public static final String EXTRA_REPEAT_PER_ROW = "repeatPerRow";
     public static final String EXTRA_LOAD_DATA_DELAY = "loadDataDelay";
     public static final String EXTRA_TEST_ENTRANCE_TRANSITION = "testEntranceTransition";
+    public final static String EXTRA_SET_ADAPTER_AFTER_DATA_LOAD = "set_adapter_after_data_load";
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -47,6 +48,9 @@
         BrowseTestFragment.TEST_ENTRANCE_TRANSITION = intent.getBooleanExtra(
                 EXTRA_TEST_ENTRANCE_TRANSITION,
                 BrowseTestFragment.DEFAULT_TEST_ENTRANCE_TRANSITION);
+        BrowseTestFragment.SET_ADAPTER_AFTER_DATA_LOAD = intent.getBooleanExtra(
+                EXTRA_SET_ADAPTER_AFTER_DATA_LOAD,
+                BrowseTestFragment.DEFAULT_SET_ADAPTER_AFTER_DATA_LOAD);
         setContentView(R.layout.browse);
         FragmentTransaction ft = getFragmentManager().beginTransaction();
         ft.replace(R.id.main_frame, new BrowseTestFragment());
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
index 59040dc..bab554d 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
@@ -134,6 +134,26 @@
         assertEquals(selectItem, row.getGridView().getSelectedPosition());
     }
 
+    @Test
+    public void activityRecreate_notCrash() throws InterruptedException {
+        final long dataLoadingDelay = 1000;
+        Intent intent = new Intent();
+        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, dataLoadingDelay);
+        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , false);
+        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_SET_ADAPTER_AFTER_DATA_LOAD, true);
+        mActivity = activityTestRule.launchActivity(intent);
+
+        Thread.sleep(dataLoadingDelay + TRANSITION_LENGTH);
+
+        InstrumentationRegistry.getInstrumentation().callActivityOnRestart(mActivity);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.recreate();
+            }
+        });
+    }
+
     private void sendKeys(int ...keys) {
         for (int i = 0; i < keys.length; i++) {
             InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(keys[i]);
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
index 349e2bde..fd3ba88 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
@@ -34,6 +34,7 @@
     public static final String EXTRA_REPEAT_PER_ROW = "repeatPerRow";
     public static final String EXTRA_LOAD_DATA_DELAY = "loadDataDelay";
     public static final String EXTRA_TEST_ENTRANCE_TRANSITION = "testEntranceTransition";
+    public final static String EXTRA_SET_ADAPTER_AFTER_DATA_LOAD = "set_adapter_after_data_load";
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -49,6 +50,9 @@
         BrowseTestSupportFragment.TEST_ENTRANCE_TRANSITION = intent.getBooleanExtra(
                 EXTRA_TEST_ENTRANCE_TRANSITION,
                 BrowseTestSupportFragment.DEFAULT_TEST_ENTRANCE_TRANSITION);
+        BrowseTestSupportFragment.SET_ADAPTER_AFTER_DATA_LOAD = intent.getBooleanExtra(
+                EXTRA_SET_ADAPTER_AFTER_DATA_LOAD,
+                BrowseTestSupportFragment.DEFAULT_SET_ADAPTER_AFTER_DATA_LOAD);
         setContentView(R.layout.browse);
         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
         ft.replace(R.id.main_frame, new BrowseTestSupportFragment());
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestFragment.java b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestFragment.java
index c77809d..a45f51d 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestFragment.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestFragment.java
@@ -38,11 +38,13 @@
     final static int DEFAULT_REPEAT_PER_ROW = 20;
     final static long DEFAULT_LOAD_DATA_DELAY = 2000;
     final static boolean DEFAULT_TEST_ENTRANCE_TRANSITION = true;
+    final static boolean DEFAULT_SET_ADAPTER_AFTER_DATA_LOAD = false;
 
     static int NUM_ROWS = DEFAULT_NUM_ROWS;
     static int REPEAT_PER_ROW = DEFAULT_REPEAT_PER_ROW;
     static long LOAD_DATA_DELAY = DEFAULT_LOAD_DATA_DELAY;
     static boolean TEST_ENTRANCE_TRANSITION = DEFAULT_TEST_ENTRANCE_TRANSITION;
+    static boolean SET_ADAPTER_AFTER_DATA_LOAD = DEFAULT_SET_ADAPTER_AFTER_DATA_LOAD;
 
     private ArrayObjectAdapter mRowsAdapter;
 
@@ -55,6 +57,10 @@
         Log.i(TAG, "onCreate");
         super.onCreate(savedInstanceState);
 
+        if (!SET_ADAPTER_AFTER_DATA_LOAD) {
+            setupRows();
+        }
+
         setTitle("BrowseTestFragment");
         setHeadersState(HEADERS_ENABLED);
 
@@ -65,7 +71,6 @@
             }
         });
 
-        setupRows();
         setOnItemViewClickedListener(new ItemViewClickedListener());
         setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
             @Override
@@ -84,6 +89,9 @@
         new Handler().postDelayed(new Runnable() {
             @Override
             public void run() {
+                if (SET_ADAPTER_AFTER_DATA_LOAD) {
+                    setupRows();
+                }
                 loadData();
                 startEntranceTransition();
             }
@@ -114,7 +122,6 @@
             HeaderItem header = new HeaderItem(i, "Row " + i);
             mRowsAdapter.add(new ListRow(header, listRowAdapter));
         }
-
     }
 
     private final class ItemViewClickedListener implements OnItemViewClickedListener {
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java
index b8f16d302c..4aa27a5 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java
@@ -40,11 +40,13 @@
     final static int DEFAULT_REPEAT_PER_ROW = 20;
     final static long DEFAULT_LOAD_DATA_DELAY = 2000;
     final static boolean DEFAULT_TEST_ENTRANCE_TRANSITION = true;
+    final static boolean DEFAULT_SET_ADAPTER_AFTER_DATA_LOAD = false;
 
     static int NUM_ROWS = DEFAULT_NUM_ROWS;
     static int REPEAT_PER_ROW = DEFAULT_REPEAT_PER_ROW;
     static long LOAD_DATA_DELAY = DEFAULT_LOAD_DATA_DELAY;
     static boolean TEST_ENTRANCE_TRANSITION = DEFAULT_TEST_ENTRANCE_TRANSITION;
+    static boolean SET_ADAPTER_AFTER_DATA_LOAD = DEFAULT_SET_ADAPTER_AFTER_DATA_LOAD;
 
     private ArrayObjectAdapter mRowsAdapter;
 
@@ -57,6 +59,10 @@
         Log.i(TAG, "onCreate");
         super.onCreate(savedInstanceState);
 
+        if (!SET_ADAPTER_AFTER_DATA_LOAD) {
+            setupRows();
+        }
+
         setTitle("BrowseTestSupportFragment");
         setHeadersState(HEADERS_ENABLED);
 
@@ -67,7 +73,6 @@
             }
         });
 
-        setupRows();
         setOnItemViewClickedListener(new ItemViewClickedListener());
         setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
             @Override
@@ -86,6 +91,9 @@
         new Handler().postDelayed(new Runnable() {
             @Override
             public void run() {
+                if (SET_ADAPTER_AFTER_DATA_LOAD) {
+                    setupRows();
+                }
                 loadData();
                 startEntranceTransition();
             }
@@ -116,7 +124,6 @@
             HeaderItem header = new HeaderItem(i, "Row " + i);
             mRowsAdapter.add(new ListRow(header, listRowAdapter));
         }
-
     }
 
     private final class ItemViewClickedListener implements OnItemViewClickedListener {