Bring Setup sample apps in compliance with latest Partner Interface
Bug: 119109063
Test: manual
Change-Id: Ie3c7ec42f0272913d1c2db51b75e7057d95d742a
diff --git a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/BaseActivity.java b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/BaseActivity.java
index 65b706e..a8939d3 100644
--- a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/BaseActivity.java
+++ b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/BaseActivity.java
@@ -1,51 +1,201 @@
package com.google.android.tv.setup.customizationsample;
import android.app.Activity;
+import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
-import android.widget.Button;
+import android.view.KeyEvent;
+import android.view.View;
import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.TextView;
-import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.util.LinkedHashMap;
public abstract class BaseActivity extends Activity {
- protected ImageView iv0;
- protected Button btn0;
- protected TextView tv0;
- protected TextView tv1;
- protected TextView tv2;
- protected TextView tv3;
+ private static final String TAG = "SetupCustomization";
+
+ private ImageView iv0;
+ private TextView tv0;
+ private TextView tv1;
+ private TextView tv2;
+
+ private LinkedHashMap<Integer,Runnable> keyRunnables;
+ private LinkedHashMap<Integer,String> keyDescriptions;
@Override
public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ super.onCreate(null);
setContentView(R.layout.activity_base_layout);
- iv0 = (ImageView)findViewById(R.id.image0);
- btn0 = (Button)findViewById(R.id.btn0);
- tv0 = (TextView)findViewById(R.id.tv0);
- tv1 = (TextView)findViewById(R.id.tv1);
- tv2 = (TextView)findViewById(R.id.tv2);
- tv3 = (TextView)findViewById(R.id.tv3);
+ keyRunnables = new LinkedHashMap<>();
+ keyDescriptions = new LinkedHashMap<>();
+
+ iv0 = findViewById(R.id.image0);
+ tv0 = findViewById(R.id.tv0);
+ tv1 = findViewById(R.id.tv1);
+ tv2 = findViewById(R.id.tv2);
tv0.setText(getTitle());
- SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
- Date now = new Date();
- String strDate = sdf.format(now);
- tv1.setText(strDate);
+ populateIncomingExtrasView();
- boolean movingForward = getIntent().getBooleanExtra("movingForward", true);
- tv2.setText("movingForward: " + movingForward);
+ // tv1 left open for subclasses - see showText1()
+ // tv2 left open for subclasses - see showText2()
+ }
- tv3.setText("upgraded_during_setup=" + getIntent().getBooleanExtra("upgraded_during_setup", false) +
- ", post_provisioned_upgrade=" + getIntent().getBooleanExtra("post_provisioned_upgrade", false));
+ @Override
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ if (isFinishing()) {
+ return super.onKeyUp(keyCode, event);
+ }
+ for (int candidateKeyCode : keyRunnables.keySet()) {
+ if (candidateKeyCode == keyCode) {
+ return reactToKey(candidateKeyCode);
+ }
+ }
+ return super.onKeyUp(keyCode, event);
}
protected void log(String message) {
- Log.d(getPackageName(), message);
+ Log.d(TAG, message);
+ }
+
+ protected void registerKeyHandlerResultCancelledBack() {
+ Intent intent = new Intent().putExtra(Constants.USER_INITIATED, true);
+ registerKeyHandler(KeyEvent.KEYCODE_BACK, null, Activity.RESULT_CANCELED, intent);
+ }
+
+ protected void registerKeyHandlerResultCancelledCrashDpadLeft() {
+ registerKeyHandler(KeyEvent.KEYCODE_DPAD_LEFT, "as if a crash occurred", Activity.RESULT_CANCELED, null);
+ }
+
+ protected void registerKeyHandlerResultOk(int keyCode, String addendum, String[] booleanExtrasToSend) {
+ final Intent intent = new Intent();
+ for (String booleanExtraToSend : booleanExtrasToSend) {
+ intent.putExtra(booleanExtraToSend, true);
+ }
+ registerKeyHandlerResultOk(keyCode, addendum, intent);
+ }
+
+ protected void registerKeyHandlerResultOk(int keyCode, String addendum) {
+ final Intent intent = new Intent();
+ registerKeyHandlerResultOk(keyCode, addendum, intent);
+ }
+
+ protected void registerKeyHandlerResultOkDpadCenterBoring() {
+ final Intent intent = new Intent();
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_CENTER, "complete without doing anything interesting", intent);
+ }
+
+ protected void registerKeyHandlerResultOk(int keyCode, String addendum, final Intent intent) {
+ registerKeyHandler(keyCode, addendum, Activity.RESULT_OK, intent);
+ }
+
+ protected void showDrawable(int drawableResourceId) {
+ iv0.setVisibility(View.VISIBLE);
+ iv0.setImageResource(drawableResourceId);
+ }
+
+ protected void showText1(String text) {
+ tv1.setText(text);
+ }
+
+ protected void showText2(String text) {
+ tv2.setText(text);
+ }
+
+ private void registerKeyHandler(int keyCode, String addendum, final int resultCode, final Intent intent) {
+ StringBuilder message = new StringBuilder();
+ message.append("finish() and send " + resultCodeAsString(resultCode));
+ if (addendum != null) {
+ message.append(" - ").append(addendum);
+ }
+ if (intent != null) {
+ Bundle bundle = intent.getExtras();
+ if (bundle != null) {
+ message.append(" (");
+ for (String key : bundle.keySet()) {
+ Object value = bundle.get(key);
+ message.append(key).append('=').append(value).append(',');
+ }
+ message.append(')');
+ }
+ }
+ keyRunnables.put(keyCode, new Runnable() {
+ @Override
+ public void run() {
+ setResult(resultCode, intent);
+ finish();
+ }
+ });
+ keyDescriptions.put(keyCode, message.toString());
+ populateKeyHandlerViews();
+ }
+
+ private void populateKeyHandlerViews() {
+ LinearLayout llLeft = findViewById(R.id.ll_keyHandler1);
+ llLeft.removeAllViews();
+ LinearLayout llRight = findViewById(R.id.ll_keyHandler2);
+ llRight.removeAllViews();
+ for (Integer code : keyRunnables.keySet()) {
+ String keyStr = KeyEvent.keyCodeToString(code);
+ if (keyStr.startsWith("KEYCODE_")) {
+ keyStr = keyStr.substring("KEYCODE_".length());
+ }
+ if (keyStr.startsWith("DPAD_")) {
+ keyStr = keyStr.substring("DPAD_".length());
+ }
+ keyStr = keyStr + ":";
+ TextView tvKey = (TextView) getLayoutInflater().inflate(R.layout.key_item, llLeft, false);
+ tvKey.setText(keyStr);
+ tvKey.setTextColor(0xFF00FFFF);
+ llLeft.addView(tvKey);
+
+ TextView tvVal = (TextView) getLayoutInflater().inflate(R.layout.key_item, llRight, false);
+ tvVal.setText(keyDescriptions.get(code));
+ llRight.addView(tvVal);
+ }
+ }
+
+ private void populateIncomingExtrasView() {
+ LinearLayout llLeft = findViewById(R.id.ll_incomingExtra1);
+ llLeft.removeAllViews();
+ LinearLayout llRight = findViewById(R.id.ll_incomingExtra2);
+ llRight.removeAllViews();
+ Bundle bundle = getIntent().getExtras();
+ if (bundle != null) {
+ for (String key : bundle.keySet()) {
+ Object value = bundle.get(key);
+ TextView tvKey = (TextView) getLayoutInflater().inflate(R.layout.key_item, llLeft, false);
+ tvKey.setText(key);
+ tvKey.setTextColor(0xFF00FF00);
+ llLeft.addView(tvKey);
+ TextView tvVal = (TextView) getLayoutInflater().inflate(R.layout.key_item, llRight, false);
+ tvVal.setText(value.toString());
+ llRight.addView(tvVal);
+ }
+ }
+ }
+
+ private boolean reactToKey(int candidateKeyCode) {
+ try {
+ keyRunnables.get(candidateKeyCode).run();
+ log(keyDescriptions.get(candidateKeyCode));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return true;
+ }
+
+ private static String resultCodeAsString(int resultCode) {
+ if (resultCode == Activity.RESULT_OK) {
+ return "RESULT_OK";
+ }
+ if (resultCode == Activity.RESULT_CANCELED) {
+ return "RESULT_CANCELLED";
+ }
+ return String.valueOf(resultCode);
}
}
diff --git a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/Constants.java b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/Constants.java
new file mode 100644
index 0000000..84e652b
--- /dev/null
+++ b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/Constants.java
@@ -0,0 +1,9 @@
+package com.google.android.tv.setup.customizationsample;
+
+public class Constants {
+
+ public static final String PARTNER_HANDLED_NETWORK = "partner_handled_network";
+ public static final String PARTNER_HANDLED_NETWORK_USER_SKIPPED = "user_skipped_network_setup";
+
+ public static final String USER_INITIATED = "user_initiated";
+}
diff --git a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookActivity.java b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookActivity.java
deleted file mode 100644
index 05a387f..0000000
--- a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookActivity.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.google.android.tv.setup.customizationsample;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.View;
-
-public class HookActivity extends BaseActivity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- iv0.setVisibility(View.VISIBLE);
- iv0.setImageResource(R.drawable.hook);
-
- btn0.setVisibility(View.VISIBLE);
- btn0.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- onAboutToFinish();
- finish();
- }
- });
- }
-
- protected void onAboutToFinish() {
- setResult(Activity.RESULT_OK);
- }
-}
diff --git a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookBegin2Activity.java b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookBegin2Activity.java
index e4af2ab..9561638 100644
--- a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookBegin2Activity.java
+++ b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookBegin2Activity.java
@@ -1,39 +1,23 @@
package com.google.android.tv.setup.customizationsample;
-import android.content.Intent;
+import android.os.Bundle;
+import android.view.KeyEvent;
/**
- * A HOOK_BEGIN Activity.
+ * A HOOK_BEGIN Activity that illustrates the partner_handled_network extra.
*/
-public class HookBegin2Activity extends HookActivity {
-
- private static final String EXTRA_PARTNER_HANDLED_NETWORK = "partner_handled_network";
- private static final String EXTRA_PARTNER_HANDLED_NETWORK_USER_SKIPPED = "user_skipped_network_setup";
+public class HookBegin2Activity extends BaseActivity {
@Override
- protected void onAboutToFinish() {
- Intent intent = new Intent();
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ showDrawable(R.drawable.hook);
- // Set this to true to inform TV Setup that the partner has handled the network setup.
- // A present and true value means that TV Setup will not show the default Network step
- // (because the partner has already handled it and it would be weird for the user to see
- // the default Network step after already having gone through the partner's.
- if (getIntent().getBooleanExtra(EXTRA_PARTNER_HANDLED_NETWORK, false)) {
- // We read the extra from the incoming Intent only for testing purposes. Normally, this
- // partner Activity would have its own reasons for returning this extra back to Setup.
- intent.putExtra(EXTRA_PARTNER_HANDLED_NETWORK, true);
- }
+ registerKeyHandlerResultCancelledBack();
+ registerKeyHandlerResultCancelledCrashDpadLeft();
- // Set this to true to inform TV Setup that the partner has handled the network setup and
- // that the user chose to skip setting up a network connection.
- // A present and true value means that TV Setup will not show steps that require a network
- // connection.
- if (getIntent().getBooleanExtra(EXTRA_PARTNER_HANDLED_NETWORK_USER_SKIPPED, false)) {
- // We read the extra from the incoming Intent only for testing purposes. Normally, this
- // partner Activity would have its own reasons for returning this extra back to Setup.
- intent.putExtra(EXTRA_PARTNER_HANDLED_NETWORK_USER_SKIPPED, true);
- }
-
- setResult(RESULT_OK, intent);
+ registerKeyHandlerResultOkDpadCenterBoring();
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_RIGHT, "as if the partner handled network setup", new String[] {Constants.PARTNER_HANDLED_NETWORK});
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_UP, "as if the partner handles network setup but the user chose not to set up a network", new String[] {Constants.PARTNER_HANDLED_NETWORK,Constants.PARTNER_HANDLED_NETWORK_USER_SKIPPED});
}
}
diff --git a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookBeginActivity.java b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookBeginActivity.java
index 5e6dce0..dd64d8c 100644
--- a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookBeginActivity.java
+++ b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookBeginActivity.java
@@ -1,7 +1,19 @@
package com.google.android.tv.setup.customizationsample;
+import android.os.Bundle;
+
/**
- * A HOOK_BEGIN Activity.
+ * A HOOK_BEGIN Activity that does nothing but allow finish().
*/
-public class HookBeginActivity extends HookActivity {
+public class HookBeginActivity extends BaseActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ showDrawable(R.drawable.hook);
+
+ registerKeyHandlerResultCancelledBack();
+ registerKeyHandlerResultCancelledCrashDpadLeft();
+ registerKeyHandlerResultOkDpadCenterBoring();
+ }
}
diff --git a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookEndActivity.java b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookEndActivity.java
index 89b382d..a77b2f9 100644
--- a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookEndActivity.java
+++ b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookEndActivity.java
@@ -1,7 +1,20 @@
package com.google.android.tv.setup.customizationsample;
+import android.os.Bundle;
+
/**
- * A HOOK_END Activity.
+ * A HOOK_END Activity that does nothing but allow finish().
*/
-public class HookEndActivity extends HookActivity {
+public class HookEndActivity extends BaseActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ showDrawable(R.drawable.hook);
+
+ registerKeyHandlerResultCancelledBack();
+ registerKeyHandlerResultCancelledCrashDpadLeft();
+ registerKeyHandlerResultOkDpadCenterBoring();
+ }
}
diff --git a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostNetworkActivity.java b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostNetworkActivity.java
index b6394ac..3394cfd 100644
--- a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostNetworkActivity.java
+++ b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostNetworkActivity.java
@@ -2,16 +2,13 @@
import android.content.Intent;
import android.os.Bundle;
-import android.os.Handler;
+import android.view.KeyEvent;
/**
- * A HOOK_POST_NETWORK Activity, which simulates checking for a system upgrade.
+ * A HOOK_POST_NETWORK Activity which simulates checking for a system upgrade.
*/
public class HookPostNetworkActivity extends BaseActivity {
- int mSecondsRemaining;
- Runnable mRunnable;
-
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -20,31 +17,12 @@
// We do not make visible any UI elements; instead we allow Android TV Setup's "Please wait"
// step to show under us while we figure out if an upgrade is available. That way there are
// fewer transitions which is especially useful in case we have nothing important to do.
- mRunnable = new Runnable() {
- @Override
- public void run() {
- mSecondsRemaining--;
- if (mSecondsRemaining >= 0) {
- tv3.setText(mSecondsRemaining + " seconds remaining");
- new Handler().postDelayed(mRunnable, 1000);
- } else {
- // This skip_stage_2 stuff is just for testing - so that we can exercise the
- // case where no follow-up Activity is needed.
- if (getIntent().getBooleanExtra("skip_follow_up", false)) {
- log("hook post-network: return no follow-up Activity Intent");
- setResult(RESULT_OK);
- finish();
- } else {
- log("hook post-network: return follow-up Activity Intent");
- Intent intent = new Intent(getApplicationContext(), HookPostNetworkFollowupActivity.class);
- setResult(RESULT_OK, intent);
- finish();
- }
- }
- }
- };
- mSecondsRemaining = 3;
- mRunnable.run();
+
+ registerKeyHandlerResultCancelledBack();
+ registerKeyHandlerResultCancelledCrashDpadLeft();
+
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_CENTER, "with no follow-up Activity");
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_RIGHT, "with a follow-up Activity", new Intent(getApplicationContext(), HookPostNetworkFollowupActivity.class));
}
}
diff --git a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostNetworkFollowupActivity.java b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostNetworkFollowupActivity.java
index e3d36e8..ee1dc9b 100644
--- a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostNetworkFollowupActivity.java
+++ b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostNetworkFollowupActivity.java
@@ -1,52 +1,24 @@
package com.google.android.tv.setup.customizationsample;
-import android.content.Context;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.PowerManager;
-import android.view.View;
+import android.view.KeyEvent;
/**
* A HOOK_POST_NETWORK follow-up Activity, which simulates performing a system upgrade.
*/
public class HookPostNetworkFollowupActivity extends BaseActivity {
- int mSecondsRemaining;
- Runnable mRunnable;
-
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- // Here we pretend to perform a system upgrade.
- iv0.setVisibility(View.VISIBLE);
- iv0.setImageResource(R.drawable.download);
- mRunnable = new Runnable() {
- @Override
- public void run() {
- mSecondsRemaining--;
- if (mSecondsRemaining >= 0) {
- tv3.setText(mSecondsRemaining + " seconds remaining");
- new Handler().postDelayed(mRunnable, 1000);
- } else {
- conclude();
- }
- }
- };
- mSecondsRemaining = 3;
- mRunnable.run();
- }
+ showDrawable(R.drawable.download);
- protected void conclude() {
- if (getIntent().getBooleanExtra("reboot", false)) {
- log("simulate perform upgrade: simulate upgrade by invoking reboot now");
- PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
- pm.reboot(null);
- } else {
- log("simulate perform upgrade: simulate upgrade halted/failed; return to Setup");
- setResult(RESULT_OK);
- finish();
- }
+ registerKeyHandlerResultCancelledBack();
+ registerKeyHandlerResultCancelledCrashDpadLeft();
+
+ registerKeyHandlerResultOkDpadCenterBoring();
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_RIGHT, "simulate an upgrade by doing a reboot (this is a very weak simulation of an upgrade)");
}
}
diff --git a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/NetworkDelegationActivity.java b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/NetworkDelegationActivity.java
index a90c58c..0b0c0cd 100644
--- a/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/NetworkDelegationActivity.java
+++ b/apps/tv/SetupCustomizationSample/app/src/main/java/com/google/android/tv/setup/customizationsample/NetworkDelegationActivity.java
@@ -1,7 +1,5 @@
package com.google.android.tv.setup.customizationsample;
-import android.app.Activity;
-import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
@@ -10,36 +8,16 @@
*/
public class NetworkDelegationActivity extends BaseActivity {
- public static final int RESULT_CODE_USER_SKIPPED = 3;
- boolean mHeardKey;
-
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- tv1.setText("Press CENTER to pretend we just set up the network; press RIGHT to skip; press BACK to back out");
- }
+ showDrawable(R.drawable.home_internet);
- @Override
- public boolean onKeyUp(int keyCode, KeyEvent event) {
- if (!mHeardKey && keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
- mHeardKey = true;
- setResult(Activity.RESULT_OK);
- finish();
- return true;
- }
- if (!mHeardKey && keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
- mHeardKey = true;
- setResult(RESULT_CODE_USER_SKIPPED);
- finish();
- return true;
- }
- return super.onKeyUp(keyCode, event);
- }
+ registerKeyHandlerResultCancelledBack();
+ registerKeyHandlerResultCancelledCrashDpadLeft();
- @Override
- public void onBackPressed() {
- setResult(Activity.RESULT_CANCELED, new Intent().putExtra("user_initiated", true));
- finish();
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_CENTER, "as if the user set up a network");
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_RIGHT, "as if the user chose to not set up a network", new String[] {Constants.PARTNER_HANDLED_NETWORK_USER_SKIPPED});
}
}
diff --git a/apps/tv/SetupCustomizationSample/app/src/main/res/drawable-xhdpi/home_internet.png b/apps/tv/SetupCustomizationSample/app/src/main/res/drawable-xhdpi/home_internet.png
new file mode 100644
index 0000000..99d86e4
--- /dev/null
+++ b/apps/tv/SetupCustomizationSample/app/src/main/res/drawable-xhdpi/home_internet.png
Binary files differ
diff --git a/apps/tv/SetupCustomizationSample/app/src/main/res/layout/activity_base_layout.xml b/apps/tv/SetupCustomizationSample/app/src/main/res/layout/activity_base_layout.xml
index da44ab4..a66d2a7 100644
--- a/apps/tv/SetupCustomizationSample/app/src/main/res/layout/activity_base_layout.xml
+++ b/apps/tv/SetupCustomizationSample/app/src/main/res/layout/activity_base_layout.xml
@@ -20,61 +20,97 @@
android:layout_gravity="left|bottom"
>
- <Button
- android:id="@+id/btn0"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Next"
- android:visibility="gone"
+ <TextView
+ android:id="@+id/tv2"
+ style="@style/MyTextViewStyle"
android:layout_marginTop="20dp"
android:layout_marginLeft="20dp"
+ tools:text="some more test text"
/>
<TextView
- android:id="@+id/tv0"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:layout_marginTop="20dp"
- android:layout_marginLeft="20dp"
- tools:text="foobar"
- android:textColor="@android:color/white"
- android:textSize="24sp" />
-
- <TextView
android:id="@+id/tv1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
+ style="@style/MyTextViewStyle"
android:layout_marginTop="20dp"
android:layout_marginLeft="20dp"
- tools:text="foobar"
- android:textColor="@android:color/white"
- android:textSize="12sp" />
+ tools:text="some more test text"
+ />
+ <!-- Key Handlers -->
<TextView
- android:id="@+id/tv2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
+ style="@style/MyTextViewStyle"
android:layout_marginTop="20dp"
android:layout_marginLeft="20dp"
- tools:text="foobar"
- android:textColor="@android:color/white"
- android:textSize="12sp" />
-
- <TextView
- android:id="@+id/tv3"
+ android:text="Key Handlers"
+ />
+ <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="left|bottom"
- android:gravity="center"
+ android:layout_marginLeft="30dp"
+ >
+
+ <LinearLayout
+ android:id="@+id/ll_keyHandler1"
+ android:orientation="vertical"
+ android:gravity="right"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ >
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/ll_keyHandler2"
+ android:orientation="vertical"
+ android:layout_gravity="left"
+ android:gravity="left"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="6dp"
+ >
+ </LinearLayout>
+
+ </LinearLayout>
+
+ <!-- Incoming Extras -->
+ <TextView
+ style="@style/MyTextViewStyle"
+ android:layout_marginTop="20dp"
+ android:layout_marginLeft="20dp"
+ android:text="Incoming Extras"
+ />
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="30dp"
+ >
+ <LinearLayout
+ android:id="@+id/ll_incomingExtra1"
+ android:orientation="vertical"
+ android:gravity="right"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ >
+ </LinearLayout>
+ <LinearLayout
+ android:id="@+id/ll_incomingExtra2"
+ android:orientation="vertical"
+ android:layout_gravity="left"
+ android:gravity="left"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="6dp"
+ >
+ </LinearLayout>
+ </LinearLayout>
+
+ <TextView
+ android:id="@+id/tv0"
+ style="@style/MyTextViewStyleLarge"
android:layout_marginTop="20dp"
android:layout_marginLeft="20dp"
android:layout_marginBottom="20dp"
- tools:text="foobar"
- android:textColor="@android:color/white"
- android:textSize="12sp" />
+ tools:text="Some test title text"
+ />
</LinearLayout>
diff --git a/apps/tv/SetupCustomizationSample/app/src/main/res/layout/key_item.xml b/apps/tv/SetupCustomizationSample/app/src/main/res/layout/key_item.xml
new file mode 100644
index 0000000..d694372
--- /dev/null
+++ b/apps/tv/SetupCustomizationSample/app/src/main/res/layout/key_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/tv"
+ style="@style/MyTextViewStyleSmall"
+ />
diff --git a/apps/tv/SetupCustomizationSample/app/src/main/res/values/styles.xml b/apps/tv/SetupCustomizationSample/app/src/main/res/values/styles.xml
index 178c902..4b19c7b 100644
--- a/apps/tv/SetupCustomizationSample/app/src/main/res/values/styles.xml
+++ b/apps/tv/SetupCustomizationSample/app/src/main/res/values/styles.xml
@@ -11,4 +11,20 @@
<item name="android:windowBackground">@android:color/holo_blue_light</item>
</style>
+ <style name="MyTextViewStyle">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:gravity">left</item>
+ <item name="android:textColor">@android:color/white</item>
+ <item name="android:textSize">12sp</item>
+ </style>
+
+ <style name="MyTextViewStyleSmall" parent="@style/MyTextViewStyle">
+ <item name="android:textSize">10sp</item>
+ </style>
+
+ <style name="MyTextViewStyleLarge" parent="@style/MyTextViewStyle">
+ <item name="android:textSize">24sp</item>
+ </style>
+
</resources>
diff --git a/apps/tv/SetupValidation/app/build.gradle b/apps/tv/SetupValidation/app/build.gradle
index 05f841e..f4df956 100644
--- a/apps/tv/SetupValidation/app/build.gradle
+++ b/apps/tv/SetupValidation/app/build.gradle
@@ -3,7 +3,7 @@
android {
compileSdkVersion 26
defaultConfig {
- applicationId "com.google.android.tv.setup.validation"
+ applicationId "com.google.android.tv.setup.customizationsample"
minSdkVersion 21
targetSdkVersion 26
versionCode 1
diff --git a/apps/tv/SetupValidation/app/src/main/AndroidManifest.xml b/apps/tv/SetupValidation/app/src/main/AndroidManifest.xml
index 83feeaa..43424fe 100644
--- a/apps/tv/SetupValidation/app/src/main/AndroidManifest.xml
+++ b/apps/tv/SetupValidation/app/src/main/AndroidManifest.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.google.android.tv.setup.validation">
+ package="com.google.android.tv.setup.customizationsample">
<uses-feature
android:name="android.hardware.touchscreen"
@@ -9,12 +9,106 @@
android:name="android.software.leanback"
android:required="true" />
+ <uses-permission android:name="com.android.setupwizard.permission.SETUP" />
+ <uses-permission android:name="android.permission.REBOOT" />
+
<application
- android:label="TV Setup Validation"
+ android:label="TV Setup Customization Sample"
android:theme="@style/AppTheme">
- <!-- A simple opaque Activity with a button that finishes it. -->
+ <!-- This Receiver marks this app as being eligible to provide resources which influence
+ the behavior and look of TV Setup. -->
+ <receiver android:name=".PartnerReceiver">
+ <intent-filter>
+ <action android:name="com.google.android.tvsetup.action.PARTNER_CUSTOMIZATION" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </receiver>
+
+
+ <!-- HOOK Activity examples -->
+
+ <activity
+ android:name=".HookBeginActivity"
+ android:label="Partner Hook: Begin (Priority 5)"
+ android:screenOrientation="landscape">
+ <intent-filter android:priority="5">
+ <action android:name="com.android.setupwizard.action.HOOK_BEGIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+
+ <activity
+ android:name=".HookBegin2Activity"
+ android:label="Partner Hook: Begin (Priority 4)"
+ android:screenOrientation="landscape">
+ <intent-filter android:priority="4">
+ <action android:name="com.android.setupwizard.action.HOOK_BEGIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+
+ <activity
+ android:name=".HookPostNetworkActivity"
+ android:screenOrientation="landscape"
+ android:label="Partner Hook: Post-Network"
+ >
+ <intent-filter>
+ <action android:name="com.android.setupwizard.action.HOOK_POST_NETWORK" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+
+ <activity
+ android:name=".HookPostNetworkFollowupActivity"
+ android:screenOrientation="landscape"
+ android:label="Partner Hook: Post-Network Follow-up"
+ android:exported="true"
+ >
+ </activity>
+
+
+ <activity
+ android:name=".HookEndActivity"
+ android:screenOrientation="landscape"
+ android:label="Partner Hook: End"
+ >
+ <intent-filter>
+ <action android:name="com.android.setupwizard.action.HOOK_END" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+
+ <!-- Implements the delegate-network-to-partner action. -->
+ <activity
+ android:name=".NetworkDelegationActivity"
+ android:screenOrientation="landscape"
+ android:label="Network Delegation"
+ >
+ <intent-filter>
+ <action android:name="com.android.net.GET_CONNECTED" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+
+ <activity
+ android:name=".HookPostWelcomeActivity"
+ android:label="Partner Hook: Post-Welcome"
+ android:screenOrientation="landscape">
+ <intent-filter android:priority="4">
+ <action android:name="com.android.setupwizard.action.HOOK_POST_WELCOME" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+
+ <!-- A simple opaque Activity -->
<activity
android:name=".OpaqueActivity"
android:screenOrientation="landscape"
@@ -24,7 +118,8 @@
>
</activity>
- <!-- A simple transparent Activity with a button that finishes it. -->
+
+ <!-- A simple transparent Activity -->
<activity
android:name=".TransparentActivity"
android:screenOrientation="landscape"
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/BaseActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/BaseActivity.java
deleted file mode 100644
index f1e95df..0000000
--- a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/BaseActivity.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.google.android.tv.setup;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
-import android.widget.Button;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.google.android.tv.setup.validation.R;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-public abstract class BaseActivity extends Activity {
-
- protected ImageView iv0;
- protected Button btn0;
- protected TextView tv0;
- protected TextView tv1;
- protected TextView tv2;
- protected TextView tv3;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_base_layout);
-
- iv0 = (ImageView)findViewById(R.id.image0);
- btn0 = (Button)findViewById(R.id.btn0);
- tv0 = (TextView)findViewById(R.id.tv0);
- tv1 = (TextView)findViewById(R.id.tv1);
- tv2 = (TextView)findViewById(R.id.tv2);
- tv3 = (TextView)findViewById(R.id.tv3);
-
- tv0.setText(getTitle());
-
- SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
- Date now = new Date();
- String strDate = sdf.format(now);
- tv1.setText(strDate);
-
- boolean movingForward = getIntent().getBooleanExtra("movingForward", true);
- tv2.setText("movingForward: " + movingForward);
- }
-
- protected void log(String message) {
- Log.d(getPackageName(), message);
- }
-
- @Override
- public void onBackPressed() {
- setResult(RESULT_CANCELED, new Intent().putExtra("user_initiated", true));
- super.onBackPressed();
- }
-}
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/BaseActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/BaseActivity.java
new file mode 100644
index 0000000..a8939d3
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/BaseActivity.java
@@ -0,0 +1,201 @@
+package com.google.android.tv.setup.customizationsample;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import java.util.LinkedHashMap;
+
+public abstract class BaseActivity extends Activity {
+
+ private static final String TAG = "SetupCustomization";
+
+ private ImageView iv0;
+ private TextView tv0;
+ private TextView tv1;
+ private TextView tv2;
+
+ private LinkedHashMap<Integer,Runnable> keyRunnables;
+ private LinkedHashMap<Integer,String> keyDescriptions;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(null);
+ setContentView(R.layout.activity_base_layout);
+
+ keyRunnables = new LinkedHashMap<>();
+ keyDescriptions = new LinkedHashMap<>();
+
+ iv0 = findViewById(R.id.image0);
+ tv0 = findViewById(R.id.tv0);
+ tv1 = findViewById(R.id.tv1);
+ tv2 = findViewById(R.id.tv2);
+
+ tv0.setText(getTitle());
+
+ populateIncomingExtrasView();
+
+ // tv1 left open for subclasses - see showText1()
+ // tv2 left open for subclasses - see showText2()
+ }
+
+ @Override
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ if (isFinishing()) {
+ return super.onKeyUp(keyCode, event);
+ }
+ for (int candidateKeyCode : keyRunnables.keySet()) {
+ if (candidateKeyCode == keyCode) {
+ return reactToKey(candidateKeyCode);
+ }
+ }
+ return super.onKeyUp(keyCode, event);
+ }
+
+ protected void log(String message) {
+ Log.d(TAG, message);
+ }
+
+ protected void registerKeyHandlerResultCancelledBack() {
+ Intent intent = new Intent().putExtra(Constants.USER_INITIATED, true);
+ registerKeyHandler(KeyEvent.KEYCODE_BACK, null, Activity.RESULT_CANCELED, intent);
+ }
+
+ protected void registerKeyHandlerResultCancelledCrashDpadLeft() {
+ registerKeyHandler(KeyEvent.KEYCODE_DPAD_LEFT, "as if a crash occurred", Activity.RESULT_CANCELED, null);
+ }
+
+ protected void registerKeyHandlerResultOk(int keyCode, String addendum, String[] booleanExtrasToSend) {
+ final Intent intent = new Intent();
+ for (String booleanExtraToSend : booleanExtrasToSend) {
+ intent.putExtra(booleanExtraToSend, true);
+ }
+ registerKeyHandlerResultOk(keyCode, addendum, intent);
+ }
+
+ protected void registerKeyHandlerResultOk(int keyCode, String addendum) {
+ final Intent intent = new Intent();
+ registerKeyHandlerResultOk(keyCode, addendum, intent);
+ }
+
+ protected void registerKeyHandlerResultOkDpadCenterBoring() {
+ final Intent intent = new Intent();
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_CENTER, "complete without doing anything interesting", intent);
+ }
+
+ protected void registerKeyHandlerResultOk(int keyCode, String addendum, final Intent intent) {
+ registerKeyHandler(keyCode, addendum, Activity.RESULT_OK, intent);
+ }
+
+ protected void showDrawable(int drawableResourceId) {
+ iv0.setVisibility(View.VISIBLE);
+ iv0.setImageResource(drawableResourceId);
+ }
+
+ protected void showText1(String text) {
+ tv1.setText(text);
+ }
+
+ protected void showText2(String text) {
+ tv2.setText(text);
+ }
+
+ private void registerKeyHandler(int keyCode, String addendum, final int resultCode, final Intent intent) {
+ StringBuilder message = new StringBuilder();
+ message.append("finish() and send " + resultCodeAsString(resultCode));
+ if (addendum != null) {
+ message.append(" - ").append(addendum);
+ }
+ if (intent != null) {
+ Bundle bundle = intent.getExtras();
+ if (bundle != null) {
+ message.append(" (");
+ for (String key : bundle.keySet()) {
+ Object value = bundle.get(key);
+ message.append(key).append('=').append(value).append(',');
+ }
+ message.append(')');
+ }
+ }
+ keyRunnables.put(keyCode, new Runnable() {
+ @Override
+ public void run() {
+ setResult(resultCode, intent);
+ finish();
+ }
+ });
+ keyDescriptions.put(keyCode, message.toString());
+ populateKeyHandlerViews();
+ }
+
+ private void populateKeyHandlerViews() {
+ LinearLayout llLeft = findViewById(R.id.ll_keyHandler1);
+ llLeft.removeAllViews();
+ LinearLayout llRight = findViewById(R.id.ll_keyHandler2);
+ llRight.removeAllViews();
+ for (Integer code : keyRunnables.keySet()) {
+ String keyStr = KeyEvent.keyCodeToString(code);
+ if (keyStr.startsWith("KEYCODE_")) {
+ keyStr = keyStr.substring("KEYCODE_".length());
+ }
+ if (keyStr.startsWith("DPAD_")) {
+ keyStr = keyStr.substring("DPAD_".length());
+ }
+ keyStr = keyStr + ":";
+ TextView tvKey = (TextView) getLayoutInflater().inflate(R.layout.key_item, llLeft, false);
+ tvKey.setText(keyStr);
+ tvKey.setTextColor(0xFF00FFFF);
+ llLeft.addView(tvKey);
+
+ TextView tvVal = (TextView) getLayoutInflater().inflate(R.layout.key_item, llRight, false);
+ tvVal.setText(keyDescriptions.get(code));
+ llRight.addView(tvVal);
+ }
+ }
+
+ private void populateIncomingExtrasView() {
+ LinearLayout llLeft = findViewById(R.id.ll_incomingExtra1);
+ llLeft.removeAllViews();
+ LinearLayout llRight = findViewById(R.id.ll_incomingExtra2);
+ llRight.removeAllViews();
+ Bundle bundle = getIntent().getExtras();
+ if (bundle != null) {
+ for (String key : bundle.keySet()) {
+ Object value = bundle.get(key);
+ TextView tvKey = (TextView) getLayoutInflater().inflate(R.layout.key_item, llLeft, false);
+ tvKey.setText(key);
+ tvKey.setTextColor(0xFF00FF00);
+ llLeft.addView(tvKey);
+ TextView tvVal = (TextView) getLayoutInflater().inflate(R.layout.key_item, llRight, false);
+ tvVal.setText(value.toString());
+ llRight.addView(tvVal);
+ }
+ }
+ }
+
+ private boolean reactToKey(int candidateKeyCode) {
+ try {
+ keyRunnables.get(candidateKeyCode).run();
+ log(keyDescriptions.get(candidateKeyCode));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return true;
+ }
+
+ private static String resultCodeAsString(int resultCode) {
+ if (resultCode == Activity.RESULT_OK) {
+ return "RESULT_OK";
+ }
+ if (resultCode == Activity.RESULT_CANCELED) {
+ return "RESULT_CANCELLED";
+ }
+ return String.valueOf(resultCode);
+ }
+}
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/Constants.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/Constants.java
new file mode 100644
index 0000000..84e652b
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/Constants.java
@@ -0,0 +1,9 @@
+package com.google.android.tv.setup.customizationsample;
+
+public class Constants {
+
+ public static final String PARTNER_HANDLED_NETWORK = "partner_handled_network";
+ public static final String PARTNER_HANDLED_NETWORK_USER_SKIPPED = "user_skipped_network_setup";
+
+ public static final String USER_INITIATED = "user_initiated";
+}
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookBegin2Activity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookBegin2Activity.java
new file mode 100644
index 0000000..9561638
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookBegin2Activity.java
@@ -0,0 +1,23 @@
+package com.google.android.tv.setup.customizationsample;
+
+import android.os.Bundle;
+import android.view.KeyEvent;
+
+/**
+ * A HOOK_BEGIN Activity that illustrates the partner_handled_network extra.
+ */
+public class HookBegin2Activity extends BaseActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ showDrawable(R.drawable.hook);
+
+ registerKeyHandlerResultCancelledBack();
+ registerKeyHandlerResultCancelledCrashDpadLeft();
+
+ registerKeyHandlerResultOkDpadCenterBoring();
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_RIGHT, "as if the partner handled network setup", new String[] {Constants.PARTNER_HANDLED_NETWORK});
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_UP, "as if the partner handles network setup but the user chose not to set up a network", new String[] {Constants.PARTNER_HANDLED_NETWORK,Constants.PARTNER_HANDLED_NETWORK_USER_SKIPPED});
+ }
+}
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookBeginActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookBeginActivity.java
new file mode 100644
index 0000000..dd64d8c
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookBeginActivity.java
@@ -0,0 +1,19 @@
+package com.google.android.tv.setup.customizationsample;
+
+import android.os.Bundle;
+
+/**
+ * A HOOK_BEGIN Activity that does nothing but allow finish().
+ */
+public class HookBeginActivity extends BaseActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ showDrawable(R.drawable.hook);
+
+ registerKeyHandlerResultCancelledBack();
+ registerKeyHandlerResultCancelledCrashDpadLeft();
+ registerKeyHandlerResultOkDpadCenterBoring();
+ }
+}
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookEndActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookEndActivity.java
new file mode 100644
index 0000000..a77b2f9
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookEndActivity.java
@@ -0,0 +1,20 @@
+package com.google.android.tv.setup.customizationsample;
+
+import android.os.Bundle;
+
+/**
+ * A HOOK_END Activity that does nothing but allow finish().
+ */
+public class HookEndActivity extends BaseActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ showDrawable(R.drawable.hook);
+
+ registerKeyHandlerResultCancelledBack();
+ registerKeyHandlerResultCancelledCrashDpadLeft();
+ registerKeyHandlerResultOkDpadCenterBoring();
+ }
+}
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostNetworkActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostNetworkActivity.java
new file mode 100644
index 0000000..3394cfd
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostNetworkActivity.java
@@ -0,0 +1,29 @@
+package com.google.android.tv.setup.customizationsample;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.KeyEvent;
+
+/**
+ * A HOOK_POST_NETWORK Activity which simulates checking for a system upgrade.
+ */
+public class HookPostNetworkActivity extends BaseActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Here we pretend that we are checking if an upgrade is available.
+ // We do not make visible any UI elements; instead we allow Android TV Setup's "Please wait"
+ // step to show under us while we figure out if an upgrade is available. That way there are
+ // fewer transitions which is especially useful in case we have nothing important to do.
+
+ registerKeyHandlerResultCancelledBack();
+ registerKeyHandlerResultCancelledCrashDpadLeft();
+
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_CENTER, "with no follow-up Activity");
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_RIGHT, "with a follow-up Activity", new Intent(getApplicationContext(), HookPostNetworkFollowupActivity.class));
+ }
+}
+
+
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostNetworkFollowupActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostNetworkFollowupActivity.java
new file mode 100644
index 0000000..ee1dc9b
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostNetworkFollowupActivity.java
@@ -0,0 +1,25 @@
+package com.google.android.tv.setup.customizationsample;
+
+import android.os.Bundle;
+import android.view.KeyEvent;
+
+/**
+ * A HOOK_POST_NETWORK follow-up Activity, which simulates performing a system upgrade.
+ */
+public class HookPostNetworkFollowupActivity extends BaseActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ showDrawable(R.drawable.download);
+
+ registerKeyHandlerResultCancelledBack();
+ registerKeyHandlerResultCancelledCrashDpadLeft();
+
+ registerKeyHandlerResultOkDpadCenterBoring();
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_RIGHT, "simulate an upgrade by doing a reboot (this is a very weak simulation of an upgrade)");
+ }
+}
+
+
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostWelcomeActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostWelcomeActivity.java
new file mode 100644
index 0000000..718363e
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/HookPostWelcomeActivity.java
@@ -0,0 +1,23 @@
+package com.google.android.tv.setup.customizationsample;
+
+import android.os.Bundle;
+import android.view.KeyEvent;
+
+/**
+ * A HOOK_POST_WELCOME Activity.
+ */
+public class HookPostWelcomeActivity extends BaseActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ showDrawable(R.drawable.hook);
+
+ registerKeyHandlerResultCancelledBack();
+ registerKeyHandlerResultCancelledCrashDpadLeft();
+
+ registerKeyHandlerResultOkDpadCenterBoring();
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_RIGHT, "as if the partner handled network setup", new String[] {Constants.PARTNER_HANDLED_NETWORK});
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_UP, "as if the partner handles network setup but the user chose not to set up a network", new String[] {Constants.PARTNER_HANDLED_NETWORK,Constants.PARTNER_HANDLED_NETWORK_USER_SKIPPED});
+ }
+}
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/MockHotwordEnrollmentActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/MockHotwordEnrollmentActivity.java
new file mode 100644
index 0000000..58a33fd
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/MockHotwordEnrollmentActivity.java
@@ -0,0 +1,15 @@
+package com.google.android.tv.setup.customizationsample;
+
+import android.os.Bundle;
+
+public class MockHotwordEnrollmentActivity extends BaseActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ showDrawable(R.drawable.hotword_enrollment);
+
+ registerKeyHandlerResultOkDpadCenterBoring();
+ }
+}
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/MockKatnissActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/MockKatnissActivity.java
new file mode 100644
index 0000000..ffb86e6
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/MockKatnissActivity.java
@@ -0,0 +1,15 @@
+package com.google.android.tv.setup.customizationsample;
+
+import android.os.Bundle;
+
+public class MockKatnissActivity extends BaseActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ showDrawable(R.drawable.mock_katniss);
+
+ registerKeyHandlerResultOkDpadCenterBoring();
+ }
+}
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/NetworkDelegationActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/NetworkDelegationActivity.java
new file mode 100644
index 0000000..0b0c0cd
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/NetworkDelegationActivity.java
@@ -0,0 +1,24 @@
+package com.google.android.tv.setup.customizationsample;
+
+import android.os.Bundle;
+import android.view.KeyEvent;
+
+/**
+ * A network delegation Activity, which simulates presenting a get-me-connected user interface.
+ */
+public class NetworkDelegationActivity extends BaseActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ showDrawable(R.drawable.home_internet);
+
+ registerKeyHandlerResultCancelledBack();
+ registerKeyHandlerResultCancelledCrashDpadLeft();
+
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_CENTER, "as if the user set up a network");
+ registerKeyHandlerResultOk(KeyEvent.KEYCODE_DPAD_RIGHT, "as if the user chose to not set up a network", new String[] {Constants.PARTNER_HANDLED_NETWORK_USER_SKIPPED});
+ }
+}
+
+
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/OpaqueActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/OpaqueActivity.java
new file mode 100644
index 0000000..34385da
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/OpaqueActivity.java
@@ -0,0 +1,15 @@
+package com.google.android.tv.setup.customizationsample;
+
+import android.os.Bundle;
+
+public class OpaqueActivity extends BaseActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ showDrawable(R.drawable.opaque_tile);
+
+ registerKeyHandlerResultOkDpadCenterBoring();
+ }
+}
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/PartnerReceiver.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/PartnerReceiver.java
new file mode 100644
index 0000000..340d270
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/PartnerReceiver.java
@@ -0,0 +1,17 @@
+package com.google.android.tv.setup.customizationsample;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+/**
+ * This no-op BroadcastReceiver marks this application as a provider of partner resources for
+ * Android TV Setup. See AndroidManifest.xml for more details.
+ */
+public class PartnerReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // Do nothing.
+ }
+}
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/TransparentActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/TransparentActivity.java
new file mode 100644
index 0000000..c06a66f
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/customizationsample/TransparentActivity.java
@@ -0,0 +1,15 @@
+package com.google.android.tv.setup.customizationsample;
+
+import android.os.Bundle;
+
+public class TransparentActivity extends BaseActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ showDrawable(R.drawable.opaque_tile);
+
+ registerKeyHandlerResultOkDpadCenterBoring();
+ }
+}
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/validation/MockHotwordEnrollmentActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/validation/MockHotwordEnrollmentActivity.java
deleted file mode 100644
index c05624d..0000000
--- a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/validation/MockHotwordEnrollmentActivity.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.google.android.tv.setup.validation;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.View;
-
-import com.google.android.tv.setup.BaseActivity;
-
-public class MockHotwordEnrollmentActivity extends BaseActivity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- iv0.setVisibility(View.VISIBLE);
- iv0.setImageResource(R.drawable.hotword_enrollment);
-
- btn0.setVisibility(View.VISIBLE);
- btn0.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- setResult(Activity.RESULT_OK);
- finish();
- }
- });
- }
-}
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/validation/MockKatnissActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/validation/MockKatnissActivity.java
deleted file mode 100644
index 9ff134d..0000000
--- a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/validation/MockKatnissActivity.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.google.android.tv.setup.validation;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.View;
-
-import com.google.android.tv.setup.BaseActivity;
-
-public class MockKatnissActivity extends BaseActivity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- iv0.setVisibility(View.VISIBLE);
- iv0.setImageResource(R.drawable.mock_katniss);
-
- btn0.setVisibility(View.VISIBLE);
- btn0.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- onAboutToFinish();
- finish();
- }
- });
- }
-
- protected void onAboutToFinish() {
- setResult(Activity.RESULT_OK);
- }
-}
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/validation/OpaqueActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/validation/OpaqueActivity.java
deleted file mode 100644
index 2ebf60d..0000000
--- a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/validation/OpaqueActivity.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.google.android.tv.setup.validation;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.View;
-
-import com.google.android.tv.setup.BaseActivity;
-
-public class OpaqueActivity extends BaseActivity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- iv0.setVisibility(View.VISIBLE);
- iv0.setImageResource(R.drawable.opaque_tile);
-
- btn0.setVisibility(View.VISIBLE);
- btn0.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- setResult(Activity.RESULT_OK);
- finish();
- }
- });
- }
-}
diff --git a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/validation/TransparentActivity.java b/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/validation/TransparentActivity.java
deleted file mode 100644
index 7b379ab..0000000
--- a/apps/tv/SetupValidation/app/src/main/java/com/google/android/tv/setup/validation/TransparentActivity.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.google.android.tv.setup.validation;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.View;
-
-import com.google.android.tv.setup.BaseActivity;
-
-public class TransparentActivity extends BaseActivity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- iv0.setVisibility(View.VISIBLE);
- iv0.setImageResource(R.drawable.opaque_tile);
-
- btn0.setVisibility(View.VISIBLE);
- btn0.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- setResult(Activity.RESULT_OK);
- finish();
- }
- });
- }
-}
diff --git a/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/download.png b/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/download.png
new file mode 100644
index 0000000..ab2a1ea
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/download.png
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/home_internet.png b/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/home_internet.png
new file mode 100644
index 0000000..99d86e4
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/home_internet.png
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/hook.png b/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/hook.png
new file mode 100644
index 0000000..f7c7add
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/hook.png
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/hotword_graphic.png b/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/hotword_graphic.png
new file mode 100644
index 0000000..6e1513b
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/hotword_graphic.png
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/tutorial_image_0.png b/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/tutorial_image_0.png
new file mode 100644
index 0000000..a522985
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/tutorial_image_0.png
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/tutorial_image_1.png b/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/tutorial_image_1.png
new file mode 100644
index 0000000..19c0c75
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/tutorial_image_1.png
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/welcome_background.png b/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/welcome_background.png
new file mode 100644
index 0000000..7dd9c92
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/drawable-xhdpi/welcome_background.png
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/drawable-zh-xhdpi/hotword_graphic.png b/apps/tv/SetupValidation/app/src/main/res/drawable-zh-xhdpi/hotword_graphic.png
new file mode 100644
index 0000000..a12e02b
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/drawable-zh-xhdpi/hotword_graphic.png
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/drawable-zh-xhdpi/tutorial_image_0.png b/apps/tv/SetupValidation/app/src/main/res/drawable-zh-xhdpi/tutorial_image_0.png
new file mode 100644
index 0000000..912c702
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/drawable-zh-xhdpi/tutorial_image_0.png
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/drawable-zh-xhdpi/tutorial_image_1.png b/apps/tv/SetupValidation/app/src/main/res/drawable-zh-xhdpi/tutorial_image_1.png
new file mode 100644
index 0000000..1a3685f
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/drawable-zh-xhdpi/tutorial_image_1.png
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/layout/activity_base_layout.xml b/apps/tv/SetupValidation/app/src/main/res/layout/activity_base_layout.xml
index da44ab4..a66d2a7 100644
--- a/apps/tv/SetupValidation/app/src/main/res/layout/activity_base_layout.xml
+++ b/apps/tv/SetupValidation/app/src/main/res/layout/activity_base_layout.xml
@@ -20,61 +20,97 @@
android:layout_gravity="left|bottom"
>
- <Button
- android:id="@+id/btn0"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Next"
- android:visibility="gone"
+ <TextView
+ android:id="@+id/tv2"
+ style="@style/MyTextViewStyle"
android:layout_marginTop="20dp"
android:layout_marginLeft="20dp"
+ tools:text="some more test text"
/>
<TextView
- android:id="@+id/tv0"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:layout_marginTop="20dp"
- android:layout_marginLeft="20dp"
- tools:text="foobar"
- android:textColor="@android:color/white"
- android:textSize="24sp" />
-
- <TextView
android:id="@+id/tv1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
+ style="@style/MyTextViewStyle"
android:layout_marginTop="20dp"
android:layout_marginLeft="20dp"
- tools:text="foobar"
- android:textColor="@android:color/white"
- android:textSize="12sp" />
+ tools:text="some more test text"
+ />
+ <!-- Key Handlers -->
<TextView
- android:id="@+id/tv2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
+ style="@style/MyTextViewStyle"
android:layout_marginTop="20dp"
android:layout_marginLeft="20dp"
- tools:text="foobar"
- android:textColor="@android:color/white"
- android:textSize="12sp" />
-
- <TextView
- android:id="@+id/tv3"
+ android:text="Key Handlers"
+ />
+ <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="left|bottom"
- android:gravity="center"
+ android:layout_marginLeft="30dp"
+ >
+
+ <LinearLayout
+ android:id="@+id/ll_keyHandler1"
+ android:orientation="vertical"
+ android:gravity="right"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ >
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/ll_keyHandler2"
+ android:orientation="vertical"
+ android:layout_gravity="left"
+ android:gravity="left"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="6dp"
+ >
+ </LinearLayout>
+
+ </LinearLayout>
+
+ <!-- Incoming Extras -->
+ <TextView
+ style="@style/MyTextViewStyle"
+ android:layout_marginTop="20dp"
+ android:layout_marginLeft="20dp"
+ android:text="Incoming Extras"
+ />
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="30dp"
+ >
+ <LinearLayout
+ android:id="@+id/ll_incomingExtra1"
+ android:orientation="vertical"
+ android:gravity="right"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ >
+ </LinearLayout>
+ <LinearLayout
+ android:id="@+id/ll_incomingExtra2"
+ android:orientation="vertical"
+ android:layout_gravity="left"
+ android:gravity="left"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="6dp"
+ >
+ </LinearLayout>
+ </LinearLayout>
+
+ <TextView
+ android:id="@+id/tv0"
+ style="@style/MyTextViewStyleLarge"
android:layout_marginTop="20dp"
android:layout_marginLeft="20dp"
android:layout_marginBottom="20dp"
- tools:text="foobar"
- android:textColor="@android:color/white"
- android:textSize="12sp" />
+ tools:text="Some test title text"
+ />
</LinearLayout>
diff --git a/apps/tv/SetupValidation/app/src/main/res/layout/key_item.xml b/apps/tv/SetupValidation/app/src/main/res/layout/key_item.xml
new file mode 100644
index 0000000..d694372
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/layout/key_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/tv"
+ style="@style/MyTextViewStyleSmall"
+ />
diff --git a/apps/tv/SetupValidation/app/src/main/res/raw/btpair_01_searching.mp4 b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_01_searching.mp4
new file mode 100644
index 0000000..07a217e
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_01_searching.mp4
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/raw/btpair_01_searching_already_bonded.mp4 b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_01_searching_already_bonded.mp4
new file mode 100644
index 0000000..9150f5d
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_01_searching_already_bonded.mp4
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/raw/btpair_02_tran_01.mp4 b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_02_tran_01.mp4
new file mode 100644
index 0000000..80a550a
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_02_tran_01.mp4
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/raw/btpair_03_instruction.mp4 b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_03_instruction.mp4
new file mode 100644
index 0000000..40d367d
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_03_instruction.mp4
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/raw/btpair_04_tran_02.mp4 b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_04_tran_02.mp4
new file mode 100644
index 0000000..2915d80
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_04_tran_02.mp4
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/raw/btpair_05_connecting.mp4 b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_05_connecting.mp4
new file mode 100644
index 0000000..293b8b8
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_05_connecting.mp4
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/raw/btpair_06_success.mp4 b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_06_success.mp4
new file mode 100644
index 0000000..d6a0bc7
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_06_success.mp4
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/raw/btpair_07_error.mp4 b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_07_error.mp4
new file mode 100644
index 0000000..5afd580
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/raw/btpair_07_error.mp4
Binary files differ
diff --git a/apps/tv/SetupValidation/app/src/main/res/raw/remote_pairing.xml b/apps/tv/SetupValidation/app/src/main/res/raw/remote_pairing.xml
new file mode 100644
index 0000000..6a38cec
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/raw/remote_pairing.xml
@@ -0,0 +1,30 @@
+<remote-pairing type="video">
+ <prepaired-searching>
+ <item name="btpair_01_searching" count="0" />
+ </prepaired-searching>
+ <prepaired-await-select>
+ <item name="btpair_01_searching_already_bonded" count="0" />
+ </prepaired-await-select>
+ <initial-scan>
+ <item name="btpair_01_searching" count="3" />
+ <item name="btpair_02_tran_01" count="1" />
+ <item name="btpair_03_instruction" count="0" />
+ </initial-scan>
+ <prepaired-initial-scan>
+ <item name="btpair_02_tran_01" count="1" />
+ <item name="btpair_03_instruction" count="0" />
+ </prepaired-initial-scan>
+ <rescan>
+ <item name="btpair_03_instruction" count="0" />
+ </rescan>
+ <bond>
+ <item name="btpair_04_tran_02" count="1" />
+ <item name="btpair_05_connecting" count="0" />
+ </bond>
+ <success>
+ <item name="btpair_06_success" count="1" />
+ </success>
+ <error>
+ <item name="btpair_07_error" count="1" />
+ </error>
+</remote-pairing>
diff --git a/apps/tv/SetupValidation/app/src/main/res/values-zh/config.xml b/apps/tv/SetupValidation/app/src/main/res/values-zh/config.xml
new file mode 100644
index 0000000..2441911
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/values-zh/config.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!--<string name="welcome_message">你好</string>-->
+
+ <!--<string name="hotword_description_appendage">Hotwording 很熱!</string>-->
+
+
+ <!--<string name="tutorial_title0">恐龍好可怕</string>-->
+ <!--<string name="tutorial_description0">要小心,否則你可能會被吃掉</string>-->
+
+ <!--<string name="tutorial_title1">這部電影很棒</string>-->
+ <!--<string name="tutorial_description1">小孩子喜歡恐龍玩具</string>-->
+
+</resources>
diff --git a/apps/tv/SetupValidation/app/src/main/res/values/config.xml b/apps/tv/SetupValidation/app/src/main/res/values/config.xml
new file mode 100644
index 0000000..47841f7
--- /dev/null
+++ b/apps/tv/SetupValidation/app/src/main/res/values/config.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+
+ <!-- Whether to allow backing into the HOOK_BEGIN activities. -->
+ <!--<bool name="allow_hook_replay"></bool>-->
+
+
+ <!-- Whether to allow background music to play. -->
+ <!-- <bool name="play_background_music"></bool> -->
+
+
+ <!-- Whether to allow background movie to play. -->
+ <!-- <bool name="play_background_movie"></bool> -->
+
+
+ <!-- Whether to allow the welcome (locale picker) to be shown. -->
+ <!--<bool name="show_welcome"></bool>-->
+
+
+ <!-- Whether to show the your-device-has-been-upgraded step in the case of a post-provisioned-upgrade run. -->
+ <!--<bool name="show_welcome_post_provisioned_upgrade"></bool>-->
+
+
+ <!-- Provide a list of locales to show atop the default locale picker.
+ Relevant only if the default locale picker is shown. -->
+ <!--<string-array name="preferred_locales"><item></item></string-array>-->
+
+
+ <!-- Provide a welcome string to display on the default locale picker.
+ Relevant only if the default locale picker is shown. -->
+ <!--<string name="welcome_message"></string>-->
+
+
+ <!-- Provide the android:maxWidth attribute for the welcome string on the default locale picker.
+ Relevant only if the default locale picker is shown. -->
+ <!--<dimen name="welcome_message_max_width"></dimen>-->
+
+
+ <!-- Provide the y offset for the welcome string on the default locale picker. A negative value
+ means lift the View upward; a positive value means push it downward.
+ Relevant only if the default locale picker is shown. -->
+ <!--<dimen name="welcome_message_offset"></dimen>-->
+
+
+ <!-- Whether to present the device-to-device bootstrap (QuickSetup) flow. -->
+ <!--<bool name="show_quicksetup"></bool>-->
+
+
+ <!-- Whether to allow the user to skip the default Network step. -->
+ <!--<bool name="show_skip_network"></bool>-->
+
+
+ <!-- Whether to allow the user to skip the Google Account Sign-in step. -->
+ <!--<bool name="show_skip_signin"></bool>-->
+
+
+ <!-- Whether to show the set-device-name step. -->
+ <!--<bool name="show_set_device_name"></bool>-->
+
+
+ <!-- Whether to show the assistant hotword step during Setup.
+ This is only relevant if the device supports hotwording. -->
+ <!--<bool name="show_assistant_hotword"></bool>-->
+
+
+ <!-- Provide a partner-specific string for the hotword step.
+ This is only relevant if the hotwording step gets shown. -->
+ <!--<string name="hotword_description_appendage"></string>-->
+
+
+ <!-- Whether the tutorials step should be shown in the case of a post-provisioned-upgrade run. -->
+ <!--<bool name="show_tutorial_post_provisioned_upgrade"></bool>-->
+
+
+ <!-- Tutorial resources
+ <array name="tutorial_drawables">
+ <item>@drawable/tutorial_image_0</item>
+ <item>@drawable/tutorial_image_1</item>
+ </array>
+
+ <string-array name="tutorial_titles">
+ <item>@string/tutorial_title0</item>
+ <item>@string/tutorial_title1</item>
+ </string-array>
+
+ <string-array name="tutorial_descriptions">
+ <item>@string/tutorial_description0</item>
+ <item>@string/tutorial_description1</item>
+ </string-array>
+
+ <string name="tutorial_title0">Dinosaurs are scary</string>
+ <string name="tutorial_description0">Do not mess with them, or you might get eaten. Be aware!</string>
+
+ <string name="tutorial_title1">This movie was great</string>
+ <string name="tutorial_description1">Be sure to purchase lots of merchandise</string>
+ -->
+
+</resources>
diff --git a/apps/tv/SetupValidation/app/src/main/res/values/styles.xml b/apps/tv/SetupValidation/app/src/main/res/values/styles.xml
index 178c902..4b19c7b 100644
--- a/apps/tv/SetupValidation/app/src/main/res/values/styles.xml
+++ b/apps/tv/SetupValidation/app/src/main/res/values/styles.xml
@@ -11,4 +11,20 @@
<item name="android:windowBackground">@android:color/holo_blue_light</item>
</style>
+ <style name="MyTextViewStyle">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:gravity">left</item>
+ <item name="android:textColor">@android:color/white</item>
+ <item name="android:textSize">12sp</item>
+ </style>
+
+ <style name="MyTextViewStyleSmall" parent="@style/MyTextViewStyle">
+ <item name="android:textSize">10sp</item>
+ </style>
+
+ <style name="MyTextViewStyleLarge" parent="@style/MyTextViewStyle">
+ <item name="android:textSize">24sp</item>
+ </style>
+
</resources>