16 Commits
1.0 ... 1.0.3

Author SHA1 Message Date
9ff32af9f1 Upgraded gradle parts to latest
Switched to another fork of the holo-color-picker
Switched to MaterialDrawer due NavigationView is still very buggy and much more limited
General cleanup
Version bump to 1.0.3
2016-03-17 20:38:16 +01:00
Giovanni Harting
9a3b955d32 updated deps
removed workaround for issue with the navigationHeader
added handling of empty responses
2015-11-14 14:37:08 +01:00
Giovanni Harting
9739116db6 added missing resource files from last commit 2015-10-31 22:32:40 +01:00
Giovanni Harting
2211186d9f more bug fixing
moved rate limiting to another class
navigation header is close to being functional
2015-10-31 22:30:48 +01:00
Giovanni Harting
ce198af0ef updated zipalign to zipAlignEnabled 2015-10-26 23:53:13 +01:00
Giovanni Harting
2991094f2d added zipalign to release and debug 2015-10-26 23:50:57 +01:00
Giovanni Harting
aaea03a5c2 updated dependencies 2015-10-15 22:35:28 +02:00
Giovanni Harting
7bac6a394a moved some stuff around
avoid flicker of stripe when selected in app
2015-10-15 22:33:49 +02:00
Giovanni Harting
ee78ba9b53 removed test button 2015-10-15 13:51:32 +02:00
Giovanni Harting
60f805f15c switched to json-rpc (ref LedD d5f403d5573d13e6b8f3113a1c62a096ea721f19)
fixed duplicate connections were made when adding a daemon
2015-10-11 21:52:39 +02:00
Giovanni Harting
6c321aaa90 reactivating the stripe now sets the colorwheel's current color
increased thickness of saturation and value bars
2015-09-17 17:31:54 +02:00
Giovanni Harting
34776fc225 extracted some more strings, yay
exchanged svbar with separate value and saturation bar
added switch in toolbar to disable (set black) the stripe and ignore all following inputs until reactivated again
2015-09-17 16:16:50 +02:00
Giovanni Harting
9fa55d2994 fixed some bugs
added rate control to the changecolor event (much smoother now)
extraced some more string from the code, more is to come
2015-09-16 15:21:50 +02:00
Giovanni Harting
42ff424622 general post-release cleanup
removed lots of unused strings/resources/drawables
extracted all translatable strings
added new logo
2015-09-16 13:40:04 +02:00
Giovanni Harting
608a9c48d1 updated version to 1.0.1 2015-09-13 17:23:23 +02:00
Giovanni Harting
1e7e400d49 fixed androidstduio derp
fixed stripes aren't loaded correctly
2015-09-13 17:18:18 +02:00
110 changed files with 1054 additions and 1018 deletions

View File

@@ -20,11 +20,15 @@ buildscript {
repositories { repositories {
mavenCentral() mavenCentral()
jcenter() jcenter()
flatDir {
dirs 'libs'
}
} }
dependencies { dependencies {
classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1' classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
classpath 'com.github.ben-manes:gradle-versions-plugin:0.11.3' classpath 'com.github.ben-manes:gradle-versions-plugin:0.12.0'
} }
} }
@@ -34,33 +38,46 @@ apply plugin: 'com.github.ben-manes.versions'
android { android {
compileSdkVersion 23 compileSdkVersion 23
buildToolsVersion '23.0.1' buildToolsVersion '23.0.2'
lintOptions {
abortOnError false
}
defaultConfig { defaultConfig {
applicationId "com.idlegandalf.ledd" applicationId "com.idlegandalf.ledd"
minSdkVersion 17 minSdkVersion 18
targetSdkVersion 23 targetSdkVersion 23
versionCode 1 versionCode 3
versionName "1.0" versionName "1.0.3"
} }
buildTypes { buildTypes {
release { release {
zipAlignEnabled true
minifyEnabled false minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
} }
debug {
zipAlignEnabled true
}
} }
} }
dependencies { dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs') compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.0.1' compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:support-v4:23.0.1' compile 'com.android.support:support-v4:23.2.1'
compile 'com.squareup.okhttp:okhttp:2.5.0' compile 'com.squareup.okhttp:okhttp:2.7.5'
compile 'com.google.code.gson:gson:2.3.1' compile 'com.google.code.gson:gson:2.6.2'
compile 'com.jakewharton:butterknife:7.0.1' compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.koushikdutta.async:androidasync:2.1.6' compile 'com.koushikdutta.async:androidasync:2.1.7'
compile 'com.android.support:design:23.0.1' compile 'com.android.support:design:23.2.1'
compile 'com.larswerkman:HoloColorPicker:1.5' compile 'com.larswerkman:HoloColorPicker:1.5@aar'
compile 'com.google.guava:guava:19.0-rc1' compile 'com.google.guava:guava:19.0'
provided 'org.projectlombok:lombok:1.16.6' compile 'com.thetransactioncompany:jsonrpc2-base:1.38'
compile('com.mikepenz:materialdrawer:5.1.4@aar') {
transitive = true
}
provided 'org.projectlombok:lombok:1.16.8'
} }

Binary file not shown.

View File

@@ -24,12 +24,14 @@
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-feature android:glEsVersion="0x00030000" android:required="true" />
<application <application
android:name=".ColorApplication" android:name=".ColorApplication"
android:allowBackup="true" android:allowBackup="true"
android:fullBackupContent="false" android:fullBackupContent="false"
android:icon="@drawable/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme">
<activity <activity

View File

