Initial version

This commit is contained in:
2015-06-20 13:59:54 -04:00
commit f414239a71
47 changed files with 1773 additions and 0 deletions

1
wear/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/build

28
wear/build.gradle Normal file
View File

@@ -0,0 +1,28 @@
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "org.isoron.simpletimer"
minSdkVersion 21
targetSdkVersion 22
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:1.2.0'
compile 'com.google.android.gms:play-services-wearable:7.5.0'
provided 'com.google.android.wearable:wearable:1.0.0'
}

17
wear/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,17 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /opt/android-sdk-update-manager/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 *;
#}

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="org.isoron.simpletimer"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-feature android:name="android.hardware.type.watch"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name_simple"
android:theme="@android:style/Theme.DeviceDefault">
<activity
android:name=".MainActivity"
android:label="@string/app_name_simple"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<uses-library
android:name="com.google.android.wearable"
android:required="false"/>
</application>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,12 @@
package org.isoron.base;
import android.os.Bundle;
public interface AmbientModeListener
{
public void onEnterAmbient(Bundle ambientDetails);
public void onExitAmbient();
public void onUpdateAmbient();
}

View File

@@ -0,0 +1,191 @@
package org.isoron.simpletimer;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.wearable.activity.WearableActivity;
import android.support.wearable.view.WatchViewStub;
import android.util.Log;
import org.isoron.base.AmbientModeListener;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends WearableActivity
{
private static final String TAG = "MainActivity";
AmbientModeListener ambientModeListener = null;
TimerView timerView;
private AlarmManager ambientModeAlarmManager;
private PendingIntent ambientModePendingIntent;
private Timer timer;
private boolean isActive = false;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setAmbientEnabled();
ambientModeAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent ambientModeIntent = new Intent(getApplicationContext(), MainActivity.class);
ambientModeIntent.setAction("REFRESH");
ambientModePendingIntent =
PendingIntent.getActivity(getApplicationContext(), 0, ambientModeIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener()
{
@Override
public void onLayoutInflated(WatchViewStub stub)
{
timerView = (TimerView) findViewById(R.id.timerview);
setAmbientModeListener(timerView);
startTimer();
refresh();
}
});
}
private void startTimer()
{
if (timer != null) timer.cancel();
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask()
{
@Override
public void run()
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
refresh();
}
});
}
}, 0, 1000);
}
private void stopTimer()
{
if (timer != null) timer.cancel();
}
private void refresh()
{
Log.d(TAG, "refresh() ambient? " + isAmbient() + " active? " + isActive);
if (timerView != null)
{
timerView.tick();
timerView.invalidate();
}
if (isAmbient() || !isActive)
{
long delay = -1;
if (timerView != null)
{
if (isAmbient()) delay = timerView.getMillisecondsUntilNextMinute();
else delay = timerView.getRemainingTime();
}
if (delay > 0)
{
Log.d(TAG, "sleeping for " + delay + " milliseconds (" + delay / 1000 / 60.0 + " minutes)");
ambientModeAlarmManager.setExact(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis() + delay + 100, ambientModePendingIntent);
}
}
}
@Override
public void onEnterAmbient(Bundle ambientDetails)
{
super.onEnterAmbient(ambientDetails);
if (ambientModeListener != null) ambientModeListener.onEnterAmbient(ambientDetails);
stopTimer();
refresh();
}
@Override
public void onExitAmbient()
{
super.onExitAmbient();
if (ambientModeListener != null) ambientModeListener.onExitAmbient();
startTimer();
refresh();
}
@Override
public void onUpdateAmbient()
{
Log.d(TAG, "onUpdateAmbient()");
super.onUpdateAmbient();
if (ambientModeListener != null) ambientModeListener.onUpdateAmbient();
}
public void setAmbientModeListener(AmbientModeListener ambientModeListener)
{
this.ambientModeListener = ambientModeListener;
}
@Override
protected void onNewIntent(Intent intent)
{
super.onNewIntent(intent);
setIntent(intent);
Log.d(TAG, "onNewIntent: " + intent.getAction());
refresh();
}
@Override
protected void onPause()
{
super.onPause();
Log.d(TAG, "onPause()");
isActive = false;
stopTimer();
refresh();
}
@Override
protected void onStop()
{
super.onStop();
Log.d(TAG, "onStop()");
}
@Override
protected void onResume()
{
super.onResume();
Log.d(TAG, "onResume()");
isActive = true;
if(!isAmbient()) startTimer();
refresh();
}
@Override
protected void onRestart()
{
super.onRestart();
Log.d(TAG, "onRestart()");
}
}

View File

