diff --git a/.gitignore b/.gitignore
index ffbcc03..ec20a46 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,15 +15,28 @@
# Local configuration file (sdk path, etc)
*/local.properties
+# Mac OS X clutter
+*.DS_Store
-# local build config items
-SparkCore/res/values/local_build.xml
+# Android Studio
+.idea/
+# Ignore gradle files
+.gradle/
+build/
+Fontify/build/
-# Eclipse project files
-# COMMENTED OUT: we want these.
-#.classpath
-#.project
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Eclipse
+.classpath
+.project
+.metadata
-*/.metadata/
-*/.settings/
+# Licensed
+app/libs/smartconfiglib.jar
+app/src/main/assets/fonts/gotham*
\ No newline at end of file
diff --git a/Android.iml b/Android.iml
new file mode 100644
index 0000000..2a02201
--- /dev/null
+++ b/Android.iml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Fontify/.gitignore b/Fontify/.gitignore
deleted file mode 100644
index dd8533c..0000000
--- a/Fontify/.gitignore
+++ /dev/null
@@ -1,33 +0,0 @@
-# Android Generated Files:
-bin
-gen
-lint.xml
-
-# Eclipse Files:
-.project
-.classpath
-.settings
-.checkstyle
-
-# IntelliJ IDEA Files:
-.idea
-*.iml
-*.ipr
-*.iws
-classes
-gen-external-apklibs
-
-# Maven Files:
-target
-release.properties
-pom.xml.*
-
-# Ant Files:
-ant.properties
-local.properties
-proguard.cfg
-proguard-project.txt
-
-# Other Files:
-.DS_Store
-tmp
diff --git a/Fontify/AndroidManifest.xml b/Fontify/AndroidManifest.xml
index 7163c1b..6454e21 100644
--- a/Fontify/AndroidManifest.xml
+++ b/Fontify/AndroidManifest.xml
@@ -4,10 +4,11 @@
android:versionName="1.0" >
+ android:minSdkVersion="7"
+ android:targetSdkVersion="21" />
-
+
\ No newline at end of file
diff --git a/Fontify/Fontify.iml b/Fontify/Fontify.iml
new file mode 100644
index 0000000..deab130
--- /dev/null
+++ b/Fontify/Fontify.iml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Fontify/build.gradle b/Fontify/build.gradle
new file mode 100644
index 0000000..b9010eb
--- /dev/null
+++ b/Fontify/build.gradle
@@ -0,0 +1,14 @@
+apply plugin: 'android-library'
+
+android {
+ compileSdkVersion 20
+ buildToolsVersion '20.0.0'
+
+ sourceSets {
+ main {
+ manifest.srcFile 'AndroidManifest.xml'
+ java.srcDirs = ['src']
+ res.srcDirs = ['res']
+ }
+ }
+}
\ No newline at end of file
diff --git a/Fontify/project.properties b/Fontify/project.properties
index 91d2b02..484dab0 100644
--- a/Fontify/project.properties
+++ b/Fontify/project.properties
@@ -11,5 +11,5 @@
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
-target=android-19
+target=android-17
android.library=true
diff --git a/Fontify/readme.md b/Fontify/readme.md
index b2b1147..1f8c4f3 100644
--- a/Fontify/readme.md
+++ b/Fontify/readme.md
@@ -21,12 +21,33 @@ Fontify is an Android library project providing drop-in replacements for all And
-2) Use the Fontify subclass of your TextView:
+2) Use the Fontify subclass of your TextView:
+
+3) You can also declare a default Fontify font as part of your Application theme so that every Fontified element will use the same font:
+
+a. Declare the style as in (1) above
+
+b. While still in res/values/styles.xml, add the following attribute to your Application theme:
+
+
+
+
+c. In your layouts, use the Fontify subclass of your element as in (2) above, but omit the style attribute if you want the default font from the theme to apply
+
+
+
+
####In layouts:
1) Add new XML NameSpace to root element of layout:
diff --git a/Fontify/res/values/attrs.xml b/Fontify/res/values/attrs.xml
index 085b525..8c228e8 100644
--- a/Fontify/res/values/attrs.xml
+++ b/Fontify/res/values/attrs.xml
@@ -3,4 +3,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Fontify/src/com/danh32/fontify/Button.java b/Fontify/src/com/danh32/fontify/Button.java
index c06d45d..c1f6f39 100644
--- a/Fontify/src/com/danh32/fontify/Button.java
+++ b/Fontify/src/com/danh32/fontify/Button.java
@@ -2,38 +2,29 @@
import android.content.Context;
-import android.graphics.Paint;
import android.util.AttributeSet;
public class Button extends android.widget.Button {
-
public Button(Context context) {
super(context);
- setup();
}
public Button(Context context, AttributeSet attrs) {
super(context, attrs);
- setup();
+
// return early for eclipse preview mode
- if (isInEditMode())
- return;
-
+ if (isInEditMode()) return;
+
FontManager.getInstance().setFont(this, attrs);
}
-
+
public void setFont(String fontPath) {
FontManager.getInstance().setFont(this, fontPath);
}
-
+
public void setFont(int resId) {
String fontPath = getContext().getString(resId);
setFont(fontPath);
}
-
- private void setup() {
- setPaintFlags(getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG | Paint.HINTING_ON);
- }
-
}
diff --git a/Fontify/src/com/danh32/fontify/CheckBox.java b/Fontify/src/com/danh32/fontify/CheckBox.java
index 12f743c..3fa0506 100644
--- a/Fontify/src/com/danh32/fontify/CheckBox.java
+++ b/Fontify/src/com/danh32/fontify/CheckBox.java
@@ -2,38 +2,29 @@
import android.content.Context;
-import android.graphics.Paint;
import android.util.AttributeSet;
public class CheckBox extends android.widget.CheckBox {
-
public CheckBox(Context context) {
super(context);
- setup();
}
public CheckBox(Context context, AttributeSet attrs) {
super(context, attrs);
- setup();
+
// return early for eclipse preview mode
- if (isInEditMode()) {
- return;
-
- }
+ if (isInEditMode()) return;
+
FontManager.getInstance().setFont(this, attrs);
}
-
+
public void setFont(String fontPath) {
FontManager.getInstance().setFont(this, fontPath);
}
-
+
public void setFont(int resId) {
String fontPath = getContext().getString(resId);
setFont(fontPath);
}
-
- private void setup() {
- setPaintFlags(getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG | Paint.HINTING_ON);
- }
}
diff --git a/Fontify/src/com/danh32/fontify/FontManager.java b/Fontify/src/com/danh32/fontify/FontManager.java
index d8ce028..18e9cac 100644
--- a/Fontify/src/com/danh32/fontify/FontManager.java
+++ b/Fontify/src/com/danh32/fontify/FontManager.java
@@ -7,13 +7,15 @@
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.AttributeSet;
+import android.util.Log;
import android.widget.TextView;
+import com.danh32.fontify.R;
public class FontManager {
-
private static FontManager sInstance;
private Map mCache;
+ private static int sDefaultStyle = R.attr.fontifyStyle;
private FontManager() {
mCache = new HashMap();
@@ -31,22 +33,32 @@ public void setFont(TextView tv, AttributeSet attrs) {
String fontName = getFontName(tv.getContext(), attrs);
setFont(tv, fontName);
}
-
+
public void setFont(TextView tv, String fontName) {
- if (fontName == null)
- return;
-
+ if (fontName == null) return;
+
Typeface typeface = mCache.get(fontName);
if (typeface == null) {
- typeface = Typeface.createFromAsset(tv.getContext().getAssets(), fontName);
+ try {
+ typeface = Typeface.createFromAsset(tv.getContext().getAssets(), fontName);
+ } catch (Exception e) {
+ Log.w("FontManager", String.format("Font %s not available. Please add missing font to assets/fonts directory", fontName));
+ typeface = Typeface.DEFAULT;
+ }
mCache.put(fontName, typeface);
}
-
+
tv.setTypeface(typeface);
}
-
+
public static String getFontName(Context c, AttributeSet attrs) {
- TypedArray arr = c.obtainStyledAttributes(attrs, R.styleable.Fontify);
+ TypedArray arr = c.obtainStyledAttributes(
+ attrs,
+ R.styleable.Fontify,
+ sDefaultStyle,
+ 0
+ );
+
String fontName = arr.getString(R.styleable.Fontify_font);
arr.recycle();
return fontName;
diff --git a/Fontify/src/com/danh32/fontify/TextView.java b/Fontify/src/com/danh32/fontify/TextView.java
index 446f84d..8d7da76 100644
--- a/Fontify/src/com/danh32/fontify/TextView.java
+++ b/Fontify/src/com/danh32/fontify/TextView.java
@@ -2,38 +2,29 @@
import android.content.Context;
-import android.graphics.Paint;
import android.util.AttributeSet;
public class TextView extends android.widget.TextView {
-
public TextView(Context context) {
super(context);
- setup();
}
public TextView(Context context, AttributeSet attrs) {
super(context, attrs);
- setup();
+
// return early for eclipse preview mode
- if (isInEditMode())
- return;
-
+ if (isInEditMode()) return;
+
FontManager.getInstance().setFont(this, attrs);
}
-
+
public void setFont(String fontPath) {
FontManager.getInstance().setFont(this, fontPath);
}
-
+
public void setFont(int resId) {
String fontPath = getContext().getString(resId);
setFont(fontPath);
}
-
- private void setup() {
- setPaintFlags(getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG | Paint.HINTING_ON);
- }
-
}
diff --git a/README.md b/README.md
index 7331194..08f4599 100644
--- a/README.md
+++ b/README.md
@@ -4,33 +4,24 @@ This is the source repo for the official Spark app for Android, providing the Sm
## Building
-1. In Eclipse, go to File --> Import, and under the Android "folder", click "Existing Android Code into workspace", then click Next
-2. Click Browse, select the dir where you cloned the repo, and click OK
-3. You should now see two projects under the "Projects to Import" header: "SparkCore" and "Fontify". Click on Finish.
-4. In the SparkCore app, create the file ```res/values/local_build.xml``` with the following contents:
-
-```
-
-
- spark:spark
-
-```
-_(You could actually put any valid HTTP Basic Auth string where it says ```spark:spark```; these values aren't currently used, but they must be present.)_
-
-After this, you might also need to do a refresh and/or clean on the SparkCore project, because Eclipse. ;-)
+1. Clone the project to your workspace
+2. (Optional) Install fonts (see below)
+3. Install the TI SmartConfig Library (see below)
+4. Open Android Studio and select "Open an existing Android Studio project"
+5. Click Browse, select the dir where you cloned the repo, and click OK
## Required Fonts
The Spark app distributed via Google Play uses several typefaces in the Gotham family.
-If you have a license to these, you can place the following 4 files in `SparkCore/assets/fonts`.
+If you have a license to these, you can place the following 4 files in `app/src/main/assets/fonts`.
* gotham_bold.otf
* gotham_book.otf
* gotham_light.otf
* gotham_medium.otf
-Otherwise, in order to build a working app, you will need to either modify the app not to look for the fonts or put some other fonts in their place.
+If these fonts are not available, it will fall back to the default font.
## Required TI SmartConfig Library
@@ -39,9 +30,12 @@ You must add smartconfiglib.jar to the `SparkCore/libs` directory.
To get the SmartConfig library, go to the
[CC3000 Wi-Fi Downloads](http://processors.wiki.ti.com/index.php/CC3000_Wi-Fi_Downloads)
-page. Search the page for the Android SmartConfig Application.
-Download and unpack the app, which will require Windows. :-/
-You can find smartconfiglib.jar in the libs directory of TI's app.
+page. Search the page for the Android SmartConfig Application. To download, you may have to create an account.
+The 'app' will actually be a Windows executable (.exe). Do not be alarmed. Rename to CC3000_Android_App_Setup_v1_1.zip and unzip.
+You will find smartconfiglib.jar hiding in:
+CC3000_Android_App_Setup_v1_1.zip\InstallerData\Disk1\InstData\Resource1.zip\C_\yael\SmartConfig_CC3xAndroid_Source\SmartConfigCC3X\libs_zg_ia_sf.jar\smartconfiglib.jar
+
+If you're having trouble unzipping the .exe file, try doing it on the command line with the unzip util.
## Key Classes
@@ -56,4 +50,4 @@ If you want to know where the action is in the app, look at:
Original code in this repository is licensed by Spark Labs, Inc. under the Apache License, Version 2.0.
See LICENSE for more information.
-This app uses several Open Source libraries. See SparkCore/libs/licenses for more information.
+This app uses several Open Source libraries. See app/libs/licenses for more information.
diff --git a/SparkCore/.classpath b/SparkCore/.classpath
deleted file mode 100644
index 5176974..0000000
--- a/SparkCore/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/SparkCore/.project b/SparkCore/.project
deleted file mode 100644
index f7b9df2..0000000
--- a/SparkCore/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
- SparkCore
-
-
-
-
-
- com.android.ide.eclipse.adt.ResourceManagerBuilder
-
-
-
-
- com.android.ide.eclipse.adt.PreCompilerBuilder
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- com.android.ide.eclipse.adt.ApkBuilder
-
-
-
-
-
- com.android.ide.eclipse.adt.AndroidNature
- org.eclipse.jdt.core.javanature
-
-
diff --git a/SparkCore/ic_launcher-web.png b/SparkCore/ic_launcher-web.png
deleted file mode 100644
index 0ad10c3..0000000
Binary files a/SparkCore/ic_launcher-web.png and /dev/null differ
diff --git a/SparkCore/libs/android-support-v4.jar b/SparkCore/libs/android-support-v4.jar
deleted file mode 100644
index cf12d28..0000000
Binary files a/SparkCore/libs/android-support-v4.jar and /dev/null differ
diff --git a/SparkCore/libs/commons-lang3-3.1.jar b/SparkCore/libs/commons-lang3-3.1.jar
deleted file mode 100644
index a85e539..0000000
Binary files a/SparkCore/libs/commons-lang3-3.1.jar and /dev/null differ
diff --git a/SparkCore/libs/gson-2.2.4.jar b/SparkCore/libs/gson-2.2.4.jar
deleted file mode 100644
index 9478253..0000000
Binary files a/SparkCore/libs/gson-2.2.4.jar and /dev/null differ
diff --git a/SparkCore/libs/guava-15.0.jar b/SparkCore/libs/guava-15.0.jar
deleted file mode 100644
index eb9ef8a..0000000
Binary files a/SparkCore/libs/guava-15.0.jar and /dev/null differ
diff --git a/SparkCore/libs/okhttp-1.2.1-jar-with-dependencies.jar b/SparkCore/libs/okhttp-1.2.1-jar-with-dependencies.jar
deleted file mode 100644
index a6ca701..0000000
Binary files a/SparkCore/libs/okhttp-1.2.1-jar-with-dependencies.jar and /dev/null differ
diff --git a/SparkCore/project.properties b/SparkCore/project.properties
deleted file mode 100644
index fbd5841..0000000
--- a/SparkCore/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-19
-android.library.reference.1=../Fontify
diff --git a/SparkCore/res/drawable-xxxhdpi/ic_launcher.png b/SparkCore/res/drawable-xxxhdpi/ic_launcher.png
deleted file mode 100644
index df827fc..0000000
Binary files a/SparkCore/res/drawable-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/SparkCore/src/io/spark/core/android/app/AppConfig.java b/SparkCore/src/io/spark/core/android/app/AppConfig.java
deleted file mode 100644
index 5cad2c6..0000000
--- a/SparkCore/src/io/spark/core/android/app/AppConfig.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package io.spark.core.android.app;
-
-import io.spark.core.android.R;
-import android.content.Context;
-
-
-public class AppConfig {
-
- private static Context ctx;
-
-
- // Should be called when starting up the app, probably in
- // Application.onCreate()
- public static void initialize(Context context) {
- ctx = context.getApplicationContext();
- }
-
- public static String getApiHostname() {
- int resId = useStaging() ? R.string.staging_hostname : R.string.prod_hostname;
- return ctx.getString(resId);
- }
-
- public static String getApiUrlScheme() {
- return ctx.getString(R.string.api_url_scheme);
- }
-
- public static int getApiHostPort() {
- return ctx.getResources().getInteger(R.integer.api_host_port);
- }
-
- public static String getSparkTokenCreationCredentials() {
- return ctx.getString(R.string.spark_token_creation_credentials);
- }
-
- public static boolean useStaging() {
- return ctx.getResources().getBoolean(R.bool.use_staging);
- }
-
- public static String getApiVersion() {
- return ctx.getString(R.string.api_version);
- }
-
- public static String getApiParamAccessToken() {
- return ctx.getString(R.string.api_param_access_token);
- }
-
- public static String getSmartConfigHelloListenAddress() {
- return ctx.getString(R.string.smart_config_hello_listen_address);
- }
-
- public static int getSmartConfigHelloListenPort() {
- return ctx.getResources().getInteger(R.integer.smart_config_hello_port);
- }
-
- public static int getSmartConfigHelloMessageLength() {
- return ctx.getResources().getInteger(R.integer.smart_config_hello_msg_length);
- }
-
- public static String getSmartConfigDefaultAesKey() {
- return ctx.getString(R.string.smart_config_default_aes_key);
- }
-
-}
diff --git a/SparkCore/src/io/spark/core/android/app/SparkCoreApp.java b/SparkCore/src/io/spark/core/android/app/SparkCoreApp.java
deleted file mode 100644
index 7800bb7..0000000
--- a/SparkCore/src/io/spark/core/android/app/SparkCoreApp.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package io.spark.core.android.app;
-
-import io.spark.core.android.cloud.WebHelpers;
-import io.spark.core.android.storage.Prefs;
-import io.spark.core.android.storage.TinkerPrefs;
-import android.app.Application;
-
-
-public class SparkCoreApp extends Application {
-
- @Override
- public void onCreate() {
- super.onCreate();
-
- AppConfig.initialize(this);
- Prefs.initialize(this);
- TinkerPrefs.initialize(this);
- WebHelpers.initialize(this);
- DeviceState.initialize(this);
- }
-
-}
diff --git a/SparkCore/src/io/spark/core/android/ui/corelist/CoreListFragment.java b/SparkCore/src/io/spark/core/android/ui/corelist/CoreListFragment.java
deleted file mode 100644
index 4e5aeff..0000000
--- a/SparkCore/src/io/spark/core/android/ui/corelist/CoreListFragment.java
+++ /dev/null
@@ -1,241 +0,0 @@
-package io.spark.core.android.ui.corelist;
-
-import io.spark.core.android.R;
-import io.spark.core.android.app.DeviceState;
-import io.spark.core.android.cloud.ApiFacade;
-import io.spark.core.android.cloud.api.Device;
-import io.spark.core.android.ui.tinker.TinkerFragment;
-import io.spark.core.android.ui.util.Ui;
-
-import org.solemnsilence.util.EZ;
-import org.solemnsilence.util.Py;
-import org.solemnsilence.util.Py.Ranger.IntValue;
-import org.solemnsilence.util.TLog;
-
-import android.app.Activity;
-import android.app.ListFragment;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.support.v4.content.LocalBroadcastManager;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ListView;
-
-
-
-/**
- * A list fragment representing a list of Cores. This fragment also supports
- * tablet devices by allowing list items to be given an 'activated' state upon
- * selection. This helps indicate which item is currently being viewed in a
- * {@link TinkerFragment}.
- *
- * Activities containing this fragment MUST implement the {@link Callbacks}
- * interface.
- */
-public class CoreListFragment extends ListFragment {
-
-
- private static final TLog log = new TLog(CoreListFragment.class);
-
-
- /**
- * The fragment's current callback object, which is notified of list item
- * clicks.
- */
- private Callbacks mCallbacks = sDummyCallbacks;
-
- /**
- * The current activated item position. Only used on tablets.
- */
- private int mActivatedPosition = ListView.INVALID_POSITION;
-
- /**
- * A callback interface that all activities containing this fragment must
- * implement. This mechanism allows activities to be notified of item
- * selections.
- */
- public interface Callbacks {
-
- /**
- * Callback for when an item has been selected.
- */
- public void onItemSelected(String id);
- }
-
- /**
- * A dummy implementation of the {@link Callbacks} interface that does
- * nothing. Used only when this fragment is not attached to an activity.
- */
- private static Callbacks sDummyCallbacks = new Callbacks() {
-
- @Override
- public void onItemSelected(String id) {
- }
- };
-
- DeviceListAdapter deviceAdapter;
- DevicesUpdatedReceiver updatesReceiver;
- LocalBroadcastManager broadcastMgr;
- ApiFacade api;
-
- String selectedDeviceId = null;
-
- /**
- * Mandatory empty constructor for the fragment manager to instantiate the
- * fragment (e.g. upon screen orientation changes).
- */
- public CoreListFragment() {
- }
-
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
-
- // Activities containing this fragment must implement its callbacks.
- if (!(activity instanceof Callbacks)) {
- throw new IllegalStateException("Activity must implement fragment's callbacks.");
- }
-
- mCallbacks = (Callbacks) activity;
- broadcastMgr = LocalBroadcastManager.getInstance(activity);
- api = ApiFacade.getInstance(activity);
-
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- updatesReceiver = new DevicesUpdatedReceiver();
- deviceAdapter = new DeviceListAdapter(getActivity());
- setListAdapter(deviceAdapter);
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- return inflater.inflate(R.layout.fragment_core_list, container, false);
- }
-
- @Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
-
- updateDevicesList();
- }
-
- @Override
- public void onStart() {
- super.onStart();
- broadcastMgr.registerReceiver(updatesReceiver, updatesReceiver.getIntentFilter());
- }
-
- @Override
- public void onStop() {
- broadcastMgr.unregisterReceiver(updatesReceiver);
- super.onStop();
- }
-
- @Override
- public void onDetach() {
- super.onDetach();
- // Reset the active callbacks interface to the dummy implementation.
- mCallbacks = sDummyCallbacks;
- }
-
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
- inflater.inflate(R.menu.core_list, menu);
- }
-
- @Override
- public void onListItemClick(ListView listView, View view, int position, long id) {
- super.onListItemClick(listView, view, position, id);
-
- Device selectedDevice = deviceAdapter.getItem(position);
- // Notify the active callbacks interface (the activity, if the
- // fragment is attached to one) that an item has been selected.
- mCallbacks.onItemSelected(selectedDevice.id);
- mActivatedPosition = position;
- }
-
- public void setActivatedItem(String id) {
- Device device = DeviceState.getDeviceById(id);
- if (device == null) {
- log.w("Device was null when trying to set active list item??");
- return;
- }
- selectedDeviceId = device.id;
- mActivatedPosition = deviceAdapter.getPosition(device);
- setActiveCoreView();
- }
-
- private void updateDevicesList() {
- log.d("updateDevicesList()");
- deviceAdapter.clear();
- deviceAdapter.addAll(DeviceState.getKnownDevices());
- if (selectedDeviceId != null) {
- setActivatedItem(selectedDeviceId);
- setActiveCoreView();
- }
- }
-
- private void setActiveCoreView() {
- // This is just *ugly*, but all of this seems to be necessary to
- // *always* show the colored stripe next to the selected core.
- for (IntValue intValue : Py.range(getListView().getChildCount())) {
- View child = getListView().getChildAt(intValue.value);
- if (intValue.value == mActivatedPosition) {
- Ui.findView(child, R.id.active_core_stripe).setVisibility(View.VISIBLE);
- child.setActivated(true);
- } else {
- Ui.findView(child, R.id.active_core_stripe).setVisibility(View.INVISIBLE);
- }
- }
-
- EZ.runOnMainThread(new Runnable() {
-
- @Override
- public void run() {
- ListView lv = null;
- try {
- lv = getListView();
- if (getActivity() == null || getActivity().isFinishing() || lv == null) {
- return;
- }
- } catch (IllegalStateException e) {
- return;
- }
- for (IntValue intValue : Py.range(lv.getChildCount())) {
- View child = lv.getChildAt(intValue.value);
- if (intValue.value == mActivatedPosition) {
- Ui.findView(child, R.id.active_core_stripe).setVisibility(View.VISIBLE);
- child.setActivated(true);
- } else {
- Ui.findView(child, R.id.active_core_stripe).setVisibility(View.INVISIBLE);
- }
- }
- }
- });
- }
-
- class DevicesUpdatedReceiver extends BroadcastReceiver {
-
- IntentFilter getIntentFilter() {
- return new IntentFilter(ApiFacade.BROADCAST_DEVICES_UPDATED);
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- updateDevicesList();
- }
- }
-
-}
diff --git a/android-app.iml b/android-app.iml
new file mode 100644
index 0000000..2a02201
--- /dev/null
+++ b/android-app.iml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/app.iml b/app/app.iml
new file mode 100644
index 0000000..f5a0dfc
--- /dev/null
+++ b/app/app.iml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..eb755cf
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,32 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 21
+ buildToolsVersion "21.1.2"
+
+ defaultConfig {
+ applicationId "io.spark.core.android"
+ minSdkVersion 15
+ targetSdkVersion 21
+ 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 project (':Fontify')
+ compile 'com.android.support:appcompat-v7:21.0.3'
+ compile 'com.google.code.gson:gson:2.3'
+ compile 'com.squareup.okhttp:okhttp:1.2.1'
+ compile 'com.google.guava:guava:18.0'
+ compile 'org.apache.commons:commons-lang3:3.0'
+ compile 'javax.annotation:jsr250-api:1.0'
+
+}
diff --git a/SparkCore/assets/fonts/.gitkeep b/app/libs/.gitignore
similarity index 100%
rename from SparkCore/assets/fonts/.gitkeep
rename to app/libs/.gitignore
diff --git a/SparkCore/libs/licenses/android-support-v4-LICENSE.txt b/app/libs/licenses/android-support-v4-LICENSE.txt
similarity index 100%
rename from SparkCore/libs/licenses/android-support-v4-LICENSE.txt
rename to app/libs/licenses/android-support-v4-LICENSE.txt
diff --git a/SparkCore/libs/licenses/commons-lang3-LICENSE.txt b/app/libs/licenses/commons-lang3-LICENSE.txt
similarity index 100%
rename from SparkCore/libs/licenses/commons-lang3-LICENSE.txt
rename to app/libs/licenses/commons-lang3-LICENSE.txt
diff --git a/SparkCore/libs/licenses/gson-LICENSE.txt b/app/libs/licenses/gson-LICENSE.txt
similarity index 100%
rename from SparkCore/libs/licenses/gson-LICENSE.txt
rename to app/libs/licenses/gson-LICENSE.txt
diff --git a/SparkCore/libs/licenses/guava-LICENSE.txt b/app/libs/licenses/guava-LICENSE.txt
similarity index 100%
rename from SparkCore/libs/licenses/guava-LICENSE.txt
rename to app/libs/licenses/guava-LICENSE.txt
diff --git a/SparkCore/libs/licenses/okhttp-LICENSE.txt b/app/libs/licenses/okhttp-LICENSE.txt
similarity index 100%
rename from SparkCore/libs/licenses/okhttp-LICENSE.txt
rename to app/libs/licenses/okhttp-LICENSE.txt
diff --git a/SparkCore/proguard-project.txt b/app/proguard-rules.pro
similarity index 62%
rename from SparkCore/proguard-project.txt
rename to app/proguard-rules.pro
index f2fe155..42a01d3 100644
--- a/SparkCore/proguard-project.txt
+++ b/app/proguard-rules.pro
@@ -1,11 +1,8 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
+# in /Users/sean/tools/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
diff --git a/app/src/androidTest/java/io/spark/core/android/ApplicationTest.java b/app/src/androidTest/java/io/spark/core/android/ApplicationTest.java
new file mode 100644
index 0000000..663ccfe
--- /dev/null
+++ b/app/src/androidTest/java/io/spark/core/android/ApplicationTest.java
@@ -0,0 +1,14 @@
+package io.spark.core.android;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+/**
+ * Testing Fundamentals
+ */
+public class ApplicationTest extends ApplicationTestCase {
+ public ApplicationTest() {
+ super(Application.class);
+ }
+
+}
\ No newline at end of file
diff --git a/SparkCore/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
similarity index 89%
rename from SparkCore/AndroidManifest.xml
rename to app/src/main/AndroidManifest.xml
index e8adb59..c937913 100644
--- a/SparkCore/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,12 +1,6 @@
-
-
+ package="io.spark.core.android" >
@@ -15,7 +9,7 @@
+ android:value=".ui.smartconfig.SmartConfigActivity" />
+ android:value=".ui.smartconfig.SmartConfigActivity" />
-
\ No newline at end of file
+
diff --git a/app/src/main/assets/fonts/.gitkeep b/app/src/main/assets/fonts/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/src/main/java/io/spark/core/android/app/AppConfig.java b/app/src/main/java/io/spark/core/android/app/AppConfig.java
new file mode 100644
index 0000000..56064ce
--- /dev/null
+++ b/app/src/main/java/io/spark/core/android/app/AppConfig.java
@@ -0,0 +1,63 @@
+package io.spark.core.android.app;
+
+import android.content.Context;
+
+import io.spark.core.android.R;
+
+public class AppConfig {
+
+ private static Context ctx;
+
+
+ // Should be called when starting up the app, probably in
+ // Application.onCreate()
+ public static void initialize(Context context) {
+ ctx = context.getApplicationContext();
+ }
+
+ public static String getApiHostname() {
+ int resId = useStaging() ? R.string.staging_hostname : R.string.prod_hostname;
+ return ctx.getString(resId);
+ }
+
+ public static String getApiUrlScheme() {
+ return ctx.getString(R.string.api_url_scheme);
+ }
+
+ public static int getApiHostPort() {
+ return ctx.getResources().getInteger(R.integer.api_host_port);
+ }
+
+ public static String getSparkTokenCreationCredentials() {
+ return ctx.getString(R.string.spark_token_creation_credentials);
+ }
+
+ public static boolean useStaging() {
+ return ctx.getResources().getBoolean(R.bool.use_staging);
+ }
+
+ public static String getApiVersion() {
+ return ctx.getString(R.string.api_version);
+ }
+
+ public static String getApiParamAccessToken() {
+ return ctx.getString(R.string.api_param_access_token);
+ }
+
+ public static String getSmartConfigHelloListenAddress() {
+ return ctx.getString(R.string.smart_config_hello_listen_address);
+ }
+
+ public static int getSmartConfigHelloListenPort() {
+ return ctx.getResources().getInteger(R.integer.smart_config_hello_port);
+ }
+
+ public static int getSmartConfigHelloMessageLength() {
+ return ctx.getResources().getInteger(R.integer.smart_config_hello_msg_length);
+ }
+
+ public static String getSmartConfigDefaultAesKey() {
+ return ctx.getString(R.string.smart_config_default_aes_key);
+ }
+
+}
diff --git a/SparkCore/src/io/spark/core/android/app/DeviceState.java b/app/src/main/java/io/spark/core/android/app/DeviceState.java
similarity index 75%
rename from SparkCore/src/io/spark/core/android/app/DeviceState.java
rename to app/src/main/java/io/spark/core/android/app/DeviceState.java
index 340486d..3fa4aa9 100644
--- a/SparkCore/src/io/spark/core/android/app/DeviceState.java
+++ b/app/src/main/java/io/spark/core/android/app/DeviceState.java
@@ -1,22 +1,5 @@
package io.spark.core.android.app;
-import static org.solemnsilence.util.Py.list;
-import static org.solemnsilence.util.Py.map;
-import static org.solemnsilence.util.Py.set;
-import static org.solemnsilence.util.Py.truthy;
-import io.spark.core.android.R;
-import io.spark.core.android.cloud.WebHelpers;
-import io.spark.core.android.cloud.api.Device;
-import io.spark.core.android.storage.Prefs;
-
-import java.lang.reflect.Type;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.Set;
-
-import org.solemnsilence.util.TLog;
-
import android.content.Context;
import android.content.res.TypedArray;
import android.os.AsyncTask;
@@ -26,46 +9,63 @@
import com.google.common.collect.Lists;
import com.google.gson.reflect.TypeToken;
+import org.solemnsilence.util.TLog;
+
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+
+import io.spark.core.android.R;
+import io.spark.core.android.cloud.WebHelpers;
+import io.spark.core.android.cloud.api.Device;
+import io.spark.core.android.storage.Prefs;
+
+import static org.solemnsilence.util.Py.list;
+import static org.solemnsilence.util.Py.map;
+import static org.solemnsilence.util.Py.set;
+import static org.solemnsilence.util.Py.truthy;
/**
- * Common access to {@link Device}s.
+ * Common access to {@link io.spark.core.android.cloud.api.Device}s.
*
* Uses an in-memory cache, backed by on-disk storage using SharedPreferences.
*
*/
public class DeviceState {
- static final TLog log = new TLog(DeviceState.class);
+ static final TLog log = new TLog(DeviceState.class);
- private static final Map deviceMap = map();
- private static final Random random = new Random();
+ private static final Map deviceMap = map();
+ private static final Random random = new Random();
- private static Context appContext;
+ private static Context appContext;
- public static synchronized void initialize(Context ctx) {
- appContext = ctx.getApplicationContext();
- String coresJsonArray = Prefs.getInstance().getCoresJsonArray();
- Type listType = new TypeToken>() {
- }.getType();
- List devices = WebHelpers.getGson().fromJson(coresJsonArray, listType);
- updateAllKnownDevices(devices);
- }
+ public static synchronized void initialize(Context ctx) {
+ appContext = ctx.getApplicationContext();
+ String coresJsonArray = Prefs.getInstance().getCoresJsonArray();
+ Type listType = new TypeToken>() {
+ }.getType();
+ List devices = WebHelpers.getGson().fromJson(coresJsonArray, listType);
+ updateAllKnownDevices(devices);
+ }
- public synchronized static List getKnownDevices() {
- return Lists.newArrayList(deviceMap.values());
- }
+ public synchronized static List getKnownDevices() {
+ return Lists.newArrayList(deviceMap.values());
+ }
- public synchronized static Device getDeviceById(String deviceId) {
- return (deviceId == null) ? null : deviceMap.get(deviceId);
- }
+ public synchronized static Device getDeviceById(String deviceId) {
+ return (deviceId == null) ? null : deviceMap.get(deviceId);
+ }
- public synchronized static void updateAllKnownDevices(List updatedDevices) {
- log.d("Updating known devices with: " + updatedDevices);
+ public synchronized static void updateAllKnownDevices(List updatedDevices) {
+ log.d("Updating known devices with: " + updatedDevices);
- Set updatedDeviceIds = set();
- for (Device updatedDevice : updatedDevices) {
+ Set updatedDeviceIds = set();
+ for (Device updatedDevice : updatedDevices) {
String updatedDeviceId = updateSingleDevice(updatedDevice, false);
updatedDeviceIds.add(updatedDeviceId);
}
diff --git a/app/src/main/java/io/spark/core/android/app/SparkApplication.java b/app/src/main/java/io/spark/core/android/app/SparkApplication.java
new file mode 100644
index 0000000..ff62c38
--- /dev/null
+++ b/app/src/main/java/io/spark/core/android/app/SparkApplication.java
@@ -0,0 +1,20 @@
+package io.spark.core.android.app;
+
+import android.app.Application;
+
+import io.spark.core.android.cloud.WebHelpers;
+import io.spark.core.android.storage.Prefs;
+import io.spark.core.android.storage.TinkerPrefs;
+
+public class SparkApplication extends Application {
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ AppConfig.initialize(this);
+ Prefs.initialize(this);
+ TinkerPrefs.initialize(this);
+ WebHelpers.initialize(this);
+ DeviceState.initialize(this);
+ }
+}
diff --git a/SparkCore/src/io/spark/core/android/cloud/ApiFacade.java b/app/src/main/java/io/spark/core/android/cloud/ApiFacade.java
similarity index 73%
rename from SparkCore/src/io/spark/core/android/cloud/ApiFacade.java
rename to app/src/main/java/io/spark/core/android/cloud/ApiFacade.java
index 54124c8..8602ff9 100644
--- a/SparkCore/src/io/spark/core/android/cloud/ApiFacade.java
+++ b/app/src/main/java/io/spark/core/android/cloud/ApiFacade.java
@@ -1,15 +1,13 @@
package io.spark.core.android.cloud;
-import io.spark.core.android.app.DeviceState;
-import io.spark.core.android.cloud.api.Device;
-import io.spark.core.android.cloud.api.SimpleResponse;
-import io.spark.core.android.cloud.api.TinkerResponse;
-import io.spark.core.android.cloud.requestservice.SimpleSparkApiService;
-import io.spark.core.android.smartconfig.SmartConfigState;
-import io.spark.core.android.ui.tinker.DigitalValue;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.ResultReceiver;
+import android.support.v4.content.LocalBroadcastManager;
-import java.lang.reflect.Type;
-import java.util.List;
+import com.google.gson.reflect.TypeToken;
import org.apache.http.HttpStatus;
import org.json.JSONArray;
@@ -18,14 +16,18 @@
import org.solemnsilence.util.TLog;
import org.solemnsilence.util.Toaster;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.ResultReceiver;
-import android.support.v4.content.LocalBroadcastManager;
+import java.lang.reflect.Type;
+import java.util.List;
-import com.google.gson.reflect.TypeToken;
+import io.spark.core.android.app.DeviceState;
+import io.spark.core.android.cloud.api.Device;
+import io.spark.core.android.cloud.api.SimpleResponse;
+import io.spark.core.android.cloud.api.TinkerResponse;
+import io.spark.core.android.cloud.requestservice.SimpleSparkApiService;
+import io.spark.core.android.smartconfig.SmartConfigState;
+import io.spark.core.android.ui.tinker.DigitalValue;
+
+import static io.spark.core.android.cloud.requestservice.SimpleSparkApiService.EXTRA_RESULT_CODE;
/**
@@ -40,90 +42,88 @@
*/
public class ApiFacade {
- private static final TLog log = new TLog(ApiFacade.class);
+ private static final TLog log = new TLog(ApiFacade.class);
- public static final int REQUEST_FAILURE_CODE = -1;
+ public static final int REQUEST_FAILURE_CODE = -1;
- // broadcast receiver actions
- public static final String BROADCAST_SIGN_UP_FINISHED = "BROADCAST_SIGN_UP_FINISHED";
- public static final String BROADCAST_DEVICES_UPDATED = "BROADCAST_DEVICES_UPDATED";
- public static final String BROADCAST_LOG_IN_FINISHED = "BROADCAST_LOG_IN_FINISHED";
- public static final String BROADCAST_CORE_CLAIMED = "BROADCAST_CORE_CLAIMED";
- public static final String BROADCAST_CORE_NAMING_REQUEST_COMPLETE = "BROADCAST_CORE_NAMING_REQUEST_COMPLETE";
- public static final String BROADCAST_TINKER_RESPONSE_RECEIVED = "BROADCAST_TINKER_RESPONSE_RECEIVED";
- public static final String BROADCAST_SHOULD_LOG_OUT = "BROADCAST_SHOULD_LOG_OUT";
+ // broadcast receiver actions
+ public static final String BROADCAST_SIGN_UP_FINISHED = "BROADCAST_SIGN_UP_FINISHED";
+ public static final String BROADCAST_DEVICES_UPDATED = "BROADCAST_DEVICES_UPDATED";
+ public static final String BROADCAST_LOG_IN_FINISHED = "BROADCAST_LOG_IN_FINISHED";
+ public static final String BROADCAST_CORE_CLAIMED = "BROADCAST_CORE_CLAIMED";
+ public static final String BROADCAST_CORE_NAMING_REQUEST_COMPLETE = "BROADCAST_CORE_NAMING_REQUEST_COMPLETE";
+ public static final String BROADCAST_TINKER_RESPONSE_RECEIVED = "BROADCAST_TINKER_RESPONSE_RECEIVED";
+ public static final String BROADCAST_SHOULD_LOG_OUT = "BROADCAST_SHOULD_LOG_OUT";
- public static final String BROADCAST_SERVICE_API_ERROR = "BROADCAST_SERVICE_API_ERROR";
+ public static final String BROADCAST_SERVICE_API_ERROR = "BROADCAST_SERVICE_API_ERROR";
- public static final String EXTRA_ERROR_CODE = "EXTRA_ERROR_CODE";
- public static final String EXTRA_TINKER_RESPONSE = "EXTRA_TINKER_RESPONSE";
+ public static final String EXTRA_ERROR_CODE = "EXTRA_ERROR_CODE";
+ public static final String EXTRA_TINKER_RESPONSE = "EXTRA_TINKER_RESPONSE";
- private static ApiFacade instance = null;
+ private static ApiFacade instance = null;
- public static ApiFacade getInstance(Context context) {
- if (instance == null) {
- instance = new ApiFacade(context.getApplicationContext());
- }
- return instance;
- }
+ public static ApiFacade getInstance(Context context) {
+ if (instance == null) {
+ instance = new ApiFacade(context.getApplicationContext());
+ }
+ return instance;
+ }
- public static int getResultCode(Intent broadcastIntent) {
- int resultcode = broadcastIntent.getIntExtra(SimpleSparkApiService.EXTRA_RESULT_CODE,
- SimpleSparkApiService.REQUEST_FAILURE_CODE);
- return resultcode;
- }
+ public static int getResultCode(Intent broadcastIntent) {
+ return broadcastIntent.getIntExtra(EXTRA_RESULT_CODE, SimpleSparkApiService.REQUEST_FAILURE_CODE);
+ }
- final Context ctx;
- final Handler handler;
- final LocalBroadcastManager broadcastMgr;
+ final Context ctx;
+ final Handler handler;
+ final LocalBroadcastManager broadcastMgr;
- private ApiFacade(Context context) {
- this.ctx = context.getApplicationContext();
- this.handler = new Handler();
- this.broadcastMgr = LocalBroadcastManager.getInstance(this.ctx);
- }
+ private ApiFacade(Context context) {
+ this.ctx = context.getApplicationContext();
+ this.handler = new Handler();
+ this.broadcastMgr = LocalBroadcastManager.getInstance(this.ctx);
+ }
- public void signUp(String username, String password) {
- Bundle b = new Bundle();
- b.putString("username", username);
- b.putString("password", password);
- SimpleSparkApiService.post(ctx, new String[] { "users" }, b,
- new SignUpResponseReceiver(handler, username, password),
- null);
- }
+ public void signUp(String username, String password) {
+ Bundle b = new Bundle();
+ b.putString("username", username);
+ b.putString("password", password);
+ SimpleSparkApiService.post(ctx, new String[] {"users"}, b,
+ new SignUpResponseReceiver(handler, username, password),
+ null);
+ }
- public void logIn(String username, String password) {
- SimpleSparkApiService.logIn(ctx, username, password);
- }
+ public void logIn(String username, String password) {
+ SimpleSparkApiService.logIn(ctx, username, password);
+ }
- public void claimCore(String coreId) {
- log.i("Making request to claim core: " + coreId);
- Bundle b = new Bundle();
- b.putString("id", coreId);
- SimpleSparkApiService.post(ctx, new String[] { "devices" }, b,
- new ClaimCoreResponseReceiver(handler, coreId), null);
+ public void claimCore(String coreId) {
+ log.i("Making request to claim core: " + coreId);
+ Bundle b = new Bundle();
+ b.putString("id", coreId);
+ SimpleSparkApiService.post(ctx, new String[] {"devices"}, b,
+ new ClaimCoreResponseReceiver(handler, coreId), null);
}
public void requestUnheardCores() {
- SimpleSparkApiService.post(ctx, new String[] { "devices" }, null,
- new UnheardCoreCoreResponseReceiver(handler),
- null);
+ SimpleSparkApiService.post(ctx, new String[] {"devices"}, null,
+ new UnheardCoreCoreResponseReceiver(handler),
+ null);
}
public void startSignalling(String coreId) {
log.i("Making request for " + coreId + " to start signalling.");
Bundle b = new Bundle();
b.putInt("signal", 1);
- SimpleSparkApiService.put(ctx, new String[] { "devices", coreId }, b,
- new SignalingResponseReceiver(handler, coreId, 1),
- null);
+ SimpleSparkApiService.put(ctx, new String[] {"devices", coreId}, b,
+ new SignalingResponseReceiver(handler, coreId, 1),
+ null);
}
public void nameCore(String coreId, String name) {
@@ -132,31 +132,31 @@ public void nameCore(String coreId, String name) {
Bundle b = new Bundle();
b.putInt("signal", 0);
b.putString("name", name);
- SimpleSparkApiService.put(ctx, new String[] { "devices", coreId }, b,
- new CoreNamingResponseReceiver(handler, coreId, name),
- BROADCAST_CORE_NAMING_REQUEST_COMPLETE);
+ SimpleSparkApiService.put(ctx, new String[] {"devices", coreId}, b,
+ new CoreNamingResponseReceiver(handler, coreId, name),
+ BROADCAST_CORE_NAMING_REQUEST_COMPLETE);
}
public void requestAllDevices() {
log.d("Requesting update of all devices");
- SimpleSparkApiService.get(ctx, new String[] { "devices" }, null,
- new DevicesResponseReceiver(handler),
- BROADCAST_DEVICES_UPDATED);
+ SimpleSparkApiService.get(ctx, new String[] {"devices"}, null,
+ new DevicesResponseReceiver(handler),
+ BROADCAST_DEVICES_UPDATED);
}
public void requestDevice(String coreId) {
log.i("Requesting update for individual device: " + coreId);
- SimpleSparkApiService.get(ctx, new String[] { "devices", coreId }, null,
- new SingleDeviceResponseReceiver(handler),
- BROADCAST_DEVICES_UPDATED);
+ SimpleSparkApiService.get(ctx, new String[] {"devices", coreId}, null,
+ new SingleDeviceResponseReceiver(handler),
+ BROADCAST_DEVICES_UPDATED);
}
public void reflashTinker(String coreId) {
Bundle b = new Bundle();
b.putString("app", "tinker");
- SimpleSparkApiService.put(ctx, new String[] { "devices", coreId }, b,
- new ReflashTinkerResponseReceiver(handler, coreId),
- null);
+ SimpleSparkApiService.put(ctx, new String[] {"devices", coreId}, b,
+ new ReflashTinkerResponseReceiver(handler, coreId),
+ null);
}
public void digitalRead(String coreId, String pinId, DigitalValue oldValue) {
@@ -167,8 +167,8 @@ public void digitalRead(String coreId, String pinId, DigitalValue oldValue) {
Bundle args = new Bundle();
args.putString("params", pinId);
- SimpleSparkApiService.post(ctx, new String[] { "devices", coreId, "digitalread" },
- args, receiver, null);
+ SimpleSparkApiService.post(ctx, new String[] {"devices", coreId, "digitalread"},
+ args, receiver, null);
}
public void digitalWrite(String coreId, String pinId, DigitalValue oldValue,
@@ -180,8 +180,8 @@ public void digitalWrite(String coreId, String pinId, DigitalValue oldValue,
Bundle args = new Bundle();
args.putString("params", pinId + "," + newValue.name());
- SimpleSparkApiService.post(ctx, new String[] { "devices", coreId, "digitalwrite" },
- args, receiver, null);
+ SimpleSparkApiService.post(ctx, new String[] {"devices", coreId, "digitalwrite"},
+ args, receiver, null);
}
public void analogRead(String coreId, String pinId, int oldValue) {
@@ -192,8 +192,8 @@ public void analogRead(String coreId, String pinId, int oldValue) {
Bundle args = new Bundle();
args.putString("params", pinId);
- SimpleSparkApiService.post(ctx, new String[] { "devices", coreId, "analogread" },
- args, receiver, null);
+ SimpleSparkApiService.post(ctx, new String[] {"devices", coreId, "analogread"},
+ args, receiver, null);
}
public void analogWrite(String coreName, String pinId, int oldValue, int newValue) {
@@ -203,8 +203,8 @@ public void analogWrite(String coreName, String pinId, int oldValue, int newValu
Bundle args = new Bundle();
args.putString("params", pinId + "," + newValue);
- SimpleSparkApiService.post(ctx, new String[] { "devices", coreName, "analogwrite" },
- args, receiver, null);
+ SimpleSparkApiService.post(ctx, new String[] {"devices", coreName, "analogwrite"},
+ args, receiver, null);
}
@@ -378,7 +378,7 @@ public void onRequestResponse(int statusCode, String jsonData) {
if (simpleResponse != null) {
Intent intent = new Intent(BROADCAST_SIGN_UP_FINISHED)
- .putExtra(SimpleSparkApiService.EXTRA_RESULT_CODE, statusCodeToReport);
+ .putExtra(EXTRA_RESULT_CODE, statusCodeToReport);
if (errorMessageToReturn != null) {
intent.putExtra(SimpleSparkApiService.EXTRA_ERROR_MSG, errorMessageToReturn);
}
diff --git a/SparkCore/src/io/spark/core/android/cloud/ApiUrlHelper.java b/app/src/main/java/io/spark/core/android/cloud/ApiUrlHelper.java
similarity index 95%
rename from SparkCore/src/io/spark/core/android/cloud/ApiUrlHelper.java
rename to app/src/main/java/io/spark/core/android/cloud/ApiUrlHelper.java
index 8589bf5..ba443ab 100644
--- a/SparkCore/src/io/spark/core/android/cloud/ApiUrlHelper.java
+++ b/app/src/main/java/io/spark/core/android/cloud/ApiUrlHelper.java
@@ -1,14 +1,15 @@
package io.spark.core.android.cloud;
-import static org.solemnsilence.util.Py.truthy;
import io.spark.core.android.app.AppConfig;
import java.net.MalformedURLException;
import java.net.URL;
+import android.net.Uri;
+
import org.solemnsilence.util.TLog;
-import android.net.Uri;
+import static org.solemnsilence.util.Py.truthy;
public class ApiUrlHelper {
@@ -54,6 +55,6 @@ public static URL convertToURL(Uri.Builder uriBuilder) {
}
- private static final TLog log = new TLog(ApiUrlHelper.class);
+ private static final TLog log = new TLog(ApiUrlHelper.class);
}
diff --git a/SparkCore/src/io/spark/core/android/cloud/WebHelpers.java b/app/src/main/java/io/spark/core/android/cloud/WebHelpers.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/cloud/WebHelpers.java
rename to app/src/main/java/io/spark/core/android/cloud/WebHelpers.java
diff --git a/SparkCore/src/io/spark/core/android/cloud/api/Device.java b/app/src/main/java/io/spark/core/android/cloud/api/Device.java
similarity index 98%
rename from SparkCore/src/io/spark/core/android/cloud/api/Device.java
rename to app/src/main/java/io/spark/core/android/cloud/api/Device.java
index f245c38..cabb694 100644
--- a/SparkCore/src/io/spark/core/android/cloud/api/Device.java
+++ b/app/src/main/java/io/spark/core/android/cloud/api/Device.java
@@ -2,7 +2,6 @@
import static org.solemnsilence.util.Py.truthy;
-
/**
* Class representing a single Spark device (i.e.: a Core)
*/
@@ -89,7 +88,7 @@ public String toString() {
// NOTE: device ID is the ONLY field being factored in to test equality
@Override
public boolean equals(Object obj) {
- if (this == obj)
+ if (this == obj)
return true;
if (obj == null)
return false;
diff --git a/SparkCore/src/io/spark/core/android/cloud/api/ListDevicesResponse.java b/app/src/main/java/io/spark/core/android/cloud/api/ListDevicesResponse.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/cloud/api/ListDevicesResponse.java
rename to app/src/main/java/io/spark/core/android/cloud/api/ListDevicesResponse.java
diff --git a/SparkCore/src/io/spark/core/android/cloud/api/SimpleResponse.java b/app/src/main/java/io/spark/core/android/cloud/api/SimpleResponse.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/cloud/api/SimpleResponse.java
rename to app/src/main/java/io/spark/core/android/cloud/api/SimpleResponse.java
diff --git a/SparkCore/src/io/spark/core/android/cloud/api/TinkerResponse.java b/app/src/main/java/io/spark/core/android/cloud/api/TinkerResponse.java
similarity index 94%
rename from SparkCore/src/io/spark/core/android/cloud/api/TinkerResponse.java
rename to app/src/main/java/io/spark/core/android/cloud/api/TinkerResponse.java
index 69ca825..82e856a 100644
--- a/SparkCore/src/io/spark/core/android/cloud/api/TinkerResponse.java
+++ b/app/src/main/java/io/spark/core/android/cloud/api/TinkerResponse.java
@@ -1,9 +1,10 @@
package io.spark.core.android.cloud.api;
-import static org.solemnsilence.util.Py.truthy;
import android.os.Parcel;
import android.os.Parcelable;
+import static org.solemnsilence.util.Py.truthy;
+
public class TinkerResponse implements Parcelable {
@@ -64,7 +65,7 @@ public void writeToParcel(Parcel dest, int flags) {
}
- public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ public static final Creator CREATOR = new Creator() {
public TinkerResponse createFromParcel(Parcel in) {
return new TinkerResponse(in);
diff --git a/SparkCore/src/io/spark/core/android/cloud/login/TokenRequest.java b/app/src/main/java/io/spark/core/android/cloud/login/TokenRequest.java
similarity index 99%
rename from SparkCore/src/io/spark/core/android/cloud/login/TokenRequest.java
rename to app/src/main/java/io/spark/core/android/cloud/login/TokenRequest.java
index d4e4df6..5678f8b 100644
--- a/SparkCore/src/io/spark/core/android/cloud/login/TokenRequest.java
+++ b/app/src/main/java/io/spark/core/android/cloud/login/TokenRequest.java
@@ -1,14 +1,15 @@
package io.spark.core.android.cloud.login;
-import static org.solemnsilence.util.Py.list;
-import io.spark.core.android.util.Strings;
-
-import java.util.List;
-
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
+import java.util.List;
+
+import io.spark.core.android.util.Strings;
+
+import static org.solemnsilence.util.Py.list;
+
/**
* Note: cannot be used with GSON like the other models, thus the placement in a
diff --git a/SparkCore/src/io/spark/core/android/cloud/login/TokenResponse.java b/app/src/main/java/io/spark/core/android/cloud/login/TokenResponse.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/cloud/login/TokenResponse.java
rename to app/src/main/java/io/spark/core/android/cloud/login/TokenResponse.java
diff --git a/SparkCore/src/io/spark/core/android/cloud/login/TokenTool.java b/app/src/main/java/io/spark/core/android/cloud/login/TokenTool.java
similarity index 72%
rename from SparkCore/src/io/spark/core/android/cloud/login/TokenTool.java
rename to app/src/main/java/io/spark/core/android/cloud/login/TokenTool.java
index 950c19e..9c9d0ff 100644
--- a/SparkCore/src/io/spark/core/android/cloud/login/TokenTool.java
+++ b/app/src/main/java/io/spark/core/android/cloud/login/TokenTool.java
@@ -1,53 +1,46 @@
package io.spark.core.android.cloud.login;
-import io.spark.core.android.app.AppConfig;
-import io.spark.core.android.cloud.ApiUrlHelper;
+import android.net.Uri;
+import android.util.Base64;
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.HttpURLConnection;
-import java.net.URL;
+import com.google.gson.Gson;
+import com.squareup.okhttp.OkHttpClient;
import org.apache.http.protocol.HTTP;
import org.solemnsilence.util.TLog;
-import android.net.Uri;
-import android.util.Base64;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
-import com.google.gson.Gson;
-import com.squareup.okhttp.OkHttpClient;
+import io.spark.core.android.app.AppConfig;
+import io.spark.core.android.cloud.ApiUrlHelper;
public class TokenTool {
- private static final TLog log = new TLog(TokenTool.class);
+ private static final TLog log = new TLog(TokenTool.class);
- private static final String[] PATH_SEGMENTS = new String[] { "oauth", "token" };
+ private static final String[] PATH_SEGMENTS = new String[] {"oauth", "token"};
- private final Gson gson;
- private final OkHttpClient okHttpclient;
+ private final Gson gson;
+ private final OkHttpClient okHttpclient;
- public TokenTool(Gson gson, OkHttpClient okHttpclient) {
- this.gson = gson;
- this.okHttpclient = okHttpclient;
- }
+ public TokenTool(Gson gson, OkHttpClient okHttpclient) {
+ this.gson = gson;
+ this.okHttpclient = okHttpclient;
+ }
- public TokenResponse requestToken(TokenRequest tokenRequest) {
- // URL url = ApiUrlHelper.buildUrlNoVersion(PATH);
- Uri.Builder uriBuilder = ApiUrlHelper.getBaseUriBuilder();
- for (String pathSegment : PATH_SEGMENTS) {
- uriBuilder.appendPath(pathSegment);
- }
- URL url = ApiUrlHelper.convertToURL(uriBuilder);
- HttpURLConnection urlConnection = null;
+ public TokenResponse requestToken(TokenRequest tokenRequest) {
+ // URL url = ApiUrlHelper.buildUrlNoVersion(PATH);
+ Uri.Builder uriBuilder = ApiUrlHelper.getBaseUriBuilder();
+ for (String pathSegment : PATH_SEGMENTS) {
+ uriBuilder.appendPath(pathSegment);
+ }
+ URL url = ApiUrlHelper.convertToURL(uriBuilder);
+ HttpURLConnection urlConnection = null;
try {
urlConnection = okHttpclient.open(url);
return requestTokenPrivate(urlConnection, tokenRequest);
diff --git a/SparkCore/src/io/spark/core/android/cloud/requestservice/ClearableIntentService.java b/app/src/main/java/io/spark/core/android/cloud/requestservice/ClearableIntentService.java
similarity index 85%
rename from SparkCore/src/io/spark/core/android/cloud/requestservice/ClearableIntentService.java
rename to app/src/main/java/io/spark/core/android/cloud/requestservice/ClearableIntentService.java
index a95387b..8b8c74d 100644
--- a/SparkCore/src/io/spark/core/android/cloud/requestservice/ClearableIntentService.java
+++ b/app/src/main/java/io/spark/core/android/cloud/requestservice/ClearableIntentService.java
@@ -32,9 +32,9 @@
* when by sending "ACTION_CLEAR_INTENT_QUEUE"
*
*
- * IntentService is a base class for {@link Service}s that handle asynchronous
- * requests (expressed as {@link Intent}s) on demand. Clients send requests
- * through {@link android.content.Context#startService(Intent)} calls; the
+ * IntentService is a base class for {@link android.app.Service}s that handle asynchronous
+ * requests (expressed as {@link android.content.Intent}s) on demand. Clients send requests
+ * through {@link android.content.Context#startService(android.content.Intent)} calls; the
* service is started as needed, handles each Intent in turn using a worker
* thread, and stops itself when it runs out of work.
*
@@ -42,7 +42,7 @@
* This "work queue processor" pattern is commonly used to offload tasks from an
* application's main thread. The IntentService class exists to simplify this
* pattern and take care of the mechanics. To use it, extend IntentService and
- * implement {@link #onHandleIntent(Intent)}. IntentService will receive the
+ * implement {@link #onHandleIntent(android.content.Intent)}. IntentService will receive the
* Intents, launch a worker thread, and stop the service as appropriate.
*
*
@@ -102,16 +102,16 @@ public ClearableIntentService(String name) {
* with your preferred semantics.
*
*
- * If enabled is true, {@link #onStartCommand(Intent, int, int)} will return
- * {@link Service#START_REDELIVER_INTENT}, so if this process dies before
- * {@link #onHandleIntent(Intent)} returns, the process will be restarted
+ * If enabled is true, {@link #onStartCommand(android.content.Intent, int, int)} will return
+ * {@link android.app.Service#START_REDELIVER_INTENT}, so if this process dies before
+ * {@link #onHandleIntent(android.content.Intent)} returns, the process will be restarted
* and the intent redelivered. If multiple Intents have been sent, only the
* most recent one is guaranteed to be redelivered.
*
*
* If enabled is false (the default),
- * {@link #onStartCommand(Intent, int, int)} will return
- * {@link Service#START_NOT_STICKY}, and if the process dies, the Intent
+ * {@link #onStartCommand(android.content.Intent, int, int)} will return
+ * {@link android.app.Service#START_NOT_STICKY}, and if the process dies, the Intent
* dies along with it.
*/
public void setIntentRedelivery(boolean enabled) {
@@ -181,7 +181,7 @@ public IBinder onBind(Intent intent) {
*
* @param intent
* The value passed to
- * {@link android.content.Context#startService(Intent)}.
+ * {@link android.content.Context#startService(android.content.Intent)}.
*/
protected abstract void onHandleIntent(Intent intent);
}
diff --git a/SparkCore/src/io/spark/core/android/cloud/requestservice/SimpleSparkApiService.java b/app/src/main/java/io/spark/core/android/cloud/requestservice/SimpleSparkApiService.java
similarity index 91%
rename from SparkCore/src/io/spark/core/android/cloud/requestservice/SimpleSparkApiService.java
rename to app/src/main/java/io/spark/core/android/cloud/requestservice/SimpleSparkApiService.java
index 8088863..4ae50dd 100644
--- a/SparkCore/src/io/spark/core/android/cloud/requestservice/SimpleSparkApiService.java
+++ b/app/src/main/java/io/spark/core/android/cloud/requestservice/SimpleSparkApiService.java
@@ -1,17 +1,20 @@
package io.spark.core.android.cloud.requestservice;
-import static org.solemnsilence.util.Py.list;
-import static org.solemnsilence.util.Py.truthy;
-import io.spark.core.android.R;
-import io.spark.core.android.app.AppConfig;
-import io.spark.core.android.cloud.ApiFacade;
-import io.spark.core.android.cloud.ApiFacade.ApiResponseReceiver;
-import io.spark.core.android.cloud.ApiUrlHelper;
-import io.spark.core.android.cloud.WebHelpers;
-import io.spark.core.android.cloud.login.TokenRequest;
-import io.spark.core.android.cloud.login.TokenResponse;
-import io.spark.core.android.cloud.login.TokenTool;
-import io.spark.core.android.storage.Prefs;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.ResultReceiver;
+import android.support.v4.content.LocalBroadcastManager;
+
+import com.google.gson.Gson;
+import com.squareup.okhttp.OkHttpClient;
+
+import org.apache.http.NameValuePair;
+import org.apache.http.client.utils.URLEncodedUtils;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.protocol.HTTP;
+import org.solemnsilence.util.TLog;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -21,21 +24,18 @@
import java.net.URL;
import java.util.List;
-import org.apache.http.NameValuePair;
-import org.apache.http.client.utils.URLEncodedUtils;
-import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.protocol.HTTP;
-import org.solemnsilence.util.TLog;
-
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.ResultReceiver;
-import android.support.v4.content.LocalBroadcastManager;
+import io.spark.core.android.R;
+import io.spark.core.android.app.AppConfig;
+import io.spark.core.android.cloud.ApiFacade;
+import io.spark.core.android.cloud.ApiUrlHelper;
+import io.spark.core.android.cloud.WebHelpers;
+import io.spark.core.android.cloud.login.TokenRequest;
+import io.spark.core.android.cloud.login.TokenResponse;
+import io.spark.core.android.cloud.login.TokenTool;
+import io.spark.core.android.storage.Prefs;
-import com.google.gson.Gson;
-import com.squareup.okhttp.OkHttpClient;
+import static org.solemnsilence.util.Py.list;
+import static org.solemnsilence.util.Py.truthy;
/**
@@ -65,7 +65,7 @@ public class SimpleSparkApiService extends ClearableIntentService {
/**
- * Perform a POST request with the given args -- see {@link ApiFacade} for
+ * Perform a POST request with the given args -- see {@link io.spark.core.android.cloud.ApiFacade} for
* examples.
*
* @param ctx
@@ -82,12 +82,12 @@ public class SimpleSparkApiService extends ClearableIntentService {
* @param resultReceiver
* Optional; specifies the ResultReceiver instance to use for
* receiving the result. Using a subclass of
- * {@link ApiResponseReceiver} here is recommended for
+ * {@link io.spark.core.android.cloud.ApiFacade.ApiResponseReceiver} here is recommended for
* simplicity.
* @param broadcastName
* Optional; specifies the "action" string for a broadcast to be
- * sent via {@link LocalBroadcastManager}. See
- * {@link #processResponse(Response, Intent)} for more info.
+ * sent via {@link android.support.v4.content.LocalBroadcastManager}. See
+ * {@link #processResponse(io.spark.core.android.cloud.requestservice.SimpleSparkApiService.Response, android.content.Intent)} for more info.
*/
public static void post(Context ctx, String[] resourcePathSegments,
Bundle formEncodingBodyData, ResultReceiver resultReceiver, String broadcastName) {
@@ -98,7 +98,7 @@ public static void post(Context ctx, String[] resourcePathSegments,
}
/**
- * Perform a PUT request with the given args -- see {@link ApiFacade} for
+ * Perform a PUT request with the given args -- see {@link io.spark.core.android.cloud.ApiFacade} for
* examples
*
* @param ctx
@@ -114,12 +114,12 @@ public static void post(Context ctx, String[] resourcePathSegments,
* @param resultReceiver
* Optional; specifies the ResultReceiver instance to use for
* receiving the result. Using a subclass of
- * {@link ApiResponseReceiver} here is recommended for
+ * {@link io.spark.core.android.cloud.ApiFacade.ApiResponseReceiver} here is recommended for
* simplicity.
* @param broadcastName
* Optional; specifies the "action" string for a broadcast to be
- * sent via {@link LocalBroadcastManager}. See
- * {@link #processResponse(Response, Intent)} for more info.
+ * sent via {@link android.support.v4.content.LocalBroadcastManager}. See
+ * {@link #processResponse(io.spark.core.android.cloud.requestservice.SimpleSparkApiService.Response, android.content.Intent)} for more info.
*/
public static void put(Context ctx, String[] resourcePathSegments, Bundle params,
ResultReceiver resultReceiver, String broadcastName) {
@@ -131,7 +131,7 @@ public static void put(Context ctx, String[] resourcePathSegments, Bundle params
}
/**
- * Perform a GET request -- see {@link ApiFacade} for examples
+ * Perform a GET request -- see {@link io.spark.core.android.cloud.ApiFacade} for examples
*
* @param ctx
* any Context
@@ -146,12 +146,12 @@ public static void put(Context ctx, String[] resourcePathSegments, Bundle params
* @param resultReceiver
* Optional; specifies the ResultReceiver instance to use for
* receiving the result. Using a subclass of
- * {@link ApiResponseReceiver} here is recommended for
+ * {@link io.spark.core.android.cloud.ApiFacade.ApiResponseReceiver} here is recommended for
* simplicity.
* @param broadcastName
* Optional; specifies the "action" string for a broadcast to be
- * sent via {@link LocalBroadcastManager}. See
- * {@link #processResponse(Response, Intent)} for more info.
+ * sent via {@link android.support.v4.content.LocalBroadcastManager}. See
+ * {@link #processResponse(io.spark.core.android.cloud.requestservice.SimpleSparkApiService.Response, android.content.Intent)} for more info.
*/
public static void get(Context ctx, String[] resourcePathSegments, Bundle params,
ResultReceiver resultReceiver, String broadcastName) {
@@ -493,6 +493,6 @@ public String toString() {
}
- private static final TLog log = new TLog(SimpleSparkApiService.class);
+ private static final TLog log = new TLog(SimpleSparkApiService.class);
}
diff --git a/SparkCore/src/io/spark/core/android/smartconfig/SmartConfigService.java b/app/src/main/java/io/spark/core/android/smartconfig/SmartConfigService.java
similarity index 99%
rename from SparkCore/src/io/spark/core/android/smartconfig/SmartConfigService.java
rename to app/src/main/java/io/spark/core/android/smartconfig/SmartConfigService.java
index 06d145f..78fac52 100644
--- a/SparkCore/src/io/spark/core/android/smartconfig/SmartConfigService.java
+++ b/app/src/main/java/io/spark/core/android/smartconfig/SmartConfigService.java
@@ -1,11 +1,18 @@
package io.spark.core.android.smartconfig;
-import static org.solemnsilence.util.Py.set;
-import io.spark.core.android.app.AppConfig;
-import io.spark.core.android.app.DeviceState;
-import io.spark.core.android.cloud.ApiFacade;
-import io.spark.core.android.util.Strings;
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.support.v4.content.LocalBroadcastManager;
+
+import com.integrity_project.smartconfiglib.FirstTimeConfig;
+import com.integrity_project.smartconfiglib.FirstTimeConfigListener;
+
+import org.solemnsilence.util.EZ;
+import org.solemnsilence.util.TLog;
import java.io.IOException;
import java.net.DatagramPacket;
@@ -21,18 +28,12 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
-import org.solemnsilence.util.EZ;
-import org.solemnsilence.util.TLog;
-
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.support.v4.content.LocalBroadcastManager;
+import io.spark.core.android.app.AppConfig;
+import io.spark.core.android.app.DeviceState;
+import io.spark.core.android.cloud.ApiFacade;
+import io.spark.core.android.util.Strings;
-import com.integrity_project.smartconfiglib.FirstTimeConfig;
-import com.integrity_project.smartconfiglib.FirstTimeConfigListener;
+import static org.solemnsilence.util.Py.set;
/**
diff --git a/SparkCore/src/io/spark/core/android/smartconfig/SmartConfigState.java b/app/src/main/java/io/spark/core/android/smartconfig/SmartConfigState.java
similarity index 99%
rename from SparkCore/src/io/spark/core/android/smartconfig/SmartConfigState.java
rename to app/src/main/java/io/spark/core/android/smartconfig/SmartConfigState.java
index 899f8b7..46ba012 100644
--- a/SparkCore/src/io/spark/core/android/smartconfig/SmartConfigState.java
+++ b/app/src/main/java/io/spark/core/android/smartconfig/SmartConfigState.java
@@ -1,11 +1,10 @@
package io.spark.core.android.smartconfig;
-import static org.solemnsilence.util.Py.set;
+import com.google.common.collect.Sets;
import java.util.Set;
-import com.google.common.collect.Sets;
-
+import static org.solemnsilence.util.Py.set;
public class SmartConfigState {
diff --git a/SparkCore/src/io/spark/core/android/storage/Prefs.java b/app/src/main/java/io/spark/core/android/storage/Prefs.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/storage/Prefs.java
rename to app/src/main/java/io/spark/core/android/storage/Prefs.java
index cfdf11e..0ad12d2 100644
--- a/SparkCore/src/io/spark/core/android/storage/Prefs.java
+++ b/app/src/main/java/io/spark/core/android/storage/Prefs.java
@@ -1,13 +1,13 @@
package io.spark.core.android.storage;
-import static org.solemnsilence.util.Py.list;
-import io.spark.core.android.ui.tinker.PinAction;
+import android.content.Context;
+import android.content.SharedPreferences;
import java.util.List;
-import android.content.Context;
-import android.content.SharedPreferences;
+import io.spark.core.android.ui.tinker.PinAction;
+import static org.solemnsilence.util.Py.list;
public class Prefs {
diff --git a/SparkCore/src/io/spark/core/android/storage/TinkerPrefs.java b/app/src/main/java/io/spark/core/android/storage/TinkerPrefs.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/storage/TinkerPrefs.java
rename to app/src/main/java/io/spark/core/android/storage/TinkerPrefs.java
diff --git a/SparkCore/src/io/spark/core/android/ui/BaseActivity.java b/app/src/main/java/io/spark/core/android/ui/BaseActivity.java
similarity index 98%
rename from SparkCore/src/io/spark/core/android/ui/BaseActivity.java
rename to app/src/main/java/io/spark/core/android/ui/BaseActivity.java
index 729072e..1986760 100644
--- a/SparkCore/src/io/spark/core/android/ui/BaseActivity.java
+++ b/app/src/main/java/io/spark/core/android/ui/BaseActivity.java
@@ -8,7 +8,6 @@
import io.spark.core.android.storage.Prefs;
import io.spark.core.android.ui.assets.Typefaces;
import io.spark.core.android.ui.assets.Typefaces.Style;
-import io.spark.core.android.ui.corelist.CoreListActivity;
import io.spark.core.android.ui.util.Ui;
import org.apache.commons.lang3.StringUtils;
@@ -56,7 +55,7 @@ public abstract class BaseActivity extends Activity {
/**
* In most of the activities in this project, the Up button should be
* visible if there are any Cores assigned to this account, but should NOT
- * be visible otherwise. The exception is in {@link CoreListActivity}, which
+ * be visible otherwise. The exception is in {@link io.spark.core.android.ui.corelist.CoreListActivity}, which
* is the top of the app's hierarchy, and as such should never show the Up
* button.
*
diff --git a/SparkCore/src/io/spark/core/android/ui/BaseFragment.java b/app/src/main/java/io/spark/core/android/ui/BaseFragment.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/ui/BaseFragment.java
rename to app/src/main/java/io/spark/core/android/ui/BaseFragment.java
diff --git a/SparkCore/src/io/spark/core/android/ui/ErrorsDelegate.java b/app/src/main/java/io/spark/core/android/ui/ErrorsDelegate.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/ui/ErrorsDelegate.java
rename to app/src/main/java/io/spark/core/android/ui/ErrorsDelegate.java
diff --git a/SparkCore/src/io/spark/core/android/ui/LoginActivity.java b/app/src/main/java/io/spark/core/android/ui/LoginActivity.java
similarity index 96%
rename from SparkCore/src/io/spark/core/android/ui/LoginActivity.java
rename to app/src/main/java/io/spark/core/android/ui/LoginActivity.java
index ab32f54..60c99c0 100644
--- a/SparkCore/src/io/spark/core/android/ui/LoginActivity.java
+++ b/app/src/main/java/io/spark/core/android/ui/LoginActivity.java
@@ -41,10 +41,7 @@ public class LoginActivity extends BaseActivity {
private EditText mPasswordView;
private Button accountAction;
- private String email;
- private String password;
-
- private NetConnectionHelper netConnectionHelper;
+ private NetConnectionHelper netConnectionHelper;
private LoggedInReceiver loginReceiver = new LoggedInReceiver();
private DevicesLoadedReceiver devicesLoadedReceiver = new DevicesLoadedReceiver();
@@ -75,7 +72,7 @@ public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
});
accountAction = Ui.findView(this, R.id.sign_up_button);
- accountAction.setOnClickListener(new View.OnClickListener() {
+ accountAction.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
@@ -164,8 +161,8 @@ public void attemptLogin() {
mPasswordView.setError(null);
// Store values at the time of the login attempt.
- email = mEmailView.getText().toString();
- password = mPasswordView.getText().toString();
+ final String email = mEmailView.getText().toString();
+ final String password = mPasswordView.getText().toString();
boolean cancel = false;
View focusView = null;
diff --git a/SparkCore/src/io/spark/core/android/ui/SignUpActivity.java b/app/src/main/java/io/spark/core/android/ui/SignUpActivity.java
similarity index 79%
rename from SparkCore/src/io/spark/core/android/ui/SignUpActivity.java
rename to app/src/main/java/io/spark/core/android/ui/SignUpActivity.java
index a73676d..cfb12ed 100644
--- a/SparkCore/src/io/spark/core/android/ui/SignUpActivity.java
+++ b/app/src/main/java/io/spark/core/android/ui/SignUpActivity.java
@@ -1,18 +1,5 @@
package io.spark.core.android.ui;
-import static org.solemnsilence.util.Py.list;
-import static org.solemnsilence.util.Py.truthy;
-import io.spark.core.android.R;
-import io.spark.core.android.app.DeviceState;
-import io.spark.core.android.cloud.ApiFacade;
-import io.spark.core.android.cloud.requestservice.SimpleSparkApiService;
-import io.spark.core.android.ui.corelist.CoreListActivity;
-import io.spark.core.android.ui.util.Ui;
-
-import org.apache.http.HttpStatus;
-import org.solemnsilence.util.EZ;
-import org.solemnsilence.util.TLog;
-
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -28,11 +15,21 @@
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.inputmethod.EditorInfo;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.ScrollView;
-import android.widget.TextView;
-import android.widget.Toast;
+import android.widget.*;
+
+import org.apache.http.HttpStatus;
+
+import io.spark.core.android.R;
+import io.spark.core.android.app.DeviceState;
+import io.spark.core.android.cloud.ApiFacade;
+import io.spark.core.android.cloud.requestservice.SimpleSparkApiService;
+import io.spark.core.android.ui.corelist.CoreListActivity;
+import io.spark.core.android.ui.util.Ui;
+
+import org.solemnsilence.util.EZ;
+import org.solemnsilence.util.TLog;
+import static org.solemnsilence.util.Py.list;
+import static org.solemnsilence.util.Py.truthy;
/**
@@ -42,68 +39,68 @@
public class SignUpActivity extends BaseActivity {
- private static final TLog log = new TLog(SignUpActivity.class);
+ private static final TLog log = new TLog(SignUpActivity.class);
- // Indicate that we came from the login screen, so don't attempt
- // "launchNextActivityIfReady()"
- public static final String EXTRA_FROM_LOGIN = "io.spark.core.android.extra.FROM_LOGIN";
+ // Indicate that we came from the login screen, so don't attempt
+ // "launchNextActivityIfReady()"
+ public static final String EXTRA_FROM_LOGIN = "io.spark.core.android.extra.FROM_LOGIN";
- // Values for email and password at the time of the login attempt.
- private String mEmail;
- private String mPassword;
- private String savedErrorMessage;
- private boolean waitForDevicesOnLogin = false;
+ // Values for email and password at the time of the login attempt.
+ private String mEmail;
+ private String mPassword;
+ private String savedErrorMessage;
+ private boolean waitForDevicesOnLogin = false;
- // UI references.
- private EditText mEmailView;
- private EditText mPasswordView;
- private Button accountAction;
+ // UI references.
+ private EditText mEmailView;
+ private EditText mPasswordView;
+ private Button accountAction;
- private LoggedInReceiver loggedInReceiver = new LoggedInReceiver();
- private SignUpReceiver signUpReceiver = new SignUpReceiver();
- private DevicesLoadedReceiver devicesLoadedReceiver = new DevicesLoadedReceiver();
+ private LoggedInReceiver loggedInReceiver = new LoggedInReceiver();
+ private SignUpReceiver signUpReceiver = new SignUpReceiver();
+ private DevicesLoadedReceiver devicesLoadedReceiver = new DevicesLoadedReceiver();
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
- Intent nextActivityToSkipTo = getNextActivityToSkipTo();
+ Intent nextActivityToSkipTo = getNextActivityToSkipTo();
- // NOTE EARLY RETURN HERE
- if (nextActivityToSkipTo != null) {
- if (!isFinishing()) {
- startActivity(nextActivityToSkipTo);
- }
- finish();
- return;
- }
+ // NOTE EARLY RETURN HERE
+ if (nextActivityToSkipTo != null) {
+ if (!isFinishing()) {
+ startActivity(nextActivityToSkipTo);
+ }
+ finish();
+ return;
+ }
- setContentView(R.layout.activity_sign_up);
+ setContentView(R.layout.activity_sign_up);
- mEmailView = Ui.findView(this, R.id.email);
- mPasswordView = Ui.findView(this, R.id.password);
+ mEmailView = Ui.findView(this, R.id.email);
+ mPasswordView = Ui.findView(this, R.id.password);
- Ui.setTextFromHtml(this, R.id.already_have_account, R.string.i_already_have_an_account);
- TextView finePrint = Ui.setTextFromHtml(this, R.id.fine_print, R.string.sign_up_fine_print);
- finePrint.setMovementMethod(LinkMovementMethod.getInstance());
+ Ui.setTextFromHtml(this, R.id.already_have_account, R.string.i_already_have_an_account);
+ TextView finePrint = Ui.setTextFromHtml(this, R.id.fine_print, R.string.sign_up_fine_print);
+ finePrint.setMovementMethod(LinkMovementMethod.getInstance());
- mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
+ mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
- @Override
- public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
- if (id == R.id.login || id == EditorInfo.IME_NULL) {
- attemptLogin();
- return true;
- }
- return false;
- }
- });
+ @Override
+ public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
+ if (id == R.id.login || id == EditorInfo.IME_NULL) {
+ attemptLogin();
+ return true;
+ }
+ return false;
+ }
+ });
- accountAction = Ui.findView(this, R.id.sign_up_button);
- accountAction.setOnClickListener(new View.OnClickListener() {
+ accountAction = Ui.findView(this, R.id.sign_up_button);
+ accountAction.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
diff --git a/SparkCore/src/io/spark/core/android/ui/assets/Typefaces.java b/app/src/main/java/io/spark/core/android/ui/assets/Typefaces.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/ui/assets/Typefaces.java
rename to app/src/main/java/io/spark/core/android/ui/assets/Typefaces.java
diff --git a/SparkCore/src/io/spark/core/android/ui/corelist/CoreListActivity.java b/app/src/main/java/io/spark/core/android/ui/corelist/CoreListActivity.java
similarity index 80%
rename from SparkCore/src/io/spark/core/android/ui/corelist/CoreListActivity.java
rename to app/src/main/java/io/spark/core/android/ui/corelist/CoreListActivity.java
index dedb750..53c157f 100644
--- a/SparkCore/src/io/spark/core/android/ui/corelist/CoreListActivity.java
+++ b/app/src/main/java/io/spark/core/android/ui/corelist/CoreListActivity.java
@@ -1,17 +1,5 @@
package io.spark.core.android.ui.corelist;
-import static org.solemnsilence.util.Py.truthy;
-import io.spark.core.android.R;
-import io.spark.core.android.app.DeviceState;
-import io.spark.core.android.cloud.api.Device;
-import io.spark.core.android.smartconfig.SmartConfigState;
-import io.spark.core.android.ui.BaseActivity;
-import io.spark.core.android.ui.smartconfig.SmartConfigActivity;
-import io.spark.core.android.ui.tinker.TinkerFragment;
-import io.spark.core.android.ui.util.Ui;
-
-import org.solemnsilence.util.TLog;
-
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Fragment;
@@ -25,52 +13,64 @@
import android.view.View;
import android.view.ViewTreeObserver;
+import org.solemnsilence.util.TLog;
+
+import io.spark.core.android.R;
+import io.spark.core.android.app.DeviceState;
+import io.spark.core.android.cloud.api.Device;
+import io.spark.core.android.smartconfig.SmartConfigState;
+import io.spark.core.android.ui.BaseActivity;
+import io.spark.core.android.ui.smartconfig.SmartConfigActivity;
+import io.spark.core.android.ui.tinker.TinkerFragment;
+import io.spark.core.android.ui.util.Ui;
+
+import static org.solemnsilence.util.Py.truthy;
public class CoreListActivity extends BaseActivity implements CoreListFragment.Callbacks {
- private static final TLog log = new TLog(CoreListActivity.class);
+ private static final TLog log = new TLog(CoreListActivity.class);
- public static final String ARG_SKIP_TO_SMART_CONFIG = "ARG_SKIP_TO_SMART_CONFIG";
- public static final String ARG_ENTERING_FROM_LAUNCH = "ARG_ENTERING_FROM_LAUNCH";
- public static final String ARG_SELECT_DEVICE_ID = "ARG_SELECT_DEVICE_ID";
+ public static final String ARG_SKIP_TO_SMART_CONFIG = "ARG_SKIP_TO_SMART_CONFIG";
+ public static final String ARG_ENTERING_FROM_LAUNCH = "ARG_ENTERING_FROM_LAUNCH";
+ public static final String ARG_SELECT_DEVICE_ID = "ARG_SELECT_DEVICE_ID";
- private static final String STATE_SELECTED_DEVICE_ID = "STATE_SELECTED_DEVICE_ID";
- private static final String STATE_PANE_OPEN = "STATE_PANE_OPEN";
+ private static final String STATE_SELECTED_DEVICE_ID = "STATE_SELECTED_DEVICE_ID";
+ private static final String STATE_PANE_OPEN = "STATE_PANE_OPEN";
- private LayerDrawable actionBarBackgroundDrawable;
- private ActionBar actionBar;
- private SlidingPaneLayout slidingLayout;
- private String selectedItemId;
+ private LayerDrawable actionBarBackgroundDrawable;
+ private ActionBar actionBar;
+ private SlidingPaneLayout slidingLayout;
+ private String selectedItemId;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- String deviceIdToSelect = null;
- boolean openPane = true;
-
- // The below is to try to present the user with the "best"
- // activity on launch, but still allowing them to return to the Core
- // list.
- // TODO: document further
- Intent intentToSkipTo = null;
- if (savedInstanceState != null) {
- if (savedInstanceState.containsKey(STATE_SELECTED_DEVICE_ID)) {
- deviceIdToSelect = savedInstanceState.getString(STATE_SELECTED_DEVICE_ID);
- }
- if (savedInstanceState.containsKey(STATE_PANE_OPEN)) {
- openPane = savedInstanceState.getBoolean(STATE_PANE_OPEN);
- }
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ String deviceIdToSelect = null;
+ boolean openPane = true;
+
+ // The below is to try to present the user with the "best"
+ // activity on launch, but still allowing them to return to the Core
+ // list.
+ // TODO: document further
+ Intent intentToSkipTo = null;
+ if (savedInstanceState != null) {
+ if (savedInstanceState.containsKey(STATE_SELECTED_DEVICE_ID)) {
+ deviceIdToSelect = savedInstanceState.getString(STATE_SELECTED_DEVICE_ID);
+ }
+ if (savedInstanceState.containsKey(STATE_PANE_OPEN)) {
+ openPane = savedInstanceState.getBoolean(STATE_PANE_OPEN);
+ }
- } else if (getIntent().hasExtra(ARG_SKIP_TO_SMART_CONFIG)) {
- getIntent().removeExtra(ARG_SKIP_TO_SMART_CONFIG);
- intentToSkipTo = new Intent(this, SmartConfigActivity.class);
+ } else if (getIntent().hasExtra(ARG_SKIP_TO_SMART_CONFIG)) {
+ getIntent().removeExtra(ARG_SKIP_TO_SMART_CONFIG);
+ intentToSkipTo = new Intent(this, SmartConfigActivity.class);
- } else if (getIntent().hasExtra(ARG_ENTERING_FROM_LAUNCH)) {
- log.i("Known devices count: " + DeviceState.getKnownDevices().size());
+ } else if (getIntent().hasExtra(ARG_ENTERING_FROM_LAUNCH)) {
+ log.i("Known devices count: " + DeviceState.getKnownDevices().size());
if (DeviceState.getKnownDevices().isEmpty()) {
intentToSkipTo = new Intent(this, SmartConfigActivity.class);
diff --git a/app/src/main/java/io/spark/core/android/ui/corelist/CoreListFragment.java b/app/src/main/java/io/spark/core/android/ui/corelist/CoreListFragment.java
new file mode 100644
index 0000000..582ace0
--- /dev/null
+++ b/app/src/main/java/io/spark/core/android/ui/corelist/CoreListFragment.java
@@ -0,0 +1,236 @@
+package io.spark.core.android.ui.corelist;
+
+import android.app.Activity;
+import android.app.ListFragment;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.support.v4.content.LocalBroadcastManager;
+import android.view.*;
+import android.widget.ListView;
+
+
+import io.spark.core.android.R;
+import io.spark.core.android.app.DeviceState;
+import io.spark.core.android.cloud.ApiFacade;
+import io.spark.core.android.cloud.api.Device;
+import io.spark.core.android.ui.util.Ui;
+import static org.solemnsilence.util.Py.*;
+import static org.solemnsilence.util.Py.Ranger.IntValue;
+
+import org.solemnsilence.util.EZ;
+import org.solemnsilence.util.TLog;
+
+
+/**
+ * A list fragment representing a list of Cores. This fragment also supports
+ * tablet devices by allowing list items to be given an 'activated' state upon
+ * selection. This helps indicate which item is currently being viewed in a
+ * {@link io.spark.core.android.ui.tinker.TinkerFragment}.
+ *
+ * Activities containing this fragment MUST implement the {@link io.spark.core.android.ui.corelist.CoreListFragment.Callbacks}
+ * interface.
+ */
+public class CoreListFragment extends ListFragment {
+
+
+ private static final TLog log = new TLog(CoreListFragment.class);
+
+
+ /**
+ * The fragment's current callback object, which is notified of list item
+ * clicks.
+ */
+ private Callbacks mCallbacks = sDummyCallbacks;
+
+ /**
+ * The current activated item position. Only used on tablets.
+ */
+ private int mActivatedPosition = ListView.INVALID_POSITION;
+
+ /**
+ * A callback interface that all activities containing this fragment must
+ * implement. This mechanism allows activities to be notified of item
+ * selections.
+ */
+ public interface Callbacks {
+
+ /**
+ * Callback for when an item has been selected.
+ */
+ public void onItemSelected(String id);
+ }
+
+ /**
+ * A dummy implementation of the {@link io.spark.core.android.ui.corelist.CoreListFragment.Callbacks} interface that does
+ * nothing. Used only when this fragment is not attached to an activity.
+ */
+ private static Callbacks sDummyCallbacks = new Callbacks() {
+
+ @Override
+ public void onItemSelected(String id) {
+ }
+ };
+
+ DeviceListAdapter deviceAdapter;
+ DevicesUpdatedReceiver updatesReceiver;
+ LocalBroadcastManager broadcastMgr;
+ ApiFacade api;
+
+ String selectedDeviceId = null;
+
+ /**
+ * Mandatory empty constructor for the fragment manager to instantiate the
+ * fragment (e.g. upon screen orientation changes).
+ */
+ public CoreListFragment() {
+ }
+
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+
+ // Activities containing this fragment must implement its callbacks.
+ if (!(activity instanceof Callbacks)) {
+ throw new IllegalStateException("Activity must implement fragment's callbacks.");
+ }
+
+ mCallbacks = (Callbacks) activity;
+ broadcastMgr = LocalBroadcastManager.getInstance(activity);
+ api = ApiFacade.getInstance(activity);
+
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ updatesReceiver = new DevicesUpdatedReceiver();
+ deviceAdapter = new DeviceListAdapter(getActivity());
+ setListAdapter(deviceAdapter);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.fragment_core_list, container, false);
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ updateDevicesList();
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ broadcastMgr.registerReceiver(updatesReceiver, updatesReceiver.getIntentFilter());
+ }
+
+ @Override
+ public void onStop() {
+ broadcastMgr.unregisterReceiver(updatesReceiver);
+ super.onStop();
+ }
+
+ @Override
+ public void onDetach() {
+ super.onDetach();
+ // Reset the active callbacks interface to the dummy implementation.
+ mCallbacks = sDummyCallbacks;
+ }
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ super.onCreateOptionsMenu(menu, inflater);
+ inflater.inflate(R.menu.core_list, menu);
+ }
+
+ @Override
+ public void onListItemClick(ListView listView, View view, int position, long id) {
+ super.onListItemClick(listView, view, position, id);
+
+ Device selectedDevice = deviceAdapter.getItem(position);
+ // Notify the active callbacks interface (the activity, if the
+ // fragment is attached to one) that an item has been selected.
+ mCallbacks.onItemSelected(selectedDevice.id);
+ mActivatedPosition = position;
+ }
+
+ public void setActivatedItem(String id) {
+ Device device = DeviceState.getDeviceById(id);
+ if (device == null) {
+ log.w("Device was null when trying to set active list item??");
+ return;
+ }
+ selectedDeviceId = device.id;
+ mActivatedPosition = deviceAdapter.getPosition(device);
+ setActiveCoreView();
+ }
+
+ private void updateDevicesList() {
+ log.d("updateDevicesList()");
+ deviceAdapter.clear();
+ deviceAdapter.addAll(DeviceState.getKnownDevices());
+ if (selectedDeviceId != null) {
+ setActivatedItem(selectedDeviceId);
+ setActiveCoreView();
+ }
+ }
+
+ private void setActiveCoreView() {
+ // This is just *ugly*, but all of this seems to be necessary to
+ // *always* show the colored stripe next to the selected core.
+ for (IntValue intValue : range(getListView().getChildCount())) {
+ View child = getListView().getChildAt(intValue.value);
+ if (intValue.value == mActivatedPosition) {
+ Ui.findView(child, R.id.active_core_stripe).setVisibility(View.VISIBLE);
+ child.setActivated(true);
+ } else {
+ Ui.findView(child, R.id.active_core_stripe).setVisibility(View.INVISIBLE);
+ }
+ }
+
+ EZ.runOnMainThread(new Runnable() {
+
+ @Override
+ public void run() {
+ ListView lv = null;
+ try {
+ lv = getListView();
+ if (getActivity() == null || getActivity().isFinishing() || lv == null) {
+ return;
+ }
+ } catch (IllegalStateException e) {
+ return;
+ }
+ for (IntValue intValue : range(lv.getChildCount())) {
+ View child = lv.getChildAt(intValue.value);
+ if (intValue.value == mActivatedPosition) {
+ Ui.findView(child, R.id.active_core_stripe).setVisibility(View.VISIBLE);
+ child.setActivated(true);
+ } else {
+ Ui.findView(child, R.id.active_core_stripe).setVisibility(View.INVISIBLE);
+ }
+ }
+ }
+ });
+ }
+
+ class DevicesUpdatedReceiver extends BroadcastReceiver {
+
+ IntentFilter getIntentFilter() {
+ return new IntentFilter(ApiFacade.BROADCAST_DEVICES_UPDATED);
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ updateDevicesList();
+ }
+ }
+
+}
diff --git a/SparkCore/src/io/spark/core/android/ui/corelist/DeviceListAdapter.java b/app/src/main/java/io/spark/core/android/ui/corelist/DeviceListAdapter.java
similarity index 94%
rename from SparkCore/src/io/spark/core/android/ui/corelist/DeviceListAdapter.java
rename to app/src/main/java/io/spark/core/android/ui/corelist/DeviceListAdapter.java
index dd52cf5..d2d9c14 100644
--- a/SparkCore/src/io/spark/core/android/ui/corelist/DeviceListAdapter.java
+++ b/app/src/main/java/io/spark/core/android/ui/corelist/DeviceListAdapter.java
@@ -1,11 +1,5 @@
package io.spark.core.android.ui.corelist;
-import io.spark.core.android.R;
-import io.spark.core.android.cloud.api.Device;
-import io.spark.core.android.ui.util.Ui;
-
-import org.solemnsilence.util.TLog;
-
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
@@ -15,6 +9,10 @@
import android.widget.ArrayAdapter;
import android.widget.TextView;
+import io.spark.core.android.R;
+import io.spark.core.android.cloud.api.Device;
+import io.spark.core.android.ui.util.Ui;
+
public class DeviceListAdapter extends ArrayAdapter {
@@ -65,6 +63,4 @@ static class ViewHolder {
}
- static final TLog log = new TLog(DeviceListAdapter.class);
-
}
diff --git a/SparkCore/src/io/spark/core/android/ui/smartconfig/NamingActivity.java b/app/src/main/java/io/spark/core/android/ui/smartconfig/NamingActivity.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/ui/smartconfig/NamingActivity.java
rename to app/src/main/java/io/spark/core/android/ui/smartconfig/NamingActivity.java
diff --git a/SparkCore/src/io/spark/core/android/ui/smartconfig/NamingFragment.java b/app/src/main/java/io/spark/core/android/ui/smartconfig/NamingFragment.java
similarity index 74%
rename from SparkCore/src/io/spark/core/android/ui/smartconfig/NamingFragment.java
rename to app/src/main/java/io/spark/core/android/ui/smartconfig/NamingFragment.java
index e3caab3..1f1ef01 100644
--- a/SparkCore/src/io/spark/core/android/ui/smartconfig/NamingFragment.java
+++ b/app/src/main/java/io/spark/core/android/ui/smartconfig/NamingFragment.java
@@ -1,5 +1,23 @@
package io.spark.core.android.ui.smartconfig;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.inputmethod.EditorInfo;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import org.apache.http.HttpStatus;
+import org.solemnsilence.util.TLog;
+
+import java.util.Iterator;
+
import io.spark.core.android.R;
import io.spark.core.android.app.DeviceState;
import io.spark.core.android.cloud.ApiFacade;
@@ -13,80 +31,62 @@
import io.spark.core.android.ui.util.Ui;
import io.spark.core.android.util.CoreNameGenerator;
-import java.util.Iterator;
-
-import org.apache.http.HttpStatus;
-import org.solemnsilence.util.TLog;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.inputmethod.EditorInfo;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.TextView;
+public class NamingFragment extends BaseFragment {
+ private static final TLog log = new TLog(NamingFragment.class);
-public class NamingFragment extends BaseFragment {
- private static final TLog log = new TLog(NamingFragment.class);
+ private static final String STATE_CURRENT_RENAME_ATTEMPT_DEVICE_ID = "STATE_CURRENT_RENAME_ATTEMPT_DEVICE_ID";
+ EditText coreNameText;
+ Button okButton;
- private static final String STATE_CURRENT_RENAME_ATTEMPT_DEVICE_ID = "STATE_CURRENT_RENAME_ATTEMPT_DEVICE_ID";
+ SmartConfigFoundSomethingReceiver foundSomethingReceiver;
+ MoreCoresClaimedReceiver moreCoresClaimedReceiver;
- EditText coreNameText;
- Button okButton;
+ String currentRenameAttemptHexId;
- SmartConfigFoundSomethingReceiver foundSomethingReceiver;
- MoreCoresClaimedReceiver moreCoresClaimedReceiver;
- String currentRenameAttemptHexId;
+ @Override
+ public int getContentViewLayoutId() {
+ return R.layout.fragment_naming;
+ }
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (savedInstanceState != null
+ && savedInstanceState.containsKey(STATE_CURRENT_RENAME_ATTEMPT_DEVICE_ID)) {
+ currentRenameAttemptHexId = savedInstanceState.getString(
+ STATE_CURRENT_RENAME_ATTEMPT_DEVICE_ID);
+ }
+ foundSomethingReceiver = new SmartConfigFoundSomethingReceiver();
+ moreCoresClaimedReceiver = new MoreCoresClaimedReceiver();
+ }
- @Override
- public int getContentViewLayoutId() {
- return R.layout.fragment_naming;
- }
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- if (savedInstanceState != null
- && savedInstanceState.containsKey(STATE_CURRENT_RENAME_ATTEMPT_DEVICE_ID)) {
- currentRenameAttemptHexId = savedInstanceState.getString(
- STATE_CURRENT_RENAME_ATTEMPT_DEVICE_ID);
- }
- foundSomethingReceiver = new SmartConfigFoundSomethingReceiver();
- moreCoresClaimedReceiver = new MoreCoresClaimedReceiver();
- }
+ coreNameText = Ui.findView(this, R.id.core_name);
+ coreNameText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
- @Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
-
- coreNameText = Ui.findView(this, R.id.core_name);
- coreNameText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
-
- @Override
- public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
- if (id == R.id.name_core || id == EditorInfo.IME_NULL) {
- nameCurrentCore();
- return true;
- }
- return false;
- }
- });
- okButton = Ui.findView(this, R.id.ok_button);
- okButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
+ if (id == R.id.name_core || id == EditorInfo.IME_NULL) {
+ nameCurrentCore();
+ return true;
+ }
+ return false;
+ }
+ });
+ okButton = Ui.findView(this, R.id.ok_button);
+ okButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- nameCurrentCore();
+ @Override
+ public void onClick(View v) {
+ nameCurrentCore();
}
});
diff --git a/SparkCore/src/io/spark/core/android/ui/smartconfig/NoCoresFoundActivity.java b/app/src/main/java/io/spark/core/android/ui/smartconfig/NoCoresFoundActivity.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/ui/smartconfig/NoCoresFoundActivity.java
rename to app/src/main/java/io/spark/core/android/ui/smartconfig/NoCoresFoundActivity.java
diff --git a/SparkCore/src/io/spark/core/android/ui/smartconfig/NoCoresFoundFragment.java b/app/src/main/java/io/spark/core/android/ui/smartconfig/NoCoresFoundFragment.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/ui/smartconfig/NoCoresFoundFragment.java
rename to app/src/main/java/io/spark/core/android/ui/smartconfig/NoCoresFoundFragment.java
diff --git a/SparkCore/src/io/spark/core/android/ui/smartconfig/SmartConfigActivity.java b/app/src/main/java/io/spark/core/android/ui/smartconfig/SmartConfigActivity.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/ui/smartconfig/SmartConfigActivity.java
rename to app/src/main/java/io/spark/core/android/ui/smartconfig/SmartConfigActivity.java
diff --git a/SparkCore/src/io/spark/core/android/ui/smartconfig/SmartConfigFragment.java b/app/src/main/java/io/spark/core/android/ui/smartconfig/SmartConfigFragment.java
similarity index 95%
rename from SparkCore/src/io/spark/core/android/ui/smartconfig/SmartConfigFragment.java
rename to app/src/main/java/io/spark/core/android/ui/smartconfig/SmartConfigFragment.java
index 999472a..3963f0b 100644
--- a/SparkCore/src/io/spark/core/android/ui/smartconfig/SmartConfigFragment.java
+++ b/app/src/main/java/io/spark/core/android/ui/smartconfig/SmartConfigFragment.java
@@ -1,22 +1,8 @@
package io.spark.core.android.ui.smartconfig;
-import static org.solemnsilence.util.Py.list;
-import io.spark.core.android.R;
-import io.spark.core.android.cloud.ApiFacade;
-import io.spark.core.android.smartconfig.SmartConfigService;
-import io.spark.core.android.ui.BaseFragment;
-import io.spark.core.android.ui.util.Ui;
-import io.spark.core.android.util.NetConnectionHelper;
-
-import org.solemnsilence.util.TLog;
-
import android.app.Activity;
import android.app.AlertDialog;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
+import android.content.*;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settings;
@@ -26,15 +12,22 @@
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.EditorInfo;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.CompoundButton;
+import android.widget.*;
import android.widget.CompoundButton.OnCheckedChangeListener;
-import android.widget.ImageView;
-import android.widget.TextView;
import com.danh32.fontify.EditText;
+import org.solemnsilence.util.TLog;
+
+import io.spark.core.android.R;
+import io.spark.core.android.cloud.ApiFacade;
+import io.spark.core.android.smartconfig.SmartConfigService;
+import io.spark.core.android.ui.BaseFragment;
+import io.spark.core.android.ui.util.Ui;
+import io.spark.core.android.util.NetConnectionHelper;
+
+import static org.solemnsilence.util.Py.list;
+
public class SmartConfigFragment extends BaseFragment {
@@ -288,6 +281,6 @@ public void onReceive(Context context, Intent intent) {
}
- private static final TLog log = new TLog(SmartConfigFragment.class);
+ private static final TLog log = new TLog(SmartConfigFragment.class);
}
diff --git a/SparkCore/src/io/spark/core/android/ui/tinker/BgColorLinearLayout.java b/app/src/main/java/io/spark/core/android/ui/tinker/BgColorLinearLayout.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/ui/tinker/BgColorLinearLayout.java
rename to app/src/main/java/io/spark/core/android/ui/tinker/BgColorLinearLayout.java
diff --git a/SparkCore/src/io/spark/core/android/ui/tinker/DigitalValue.java b/app/src/main/java/io/spark/core/android/ui/tinker/DigitalValue.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/ui/tinker/DigitalValue.java
rename to app/src/main/java/io/spark/core/android/ui/tinker/DigitalValue.java
diff --git a/SparkCore/src/io/spark/core/android/ui/tinker/Pin.java b/app/src/main/java/io/spark/core/android/ui/tinker/Pin.java
similarity index 98%
rename from SparkCore/src/io/spark/core/android/ui/tinker/Pin.java
rename to app/src/main/java/io/spark/core/android/ui/tinker/Pin.java
index 3eafa44..7370130 100644
--- a/SparkCore/src/io/spark/core/android/ui/tinker/Pin.java
+++ b/app/src/main/java/io/spark/core/android/ui/tinker/Pin.java
@@ -1,14 +1,7 @@
package io.spark.core.android.ui.tinker;
-import static org.solemnsilence.util.Py.list;
-import io.spark.core.android.R;
-import io.spark.core.android.ui.util.Ui;
-import android.animation.Animator;
+import android.animation.*;
import android.animation.Animator.AnimatorListener;
-import android.animation.AnimatorInflater;
-import android.animation.AnimatorSet;
-import android.animation.ArgbEvaluator;
-import android.animation.ObjectAnimator;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
@@ -18,6 +11,11 @@
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
+import io.spark.core.android.R;
+import io.spark.core.android.ui.util.Ui;
+
+import static org.solemnsilence.util.Py.list;
+
public class Pin {
diff --git a/SparkCore/src/io/spark/core/android/ui/tinker/PinAction.java b/app/src/main/java/io/spark/core/android/ui/tinker/PinAction.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/ui/tinker/PinAction.java
rename to app/src/main/java/io/spark/core/android/ui/tinker/PinAction.java
diff --git a/SparkCore/src/io/spark/core/android/ui/tinker/PinType.java b/app/src/main/java/io/spark/core/android/ui/tinker/PinType.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/ui/tinker/PinType.java
rename to app/src/main/java/io/spark/core/android/ui/tinker/PinType.java
diff --git a/SparkCore/src/io/spark/core/android/ui/tinker/ReversedProgressBar.java b/app/src/main/java/io/spark/core/android/ui/tinker/ReversedProgressBar.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/ui/tinker/ReversedProgressBar.java
rename to app/src/main/java/io/spark/core/android/ui/tinker/ReversedProgressBar.java
diff --git a/SparkCore/src/io/spark/core/android/ui/tinker/ReversedSeekBar.java b/app/src/main/java/io/spark/core/android/ui/tinker/ReversedSeekBar.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/ui/tinker/ReversedSeekBar.java
rename to app/src/main/java/io/spark/core/android/ui/tinker/ReversedSeekBar.java
diff --git a/SparkCore/src/io/spark/core/android/ui/tinker/TinkerFragment.java b/app/src/main/java/io/spark/core/android/ui/tinker/TinkerFragment.java
similarity index 84%
rename from SparkCore/src/io/spark/core/android/ui/tinker/TinkerFragment.java
rename to app/src/main/java/io/spark/core/android/ui/tinker/TinkerFragment.java
index 9cf0ea7..547735e 100644
--- a/SparkCore/src/io/spark/core/android/ui/tinker/TinkerFragment.java
+++ b/app/src/main/java/io/spark/core/android/ui/tinker/TinkerFragment.java
@@ -1,6 +1,26 @@
package io.spark.core.android.ui.tinker;
-import static org.solemnsilence.util.Py.list;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.app.AlertDialog;
+import android.content.*;
+import android.content.DialogInterface.OnCancelListener;
+import android.content.DialogInterface.OnDismissListener;
+import android.os.Bundle;
+import android.text.Spannable;
+import android.text.style.ForegroundColorSpan;
+import android.view.*;
+import android.view.View.OnClickListener;
+import android.view.View.OnLongClickListener;
+import android.view.View.OnTouchListener;
+import android.widget.TextView;
+
+import org.apache.http.HttpStatus;
+import org.solemnsilence.util.TLog;
+
+import java.util.List;
+import java.util.Map;
+
import io.spark.core.android.R;
import io.spark.core.android.app.DeviceState;
import io.spark.core.android.cloud.ApiFacade;
@@ -15,136 +35,107 @@
import io.spark.core.android.ui.util.NamingHelper;
import io.spark.core.android.ui.util.Ui;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.http.HttpStatus;
-import org.solemnsilence.util.Py;
-import org.solemnsilence.util.TLog;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.app.AlertDialog;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnCancelListener;
-import android.content.DialogInterface.OnDismissListener;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.text.Spannable;
-import android.text.style.ForegroundColorSpan;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnLongClickListener;
-import android.view.View.OnTouchListener;
-import android.view.ViewGroup;
-import android.widget.TextView;
+import static org.solemnsilence.util.Py.list;
+import static org.solemnsilence.util.Py.map;
/**
* A fragment representing a single Core detail screen. This fragment is either
* contained in a {@link CoreListActivity} in two-pane mode (on tablets) or a
- * {@link CoreDetailActivity} on handsets.
*/
public class TinkerFragment extends BaseFragment implements OnClickListener {
- private static final TLog log = new TLog(TinkerFragment.class);
-
-
- /**
- * The fragment argument representing the item ID that this fragment
- * represents.
- */
- public static final String ARG_DEVICE_ID = "ARG_DEVICE_ID";
-
-
- List aPins = Py.list();
- List dPins = Py.list();
- List allPins = Py.list();
- List digitalReadPins = Py.list();
- List digitalWritePins = Py.list();
- List analogWritePins = Py.list();
- List analogReadPins = Py.list();
- Map pinsByName = Py.map();
-
- Pin selectedPin;
- AlertDialog selectDialog;
-
- private Device device;
- private TinkerReceiver tinkerReceiver;
- private NamingCompleteReceiver namingCompleteReceiver;
- private NamingFailedReceiver namingFailedReceiver;
- private NamingStartedReceiver namingStartedReceiver;
-
- public static TinkerFragment newInstance(String deviceId) {
- Bundle arguments = new Bundle();
- arguments.putString(TinkerFragment.ARG_DEVICE_ID, deviceId);
- TinkerFragment fragment = new TinkerFragment();
- fragment.setArguments(arguments);
- return fragment;
- }
-
- /**
- * Mandatory empty constructor for the fragment manager to instantiate the
- * fragment (e.g. upon screen orientation changes).
- */
- public TinkerFragment() {
- }
-
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
- if (getArguments().containsKey(ARG_DEVICE_ID)) {
- device = DeviceState.getDeviceById(getArguments().getString(ARG_DEVICE_ID));
- }
- tinkerReceiver = new TinkerReceiver();
- namingCompleteReceiver = new NamingCompleteReceiver();
- namingFailedReceiver = new NamingFailedReceiver();
- namingStartedReceiver = new NamingStartedReceiver();
- }
-
- @Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
-
- loadViews();
- setupListeners();
-
- if (TinkerPrefs.getInstance().isFirstVisit()) {
- showInstructions();
- }
- }
-
- @Override
- public void onStart() {
- super.onStart();
- broadcastMgr.registerReceiver(tinkerReceiver, tinkerReceiver.getFilter());
- broadcastMgr.registerReceiver(namingCompleteReceiver, namingCompleteReceiver.getFilter());
- broadcastMgr.registerReceiver(namingFailedReceiver, namingFailedReceiver.getFilter());
- broadcastMgr.registerReceiver(namingStartedReceiver, namingStartedReceiver.getFilter());
- }
-
- @Override
- public void onStop() {
- broadcastMgr.unregisterReceiver(tinkerReceiver);
- broadcastMgr.unregisterReceiver(namingCompleteReceiver);
- broadcastMgr.unregisterReceiver(namingFailedReceiver);
- broadcastMgr.unregisterReceiver(namingStartedReceiver);
- super.onStop();
- }
-
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
+ private static final TLog log = new TLog(TinkerFragment.class);
+
+
+ /**
+ * The fragment argument representing the item ID that this fragment
+ * represents.
+ */
+ public static final String ARG_DEVICE_ID = "ARG_DEVICE_ID";
+
+
+ List aPins = list();
+ List dPins = list();
+ List allPins = list();
+ List digitalReadPins = list();
+ List digitalWritePins = list();
+ List analogWritePins = list();
+ List analogReadPins = list();
+ Map pinsByName = map();
+
+ Pin selectedPin;
+ AlertDialog selectDialog;
+
+ private Device device;
+ private TinkerReceiver tinkerReceiver;
+ private NamingCompleteReceiver namingCompleteReceiver;
+ private NamingFailedReceiver namingFailedReceiver;
+ private NamingStartedReceiver namingStartedReceiver;
+
+ public static TinkerFragment newInstance(String deviceId) {
+ Bundle arguments = new Bundle();
+ arguments.putString(TinkerFragment.ARG_DEVICE_ID, deviceId);
+ TinkerFragment fragment = new TinkerFragment();
+ fragment.setArguments(arguments);
+ return fragment;
+ }
+
+ /**
+ * Mandatory empty constructor for the fragment manager to instantiate the
+ * fragment (e.g. upon screen orientation changes).
+ */
+ public TinkerFragment() {
+ }
+
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setHasOptionsMenu(true);
+ if (getArguments().containsKey(ARG_DEVICE_ID)) {
+ device = DeviceState.getDeviceById(getArguments().getString(ARG_DEVICE_ID));
+ }
+ tinkerReceiver = new TinkerReceiver();
+ namingCompleteReceiver = new NamingCompleteReceiver();
+ namingFailedReceiver = new NamingFailedReceiver();
+ namingStartedReceiver = new NamingStartedReceiver();
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ loadViews();
+ setupListeners();
+
+ if (TinkerPrefs.getInstance().isFirstVisit()) {
+ showInstructions();
+ }
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ broadcastMgr.registerReceiver(tinkerReceiver, tinkerReceiver.getFilter());
+ broadcastMgr.registerReceiver(namingCompleteReceiver, namingCompleteReceiver.getFilter());
+ broadcastMgr.registerReceiver(namingFailedReceiver, namingFailedReceiver.getFilter());
+ broadcastMgr.registerReceiver(namingStartedReceiver, namingStartedReceiver.getFilter());
+ }
+
+ @Override
+ public void onStop() {
+ broadcastMgr.unregisterReceiver(tinkerReceiver);
+ broadcastMgr.unregisterReceiver(namingCompleteReceiver);
+ broadcastMgr.unregisterReceiver(namingFailedReceiver);
+ broadcastMgr.unregisterReceiver(namingStartedReceiver);
+ super.onStop();
+ }
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.tinker, menu);
inflater.inflate(R.menu.core_row_overflow, menu);
}
@@ -217,9 +208,9 @@ private void loadViews() {
digitalWritePins.addAll(allPins);
digitalReadPins.addAll(allPins);
- analogWritePins.addAll(Py.list(aPins.get(0), aPins.get(1),
- aPins.get(4), aPins.get(5), aPins.get(6), aPins.get(7),
- dPins.get(0), dPins.get(1)));
+ analogWritePins.addAll(list(aPins.get(0), aPins.get(1),
+ aPins.get(4), aPins.get(5), aPins.get(6), aPins.get(7),
+ dPins.get(0), dPins.get(1)));
analogReadPins.addAll(aPins);
}
diff --git a/SparkCore/src/io/spark/core/android/ui/util/NamingHelper.java b/app/src/main/java/io/spark/core/android/ui/util/NamingHelper.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/ui/util/NamingHelper.java
rename to app/src/main/java/io/spark/core/android/ui/util/NamingHelper.java
diff --git a/SparkCore/src/io/spark/core/android/ui/util/Ui.java b/app/src/main/java/io/spark/core/android/ui/util/Ui.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/ui/util/Ui.java
rename to app/src/main/java/io/spark/core/android/ui/util/Ui.java
diff --git a/SparkCore/src/io/spark/core/android/util/CoreNameGenerator.java b/app/src/main/java/io/spark/core/android/util/CoreNameGenerator.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/util/CoreNameGenerator.java
rename to app/src/main/java/io/spark/core/android/util/CoreNameGenerator.java
diff --git a/SparkCore/src/io/spark/core/android/util/NetConnectionHelper.java b/app/src/main/java/io/spark/core/android/util/NetConnectionHelper.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/util/NetConnectionHelper.java
rename to app/src/main/java/io/spark/core/android/util/NetConnectionHelper.java
diff --git a/SparkCore/src/io/spark/core/android/util/Strings.java b/app/src/main/java/io/spark/core/android/util/Strings.java
similarity index 100%
rename from SparkCore/src/io/spark/core/android/util/Strings.java
rename to app/src/main/java/io/spark/core/android/util/Strings.java
diff --git a/SparkCore/src/org/solemnsilence/util/EZ.java b/app/src/main/java/org/solemnsilence/util/EZ.java
similarity index 100%
rename from SparkCore/src/org/solemnsilence/util/EZ.java
rename to app/src/main/java/org/solemnsilence/util/EZ.java
diff --git a/SparkCore/src/org/solemnsilence/util/Py.java b/app/src/main/java/org/solemnsilence/util/Py.java
similarity index 97%
rename from SparkCore/src/org/solemnsilence/util/Py.java
rename to app/src/main/java/org/solemnsilence/util/Py.java
index bcc3fa1..80de736 100644
--- a/SparkCore/src/org/solemnsilence/util/Py.java
+++ b/app/src/main/java/org/solemnsilence/util/Py.java
@@ -160,7 +160,7 @@ public static boolean any(Object... objects) {
* Calls {@link #range(int, int)} with a start param of 0
*
* @param stop
- * @return {@link Py#Ranger}
+ * @return {@link org.solemnsilence.util.Py#Ranger}
*/
public static Ranger range(int stop) {
return range(0, stop);
@@ -202,7 +202,7 @@ public static Ranger range(int stop) {
*
* @param start
* @param stop
- * @return {@link Py#Ranger}
+ * @return {@link org.solemnsilence.util.Py#Ranger}
*/
public static Ranger range(int start, int stop) {
return new Ranger(start, stop);
@@ -388,7 +388,7 @@ public PySet getUnion(Collection... others) {
* Return a new set with elements common to this set and all elements
* from others.
*
- * This method is separate from {{@link #getIntersection(Collection...)}
+ * This method is separate from {{@link #getIntersection(java.util.Collection...)}
* because until Java 1.7's SafeVarargs annotation, there was no way to
* call a varargs method using generic collections without getting a
* (bogus) type safety error.
@@ -485,7 +485,7 @@ public PySet getSymmetricDifference(Collection... others) {
}
/**
- * See docs on {@link Py#range(int, int)}
+ * See docs on {@link org.solemnsilence.util.Py#range(int, int)}
*
* @author Jens Knutson
*
@@ -513,7 +513,7 @@ public IntValue(int initialValue) {
}
}
- private final Ranger.IntValue currentValue;
+ private final IntValue currentValue;
private final int stopBefore;
private Ranger(int start, int stop) {
@@ -535,7 +535,7 @@ private void validateArgs(int start, int stop) {
}
@Override
- public Iterator iterator() {
+ public Iterator iterator() {
return this;
}
@@ -546,7 +546,7 @@ public boolean hasNext() {
}
@Override
- public Ranger.IntValue next() {
+ public IntValue next() {
return currentValue;
}
diff --git a/SparkCore/src/org/solemnsilence/util/TLog.java b/app/src/main/java/org/solemnsilence/util/TLog.java
similarity index 100%
rename from SparkCore/src/org/solemnsilence/util/TLog.java
rename to app/src/main/java/org/solemnsilence/util/TLog.java
diff --git a/SparkCore/src/org/solemnsilence/util/Toaster.java b/app/src/main/java/org/solemnsilence/util/Toaster.java
similarity index 100%
rename from SparkCore/src/org/solemnsilence/util/Toaster.java
rename to app/src/main/java/org/solemnsilence/util/Toaster.java
diff --git a/SparkCore/res/animator/pin_background_end.xml b/app/src/main/res/animator/pin_background_end.xml
similarity index 100%
rename from SparkCore/res/animator/pin_background_end.xml
rename to app/src/main/res/animator/pin_background_end.xml
diff --git a/SparkCore/res/animator/pin_background_go_dark.xml b/app/src/main/res/animator/pin_background_go_dark.xml
similarity index 100%
rename from SparkCore/res/animator/pin_background_go_dark.xml
rename to app/src/main/res/animator/pin_background_go_dark.xml
diff --git a/SparkCore/res/animator/pin_background_start.xml b/app/src/main/res/animator/pin_background_start.xml
similarity index 100%
rename from SparkCore/res/animator/pin_background_start.xml
rename to app/src/main/res/animator/pin_background_start.xml
diff --git a/SparkCore/res/drawable-hdpi/ic_action_edit.png b/app/src/main/res/drawable-hdpi/ic_action_edit.png
similarity index 100%
rename from SparkCore/res/drawable-hdpi/ic_action_edit.png
rename to app/src/main/res/drawable-hdpi/ic_action_edit.png
diff --git a/SparkCore/res/drawable-hdpi/ic_launcher.png b/app/src/main/res/drawable-hdpi/ic_launcher.png
similarity index 100%
rename from SparkCore/res/drawable-hdpi/ic_launcher.png
rename to app/src/main/res/drawable-hdpi/ic_launcher.png
diff --git a/SparkCore/res/drawable-hdpi/ic_wifi.png b/app/src/main/res/drawable-hdpi/ic_wifi.png
similarity index 100%
rename from SparkCore/res/drawable-hdpi/ic_wifi.png
rename to app/src/main/res/drawable-hdpi/ic_wifi.png
diff --git a/SparkCore/res/drawable-hdpi/new_core.png b/app/src/main/res/drawable-hdpi/new_core.png
similarity index 100%
rename from SparkCore/res/drawable-hdpi/new_core.png
rename to app/src/main/res/drawable-hdpi/new_core.png
diff --git a/SparkCore/res/drawable-mdpi/ic_action_edit.png b/app/src/main/res/drawable-mdpi/ic_action_edit.png
similarity index 100%
rename from SparkCore/res/drawable-mdpi/ic_action_edit.png
rename to app/src/main/res/drawable-mdpi/ic_action_edit.png
diff --git a/SparkCore/res/drawable-mdpi/ic_launcher.png b/app/src/main/res/drawable-mdpi/ic_launcher.png
similarity index 100%
rename from SparkCore/res/drawable-mdpi/ic_launcher.png
rename to app/src/main/res/drawable-mdpi/ic_launcher.png
diff --git a/SparkCore/res/drawable-mdpi/ic_menu_moreoverflow_normal_holo_dark.png b/app/src/main/res/drawable-mdpi/ic_menu_moreoverflow_normal_holo_dark.png
similarity index 100%
rename from SparkCore/res/drawable-mdpi/ic_menu_moreoverflow_normal_holo_dark.png
rename to app/src/main/res/drawable-mdpi/ic_menu_moreoverflow_normal_holo_dark.png
diff --git a/SparkCore/res/drawable-mdpi/ic_wifi.png b/app/src/main/res/drawable-mdpi/ic_wifi.png
similarity index 100%
rename from SparkCore/res/drawable-mdpi/ic_wifi.png
rename to app/src/main/res/drawable-mdpi/ic_wifi.png
diff --git a/SparkCore/res/drawable-mdpi/log_in_background_bitmap.png b/app/src/main/res/drawable-mdpi/log_in_background_bitmap.png
similarity index 100%
rename from SparkCore/res/drawable-mdpi/log_in_background_bitmap.png
rename to app/src/main/res/drawable-mdpi/log_in_background_bitmap.png
diff --git a/SparkCore/res/drawable-mdpi/new_core.png b/app/src/main/res/drawable-mdpi/new_core.png
similarity index 100%
rename from SparkCore/res/drawable-mdpi/new_core.png
rename to app/src/main/res/drawable-mdpi/new_core.png
diff --git a/SparkCore/res/drawable-mdpi/sign_up_background_bitmap.png b/app/src/main/res/drawable-mdpi/sign_up_background_bitmap.png
similarity index 100%
rename from SparkCore/res/drawable-mdpi/sign_up_background_bitmap.png
rename to app/src/main/res/drawable-mdpi/sign_up_background_bitmap.png
diff --git a/SparkCore/res/drawable-mdpi/smart_config_background_bitmap.png b/app/src/main/res/drawable-mdpi/smart_config_background_bitmap.png
similarity index 100%
rename from SparkCore/res/drawable-mdpi/smart_config_background_bitmap.png
rename to app/src/main/res/drawable-mdpi/smart_config_background_bitmap.png
diff --git a/SparkCore/res/drawable-xhdpi/ic_action_edit.png b/app/src/main/res/drawable-xhdpi/ic_action_edit.png
similarity index 100%
rename from SparkCore/res/drawable-xhdpi/ic_action_edit.png
rename to app/src/main/res/drawable-xhdpi/ic_action_edit.png
diff --git a/SparkCore/res/drawable-xhdpi/ic_launcher.png b/app/src/main/res/drawable-xhdpi/ic_launcher.png
similarity index 100%
rename from SparkCore/res/drawable-xhdpi/ic_launcher.png
rename to app/src/main/res/drawable-xhdpi/ic_launcher.png
diff --git a/SparkCore/res/drawable-xhdpi/ic_wifi.png b/app/src/main/res/drawable-xhdpi/ic_wifi.png
similarity index 100%
rename from SparkCore/res/drawable-xhdpi/ic_wifi.png
rename to app/src/main/res/drawable-xhdpi/ic_wifi.png
diff --git a/SparkCore/res/drawable-xhdpi/log_in_background_bitmap.png b/app/src/main/res/drawable-xhdpi/log_in_background_bitmap.png
similarity index 100%
rename from SparkCore/res/drawable-xhdpi/log_in_background_bitmap.png
rename to app/src/main/res/drawable-xhdpi/log_in_background_bitmap.png
diff --git a/SparkCore/res/drawable-xhdpi/new_core.png b/app/src/main/res/drawable-xhdpi/new_core.png
similarity index 100%
rename from SparkCore/res/drawable-xhdpi/new_core.png
rename to app/src/main/res/drawable-xhdpi/new_core.png
diff --git a/SparkCore/res/drawable-xhdpi/sign_up_background_bitmap.png b/app/src/main/res/drawable-xhdpi/sign_up_background_bitmap.png
similarity index 100%
rename from SparkCore/res/drawable-xhdpi/sign_up_background_bitmap.png
rename to app/src/main/res/drawable-xhdpi/sign_up_background_bitmap.png
diff --git a/SparkCore/res/drawable-xhdpi/smart_config_background_bitmap.png b/app/src/main/res/drawable-xhdpi/smart_config_background_bitmap.png
similarity index 100%
rename from SparkCore/res/drawable-xhdpi/smart_config_background_bitmap.png
rename to app/src/main/res/drawable-xhdpi/smart_config_background_bitmap.png
diff --git a/SparkCore/res/drawable-xxhdpi/ic_launcher.png b/app/src/main/res/drawable-xxhdpi/ic_launcher.png
similarity index 100%
rename from SparkCore/res/drawable-xxhdpi/ic_launcher.png
rename to app/src/main/res/drawable-xxhdpi/ic_launcher.png
diff --git a/SparkCore/res/drawable/action_bar_dark_bg.xml b/app/src/main/res/drawable/action_bar_dark_bg.xml
similarity index 100%
rename from SparkCore/res/drawable/action_bar_dark_bg.xml
rename to app/src/main/res/drawable/action_bar_dark_bg.xml
diff --git a/SparkCore/res/drawable/action_bar_layers.xml b/app/src/main/res/drawable/action_bar_layers.xml
similarity index 100%
rename from SparkCore/res/drawable/action_bar_layers.xml
rename to app/src/main/res/drawable/action_bar_layers.xml
diff --git a/SparkCore/res/drawable/action_bar_transparent_gradient.xml b/app/src/main/res/drawable/action_bar_transparent_gradient.xml
similarity index 100%
rename from SparkCore/res/drawable/action_bar_transparent_gradient.xml
rename to app/src/main/res/drawable/action_bar_transparent_gradient.xml
diff --git a/SparkCore/res/drawable/aes_checkbox_checked_temp.png b/app/src/main/res/drawable/aes_checkbox_checked_temp.png
similarity index 100%
rename from SparkCore/res/drawable/aes_checkbox_checked_temp.png
rename to app/src/main/res/drawable/aes_checkbox_checked_temp.png
diff --git a/SparkCore/res/drawable/aes_checkbox_unchecked_temp.png b/app/src/main/res/drawable/aes_checkbox_unchecked_temp.png
similarity index 100%
rename from SparkCore/res/drawable/aes_checkbox_unchecked_temp.png
rename to app/src/main/res/drawable/aes_checkbox_unchecked_temp.png
diff --git a/SparkCore/res/drawable/blue_button_gradient.xml b/app/src/main/res/drawable/blue_button_gradient.xml
similarity index 100%
rename from SparkCore/res/drawable/blue_button_gradient.xml
rename to app/src/main/res/drawable/blue_button_gradient.xml
diff --git a/SparkCore/res/drawable/blue_button_pressed_gradient.xml b/app/src/main/res/drawable/blue_button_pressed_gradient.xml
similarity index 100%
rename from SparkCore/res/drawable/blue_button_pressed_gradient.xml
rename to app/src/main/res/drawable/blue_button_pressed_gradient.xml
diff --git a/SparkCore/res/drawable/blue_button_selector.xml b/app/src/main/res/drawable/blue_button_selector.xml
similarity index 100%
rename from SparkCore/res/drawable/blue_button_selector.xml
rename to app/src/main/res/drawable/blue_button_selector.xml
diff --git a/SparkCore/res/drawable/core_list_dot.xml b/app/src/main/res/drawable/core_list_dot.xml
similarity index 100%
rename from SparkCore/res/drawable/core_list_dot.xml
rename to app/src/main/res/drawable/core_list_dot.xml
diff --git a/SparkCore/res/drawable/link_text_selector.xml b/app/src/main/res/drawable/link_text_selector.xml
similarity index 100%
rename from SparkCore/res/drawable/link_text_selector.xml
rename to app/src/main/res/drawable/link_text_selector.xml
diff --git a/SparkCore/res/drawable/log_in_background.xml b/app/src/main/res/drawable/log_in_background.xml
similarity index 100%
rename from SparkCore/res/drawable/log_in_background.xml
rename to app/src/main/res/drawable/log_in_background.xml
diff --git a/SparkCore/res/drawable/log_in_button_gradient.xml b/app/src/main/res/drawable/log_in_button_gradient.xml
similarity index 100%
rename from SparkCore/res/drawable/log_in_button_gradient.xml
rename to app/src/main/res/drawable/log_in_button_gradient.xml
diff --git a/SparkCore/res/drawable/log_in_button_pressed_gradient.xml b/app/src/main/res/drawable/log_in_button_pressed_gradient.xml
similarity index 100%
rename from SparkCore/res/drawable/log_in_button_pressed_gradient.xml
rename to app/src/main/res/drawable/log_in_button_pressed_gradient.xml
diff --git a/SparkCore/res/drawable/log_in_button_selector.xml b/app/src/main/res/drawable/log_in_button_selector.xml
similarity index 100%
rename from SparkCore/res/drawable/log_in_button_selector.xml
rename to app/src/main/res/drawable/log_in_button_selector.xml
diff --git a/SparkCore/res/drawable/point_at_d7_temp.png b/app/src/main/res/drawable/point_at_d7_temp.png
similarity index 100%
rename from SparkCore/res/drawable/point_at_d7_temp.png
rename to app/src/main/res/drawable/point_at_d7_temp.png
diff --git a/SparkCore/res/drawable/progress_emerald.xml b/app/src/main/res/drawable/progress_emerald.xml
similarity index 100%
rename from SparkCore/res/drawable/progress_emerald.xml
rename to app/src/main/res/drawable/progress_emerald.xml
diff --git a/SparkCore/res/drawable/progress_indicator_temp.png b/app/src/main/res/drawable/progress_indicator_temp.png
similarity index 100%
rename from SparkCore/res/drawable/progress_indicator_temp.png
rename to app/src/main/res/drawable/progress_indicator_temp.png
diff --git a/SparkCore/res/drawable/progress_spinner.xml b/app/src/main/res/drawable/progress_spinner.xml
similarity index 100%
rename from SparkCore/res/drawable/progress_spinner.xml
rename to app/src/main/res/drawable/progress_spinner.xml
diff --git a/SparkCore/res/drawable/progress_sunflower.xml b/app/src/main/res/drawable/progress_sunflower.xml
similarity index 100%
rename from SparkCore/res/drawable/progress_sunflower.xml
rename to app/src/main/res/drawable/progress_sunflower.xml
diff --git a/SparkCore/res/drawable/red_button_gradient.xml b/app/src/main/res/drawable/red_button_gradient.xml
similarity index 100%
rename from SparkCore/res/drawable/red_button_gradient.xml
rename to app/src/main/res/drawable/red_button_gradient.xml
diff --git a/SparkCore/res/drawable/red_button_pressed_gradient.xml b/app/src/main/res/drawable/red_button_pressed_gradient.xml
similarity index 100%
rename from SparkCore/res/drawable/red_button_pressed_gradient.xml
rename to app/src/main/res/drawable/red_button_pressed_gradient.xml
diff --git a/SparkCore/res/drawable/red_button_selector.xml b/app/src/main/res/drawable/red_button_selector.xml
similarity index 100%
rename from SparkCore/res/drawable/red_button_selector.xml
rename to app/src/main/res/drawable/red_button_selector.xml
diff --git a/SparkCore/res/drawable/sign_up_background.xml b/app/src/main/res/drawable/sign_up_background.xml
similarity index 100%
rename from SparkCore/res/drawable/sign_up_background.xml
rename to app/src/main/res/drawable/sign_up_background.xml
diff --git a/SparkCore/res/drawable/sign_up_button_gradient.xml b/app/src/main/res/drawable/sign_up_button_gradient.xml
similarity index 100%
rename from SparkCore/res/drawable/sign_up_button_gradient.xml
rename to app/src/main/res/drawable/sign_up_button_gradient.xml
diff --git a/SparkCore/res/drawable/sign_up_button_pressed_gradient.xml b/app/src/main/res/drawable/sign_up_button_pressed_gradient.xml
similarity index 100%
rename from SparkCore/res/drawable/sign_up_button_pressed_gradient.xml
rename to app/src/main/res/drawable/sign_up_button_pressed_gradient.xml
diff --git a/SparkCore/res/drawable/sign_up_button_selector.xml b/app/src/main/res/drawable/sign_up_button_selector.xml
similarity index 100%
rename from SparkCore/res/drawable/sign_up_button_selector.xml
rename to app/src/main/res/drawable/sign_up_button_selector.xml
diff --git a/SparkCore/res/drawable/smart_config_background.xml b/app/src/main/res/drawable/smart_config_background.xml
similarity index 100%
rename from SparkCore/res/drawable/smart_config_background.xml
rename to app/src/main/res/drawable/smart_config_background.xml
diff --git a/SparkCore/res/drawable/spark_logo_temp.png b/app/src/main/res/drawable/spark_logo_temp.png
similarity index 100%
rename from SparkCore/res/drawable/spark_logo_temp.png
rename to app/src/main/res/drawable/spark_logo_temp.png
diff --git a/SparkCore/res/drawable/tinker_core_shadow_temp.png b/app/src/main/res/drawable/tinker_core_shadow_temp.png
similarity index 100%
rename from SparkCore/res/drawable/tinker_core_shadow_temp.png
rename to app/src/main/res/drawable/tinker_core_shadow_temp.png
diff --git a/SparkCore/res/drawable/tinker_logo_temp.png b/app/src/main/res/drawable/tinker_logo_temp.png
similarity index 100%
rename from SparkCore/res/drawable/tinker_logo_temp.png
rename to app/src/main/res/drawable/tinker_logo_temp.png
diff --git a/SparkCore/res/drawable/tinker_pin.xml b/app/src/main/res/drawable/tinker_pin.xml
similarity index 100%
rename from SparkCore/res/drawable/tinker_pin.xml
rename to app/src/main/res/drawable/tinker_pin.xml
diff --git a/SparkCore/res/drawable/tinker_pin_alizarin.xml b/app/src/main/res/drawable/tinker_pin_alizarin.xml
similarity index 100%
rename from SparkCore/res/drawable/tinker_pin_alizarin.xml
rename to app/src/main/res/drawable/tinker_pin_alizarin.xml
diff --git a/SparkCore/res/drawable/tinker_pin_cyan.xml b/app/src/main/res/drawable/tinker_pin_cyan.xml
similarity index 100%
rename from SparkCore/res/drawable/tinker_pin_cyan.xml
rename to app/src/main/res/drawable/tinker_pin_cyan.xml
diff --git a/SparkCore/res/drawable/tinker_pin_emerald.xml b/app/src/main/res/drawable/tinker_pin_emerald.xml
similarity index 100%
rename from SparkCore/res/drawable/tinker_pin_emerald.xml
rename to app/src/main/res/drawable/tinker_pin_emerald.xml
diff --git a/SparkCore/res/drawable/tinker_pin_muted.xml b/app/src/main/res/drawable/tinker_pin_muted.xml
similarity index 100%
rename from SparkCore/res/drawable/tinker_pin_muted.xml
rename to app/src/main/res/drawable/tinker_pin_muted.xml
diff --git a/SparkCore/res/drawable/tinker_pin_read_high.xml b/app/src/main/res/drawable/tinker_pin_read_high.xml
similarity index 100%
rename from SparkCore/res/drawable/tinker_pin_read_high.xml
rename to app/src/main/res/drawable/tinker_pin_read_high.xml
diff --git a/SparkCore/res/drawable/tinker_pin_sunflower.xml b/app/src/main/res/drawable/tinker_pin_sunflower.xml
similarity index 100%
rename from SparkCore/res/drawable/tinker_pin_sunflower.xml
rename to app/src/main/res/drawable/tinker_pin_sunflower.xml
diff --git a/SparkCore/res/drawable/tinker_pin_write_high.xml b/app/src/main/res/drawable/tinker_pin_write_high.xml
similarity index 100%
rename from SparkCore/res/drawable/tinker_pin_write_high.xml
rename to app/src/main/res/drawable/tinker_pin_write_high.xml
diff --git a/SparkCore/res/drawable/white_circle.xml b/app/src/main/res/drawable/white_circle.xml
similarity index 100%
rename from SparkCore/res/drawable/white_circle.xml
rename to app/src/main/res/drawable/white_circle.xml
diff --git a/SparkCore/res/layout/activity_core_list.xml b/app/src/main/res/layout/activity_core_list.xml
similarity index 100%
rename from SparkCore/res/layout/activity_core_list.xml
rename to app/src/main/res/layout/activity_core_list.xml
diff --git a/SparkCore/res/layout/activity_log_in.xml b/app/src/main/res/layout/activity_log_in.xml
similarity index 100%
rename from SparkCore/res/layout/activity_log_in.xml
rename to app/src/main/res/layout/activity_log_in.xml
diff --git a/SparkCore/res/layout/activity_sign_up.xml b/app/src/main/res/layout/activity_sign_up.xml
similarity index 100%
rename from SparkCore/res/layout/activity_sign_up.xml
rename to app/src/main/res/layout/activity_sign_up.xml
diff --git a/SparkCore/res/layout/activity_smart_config.xml b/app/src/main/res/layout/activity_smart_config.xml
similarity index 100%
rename from SparkCore/res/layout/activity_smart_config.xml
rename to app/src/main/res/layout/activity_smart_config.xml
diff --git a/SparkCore/res/layout/core_row.xml b/app/src/main/res/layout/core_row.xml
similarity index 100%
rename from SparkCore/res/layout/core_row.xml
rename to app/src/main/res/layout/core_row.xml
diff --git a/SparkCore/res/layout/dialog_rename.xml b/app/src/main/res/layout/dialog_rename.xml
similarity index 100%
rename from SparkCore/res/layout/dialog_rename.xml
rename to app/src/main/res/layout/dialog_rename.xml
diff --git a/SparkCore/res/layout/fragment_core_list.xml b/app/src/main/res/layout/fragment_core_list.xml
similarity index 100%
rename from SparkCore/res/layout/fragment_core_list.xml
rename to app/src/main/res/layout/fragment_core_list.xml
diff --git a/SparkCore/res/layout/fragment_naming.xml b/app/src/main/res/layout/fragment_naming.xml
similarity index 100%
rename from SparkCore/res/layout/fragment_naming.xml
rename to app/src/main/res/layout/fragment_naming.xml
diff --git a/SparkCore/res/layout/fragment_no_cores_found.xml b/app/src/main/res/layout/fragment_no_cores_found.xml
similarity index 100%
rename from SparkCore/res/layout/fragment_no_cores_found.xml
rename to app/src/main/res/layout/fragment_no_cores_found.xml
diff --git a/SparkCore/res/layout/fragment_smart_config.xml b/app/src/main/res/layout/fragment_smart_config.xml
similarity index 100%
rename from SparkCore/res/layout/fragment_smart_config.xml
rename to app/src/main/res/layout/fragment_smart_config.xml
diff --git a/SparkCore/res/layout/fragment_tinker.xml b/app/src/main/res/layout/fragment_tinker.xml
similarity index 100%
rename from SparkCore/res/layout/fragment_tinker.xml
rename to app/src/main/res/layout/fragment_tinker.xml
diff --git a/SparkCore/res/layout/tinker_analog_read_left.xml b/app/src/main/res/layout/tinker_analog_read_left.xml
similarity index 100%
rename from SparkCore/res/layout/tinker_analog_read_left.xml
rename to app/src/main/res/layout/tinker_analog_read_left.xml
diff --git a/SparkCore/res/layout/tinker_analog_read_right.xml b/app/src/main/res/layout/tinker_analog_read_right.xml
similarity index 100%
rename from SparkCore/res/layout/tinker_analog_read_right.xml
rename to app/src/main/res/layout/tinker_analog_read_right.xml
diff --git a/SparkCore/res/layout/tinker_analog_write_left.xml b/app/src/main/res/layout/tinker_analog_write_left.xml
similarity index 100%
rename from SparkCore/res/layout/tinker_analog_write_left.xml
rename to app/src/main/res/layout/tinker_analog_write_left.xml
diff --git a/SparkCore/res/layout/tinker_analog_write_right.xml b/app/src/main/res/layout/tinker_analog_write_right.xml
similarity index 100%
rename from SparkCore/res/layout/tinker_analog_write_right.xml
rename to app/src/main/res/layout/tinker_analog_write_right.xml
diff --git a/SparkCore/res/layout/tinker_digital_read.xml b/app/src/main/res/layout/tinker_digital_read.xml
similarity index 100%
rename from SparkCore/res/layout/tinker_digital_read.xml
rename to app/src/main/res/layout/tinker_digital_read.xml
diff --git a/SparkCore/res/layout/tinker_digital_write.xml b/app/src/main/res/layout/tinker_digital_write.xml
similarity index 100%
rename from SparkCore/res/layout/tinker_digital_write.xml
rename to app/src/main/res/layout/tinker_digital_write.xml
diff --git a/SparkCore/res/layout/tinker_instructions.xml b/app/src/main/res/layout/tinker_instructions.xml
similarity index 100%
rename from SparkCore/res/layout/tinker_instructions.xml
rename to app/src/main/res/layout/tinker_instructions.xml
diff --git a/SparkCore/res/layout/tinker_select.xml b/app/src/main/res/layout/tinker_select.xml
similarity index 100%
rename from SparkCore/res/layout/tinker_select.xml
rename to app/src/main/res/layout/tinker_select.xml
diff --git a/SparkCore/res/menu/account.xml b/app/src/main/res/menu/account.xml
similarity index 100%
rename from SparkCore/res/menu/account.xml
rename to app/src/main/res/menu/account.xml
diff --git a/SparkCore/res/menu/all_screens.xml b/app/src/main/res/menu/all_screens.xml
similarity index 100%
rename from SparkCore/res/menu/all_screens.xml
rename to app/src/main/res/menu/all_screens.xml
diff --git a/SparkCore/res/menu/core_list.xml b/app/src/main/res/menu/core_list.xml
similarity index 100%
rename from SparkCore/res/menu/core_list.xml
rename to app/src/main/res/menu/core_list.xml
diff --git a/SparkCore/res/menu/core_row_overflow.xml b/app/src/main/res/menu/core_row_overflow.xml
similarity index 100%
rename from SparkCore/res/menu/core_row_overflow.xml
rename to app/src/main/res/menu/core_row_overflow.xml
diff --git a/SparkCore/res/menu/tinker.xml b/app/src/main/res/menu/tinker.xml
similarity index 100%
rename from SparkCore/res/menu/tinker.xml
rename to app/src/main/res/menu/tinker.xml
diff --git a/SparkCore/res/values-h600dp/dimens.xml b/app/src/main/res/values-h600dp/dimens.xml
similarity index 100%
rename from SparkCore/res/values-h600dp/dimens.xml
rename to app/src/main/res/values-h600dp/dimens.xml
diff --git a/SparkCore/res/values-large/layout_config.xml b/app/src/main/res/values-large/layout_config.xml
similarity index 100%
rename from SparkCore/res/values-large/layout_config.xml
rename to app/src/main/res/values-large/layout_config.xml
diff --git a/SparkCore/res/values-large/styles.xml b/app/src/main/res/values-large/styles.xml
similarity index 100%
rename from SparkCore/res/values-large/styles.xml
rename to app/src/main/res/values-large/styles.xml
diff --git a/SparkCore/res/values-sw720dp-land/dimens.xml b/app/src/main/res/values-sw720dp-land/dimens.xml
similarity index 100%
rename from SparkCore/res/values-sw720dp-land/dimens.xml
rename to app/src/main/res/values-sw720dp-land/dimens.xml
diff --git a/SparkCore/res/values/appconfig.xml b/app/src/main/res/values/appconfig.xml
similarity index 97%
rename from SparkCore/res/values/appconfig.xml
rename to app/src/main/res/values/appconfig.xml
index 6313c7f..47e0459 100644
--- a/SparkCore/res/values/appconfig.xml
+++ b/app/src/main/res/values/appconfig.xml
@@ -1,25 +1,20 @@
+
api.spark.iostaging.api.spark.io
-
false
-
32
-
v1access_tokenhttps
-
443224.0.1.187
-
568319
-
sparkdevices2013
\ No newline at end of file
diff --git a/SparkCore/res/values/colors.xml b/app/src/main/res/values/colors.xml
similarity index 97%
rename from SparkCore/res/values/colors.xml
rename to app/src/main/res/values/colors.xml
index 914b57e..b3789b0 100644
--- a/SparkCore/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -1,3 +1,4 @@
+
diff --git a/SparkCore/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
similarity index 100%
rename from SparkCore/res/values/dimens.xml
rename to app/src/main/res/values/dimens.xml
diff --git a/SparkCore/res/values/font_names.xml b/app/src/main/res/values/font_names.xml
similarity index 100%
rename from SparkCore/res/values/font_names.xml
rename to app/src/main/res/values/font_names.xml
diff --git a/SparkCore/res/values/ids.xml b/app/src/main/res/values/ids.xml
similarity index 100%
rename from SparkCore/res/values/ids.xml
rename to app/src/main/res/values/ids.xml
diff --git a/SparkCore/res/values/layout_config.xml b/app/src/main/res/values/layout_config.xml
similarity index 100%
rename from SparkCore/res/values/layout_config.xml
rename to app/src/main/res/values/layout_config.xml
diff --git a/SparkCore/res/values/strings.xml b/app/src/main/res/values/strings.xml
similarity index 96%
rename from SparkCore/res/values/strings.xml
rename to app/src/main/res/values/strings.xml
index ec6a055..9345da0 100644
--- a/SparkCore/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,6 +1,9 @@
+
+ spark-android-app:spark-android-app
+
Sparkspark
@@ -63,4 +66,4 @@
Logged out.Error communicating with server
-
\ No newline at end of file
+
diff --git a/SparkCore/res/values/strings_account_screens.xml b/app/src/main/res/values/strings_account_screens.xml
similarity index 100%
rename from SparkCore/res/values/strings_account_screens.xml
rename to app/src/main/res/values/strings_account_screens.xml
diff --git a/SparkCore/res/values/styles.xml b/app/src/main/res/values/styles.xml
similarity index 98%
rename from SparkCore/res/values/styles.xml
rename to app/src/main/res/values/styles.xml
index 92519a5..286dd80 100644
--- a/SparkCore/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/SparkCore/res/values/uris.xml b/app/src/main/res/values/uris.xml
similarity index 100%
rename from SparkCore/res/values/uris.xml
rename to app/src/main/res/values/uris.xml
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..6356aab
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,19 @@
+// 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:1.0.0'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ }
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..1d3591c
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,18 @@
+# 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.
+# Default value: -Xmx10248m -XX:MaxPermSize=256m
+# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+
+# 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
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8c0fb64
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..0c71e76
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Apr 10 15:27:10 PDT 2013
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,164 @@
+#!/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
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# 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\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+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"`
+
+ # 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/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/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/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..6fceab7
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':app', ':Fontify'