# 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); ```