diff --git a/Week_09_Services_and_wearables/.md_images/notification_phone.png b/Week_09_Services_and_wearables/.md_images/notification_phone.png
new file mode 100644
index 0000000..3381c7a
Binary files /dev/null and b/Week_09_Services_and_wearables/.md_images/notification_phone.png differ
diff --git a/Week_09_Services_and_wearables/MyWearables copy/.gitignore b/Week_09_Services_and_wearables/MyWearables copy/.gitignore
new file mode 100644
index 0000000..39fb081
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/.gitignore
@@ -0,0 +1,9 @@
+*.iml
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
+.externalNativeBuild
diff --git a/Week_09_Services_and_wearables/MyWearables copy/.idea/compiler.xml b/Week_09_Services_and_wearables/MyWearables copy/.idea/compiler.xml
new file mode 100644
index 0000000..32b8ce7
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/.idea/compiler.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables copy/.idea/copyright/profiles_settings.xml b/Week_09_Services_and_wearables/MyWearables copy/.idea/copyright/profiles_settings.xml
new file mode 100644
index 0000000..7d61b5c
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/.idea/copyright/profiles_settings.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables copy/.idea/gradle.xml b/Week_09_Services_and_wearables/MyWearables copy/.idea/gradle.xml
new file mode 100644
index 0000000..c3b1da4
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables copy/.idea/misc.xml b/Week_09_Services_and_wearables/MyWearables copy/.idea/misc.xml
new file mode 100644
index 0000000..184803f
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/.idea/misc.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables copy/.idea/modules.xml b/Week_09_Services_and_wearables/MyWearables copy/.idea/modules.xml
new file mode 100644
index 0000000..b94c244
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/.idea/modules.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables copy/.idea/runConfigurations.xml b/Week_09_Services_and_wearables/MyWearables copy/.idea/runConfigurations.xml
new file mode 100644
index 0000000..9b6e38d
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/.idea/runConfigurations.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/.gitignore b/Week_09_Services_and_wearables/MyWearables copy/app/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/build.gradle b/Week_09_Services_and_wearables/MyWearables copy/app/build.gradle
new file mode 100644
index 0000000..4c2cbe4
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/build.gradle
@@ -0,0 +1,29 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 24
+ buildToolsVersion "24.0.3"
+ defaultConfig {
+ applicationId "com.example.jianhuayang.mywearables"
+ minSdkVersion 15
+ targetSdkVersion 24
+ versionCode 1
+ versionName "1.0"
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
+ exclude group: 'com.android.support', module: 'support-annotations'
+ })
+ compile 'com.android.support:appcompat-v7:24.2.1'
+ testCompile 'junit:junit:4.12'
+}
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/proguard-rules.pro b/Week_09_Services_and_wearables/MyWearables copy/app/proguard-rules.pro
new file mode 100644
index 0000000..cce7213
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/jianhuayang/Library/Android/sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# 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/Week_09_Services_and_wearables/MyWearables copy/app/src/androidTest/java/com/example/jianhuayang/mywearables/ExampleInstrumentedTest.java b/Week_09_Services_and_wearables/MyWearables copy/app/src/androidTest/java/com/example/jianhuayang/mywearables/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..67c500d
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/src/androidTest/java/com/example/jianhuayang/mywearables/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.example.jianhuayang.mywearables;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumentation test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() throws Exception {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getTargetContext();
+
+ assertEquals("com.example.jianhuayang.mywearables", appContext.getPackageName());
+ }
+}
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/AndroidManifest.xml b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..fb4843c
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/AndroidManifest.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/java/com/example/jianhuayang/mywearables/CountingReceiver.java b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/java/com/example/jianhuayang/mywearables/CountingReceiver.java
new file mode 100644
index 0000000..3951ffc
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/java/com/example/jianhuayang/mywearables/CountingReceiver.java
@@ -0,0 +1,29 @@
+package com.example.jianhuayang.mywearables;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+/**
+ * Created by jianhuayang on 25/11/2016.
+ */
+
+public class CountingReceiver extends BroadcastReceiver {
+ public CountingReceiver() {
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d(MainActivity.DEBUG_KEY, "on receive");
+ String timeElapsed = intent.getStringExtra(CountingService.REPORT_KEY);
+ Log.d(MainActivity.DEBUG_KEY, "time elapsed: " + timeElapsed);
+
+ Intent intentNew = new Intent(context, DisplayActivity.class);
+ intentNew.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intentNew.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ intentNew.putExtra(CountingService.REPORT_KEY, timeElapsed);
+ context.startActivity(intentNew);
+ }
+
+}
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/java/com/example/jianhuayang/mywearables/CountingService.java b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/java/com/example/jianhuayang/mywearables/CountingService.java
new file mode 100644
index 0000000..39ae1a1
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/java/com/example/jianhuayang/mywearables/CountingService.java
@@ -0,0 +1,73 @@
+package com.example.jianhuayang.mywearables;
+
+import android.app.IntentService;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.support.v4.app.NotificationCompat;
+import android.support.v4.app.TaskStackBuilder;
+import android.util.Log;
+
+/**
+ * Created by jianhuayang on 25/11/2016.
+ */
+
+public class CountingService extends IntentService {
+
+ public static final String REPORT_KEY = "REPORT_KEY";
+ public static final String INTENT_KEY = "com.example.jianhuayang.mywearables.BROADCAST";
+
+ public CountingService() {
+ super("BackgroundCounting");
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+
+ int count = 0;
+ while (count < 10) {
+ synchronized (this) {
+ try {
+ wait(1000);
+ count++;
+ Log.d(MainActivity.DEBUG_KEY, Integer.toString(count));
+
+// send info using intent
+// Intent intentNew = new Intent(getBaseContext(), DisplayActivity.class);
+// intentNew.putExtra(REPORT_KEY, Integer.toString(count));
+// intentNew.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+// intentNew.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+// getBaseContext().startActivity(intentNew);
+
+// Intent localIntent = new Intent();
+// localIntent.setAction(INTENT_KEY);
+// localIntent.putExtra(REPORT_KEY, Integer.toString(count));
+// sendBroadcast(localIntent);
+// Log.d(MainActivity.DEBUG_KEY, "broadcasted");
+
+ NotificationCompat.Builder builder =
+ new NotificationCompat.Builder(this)
+ .setSmallIcon(R.mipmap.ic_launcher)
+ .setContentTitle("My Wearables")
+ .setContentText("Time elapsed: " + Integer.toString(count) + " seconds.");
+ Intent resultIntent = new Intent(this, DisplayActivity.class);
+ resultIntent.putExtra(REPORT_KEY, Integer.toString(count));
+
+ TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(this);
+ taskStackBuilder.addParentStack(DisplayActivity.class);
+ taskStackBuilder.addNextIntent(resultIntent);
+ PendingIntent resultPendingIntent =
+ taskStackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
+ builder.setContentIntent(resultPendingIntent);
+ NotificationManager notificationManager =
+ (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+ notificationManager.notify(123123, builder.build());
+ } catch (Exception e) {
+ }
+ }
+ }
+ Log.d(MainActivity.DEBUG_KEY, "service finished");
+
+ }
+}
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/java/com/example/jianhuayang/mywearables/DisplayActivity.java b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/java/com/example/jianhuayang/mywearables/DisplayActivity.java
new file mode 100644
index 0000000..0258027
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/java/com/example/jianhuayang/mywearables/DisplayActivity.java
@@ -0,0 +1,20 @@
+package com.example.jianhuayang.mywearables;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.widget.TextView;
+
+public class DisplayActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_display);
+ if (getIntent() != null) {
+ Intent intent = getIntent();
+ TextView textView = (TextView) findViewById(R.id.display);
+ textView.setText("Time elapsed (seconds):\n" + intent.getStringExtra(CountingService.REPORT_KEY));
+ }
+ }
+}
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/java/com/example/jianhuayang/mywearables/MainActivity.java b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/java/com/example/jianhuayang/mywearables/MainActivity.java
new file mode 100644
index 0000000..be541c5
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/java/com/example/jianhuayang/mywearables/MainActivity.java
@@ -0,0 +1,22 @@
+package com.example.jianhuayang.mywearables;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.view.View;
+
+public class MainActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ }
+
+ public static final String DEBUG_KEY = "DEBUG_KEY";
+ public void onStartClick(View v) {
+ startService(new Intent(this, CountingService.class));
+ Log.d(DEBUG_KEY, "service started");
+ }
+}
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/layout/activity_display.xml b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/layout/activity_display.xml
new file mode 100644
index 0000000..9d1e4d1
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/layout/activity_display.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/layout/activity_main.xml b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..5518d18
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/mipmap-hdpi/ic_launcher.png b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..cde69bc
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/mipmap-mdpi/ic_launcher.png b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c133a0c
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..324e72c
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..aee44e1
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/values-w820dp/dimens.xml b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..63fc816
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+
+
+ 64dp
+
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/values/colors.xml b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..3ab3e9c
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #3F51B5
+ #303F9F
+ #FF4081
+
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/values/dimens.xml b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..47c8224
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/values/dimens.xml
@@ -0,0 +1,5 @@
+
+
+ 16dp
+ 16dp
+
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/values/strings.xml b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..2570ada
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ My Wearables
+
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/values/styles.xml b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..5885930
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/src/main/res/values/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables copy/app/src/test/java/com/example/jianhuayang/mywearables/ExampleUnitTest.java b/Week_09_Services_and_wearables/MyWearables copy/app/src/test/java/com/example/jianhuayang/mywearables/ExampleUnitTest.java
new file mode 100644
index 0000000..02b74eb
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/app/src/test/java/com/example/jianhuayang/mywearables/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.example.jianhuayang.mywearables;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() throws Exception {
+ assertEquals(4, 2 + 2);
+ }
+}
diff --git a/Week_09_Services_and_wearables/MyWearables copy/build.gradle b/Week_09_Services_and_wearables/MyWearables copy/build.gradle
new file mode 100644
index 0000000..c20bca1
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/build.gradle
@@ -0,0 +1,23 @@
+// 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.2.2'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/Week_09_Services_and_wearables/MyWearables copy/gradle.properties b/Week_09_Services_and_wearables/MyWearables copy/gradle.properties
new file mode 100644
index 0000000..aac7c9b
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/gradle.properties
@@ -0,0 +1,17 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
diff --git a/Week_09_Services_and_wearables/MyWearables copy/gradle/wrapper/gradle-wrapper.jar b/Week_09_Services_and_wearables/MyWearables copy/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..13372ae
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables copy/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/Week_09_Services_and_wearables/MyWearables copy/gradle/wrapper/gradle-wrapper.properties b/Week_09_Services_and_wearables/MyWearables copy/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..04e285f
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Mon Dec 28 10:00:20 PST 2015
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
diff --git a/Week_09_Services_and_wearables/MyWearables copy/gradlew b/Week_09_Services_and_wearables/MyWearables copy/gradlew
new file mode 100644
index 0000000..9d82f78
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/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/Week_09_Services_and_wearables/MyWearables copy/gradlew.bat b/Week_09_Services_and_wearables/MyWearables copy/gradlew.bat
new file mode 100644
index 0000000..8a0b282
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/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/Week_09_Services_and_wearables/MyWearables copy/settings.gradle b/Week_09_Services_and_wearables/MyWearables copy/settings.gradle
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables copy/settings.gradle
@@ -0,0 +1 @@
+include ':app'
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/.gitignore b/Week_09_Services_and_wearables/MyWearables2 copy/.gitignore
new file mode 100644
index 0000000..39fb081
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/.gitignore
@@ -0,0 +1,9 @@
+*.iml
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
+.externalNativeBuild
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/.idea/compiler.xml b/Week_09_Services_and_wearables/MyWearables2 copy/.idea/compiler.xml
new file mode 100644
index 0000000..32b8ce7
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/.idea/compiler.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/.idea/copyright/profiles_settings.xml b/Week_09_Services_and_wearables/MyWearables2 copy/.idea/copyright/profiles_settings.xml
new file mode 100644
index 0000000..7d61b5c
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/.idea/copyright/profiles_settings.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/.idea/encodings.xml b/Week_09_Services_and_wearables/MyWearables2 copy/.idea/encodings.xml
new file mode 100644
index 0000000..33bc042
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/.idea/gradle.xml b/Week_09_Services_and_wearables/MyWearables2 copy/.idea/gradle.xml
new file mode 100644
index 0000000..901927a
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/.idea/gradle.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/.idea/misc.xml b/Week_09_Services_and_wearables/MyWearables2 copy/.idea/misc.xml
new file mode 100644
index 0000000..4c09cf7
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/.idea/misc.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/.idea/modules.xml b/Week_09_Services_and_wearables/MyWearables2 copy/.idea/modules.xml
new file mode 100644
index 0000000..6f71be4
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/.idea/modules.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/.idea/runConfigurations.xml b/Week_09_Services_and_wearables/MyWearables2 copy/.idea/runConfigurations.xml
new file mode 100644
index 0000000..9b6e38d
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/.idea/runConfigurations.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/build.gradle b/Week_09_Services_and_wearables/MyWearables2 copy/build.gradle
new file mode 100644
index 0000000..c20bca1
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/build.gradle
@@ -0,0 +1,23 @@
+// 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.2.2'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/gradle.properties b/Week_09_Services_and_wearables/MyWearables2 copy/gradle.properties
new file mode 100644
index 0000000..aac7c9b
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/gradle.properties
@@ -0,0 +1,17 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/gradle/wrapper/gradle-wrapper.jar b/Week_09_Services_and_wearables/MyWearables2 copy/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..13372ae
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables2 copy/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/gradle/wrapper/gradle-wrapper.properties b/Week_09_Services_and_wearables/MyWearables2 copy/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..04e285f
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Mon Dec 28 10:00:20 PST 2015
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/gradlew b/Week_09_Services_and_wearables/MyWearables2 copy/gradlew
new file mode 100644
index 0000000..9d82f78
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/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/Week_09_Services_and_wearables/MyWearables2 copy/gradlew.bat b/Week_09_Services_and_wearables/MyWearables2 copy/gradlew.bat
new file mode 100644
index 0000000..8a0b282
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/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/Week_09_Services_and_wearables/MyWearables2 copy/mobile/.gitignore b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/build.gradle b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/build.gradle
new file mode 100644
index 0000000..b73ebbf
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/build.gradle
@@ -0,0 +1,32 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 24
+ buildToolsVersion "24.0.3"
+ defaultConfig {
+ applicationId "com.example.jianhuayang.mywearables"
+ minSdkVersion 15
+ targetSdkVersion 24
+ versionCode 1
+ versionName "1.0"
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile fileTree(include: ['*.jar'], dir: 'libs')
+ androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
+ exclude group: 'com.android.support', module: 'support-annotations'
+ })
+ compile 'com.android.support:appcompat-v7:24.2.1'
+ testCompile 'junit:junit:4.12'
+ wearApp project(':wear')
+// compile 'com.google.android.gms:play-services:9.6.1'
+ compile 'com.google.android.gms:play-services:7.8.0'
+}
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/proguard-rules.pro b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/proguard-rules.pro
new file mode 100644
index 0000000..cce7213
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/jianhuayang/Library/Android/sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# 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/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/androidTest/java/com/example/jianhuayang/mywearables/ExampleInstrumentedTest.java b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/androidTest/java/com/example/jianhuayang/mywearables/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..67c500d
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/androidTest/java/com/example/jianhuayang/mywearables/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.example.jianhuayang.mywearables;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumentation test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() throws Exception {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getTargetContext();
+
+ assertEquals("com.example.jianhuayang.mywearables", appContext.getPackageName());
+ }
+}
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/AndroidManifest.xml b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..7050171
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/AndroidManifest.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/java/com/example/jianhuayang/mywearables/CountingReceiver.java b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/java/com/example/jianhuayang/mywearables/CountingReceiver.java
new file mode 100644
index 0000000..3951ffc
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/java/com/example/jianhuayang/mywearables/CountingReceiver.java
@@ -0,0 +1,29 @@
+package com.example.jianhuayang.mywearables;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+/**
+ * Created by jianhuayang on 25/11/2016.
+ */
+
+public class CountingReceiver extends BroadcastReceiver {
+ public CountingReceiver() {
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d(MainActivity.DEBUG_KEY, "on receive");
+ String timeElapsed = intent.getStringExtra(CountingService.REPORT_KEY);
+ Log.d(MainActivity.DEBUG_KEY, "time elapsed: " + timeElapsed);
+
+ Intent intentNew = new Intent(context, DisplayActivity.class);
+ intentNew.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intentNew.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ intentNew.putExtra(CountingService.REPORT_KEY, timeElapsed);
+ context.startActivity(intentNew);
+ }
+
+}
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/java/com/example/jianhuayang/mywearables/CountingService.java b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/java/com/example/jianhuayang/mywearables/CountingService.java
new file mode 100644
index 0000000..39ae1a1
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/java/com/example/jianhuayang/mywearables/CountingService.java
@@ -0,0 +1,73 @@
+package com.example.jianhuayang.mywearables;
+
+import android.app.IntentService;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.support.v4.app.NotificationCompat;
+import android.support.v4.app.TaskStackBuilder;
+import android.util.Log;
+
+/**
+ * Created by jianhuayang on 25/11/2016.
+ */
+
+public class CountingService extends IntentService {
+
+ public static final String REPORT_KEY = "REPORT_KEY";
+ public static final String INTENT_KEY = "com.example.jianhuayang.mywearables.BROADCAST";
+
+ public CountingService() {
+ super("BackgroundCounting");
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+
+ int count = 0;
+ while (count < 10) {
+ synchronized (this) {
+ try {
+ wait(1000);
+ count++;
+ Log.d(MainActivity.DEBUG_KEY, Integer.toString(count));
+
+// send info using intent
+// Intent intentNew = new Intent(getBaseContext(), DisplayActivity.class);
+// intentNew.putExtra(REPORT_KEY, Integer.toString(count));
+// intentNew.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+// intentNew.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+// getBaseContext().startActivity(intentNew);
+
+// Intent localIntent = new Intent();
+// localIntent.setAction(INTENT_KEY);
+// localIntent.putExtra(REPORT_KEY, Integer.toString(count));
+// sendBroadcast(localIntent);
+// Log.d(MainActivity.DEBUG_KEY, "broadcasted");
+
+ NotificationCompat.Builder builder =
+ new NotificationCompat.Builder(this)
+ .setSmallIcon(R.mipmap.ic_launcher)
+ .setContentTitle("My Wearables")
+ .setContentText("Time elapsed: " + Integer.toString(count) + " seconds.");
+ Intent resultIntent = new Intent(this, DisplayActivity.class);
+ resultIntent.putExtra(REPORT_KEY, Integer.toString(count));
+
+ TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(this);
+ taskStackBuilder.addParentStack(DisplayActivity.class);
+ taskStackBuilder.addNextIntent(resultIntent);
+ PendingIntent resultPendingIntent =
+ taskStackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
+ builder.setContentIntent(resultPendingIntent);
+ NotificationManager notificationManager =
+ (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+ notificationManager.notify(123123, builder.build());
+ } catch (Exception e) {
+ }
+ }
+ }
+ Log.d(MainActivity.DEBUG_KEY, "service finished");
+
+ }
+}
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/java/com/example/jianhuayang/mywearables/DisplayActivity.java b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/java/com/example/jianhuayang/mywearables/DisplayActivity.java
new file mode 100644
index 0000000..0258027
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/java/com/example/jianhuayang/mywearables/DisplayActivity.java
@@ -0,0 +1,20 @@
+package com.example.jianhuayang.mywearables;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.widget.TextView;
+
+public class DisplayActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_display);
+ if (getIntent() != null) {
+ Intent intent = getIntent();
+ TextView textView = (TextView) findViewById(R.id.display);
+ textView.setText("Time elapsed (seconds):\n" + intent.getStringExtra(CountingService.REPORT_KEY));
+ }
+ }
+}
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/java/com/example/jianhuayang/mywearables/ListenerService.java b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/java/com/example/jianhuayang/mywearables/ListenerService.java
new file mode 100644
index 0000000..b89dda6
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/java/com/example/jianhuayang/mywearables/ListenerService.java
@@ -0,0 +1,23 @@
+package com.example.jianhuayang.mywearables;
+
+import android.util.Log;
+import android.widget.Toast;
+
+import com.google.android.gms.wearable.MessageEvent;
+import com.google.android.gms.wearable.WearableListenerService;
+
+/**
+ * Created by jianhuayang on 25/11/2016.
+ */
+
+public class ListenerService extends WearableListenerService {
+ @Override
+ public void onMessageReceived(MessageEvent messageEvent) {
+ Log.d("DEBUG_KEY", "on received");
+ showToast(messageEvent.getPath());
+ }
+
+ private void showToast(String message) {
+ Toast.makeText(this, message, Toast.LENGTH_LONG).show();
+ }
+}
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/java/com/example/jianhuayang/mywearables/MainActivity.java b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/java/com/example/jianhuayang/mywearables/MainActivity.java
new file mode 100644
index 0000000..be541c5
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/java/com/example/jianhuayang/mywearables/MainActivity.java
@@ -0,0 +1,22 @@
+package com.example.jianhuayang.mywearables;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.view.View;
+
+public class MainActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ }
+
+ public static final String DEBUG_KEY = "DEBUG_KEY";
+ public void onStartClick(View v) {
+ startService(new Intent(this, CountingService.class));
+ Log.d(DEBUG_KEY, "service started");
+ }
+}
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/layout/activity_display.xml b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/layout/activity_display.xml
new file mode 100644
index 0000000..9d1e4d1
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/layout/activity_display.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/layout/activity_main.xml b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..5518d18
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/layout/activity_main.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/mipmap-hdpi/ic_launcher.png b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..cde69bc
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/mipmap-mdpi/ic_launcher.png b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c133a0c
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/mipmap-xhdpi/ic_launcher.png b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..324e72c
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..aee44e1
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/values-w820dp/dimens.xml b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..63fc816
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+
+
+ 64dp
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/values/colors.xml b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/values/colors.xml
new file mode 100644
index 0000000..3ab3e9c
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #3F51B5
+ #303F9F
+ #FF4081
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/values/dimens.xml b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..47c8224
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/values/dimens.xml
@@ -0,0 +1,5 @@
+
+
+ 16dp
+ 16dp
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/values/strings.xml b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/values/strings.xml
new file mode 100644
index 0000000..2570ada
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ My Wearables
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/values/styles.xml b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/values/styles.xml
new file mode 100644
index 0000000..5885930
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/main/res/values/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/test/java/com/example/jianhuayang/mywearables/ExampleUnitTest.java b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/test/java/com/example/jianhuayang/mywearables/ExampleUnitTest.java
new file mode 100644
index 0000000..02b74eb
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/mobile/src/test/java/com/example/jianhuayang/mywearables/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.example.jianhuayang.mywearables;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() throws Exception {
+ assertEquals(4, 2 + 2);
+ }
+}
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/settings.gradle b/Week_09_Services_and_wearables/MyWearables2 copy/settings.gradle
new file mode 100644
index 0000000..6a4e79f
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/settings.gradle
@@ -0,0 +1 @@
+include ':mobile', ':wear'
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/wear/.gitignore b/Week_09_Services_and_wearables/MyWearables2 copy/wear/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/wear/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/wear/build.gradle b/Week_09_Services_and_wearables/MyWearables2 copy/wear/build.gradle
new file mode 100644
index 0000000..56a86c0
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/wear/build.gradle
@@ -0,0 +1,29 @@
+apply plugin: 'com.android.application'
+
+
+android {
+ compileSdkVersion 24
+ buildToolsVersion "24.0.3"
+
+ defaultConfig {
+ applicationId "com.example.jianhuayang.mywearables"
+ minSdkVersion 21
+ targetSdkVersion 24
+ versionCode 1
+ versionName "1.0"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ compile 'com.google.android.support:wearable:2.0.0-alpha2'
+// compile 'com.google.android.gms:play-services-wearable:9.6.1'
+ compile 'com.google.android.wearable:wearable:2.0.0-alpha2'
+ compile 'com.google.android.gms:play-services-wearable:7.8.0'
+}
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/wear/proguard-rules.pro b/Week_09_Services_and_wearables/MyWearables2 copy/wear/proguard-rules.pro
new file mode 100644
index 0000000..cce7213
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/wear/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/jianhuayang/Library/Android/sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# 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/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/AndroidManifest.xml b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..b73b70d
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/AndroidManifest.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/java/com/example/jianhuayang/mywearables/MainActivity.java b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/java/com/example/jianhuayang/mywearables/MainActivity.java
new file mode 100644
index 0000000..69c9722
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/java/com/example/jianhuayang/mywearables/MainActivity.java
@@ -0,0 +1,144 @@
+package com.example.jianhuayang.mywearables;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.support.wearable.activity.WearableActivity;
+import android.support.wearable.view.BoxInsetLayout;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.google.android.gms.common.api.GoogleApiClient;
+import com.google.android.gms.wearable.Node;
+import com.google.android.gms.wearable.NodeApi;
+import com.google.android.gms.wearable.Wearable;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.concurrent.TimeUnit;
+
+public class MainActivity extends WearableActivity {
+
+ private static final SimpleDateFormat AMBIENT_DATE_FORMAT =
+ new SimpleDateFormat("HH:mm", Locale.US);
+
+ private BoxInsetLayout mContainerView;
+ private TextView mTextView;
+ private TextView mClockView;
+
+ private Button button;
+ private static final long CONNECTION_TIME_OUT_MS = 100;
+ private String message;
+ private GoogleApiClient client;
+ private String nodeId;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ setAmbientEnabled();
+
+ mContainerView = (BoxInsetLayout) findViewById(R.id.container);
+ mTextView = (TextView) findViewById(R.id.text);
+ mClockView = (TextView) findViewById(R.id.clock);
+
+ button = (Button) findViewById(R.id.send);
+ initApi();
+ new CountDownTimer(30000, 1000) {
+
+ public void onTick(long millisUntilFinished) {
+ message = "seconds remaining: " + millisUntilFinished / 1000;
+ mTextView.setText(message);
+ }
+
+ public void onFinish() {
+ mTextView.setText("done!");
+ }
+ }.start();
+ }
+
+ @Override
+ public void onEnterAmbient(Bundle ambientDetails) {
+ super.onEnterAmbient(ambientDetails);
+ updateDisplay();
+ }
+
+ @Override
+ public void onUpdateAmbient() {
+ super.onUpdateAmbient();
+ updateDisplay();
+ }
+
+ @Override
+ public void onExitAmbient() {
+ updateDisplay();
+ super.onExitAmbient();
+ }
+
+ private void updateDisplay() {
+ if (isAmbient()) {
+ mContainerView.setBackgroundColor(getResources().getColor(android.R.color.black));
+ mTextView.setTextColor(getResources().getColor(android.R.color.white));
+ mClockView.setVisibility(View.VISIBLE);
+ mClockView.setText(AMBIENT_DATE_FORMAT.format(new Date()));
+ button.setTextColor(getResources().getColor(android.R.color.white));
+ } else {
+ mContainerView.setBackground(null);
+ mTextView.setTextColor(getResources().getColor(android.R.color.black));
+ mClockView.setVisibility(View.GONE);
+ button.setTextColor(getResources().getColor(android.R.color.black));
+
+ }
+ }
+
+ private void initApi() {
+ client = getGoogleApiClient(this);
+ retrieveDeviceNode();
+ }
+
+ private GoogleApiClient getGoogleApiClient(Context context) {
+ return new GoogleApiClient.Builder(context)
+ .addApi(Wearable.API)
+ .build();
+ }
+
+ private void retrieveDeviceNode() {
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ client.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS);
+ NodeApi.GetConnectedNodesResult result =
+ Wearable.NodeApi.getConnectedNodes(client).await();
+ List nodes = result.getNodes();
+ Log.d("xxxx", Integer.toString(nodes.size()));
+ if (nodes.size() > 0) {
+ nodeId = nodes.get(0).getId();
+ Log.d("DEBUG_KEY", "size " + Integer.toString(nodes.size()));
+
+ Log.d("DEBUG_KEY", nodeId);
+ }
+ client.disconnect();
+ }
+ }).start();
+ }
+
+ public void onSendClick(View v) {
+ if (nodeId != null) {
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ Log.d("DEBUG_KEY", "on click");
+ client.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS);
+ Wearable.MessageApi.sendMessage(client, nodeId, message, null);
+ client.disconnect();
+ Log.d("DEBUG_KEY", "on click sent");
+
+ }
+ }).start();
+ }
+ }
+}
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/layout/activity_main.xml b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..872dd00
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/layout/activity_main.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/mipmap-hdpi/ic_launcher.png b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..cde69bc
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/mipmap-mdpi/ic_launcher.png b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c133a0c
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/mipmap-xhdpi/ic_launcher.png b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..324e72c
Binary files /dev/null and b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/values/strings.xml b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/values/strings.xml
new file mode 100644
index 0000000..d7b539d
--- /dev/null
+++ b/Week_09_Services_and_wearables/MyWearables2 copy/wear/src/main/res/values/strings.xml
@@ -0,0 +1,4 @@
+
+ My Wearables
+ Hello World!
+
diff --git a/Week_09_Services_and_wearables/README.md b/Week_09_Services_and_wearables/README.md
index 5b0851c..f478799 100644
--- a/Week_09_Services_and_wearables/README.md
+++ b/Week_09_Services_and_wearables/README.md
@@ -7,25 +7,26 @@ This week we look at Android wearables i.e. watches. There are mainly two differ
To finish this week's exercises, you'll need an Android watch, either real or virtual. In addition, you must have a real Android phone/tablet to connect the watch. An Android wear emulator is used for demo purposes in the lab sheets.
-> Be aware that it's not advisable to connect an emulated watch with an emulated phone. But there are workarounds for this, [check out discussions on Pairing Android and Wear emulators on Stack Overflow](http://stackoverflow.com/questions/25205888/pairing-android-and-wear-emulators) in case you don't have an Android phone.
-
-> Read news on [Top 10 Android Wear Apps and Faces](http://www.androidheadlines.com/2016/11/top-10-android-wear-apps-and-faces-november-2016-edition.html) from Android Headlines.
+> Be aware that it's not advisable to connect an emulated watch with an emulated phone.
+
+
## Lab 1 Notifications on Android wearables
-Suppose you're in a lecture and the lecturer hates it when you check Facebook messages on your phone from time to time, which is also not something you enjoy doing. A less awkward solution is to check it on your watch! That is how the notifications are delivered! Notifications delivered to your phone will automatically be displayed on your watch as well.
-![](http://images.en.yibada.com/data/images/full/38579/the-huawei-smartwatch-can-connect-to-a-4-3-android-phone.jpg)
+
+![](.md_images/notification_phone.png)
### Setting up an Android watch AVD
-Follow steps below to setup an Android watch AVD and connect to your phone.
+Android notifications delivered to your phone will be automatically displayed on your watch as well. Follow steps below to setup an Android watch AVD and connect to your phone.
1. Open your SDK Manager and make sure that you have at least one Android wear system image installed.
![](.md_images/sdk_wear.png)
- While your SDK Manager is open, verify that Google Play Services and Google Repository are both installed. These are needed for the 2nd lab.
+ While your SDK Manager is open, verify that Google Play Services and Google Repository are both installed. These are needed for the next lab.
![](.md_images/sdk_google.png)