am 771466f6: resolved conflicts for da76169f to lmp-dev

* commit '771466f6a00c2bd123edac644b66963b32fc5184':
  TIF: Verify if the TV app shows EPG for 3rd-party input
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 6fa743c..4354bf8 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -1428,6 +1428,14 @@
     Overlay view must be shown. Verify that there is a text view displaying \"Overlay View Dummy Text\"
     when you tune to the \"Dummy\" channel.
     </string>
+    <string name="tv_input_discover_test_go_to_epg">
+    Press the \"Launch EPG\" button, and locate the channel named \"Dummy\".
+    </string>
+    <string name="tv_input_discover_test_verify_epg">
+    Do you see the programs named \"Dummy Program\" and its description
+    "Dummy Program Description" in the EPG?
+    </string>
+    <string name="tv_input_discover_test_yes">Yes</string>
 
     <string name="tv_parental_control_test">Live Channels app parental control test</string>
     <string name="tv_parental_control_test_info">
@@ -1455,6 +1463,7 @@
     </string>
 
     <string name="tv_launch_tv_app">Launch Live Channels</string>
+    <string name="tv_launch_epg">Launch EPG</string>
     <string name="tv_channel_not_found">
     CtsVerifier channel is not set up. Please set up before proceeding.
     </string>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/tv/MockTvInputSetupActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/tv/MockTvInputSetupActivity.java
index 81a8edc..1d3fd40 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/tv/MockTvInputSetupActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/tv/MockTvInputSetupActivity.java
@@ -21,18 +21,26 @@
 import android.content.ContentValues;
 import android.database.Cursor;
 import android.media.tv.TvContract;
+import android.media.tv.TvContract.Programs;
 import android.media.tv.TvInputInfo;
 import android.net.Uri;
 import android.os.Bundle;
 import android.util.Pair;
 import android.view.View;
 
+import java.util.ArrayList;
+
 public class MockTvInputSetupActivity extends Activity {
     private static final String TAG = "MockTvInputSetupActivity";
 
     private static final String CHANNEL_NUMBER = "999-0";
     private static final String CHANNEL_NAME = "Dummy";
 
+    private static final String PROGRAM_TITLE = "Dummy Program";
+    private static final String PROGRAM_DESCRIPTION = "Dummy Program Description";
+    private static final long PROGRAM_LENGTH_MILLIS = 60 * 60 * 1000;
+    private static final int PROGRAM_COUNT = 24;
+
     private static Object sLock = new Object();
     private static Pair<View, Runnable> sLaunchCallback = null;
 
@@ -55,6 +63,8 @@
                     return;
                 }
             }
+
+            // Add a channel.
             ContentValues values = new ContentValues();
             values.put(TvContract.Channels.COLUMN_INPUT_ID, inputId);
             values.put(TvContract.Channels.COLUMN_DISPLAY_NUMBER, CHANNEL_NUMBER);
@@ -62,9 +72,27 @@
             Uri channelUri = getContentResolver().insert(uri, values);
             // If the channel's ID happens to be zero, we add another and delete the one.
             if (ContentUris.parseId(channelUri) == 0) {
-                getContentResolver().insert(uri, values);
                 getContentResolver().delete(channelUri, null, null);
+                channelUri = getContentResolver().insert(uri, values);
             }