@@ -0,0 +1,435 @@
package org.isoron.simpletimer;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.Vibrator;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import org.isoron.base.AmbientModeListener;
import java.util.Timer;
public class TimerView extends View implements AmbientModeListener
{
private static final String TAG = "TimerView";
private final int primaryColor;
private final int secondaryColor;
private final int tertiaryColor;
private final int backgroundColor;
private Paint paint;
private Paint paintInteractive;
private Paint paintAmbient;
private Paint pClockInteractive;
private int width;
private int height;
private int fontHeight;
private int size;
private Timer timer;
private final Activity activity;
private Vibrator vibrator;
private int step;
private boolean isRunning;
private long totalTime;
private long remainingTime;
private long lastTick;
private int brightnessCountdown;
private boolean isBright = false;
private boolean hasLongPressed;
private boolean hasMoved = false;
private boolean ambientMode = false;
private final int DEFAULT_TIME = 5 * 60 * 1000;
private final int GRANULARITY = 60 * 1000;
private final int BRIGHTNESS_LENGTH = 5;
private final long VIBRATION_FINISH[] = {0, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250};
private RectF screenRect;
public TimerView(Context ctx, AttributeSet attrs)
{
super(ctx, attrs);
this.activity = (Activity) ctx;
step = 0;
isRunning = false;
totalTime = DEFAULT_TIME;
remainingTime = totalTime;
hasMoved = false;
hasLongPressed = false;
paintInteractive = new Paint();
paintInteractive.setColor(Color.parseColor("#B2FF59"));
paintInteractive.setStyle(Paint.Style.FILL);
paintInteractive.setAntiAlias(true);
paintInteractive.setTextAlign(Paint.Align.CENTER);
pClockInteractive = new Paint();
pClockInteractive.setColor(Color.parseColor("#9E9E9E"));
pClockInteractive.setStyle(Paint.Style.FILL);
pClockInteractive.setAntiAlias(true);
pClockInteractive.setTextAlign(Paint.Align.CENTER);
paintAmbient = new Paint();
paintAmbient.setColor(Color.WHITE);
paintAmbient.setStyle(Paint.Style.FILL_AND_STROKE);
paintAmbient.setAntiAlias(false);
paintAmbient.setTextAlign(Paint.Align.CENTER);
primaryColor = Color.parseColor("#0288d1");
secondaryColor = Color.WHITE;
tertiaryColor = mixColors(primaryColor, Color.BLACK, 0.37f);
backgroundColor = Color.BLACK;
vibrator = (Vibrator) activity.getSystemService(Activity.VIBRATOR_SERVICE);
setLongClickable(true);
setOnLongClickListener(new View.OnLongClickListener()
{
@Override
public boolean onLongClick(View v)
{
if (hasMoved) return false;
highBrightness();
remainingTime = totalTime;
vibrator.vibrate(250);
hasLongPressed = true;
isRunning = false;
invalidate();
return true;
}
});
setOnTouchListener(new View.OnTouchListener()
{
private float prevY;
private long prevTime;
@Override
public boolean onTouch(View v, MotionEvent event)
{
int box = 20;
highBrightness();
switch (event.getAction() & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
prevY = event.getY();
prevTime = remainingTime;
hasMoved = false;
hasLongPressed = false;
break;
case MotionEvent.ACTION_MOVE:
float dy = (event.getY() - prevY) / box;
if (Math.abs(dy) < 1) break;
hasMoved = true;
if (isRunning) break;
totalTime = Math.max(GRANULARITY, prevTime - (long) dy * GRANULARITY);
totalTime = (totalTime / GRANULARITY) * GRANULARITY;
remainingTime = totalTime;
step = 1;
invalidate();
break;
case MotionEvent.ACTION_UP:
if (hasMoved) break;
if (hasLongPressed) break;
isRunning = !isRunning;
vibrator.vibrate(80);
invalidate();
break;
}
return false;
}
});
highBrightness();
}
public void tick()
{
Log.d(TAG, "tick()");
long currentTime = System.currentTimeMillis();
step = (step + 1) % 2;
if (brightnessCountdown-- == 0) lowBrightness();
if (remainingTime <= 0)
{
isRunning = false;
}
if (isRunning)
{
remainingTime -= (currentTime - lastTick);
if (remainingTime <= 0)
{
step = 1;
isRunning = false;
remainingTime = totalTime;
vibrator.vibrate(VIBRATION_FINISH, -1);
PowerManager powerManager =
(PowerManager) activity.getSystemService(Activity.POWER_SERVICE);
PowerManager.WakeLock mWakeLock = powerManager.newWakeLock(
(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP), "MyWakelockTag");
mWakeLock.acquire();
highBrightness();
}
}
lastTick = currentTime;
}
public long getMillisecondsUntilNextMinute()
{
if (!isRunning) return -1;
return remainingTime % 60000;
}
public long getRemainingTime()
{
if(!isRunning) return -1;
return remainingTime;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
width = w;
height = h;
size = Math.min(width, height);
paintInteractive.setTextSize(size * 0.2f);
paintAmbient.setTextSize(size * 0.15f);
pClockInteractive.setTextSize(size * 0.08f);
Rect bounds = new Rect();
paintInteractive.getTextBounds("00:00", 0, 1, bounds);
fontHeight = bounds.height();
screenRect = new RectF(0, 0, width, height);
}
@Override
protected void onDraw(Canvas canvas)
{
// Log.d(TAG, "onDraw()");
paint = paintInteractive;
if (ambientMode) paint = paintAmbient;
clearBackground(canvas);
drawOuterRing(canvas);
drawInnerRing(canvas);
drawTimer(canvas);
drawCurrentTime(canvas);
}
private void drawCurrentTime(Canvas canvas)
{
}
private void drawTimer(Canvas canvas)
{
if (ambientMode) paint.setColor(Color.WHITE);
else paint.setColor(primaryColor);
long minutes;
if (ambientMode)
{
minutes = (long) (60 * Math.ceil(remainingTime / 1000 / 60.0));
paint.setTextSize(size * 0.25f);
canvas.drawText(String.format("%d", minutes / 60), screenRect.centerX(),
screenRect.centerY() + (int) (fontHeight * 0.3), paint);
}
else
{
minutes = (long) (60 * Math.floor(remainingTime / 1000 / 60.0));
long seconds = remainingTime / 1000 % 60;
if (isRunning || step == 1)
{
paint.setTextSize(size * 0.25f);
float minutesWidth = paint.measureText(String.format("%d", minutes / 60));
paint.setTextSize(size * 0.15f);
float secondsWidth = paint.measureText(String.format("%02d", minutes / 60));
float totalWidth = minutesWidth + secondsWidth;
paint.setTextSize(size * 0.25f);
canvas.drawText(String.format("%d", minutes / 60),
screenRect.centerX() + minutesWidth / 2 - totalWidth / 2,
screenRect.centerY() + (int) (fontHeight * 0.3), paint);
paint.setTextSize(size * 0.15f);
paint.setColor(secondaryColor);
canvas.drawText(String.format("%02d", seconds),
screenRect.centerX() + minutesWidth + secondsWidth / 2 + size * 0.025f -
totalWidth / 2, screenRect.centerY() + (int) (fontHeight * 0.3),
paint);
}
}
paint.setTextSize(size * 0.08f);
if (!ambientMode) paint.setColor(secondaryColor);
String text = "minutes";
if (minutes / 60 == 1) text = "minute";
canvas.drawText(text, screenRect.centerX(), screenRect.centerY() + (int) (fontHeight * 1.0),
paint);
}
private void drawInnerRing(Canvas canvas)
{
int totalPieces = (int) Math.min(16, totalTime / 60000);
int remainingPieces = (int) Math.ceil(remainingTime / 60000.0);
float pieceAngle = 360.0f / totalPieces;
float gap = 1.0f;
RectF r = new RectF(screenRect);
r.inset(size * 0.1f, size * 0.1f);
if (ambientMode) paint.setColor(Color.WHITE);
else paint.setColor(primaryColor);
for (int i = 0; i < remainingPieces; i++)
canvas.drawArc(r, -90 - (i + 1) * pieceAngle, pieceAngle - gap, true, paint);
// canvas.drawArc(r, -90.0f, -360.0f * (remainingTime / 1000) / (totalTime / 1000), true, paint);
r.inset(size * 0.015f, size * 0.015f);
paint.setColor(backgroundColor);
canvas.drawArc(r, 0, 360, true, paint);
}
private void drawOuterRing(Canvas canvas)
{
if (ambientMode) return;
int totalPieces = 60 / 5;
float remainingPercentage = (remainingTime / 1000 % 60) / 60.0f;
int remainingPieces = (int) Math.ceil(remainingPercentage * totalPieces);
if (remainingPieces == 0) remainingPieces = totalPieces;
float pieceAngle = 360.0f / totalPieces;
float gap = 0.5f;
RectF r = new RectF(screenRect);
r.inset(size * 0.075f, size * 0.075f);
paint.setColor(tertiaryColor);
for (int i = 0; i < remainingPieces; i++)
canvas.drawArc(r, -90 - (i + 1) * pieceAngle, pieceAngle - gap, true, paint);
r.inset(size * 0.015f, size * 0.015f);
paint.setColor(backgroundColor);
canvas.drawArc(r, 0, 360, true, paint);
}
private void clearBackground(Canvas canvas)
{
paint.setColor(backgroundColor);
canvas.drawRect(screenRect, paint);
}
@Override
public void onEnterAmbient(Bundle ambientDetails)
{
ambientMode = true;
Log.d(TAG, "onEnterAmbient()");
}
@Override
public void onExitAmbient()
{
ambientMode = false;
highBrightness();
Log.d(TAG, "onExitAmbient()");
}
@Override
public void onUpdateAmbient()
{
Log.d(TAG, "onUpdateAmbient()");
}
public static int mixColors(int color1, int color2, float amount)
{
final byte ALPHA_CHANNEL = 24;
final byte RED_CHANNEL = 16;
final byte GREEN_CHANNEL = 8;
final byte BLUE_CHANNEL = 0;
final float inverseAmount = 1.0f - amount;
int a = ((int) (((float) (color1 >> ALPHA_CHANNEL & 0xff) * amount) +
((float) (color2 >> ALPHA_CHANNEL & 0xff) * inverseAmount))) & 0xff;
int r = ((int) (((float) (color1 >> RED_CHANNEL & 0xff) * amount) +
((float) (color2 >> RED_CHANNEL & 0xff) * inverseAmount))) & 0xff;
int g = ((int) (((float) (color1 >> GREEN_CHANNEL & 0xff) * amount) +
((float) (color2 >> GREEN_CHANNEL & 0xff) * inverseAmount))) & 0xff;
int b = ((int) (((float) (color1 & 0xff) * amount) +
((float) (color2 & 0xff) * inverseAmount))) & 0xff;
return a << ALPHA_CHANNEL | r << RED_CHANNEL | g << GREEN_CHANNEL | b << BLUE_CHANNEL;
}
public void changeBrightness(float brightness)
{
WindowManager.LayoutParams layout = activity.getWindow().getAttributes();
layout.screenBrightness = brightness;
activity.getWindow().setAttributes(layout);
}
public void lowBrightness()
{
if (!isBright) return;
Log.d(TAG, "lowBrightness()");
changeBrightness(0F);
isBright = false;
}
public void highBrightness()
{
brightnessCountdown = BRIGHTNESS_LENGTH;
if (isBright) return;
Log.d(TAG, "highBrightness()");
changeBrightness(0.8F);
isBright = true;
}
}

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.wearable.view.WatchViewStub
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/watch_view_stub"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:rectLayout="@layout/rect_activity_main"
app:roundLayout="@layout/round_activity_main"
tools:context=".MainActivity"
tools:deviceIds="wear">
</android.support.wearable.view.WatchViewStub>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"
tools:deviceIds="wear_square">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_square"/>
</LinearLayout>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
tools:deviceIds="wear_round">
<org.isoron.simpletimer.TimerView
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/timerview"
/>
</RelativeLayout>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -0,0 +1,6 @@
<resources>
<string name="app_name">Simple Timer</string>
<string name="app_name_simple">Timer</string>
<string name="hello_round">Hello Round World!</string>
<string name="hello_square">Hello Square World!</string>
</resources>

