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.io staging.api.spark.io - false - 32 - v1 access_token https - 443 224.0.1.187 - 5683 19 - 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 + Spark spark @@ -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'