+
+            // Add Programs.
+            values = new ContentValues();
+            values.put(Programs.COLUMN_CHANNEL_ID, ContentUris.parseId(channelUri));
+            values.put(Programs.COLUMN_TITLE, PROGRAM_TITLE);
+            values.put(Programs.COLUMN_SHORT_DESCRIPTION, PROGRAM_DESCRIPTION);
+            long nowMs = System.currentTimeMillis();
+            long startTimeMs = nowMs - nowMs % PROGRAM_LENGTH_MILLIS;
+            ArrayList<ContentValues> list = new ArrayList<>();
+            for (int i = 0; i < PROGRAM_COUNT; ++i) {
+                values.put(Programs.COLUMN_START_TIME_UTC_MILLIS, startTimeMs);
+                values.put(Programs.COLUMN_END_TIME_UTC_MILLIS,
+                        startTimeMs + PROGRAM_LENGTH_MILLIS);
+                startTimeMs += PROGRAM_LENGTH_MILLIS;
+                list.add(new ContentValues(values));
+            }
+            getContentResolver().bulkInsert(Programs.CONTENT_URI, list.toArray(
+                    new ContentValues[0]));
         } finally {
             Pair<View, Runnable> launchCallback = null;
             synchronized (sLock) {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/tv/TvInputDiscoveryTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/tv/TvInputDiscoveryTestActivity.java
index 3d17a1a..4d12d52 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/tv/TvInputDiscoveryTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/tv/TvInputDiscoveryTestActivity.java
@@ -30,7 +30,9 @@
     private static final String TAG = "TvInputDiscoveryTestActivity";
 
     private static final Intent TV_APP_INTENT = new Intent(Intent.ACTION_VIEW,
-            TvContract.buildChannelUri(0));
+            TvContract.Channels.CONTENT_URI);
+    private static final Intent EPG_INTENT = new Intent(Intent.ACTION_VIEW,
+            TvContract.Programs.CONTENT_URI);
 
     private static final long TIMEOUT_MS = 5l * 60l * 1000l;  // 5 mins.
 
@@ -39,6 +41,8 @@
     private View mTuneToChannelItem;
     private View mVerifyTuneItem;
     private View mVerifyOverlayViewItem;
+    private View mGoToEpgItem;
+    private View mVerifyEpgItem;
     private boolean mTuneVerified;
     private boolean mOverlayViewVerified;
 
@@ -63,6 +67,7 @@
                     setButtonEnabled(mTuneToChannelItem, true);
                 }
             });
+            startActivity(TV_APP_INTENT);
         } else if (containsButton(mTuneToChannelItem, v)) {
             final Runnable failCallback = new Runnable() {
                 @Override
@@ -78,7 +83,7 @@
                     setPassState(mVerifyTuneItem, true);
 
                     mTuneVerified = true;
-                    updatePassState(postTarget, failCallback);
+                    goToNextState(postTarget, failCallback);
                 }
             });
             MockTvInputService.expectOverlayView(postTarget, new Runnable() {
@@ -88,11 +93,18 @@
                     setPassState(mVerifyOverlayViewItem, true);
 
                     mOverlayViewVerified = true;
-                    updatePassState(postTarget, failCallback);
+                    goToNextState(postTarget, failCallback);
                 }
             });
+            startActivity(TV_APP_INTENT);
+        } else if (containsButton(mGoToEpgItem, v)) {
+            startActivity(EPG_INTENT);
+            setPassState(mGoToEpgItem, true);
+            setButtonEnabled(mVerifyEpgItem, true);
+        } else if (containsButton(mVerifyEpgItem, v)) {
+            setPassState(mVerifyEpgItem, true);
+            getPassButton().setEnabled(true);
         }
-        startActivity(TV_APP_INTENT);
     }
 
     @Override
@@ -106,12 +118,16 @@
         mVerifyTuneItem = createAutoItem(R.string.tv_input_discover_test_verify_tune);
         mVerifyOverlayViewItem = createAutoItem(
                 R.string.tv_input_discover_test_verify_overlay_view);
+        mGoToEpgItem = createUserItem(R.string.tv_input_discover_test_go_to_epg,
+                R.string.tv_launch_epg, this);
+        mVerifyEpgItem = createUserItem(R.string.tv_input_discover_test_verify_epg,
+                R.string.tv_input_discover_test_yes, this);
     }
 
-    private void updatePassState(View postTarget, Runnable failCallback) {
+    private void goToNextState(View postTarget, Runnable failCallback) {
         if (mTuneVerified && mOverlayViewVerified) {
             postTarget.removeCallbacks(failCallback);
-            getPassButton().setEnabled(true);
+            setButtonEnabled(mGoToEpgItem, true);
         }
     }