diff --git a/Lab8_GraphicsLab/.gitignore b/Lab8_GraphicsLab/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..ceff37eff0e621e8f96607f26a6bced4727fb5a5 --- /dev/null +++ b/Lab8_GraphicsLab/.gitignore @@ -0,0 +1,39 @@ +# built application files +*.apk +*.ap_ + +# files for the dex VM +*.dex + +# Java class files +*.class + +# generated files +bin/ +gen/ + +# Local configuration file (sdk path, etc) +local.properties + +# Eclipse project files +.classpath +.settings + +# Proguard folder generated by Eclipse +proguard/ + +# Intellij project files +*.iml +*.ipr +*.iws +.idea +.idea/workspace.xml +.gradle +build/ +captures/ + +# Mac files +.DS_Store + +# Windows thumbnail db +Thumbs.db diff --git a/Lab8_GraphicsLab/GraphicsLabScreencast.mp4 b/Lab8_GraphicsLab/GraphicsLabScreencast.mp4 new file mode 100755 index 0000000000000000000000000000000000000000..2f4f4d26e35d2097777b8d3db402fe3f77108d2d Binary files /dev/null and b/Lab8_GraphicsLab/GraphicsLabScreencast.mp4 differ diff --git a/Lab8_GraphicsLab/Lab8_GraphicsLab.pdf b/Lab8_GraphicsLab/Lab8_GraphicsLab.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a48de829b7b7005a030f8db9b1364bdd7ef5ffa8 Binary files /dev/null and b/Lab8_GraphicsLab/Lab8_GraphicsLab.pdf differ diff --git a/Lab8_GraphicsLab/app/build.gradle b/Lab8_GraphicsLab/app/build.gradle new file mode 100644 index 0000000000000000000000000000000000000000..f3ebbfa4ebfc3c9589029369410352ed4046e7e5 --- /dev/null +++ b/Lab8_GraphicsLab/app/build.gradle @@ -0,0 +1,26 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 26 + buildToolsVersion "26.0.1" + + defaultConfig { + applicationId "course.labs.graphicslab" + minSdkVersion 21 + targetSdkVersion 26 + + testApplicationId "course.labs.graphicslab.tests" + testInstrumentationRunner "android.test.InstrumentationTestRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + } + } +} + +dependencies { + androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.6.3' +} diff --git a/Lab8_GraphicsLab/app/src/androidTest/java/course/labs/graphicslab/tests/BubbleActivityFloatOffScreen.java b/Lab8_GraphicsLab/app/src/androidTest/java/course/labs/graphicslab/tests/BubbleActivityFloatOffScreen.java new file mode 100644 index 0000000000000000000000000000000000000000..abe043b1d95a22ec396122675234bbb1033e1f1e --- /dev/null +++ b/Lab8_GraphicsLab/app/src/androidTest/java/course/labs/graphicslab/tests/BubbleActivityFloatOffScreen.java @@ -0,0 +1,63 @@ +package course.labs.graphicslab.tests; + +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() { + + int shortDelay = 250, delay = 2000; + + // Wait for activity: 'course.labs.TouchLab.BubbleActivity' + solo.waitForActivity(course.labs.graphicslab.BubbleActivity.class, + delay); + + // Click on action bar item + solo.clickOnMenuItem("Single Speed Mode"); + + // Click on action bar item + solo.clickOnMenuItem("Add a Bubble"); + + // Check whether bubble appears + boolean bubbleAppeared = solo.getCurrentViews( + course.labs.graphicslab.BubbleActivity.BubbleView.class).size() > 0; + for (int i = 0; i < 8 && !bubbleAppeared; i++) { + solo.sleep(shortDelay); + bubbleAppeared = solo.getCurrentViews( + course.labs.graphicslab.BubbleActivity.BubbleView.class) + .size() > 0; + } + + // Assert that a bubble was displayed + assertTrue("Bubble hasn't appeared", bubbleAppeared); + + solo.sleep(delay); + + // Assert that the bubble has left the screen + assertEquals( + "Bubble hasn't left the screen", + 0, + solo.getCurrentViews( + course.labs.graphicslab.BubbleActivity.BubbleView.class) + .size()); + + } +} diff --git a/Lab8_GraphicsLab/app/src/androidTest/java/course/labs/graphicslab/tests/BubbleActivityMultiple.java b/Lab8_GraphicsLab/app/src/androidTest/java/course/labs/graphicslab/tests/BubbleActivityMultiple.java new file mode 100644 index 0000000000000000000000000000000000000000..bb9cf604e4e97feb1c083877977f8671326b2fa3 --- /dev/null +++ b/Lab8_GraphicsLab/app/src/androidTest/java/course/labs/graphicslab/tests/BubbleActivityMultiple.java @@ -0,0 +1,63 @@ +package course.labs.graphicslab.tests; + +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() { + + int delay = 2000; + + // Wait for activity: 'course.labs.TouchLab.BubbleActivity' + solo.waitForActivity(course.labs.graphicslab.BubbleActivity.class, delay); + + // Set Still Mode + solo.clickOnMenuItem("Still Mode"); + + // Click on action bar item + solo.clickOnMenuItem("Add a Bubble"); + + solo.sleep(delay); + + // Assert that a bubble was displayed + assertEquals("Bubble hasn't appeared", 1, solo.getCurrentViews(course.labs.graphicslab.BubbleActivity.BubbleView.class).size()); + + // Click on action bar item + solo.clickOnMenuItem("Add a Bubble"); + + solo.sleep(delay); + + // Assert that a bubble was displayed + assertEquals("Second bubble hasn't appeared", 2, solo.getCurrentViews(course.labs.graphicslab.BubbleActivity.BubbleView.class).size()); + + solo.sleep(delay); + + // Give misbehaving bubbles a chance to move off screen + // Assert that there are two bubbles on the screen + assertEquals( + "There should be two bubbles on the screen", + 2, + solo.getCurrentViews( + course.labs.graphicslab.BubbleActivity.BubbleView.class) + .size()); + + } +} diff --git a/Lab8_GraphicsLab/app/src/androidTest/java/course/labs/graphicslab/tests/BubbleActivityPop.java b/Lab8_GraphicsLab/app/src/androidTest/java/course/labs/graphicslab/tests/BubbleActivityPop.java new file mode 100644 index 0000000000000000000000000000000000000000..edb25c9e845326fa685a987ca47a4bec812eb3a2 --- /dev/null +++ b/Lab8_GraphicsLab/app/src/androidTest/java/course/labs/graphicslab/tests/BubbleActivityPop.java @@ -0,0 +1,63 @@ +package course.labs.graphicslab.tests; + +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() { + + int delay = 2000; + + // Wait for activity: 'course.labs.TouchLab.BubbleActivity' + solo.waitForActivity(course.labs.graphicslab.BubbleActivity.class, + delay); + + // Set Still Mode + solo.clickOnMenuItem("Still Mode"); + + // Click on action bar item + solo.clickOnMenuItem("Add a Bubble"); + + solo.sleep(delay); + + // Assert that a bubble was displayed + assertEquals( + "Bubble hasn't appeared", + 1, + solo.getCurrentViews( + course.labs.graphicslab.BubbleActivity.BubbleView.class) + .size()); + + // Click on action bar item + solo.clickOnMenuItem("Delete a Bubble"); + + solo.sleep(delay); + + // Assert that there are no more bubbles + assertEquals( + "The bubble was not popped", + 0, + solo.getCurrentViews( + course.labs.graphicslab.BubbleActivity.BubbleView.class) + .size()); + + } +} diff --git a/Lab8_GraphicsLab/app/src/androidTest/res/.gitignore b/Lab8_GraphicsLab/app/src/androidTest/res/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Lab8_GraphicsLab/app/src/main/AndroidManifest.xml b/Lab8_GraphicsLab/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000000000000000000000000000000000..896fe6c02f37c131ab6edafdbc115ca1369e868d --- /dev/null +++ b/Lab8_GraphicsLab/app/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ +<?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:icon="@mipmap/icon" + android:label="@string/app_name" > + + <activity + android:name=".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> \ No newline at end of file diff --git a/Lab8_GraphicsLab/app/src/main/java/course/labs/graphicslab/BubbleActivity.java b/Lab8_GraphicsLab/app/src/main/java/course/labs/graphicslab/BubbleActivity.java new file mode 100755 index 0000000000000000000000000000000000000000..be8da93ead1da509082418a9b8ae70cdca52ec6d --- /dev/null +++ b/Lab8_GraphicsLab/app/src/main/java/course/labs/graphicslab/BubbleActivity.java @@ -0,0 +1,360 @@ +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.media.SoundPool.OnLoadCompleteListener; +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 String TAG = "Lab-Graphics"; + + // The Main view + private RelativeLayout mFrame; + + // Bubble image's bitmap + 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; + + @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 + + // TODO - load the sound from res/raw/bubble_pop.wav + + } + + @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(); + + } + } + + @Override + protected void onPause() { + // TODO - unload the sound resource and release the sound pool + + //TODO - set the sound pool to null + + super.onPause(); + } + + // BubbleView is a View that displays a bubble. + // This class handles animating, drawing, and popping amongst other actions. + // A new BubbleView is created for each bubble on the display + + public 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, mRadius, mRadiusSquared; + private long mRotate, mDRotate; + + BubbleView(Context context, float x, float y) { + super(context); + Log.i(TAG, "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); + + // Radius of the Bitmap + mRadius = mScaledBitmapWidth / 2; + mRadiusSquared = mRadius * mRadius; + + // Adjust position to center the bubble under user's finger + mXPos = x - mRadius; + mYPos = y - mRadius; + + // 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: + + mDx = 40; + mDy = 40; + 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] pixels per movement. + + + + } + } + + private void createScaledBitmap(Random r) { + + if (speedMode != RANDOM) { + mScaledBitmapWidth = BITMAP_SIZE * 3; + } else { + + // TODO - set scaled bitmap size in range [1..3] * BITMAP_SIZE + + } + + // TODO - create the scaled bitmap using size set above + + } + + // 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); + } + + // Cancel the Bubble's movement + // Remove Bubble from mFrame + // Play pop sound if the BubbleView was popped + + private void stop(final boolean wasPopped) { + + if (null != mMoverFuture) { + + if (!mMoverFuture.isDone()) { + 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 + + + // TODO - If the bubble was popped by user, + // play the popping sound + + Log.i(TAG, "Bubble removed from view!"); + } + }); + } + } + + // 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 + // Hint - Rotate around the bubble's center, not its position + + + + // TODO - draw the bitmap at it's new location + + // TODO - restore the canvas + + } + + // Returns true if the BubbleView is still on the screen after the move + // operation + private synchronized boolean moveWhileOnScreen() { + + // TODO - Move the BubbleView + + + return isOutOfView(); + + } + + // Return true if the BubbleView is still on the screen after the move + // operation + private boolean isOutOfView() { + + // TODO - Return true if the BubbleView is still on the screen after + // the move operation + + return false; + + } + } + + @Override + public void onBackPressed() { + openOptionsMenu(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + + getMenuInflater().inflate(R.menu.menu, menu); + + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // TODO- Handle addition and deletion of bubbles from options menu + // Added bubbles should be given random locations. + // The bubble to delete is the most recently added bubble + // that is still in the frame. + + // Hint: You can get all Views in mFrame using the + // ViewGroup.getChildCount() method + switch (item.getItemId()) { + case R.id.menu_add_bubble: + + return true; + case R.id.menu_delete_bubble: + + return true; + case R.id.menu_still_mode: + speedMode = STILL; + return true; + case R.id.menu_single_speed: + speedMode = SINGLE; + return true; + case R.id.menu_random_mode: + speedMode = RANDOM; + return true; + case R.id.quit: + exitRequested(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + private void exitRequested() { + super.onBackPressed(); + } +} \ No newline at end of file diff --git a/Lab8_GraphicsLab/app/src/main/res/drawable/b128.png b/Lab8_GraphicsLab/app/src/main/res/drawable/b128.png new file mode 100644 index 0000000000000000000000000000000000000000..7845514160501a2c864bf1386154b2280e1332cd Binary files /dev/null and b/Lab8_GraphicsLab/app/src/main/res/drawable/b128.png differ diff --git a/Lab8_GraphicsLab/app/src/main/res/drawable/b64.png b/Lab8_GraphicsLab/app/src/main/res/drawable/b64.png new file mode 100644 index 0000000000000000000000000000000000000000..7101a2580a251dde3fce5fbd6867a3fc5cf48222 Binary files /dev/null and b/Lab8_GraphicsLab/app/src/main/res/drawable/b64.png differ diff --git a/Lab8_GraphicsLab/app/src/main/res/layout/main.xml b/Lab8_GraphicsLab/app/src/main/res/layout/main.xml new file mode 100644 index 0000000000000000000000000000000000000000..363f5813cfa28da30cb1b227c305602362ff4962 --- /dev/null +++ b/Lab8_GraphicsLab/app/src/main/res/layout/main.xml @@ -0,0 +1,8 @@ +<?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> \ No newline at end of file diff --git a/Lab8_GraphicsLab/app/src/main/res/menu/menu.xml b/Lab8_GraphicsLab/app/src/main/res/menu/menu.xml new file mode 100644 index 0000000000000000000000000000000000000000..23678d87e061c2123bfac2bc3136a3770f456154 --- /dev/null +++ b/Lab8_GraphicsLab/app/src/main/res/menu/menu.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android" > + <item android:id="@+id/menu_add_bubble" android:title="@string/add_bubble_string"></item> + <item android:id="@+id/menu_delete_bubble" android:title="@string/delete_bubble_string"></item> + <item android:id="@+id/menu_still_mode" android:title="@string/still_mode_string"></item> + <item android:id="@+id/menu_single_speed" android:title="@string/single_speed_mode_string"></item> + <item android:id="@+id/menu_random_mode" android:title="@string/random_speed_mode_string"></item> + <item android:id="@+id/quit" android:title="@string/quit_string"></item> +</menu> diff --git a/Lab8_GraphicsLab/app/src/main/res/mipmap-hdpi/icon.png b/Lab8_GraphicsLab/app/src/main/res/mipmap-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 Binary files /dev/null and b/Lab8_GraphicsLab/app/src/main/res/mipmap-hdpi/icon.png differ diff --git a/Lab8_GraphicsLab/app/src/main/res/mipmap-ldpi/icon.png b/Lab8_GraphicsLab/app/src/main/res/mipmap-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c Binary files /dev/null and b/Lab8_GraphicsLab/app/src/main/res/mipmap-ldpi/icon.png differ diff --git a/Lab8_GraphicsLab/app/src/main/res/mipmap-mdpi/icon.png b/Lab8_GraphicsLab/app/src/main/res/mipmap-mdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a07c69fa5a0f4da5d5efe96eea12a543154dbab6 Binary files /dev/null and b/Lab8_GraphicsLab/app/src/main/res/mipmap-mdpi/icon.png differ diff --git a/Lab8_GraphicsLab/app/src/main/res/raw/bubble_pop.wav b/Lab8_GraphicsLab/app/src/main/res/raw/bubble_pop.wav new file mode 100644 index 0000000000000000000000000000000000000000..50886e247e01f246e57f388ee4b15f66c47979fb Binary files /dev/null and b/Lab8_GraphicsLab/app/src/main/res/raw/bubble_pop.wav differ diff --git a/Lab8_GraphicsLab/app/src/main/res/values/strings.xml b/Lab8_GraphicsLab/app/src/main/res/values/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..e5534cfe6c420bc4cebd5e34c05324f2164e0395 --- /dev/null +++ b/Lab8_GraphicsLab/app/src/main/res/values/strings.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">GraphicsLab</string> + <string name="still_mode_string">Still Mode</string> + <string name="single_speed_mode_string">Single Speed Mode</string> + <string name="random_speed_mode_string">Random Speed Mode</string> + <string name="quit_string">Quit</string> + <string name="add_bubble_string">Add a Bubble</string> + <string name="delete_bubble_string">Delete a Bubble</string> +</resources> diff --git a/Lab8_GraphicsLab/build.gradle b/Lab8_GraphicsLab/build.gradle new file mode 100644 index 0000000000000000000000000000000000000000..8674409cc64f09406fc5792870881826b40393f3 --- /dev/null +++ b/Lab8_GraphicsLab/build.gradle @@ -0,0 +1,15 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:2.3.3' + } +} + +allprojects { + repositories { + jcenter() + } +} diff --git a/Lab8_GraphicsLab/gradle/wrapper/gradle-wrapper.jar b/Lab8_GraphicsLab/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..13372aef5e24af05341d49695ee84e5f9b594659 Binary files /dev/null and b/Lab8_GraphicsLab/gradle/wrapper/gradle-wrapper.jar differ diff --git a/Lab8_GraphicsLab/gradle/wrapper/gradle-wrapper.properties b/Lab8_GraphicsLab/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000000000000000000000000000000000..77019e91a818c450a54e5e9e7fd1080c8b37146a --- /dev/null +++ b/Lab8_GraphicsLab/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Sep 27 23:08:09 EDT 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/Lab8_GraphicsLab/gradlew b/Lab8_GraphicsLab/gradlew new file mode 100755 index 0000000000000000000000000000000000000000..9d82f78915133e1c35a6ea51252590fb38efac2f --- /dev/null +++ b/Lab8_GraphicsLab/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/Lab8_GraphicsLab/gradlew.bat b/Lab8_GraphicsLab/gradlew.bat new file mode 100644 index 0000000000000000000000000000000000000000..8a0b282aa6885fb573c106b3551f7275c5f17e8e --- /dev/null +++ b/Lab8_GraphicsLab/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/Lab8_GraphicsLab/settings.gradle b/Lab8_GraphicsLab/settings.gradle new file mode 100644 index 0000000000000000000000000000000000000000..e7b4def49cb53d9aa04228dd3edb14c9e635e003 --- /dev/null +++ b/Lab8_GraphicsLab/settings.gradle @@ -0,0 +1 @@ +include ':app'