Home | History | Annotate | Download | only in tv
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.cts.verifier.tv;
     18 
     19 import android.app.Activity;
     20 import android.content.ComponentName;
     21 import android.content.ContentUris;
     22 import android.content.ContentValues;
     23 import android.content.Intent;
     24 import android.database.Cursor;
     25 import android.graphics.Color;
     26 import android.media.tv.TvContract;
     27 import android.media.tv.TvContract.Programs;
     28 import android.media.tv.TvInputInfo;
     29 import android.net.Uri;
     30 import android.os.Bundle;
     31 import android.util.Pair;
     32 import android.view.View;
     33 
     34 import com.android.cts.verifier.R;
     35 
     36 import java.util.ArrayList;
     37 
     38 public class MockTvInputSetupActivity extends Activity {
     39     private static final String TAG = "MockTvInputSetupActivity";
     40 
     41     /* package-private */ static final String CHANNEL_NUMBER = "999-0";
     42     /* package-private */ static final String CHANNEL_NAME = "Dummy";
     43 
     44     /* package-private */ static final String PROGRAM_TITLE = "Dummy Program";
     45     /* package-private */ static final String PROGRAM_DESCRIPTION = "Dummy Program Description";
     46 
     47     /* package-private */ static final String APP_LINK_TEST_KEY = "app_link_test_key";
     48     /* package-private */ static final String APP_LINK_TEST_VALUE = "app_link_test_value";
     49     private static final String APP_LINK_TEXT = "Cts App-Link Text";
     50     private static final long PROGRAM_LENGTH_MILLIS = 60 * 60 * 1000;
     51     private static final int PROGRAM_COUNT = 24;
     52 
     53     private static Object sLock = new Object();
     54     private static Pair<View, Runnable> sLaunchCallback = null;
     55 
     56     static void expectLaunch(View postTarget, Runnable successCallback) {
     57         synchronized (sLock) {
     58             sLaunchCallback = Pair.create(postTarget, successCallback);
     59         }
     60     }
     61 
     62     @Override
     63     public void onCreate(Bundle savedInstanceState) {
     64         try {
     65             super.onCreate(savedInstanceState);
     66             final String inputId = getIntent().getStringExtra(TvInputInfo.EXTRA_INPUT_ID);
     67             final Uri uri = TvContract.buildChannelsUriForInput(inputId);
     68             final String[] projection = { TvContract.Channels._ID };
     69             try (Cursor cursor = getContentResolver().query(uri, projection, null, null, null)) {
     70                 // If we already have channels, just finish without doing anything.
     71                 if (cursor != null && cursor.getCount() > 0) {
     72                     return;
     73                 }
     74             }
     75 
     76             // Add a channel.
     77             ContentValues values = new ContentValues();
     78             values.put(TvContract.Channels.COLUMN_INPUT_ID, inputId);
     79             values.put(TvContract.Channels.COLUMN_DISPLAY_NUMBER, CHANNEL_NUMBER);
     80             values.put(TvContract.Channels.COLUMN_DISPLAY_NAME, CHANNEL_NAME);
     81             values.put(TvContract.Channels.COLUMN_APP_LINK_TEXT, APP_LINK_TEXT);
     82             values.put(TvContract.Channels.COLUMN_APP_LINK_COLOR, Color.RED);
     83             values.put(TvContract.Channels.COLUMN_APP_LINK_ICON_URI,
     84                     "android.resource://" + getPackageName() + "/" + R.drawable.icon);
     85             values.put(TvContract.Channels.COLUMN_APP_LINK_POSTER_ART_URI,
     86                     "android.resource://" + getPackageName() + "/" + R.raw.sns_texture);
     87             Intent appLinkIntentUri = new Intent(this, AppLinkTestActivity.class);
     88             appLinkIntentUri.putExtra(APP_LINK_TEST_KEY, APP_LINK_TEST_VALUE);
     89             appLinkIntentUri.setFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
     90             values.put(TvContract.Channels.COLUMN_APP_LINK_INTENT_URI,
     91                     appLinkIntentUri.toUri(Intent.URI_INTENT_SCHEME));
     92 
     93             Uri channelUri = getContentResolver().insert(uri, values);
     94             // If the channel's ID happens to be zero, we add another and delete the one.
     95             if (ContentUris.parseId(channelUri) == 0) {
     96                 getContentResolver().delete(channelUri, null, null);
     97                 channelUri = getContentResolver().insert(uri, values);
     98             }
     99 
    100             // Add Programs.
    101             values = new ContentValues();
    102             values.put(Programs.COLUMN_CHANNEL_ID, ContentUris.parseId(channelUri));
    103             values.put(Programs.COLUMN_TITLE, PROGRAM_TITLE);
    104             values.put(Programs.COLUMN_SHORT_DESCRIPTION, PROGRAM_DESCRIPTION);
    105             long nowMs = System.currentTimeMillis();
    106             long startTimeMs = nowMs - nowMs % PROGRAM_LENGTH_MILLIS;
    107             ArrayList<ContentValues> list = new ArrayList<>();
    108             for (int i = 0; i < PROGRAM_COUNT; ++i) {
    109                 values.put(Programs.COLUMN_START_TIME_UTC_MILLIS, startTimeMs);
    110                 values.put(Programs.COLUMN_END_TIME_UTC_MILLIS,
    111                         startTimeMs + PROGRAM_LENGTH_MILLIS);
    112                 startTimeMs += PROGRAM_LENGTH_MILLIS;
    113                 list.add(new ContentValues(values));
    114             }
    115             getContentResolver().bulkInsert(Programs.CONTENT_URI, list.toArray(
    116                     new ContentValues[0]));
    117         } finally {
    118             Pair<View, Runnable> launchCallback = null;
    119             synchronized (sLock) {
    120                 launchCallback = sLaunchCallback;
    121                 sLaunchCallback = null;
    122             }
    123             if (launchCallback != null) {
    124                 launchCallback.first.post(launchCallback.second);
    125             }
    126 
    127             setResult(Activity.RESULT_OK);
    128             finish();
    129         }
    130     }
    131 }
    132