Merge "App to test the app launch performance" into mnc-dev
diff --git a/tests/perf/PerformanceLaunch/Android.mk b/tests/perf/PerformanceLaunch/Android.mk
new file mode 100644
index 0000000..98e5037
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/Android.mk
@@ -0,0 +1,24 @@
+# Copyright 2015 Google Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_PACKAGE_NAME := PerformanceLaunch
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_MODULE_TAGS := tests
+
+LOCAK_SDK_VERSION := current
+
+include $(BUILD_PACKAGE)
diff --git a/tests/perf/PerformanceLaunch/AndroidManifest.xml b/tests/perf/PerformanceLaunch/AndroidManifest.xml
new file mode 100644
index 0000000..d4aca87
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/AndroidManifest.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.performanceLaunch"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <uses-sdk
+        android:minSdkVersion="22"
+        android:targetSdkVersion="22" />
+
+    <application
+        android:allowBackup="true"
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name"
+        android:theme="@style/AppTheme" >
+        <activity
+            android:name=".EmptyActivity"
+            android:label="@string/app_name"
+            android:autoRemoveFromRecents="true"
+            android:exported="true"
+            android:screenOrientation="nosensor" >
+            <intent-filter>
+             <action android:name="android.intent.action.MAIN" />
+             <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".SimpleActivity"
+            android:label="@string/app_name"
+            android:autoRemoveFromRecents="true"
+            android:exported="true"
+            android:screenOrientation="nosensor" />
+        <activity
+            android:name=".EmptyWebViewActivity"
+            android:label="@string/app_name"
+            android:autoRemoveFromRecents="true"
+            android:exported="true"
+            android:screenOrientation="nosensor" />
+        <activity
+            android:name=".SimpleWebViewActivity"
+            android:label="@string/app_name"
+            android:autoRemoveFromRecents="true"
+            android:exported="true"
+            android:screenOrientation="nosensor" />
+        <activity
+            android:name=".SimpleSurfaceGLActivity"
+            android:label="@string/app_name"
+            android:autoRemoveFromRecents="true"
+            android:exported="true"
+            android:screenOrientation="nosensor" />
+        <activity
+            android:name=".ComplexLayoutActivity"
+            android:label="@string/app_name"
+            android:autoRemoveFromRecents="true"
+            android:exported="true"
+            android:screenOrientation="nosensor" />
+        <activity
+            android:name=".ImageActivity"
+            android:label="@string/app_name"
+            android:autoRemoveFromRecents="true"
+            android:exported="true"
+            android:screenOrientation="nosensor" />
+    </application>
+
+</manifest>
+
diff --git a/tests/perf/PerformanceLaunch/assets/SimpleWebView.html b/tests/perf/PerformanceLaunch/assets/SimpleWebView.html
new file mode 100644
index 0000000..ea7e45f
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/assets/SimpleWebView.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+<body>
+<img src="android.png" alt="Android Icon" style="width:128px;height:128px">
+<p><a href="https://developer.android.com/training/index.html">Android Design</a></p>
+<p><a href="https://developer.android.com/develop/index.html">Android Develop</a></p>
+<p><a href="https://developer.android.com/distribute/index.html">Android Distribute</a></p>
+<p><a href="http://developer.android.com/guide/index.html">Android API Guide</a></p>
+<p><a href="http://developer.android.com/sdk/index.html">Android SDK Tools</a></p>
+<p><a href="http://developer.android.com/google/index.html">Google Services</a></p>
+</body>
+</html>
diff --git a/tests/perf/PerformanceLaunch/assets/android.png b/tests/perf/PerformanceLaunch/assets/android.png
new file mode 100644
index 0000000..40bf934
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/assets/android.png
Binary files differ
diff --git a/tests/perf/PerformanceLaunch/res/drawable-hdpi/back_image.jpg b/tests/perf/PerformanceLaunch/res/drawable-hdpi/back_image.jpg
new file mode 100644
index 0000000..5ddf01d
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/res/drawable-hdpi/back_image.jpg
Binary files differ
diff --git a/tests/perf/PerformanceLaunch/res/drawable-hdpi/ic_launcher.png b/tests/perf/PerformanceLaunch/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..40bf934
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/tests/perf/PerformanceLaunch/res/drawable-mdpi/ic_launcher.png b/tests/perf/PerformanceLaunch/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..40bf934
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/tests/perf/PerformanceLaunch/res/drawable-xhdpi/ic_launcher.png b/tests/perf/PerformanceLaunch/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..40bf934
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/tests/perf/PerformanceLaunch/res/drawable-xxhdpi/ic_launcher.png b/tests/perf/PerformanceLaunch/res/drawable-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..40bf934
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/res/drawable-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/tests/perf/PerformanceLaunch/res/layout/activity_background.xml b/tests/perf/PerformanceLaunch/res/layout/activity_background.xml
new file mode 100644
index 0000000..ae97c6b
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/res/layout/activity_background.xml
@@ -0,0 +1,8 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:background="@drawable/back_image"
+    android:orientation="vertical" >
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/tests/perf/PerformanceLaunch/res/layout/activity_complex.xml b/tests/perf/PerformanceLaunch/res/layout/activity_complex.xml
new file mode 100644
index 0000000..ffc626d
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/res/layout/activity_complex.xml
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:weightSum="1" >
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="0.2"
+        android:background="@android:color/holo_blue_light"
+        android:orientation="horizontal"
+        android:weightSum="1" >
+
+        <View
+            android:id="@+id/bview1"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_margin="10dp"
+            android:layout_weight="0.5"
+            android:background="@android:color/darker_gray" />
+
+        <View
+            android:id="@+id/bview2"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_margin="10dp"
+            android:layout_weight="0.5"
+            android:background="@android:color/darker_gray" />
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="0.7"
+        android:background="@android:color/holo_orange_light"
+        android:orientation="horizontal"
+        android:weightSum="1" >
+
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_margin="10dp"
+            android:layout_weight="0.3"
+            android:background="@android:color/holo_red_dark"
+            android:orientation="vertical"
+            android:weightSum="1" >
+
+            <View
+                android:id="@+id/bview3"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_margin="10dp"
+                android:layout_weight="0.3"
+                android:background="@android:color/darker_gray" />
+
+            <View
+                android:id="@+id/bview4"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_margin="10dp"
+                android:layout_weight="0.4"
+                android:background="@android:color/darker_gray" />
+
+            <View
+                android:id="@+id/bview5"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_margin="10dp"
+                android:layout_weight="0.3"
+                android:background="@android:color/darker_gray" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_margin="10dp"
+            android:layout_weight="0.3"
+            android:background="@android:color/holo_purple"
+            android:orientation="vertical"
+            android:weightSum="1" >
+
+            <View
+                android:id="@+id/bview6"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_margin="10dp"
+                android:layout_weight="0.33"
+                android:background="@android:color/darker_gray" />
+
+            <View
+                android:id="@+id/bview7"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_margin="10dp"
+                android:layout_weight="0.33"
+                android:background="@android:color/darker_gray" />
+
+            <View
+                android:id="@+id/bview8"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_margin="10dp"
+                android:layout_weight="0.33"
+                android:background="@android:color/darker_gray" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_margin="10dp"
+            android:layout_weight="0.4"
+            android:background="@android:color/black"
+            android:orientation="vertical"
+            android:weightSum="1" >
+
+            <View
+                android:id="@+id/bview9"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_margin="10dp"
+                android:layout_weight="0.4"
+                android:background="@android:color/darker_gray" />
+
+            <View
+                android:id="@+id/bview10"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_margin="10dp"
+                android:layout_weight="0.6"
+                android:background="@android:color/darker_gray" />
+        </LinearLayout>
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="0.2"
+        android:background="@android:color/holo_green_light"
+        android:orientation="horizontal"
+        android:weightSum="1" >
+
+        <View
+            android:id="@+id/view11"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_margin="10dp"
+            android:layout_weight="0.3"
+            android:background="@android:color/darker_gray" />
+
+        <View
+            android:id="@+id/view12"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_margin="10dp"
+            android:layout_weight="0.4"
+            android:background="@android:color/darker_gray" />
+
+        <View
+            android:id="@+id/view13"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_margin="10dp"
+            android:layout_weight="0.3"
+            android:background="@android:color/darker_gray" />
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/perf/PerformanceLaunch/res/layout/activity_simple.xml b/tests/perf/PerformanceLaunch/res/layout/activity_simple.xml
new file mode 100644
index 0000000..3abfacd
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/res/layout/activity_simple.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".SimpleActivity" >
+
+    <TextView
+        android:id="@+id/View1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="20dp"
+        android:layout_alignParentTop="true"
+        android:layout_centerHorizontal="true"
+        android:text="@string/login"
+        android:textAppearance="?android:attr/textAppearanceLarge" />
+
+    <TextView
+        android:id="@+id/View2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentStart="true"
+        android:layout_below="@+id/View1"
+        android:layout_marginTop="52dp"
+        android:text="@string/user"
+        android:textAppearance="?android:attr/textAppearanceMedium" />
+
+    <EditText
+        android:id="@+id/Text1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignBottom="@+id/View2"
+        android:layout_marginStart="34dp"
+        android:layout_toEndOf="@+id/View2"
+        android:ems="14" >
+
+        <requestFocus />
+    </EditText>
+
+    <TextView
+        android:id="@+id/View3"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignStart="@+id/View2"
+        android:layout_below="@+id/View2"
+        android:layout_marginTop="40dp"
+        android:text="@string/pass"
+        android:textAppearance="?android:attr/textAppearanceMedium" />
+
+    <EditText
+        android:id="@+id/Text2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignBottom="@+id/View3"
+        android:layout_alignStart="@+id/Text1"
+        android:ems="14"
+        android:inputType="textPassword" />
+
+    <Button
+        android:id="@+id/button1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="99dp"
+        android:layout_below="@+id/Text2"
+        android:onClick="login"
+        android:text="@string/Login" />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/tests/perf/PerformanceLaunch/res/values-v11/styles.xml b/tests/perf/PerformanceLaunch/res/values-v11/styles.xml
new file mode 100644
index 0000000..3c02242
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/res/values-v11/styles.xml
@@ -0,0 +1,11 @@
+<resources>
+
+    <!--
+        Base application theme for API 11+. This theme completely replaces
+        AppBaseTheme from res/values/styles.xml on API 11+ devices.
+    -->
+    <style name="AppBaseTheme" parent="android:Theme.Holo.Light">
+        <!-- API 11 theme customizations can go here. -->
+    </style>
+
+</resources>
diff --git a/tests/perf/PerformanceLaunch/res/values-v14/styles.xml b/tests/perf/PerformanceLaunch/res/values-v14/styles.xml
new file mode 100644
index 0000000..a91fd03
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/res/values-v14/styles.xml
@@ -0,0 +1,12 @@
+<resources>
+
+    <!--
+        Base application theme for API 14+. This theme completely replaces
+        AppBaseTheme from BOTH res/values/styles.xml and
+        res/values-v11/styles.xml on API 14+ devices.
+    -->
+    <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
+        <!-- API 14 theme customizations can go here. -->
+    </style>
+
+</resources>
diff --git a/tests/perf/PerformanceLaunch/res/values/strings.xml b/tests/perf/PerformanceLaunch/res/values/strings.xml
new file mode 100644
index 0000000..59b0466
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/res/values/strings.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <string name="app_name">PerformanceLaunch</string>
+    <string name="login">Login Screen</string>
+    <string name="user">Username:</string>
+    <string name="pass">Password:</string>
+    <string name="Login">Sign In</string>
+
+</resources>
\ No newline at end of file
diff --git a/tests/perf/PerformanceLaunch/res/values/styles.xml b/tests/perf/PerformanceLaunch/res/values/styles.xml
new file mode 100644
index 0000000..6ce89c7
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/res/values/styles.xml
@@ -0,0 +1,20 @@
+<resources>
+
+    <!--
+        Base application theme, dependent on API level. This theme is replaced
+        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
+    -->
+    <style name="AppBaseTheme" parent="android:Theme.Light">
+        <!--
+            Theme customizations available in newer API levels can go in
+            res/values-vXX/styles.xml, while customizations related to
+            backward-compatibility can go here.
+        -->
+    </style>
+
+    <!-- Application theme. -->
+    <style name="AppTheme" parent="AppBaseTheme">
+        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
+    </style>
+
+</resources>
diff --git a/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/ComplexLayoutActivity.java b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/ComplexLayoutActivity.java
new file mode 100644
index 0000000..608418e
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/ComplexLayoutActivity.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.performanceLaunch;
+
+import com.android.performanceLaunch.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class ComplexLayoutActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_complex);
+    }
+
+}
diff --git a/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/EmptyActivity.java b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/EmptyActivity.java
new file mode 100644
index 0000000..efa822a
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/EmptyActivity.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.performanceLaunch;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class EmptyActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+}
diff --git a/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/EmptyWebViewActivity.java b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/EmptyWebViewActivity.java
new file mode 100644
index 0000000..2f34098
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/EmptyWebViewActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.performanceLaunch;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.Window;
+import android.webkit.WebView;
+
+public class EmptyWebViewActivity extends Activity {
+
+    private WebView mWebView;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
+        mWebView = new WebView(this);
+        this.setContentView(mWebView);
+    }
+
+}
diff --git a/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/ImageActivity.java b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/ImageActivity.java
new file mode 100644
index 0000000..709ee3a
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/ImageActivity.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.performanceLaunch;
+
+import com.android.performanceLaunch.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class ImageActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_background);
+    }
+
+}
diff --git a/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/SimpleActivity.java b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/SimpleActivity.java
new file mode 100644
index 0000000..1bd7360
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/SimpleActivity.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.performanceLaunch;
+
+import com.android.performanceLaunch.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class SimpleActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_simple);
+    }
+
+}
diff --git a/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/SimpleSurfaceGLActivity.java b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/SimpleSurfaceGLActivity.java
new file mode 100644
index 0000000..c6aa605
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/SimpleSurfaceGLActivity.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.performanceLaunch;
+
+import com.android.performanceLaunch.helper.SimpleGLSurfaceView;
+
+import android.app.Activity;
+import android.opengl.GLSurfaceView;
+import android.os.Bundle;
+
+/**
+ * To draw the GLSurface view Source : development/samples/OpenGL/HelloOpenGLES20
+ */
+public class SimpleSurfaceGLActivity extends Activity {
+
+    private GLSurfaceView mGLView;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Create a GLSurfaceView instance and set it
+        // as the ContentView for this Activity
+        mGLView = new SimpleGLSurfaceView(this);
+        setContentView(mGLView);
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        // The following call pauses the rendering thread.
+        // If your OpenGL application is memory intensive,
+        // you should consider de-allocating objects that
+        // consume significant memory here.
+        mGLView.onPause();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        // The following call resumes a paused rendering thread.
+        // If you de-allocated graphic objects for onPause()
+        // this is a good place to re-allocate them.
+        mGLView.onResume();
+    }
+}
diff --git a/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/SimpleWebViewActivity.java b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/SimpleWebViewActivity.java
new file mode 100644
index 0000000..7d3b417
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/SimpleWebViewActivity.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.performanceLaunch;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.Window;
+import android.webkit.WebView;
+
+public class SimpleWebViewActivity extends Activity {
+
+    private WebView mWebView;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
+        mWebView = new WebView(this);
+        mWebView.loadUrl("file:///android_asset/SimpleWebView.html");
+        this.setContentView(mWebView);
+    }
+
+}
diff --git a/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/helper/SimpleGLRenderer.java b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/helper/SimpleGLRenderer.java
new file mode 100644
index 0000000..9a7b37d
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/helper/SimpleGLRenderer.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.performanceLaunch.helper;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import android.opengl.GLES20;
+import android.opengl.GLSurfaceView;
+import android.opengl.Matrix;
+import android.util.Log;
+
+/**
+ * Provides drawing instructions for a GLSurfaceView object. This class must override the OpenGL ES
+ * drawing lifecycle methods:
+ * <ul>
+ * <li>{@link android.opengl.GLSurfaceView.Renderer#onSurfaceCreated}</li>
+ * <li>{@link android.opengl.GLSurfaceView.Renderer#onDrawFrame}</li>
+ * <li>{@link android.opengl.GLSurfaceView.Renderer#onSurfaceChanged}</li>
+ * </ul>
+ * Source : development/samples/OpenGL/HelloOpenGLES20
+ */
+public class SimpleGLRenderer implements GLSurfaceView.Renderer {
+
+    private static final String TAG = "MyGLRenderer";
+    private Triangle mTriangle;
+    private Square mSquare;
+
+    // mMVPMatrix is an abbreviation for "Model View Projection Matrix"
+    private final float[] mMVPMatrix = new float[16];
+    private final float[] mProjectionMatrix = new float[16];
+    private final float[] mViewMatrix = new float[16];
+    private final float[] mRotationMatrix = new float[16];
+
+    private float mAngle;
+
+    @Override
+    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
+
+        // Set the background frame color
+        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+
+        mTriangle = new Triangle();
+        mSquare = new Square();
+    }
+
+    @Override
+    public void onDrawFrame(GL10 unused) {
+        float[] scratch = new float[16];
+
+        // Draw background color
+        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
+
+        // Set the camera position (View matrix)
+        Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
+
+        // Calculate the projection and view transformation
+        Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
+
+        // Draw square
+        mSquare.draw(mMVPMatrix);
+
+        // Create a rotation for the triangle
+
+        // Use the following code to generate constant rotation.
+        // Leave this code out when using TouchEvents.
+        // long time = SystemClock.uptimeMillis() % 4000L;
+        // float angle = 0.090f * ((int) time);
+
+        Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, 1.0f);
+
+        // Combine the rotation matrix with the projection and camera view
+        // Note that the mMVPMatrix factor *must be first* in order
+        // for the matrix multiplication product to be correct.
+        Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0);
+
+        // Draw triangle
+        mTriangle.draw(scratch);
+    }
+
+    @Override
+    public void onSurfaceChanged(GL10 unused, int width, int height) {
+        // Adjust the viewport based on geometry changes,
+        // such as screen rotation
+        GLES20.glViewport(0, 0, width, height);
+
+        float ratio = (float) width / height;
+
+        // this projection matrix is applied to object coordinates
+        // in the onDrawFrame() method
+        Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
+
+    }
+
+    /**
+     * Utility method for compiling a OpenGL shader.
+     * <p>
+     * <strong>Note:</strong> When developing shaders, use the checkGlError() method to debug shader
+     * coding errors.
+     * </p>
+     *
+     * @param type - Vertex or fragment shader type.
+     * @param shaderCode - String containing the shader code.
+     * @return - Returns an id for the shader.
+     */
+    public static int loadShader(int type, String shaderCode) {
+
+        // create a vertex shader type (GLES20.GL_VERTEX_SHADER)
+        // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
+        int shader = GLES20.glCreateShader(type);
+
+        // add the source code to the shader and compile it
+        GLES20.glShaderSource(shader, shaderCode);
+        GLES20.glCompileShader(shader);
+
+        return shader;
+    }
+
+    /**
+     * Utility method for debugging OpenGL calls. Provide the name of the call just after making it:
+     *
+     * <pre>
+     * mColorHandle = GLES20.glGetUniformLocation(mProgram, &quot;vColor&quot;);
+     * MyGLRenderer.checkGlError(&quot;glGetUniformLocation&quot;);
+     * </pre>
+     *
+     * If the operation is not successful, the check throws an error.
+     *
+     * @param glOperation - Name of the OpenGL call to check.
+     */
+    public static void checkGlError(String glOperation) {
+        int error;
+        while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
+            Log.e(TAG, glOperation + ": glError " + error);
+            throw new RuntimeException(glOperation + ": glError " + error);
+        }
+    }
+
+    /**
+     * Returns the rotation angle of the triangle shape (mTriangle).
+     *
+     * @return - A float representing the rotation angle.
+     */
+    public float getAngle() {
+        return mAngle;
+    }
+
+    /**
+     * Sets the rotation angle of the triangle shape (mTriangle).
+     */
+    public void setAngle(float angle) {
+        mAngle = angle;
+    }
+
+}
diff --git a/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/helper/SimpleGLSurfaceView.java b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/helper/SimpleGLSurfaceView.java
new file mode 100644
index 0000000..9bc1192
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/helper/SimpleGLSurfaceView.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.performanceLaunch.helper;
+
+import android.content.Context;
+import android.opengl.GLSurfaceView;
+import android.view.MotionEvent;
+
+/**
+ * A view container where OpenGL ES graphics can be drawn on screen. This view can also be used to
+ * capture touch events, such as a user interacting with drawn objects.
+ * Source : development/samples/OpenGL/HelloOpenGLES20
+ */
+public class SimpleGLSurfaceView extends GLSurfaceView {
+
+    private final SimpleGLRenderer mRenderer;
+
+    public SimpleGLSurfaceView(Context context) {
+        super(context);
+
+        // Create an OpenGL ES 2.0 context.
+        setEGLContextClientVersion(2);
+
+        // Set the Renderer for drawing on the GLSurfaceView
+        mRenderer = new SimpleGLRenderer();
+        setRenderer(mRenderer);
+
+        // Render the view only when there is a change in the drawing data
+        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
+    }
+
+    private final float TOUCH_SCALE_FACTOR = 180.0f / 320;
+    private float mPreviousX;
+    private float mPreviousY;
+
+    @Override
+    public boolean onTouchEvent(MotionEvent e) {
+        // MotionEvent reports input details from the touch screen
+        // and other input controls. In this case, you are only
+        // interested in events where the touch position changed.
+
+        float x = e.getX();
+        float y = e.getY();
+
+        switch (e.getAction()) {
+            case MotionEvent.ACTION_MOVE:
+
+                float dx = x - mPreviousX;
+                float dy = y - mPreviousY;
+
+                // reverse direction of rotation above the mid-line
+                if (y > getHeight() / 2) {
+                    dx = dx * -1;
+                }
+
+                // reverse direction of rotation to left of the mid-line
+                if (x < getWidth() / 2) {
+                    dy = dy * -1;
+                }
+
+                mRenderer.setAngle(
+                        mRenderer.getAngle() +
+                                ((dx + dy) * TOUCH_SCALE_FACTOR)); // = 180.0f / 320
+                requestRender();
+        }
+
+        mPreviousX = x;
+        mPreviousY = y;
+        return true;
+    }
+
+}
diff --git a/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/helper/Square.java b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/helper/Square.java
new file mode 100644
index 0000000..c4d43b3
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/helper/Square.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.performanceLaunch.helper;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+import java.nio.ShortBuffer;
+
+import android.opengl.GLES20;
+
+/**
+ * A two-dimensional square for use as a drawn object in OpenGL ES 2.0.
+ * Source : development/samples/OpenGL/HelloOpenGLES20
+ */
+public class Square {
+
+    private final String vertexShaderCode =
+            // This matrix member variable provides a hook to manipulate
+            // the coordinates of the objects that use this vertex shader
+            "uniform mat4 uMVPMatrix;" +
+                    "attribute vec4 vPosition;" +
+                    "void main() {" +
+                    // The matrix must be included as a modifier of gl_Position.
+                    // Note that the uMVPMatrix factor *must be first* in order
+                    // for the matrix multiplication product to be correct.
+                    "  gl_Position = uMVPMatrix * vPosition;" +
+                    "}";
+
+    private final String fragmentShaderCode =
+            "precision mediump float;" +
+                    "uniform vec4 vColor;" +
+                    "void main() {" +
+                    "  gl_FragColor = vColor;" +
+                    "}";
+
+    private final FloatBuffer vertexBuffer;
+    private final ShortBuffer drawListBuffer;
+    private final int mProgram;
+    private int mPositionHandle;
+    private int mColorHandle;
+    private int mMVPMatrixHandle;
+
+    // number of coordinates per vertex in this array
+    static final int COORDS_PER_VERTEX = 3;
+    static float squareCoords[] = {
+            -0.5f, 0.5f, 0.0f, // top left
+            -0.5f, -0.5f, 0.0f, // bottom left
+            0.5f, -0.5f, 0.0f, // bottom right
+            0.5f, 0.5f, 0.0f
+    }; // top right
+
+    private final short drawOrder[] = {
+            0, 1, 2, 0, 2, 3
+    }; // order to draw vertices
+
+    private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex
+
+    float color[] = {
+            0.2f, 0.709803922f, 0.898039216f, 1.0f
+    };
+
+    /**
+     * Sets up the drawing object data for use in an OpenGL ES context.
+     */
+    public Square() {
+        // initialize vertex byte buffer for shape coordinates
+        ByteBuffer bb = ByteBuffer.allocateDirect(
+                // (# of coordinate values * 4 bytes per float)
+                squareCoords.length * 4);
+        bb.order(ByteOrder.nativeOrder());
+        vertexBuffer = bb.asFloatBuffer();
+        vertexBuffer.put(squareCoords);
+        vertexBuffer.position(0);
+
+        // initialize byte buffer for the draw list
+        ByteBuffer dlb = ByteBuffer.allocateDirect(
+                // (# of coordinate values * 2 bytes per short)
+                drawOrder.length * 2);
+        dlb.order(ByteOrder.nativeOrder());
+        drawListBuffer = dlb.asShortBuffer();
+        drawListBuffer.put(drawOrder);
+        drawListBuffer.position(0);
+
+        // prepare shaders and OpenGL program
+        int vertexShader = SimpleGLRenderer.loadShader(
+                GLES20.GL_VERTEX_SHADER,
+                vertexShaderCode);
+        int fragmentShader = SimpleGLRenderer.loadShader(
+                GLES20.GL_FRAGMENT_SHADER,
+                fragmentShaderCode);
+
+        mProgram = GLES20.glCreateProgram(); // create empty OpenGL Program
+        GLES20.glAttachShader(mProgram, vertexShader); // add the vertex shader to program
+        GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program
+        GLES20.glLinkProgram(mProgram); // create OpenGL program executables
+    }
+
+    /**
+     * Encapsulates the OpenGL ES instructions for drawing this shape.
+     *
+     * @param mvpMatrix - The Model View Project matrix in which to draw this shape.
+     */
+    public void draw(float[] mvpMatrix) {
+        // Add program to OpenGL environment
+        GLES20.glUseProgram(mProgram);
+
+        // get handle to vertex shader's vPosition member
+        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
+
+        // Enable a handle to the triangle vertices
+        GLES20.glEnableVertexAttribArray(mPositionHandle);
+
+        // Prepare the triangle coordinate data
+        GLES20.glVertexAttribPointer(
+                mPositionHandle, COORDS_PER_VERTEX,
+                GLES20.GL_FLOAT, false,
+                vertexStride, vertexBuffer);
+
+        // get handle to fragment shader's vColor member
+        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
+
+        // Set color for drawing the triangle
+        GLES20.glUniform4fv(mColorHandle, 1, color, 0);
+
+        // get handle to shape's transformation matrix
+        mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
+        SimpleGLRenderer.checkGlError("glGetUniformLocation");
+
+        // Apply the projection and view transformation
+        GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
+        SimpleGLRenderer.checkGlError("glUniformMatrix4fv");
+
+        // Draw the square
+        GLES20.glDrawElements(
+                GLES20.GL_TRIANGLES, drawOrder.length,
+                GLES20.GL_UNSIGNED_SHORT, drawListBuffer);
+
+        // Disable vertex array
+        GLES20.glDisableVertexAttribArray(mPositionHandle);
+    }
+
+}
diff --git a/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/helper/Triangle.java b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/helper/Triangle.java
new file mode 100644
index 0000000..f1ea524
--- /dev/null
+++ b/tests/perf/PerformanceLaunch/src/com/android/performanceLaunch/helper/Triangle.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.performanceLaunch.helper;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+import android.opengl.GLES20;
+
+/**
+ * A two-dimensional triangle for use as a drawn object in OpenGL ES 2.0.
+ * Source : development/samples/OpenGL/HelloOpenGLES20
+ */
+public class Triangle {
+
+    private final String vertexShaderCode =
+            // This matrix member variable provides a hook to manipulate
+            // the coordinates of the objects that use this vertex shader
+            "uniform mat4 uMVPMatrix;" +
+                    "attribute vec4 vPosition;" +
+                    "void main() {" +
+                    // the matrix must be included as a modifier of gl_Position
+                    // Note that the uMVPMatrix factor *must be first* in order
+                    // for the matrix multiplication product to be correct.
+                    "  gl_Position = uMVPMatrix * vPosition;" +
+                    "}";
+
+    private final String fragmentShaderCode =
+            "precision mediump float;" +
+                    "uniform vec4 vColor;" +
+                    "void main() {" +
+                    "  gl_FragColor = vColor;" +
+                    "}";
+
+    private final FloatBuffer vertexBuffer;
+    private final int mProgram;
+    private int mPositionHandle;
+    private int mColorHandle;
+    private int mMVPMatrixHandle;
+
+    // number of coordinates per vertex in this array
+    static final int COORDS_PER_VERTEX = 3;
+    static float triangleCoords[] = {
+            // in counterclockwise order:
+            0.0f, 0.622008459f, 0.0f, // top
+            -0.5f, -0.311004243f, 0.0f, // bottom left
+            0.5f, -0.311004243f, 0.0f
+            // bottom right
+    };
+    private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX;
+    private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex
+
+    float color[] = {
+            0.63671875f, 0.76953125f, 0.22265625f, 0.0f
+    };
+
+    /**
+     * Sets up the drawing object data for use in an OpenGL ES context.
+     */
+    public Triangle() {
+        // initialize vertex byte buffer for shape coordinates
+        ByteBuffer bb = ByteBuffer.allocateDirect(
+                // (number of coordinate values * 4 bytes per float)
+                triangleCoords.length * 4);
+        // use the device hardware's native byte order
+        bb.order(ByteOrder.nativeOrder());
+
+        // create a floating point buffer from the ByteBuffer
+        vertexBuffer = bb.asFloatBuffer();
+        // add the coordinates to the FloatBuffer
+        vertexBuffer.put(triangleCoords);
+        // set the buffer to read the first coordinate
+        vertexBuffer.position(0);
+
+        // prepare shaders and OpenGL program
+        int vertexShader = SimpleGLRenderer.loadShader(
+                GLES20.GL_VERTEX_SHADER, vertexShaderCode);
+        int fragmentShader = SimpleGLRenderer.loadShader(
+                GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
+
+        mProgram = GLES20.glCreateProgram(); // create empty OpenGL Program
+        GLES20.glAttachShader(mProgram, vertexShader); // add the vertex shader to program
+        GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program
+        GLES20.glLinkProgram(mProgram); // create OpenGL program executables
+
+    }
+
+    /**
+     * Encapsulates the OpenGL ES instructions for drawing this shape.
+     *
+     * @param mvpMatrix - The Model View Project matrix in which to draw this shape.
+     */
+    public void draw(float[] mvpMatrix) {
+        // Add program to OpenGL environment
+        GLES20.glUseProgram(mProgram);
+
+        // get handle to vertex shader's vPosition member
+        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
+
+        // Enable a handle to the triangle vertices
+        GLES20.glEnableVertexAttribArray(mPositionHandle);
+
+        // Prepare the triangle coordinate data
+        GLES20.glVertexAttribPointer(
+                mPositionHandle, COORDS_PER_VERTEX,
+                GLES20.GL_FLOAT, false,
+                vertexStride, vertexBuffer);
+
+        // get handle to fragment shader's vColor member
+        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
+
+        // Set color for drawing the triangle
+        GLES20.glUniform4fv(mColorHandle, 1, color, 0);
+
+        // get handle to shape's transformation matrix
+        mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
+        SimpleGLRenderer.checkGlError("glGetUniformLocation");
+
+        // Apply the projection and view transformation
+        GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
+        SimpleGLRenderer.checkGlError("glUniformMatrix4fv");
+
+        // Draw the triangle
+        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
+
+        // Disable vertex array
+        GLES20.glDisableVertexAttribArray(mPositionHandle);
+    }
+
+}