summaryrefslogtreecommitdiffstats
path: root/Android/07-Graphics
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2014-03-16 18:16:21 +0100
committerJérémy Zurcher <jeremy@asynk.ch>2016-11-10 17:40:55 +0100
commitd8c875ed2a82ce24c96101845a5f5fafb27ed5cc (patch)
tree078931a9da3210db1559b5e4e360f83f087881e4 /Android/07-Graphics
parent1e33c4940ea43093a80077fbb7249b013e35a1f1 (diff)
downloadcoursera-d8c875ed2a82ce24c96101845a5f5fafb27ed5cc.zip
coursera-d8c875ed2a82ce24c96101845a5f5fafb27ed5cc.tar.gz
Android : 07-Graphics: add
Diffstat (limited to 'Android/07-Graphics')
-rw-r--r--Android/07-Graphics/GraphicsLab/AndroidManifest.xml19
-rw-r--r--Android/07-Graphics/GraphicsLab/ant.properties17
-rw-r--r--Android/07-Graphics/GraphicsLab/build.xml92
-rw-r--r--Android/07-Graphics/GraphicsLab/local.properties10
-rw-r--r--Android/07-Graphics/GraphicsLab/proguard-project.txt20
-rw-r--r--Android/07-Graphics/GraphicsLab/project.properties14
-rw-r--r--Android/07-Graphics/GraphicsLab/res/drawable-hdpi/b128.pngbin0 -> 25458 bytes
-rw-r--r--Android/07-Graphics/GraphicsLab/res/drawable-hdpi/b64.pngbin0 -> 8182 bytes
-rw-r--r--Android/07-Graphics/GraphicsLab/res/drawable-hdpi/ic_launcher.pngbin0 -> 9397 bytes
-rw-r--r--Android/07-Graphics/GraphicsLab/res/drawable-ldpi/ic_launcher.pngbin0 -> 2729 bytes
-rw-r--r--Android/07-Graphics/GraphicsLab/res/drawable-mdpi/ic_launcher.pngbin0 -> 5237 bytes
-rw-r--r--Android/07-Graphics/GraphicsLab/res/drawable-xhdpi/ic_launcher.pngbin0 -> 14383 bytes
-rw-r--r--Android/07-Graphics/GraphicsLab/res/layout/main.xml7
-rw-r--r--Android/07-Graphics/GraphicsLab/res/raw/bubble_pop.wavbin0 -> 1574 bytes
-rw-r--r--Android/07-Graphics/GraphicsLab/res/values/strings.xml4
-rw-r--r--Android/07-Graphics/GraphicsLab/src/course/labs/GraphicsLab/BubbleActivity.java344
-rw-r--r--Android/07-Graphics/GraphicsLab/tests/AndroidManifest.xml21
-rw-r--r--Android/07-Graphics/GraphicsLab/tests/ant.properties18
-rw-r--r--Android/07-Graphics/GraphicsLab/tests/build.xml92
-rw-r--r--Android/07-Graphics/GraphicsLab/tests/libs/robotium-solo-5.0.2-SNAPSHOT.jarbin0 -> 111576 bytes
-rw-r--r--Android/07-Graphics/GraphicsLab/tests/local.properties10
-rw-r--r--Android/07-Graphics/GraphicsLab/tests/proguard-project.txt20
-rw-r--r--Android/07-Graphics/GraphicsLab/tests/project.properties14
-rw-r--r--Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityFling.java47
-rw-r--r--Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityFloatOffScreen.java40
-rw-r--r--Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityMultiple.java48
-rw-r--r--Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityPop.java47
-rw-r--r--Android/07-Graphics/Lab-Graphics.pdfbin0 -> 2567546 bytes
28 files changed, 884 insertions, 0 deletions
diff --git a/Android/07-Graphics/GraphicsLab/AndroidManifest.xml b/Android/07-Graphics/GraphicsLab/AndroidManifest.xml
new file mode 100644
index 0000000..c4440e7
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/AndroidManifest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="course.labs.GraphicsLab"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <application
+ android:allowBackup="false"
+ android:label="@string/app_name"
+ android:icon="@drawable/ic_launcher">
+ <activity android:name="course.labs.GraphicsLab.BubbleActivity"
+ android:label="@string/app_name"
+ android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/Android/07-Graphics/GraphicsLab/ant.properties b/Android/07-Graphics/GraphicsLab/ant.properties
new file mode 100644
index 0000000..b0971e8
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/ant.properties
@@ -0,0 +1,17 @@
+# This file is used to override default values used by the Ant build system.
+#
+# This file must be checked into Version Control Systems, as it is
+# integral to the build system of your project.
+
+# This file is only used by the Ant script.
+
+# You can use this to override default values such as
+# 'source.dir' for the location of your java source folder and
+# 'out.dir' for the location of your output folder.
+
+# You can also use it define how the release builds are signed by declaring
+# the following properties:
+# 'key.store' for the location of your keystore and
+# 'key.alias' for the name of the key to use.
+# The password will be asked during the build when you use the 'release' target.
+
diff --git a/Android/07-Graphics/GraphicsLab/build.xml b/Android/07-Graphics/GraphicsLab/build.xml
new file mode 100644
index 0000000..a8079b4
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/build.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="GraphicsLab" default="help">
+
+ <!-- The local.properties file is created and updated by the 'android' tool.
+ It contains the path to the SDK. It should *NOT* be checked into
+ Version Control Systems. -->
+ <property file="local.properties" />
+
+ <!-- The ant.properties file can be created by you. It is only edited by the
+ 'android' tool to add properties to it.
+ This is the place to change some Ant specific build properties.
+ Here are some properties you may want to change/update:
+
+ source.dir
+ The name of the source directory. Default is 'src'.
+ out.dir
+ The name of the output directory. Default is 'bin'.
+
+ For other overridable properties, look at the beginning of the rules
+ files in the SDK, at tools/ant/build.xml
+
+ Properties related to the SDK location or the project target should
+ be updated using the 'android' tool with the 'update' action.
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems.
+
+ -->
+ <property file="ant.properties" />
+
+ <!-- if sdk.dir was not set from one of the property file, then
+ get it from the ANDROID_HOME env var.
+ This must be done before we load project.properties since
+ the proguard config can use sdk.dir -->
+ <property environment="env" />
+ <condition property="sdk.dir" value="${env.ANDROID_HOME}">
+ <isset property="env.ANDROID_HOME" />
+ </condition>
+
+ <!-- The project.properties file is created and updated by the 'android'
+ tool, as well as ADT.
+
+ This contains project specific properties such as project target, and library
+ dependencies. Lower level build properties are stored in ant.properties
+ (or in .classpath for Eclipse projects).
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems. -->
+ <loadproperties srcFile="project.properties" />
+
+ <!-- quick check on sdk.dir -->
+ <fail
+ message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
+ unless="sdk.dir"
+ />
+
+ <!--
+ Import per project custom build rules if present at the root of the project.
+ This is the place to put custom intermediary targets such as:
+ -pre-build
+ -pre-compile
+ -post-compile (This is typically used for code obfuscation.
+ Compiled code location: ${out.classes.absolute.dir}
+ If this is not done in place, override ${out.dex.input.absolute.dir})
+ -post-package
+ -post-build
+ -pre-clean
+ -->
+ <import file="custom_rules.xml" optional="true" />
+
+ <!-- Import the actual build file.
+
+ To customize existing targets, there are two options:
+ - Customize only one target:
+ - copy/paste the target into this file, *before* the
+ <import> task.
+ - customize it to your needs.
+ - Customize the whole content of build.xml
+ - copy/paste the content of the rules files (minus the top node)
+ into this file, replacing the <import> task.
+ - customize to your needs.
+
+ ***********************
+ ****** IMPORTANT ******
+ ***********************
+ In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
+ in order to avoid having your file be overridden by tools such as "android update project"
+ -->
+ <!-- version-tag: 1 -->
+ <import file="${sdk.dir}/tools/ant/build.xml" />
+
+</project>
diff --git a/Android/07-Graphics/GraphicsLab/local.properties b/Android/07-Graphics/GraphicsLab/local.properties
new file mode 100644
index 0000000..12a0114
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/local.properties
@@ -0,0 +1,10 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must *NOT* be checked into Version Control Systems,
+# as it contains information specific to your local configuration.
+
+# location of the SDK. This is only used by Ant
+# For customization when using a Version Control System, please read the
+# header note.
+sdk.dir=/opt/android-sdk
diff --git a/Android/07-Graphics/GraphicsLab/proguard-project.txt b/Android/07-Graphics/GraphicsLab/proguard-project.txt
new file mode 100644
index 0000000..f2fe155
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/Android/07-Graphics/GraphicsLab/project.properties b/Android/07-Graphics/GraphicsLab/project.properties
new file mode 100644
index 0000000..ce39f2d
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/project.properties
@@ -0,0 +1,14 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-18
diff --git a/Android/07-Graphics/GraphicsLab/res/drawable-hdpi/b128.png b/Android/07-Graphics/GraphicsLab/res/drawable-hdpi/b128.png
new file mode 100644
index 0000000..7845514
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/res/drawable-hdpi/b128.png
Binary files differ
diff --git a/Android/07-Graphics/GraphicsLab/res/drawable-hdpi/b64.png b/Android/07-Graphics/GraphicsLab/res/drawable-hdpi/b64.png
new file mode 100644
index 0000000..7101a25
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/res/drawable-hdpi/b64.png
Binary files differ
diff --git a/Android/07-Graphics/GraphicsLab/res/drawable-hdpi/ic_launcher.png b/Android/07-Graphics/GraphicsLab/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..96a442e
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/Android/07-Graphics/GraphicsLab/res/drawable-ldpi/ic_launcher.png b/Android/07-Graphics/GraphicsLab/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..9923872
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/Android/07-Graphics/GraphicsLab/res/drawable-mdpi/ic_launcher.png b/Android/07-Graphics/GraphicsLab/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..359047d
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/Android/07-Graphics/GraphicsLab/res/drawable-xhdpi/ic_launcher.png b/Android/07-Graphics/GraphicsLab/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..71c6d76
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/Android/07-Graphics/GraphicsLab/res/layout/main.xml b/Android/07-Graphics/GraphicsLab/res/layout/main.xml
new file mode 100644
index 0000000..5aff44c
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/res/layout/main.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:background="#FF444444"
+ android:id="@+id/frame">
+</RelativeLayout>
diff --git a/Android/07-Graphics/GraphicsLab/res/raw/bubble_pop.wav b/Android/07-Graphics/GraphicsLab/res/raw/bubble_pop.wav
new file mode 100644
index 0000000..50886e2
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/res/raw/bubble_pop.wav
Binary files differ
diff --git a/Android/07-Graphics/GraphicsLab/res/values/strings.xml b/Android/07-Graphics/GraphicsLab/res/values/strings.xml
new file mode 100644
index 0000000..03bf799
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/res/values/strings.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">GraphicsLab</string>
+</resources>
diff --git a/Android/07-Graphics/GraphicsLab/src/course/labs/GraphicsLab/BubbleActivity.java b/Android/07-Graphics/GraphicsLab/src/course/labs/GraphicsLab/BubbleActivity.java
new file mode 100644
index 0000000..fed77d7
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/src/course/labs/GraphicsLab/BubbleActivity.java
@@ -0,0 +1,344 @@
+package course.labs.GraphicsLab;
+
+import java.util.Random;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.media.AudioManager;
+import android.media.SoundPool;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.GestureDetector;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.RelativeLayout;
+
+public class BubbleActivity extends Activity {
+
+ // These variables are for testing purposes, do not modify
+ private final static int RANDOM = 0;
+ private final static int SINGLE = 1;
+ private final static int STILL = 2;
+ private static int speedMode = RANDOM;
+
+ private static final int MENU_STILL = Menu.FIRST;
+ private static final int MENU_SINGLE_SPEED = Menu.FIRST + 1;
+ private static final int MENU_RANDOM_SPEED = Menu.FIRST + 2;
+
+ private static final String TAG = "Lab-Graphics";
+
+ // Main view
+ private RelativeLayout mFrame;
+
+ // Bubble image
+ private Bitmap mBitmap;
+
+ // Display dimensions
+ private int mDisplayWidth, mDisplayHeight;
+
+ // Sound variables
+
+ // AudioManager
+ private AudioManager mAudioManager;
+ // SoundPool
+ private SoundPool mSoundPool;
+ // ID for the bubble popping sound
+ private int mSoundID;
+ // Audio volume
+ private float mStreamVolume;
+
+ // Gesture Detector
+ private GestureDetector mGestureDetector;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.main);
+
+ // Set up user interface
+ mFrame = (RelativeLayout) findViewById(R.id.frame);
+
+ // Load basic bubble Bitmap
+ mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.b64);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ // Manage bubble popping sound
+ // Use AudioManager.STREAM_MUSIC as stream type
+ mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
+
+ mStreamVolume = (float) mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC) / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+
+ // TODO - make a new SoundPool, allowing up to 10 streams
+ mSoundPool = null;
+
+ // TODO - set a SoundPool OnLoadCompletedListener that calls setupGestureDetector()
+ // TODO - load the sound from res/raw/bubble_pop.wav
+ mSoundID = 0;
+ }
+
+ @Override
+ public void onWindowFocusChanged(boolean hasFocus) {
+ super.onWindowFocusChanged(hasFocus);
+ if (hasFocus) {
+ // Get the size of the display so this view knows where borders are
+ mDisplayWidth = mFrame.getWidth();
+ mDisplayHeight = mFrame.getHeight();
+ }
+ }
+
+ // Set up GestureDetector
+ private void setupGestureDetector() {
+
+ mGestureDetector = new GestureDetector(this,
+
+ new GestureDetector.SimpleOnGestureListener() {
+ // If a fling gesture starts on a BubbleView then change the
+ // BubbleView's velocity
+ @Override
+ public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {
+ int numberChilds = mFrame.getChildCount();
+ for (int i = 0; i < numberChilds; i++) {
+ final BubbleView bubble = (BubbleView) mFrame.getChildAt(i);
+ bubble.deflect(velocityX, velocityY);
+ }
+
+ return true;
+ }
+
+ // If a single tap intersects a BubbleView, then pop the BubbleView
+ // Otherwise, create a new BubbleView at the tap's location and add
+ // it to mFrame. You can get all views from mFrame with ViewGroup.getChildAt()
+ @Override
+ public boolean onSingleTapConfirmed(MotionEvent event) {
+ // TODO - Implement onSingleTapConfirmed actions.
+ // You can get all Views in mFrame using the
+ // ViewGroup.getChildCount() method
+ return false;
+ }
+ });
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ // TODO - delegate the touch to the gestureDetector
+ return false;
+ }
+
+ @Override
+ protected void onPause() {
+ // TODO - Release all SoundPool resources
+ super.onPause();
+ }
+
+ // BubbleView is a View that displays a bubble.
+ // This class handles animating, drawing, popping amongst other actions.
+ // A new BubbleView is created for each bubble on the display
+ private class BubbleView extends View {
+
+ private static final int BITMAP_SIZE = 64;
+ private static final int REFRESH_RATE = 40;
+ private final Paint mPainter = new Paint();
+ private ScheduledFuture<?> mMoverFuture;
+ private int mScaledBitmapWidth;
+ private Bitmap mScaledBitmap;
+
+ // location, speed and direction of the bubble
+ private float mXPos, mYPos, mDx, mDy;
+ private long mRotate, mDRotate;
+
+ public BubbleView(Context context, float x, float y) {
+ super(context);
+ log("Creating Bubble at: x:" + x + " y:" + y);
+
+ // Create a new random number generator to
+ // randomize size, rotation, speed and direction
+ Random r = new Random();
+
+ // Creates the bubble bitmap for this BubbleView
+ createScaledBitmap(r);
+
+ // Adjust position to center the bubble under user's finger
+ mXPos = x - mScaledBitmapWidth / 2;
+ mYPos = y - mScaledBitmapWidth / 2;
+
+ // Set the BubbleView's speed and direction
+ setSpeedAndDirection(r);
+
+ // Set the BubbleView's rotation
+ setRotation(r);
+
+ mPainter.setAntiAlias(true);
+ }
+
+ private void setRotation(Random r) {
+ if (speedMode == RANDOM) {
+ // TODO - set rotation in range [1..3]
+ mDRotate = 0;
+ } else {
+ mDRotate = 0;
+ }
+ }
+
+ private void setSpeedAndDirection(Random r) {
+
+ // Used by test cases
+ switch (speedMode) {
+ case SINGLE:
+ // Fixed speed
+ mDx = 10;
+ mDy = 10;
+ break;
+ case STILL:
+ // No speed
+ mDx = 0;
+ mDy = 0;
+ break;
+ default:
+ // TODO - Set movement direction and speed
+ // Limit movement speed in the x and y
+ // direction to [-3..3].
+ }
+ }
+
+ private void createScaledBitmap(Random r) {
+ if (speedMode != RANDOM) {
+ mScaledBitmapWidth = BITMAP_SIZE * 3;
+ } else {
+ //TODO - set scaled bitmap size in range [1..3] * BITMAP_SIZE
+ mScaledBitmapWidth = 0;
+ }
+ // TODO - create the scaled bitmap using size set above
+ mScaledBitmap = null;
+ }
+
+ // Start moving the BubbleView & updating the display
+ private void start() {
+
+ // Creates a WorkerThread
+ ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
+
+ // Execute the run() in Worker Thread every REFRESH_RATE
+ // milliseconds
+ // Save reference to this job in mMoverFuture
+ mMoverFuture = executor.scheduleWithFixedDelay(new Runnable() {
+ @Override
+ public void run() {
+ // TODO - implement movement logic.
+ // Each time this method is run the BubbleView should
+ // move one step. If the BubbleView exits the display,
+ // stop the BubbleView's Worker Thread.
+ // Otherwise, request that the BubbleView be redrawn.
+ }
+ }, 0, REFRESH_RATE, TimeUnit.MILLISECONDS);
+ }
+
+ private synchronized boolean intersects(float x, float y) {
+ // TODO - Return true if the BubbleView intersects position (x,y)
+ return false;
+ }
+
+ // Cancel the Bubble's movement
+ // Remove Bubble from mFrame
+ // Play pop sound if the BubbleView was popped
+ private void stop(final boolean popped) {
+ if (null != mMoverFuture && mMoverFuture.cancel(true)) {
+ // This work will be performed on the UI Thread
+ mFrame.post(new Runnable() {
+ @Override
+ public void run() {
+ // TODO - Remove the BubbleView from mFrame
+ if (popped) {
+ log("Pop!");
+ // TODO - If the bubble was popped by user,
+ // play the popping sound
+ }
+ log("Bubble removed from view!");
+ }
+ });
+ }
+ }
+
+ // Change the Bubble's speed and direction
+ private synchronized void deflect(float velocityX, float velocityY) {
+ log("velocity X:" + velocityX + " velocity Y:" + velocityY);
+ //TODO - set mDx and mDy to be the new velocities divided by the REFRESH_RATE
+ mDx = 0;
+ mDy = 0;
+ }
+
+ // Draw the Bubble at its current location
+ @Override
+ protected synchronized void onDraw(Canvas canvas) {
+ // TODO - save the canvas
+ // TODO - increase the rotation of the original image by mDRotate
+ // TODO Rotate the canvas by current rotation
+ // TODO - draw the bitmap at it's new location
+ // TODO - restore the canvas
+ }
+
+
+ private synchronized boolean moveWhileOnScreen() {
+ // TODO - Move the BubbleView
+ // Returns true if the BubbleView has exited the screen
+ return false;
+
+ }
+
+ private boolean isOutOfView() {
+ // TODO - Return true if the BubbleView has exited the screen
+ return false;
+ }
+ }
+
+ // Do not modify below here
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ super.onCreateOptionsMenu(menu);
+ menu.add(Menu.NONE, MENU_STILL, Menu.NONE, "Still Mode");
+ menu.add(Menu.NONE, MENU_SINGLE_SPEED, Menu.NONE, "Single Speed Mode");
+ menu.add(Menu.NONE, MENU_RANDOM_SPEED, Menu.NONE, "Random Speed Mode");
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case MENU_STILL:
+ speedMode = STILL;
+ return true;
+ case MENU_SINGLE_SPEED:
+ speedMode = SINGLE;
+ return true;
+ case MENU_RANDOM_SPEED:
+ speedMode = RANDOM;
+ return true;
+
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ private static void log (String message) {
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ Log.i(TAG,message);
+ }
+}
diff --git a/Android/07-Graphics/GraphicsLab/tests/AndroidManifest.xml b/Android/07-Graphics/GraphicsLab/tests/AndroidManifest.xml
new file mode 100644
index 0000000..d15bc69
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/tests/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- package name must be unique so suffix with "tests" so package loader doesn't ignore us -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="course.labs.GraphicsLab.tests"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <!-- We add an application tag here just so that we can indicate that
+ this package needs to link against the android.test library,
+ which is needed when building test cases. -->
+ <application>
+ <uses-library android:name="android.test.runner" />
+ </application>
+ <!--
+ This declares that this application uses the instrumentation test runner targeting
+ the package of course.labs.GraphicsLab. To run the tests use the command:
+ "adb shell am instrument -w course.labs.GraphicsLab.tests/android.test.InstrumentationTestRunner"
+ -->
+ <instrumentation android:name="android.test.InstrumentationTestRunner"
+ android:targetPackage="course.labs.GraphicsLab"
+ android:label="Tests for course.labs.GraphicsLab"/>
+</manifest>
diff --git a/Android/07-Graphics/GraphicsLab/tests/ant.properties b/Android/07-Graphics/GraphicsLab/tests/ant.properties
new file mode 100644
index 0000000..836edf0
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/tests/ant.properties
@@ -0,0 +1,18 @@
+# This file is used to override default values used by the Ant build system.
+#
+# This file must be checked into Version Control Systems, as it is
+# integral to the build system of your project.
+
+# This file is only used by the Ant script.
+
+# You can use this to override default values such as
+# 'source.dir' for the location of your java source folder and
+# 'out.dir' for the location of your output folder.
+
+# You can also use it define how the release builds are signed by declaring
+# the following properties:
+# 'key.store' for the location of your keystore and
+# 'key.alias' for the name of the key to use.
+# The password will be asked during the build when you use the 'release' target.
+
+tested.project.dir=../
diff --git a/Android/07-Graphics/GraphicsLab/tests/build.xml b/Android/07-Graphics/GraphicsLab/tests/build.xml
new file mode 100644
index 0000000..9644bd1
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/tests/build.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="GraphicsLabTest" default="help">
+
+ <!-- The local.properties file is created and updated by the 'android' tool.
+ It contains the path to the SDK. It should *NOT* be checked into
+ Version Control Systems. -->
+ <property file="local.properties" />
+
+ <!-- The ant.properties file can be created by you. It is only edited by the
+ 'android' tool to add properties to it.
+ This is the place to change some Ant specific build properties.
+ Here are some properties you may want to change/update:
+
+ source.dir
+ The name of the source directory. Default is 'src'.
+ out.dir
+ The name of the output directory. Default is 'bin'.
+
+ For other overridable properties, look at the beginning of the rules
+ files in the SDK, at tools/ant/build.xml
+
+ Properties related to the SDK location or the project target should
+ be updated using the 'android' tool with the 'update' action.
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems.
+
+ -->
+ <property file="ant.properties" />
+
+ <!-- if sdk.dir was not set from one of the property file, then
+ get it from the ANDROID_HOME env var.
+ This must be done before we load project.properties since
+ the proguard config can use sdk.dir -->
+ <property environment="env" />
+ <condition property="sdk.dir" value="${env.ANDROID_HOME}">
+ <isset property="env.ANDROID_HOME" />
+ </condition>
+
+ <!-- The project.properties file is created and updated by the 'android'
+ tool, as well as ADT.
+
+ This contains project specific properties such as project target, and library
+ dependencies. Lower level build properties are stored in ant.properties
+ (or in .classpath for Eclipse projects).
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems. -->
+ <loadproperties srcFile="project.properties" />
+
+ <!-- quick check on sdk.dir -->
+ <fail
+ message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
+ unless="sdk.dir"
+ />
+
+ <!--
+ Import per project custom build rules if present at the root of the project.
+ This is the place to put custom intermediary targets such as:
+ -pre-build
+ -pre-compile
+ -post-compile (This is typically used for code obfuscation.
+ Compiled code location: ${out.classes.absolute.dir}
+ If this is not done in place, override ${out.dex.input.absolute.dir})
+ -post-package
+ -post-build
+ -pre-clean
+ -->
+ <import file="custom_rules.xml" optional="true" />
+
+ <!-- Import the actual build file.
+
+ To customize existing targets, there are two options:
+ - Customize only one target:
+ - copy/paste the target into this file, *before* the
+ <import> task.
+ - customize it to your needs.
+ - Customize the whole content of build.xml
+ - copy/paste the content of the rules files (minus the top node)
+ into this file, replacing the <import> task.
+ - customize to your needs.
+
+ ***********************
+ ****** IMPORTANT ******
+ ***********************
+ In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
+ in order to avoid having your file be overridden by tools such as "android update project"
+ -->
+ <!-- version-tag: 1 -->
+ <import file="${sdk.dir}/tools/ant/build.xml" />
+
+</project>
diff --git a/Android/07-Graphics/GraphicsLab/tests/libs/robotium-solo-5.0.2-SNAPSHOT.jar b/Android/07-Graphics/GraphicsLab/tests/libs/robotium-solo-5.0.2-SNAPSHOT.jar
new file mode 100644
index 0000000..0afc307
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/tests/libs/robotium-solo-5.0.2-SNAPSHOT.jar
Binary files differ
diff --git a/Android/07-Graphics/GraphicsLab/tests/local.properties b/Android/07-Graphics/GraphicsLab/tests/local.properties
new file mode 100644
index 0000000..12a0114
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/tests/local.properties
@@ -0,0 +1,10 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must *NOT* be checked into Version Control Systems,
+# as it contains information specific to your local configuration.
+
+# location of the SDK. This is only used by Ant
+# For customization when using a Version Control System, please read the
+# header note.
+sdk.dir=/opt/android-sdk
diff --git a/Android/07-Graphics/GraphicsLab/tests/proguard-project.txt b/Android/07-Graphics/GraphicsLab/tests/proguard-project.txt
new file mode 100644
index 0000000..f2fe155
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/tests/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/Android/07-Graphics/GraphicsLab/tests/project.properties b/Android/07-Graphics/GraphicsLab/tests/project.properties
new file mode 100644
index 0000000..ce39f2d
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/tests/project.properties
@@ -0,0 +1,14 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-18
diff --git a/Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityFling.java b/Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityFling.java
new file mode 100644
index 0000000..4ef8d91
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityFling.java
@@ -0,0 +1,47 @@
+package course.labs.TouchLab.test;
+
+import course.labs.GraphicsLab.BubbleActivity;
+
+import com.robotium.solo.*;
+import android.test.ActivityInstrumentationTestCase2;
+
+
+public class BubbleActivityFling extends ActivityInstrumentationTestCase2<BubbleActivity> {
+ private Solo solo;
+
+ public BubbleActivityFling() {
+ super(BubbleActivity.class);
+ }
+
+ public void setUp() throws Exception {
+ solo = new Solo(getInstrumentation());
+ getActivity();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ solo.finishOpenedActivities();
+ }
+
+ public void testRun() {
+ // Wait for activity: 'course.labs.TouchLab.BubbleActivity'
+ solo.waitForActivity(course.labs.GraphicsLab.BubbleActivity.class, 2000);
+
+ solo.sleep(1000);
+
+ // Click on action bar item
+ solo.clickOnActionBarItem(0x1);
+
+ solo.sleep(1000);
+
+ // Click to create a bubble
+ solo.clickOnScreen(100, 100);
+
+ solo.sleep(1000);
+
+ // Fling
+ solo.drag(100, 500, 100, 500, 3);
+
+ solo.sleep(2000);
+ }
+}
diff --git a/Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityFloatOffScreen.java b/Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityFloatOffScreen.java
new file mode 100644
index 0000000..f8b1887
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityFloatOffScreen.java
@@ -0,0 +1,40 @@
+package course.labs.TouchLab.test;
+
+import course.labs.GraphicsLab.BubbleActivity;
+
+import com.robotium.solo.*;
+import android.test.ActivityInstrumentationTestCase2;
+
+
+public class BubbleActivityFloatOffScreen extends ActivityInstrumentationTestCase2<BubbleActivity> {
+ private Solo solo;
+
+ public BubbleActivityFloatOffScreen() {
+ super(BubbleActivity.class);
+ }
+
+ public void setUp() throws Exception {
+ solo = new Solo(getInstrumentation());
+ getActivity();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ solo.finishOpenedActivities();
+ }
+
+ public void testRun() {
+ // Wait for activity: 'course.labs.TouchLab.BubbleActivity'
+ solo.waitForActivity(course.labs.GraphicsLab.BubbleActivity.class, 2000);
+
+ // Click on action bar item
+ solo.clickOnActionBarItem(0x2);
+
+ solo.sleep(1000);
+
+ // Click to create a bubble
+ solo.clickOnScreen(500, 500);
+
+ solo.sleep(2000);
+ }
+}
diff --git a/Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityMultiple.java b/Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityMultiple.java
new file mode 100644
index 0000000..c525a4e
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityMultiple.java
@@ -0,0 +1,48 @@
+package course.labs.TouchLab.test;
+
+import course.labs.GraphicsLab.BubbleActivity;
+
+import com.robotium.solo.*;
+import android.test.ActivityInstrumentationTestCase2;
+
+
+public class BubbleActivityMultiple extends ActivityInstrumentationTestCase2<BubbleActivity> {
+ private Solo solo;
+
+ public BubbleActivityMultiple() {
+ super(BubbleActivity.class);
+ }
+
+ public void setUp() throws Exception {
+ solo = new Solo(getInstrumentation());
+ getActivity();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ solo.finishOpenedActivities();
+ }
+
+ public void testRun() {
+ // Wait for activity: 'course.labs.TouchLab.BubbleActivity'
+ solo.waitForActivity(course.labs.GraphicsLab.BubbleActivity.class, 2000);
+
+ solo.sleep(1000);
+
+ // Click on action bar item
+ solo.clickOnActionBarItem(0x1);
+
+ solo.sleep(1000);
+
+ // Click to create a bubble
+ solo.clickOnScreen(250, 250);
+
+ solo.sleep(1000);
+
+ // Click to remove the same bubble
+ solo.clickOnScreen(500, 500);
+
+ solo.sleep(1000);
+
+ }
+}
diff --git a/Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityPop.java b/Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityPop.java
new file mode 100644
index 0000000..29cf679
--- /dev/null
+++ b/Android/07-Graphics/GraphicsLab/tests/src/course/labs/GraphicsLab/BubbleActivityPop.java
@@ -0,0 +1,47 @@
+package course.labs.TouchLab.test;
+
+import course.labs.GraphicsLab.BubbleActivity;
+
+import com.robotium.solo.*;
+import android.test.ActivityInstrumentationTestCase2;
+
+
+public class BubbleActivityPop extends ActivityInstrumentationTestCase2<BubbleActivity> {
+ private Solo solo;
+
+ public BubbleActivityPop() {
+ super(BubbleActivity.class);
+ }
+
+ public void setUp() throws Exception {
+ solo = new Solo(getInstrumentation());
+ getActivity();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ solo.finishOpenedActivities();
+ }
+
+ public void testRun() {
+ // Wait for activity: 'course.labs.TouchLab.BubbleActivity'
+ solo.waitForActivity(course.labs.GraphicsLab.BubbleActivity.class, 2000);
+
+ solo.sleep(1000);
+
+ // Click on action bar item
+ solo.clickOnActionBarItem(0x1);
+
+ solo.sleep(1000);
+
+ // Click to create a bubble
+ solo.clickOnScreen(250, 250);
+
+ solo.sleep(1000);
+
+ // Click to remove the same bubble
+ solo.clickOnScreen(250, 250);
+
+ solo.sleep(1000);
+ }
+}
diff --git a/Android/07-Graphics/Lab-Graphics.pdf b/Android/07-Graphics/Lab-Graphics.pdf
new file mode 100644
index 0000000..db16af5
--- /dev/null
+++ b/Android/07-Graphics/Lab-Graphics.pdf
Binary files differ