@@ -22,23 +22,20 @@ import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.res.Configuration;
import android.graphics.Color; import android.graphics.Color;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.os.Bundle; import android.os.Bundle;
import android.support.design.widget.NavigationView; import android.preference.PreferenceManager;
import android.support.design.widget.Snackbar; import android.support.design.widget.Snackbar;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.Gravity;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View; import android.view.View;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import com.idlegandalf.ledd.callbacks.RecieveColorCallback; import com.idlegandalf.ledd.callbacks.RecieveColorCallback;
import com.idlegandalf.ledd.callbacks.StripesCallback; import com.idlegandalf.ledd.callbacks.StripesCallback;
@@ -47,34 +44,47 @@ import com.idlegandalf.ledd.components.LedDDaemon;
import com.idlegandalf.ledd.components.LedStripe; import com.idlegandalf.ledd.components.LedStripe;
import com.idlegandalf.ledd.fragments.AddStripeDialog; import com.idlegandalf.ledd.fragments.AddStripeDialog;
import com.idlegandalf.ledd.helper.LedDHelper; import com.idlegandalf.ledd.helper.LedDHelper;
import com.idlegandalf.ledd.utils.RateLimiter;
import com.larswerkman.holocolorpicker.ColorPicker; import com.larswerkman.holocolorpicker.ColorPicker;
import com.larswerkman.holocolorpicker.SVBar; import com.larswerkman.holocolorpicker.SaturationBar;
import com.larswerkman.holocolorpicker.ValueBar;
import com.mikepenz.materialdrawer.Drawer;
import com.mikepenz.materialdrawer.DrawerBuilder;
import com.mikepenz.materialdrawer.holder.BadgeStyle;
import com.mikepenz.materialdrawer.interfaces.OnCheckedChangeListener;
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
import com.mikepenz.materialdrawer.model.SecondarySwitchDrawerItem;
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
import org.json.JSONException; import java.util.ArrayList;
import java.io.IOException;
import java.util.List; import java.util.List;
import butterknife.Bind; import butterknife.Bind;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import hugo.weaving.DebugLog;
public class ColorActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerItemClickListener, OnCheckedChangeListener {
@Bind(R.id.drawer_layout) @Bind(R.id.main_layout)
DrawerLayout mDrawerLayout; LinearLayout scrollView;
@Bind(R.id.toolbar) @Bind(R.id.toolbar)
Toolbar toolbar; Toolbar toolbar;
@Bind(R.id.drawer)
NavigationView navigationView;
@Bind(R.id.picker) @Bind(R.id.picker)
ColorPicker colorPicker; ColorPicker colorPicker;
@Bind(R.id.svbar) @Bind(R.id.saturationbar)
SVBar svBar; SaturationBar saturationBar;
private ActionBarDrawerToggle mDrawerToggle; @Bind(R.id.valuebar)
ValueBar valueBar;
Drawer mDrawer;
private List<IDrawerItem> mDaemons;
private refreshDaemonsListener daemonsListener; private refreshDaemonsListener daemonsListener;
private List<LedStripe> ledStripes; private List<LedStripe> ledStripes;
private LedStripe mCurrentStripe; private LedStripe mCurrentStripe;
private LedDHelper mCurrentHelper; private boolean fromOnCreate = true;
private boolean autoColorSet = false;
private RateLimiter limiter;
private boolean isRefreshRunning = false;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -85,49 +95,49 @@ public class ColorActivity extends AppCompatActivity implements NavigationView.O
// check for connectivity // check for connectivity
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo == null || !networkInfo.isConnected()) { if (networkInfo == null || !networkInfo.isConnected() || networkInfo.getType() != ConnectivityManager.TYPE_WIFI) {
// TODO: Display error (snackbar) Snackbar.make(scrollView, R.string.snackbar_no_wlan, Snackbar.LENGTH_INDEFINITE).setAction("RETRY", new View.OnClickListener() {
@Override
public void onClick(View v) {
refreshStripes();
}
}).show();
} }
colorPicker.addSVBar(svBar); mDaemons = new ArrayList<>();
limiter = new RateLimiter(5.0, 100.0);
colorPicker.addSaturationBar(saturationBar);
colorPicker.addValueBar(valueBar);
colorPicker.setShowOldCenterColor(false); colorPicker.setShowOldCenterColor(false);
colorPicker.setOnColorChangedListener(new ColorPicker.OnColorChangedListener() { colorPicker.setOnColorChangedListener(new ColorPicker.OnColorChangedListener() {
@Override @Override
public void onColorChanged(int i) { public void onColorChanged(int i) {
if (mCurrentStripe != null && mCurrentHelper != null) { if (mCurrentStripe != null && limiter.check() && !autoColorSet) {
float[] hsv = new float[3]; mCurrentStripe.setColor(i);
Color.colorToHSV(i, hsv);
mCurrentStripe.setColor(new HSV(hsv[0], hsv[1], hsv[2]));
mCurrentHelper.setColor(mCurrentStripe);
} }
} }
}); });
navigationView.setNavigationItemSelectedListener(this);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
toolbar.setTitle(R.string.app_name); toolbar.setTitle(R.string.app_name);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) { mDrawer = new DrawerBuilder()
.withActivity(this)
.withToolbar(toolbar)
.withOnDrawerItemClickListener(this)
.addStickyDrawerItems(
new PrimaryDrawerItem().withName(R.string.text_add_stripe).withTag("add_stripe").withSelectable(false),
new PrimaryDrawerItem().withName(R.string.text_settings).withTag("settings").withSelectable(false)
)
.build();
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
// TODO: do things that have to be done here
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
// TODO: do things that have to be done here
}
};
// set the drawer toggle as the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);
// enable Homebutton navigation to drawer // enable Homebutton navigation to drawer
if (getSupportActionBar() != null) { if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setHomeButtonEnabled(true); mDrawer.getActionBarDrawerToggle().setDrawerIndicatorEnabled(true);
} }
daemonsListener = new refreshDaemonsListener(); daemonsListener = new refreshDaemonsListener();
@@ -142,39 +152,54 @@ public class ColorActivity extends AppCompatActivity implements NavigationView.O
return true; return true;
} }
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
// Pass the event to ActionBarDrawerToggle, if it returns
// true, then it has handled the app icon touch event
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle your other action bar items...
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
@Override
protected void onRestart() {
super.onRestart();
refreshStripes();
}
@Override
public void onCheckedChanged(IDrawerItem drawerItem, CompoundButton buttonView, boolean isChecked) {
LedStripe stripe = null;
for (LedStripe ledStripe : ledStripes) {
if (((int) drawerItem.getTag()) == ledStripe.getId()) {
stripe = ledStripe;
break;
}
}
if (stripe != null) {
if (isChecked) {
if (stripe == mCurrentStripe) {
if (colorPicker.getColor() != Color.BLACK)
stripe.setColor(colorPicker.getColor());
else {
colorPicker.setColor(Color.WHITE);
}
} else {
stripe.setColor(Color.WHITE);
}
} else {
if (stripe == mCurrentStripe)
colorPicker.setColor(Color.BLACK);
else
stripe.setColor(Color.BLACK);
}
}
}
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) { public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) { if (keyCode == KeyEvent.KEYCODE_MENU) {
if (mDrawerLayout.isDrawerOpen(Gravity.LEFT)) { if (mDrawer.isDrawerOpen()) {
mDrawerLayout.closeDrawer(Gravity.LEFT); mDrawer.closeDrawer();
} else { } else {
mDrawerLayout.openDrawer(Gravity.LEFT); mDrawer.openDrawer();
} }
return true; return true;
@@ -187,6 +212,9 @@ public class ColorActivity extends AppCompatActivity implements NavigationView.O
super.onPause(); super.onPause();
ColorApplication.getInstance().teardown(); ColorApplication.getInstance().teardown();
unregisterReceiver(daemonsListener); unregisterReceiver(daemonsListener);
if (mCurrentStripe != null)
PreferenceManager.getDefaultSharedPreferences(this).edit().putInt("lastStripe", mCurrentStripe.getId()).commit();
} }
@Override @Override
@@ -198,142 +226,204 @@ public class ColorActivity extends AppCompatActivity implements NavigationView.O
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
if (!fromOnCreate) {
ColorApplication.getInstance().onResume(); ColorApplication.getInstance().onResume();
registerReceiver(daemonsListener, new IntentFilter(ColorApplication.INTENT_ACTION_REFRESH)); registerReceiver(daemonsListener, new IntentFilter(ColorApplication.INTENT_ACTION_REFRESH));
try {
refreshStripes(); refreshStripes();
} catch (IOException e) { } else {
e.printStackTrace(); fromOnCreate = false;
} }
} }
@Override @Override
public boolean onNavigationItemSelected(MenuItem menuItem) { public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
int id = menuItem.getItemId(); if (drawerItem.isSelectable()) {
switch (id) { if (drawerItem.getTag() instanceof String) {
case R.id.nv_add_stripe: String tag = (String) drawerItem.getTag();
if (tag.equals("add_stripe")) {
new AddStripeDialog().show(getFragmentManager(), ""); new AddStripeDialog().show(getFragmentManager(), "");
return true; return true;
case R.id.nv_settings: } else if (tag.equals("settings")) {
return true; return true;
} }
}
if (drawerItem.getTag() instanceof Integer) {
int tag = (int) drawerItem.getTag();
for (LedStripe stripe : ledStripes) { for (LedStripe stripe : ledStripes) {
if (stripe.getName().equals(menuItem.getTitle())) { if (tag == stripe.getId()) {
mCurrentStripe = stripe; selectStripe(stripe);
try {
mCurrentHelper = ColorApplication.getInstance().getHelperForDaemon(stripe.getLedDDaemon());
} catch (IOException e) {
e.printStackTrace();
}
mDrawerLayout.closeDrawer(Gravity.LEFT);
toolbar.setTitle(stripe.getName());
try {
mCurrentHelper.getColor(mCurrentStripe, new RecieveColorCallback() {
@Override
public void onColorRecieved(LedStripe stripe) {
final HSV cColor = stripe.getColor();
runOnUiThread(new Runnable() {
@Override
public void run() {
colorPicker.setColor(Color.HSVToColor(new float[]{(float) cColor.getHue(), (float) cColor.getSaturation(),
(float) cColor.getValue()}));
}
});
}
@Override
public void onRecievFailed(String msg) {
}
@Override
public void onConnectionFailed(String message) {
}
});
} catch (JSONException | IOException e) {
e.printStackTrace();
}
return true; return true;
} }
} }
}
}
return false; return false;
} }
public void refreshStripes() throws IOException { public void refreshStripes() {
reCreateNavigationView(); // need to recreate the navigationview since we can't remove a once added submenu if (isRefreshRunning)
return;
final Menu nvMenu = navigationView.getMenu(); isRefreshRunning = true;
final int stripeGroup = 42;
int i = 1; int i = 1;
for (final LedDDaemon dDaemon : ColorApplication.getInstance().getDaemons()) { for (final LedDDaemon dDaemon : ColorApplication.getInstance().getDaemons()) {
LedDHelper helper = ColorApplication.getInstance().getHelperForDaemon(dDaemon); LedDHelper helper = ColorApplication.getInstance().getHelperForDaemon(dDaemon);
if (helper != null) { if (helper != null) {
try {
final int finalI = i; final int finalI = i;
helper.getStripes(new StripesCallback() { helper.getStripes(new StripesCallback() {
@Override @Override
public void onSuccess(final List<LedStripe> stripes) { public void onSuccess(List<LedStripe> stripes) {
ledStripes = stripes;
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
SubMenu nDaemonMenu = nvMenu.addSubMenu(Menu.NONE, Menu.NONE, finalI, dDaemon.toString()); PrimaryDrawerItem nDaemonMenu = null;
nDaemonMenu.setGroupCheckable(stripeGroup, true, true); long selectedItemId = -1;
for (IDrawerItem drawerItem : mDaemons) {
ledStripes = stripes; if (((PrimaryDrawerItem) drawerItem).getName().getText().equals(dDaemon.toString())) {
Snackbar.make(findViewById(android.R.id.content), "LED stripes reloaded", Snackbar.LENGTH_LONG).show(); nDaemonMenu = (PrimaryDrawerItem) drawerItem;
break;
for (LedStripe stripe : ledStripes) {
MenuItem sItem = nDaemonMenu.add(stripeGroup, View.generateViewId(), stripe.getId(), stripe.getName());
sItem.setIcon(R.drawable.ic_wb_iridescent_black_48dp);
} }
} }
if (nDaemonMenu == null) {
nDaemonMenu = new PrimaryDrawerItem().withName(dDaemon.toString()).withTag(finalI).withSelectable(false).withIsExpanded(true);
mDrawer.addItem(nDaemonMenu);
mDaemons.add(nDaemonMenu);
}
int lastStripeId = -1;
if (PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).contains("lastStripe")) {
lastStripeId = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getInt("lastStripe", -1);
}
List<IDrawerItem> mStripes = new ArrayList<>();
for (LedStripe stripe : ledStripes) {
final SecondarySwitchDrawerItem sItem = new SecondarySwitchDrawerItem()
.withName(stripe.getName())
.withTag(stripe.getId())
.withIcon(R.drawable.ic_wb_iridescent_black_48dp)
.withOnCheckedChangeListener(ColorActivity.this);
mStripes.add(sItem);
if (lastStripeId != -1 && stripe.getId() == lastStripeId) {
selectStripe(stripe);
selectedItemId = sItem.getIdentifier();
}
}
nDaemonMenu.withSubItems(mStripes);
nDaemonMenu.withBadge(String.valueOf(mStripes.size()));
nDaemonMenu.withBadgeStyle(new BadgeStyle().withColor(getResources().getColor(R.color.material_drawer_accent)).withTextColor(Color.WHITE));
mDrawer.updateItem(nDaemonMenu);
if (selectedItemId != -1)
mDrawer.setSelection(selectedItemId);
Snackbar.make(findViewById(android.R.id.content), R.string.snackbar_stripes_reloaded, Snackbar.LENGTH_LONG).show();
}
}); });
for (LedStripe stripe : ledStripes) {
stripe.getColor(new RecieveColorCallback() {
@Override
public void onConnectionFailed(String message) {
} }
@Override @Override
public void onGetFailed(String message) { public void onColorRecieved(LedStripe stripe) {
Snackbar.make(findViewById(android.R.id.content), "Coudn't get stripes from daemon: " + message, Snackbar.LENGTH_LONG) if (stripe.isOn()) {
.show(); IDrawerItem sItem = findItemForStripe(stripe);
if (sItem != null) {
final SecondarySwitchDrawerItem cItem = (SecondarySwitchDrawerItem) sItem;
cItem.withSwitchEnabled(true);
runOnUiThread(new Runnable() {
@Override
public void run() {
mDrawer.updateItem(cItem);
}
});
}
}
}
@Override
public void onRecievFailed(int code, String msg) {
}
});
}
}
@Override
public void onGetFailed(int code, String message) {
Snackbar.make(findViewById(android.R.id.content), getString(R.string.snackbar_no_connection_stripes) + message, Snackbar
.LENGTH_LONG).show();
} }
@Override @Override
public void onConnectionFailed(String message) { public void onConnectionFailed(String message) {
Snackbar.make(findViewById(android.R.id.content), "Coudn't connect to daemon: " + message, Snackbar.LENGTH_LONG).show(); Snackbar.make(findViewById(android.R.id.content), getString(R.string.snackbar_connection_failed) + message, Snackbar
.LENGTH_LONG).show();
} }
}); });
} catch (JSONException | IOException e) {
e.printStackTrace();
}
} }
i++; i++;
} }
isRefreshRunning = false;
} }
private void reCreateNavigationView() { @DebugLog
private void selectStripe(LedStripe stripe) {
mCurrentStripe = stripe;
toolbar.setTitle(stripe.getName());
autoColorSet = true;
mDrawer.closeDrawer();
mCurrentStripe.getColor(new RecieveColorCallback() {
@Override
public void onColorRecieved(final LedStripe stripe) {
final HSV cColor = stripe.getColor();
final int color = Color.HSVToColor(new float[]{(float) cColor.getHue(), (float) cColor.getSaturation(), (float) cColor.getValue()});
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
mDrawerLayout.removeView(navigationView); colorPicker.setColor(color);
navigationView = new NavigationView(ColorActivity.this); autoColorSet = false;
DrawerLayout.LayoutParams params = new DrawerLayout.LayoutParams(DrawerLayout.LayoutParams.WRAP_CONTENT, DrawerLayout.LayoutParams
.MATCH_PARENT); if (stripe.isOn()) {
params.gravity = Gravity.START; IDrawerItem fItem = findItemForStripe(stripe);
navigationView.setLayoutParams(params);
navigationView.inflateMenu(R.menu.navigation_drawer); if (fItem != null)
navigationView.inflateHeaderView(R.layout.navigation_header); ((SecondarySwitchDrawerItem) fItem).withSwitchEnabled(true);
mDrawerLayout.addView(navigationView, params); }
navigationView.setNavigationItemSelectedListener(ColorActivity.this); }
mDrawerToggle.syncState(); });
}
@Override
public void onRecievFailed(int code, String msg) {
autoColorSet = false;
}
@Override
public void onConnectionFailed(String message) {
autoColorSet = false;
} }
}); });
} }
@@ -343,12 +433,23 @@ public class ColorActivity extends AppCompatActivity implements NavigationView.O
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ColorApplication.INTENT_ACTION_REFRESH)) { if (intent.getAction().equals(ColorApplication.INTENT_ACTION_REFRESH)) {
try {
refreshStripes(); refreshStripes();
} catch (IOException e) { }
e.printStackTrace(); }
}
@DebugLog
private IDrawerItem findItemForStripe(LedStripe stripe) {
for (IDrawerItem dItem : mDaemons) {
if (((PrimaryDrawerItem) dItem).getSubItems() != null) {
for (IDrawerItem sItem : ((PrimaryDrawerItem) dItem).getSubItems()) {
if (((int) sItem.getTag()) == stripe.getId()) {
return sItem;
} }
} }
} }
} }
return null;
}
} }

