aboutsummaryrefslogtreecommitdiff
path: root/partner_support/g3doc/CloudEpgForPartners.md
diff options
context:
space:
mode:
Diffstat (limited to 'partner_support/g3doc/CloudEpgForPartners.md')
-rw-r--r--partner_support/g3doc/CloudEpgForPartners.md112
1 files changed, 112 insertions, 0 deletions
diff --git a/partner_support/g3doc/CloudEpgForPartners.md b/partner_support/g3doc/CloudEpgForPartners.md
new file mode 100644
index 00000000..bec6b504
--- /dev/null
+++ b/partner_support/g3doc/CloudEpgForPartners.md
@@ -0,0 +1,112 @@
+# 3rd party instructions for using Cloud EPG feature of Live Channels
+
+Partners can ask Live Channels to retrieve EPG data for their TV Input Service
+using live channels
+
+## Prerequisites
+
+* Updated agreement with Google
+* Oreo or patched Nougat
+
+## Nougat
+
+To use cloud epg with Nougat you will need the following changes.
+
+### Patch TVProvider
+
+To run in Nougat you must cherry pick [change
+455319](https://android-review.googlesource.com/c/platform/packages/providers/TvProvider/+/455319)
+to TV Provider.
+
+### Customisation
+
+Indicate TvProvider is patched by including the following in their TV
+customization resource
+
+```
+<bool name="tvprovider_allows_system_inserts_to_program_table">true</bool>
+```
+
+See https://source.android.com/devices/tv/customize-tv-app
+
+## **Input Setup**
+
+During the input setup activity, the TIS will query the content provider for
+lineups in a given postal code. The TIS then inserts a row to the inputs table
+with input_id and lineup_id
+
+On completion of the activity the TIS sets the extra data in the result to
+
+* `com.android.tv.extra.USE_CLOUD_EPG = true`
+* `TvInputInfo.EXTRA_INPUT_ID` with their input_id
+
+This is used to tell Live Channels to immediately start the EPG fetch for that
+input.
+
+### Sample Input Setup code.
+
+A complete sample is at
+../third_party/samples/src/com/example/partnersupportsampletvinput
+
+#### query lineup
+
+```java
+ private AsyncTask<Void, Void, List<Lineup>> createFetchLineupsTask() {
+ return new AsyncTask<Void, Void, List<Lineup>>() {
+ @Override
+ protected List<Lineup> doInBackground(Void... params) {
+ ContentResolver cr = getActivity().getContentResolver();
+
+ List<Lineup> results = new ArrayList<>();
+ Cursor cursor =
+ cr.query(
+ Uri.parse(
+ "content://com.android.tv.data.epg/lineups/postal_code/"
+ + ZIP),
+ null,
+ null,
+ null,
+ null);
+
+ while (cursor.moveToNext()) {
+ String id = cursor.getString(0);
+ String name = cursor.getString(1);
+ String channels = cursor.getString(2);
+ results.add(new Lineup(id, name, channels));
+ }
+
+ return results;
+ }
+
+ @Override
+ protected void onPostExecute(List<Lineup> lineups) {
+ showLineups(lineups);
+ }
+ };
+ }
+```
+
+#### Insert cloud_epg_input
+
+```java
+ContentValues values = new ContentValues();
+values.put(EpgContract.EpgInputs.COLUMN_INPUT_ID, SampleTvInputService.INPUT_ID);
+values.put(EpgContract.EpgInputs.COLUMN_LINEUP_ID, lineup.getId());
+ContentResolver contentResolver = getActivity().getContentResolver();
+EpgInput epgInput = EpgInputs.queryEpgInput(contentResolver, SampleTvInputService.INPUT_ID);
+if (epgInput == null) {
+ contentResolver.insert(EpgContract.EpgInputs.CONTENT_URI, values);
+} else {
+ values.put(EpgContract.EpgInputs.COLUMN_ID, epgInput.getId());
+ EpgInputs.update(contentResolver, EpgInput.createEpgChannel(values));
+}
+```
+
+#### Return use_cloud_epg
+
+```java
+Intent data = new Intent();
+data.putExtra(TvInputInfo.EXTRA_INPUT_ID, inputId);
+data.putExtra(com.android.tv.extra.USE_CLOUD_EPG, true);
+setResult(Activity.RESULT_OK, data);
+```