102
wear/wear.iml Normal file
View File

@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id=":wear" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$USER_HOME$/Android/SimpleTimer" external.system.id="GRADLE" external.system.module.group="SimpleTimer" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="android-gradle" name="Android-Gradle">
<configuration>
<option name="GRADLE_PROJECT_PATH" value=":wear" />
</configuration>
</facet>
<facet type="android" name="Android">
<configuration>
<option name="SELECTED_BUILD_VARIANT" value="debug" />
<option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
<option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugAndroidTest" />
<option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileDebugAndroidTestSources" />
<option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugAndroidTestSources" />
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
<output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/debug" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/recyclerview-v7/22.0.0/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/22.0.0/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-base/7.5.0/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-wearable/7.5.0/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.support/wearable/1.2.0/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content>
<orderEntry type="jdk" jdkName="Android API 22 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" exported="" name="support-v4-22.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-base-7.5.0" level="project" />
<orderEntry type="library" exported="" name="wearable-1.2.0" level="project" />
<orderEntry type="library" exported="" name="support-annotations-22.0.0" level="project" />
<orderEntry type="library" exported="" name="play-services-wearable-7.5.0" level="project" />
<orderEntry type="library" exported="" name="recyclerview-v7-22.0.0" level="project" />
<orderEntry type="library" exported="" name="wearable-1.0.0" level="project" />
</component>
</module>