View File

@@ -29,9 +29,6 @@ import com.idlegandalf.ledd.callbacks.DiscoverCallback;
import com.idlegandalf.ledd.components.LedDDaemon; import com.idlegandalf.ledd.components.LedDDaemon;
import com.idlegandalf.ledd.helper.LedDHelper; import com.idlegandalf.ledd.helper.LedDHelper;
import org.json.JSONException;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -50,18 +47,17 @@ public class ColorApplication extends Application {
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
singleton = this;
singleton = this;
ledDHelpers = new HashMap<>(); ledDHelpers = new HashMap<>();
this.onResume(); this.onResume();
} }
public LedDHelper getHelperForDaemon(final LedDDaemon ledDDaemon) throws IOException { public LedDHelper getHelperForDaemon(final LedDDaemon ledDDaemon) {
if (ledDHelpers.containsKey(ledDDaemon) && ledDHelpers.get(ledDDaemon) != null) { if (ledDHelpers.containsKey(ledDDaemon) && ledDHelpers.get(ledDDaemon) != null) {
return ledDHelpers.get(ledDDaemon); return ledDHelpers.get(ledDDaemon);
} else { } else {
final LedDHelper dHelper = new LedDHelper(ledDDaemon, getApplicationContext()); final LedDHelper dHelper = new LedDHelper(ledDDaemon, getApplicationContext());
try {
dHelper.discover(new DiscoverCallback() { dHelper.discover(new DiscoverCallback() {
@Override @Override
public void onConnectionFailed(String message) { public void onConnectionFailed(String message) {
@@ -73,11 +69,6 @@ public class ColorApplication extends Application {
ledDHelpers.put(ledDDaemon, dHelper); ledDHelpers.put(ledDDaemon, dHelper);
} }
}); });
} catch (JSONException e) {
e.printStackTrace();
}
return dHelper; return dHelper;
} }
} }
@@ -103,8 +94,9 @@ public class ColorApplication extends Application {
TypeToken<Set<LedDDaemon>>() { TypeToken<Set<LedDDaemon>>() {
}.getType()); }.getType());
Log.i(ColorApplication.TAG, "Loaded " + ledDDaemons.size() + " Daemons from preferences");
for (final LedDDaemon ledDDaemon : ledDDaemons) { for (final LedDDaemon ledDDaemon : ledDDaemons) {
try {
final LedDHelper helper = new LedDHelper(ledDDaemon, getApplicationContext()); final LedDHelper helper = new LedDHelper(ledDDaemon, getApplicationContext());
helper.discover(new DiscoverCallback() { helper.discover(new DiscoverCallback() {
@@ -126,14 +118,7 @@ public class ColorApplication extends Application {
sendBroadcast(i); sendBroadcast(i);
} }
}); });
} catch (IOException | JSONException e) {
e.printStackTrace();
} }
} }
} }
Log.i(ColorApplication.TAG, "Loaded " + ledDHelpers.size() + " Daemons from preferences");
}
} }

View File

@@ -19,11 +19,11 @@
package com.idlegandalf.ledd; package com.idlegandalf.ledd;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.app.ActionBarActivity; import android.support.v7.app.AppCompatActivity;
import com.idlegandalf.ledd.fragments.SettingsFragment; import com.idlegandalf.ledd.fragments.SettingsFragment;
public class SettingsActivity extends ActionBarActivity { public class SettingsActivity extends AppCompatActivity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);

View File

@@ -28,6 +28,6 @@ public interface AddControllerCallback extends BaseCallback {
*/ */
void onControllerAdded(Controller controller); void onControllerAdded(Controller controller);
void onAddFailed(String msg, String detail); void onAddFailed(int code, String msg);
} }

View File

@@ -23,4 +23,6 @@ import com.idlegandalf.ledd.components.LedStripe;
public interface AddStripeCallback extends BaseCallback { public interface AddStripeCallback extends BaseCallback {
void onAddSuccessfully(LedStripe stripe); void onAddSuccessfully(LedStripe stripe);
void onAddFailed(int code, String msg);
} }

View File

@@ -23,5 +23,5 @@ import com.idlegandalf.ledd.components.LedStripe;
public interface RecieveColorCallback extends BaseCallback { public interface RecieveColorCallback extends BaseCallback {
void onColorRecieved(LedStripe stripe); void onColorRecieved(LedStripe stripe);
void onRecievFailed(String msg); void onRecievFailed(int code, String msg);
} }

View File

@@ -26,5 +26,5 @@ import java.util.List;
public interface StripesCallback extends BaseCallback { public interface StripesCallback extends BaseCallback {
void onSuccess(List<LedStripe> stripes); void onSuccess(List<LedStripe> stripes);
void onGetFailed(String message); void onGetFailed(int code, String message);
} }

View File

@@ -19,11 +19,11 @@
package com.idlegandalf.ledd.components; package com.idlegandalf.ledd.components;
import org.json.JSONObject; import com.thetransactioncompany.jsonrpc2.JSONRPC2Response;
public abstract class AnswerTask { public abstract class AnswerTask {
public abstract void onConnectionFailed(String message); public abstract void onConnectionFailed(String message);
public abstract void onResponse(JSONObject response); public abstract void onResponse(JSONRPC2Response response);
} }

View File

@@ -18,16 +18,16 @@
package com.idlegandalf.ledd.components; package com.idlegandalf.ledd.components;
import org.json.JSONObject; import com.thetransactioncompany.jsonrpc2.JSONRPC2Request;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class LedDRequest { public class LedDRequest {
JSONObject request; JSONRPC2Request request;
AnswerTask task; AnswerTask task;
public LedDRequest(JSONObject request, AnswerTask task) { public LedDRequest(JSONRPC2Request request, AnswerTask task) {
this.request = request; this.request = request;
this.task = task; this.task = task;
} }

View File

@@ -18,6 +18,13 @@
package com.idlegandalf.ledd.components; package com.idlegandalf.ledd.components;
import android.graphics.Color;
import com.idlegandalf.ledd.ColorApplication;
import com.idlegandalf.ledd.callbacks.RecieveColorCallback;
import com.idlegandalf.ledd.helper.LedDHelper;
import hugo.weaving.DebugLog;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -34,6 +41,7 @@ public class LedStripe {
boolean RGB; boolean RGB;
Controller controller; Controller controller;
LedDDaemon ledDDaemon; LedDDaemon ledDDaemon;
LedDHelper helper;
public LedStripe() { public LedStripe() {
this(-1, -1, -1, -1, ""); this(-1, -1, -1, -1, "");
@@ -55,4 +63,41 @@ public class LedStripe {
this.name = name; this.name = name;
this.RGB = RGB; this.RGB = RGB;
} }
@Override
public String toString() {
return String.format("%s->%s->%s (%d|%d|%d)", ledDDaemon, controller.getAddress(), name, channelRed, channelGreen, channelBlue);
}
@DebugLog
public void setColor(int color) {
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
setColor(new HSV(hsv[0], hsv[1], hsv[2]));
}
public void setColor(HSV color) {
checkHelper();
this.color = color;
helper.setColor(this);
}
private void checkHelper() {
if (helper == null) {
helper = ColorApplication.getInstance().getHelperForDaemon(ledDDaemon);
}
}
@DebugLog
public void getColor(RecieveColorCallback callback) {
checkHelper();
helper.getColor(this, callback);
}
@DebugLog
public boolean isOn() {
return color != null && color.getValue() != 0.0;
}
} }

View File

@@ -18,33 +18,26 @@
package com.idlegandalf.ledd.components; package com.idlegandalf.ledd.components;
import org.json.JSONException; import com.thetransactioncompany.jsonrpc2.JSONRPC2Request;
import org.json.JSONObject; import com.thetransactioncompany.jsonrpc2.JSONRPC2Response;
import java.util.UUID; import org.json.JSONException;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class Sendable { public class Sendable {
LedDDaemon recipient; LedDDaemon recipient;
JSONObject message; JSONRPC2Request request;
String ref;
AnswerTask onAnswer; AnswerTask onAnswer;
public Sendable(JSONObject msg, AnswerTask task, LedDDaemon ledDDaemon) throws JSONException { public Sendable(JSONRPC2Request request, AnswerTask task, LedDDaemon recipient) throws JSONException {
this(msg, UUID.randomUUID().toString(), task, ledDDaemon); this.request = request;
}
public Sendable(JSONObject msg, String ref, AnswerTask task, LedDDaemon recipient) throws JSONException {
this.message = msg;
this.ref = ref;
this.message.put("ref", ref);
this.onAnswer = task; this.onAnswer = task;
this.recipient = recipient; this.recipient = recipient;
} }
public void onResponse(JSONObject object) { public void onResponse(JSONRPC2Response object) {
if (onAnswer != null) { if (onAnswer != null) {
onAnswer.onResponse(object); onAnswer.onResponse(object);
} }
@@ -55,6 +48,8 @@ public class Sendable {
} }
public void onConnectionFailed(String message) { public void onConnectionFailed(String message) {
if (onAnswer != null) {
onAnswer.onConnectionFailed(message); onAnswer.onConnectionFailed(message);
} }
} }
}

View File

@@ -21,9 +21,6 @@ package com.idlegandalf.ledd.components;
import com.idlegandalf.ledd.helper.LedDHelper; import com.idlegandalf.ledd.helper.LedDHelper;
import org.json.JSONException;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
public class StripeGroup { public class StripeGroup {
@@ -60,7 +57,7 @@ public class StripeGroup {
return null; return null;
} }
public void setRGB(int r, int g, int b, LedDHelper api) throws JSONException, IOException { public void setRGB(int r, int g, int b, LedDHelper api) {
for (int i = 0; i < mStripes.size(); i++) { for (int i = 0; i < mStripes.size(); i++) {
//mStripes.get(i).setRGB(r, g, b, api); //mStripes.get(i).setRGB(r, g, b, api);
} }

View File

@@ -39,9 +39,6 @@ import com.idlegandalf.ledd.components.Controller;
import com.idlegandalf.ledd.components.LedDDaemon; import com.idlegandalf.ledd.components.LedDDaemon;
import com.idlegandalf.ledd.helper.LedDHelper; import com.idlegandalf.ledd.helper.LedDHelper;
import org.json.JSONException;
import java.io.IOException;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.text.ParsePosition; import java.text.ParsePosition;
@@ -64,6 +61,13 @@ public class AddControllerDialog extends DialogFragment implements DialogInterfa
EditText channelText; EditText channelText;
LedDDaemon dDaemon; LedDDaemon dDaemon;
private static boolean isNumeric(String str) {
NumberFormat formatter = NumberFormat.getInstance();
ParsePosition pos = new ParsePosition(0);
formatter.parse(str, pos);
return str.length() == pos.getIndex();
}
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
View v = View.inflate(getActivity(), R.layout.fragment_addcontroller, null); View v = View.inflate(getActivity(), R.layout.fragment_addcontroller, null);
ButterKnife.bind(this, v); ButterKnife.bind(this, v);
@@ -168,23 +172,16 @@ public class AddControllerDialog extends DialogFragment implements DialogInterfa
c.setI2c_device(Integer.parseInt(i2cText.getText().toString())); c.setI2c_device(Integer.parseInt(i2cText.getText().toString()));
c.setChannels(Integer.parseInt(channelText.getText().toString())); c.setChannels(Integer.parseInt(channelText.getText().toString()));
LedDHelper helper = null; LedDHelper helper = ColorApplication.getInstance().getHelperForDaemon(dDaemon);
try {
helper = ColorApplication.getInstance().getHelperForDaemon(dDaemon);
} catch (IOException e) {
e.printStackTrace();
}
if (helper != null) { if (helper != null) {
try {
helper.addController(c, new AddControllerCallback() { helper.addController(c, new AddControllerCallback() {
@Override @Override
public void onControllerAdded(final Controller controller) { public void onControllerAdded(final Controller controller) {
getActivity().runOnUiThread(new Runnable() { getActivity().runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)) Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0), String.format(getActivity().getString(R.string.snachbar_added_controller), controller.getId()), Snackbar.LENGTH_LONG).show();
.getChildAt(0), "Added Controller (" + controller.getId() + ")", Snackbar.LENGTH_LONG).show();
} }
}); });
@@ -193,12 +190,11 @@ public class AddControllerDialog extends DialogFragment implements DialogInterfa
} }
@Override @Override
public void onAddFailed(final String msg, String detail) { public void onAddFailed(final int code, final String msg) {
getActivity().runOnUiThread(new Runnable() { getActivity().runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)) Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0), getActivity().getString(R.string.snackbar_error) + msg, Snackbar.LENGTH_LONG).show();
.getChildAt(0), "Error: " + msg, Snackbar.LENGTH_LONG).show();
} }
}); });
AddStripeDialog.instance.onResume(); AddStripeDialog.instance.onResume();
@@ -210,174 +206,15 @@ public class AddControllerDialog extends DialogFragment implements DialogInterfa
getActivity().runOnUiThread(new Runnable() { getActivity().runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)) Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0), String.format(getActivity().getString(R.string.snackbar_daemon_connection_failed), dDaemon, message), Snackbar.LENGTH_LONG).show();
.getChildAt(0), "Coudn't connect to" +
" daemon at " + dDaemon + ": " + message, Snackbar.LENGTH_LONG).show();
} }
}); });
AddStripeDialog.instance.onResume(); AddStripeDialog.instance.onResume();
dismiss(); dismiss();
} }
}); });
} catch (JSONException | IOException e) {
e.printStackTrace();
}
} }
} }
}); });
} }
@Override
public void onShow(final DialogInterface dialog) {
final AlertDialog alertDialog = (AlertDialog) dialog;
addressText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
addressLayout.setError(null);
}
});
channelText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
channelLayout.setError(null);
}
});
i2cText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
i2cLayout.setError(null);
}
});
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AddStripeDialog.instance.onResume();
alertDialog.dismiss();
}
});
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (i2cText.getText().toString().isEmpty() || !isNumeric(i2cText.getText().toString())) {
i2cLayout.setError("No valid i2c device number");
return;
}
if (!addressText.getText().toString().contains("0x") || !addressText.getText().toString().split("x")[1].matches("-?[0-9a-fA-F]+")) {
addressLayout.setError("No valid hexdecimal address");
return;
}
if (channelText.getText().toString().isEmpty() || !isNumeric(channelText.getText().toString()) && Integer.parseInt(channelText
.getText().toString()) <= 0) {
channelLayout.setError("No valid channel amount");
return;
}
Controller c = new Controller();
c.setAddress(addressText.getText().toString());
c.setI2c_device(Integer.parseInt(i2cText.getText().toString()));
c.setChannels(Integer.parseInt(channelText.getText().toString()));
LedDHelper helper = null;
try {
helper = ColorApplication.getInstance().getHelperForDaemon(dDaemon);
} catch (IOException e) {
e.printStackTrace();
}
if (helper != null) {
try {
helper.addController(c, new AddControllerCallback() {
@Override
public void onControllerAdded(final Controller controller) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content))
.getChildAt(0), "Added Controller (" + controller.getId() + ")", Snackbar.LENGTH_LONG).show();
}
});
dDaemon.getControllers().add(controller);
dismiss();
}
@Override
public void onAddFailed(final String msg, String detail) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content))
.getChildAt(0), "Error: " + msg, Snackbar.LENGTH_LONG).show();
}
});
AddStripeDialog.instance.onResume();
dismiss();
}
@Override
public void onConnectionFailed(final String message) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content))
.getChildAt(0), "Coudn't connect to" +
" daemon at " + dDaemon + ": " + message, Snackbar.LENGTH_LONG).show();
}
});
AddStripeDialog.instance.onResume();
dismiss();
}
});
} catch (JSONException | IOException e) {
e.printStackTrace();
}
}
}
});
}
private static boolean isNumeric(String str) {
NumberFormat formatter = NumberFormat.getInstance();
ParsePosition pos = new ParsePosition(0);
formatter.parse(str, pos);
return str.length() == pos.getIndex();
}
} }

View File

@@ -45,9 +45,6 @@ import com.idlegandalf.ledd.R;
import com.idlegandalf.ledd.callbacks.DiscoverCallback; import com.idlegandalf.ledd.callbacks.DiscoverCallback;
import com.idlegandalf.ledd.components.LedDDaemon; import com.idlegandalf.ledd.components.LedDDaemon;
import org.json.JSONException;
import java.io.IOException;
import java.net.Inet4Address; import java.net.Inet4Address;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -286,19 +283,15 @@ public class AddDaemonDialog extends DialogFragment implements DialogInterface.O
} }
private void addDaemon(final LedDDaemon ledDDaemon) { private void addDaemon(final LedDDaemon ledDDaemon) {
try {
ColorApplication.getInstance().getHelperForDaemon(ledDDaemon).discover(new DiscoverCallback() { ColorApplication.getInstance().getHelperForDaemon(ledDDaemon).discover(new DiscoverCallback() {
@Override @Override
public void onConnectionFailed(final String message) { public void onConnectionFailed(final String message) {
getActivity().runOnUiThread(new Runnable() { getActivity().runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0), Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0), String.format(getActivity().getString(R.string.snackbar_daemon_connection_failed), ledDDaemon, message), Snackbar.LENGTH_LONG).show();
"Coudn't connect to" +
" daemon at " + ledDDaemon + ": " + message, Snackbar.LENGTH_LONG).show();
} }
}); });
AddStripeDialog stripeAdd = (AddStripeDialog) getFragmentManager().findFragmentByTag("stripeAdd");
AddStripeDialog.instance.onResume(); AddStripeDialog.instance.onResume();
dismiss(); dismiss();
} }
@@ -309,21 +302,14 @@ public class AddDaemonDialog extends DialogFragment implements DialogInterface.O
@Override @Override
public void run() { public void run() {
Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0), Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0),
"Added LedD Daemon version: " + version, Snackbar.LENGTH_LONG).show(); getActivity().getString(R.string.snackbar_added_daemon_version, version), Snackbar.LENGTH_LONG).show();
} }
}); });
try {
((ColorActivity) getActivity()).refreshStripes(); ((ColorActivity) getActivity()).refreshStripes();
} catch (IOException e) {
e.printStackTrace();
}
AddStripeDialog.instance.onResume(); AddStripeDialog.instance.onResume();
dismiss(); dismiss();
} }
}); });
} catch (JSONException | IOException e) {
e.printStackTrace();
}
} }
} }

View File

@@ -50,9 +50,6 @@ import com.idlegandalf.ledd.components.LedDDaemon;
import com.idlegandalf.ledd.components.LedStripe; import com.idlegandalf.ledd.components.LedStripe;
import com.idlegandalf.ledd.helper.LedDHelper; import com.idlegandalf.ledd.helper.LedDHelper;
import org.json.JSONException;
import java.io.IOException;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.text.ParsePosition; import java.text.ParsePosition;
import java.util.List; import java.util.List;
@@ -259,50 +256,40 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
stripe.setLedDDaemon((LedDDaemon) daemonSpinner.getSelectedItem()); stripe.setLedDDaemon((LedDDaemon) daemonSpinner.getSelectedItem());
stripe.setController((Controller) controllerSpinner.getSelectedItem()); stripe.setController((Controller) controllerSpinner.getSelectedItem());
LedDHelper helper = null; LedDHelper helper = ColorApplication.getInstance().getHelperForDaemon((LedDDaemon) daemonSpinner.getSelectedItem());
try {
helper = ColorApplication.getInstance().getHelperForDaemon((LedDDaemon) daemonSpinner.getSelectedItem());
} catch (IOException e) {
e.printStackTrace();
}
if (helper != null) { if (helper != null) {
try {
helper.addStripe(stripe, new AddStripeCallback() { helper.addStripe(stripe, new AddStripeCallback() {
@Override @Override
public void onAddSuccessfully(final LedStripe stripe) { public void onAddSuccessfully(final LedStripe stripe) {
ColorActivity activity = ((ColorActivity) getActivity()); ColorActivity activity = ((ColorActivity) getActivity());
try {
activity.refreshStripes(); activity.refreshStripes();
} catch (IOException e) {
e.printStackTrace();
}
getActivity().runOnUiThread(new Runnable() { getActivity().runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)) Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0), String.format(getActivity().getString(R.string.snackbar_added_stripe_id), stripe.getId()), Snackbar.LENGTH_LONG).show();
.getChildAt(0), "Added stripe (" + stripe.getId() + ")", Snackbar.LENGTH_LONG).show();
} }
}); });
dismiss(); dismiss();
} }
@Override
public void onAddFailed(int code, String msg) {
}
@Override @Override
public void onConnectionFailed(final String message) { public void onConnectionFailed(final String message) {
getActivity().runOnUiThread(new Runnable() { getActivity().runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)) Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0), getActivity().getString(R.string.snackbar_failed_add_stripe) + message, Snackbar.LENGTH_LONG).show();
.getChildAt(0), "Failed to add stripe: " + message, Snackbar.LENGTH_LONG).show();
} }
}); });
dismiss(); dismiss();
} }
}); });
} catch (JSONException | IOException e) {
e.printStackTrace();
}
} }
} }
}); });
@@ -371,6 +358,10 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
ColorApplication.getInstance().onResume(); ColorApplication.getInstance().onResume();
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if (daemonArrayAdapter != null) { if (daemonArrayAdapter != null) {
daemonArrayAdapter.clear(); daemonArrayAdapter.clear();
daemonArrayAdapter.addAll(ColorApplication.getInstance().getDaemons()); daemonArrayAdapter.addAll(ColorApplication.getInstance().getDaemons());
@@ -380,6 +371,8 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
refreshController((LedDDaemon) daemonSpinner.getSelectedItem()); refreshController((LedDDaemon) daemonSpinner.getSelectedItem());
} }
} }
});
}
private void testChannel(EditText text, ImageButton button) { private void testChannel(EditText text, ImageButton button) {
if (mDaemonSelected && mControllerSelected) { if (mDaemonSelected && mControllerSelected) {
@@ -398,19 +391,11 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
} }
text.setTag(toggle); text.setTag(toggle);
LedDHelper helper = null; LedDHelper helper = ColorApplication.getInstance().getHelperForDaemon((LedDDaemon) daemonSpinner.getSelectedItem());
try {
helper = ColorApplication.getInstance().getHelperForDaemon((LedDDaemon) daemonSpinner.getSelectedItem());
} catch (IOException e) {
e.printStackTrace();
}
if (helper != null) { if (helper != null) {
try {
helper.testChannel((Controller) controllerSpinner.getSelectedItem(), Integer.parseInt(text.getText().toString()), val); helper.testChannel((Controller) controllerSpinner.getSelectedItem(), Integer.parseInt(text.getText().toString()), val);
} catch (JSONException e) {
e.printStackTrace();
}
} }
} }
} }
@@ -418,15 +403,9 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
private void refreshController(final LedDDaemon ledDDaemon) { private void refreshController(final LedDDaemon ledDDaemon) {
controllerArrayAdapter.clear(); controllerArrayAdapter.clear();
LedDHelper helper = null; LedDHelper helper = ColorApplication.getInstance().getHelperForDaemon(ledDDaemon);
try {
helper = ColorApplication.getInstance().getHelperForDaemon(ledDDaemon);
} catch (IOException e) {
e.printStackTrace();
}
if (helper != null) { if (helper != null) {
try {
helper.getStripes(new StripesCallback() { helper.getStripes(new StripesCallback() {
@Override @Override
public void onSuccess(List<LedStripe> stripes) { public void onSuccess(List<LedStripe> stripes) {
@@ -440,7 +419,7 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
} }
@Override @Override
public void onGetFailed(String message) { public void onGetFailed(int code, String message) {
} }
@@ -449,9 +428,6 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
} }
}); });
} catch (JSONException | IOException e) {
e.printStackTrace();
}
} }
} }
} }

View File

@@ -38,14 +38,19 @@ import com.idlegandalf.ledd.components.LedDDaemon;
import com.idlegandalf.ledd.components.LedDRequest; import com.idlegandalf.ledd.components.LedDRequest;
import com.idlegandalf.ledd.components.LedStripe; import com.idlegandalf.ledd.components.LedStripe;
import com.idlegandalf.ledd.services.ColorService; import com.idlegandalf.ledd.services.ColorService;
import com.thetransactioncompany.jsonrpc2.JSONRPC2Error;
import com.thetransactioncompany.jsonrpc2.JSONRPC2Request;
import com.thetransactioncompany.jsonrpc2.JSONRPC2Response;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
public class LedDHelper { public class LedDHelper {
@@ -53,7 +58,7 @@ public class LedDHelper {
final String ACTION_GETCOLOR = "get_color"; final String ACTION_GETCOLOR = "get_color";
final String ACTION_ADDCONTROLLER = "add_controller"; final String ACTION_ADDCONTROLLER = "add_controller";
final String ACTION_GETALLSTRIPES = "get_stripes"; final String ACTION_GETALLSTRIPES = "get_stripes";
final String ACTION_ADDSTRIPES = "add_stripe"; final String ACTION_ADDSTRIPE = "add_stripe";
final String ACTION_TESTCHANNEL = "test_channel"; final String ACTION_TESTCHANNEL = "test_channel";
final String ACTION_DISCOVER = "discover"; final String ACTION_DISCOVER = "discover";
private Context context; private Context context;
@@ -78,7 +83,7 @@ public class LedDHelper {
} }
}; };
public LedDHelper(LedDDaemon ledDDaemon, Context appl) throws IOException { public LedDHelper(LedDDaemon ledDDaemon, Context appl) {
this.context = appl; this.context = appl;
this.dRequests = new LinkedBlockingQueue<>(); this.dRequests = new LinkedBlockingQueue<>();
this.ledDDaemon = ledDDaemon; this.ledDDaemon = ledDDaemon;
@@ -91,63 +96,58 @@ public class LedDHelper {
* Add controller to ledd daemon * Add controller to ledd daemon
* *
* @param c controller object * @param c controller object
* @throws JSONException no valid json
* @throws IOException socket error
*/ */
public void addController(final Controller c, final AddControllerCallback callback) throws JSONException, IOException { public void addController(final Controller c, final AddControllerCallback callback) {
JSONObject jnson = new JSONObject(); Map<String, Object> params = new HashMap<>();
jnson.put("action", ACTION_ADDCONTROLLER); params.put("channels", c.getChannels());
jnson.put("channels", c.getChannels()); params.put("i2c_dev", c.getI2c_device());
jnson.put("i2c_dev", c.getI2c_device()); params.put("address", c.getAddress());
jnson.put("address", c.getAddress());
addRequestToQueue(jnson, new AnswerTask() { JSONRPC2Request request = new JSONRPC2Request(ACTION_ADDCONTROLLER, params, UUID.randomUUID().toString());
addRequestToQueue(request, new AnswerTask() {
@Override @Override
public void onConnectionFailed(String message) { public void onConnectionFailed(String message) {
callback.onAddFailed(message, ""); callback.onConnectionFailed(message);
} }
@Override @Override
public void onResponse(JSONObject response) { public void onResponse(JSONRPC2Response response) {
if (response.indicatesSuccess()) {
try { try {
if (response.getBoolean("success")) { JSONObject json = new JSONObject(response.getResult().toString());
c.setId(response.getInt("cid")); c.setId(json.getInt("cid"));
callback.onControllerAdded(c); callback.onControllerAdded(c);
} else { } catch (JSONException e) {
callback.onAddFailed(response.getString("message"), response.getString("message_detail"));
}
} catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} else {
@SuppressWarnings("ThrowableResultOfMethodCallIgnored") JSONRPC2Error error = response.getError();
callback.onAddFailed(error.getCode(), error.getMessage());
}
} }
}); });
} }
/** /**
* Get stripes known to daemon * Get stripes known to daemon
*
* @throws JSONException no valid json
* @throws IOException socket error
*/ */
public void getStripes(final StripesCallback callback) throws JSONException, IOException { public void getStripes(final StripesCallback callback) {
JSONObject jnson = new JSONObject(); addRequestToQueue(new JSONRPC2Request(ACTION_GETALLSTRIPES, UUID.randomUUID().toString()), new AnswerTask() {
jnson.put("action", ACTION_GETALLSTRIPES);
addRequestToQueue(jnson, new AnswerTask() {
@Override @Override
public void onConnectionFailed(String message) { public void onConnectionFailed(String message) {
callback.onGetFailed(message); callback.onConnectionFailed(message);
} }
@Override @Override
public void onResponse(JSONObject response) { public void onResponse(JSONRPC2Response response) {
try { try {
if (response.getBoolean("success")) { if (response.indicatesSuccess()) {
ledDDaemon.getControllers().clear(); ledDDaemon.getControllers().clear();
List<LedStripe> list = new ArrayList<>(); List<LedStripe> list = new ArrayList<>();
JSONArray jcontrollers = response.getJSONArray("controller"); JSONObject json = new JSONObject(response.getResult().toString());
JSONArray jcontrollers = json.getJSONArray("controller");
for (int i = 0; i < jcontrollers.length(); i++) { for (int i = 0; i < jcontrollers.length(); i++) {
JSONObject row = jcontrollers.getJSONObject(i); JSONObject row = jcontrollers.getJSONObject(i);
@@ -160,7 +160,7 @@ public class LedDHelper {
JSONArray jstripes = row.getJSONArray("stripes"); JSONArray jstripes = row.getJSONArray("stripes");
for (int o = 0; o < jstripes.length(); o++) { for (int o = 0; o < jstripes.length(); o++) {
JSONObject srow = jstripes.getJSONObject(i); JSONObject srow = jstripes.getJSONObject(o);
LedStripe nStripe = new LedStripe(); LedStripe nStripe = new LedStripe();
nStripe.setId(srow.getInt("id")); nStripe.setId(srow.getInt("id"));
nStripe.setRGB(srow.getBoolean("rgb")); nStripe.setRGB(srow.getBoolean("rgb"));
@@ -178,8 +178,8 @@ public class LedDHelper {
callback.onSuccess(list); callback.onSuccess(list);
} else { } else {
if (response.has("message")) callback.onGetFailed(response.getString("message")); @SuppressWarnings("ThrowableResultOfMethodCallIgnored") JSONRPC2Error error = response.getError();
else callback.onGetFailed("unknown error"); callback.onGetFailed(error.getCode(), error.getMessage());
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@@ -194,59 +194,57 @@ public class LedDHelper {
* @param ledStripe Stripe * @param ledStripe Stripe
*/ */
public void setColor(LedStripe ledStripe) { public void setColor(LedStripe ledStripe) {
Map<String, Object> hsv = new HashMap<>();
JSONObject jnson = new JSONObject();
JSONObject hsv = new JSONObject();
try {
hsv.put("h", ledStripe.getColor().getHue()); hsv.put("h", ledStripe.getColor().getHue());
hsv.put("s", ledStripe.getColor().getSaturation()); hsv.put("s", ledStripe.getColor().getSaturation());
hsv.put("v", ledStripe.getColor().getValue()); hsv.put("v", ledStripe.getColor().getValue());
Map<String, Object> params = new HashMap<>();
params.put("sid", ledStripe.getId());
params.put("hsv", hsv);
jnson.put("action", ACTION_SETCOLOR);
jnson.put("sid", ledStripe.getId());
jnson.put("hsv", hsv);
} catch (JSONException e) { JSONRPC2Request request = new JSONRPC2Request(ACTION_SETCOLOR, params, UUID.randomUUID().toString());
e.printStackTrace();
}
addRequestToQueue(jnson, null); addRequestToQueue(request, null);
} }
/** /**
* Get color using the stripeid * Get color using the stripeid
* *
* @param ledStripe Stripe * @param ledStripe Stripe
* @throws JSONException no valid json
* @throws IOException socket error
*/ */
public void getColor(final LedStripe ledStripe, final RecieveColorCallback callback) throws JSONException, IOException { public void getColor(final LedStripe ledStripe, final RecieveColorCallback callback) {
JSONObject jnson = new JSONObject(); HashMap<String, Object> params = new HashMap<>();
params.put("sid", ledStripe.getId());
jnson.put("action", ACTION_GETCOLOR); addRequestToQueue(new JSONRPC2Request(ACTION_GETCOLOR, params, UUID.randomUUID().toString()), new AnswerTask() {
jnson.put("sid", ledStripe.getId());
addRequestToQueue(jnson, new AnswerTask() {
@Override @Override
public void onConnectionFailed(String message) { public void onConnectionFailed(String message) {
callback.onRecievFailed(message); callback.onConnectionFailed(message);
} }
@Override @Override
public void onResponse(JSONObject response) { public void onResponse(JSONRPC2Response response) {
if (response.indicatesSuccess()) {
try { try {
if (response.getBoolean("success")) { JSONObject json = new JSONObject(response.getResult().toString());
JSONArray hsv = response.getJSONArray("color"); JSONArray hsv = json.getJSONArray("color");
if (hsv.length() == 3) {
System.out.println(hsv);
ledStripe.setColor(new HSV(hsv.getDouble(0), hsv.getDouble(1), hsv.getDouble(2))); ledStripe.setColor(new HSV(hsv.getDouble(0), hsv.getDouble(1), hsv.getDouble(2)));
callback.onColorRecieved(ledStripe); callback.onColorRecieved(ledStripe);
} else { } else {
callback.onRecievFailed(response.getString("message")); callback.onRecievFailed(-1, "HSV was empty");
} }
} catch (Exception e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
callback.onRecievFailed(-1, "Unhandeled JSON Exception");
}
} else {
@SuppressWarnings("ThrowableResultOfMethodCallIgnored") JSONRPC2Error error = response.getError();
callback.onRecievFailed(error.getCode(), error.getMessage());
} }
} }
}); });
@@ -258,24 +256,22 @@ public class LedDHelper {
* @param c controller * @param c controller
* @param channel channel number * @param channel channel number
* @param value value (1= on, 0 = off) * @param value value (1= on, 0 = off)
* @throws JSONException
*/ */
public void testChannel(Controller c, int channel, int value) throws JSONException { public void testChannel(Controller c, int channel, int value) {
JSONObject jnson = new JSONObject(); HashMap<String, Object> params = new HashMap<>();
jnson.put("action", ACTION_TESTCHANNEL); params.put("cid", c.getId());
jnson.put("cid", c.getId()); params.put("channel", channel);
jnson.put("channel", channel); params.put("value", value);
jnson.put("value", value);
addRequestToQueue(jnson, new AnswerTask() { addRequestToQueue(new JSONRPC2Request(ACTION_TESTCHANNEL, params, UUID.randomUUID().toString()), new AnswerTask() {
@Override @Override
public void onConnectionFailed(String message) { public void onConnectionFailed(String message) {
} }
@Override @Override
public void onResponse(JSONObject response) { public void onResponse(JSONRPC2Response response) {
} }
}); });
@@ -283,26 +279,20 @@ public class LedDHelper {
/** /**
* Get information about an ledd daemon * Get information about an ledd daemon
*
* @throws JSONException no valid json
* @throws IOException socket error
*/ */
public void discover(final DiscoverCallback callback) throws JSONException, IOException { public void discover(final DiscoverCallback callback) {
JSONObject jnson = new JSONObject(); addRequestToQueue(new JSONRPC2Request(ACTION_DISCOVER, UUID.randomUUID().toString()), new AnswerTask() {
jnson.put("action", ACTION_DISCOVER);
addRequestToQueue(jnson, new AnswerTask() {
@Override @Override
public void onConnectionFailed(String message) { public void onConnectionFailed(String message) {
callback.onConnectionFailed(message); callback.onConnectionFailed(message);
} }
@Override @Override
public void onResponse(JSONObject response) { public void onResponse(JSONRPC2Response response) {
try { try {
if (response.getBoolean("success")) { if (response.indicatesSuccess()) {
callback.onDiscoverSuccessfully(response.getString("version")); JSONObject json = new JSONObject(response.getResult().toString());
callback.onDiscoverSuccessfully(json.getString("version"));
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@@ -313,39 +303,36 @@ public class LedDHelper {
/** /**
* Get information about an ledd daemon * Get information about an ledd daemon
*
* @throws JSONException no valid json
* @throws IOException socket error
*/ */
public void addStripe(final LedStripe ledStripe, final AddStripeCallback callback) throws JSONException, IOException { public void addStripe(final LedStripe ledStripe, final AddStripeCallback callback) {
JSONObject jnson = new JSONObject(); HashMap<String, Object> params = new HashMap<>();
HashMap<String, Object> mapping = new HashMap<>();
jnson.put("action", ACTION_ADDSTRIPES); params.put("name", ledStripe.getName());
JSONObject stripe = new JSONObject(); params.put("rgb", ledStripe.isRGB());
stripe.put("name", ledStripe.getName());
stripe.put("rgb", ledStripe.isRGB());
JSONObject mapping = new JSONObject();
mapping.put("r", ledStripe.getChannelRed()); mapping.put("r", ledStripe.getChannelRed());
mapping.put("g", ledStripe.getChannelGreen()); mapping.put("g", ledStripe.getChannelGreen());
mapping.put("b", ledStripe.getChannelBlue()); mapping.put("b", ledStripe.getChannelBlue());
stripe.put("map", mapping); params.put("map", mapping);
stripe.put("cid", ledStripe.getController().getId()); params.put("cid", ledStripe.getController().getId());
jnson.put("stripe", stripe);
addRequestToQueue(jnson, new AnswerTask() { addRequestToQueue(new JSONRPC2Request(ACTION_ADDSTRIPE, params, UUID.randomUUID().toString()), new AnswerTask() {
@Override @Override
public void onConnectionFailed(String message) { public void onConnectionFailed(String message) {
callback.onConnectionFailed(message); callback.onConnectionFailed(message);
} }
@Override @Override
public void onResponse(JSONObject response) { public void onResponse(JSONRPC2Response response) {
try { try {
if (response.getBoolean("success")) { if (response.indicatesSuccess()) {
ledStripe.setId(response.getInt("sid")); JSONObject json = new JSONObject(response.getResult().toString());
ledStripe.setId(json.getInt("sid"));
callback.onAddSuccessfully(ledStripe); callback.onAddSuccessfully(ledStripe);
} else {
@SuppressWarnings("ThrowableResultOfMethodCallIgnored") JSONRPC2Error error = response.getError();
callback.onAddFailed(error.getCode(), error.getMessage());
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@@ -354,8 +341,8 @@ public class LedDHelper {
}); });
} }
private void addRequestToQueue(JSONObject json, AnswerTask task) { private void addRequestToQueue(JSONRPC2Request request, AnswerTask task) {
dRequests.add(new LedDRequest(json, task)); if (request != null) dRequests.add(new LedDRequest(request, task));
} }
public void teardown() { public void teardown() {
@@ -389,8 +376,6 @@ public class LedDHelper {
} catch (InterruptedException ex) { } catch (InterruptedException ex) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
break; break;
} catch (JSONException e) {
e.printStackTrace();
} }
} }
} }

View File

@@ -33,9 +33,11 @@ import com.koushikdutta.async.DataEmitter;
import com.koushikdutta.async.Util; import com.koushikdutta.async.Util;
import com.koushikdutta.async.callback.ConnectCallback; import com.koushikdutta.async.callback.ConnectCallback;
import com.koushikdutta.async.callback.DataCallback; import com.koushikdutta.async.callback.DataCallback;
import com.thetransactioncompany.jsonrpc2.JSONRPC2ParseException;
import com.thetransactioncompany.jsonrpc2.JSONRPC2Request;
import com.thetransactioncompany.jsonrpc2.JSONRPC2Response;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
@@ -65,11 +67,6 @@ public class ColorService extends Service {
return mBinder; return mBinder;
} }
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
@Override @Override
public void onDestroy() { public void onDestroy() {
worker.stop(); worker.stop();
@@ -85,24 +82,24 @@ public class ColorService extends Service {
DataCallback dataCallback = new DataCallback() { DataCallback dataCallback = new DataCallback() {
@Override @Override
public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) { public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) {
JSONObject resp = null; JSONRPC2Response reqIn = null;
String dataStr = new String(bb.getAllByteArray());
if (!dataStr.isEmpty()) {
try { try {
resp = new JSONObject(new String(bb.getAllByteArray())); reqIn = JSONRPC2Response.parse(dataStr);
} catch (JSONException e) { } catch (JSONRPC2ParseException e) {
e.printStackTrace(); e.printStackTrace();
} }
}
if (resp != null) { if (reqIn != null) {
try { if (sendableHashMap.containsKey(reqIn.getID().toString())) {
if (sendableHashMap.containsKey(resp.getString("ref"))) { sendableHashMap.get(reqIn.getID().toString()).onResponse(reqIn);
sendableHashMap.get(resp.getString("ref")).onResponse(resp); sendableHashMap.remove(reqIn.getID().toString());
sendableHashMap.remove(resp.getString("ref")); if (timeoutHashMap.containsKey(reqIn.getID().toString()) && timeoutHashMap.get(reqIn.getID().toString()) != null)
if (timeoutHashMap.containsKey(resp.getString("ref")) && timeoutHashMap.get(resp.getString("ref")) != null) timeoutHashMap.get(reqIn.getID().toString()).cancel(false);
timeoutHashMap.get(resp.getString("ref")).cancel(false); timeoutHashMap.remove(reqIn.getID().toString());
timeoutHashMap.remove(resp.getString("ref"));
}
} catch (JSONException e) {
e.printStackTrace();
} }
} }
} }
@@ -122,36 +119,46 @@ public class ColorService extends Service {
final T item = workQueue.take(); final T item = workQueue.take();
if (item instanceof Sendable) { if (item instanceof Sendable) {
if (socketHashMap.containsKey(((Sendable) item).getRecipient()) && socketHashMap.get(((Sendable) item).getRecipient()) final Sendable sendable = (Sendable) item;
.getServer().isRunning()) { if (socketHashMap.containsKey(sendable.getRecipient())) {
if (socketHashMap.get(sendable.getRecipient()) == null) {
// if server is not running yet, readd item to queue
workQueue.add(item);
continue;
} else if (!socketHashMap.get(sendable.getRecipient()).getServer().isRunning()) {
// connection probably closed or was interrupted -> reconnect
socketHashMap.remove(sendable.getRecipient());
workQueue.add(item);
continue;
}
Util.writeAll(socketHashMap.get(((Sendable) item).getRecipient()), (((Sendable) item).getMessage().toString() + "\n") Util.writeAll(socketHashMap.get(sendable.getRecipient()), (sendable.getRequest().toString() + "\n").getBytes("UTF-8"),
.getBytes null);
("UTF-8"), null); sendableHashMap.put((String) sendable.getRequest().getID(), sendable);
sendableHashMap.put(((Sendable) item).getRef(), (Sendable) item);
if (!poolExecutor.isTerminating() && !poolExecutor.isTerminated()) if (!poolExecutor.isTerminating() && !poolExecutor.isTerminated())
timeoutHashMap.put(((Sendable) item).getRef(), poolExecutor.schedule(new Runnable() { timeoutHashMap.put((String) sendable.getRequest().getID(), poolExecutor.schedule(new Runnable() {
@Override @Override
public void run() { public void run() {
((Sendable) item).onNoResponse(); sendable.onNoResponse();
timeoutHashMap.remove(((Sendable) item).getRef()); timeoutHashMap.remove(sendable.getRequest().getID());
sendableHashMap.remove(((Sendable) item).getRef()); sendableHashMap.remove(sendable.getRequest().getID());
} }
}, 1000, TimeUnit.MILLISECONDS)); }, 1000, TimeUnit.MILLISECONDS));
} else { } else {
AsyncServer.getDefault().connectSocket(new InetSocketAddress(((Sendable) item).getRecipient().getAddress(), ((Sendable) socketHashMap.put(sendable.getRecipient(), null);
item).getRecipient().getPort()), new ConnectCallback() { AsyncServer.getDefault().connectSocket(new InetSocketAddress(sendable.getRecipient().getAddress(), sendable
.getRecipient().getPort()), new ConnectCallback() {
@Override @Override
public void onConnectCompleted(Exception ex, final AsyncSocket socket) { public void onConnectCompleted(Exception ex, final AsyncSocket socket) {
if (ex == null) { if (ex == null) {
socket.setDataCallback(dataCallback); socket.setDataCallback(dataCallback);
socketHashMap.put(((Sendable) item).getRecipient(), socket); socketHashMap.put(sendable.getRecipient(), socket);
//if (!workQueue.contains(item)) -> needs equals implementaion //if (!workQueue.contains(item)) -> needs equals implementation
workQueue.add(item); workQueue.add(item);
} else { } else {
((Sendable) item).onConnectionFailed(ex.getMessage()); sendable.onConnectionFailed(ex.getMessage());
} }
} }
}); });
@@ -172,10 +179,16 @@ public class ColorService extends Service {
} }
public class ColorBinder extends Binder { public class ColorBinder extends Binder {
public String queueSend(LedDDaemon rec, JSONObject msg, AnswerTask answerTask) throws JSONException { public void queueSend(LedDDaemon rec, JSONRPC2Request request, AnswerTask answerTask) {
Sendable sendable = new Sendable(msg, answerTask, rec); Sendable sendable = null;
try {
sendable = new Sendable(request, answerTask, rec);
} catch (JSONException e) {
e.printStackTrace();
}
if (sendable != null) {
queue.add(sendable); queue.add(sendable);
return sendable.getRef(); }
} }
} }
} }

View File

@@ -0,0 +1,146 @@
package com.idlegandalf.ledd.utils;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.opengl.GLES30;
import android.util.Log;
import java.nio.IntBuffer;
public class GraphicUtils {
int fmt;
int w;
int h;
int nBytes;
int[] PBOs;
int numDownloads = 0;
int numPBOs = 0;
int dx = 0;
IntBuffer pixelBuf;
public GraphicUtils(int fmt, int w, int h, int xbuff) {
if (PBOs != null) {
Log.w("LedD", "Already initialized. Not necessary to initialize again; or shutdown first.");
return;
}
if (xbuff < 1 || xbuff > 10) {
Log.w("LedD", "Invalid number of buffers: more then 10 or less then 1 buffer");
return;
}
this.fmt = fmt;
this.w = w;
this.h = h;
this.numPBOs = xbuff;
if (fmt == GLES30.GL_RED || fmt == GLES30.GL_GREEN || fmt == GLES30.GL_BLUE) {
this.nBytes = w * h;
} else if (fmt == GLES30.GL_RGB) {
this.nBytes = w * h * 3;
} else if (fmt == GLES30.GL_RGBA) {
this.nBytes = w * h * 4;
} else {
Log.w("LedD", "Unhandled pixel format, use GL_R, GL_RG, GL_RGB or GL_RGBA.");
}
if (this.nBytes == 0) {
Log.w("LedD", String.format("Invalid width or height given: %d x %d", w, h));
return;
}
PBOs = new int[xbuff];
pixelBuf = IntBuffer.allocate(nBytes);
GLES30.glGenBuffers(xbuff, PBOs, 0);
for (int i = 0; i < xbuff; i++) {
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, PBOs[i]);
GLES30.glBufferData(GLES30.GL_PIXEL_PACK_BUFFER, nBytes, null, GLES30.GL_STREAM_READ);
}
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, 0);
}
public void download() {
long curNanos = System.nanoTime();
if (numDownloads < numPBOs) {
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, PBOs[dx]);
GLES30.glReadPixels(0, 0, w, h, fmt, GLES30.GL_UNSIGNED_BYTE, null);
Log.d("LedD", String.format("glReadPixels() with pbo: %d", PBOs[dx]));
} else {
Log.d("LedD", String.format("glMapBuffer() with pbo: %d", PBOs[dx]));
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, PBOs[dx]);
GLES30.glBufferData(GLES30.GL_PIXEL_PACK_BUFFER, nBytes, pixelBuf, GLES30.GL_STATIC_READ);
GLES30.glReadPixels(0, 0, w, h, fmt, GLES30.GL_UNSIGNED_BYTE, null);
}
dx++;
dx = dx % numPBOs;
numDownloads++;
if (numDownloads == Integer.MAX_VALUE) {
numDownloads = 0;
}
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, 0);
Log.d("LedD", String.format("Download took: %f ms.", ((double) System.nanoTime() - curNanos) / 1000000.0));
}
public Bitmap getCurBufferBitmap() {
int[] b = pixelBuf.array();
int[] bt = new int[w * h];
for (int i = 0; i < h; i++) {
//remember, that OpenGL bitmap is incompatible with Android bitmap
//and so, some correction need.
for (int j = 0; j < w; j++) {
int pix = b[i * w + j];
int pb = (pix >> 16) & 0xff;
int pr = (pix << 16) & 0x00ff0000;
int pix1 = (pix & 0xff00ff00) | pr | pb;
bt[(h - i - 1) * w + j] = pix1;
}
}
Bitmap.Config bconfig = Bitmap.Config.RGB_565;
return Bitmap.createBitmap(bt, w, h, bconfig);
}
public int getAvgBitmapBufferColor() {
download();
Bitmap bitmap = getCurBufferBitmap();
int redBucket = 0;
int greenBucket = 0;
int blueBucket = 0;
int alphaBucket = 0;
boolean hasAlpha = bitmap.hasAlpha();
int pixelCount = bitmap.getWidth() * bitmap.getHeight();
int[] pixels = new int[pixelCount];
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
for (int y = 0, h = bitmap.getHeight(); y < h; y++) {
for (int x = 0, w = bitmap.getWidth(); x < w; x++) {
int color = pixels[x + y * w]; // x + y * width
redBucket += (color >> 16) & 0xFF; // Color.red
greenBucket += (color >> 8) & 0xFF; // Color.greed
blueBucket += (color & 0xFF); // Color.blue
if (hasAlpha) alphaBucket += (color >>> 24); // Color.alpha
}
}
return Color.argb(
(hasAlpha) ? (alphaBucket / pixelCount) : 255,
redBucket / pixelCount,
greenBucket / pixelCount,
blueBucket / pixelCount);
}
}

View File

@@ -0,0 +1,51 @@
/*
* LEDD Project
* Copyright (C) 2015 LEDD Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.idlegandalf.ledd.utils;
public class RateLimiter {
private double rate;
private double per;
private double allowance;
private long last_check;
public RateLimiter(double rate, double per) {
this.rate = rate;
this.per = per;
this.allowance = rate;
this.last_check = System.currentTimeMillis();
}
public boolean check() {
long current = System.currentTimeMillis();
long time_passed = current - last_check;
last_check = current;
allowance += time_passed * (rate / per);
if (allowance > rate) {
allowance = rate; // throttle
}
if (allowance < 1.0) {
return false;
} else {
allowance -= 1.0;
return true;
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 953 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 517 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 167 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 963 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 269 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 432 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 511 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 402 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 522 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 573 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 624 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 665 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 551 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 B

View File

@@ -1,23 +0,0 @@
<!--
~ LEDD Project
~ Copyright (C) 2015 LEDD Team
~
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<FrameLayout
android:id="@+id/fragmentContainer"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" />

View File

@@ -16,52 +16,58 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>. ~ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<!-- The main content view --> <!-- The main content view -->
<LinearLayout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_layout"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:orientation="vertical"> android:orientation="vertical">
<android.support.v7.widget.Toolbar <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar" android:id="@+id/toolbar"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?attr/colorPrimary" android:background="?attr/colorPrimary"
android:minHeight="?android:attr/actionBarSize"/> android:minHeight="?android:attr/actionBarSize"
app:titleTextColor="@android:color/black">
</android.support.v7.widget.Toolbar>
<com.larswerkman.holocolorpicker.ColorPicker <com.larswerkman.holocolorpicker.ColorPicker
android:id="@+id/picker" android:id="@+id/picker"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginTop="25dp"/> android:layout_marginTop="25dp"
app:color_center_radius="100dp"
app:color_pointer_halo_radius="13dp"
app:color_pointer_radius="12dp"
app:color_wheel_radius="180dp"
app:color_wheel_thickness="20dp" />
<com.larswerkman.holocolorpicker.SVBar <com.larswerkman.holocolorpicker.SaturationBar
android:id="@+id/svbar" android:id="@+id/saturationbar"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="25dp"/> android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="15dp"
app:bar_pointer_halo_radius="11dp"
app:bar_pointer_radius="10dp"
app:bar_thickness="15dp" />
<com.larswerkman.holocolorpicker.ValueBar
android:id="@+id/valuebar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
app:bar_pointer_halo_radius="11dp"
app:bar_pointer_radius="10dp"
app:bar_thickness="15dp" />
</LinearLayout> </LinearLayout>
<!-- The navigation drawer -->
<android.support.design.widget.NavigationView
android:id="@+id/drawer"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/navigation_header"
app:menu="@menu/navigation_drawer"/>
</android.support.v4.widget.DrawerLayout>

View File

@@ -46,7 +46,7 @@
android:layout_marginLeft="7dp" android:layout_marginLeft="7dp"
android:layout_toRightOf="@id/img_host" android:layout_toRightOf="@id/img_host"
android:gravity="center" android:gravity="center"
android:text="Add Controller" android:text="@string/text_add_controller"
android:textAppearance="?android:textAppearanceMedium" android:textAppearance="?android:textAppearanceMedium"
/> />
</RelativeLayout> </RelativeLayout>
@@ -62,7 +62,7 @@
android:id="@+id/input_i2c" android:id="@+id/input_i2c"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:hint="i2c device number" android:hint="@string/hint_i2c_device"
android:inputType="number" android:inputType="number"
android:minWidth="350dp"/> android:minWidth="350dp"/>
@@ -79,7 +79,7 @@
android:id="@+id/input_address" android:id="@+id/input_address"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:hint="controller address in hex format" android:hint="@string/hint_controller_address"
android:minWidth="350dp"/> android:minWidth="350dp"/>
</android.support.design.widget.TextInputLayout> </android.support.design.widget.TextInputLayout>
@@ -95,7 +95,7 @@
android:id="@+id/input_channel" android:id="@+id/input_channel"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:hint="channels" android:hint="@string/hint_channels"
android:inputType="number" android:inputType="number"
android:minWidth="350dp"/> android:minWidth="350dp"/>

View File

@@ -46,7 +46,7 @@
android:layout_marginLeft="7dp" android:layout_marginLeft="7dp"
android:layout_toRightOf="@id/img_host" android:layout_toRightOf="@id/img_host"
android:gravity="center" android:gravity="center"
android:text="Choose Daemon" android:text="@string/text_choose_daemon"
android:textAppearance="?android:textAppearanceMedium" android:textAppearance="?android:textAppearanceMedium"
/> />
@@ -80,7 +80,7 @@
android:layout_marginBottom="5dp" android:layout_marginBottom="5dp"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:text="or" android:text="@string/text_or"
android:textAppearance="?android:textAppearanceMedium"/> android:textAppearance="?android:textAppearanceMedium"/>
<android.support.design.widget.TextInputLayout <android.support.design.widget.TextInputLayout
@@ -93,7 +93,7 @@
android:id="@+id/input_ip" android:id="@+id/input_ip"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:hint="ip address[:port]" android:hint="@string/hint_daemon_ip_port"
android:minWidth="250dp"/> android:minWidth="250dp"/>
</android.support.design.widget.TextInputLayout> </android.support.design.widget.TextInputLayout>

View File

@@ -46,7 +46,7 @@
android:layout_marginLeft="7dp" android:layout_marginLeft="7dp"
android:layout_toRightOf="@id/img_host" android:layout_toRightOf="@id/img_host"
android:gravity="center" android:gravity="center"
android:text="Choose Daemon" android:text="@string/text_choose_daemon"
android:textAppearance="?android:textAppearanceSmall" android:textAppearance="?android:textAppearanceSmall"
/> />
@@ -99,7 +99,7 @@
android:layout_marginLeft="7dp" android:layout_marginLeft="7dp"
android:layout_toRightOf="@id/img_controller" android:layout_toRightOf="@id/img_controller"
android:gravity="center" android:gravity="center"
android:text="Choose Controller" android:text="@string/text_choose_controller"
android:textAppearance="?android:textAppearanceSmall" android:textAppearance="?android:textAppearanceSmall"
/> />
@@ -151,7 +151,7 @@
android:layout_marginLeft="7dp" android:layout_marginLeft="7dp"
android:layout_toRightOf="@id/img_stripe" android:layout_toRightOf="@id/img_stripe"
android:gravity="center" android:gravity="center"
android:text="Stripe Properties" android:text="@string/text_stripe_properties"
android:textAppearance="?android:textAppearanceSmall" android:textAppearance="?android:textAppearanceSmall"
/> />
@@ -169,7 +169,7 @@
android:id="@+id/input_stripe_name" android:id="@+id/input_stripe_name"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:hint="Stripe name" android:hint="@string/hint_stripe_name"
android:inputType="text" android:inputType="text"
android:minEms="12"/> android:minEms="12"/>
</android.support.design.widget.TextInputLayout> </android.support.design.widget.TextInputLayout>
@@ -180,7 +180,7 @@
android:layout_marginLeft="9dp" android:layout_marginLeft="9dp"
android:layout_marginTop="15dp" android:layout_marginTop="15dp"
android:gravity="center" android:gravity="center"
android:text="Channel Mapping" android:text="@string/text_channel_mapping"
android:textAppearance="?android:textAppearanceSmall" android:textAppearance="?android:textAppearanceSmall"
/> />
@@ -206,7 +206,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ems="2" android:ems="2"
android:hint="R" android:hint="@string/hint_channel_r"
android:inputType="number"/> android:inputType="number"/>
</android.support.design.widget.TextInputLayout> </android.support.design.widget.TextInputLayout>
@@ -231,7 +231,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ems="2" android:ems="2"
android:hint="G" android:hint="@string/hint_channel_g"
android:inputType="number"/> android:inputType="number"/>
</android.support.design.widget.TextInputLayout> </android.support.design.widget.TextInputLayout>
@@ -256,7 +256,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ems="2" android:ems="2"
android:hint="B" android:hint="@string/hint_channel_b"
android:inputType="number"/> android:inputType="number"/>
</android.support.design.widget.TextInputLayout> </android.support.design.widget.TextInputLayout>

View File

@@ -41,7 +41,7 @@
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
android:clickable="true" android:clickable="true"
android:gravity="center_vertical" android:gravity="center_vertical"
android:text="textHost" android:text=""
android:textAppearance="?android:textAppearanceMedium" android:textAppearance="?android:textAppearanceMedium"
android:textColor="@color/primaryColorDark"/> android:textColor="@color/primaryColorDark"/>

View File

@@ -17,19 +17,70 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>. ~ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="192dp" android:layout_height="192dp"
android:background="?attr/colorPrimaryDark" android:background="?attr/colorPrimaryDark"
android:gravity="bottom" android:gravity="bottom"
android:orientation="vertical"
android:padding="16dp" android:padding="16dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark"> android:theme="@style/ThemeOverlay.AppCompat.Dark">
<TextView <TextView
android:id="@+id/nvh_name"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="-- stripes infos go here --" android:layout_marginTop="15dp"
android:text="Name"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textSize="19sp"/>
<TextView
android:id="@+id/nvh_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/nvh_name"
android:layout_marginTop="15dp"
android:text="type"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"/> android:textAppearance="@style/TextAppearance.AppCompat.Body1"/>
</LinearLayout> <TextView
android:id="@+id/nvh_mapping"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/nvh_type"
android:layout_marginTop="5dp"
android:text="mapping"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"/>
<TextView
android:id="@+id/nvh_hex_color"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/nvh_mapping"
android:layout_marginTop="5dp"
android:text="#hex"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"/>
<ImageButton
android:id="@+id/nhv_delete"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:scaleType="center"
android:src="@drawable/ic_clear_white_48dp"/>
<ImageButton
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignParentBottom="true"
android:layout_marginRight="15dp"
android:layout_toLeftOf="@id/nhv_delete"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:scaleType="center"
android:src="@drawable/ic_mode_edit_white_24dp"/>
</RelativeLayout>

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ LEDD Project
~ Copyright (C) 2015 LEDD Team
~
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ProgressBar
android:id="@+id/activity_bar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="-8dp" />
<FrameLayout
android:id="@+id/activity_frame"
android:layout_width="match_parent"
android:layout_height="fill_parent" />
</LinearLayout>

View File

@@ -17,6 +17,4 @@
--> -->
<menu> <menu>
</menu> </menu>

View File

@@ -1,35 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ LEDD Project
~ Copyright (C) 2015 LEDD Team
~
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/nv_add_stripe"
android:icon="@drawable/ic_add_circle_black_48dp"
android:orderInCategory="51"
android:title="Add Stripe"/>
<item
android:id="@+id/nv_settings"
android:icon="@drawable/ic_tune_black_48dp"
android:orderInCategory="52"
android:title="Settings"/>
</menu>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Some files were not shown because too many files have changed in this diff Show More