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 {
mavenCentral()
jcenter()
flatDir {
dirs 'libs'
}
}
dependencies {
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 {
compileSdkVersion 23
buildToolsVersion '23.0.1'
buildToolsVersion '23.0.2'
lintOptions {
abortOnError false
}
defaultConfig {
applicationId "com.idlegandalf.ledd"
minSdkVersion 17
minSdkVersion 18
targetSdkVersion 23
versionCode 1
versionName "1.0"
versionCode 3
versionName "1.0.3"
}
buildTypes {
release {
zipAlignEnabled true
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
zipAlignEnabled true
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:support-v4:23.0.1'
compile 'com.squareup.okhttp:okhttp:2.5.0'
compile 'com.google.code.gson:gson:2.3.1'
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:support-v4:23.2.1'
compile 'com.squareup.okhttp:okhttp:2.7.5'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.koushikdutta.async:androidasync:2.1.6'
compile 'com.android.support:design:23.0.1'
compile 'com.larswerkman:HoloColorPicker:1.5'
compile 'com.google.guava:guava:19.0-rc1'
provided 'org.projectlombok:lombok:1.16.6'
compile 'com.koushikdutta.async:androidasync:2.1.7'
compile 'com.android.support:design:23.2.1'
compile 'com.larswerkman:HoloColorPicker:1.5@aar'
compile 'com.google.guava:guava:19.0'
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.ACCESS_NETWORK_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
android:name=".ColorApplication"
android:allowBackup="true"
android:fullBackupContent="false"
android:icon="@drawable/ic_launcher"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity

View File

@@ -22,23 +22,20 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.preference.PreferenceManager;
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.widget.Toolbar;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import com.idlegandalf.ledd.callbacks.RecieveColorCallback;
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.fragments.AddStripeDialog;
import com.idlegandalf.ledd.helper.LedDHelper;
import com.idlegandalf.ledd.utils.RateLimiter;
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.io.IOException;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind;
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)
DrawerLayout mDrawerLayout;
@Bind(R.id.main_layout)
LinearLayout scrollView;
@Bind(R.id.toolbar)
Toolbar toolbar;
@Bind(R.id.drawer)
NavigationView navigationView;
@Bind(R.id.picker)
ColorPicker colorPicker;
@Bind(R.id.svbar)
SVBar svBar;
private ActionBarDrawerToggle mDrawerToggle;
@Bind(R.id.saturationbar)
SaturationBar saturationBar;
@Bind(R.id.valuebar)
ValueBar valueBar;
Drawer mDrawer;
private List<IDrawerItem> mDaemons;
private refreshDaemonsListener daemonsListener;
private List<LedStripe> ledStripes;
private LedStripe mCurrentStripe;
private LedDHelper mCurrentHelper;
private boolean fromOnCreate = true;
private boolean autoColorSet = false;
private RateLimiter limiter;
private boolean isRefreshRunning = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -85,49 +95,49 @@ public class ColorActivity extends AppCompatActivity implements NavigationView.O
// check for connectivity
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo == null || !networkInfo.isConnected()) {
// TODO: Display error (snackbar)
if (networkInfo == null || !networkInfo.isConnected() || networkInfo.getType() != ConnectivityManager.TYPE_WIFI) {
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.setOnColorChangedListener(new ColorPicker.OnColorChangedListener() {
@Override
public void onColorChanged(int i) {
if (mCurrentStripe != null && mCurrentHelper != null) {
float[] hsv = new float[3];
Color.colorToHSV(i, hsv);
mCurrentStripe.setColor(new HSV(hsv[0], hsv[1], hsv[2]));
mCurrentHelper.setColor(mCurrentStripe);
if (mCurrentStripe != null && limiter.check() && !autoColorSet) {
mCurrentStripe.setColor(i);
}
}
});
navigationView.setNavigationItemSelectedListener(this);
setSupportActionBar(toolbar);
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
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
mDrawer.getActionBarDrawerToggle().setDrawerIndicatorEnabled(true);
}
daemonsListener = new refreshDaemonsListener();
@@ -142,39 +152,54 @@ public class ColorActivity extends AppCompatActivity implements NavigationView.O
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
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);
}
@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
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
if (mDrawerLayout.isDrawerOpen(Gravity.LEFT)) {
mDrawerLayout.closeDrawer(Gravity.LEFT);
if (mDrawer.isDrawerOpen()) {
mDrawer.closeDrawer();
} else {
mDrawerLayout.openDrawer(Gravity.LEFT);
mDrawer.openDrawer();
}
return true;
@@ -187,6 +212,9 @@ public class ColorActivity extends AppCompatActivity implements NavigationView.O
super.onPause();
ColorApplication.getInstance().teardown();
unregisterReceiver(daemonsListener);
if (mCurrentStripe != null)
PreferenceManager.getDefaultSharedPreferences(this).edit().putInt("lastStripe", mCurrentStripe.getId()).commit();
}
@Override
@@ -198,142 +226,204 @@ public class ColorActivity extends AppCompatActivity implements NavigationView.O
@Override
protected void onResume() {
super.onResume();
ColorApplication.getInstance().onResume();
registerReceiver(daemonsListener, new IntentFilter(ColorApplication.INTENT_ACTION_REFRESH));
try {
if (!fromOnCreate) {
ColorApplication.getInstance().onResume();
registerReceiver(daemonsListener, new IntentFilter(ColorApplication.INTENT_ACTION_REFRESH));
refreshStripes();
} catch (IOException e) {
e.printStackTrace();
} else {
fromOnCreate = false;
}
}
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
int id = menuItem.getItemId();
public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
if (drawerItem.isSelectable()) {
switch (id) {
case R.id.nv_add_stripe:
new AddStripeDialog().show(getFragmentManager(), "");
return true;
case R.id.nv_settings:
return true;
}
if (drawerItem.getTag() instanceof String) {
String tag = (String) drawerItem.getTag();
for (LedStripe stripe : ledStripes) {
if (stripe.getName().equals(menuItem.getTitle())) {
mCurrentStripe = stripe;
try {
mCurrentHelper = ColorApplication.getInstance().getHelperForDaemon(stripe.getLedDDaemon());
} catch (IOException e) {
e.printStackTrace();
if (tag.equals("add_stripe")) {
new AddStripeDialog().show(getFragmentManager(), "");
return true;
} else if (tag.equals("settings")) {
return true;
}
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()}));
}
});
}
if (drawerItem.getTag() instanceof Integer) {
int tag = (int) drawerItem.getTag();
@Override
public void onRecievFailed(String msg) {
}
@Override
public void onConnectionFailed(String message) {
}
});
} catch (JSONException | IOException e) {
e.printStackTrace();
for (LedStripe stripe : ledStripes) {
if (tag == stripe.getId()) {
selectStripe(stripe);
return true;
}
}
return true;
}
}
return false;
}
public void refreshStripes() throws IOException {
reCreateNavigationView(); // need to recreate the navigationview since we can't remove a once added submenu
final Menu nvMenu = navigationView.getMenu();
final int stripeGroup = 42;
public void refreshStripes() {
if (isRefreshRunning)
return;
isRefreshRunning = true;
int i = 1;
for (final LedDDaemon dDaemon : ColorApplication.getInstance().getDaemons()) {
LedDHelper helper = ColorApplication.getInstance().getHelperForDaemon(dDaemon);
if (helper != null) {
try {
final int finalI = i;
helper.getStripes(new StripesCallback() {
@Override
public void onSuccess(final List<LedStripe> stripes) {
runOnUiThread(new Runnable() {
@Override
public void run() {
SubMenu nDaemonMenu = nvMenu.addSubMenu(Menu.NONE, Menu.NONE, finalI, dDaemon.toString());
nDaemonMenu.setGroupCheckable(stripeGroup, true, true);
ledStripes = stripes;
Snackbar.make(findViewById(android.R.id.content), "LED stripes reloaded", Snackbar.LENGTH_LONG).show();
for (LedStripe stripe : ledStripes) {
MenuItem sItem = nDaemonMenu.add(stripeGroup, View.generateViewId(), stripe.getId(), stripe.getName());
sItem.setIcon(R.drawable.ic_wb_iridescent_black_48dp);
final int finalI = i;
helper.getStripes(new StripesCallback() {
@Override
public void onSuccess(List<LedStripe> stripes) {
ledStripes = stripes;
runOnUiThread(new Runnable() {
@Override
public void run() {
PrimaryDrawerItem nDaemonMenu = null;
long selectedItemId = -1;
for (IDrawerItem drawerItem : mDaemons) {
if (((PrimaryDrawerItem) drawerItem).getName().getText().equals(dDaemon.toString())) {
nDaemonMenu = (PrimaryDrawerItem) drawerItem;
break;
}
}
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
public void onColorRecieved(LedStripe stripe) {
if (stripe.isOn()) {
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(String message) {
Snackbar.make(findViewById(android.R.id.content), "Coudn't get stripes from daemon: " + message, Snackbar.LENGTH_LONG)
.show();
@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
public void onConnectionFailed(String message) {
Snackbar.make(findViewById(android.R.id.content), getString(R.string.snackbar_connection_failed) + message, Snackbar
.LENGTH_LONG).show();
}
});
@Override
public void onConnectionFailed(String message) {
Snackbar.make(findViewById(android.R.id.content), "Coudn't connect to daemon: " + message, Snackbar.LENGTH_LONG).show();
}
});
} catch (JSONException | IOException e) {
e.printStackTrace();
}
}
i++;
}
isRefreshRunning = false;
}
private void reCreateNavigationView() {
runOnUiThread(new Runnable() {
@DebugLog
private void selectStripe(LedStripe stripe) {
mCurrentStripe = stripe;
toolbar.setTitle(stripe.getName());
autoColorSet = true;
mDrawer.closeDrawer();
mCurrentStripe.getColor(new RecieveColorCallback() {
@Override
public void run() {
mDrawerLayout.removeView(navigationView);
navigationView = new NavigationView(ColorActivity.this);
DrawerLayout.LayoutParams params = new DrawerLayout.LayoutParams(DrawerLayout.LayoutParams.WRAP_CONTENT, DrawerLayout.LayoutParams
.MATCH_PARENT);
params.gravity = Gravity.START;
navigationView.setLayoutParams(params);
navigationView.inflateMenu(R.menu.navigation_drawer);
navigationView.inflateHeaderView(R.layout.navigation_header);
mDrawerLayout.addView(navigationView, params);
navigationView.setNavigationItemSelectedListener(ColorActivity.this);
mDrawerToggle.syncState();
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() {
@Override
public void run() {
colorPicker.setColor(color);
autoColorSet = false;
if (stripe.isOn()) {
IDrawerItem fItem = findItemForStripe(stripe);
if (fItem != null)
((SecondarySwitchDrawerItem) fItem).withSwitchEnabled(true);
}
}
});
}
@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
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ColorApplication.INTENT_ACTION_REFRESH)) {
try {
refreshStripes();
} catch (IOException e) {
e.printStackTrace();
}
refreshStripes();
}
}
}
@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.helper.LedDHelper;
import org.json.JSONException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -50,34 +47,28 @@ public class ColorApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
singleton = this;
singleton = this;
ledDHelpers = new HashMap<>();
this.onResume();
}
public LedDHelper getHelperForDaemon(final LedDDaemon ledDDaemon) throws IOException {
public LedDHelper getHelperForDaemon(final LedDDaemon ledDDaemon) {
if (ledDHelpers.containsKey(ledDDaemon) && ledDHelpers.get(ledDDaemon) != null) {
return ledDHelpers.get(ledDDaemon);
} else {
final LedDHelper dHelper = new LedDHelper(ledDDaemon, getApplicationContext());
try {
dHelper.discover(new DiscoverCallback() {
@Override
public void onConnectionFailed(String message) {
}
@Override
public void onDiscoverSuccessfully(String version) {
ledDHelpers.put(ledDDaemon, dHelper);
}
});
} catch (JSONException e) {
e.printStackTrace();
}
dHelper.discover(new DiscoverCallback() {
@Override
public void onConnectionFailed(String message) {
}
@Override
public void onDiscoverSuccessfully(String version) {
ledDHelpers.put(ledDDaemon, dHelper);
}
});
return dHelper;
}
}
@@ -103,37 +94,31 @@ public class ColorApplication extends Application {
TypeToken<Set<LedDDaemon>>() {
}.getType());
Log.i(ColorApplication.TAG, "Loaded " + ledDDaemons.size() + " Daemons from preferences");
for (final LedDDaemon ledDDaemon : ledDDaemons) {
try {
final LedDHelper helper = new LedDHelper(ledDDaemon, getApplicationContext());
final LedDHelper helper = new LedDHelper(ledDDaemon, getApplicationContext());
helper.discover(new DiscoverCallback() {
@Override
public void onDiscoverSuccessfully(String version) {
//ledDDaemon.setActive(true);
ledDHelpers.put(ledDDaemon, helper);
helper.discover(new DiscoverCallback() {
@Override
public void onDiscoverSuccessfully(String version) {
//ledDDaemon.setActive(true);
ledDHelpers.put(ledDDaemon, helper);
Intent i = new Intent(INTENT_ACTION_REFRESH);
sendBroadcast(i);
}
Intent i = new Intent(INTENT_ACTION_REFRESH);
sendBroadcast(i);
}
@Override
public void onConnectionFailed(String message) {
//ledDDaemon.setActive(false);
ledDHelpers.put(ledDDaemon, helper);
@Override
public void onConnectionFailed(String message) {
//ledDDaemon.setActive(false);
ledDHelpers.put(ledDDaemon, helper);
Intent i = new Intent(INTENT_ACTION_REFRESH);
sendBroadcast(i);
}
});
} catch (IOException | JSONException e) {
e.printStackTrace();
}
Intent i = new Intent(INTENT_ACTION_REFRESH);
sendBroadcast(i);
}
});
}
}
Log.i(ColorApplication.TAG, "Loaded " + ledDHelpers.size() + " Daemons from preferences");
}
}

View File

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

View File

@@ -28,6 +28,6 @@ public interface AddControllerCallback extends BaseCallback {
*/
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 {
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 {
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 {
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;
import org.json.JSONObject;
import com.thetransactioncompany.jsonrpc2.JSONRPC2Response;
public abstract class AnswerTask {
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;
import org.json.JSONObject;
import com.thetransactioncompany.jsonrpc2.JSONRPC2Request;
import lombok.Getter;
@Getter
public class LedDRequest {
JSONObject request;
JSONRPC2Request request;
AnswerTask task;
public LedDRequest(JSONObject request, AnswerTask task) {
public LedDRequest(JSONRPC2Request request, AnswerTask task) {
this.request = request;
this.task = task;
}

View File

@@ -18,6 +18,13 @@
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.Setter;
@@ -34,6 +41,7 @@ public class LedStripe {
boolean RGB;
Controller controller;
LedDDaemon ledDDaemon;
LedDHelper helper;
public LedStripe() {
this(-1, -1, -1, -1, "");
@@ -55,4 +63,41 @@ public class LedStripe {
this.name = name;
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;
import org.json.JSONException;
import org.json.JSONObject;
import com.thetransactioncompany.jsonrpc2.JSONRPC2Request;
import com.thetransactioncompany.jsonrpc2.JSONRPC2Response;
import java.util.UUID;
import org.json.JSONException;
import lombok.Getter;
@Getter
public class Sendable {
LedDDaemon recipient;
JSONObject message;
String ref;
JSONRPC2Request request;
AnswerTask onAnswer;
public Sendable(JSONObject msg, AnswerTask task, LedDDaemon ledDDaemon) throws JSONException {
this(msg, UUID.randomUUID().toString(), task, ledDDaemon);
}
public Sendable(JSONObject msg, String ref, AnswerTask task, LedDDaemon recipient) throws JSONException {
this.message = msg;
this.ref = ref;
this.message.put("ref", ref);
public Sendable(JSONRPC2Request request, AnswerTask task, LedDDaemon recipient) throws JSONException {
this.request = request;
this.onAnswer = task;
this.recipient = recipient;
}
public void onResponse(JSONObject object) {
public void onResponse(JSONRPC2Response object) {
if (onAnswer != null) {
onAnswer.onResponse(object);
}
@@ -55,6 +48,8 @@ public class Sendable {
}
public void onConnectionFailed(String message) {
onAnswer.onConnectionFailed(message);
if (onAnswer != null) {
onAnswer.onConnectionFailed(message);
}
}
}

View File

@@ -21,9 +21,6 @@ package com.idlegandalf.ledd.components;
import com.idlegandalf.ledd.helper.LedDHelper;
import org.json.JSONException;
import java.io.IOException;
import java.util.ArrayList;
public class StripeGroup {
@@ -60,7 +57,7 @@ public class StripeGroup {
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++) {
//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.helper.LedDHelper;
import org.json.JSONException;
import java.io.IOException;
import java.text.NumberFormat;
import java.text.ParsePosition;
@@ -64,6 +61,13 @@ public class AddControllerDialog extends DialogFragment implements DialogInterfa
EditText channelText;
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) {
View v = View.inflate(getActivity(), R.layout.fragment_addcontroller, null);
ButterKnife.bind(this, v);
@@ -168,216 +172,49 @@ public class AddControllerDialog extends DialogFragment implements DialogInterfa
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();
}
LedDHelper helper = ColorApplication.getInstance().getHelperForDaemon(dDaemon);
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();
}
});
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), String.format(getActivity().getString(R.string.snachbar_added_controller), controller.getId()), Snackbar.LENGTH_LONG).show();
}
});
dDaemon.getControllers().add(controller);
dismiss();
}
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 onAddFailed(final int code, final String msg) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0), getActivity().getString(R.string.snackbar_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();
}
@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), String.format(getActivity().getString(R.string.snackbar_daemon_connection_failed), dDaemon, message), Snackbar.LENGTH_LONG).show();
}
});
AddStripeDialog.instance.onResume();
dismiss();
}
});
}
}
});
}
@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.components.LedDDaemon;
import org.json.JSONException;
import java.io.IOException;
import java.net.Inet4Address;
import java.util.ArrayList;
import java.util.List;
@@ -286,44 +283,33 @@ public class AddDaemonDialog extends DialogFragment implements DialogInterface.O
}
private void addDaemon(final LedDDaemon ledDDaemon) {
try {
ColorApplication.getInstance().getHelperForDaemon(ledDDaemon).discover(new DiscoverCallback() {
@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 " + ledDDaemon + ": " + message, Snackbar.LENGTH_LONG).show();
}
});
AddStripeDialog stripeAdd = (AddStripeDialog) getFragmentManager().findFragmentByTag("stripeAdd");
AddStripeDialog.instance.onResume();
dismiss();
}
@Override
public void onDiscoverSuccessfully(final String version) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0),
"Added LedD Daemon version: " + version, Snackbar.LENGTH_LONG).show();
}
});
try {
((ColorActivity) getActivity()).refreshStripes();
} catch (IOException e) {
e.printStackTrace();
ColorApplication.getInstance().getHelperForDaemon(ledDDaemon).discover(new DiscoverCallback() {
@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), String.format(getActivity().getString(R.string.snackbar_daemon_connection_failed), ledDDaemon, message), Snackbar.LENGTH_LONG).show();
}
AddStripeDialog.instance.onResume();
dismiss();
}
});
} catch (JSONException | IOException e) {
e.printStackTrace();
}
});
AddStripeDialog.instance.onResume();
dismiss();
}
@Override
public void onDiscoverSuccessfully(final String version) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0),
getActivity().getString(R.string.snackbar_added_daemon_version, version), Snackbar.LENGTH_LONG).show();
}
});
((ColorActivity) getActivity()).refreshStripes();
AddStripeDialog.instance.onResume();
dismiss();
}
});
}
}

View File

@@ -50,9 +50,6 @@ import com.idlegandalf.ledd.components.LedDDaemon;
import com.idlegandalf.ledd.components.LedStripe;
import com.idlegandalf.ledd.helper.LedDHelper;
import org.json.JSONException;
import java.io.IOException;
import java.text.NumberFormat;
import java.text.ParsePosition;
import java.util.List;
@@ -259,50 +256,40 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
stripe.setLedDDaemon((LedDDaemon) daemonSpinner.getSelectedItem());
stripe.setController((Controller) controllerSpinner.getSelectedItem());
LedDHelper helper = null;
try {
helper = ColorApplication.getInstance().getHelperForDaemon((LedDDaemon) daemonSpinner.getSelectedItem());
} catch (IOException e) {
e.printStackTrace();
}
LedDHelper helper = ColorApplication.getInstance().getHelperForDaemon((LedDDaemon) daemonSpinner.getSelectedItem());
if (helper != null) {
try {
helper.addStripe(stripe, new AddStripeCallback() {
@Override
public void onAddSuccessfully(final LedStripe stripe) {
ColorActivity activity = ((ColorActivity) getActivity());
try {
activity.refreshStripes();
} catch (IOException e) {
e.printStackTrace();
helper.addStripe(stripe, new AddStripeCallback() {
@Override
public void onAddSuccessfully(final LedStripe stripe) {
ColorActivity activity = ((ColorActivity) getActivity());
activity.refreshStripes();
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
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();
}
});
dismiss();
}
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content))
.getChildAt(0), "Added stripe (" + stripe.getId() + ")", Snackbar.LENGTH_LONG).show();
}
});
dismiss();
}
@Override
public void onAddFailed(int code, String msg) {
@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), "Failed to add stripe: " + message, Snackbar.LENGTH_LONG).show();
}
});
dismiss();
}
});
} catch (JSONException | IOException e) {
e.printStackTrace();
}
}
@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), getActivity().getString(R.string.snackbar_failed_add_stripe) + message, Snackbar.LENGTH_LONG).show();
}
});
dismiss();
}
});
}
}
});
@@ -371,14 +358,20 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
public void onResume() {
super.onResume();
ColorApplication.getInstance().onResume();
if (daemonArrayAdapter != null) {
daemonArrayAdapter.clear();
daemonArrayAdapter.addAll(ColorApplication.getInstance().getDaemons());
}
if (controllerArrayAdapter != null && mDaemonSelected) {
refreshController((LedDDaemon) daemonSpinner.getSelectedItem());
}
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if (daemonArrayAdapter != null) {
daemonArrayAdapter.clear();
daemonArrayAdapter.addAll(ColorApplication.getInstance().getDaemons());
}
if (controllerArrayAdapter != null && mDaemonSelected) {
refreshController((LedDDaemon) daemonSpinner.getSelectedItem());
}
}
});
}
private void testChannel(EditText text, ImageButton button) {
@@ -398,19 +391,11 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
}
text.setTag(toggle);
LedDHelper helper = null;
try {
helper = ColorApplication.getInstance().getHelperForDaemon((LedDDaemon) daemonSpinner.getSelectedItem());
} catch (IOException e) {
e.printStackTrace();
}
LedDHelper helper = ColorApplication.getInstance().getHelperForDaemon((LedDDaemon) daemonSpinner.getSelectedItem());
if (helper != null) {
try {
helper.testChannel((Controller) controllerSpinner.getSelectedItem(), Integer.parseInt(text.getText().toString()), val);
} catch (JSONException e) {
e.printStackTrace();
}
helper.testChannel((Controller) controllerSpinner.getSelectedItem(), Integer.parseInt(text.getText().toString()), val);
}
}
}
@@ -418,40 +403,31 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
private void refreshController(final LedDDaemon ledDDaemon) {
controllerArrayAdapter.clear();
LedDHelper helper = null;
try {
helper = ColorApplication.getInstance().getHelperForDaemon(ledDDaemon);
} catch (IOException e) {
e.printStackTrace();
}
LedDHelper helper = ColorApplication.getInstance().getHelperForDaemon(ledDDaemon);
if (helper != null) {
try {
helper.getStripes(new StripesCallback() {
@Override
public void onSuccess(List<LedStripe> stripes) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
controllerArrayAdapter.addAll(ledDDaemon.getControllers());
toggleAll(stripeMapping, true);
}
});
}
helper.getStripes(new StripesCallback() {
@Override
public void onSuccess(List<LedStripe> stripes) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
controllerArrayAdapter.addAll(ledDDaemon.getControllers());
toggleAll(stripeMapping, true);
}
});
}
@Override
public void onGetFailed(String message) {
@Override
public void onGetFailed(int code, String message) {
}
}
@Override
public void onConnectionFailed(String message) {
@Override
public void onConnectionFailed(String message) {
}
});
} 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.LedStripe;
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.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.LinkedBlockingQueue;
public class LedDHelper {
@@ -53,7 +58,7 @@ public class LedDHelper {
final String ACTION_GETCOLOR = "get_color";
final String ACTION_ADDCONTROLLER = "add_controller";
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_DISCOVER = "discover";
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.dRequests = new LinkedBlockingQueue<>();
this.ledDDaemon = ledDDaemon;
@@ -91,34 +96,35 @@ public class LedDHelper {
* Add controller to ledd daemon
*
* @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 {
JSONObject jnson = new JSONObject();
public void addController(final Controller c, final AddControllerCallback callback) {
Map<String, Object> params = new HashMap<>();
jnson.put("action", ACTION_ADDCONTROLLER);
jnson.put("channels", c.getChannels());
jnson.put("i2c_dev", c.getI2c_device());
jnson.put("address", c.getAddress());
params.put("channels", c.getChannels());
params.put("i2c_dev", c.getI2c_device());
params.put("address", c.getAddress());
addRequestToQueue(jnson, new AnswerTask() {
JSONRPC2Request request = new JSONRPC2Request(ACTION_ADDCONTROLLER, params, UUID.randomUUID().toString());
addRequestToQueue(request, new AnswerTask() {
@Override
public void onConnectionFailed(String message) {
callback.onAddFailed(message, "");
callback.onConnectionFailed(message);
}
@Override
public void onResponse(JSONObject response) {
try {
if (response.getBoolean("success")) {
c.setId(response.getInt("cid"));
public void onResponse(JSONRPC2Response response) {
if (response.indicatesSuccess()) {
try {
JSONObject json = new JSONObject(response.getResult().toString());
c.setId(json.getInt("cid"));
callback.onControllerAdded(c);
} else {
callback.onAddFailed(response.getString("message"), response.getString("message_detail"));
} catch (JSONException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
} else {
@SuppressWarnings("ThrowableResultOfMethodCallIgnored") JSONRPC2Error error = response.getError();
callback.onAddFailed(error.getCode(), error.getMessage());
}
}
});
@@ -126,28 +132,22 @@ public class LedDHelper {
/**
* Get stripes known to daemon
*
* @throws JSONException no valid json
* @throws IOException socket error
*/
public void getStripes(final StripesCallback callback) throws JSONException, IOException {
JSONObject jnson = new JSONObject();
jnson.put("action", ACTION_GETALLSTRIPES);
addRequestToQueue(jnson, new AnswerTask() {
public void getStripes(final StripesCallback callback) {
addRequestToQueue(new JSONRPC2Request(ACTION_GETALLSTRIPES, UUID.randomUUID().toString()), new AnswerTask() {
@Override
public void onConnectionFailed(String message) {
callback.onGetFailed(message);
callback.onConnectionFailed(message);
}
@Override
public void onResponse(JSONObject response) {
public void onResponse(JSONRPC2Response response) {
try {
if (response.getBoolean("success")) {
if (response.indicatesSuccess()) {
ledDDaemon.getControllers().clear();
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++) {
JSONObject row = jcontrollers.getJSONObject(i);
@@ -160,7 +160,7 @@ public class LedDHelper {
JSONArray jstripes = row.getJSONArray("stripes");
for (int o = 0; o < jstripes.length(); o++) {
JSONObject srow = jstripes.getJSONObject(i);
JSONObject srow = jstripes.getJSONObject(o);
LedStripe nStripe = new LedStripe();
nStripe.setId(srow.getInt("id"));
nStripe.setRGB(srow.getBoolean("rgb"));
@@ -178,8 +178,8 @@ public class LedDHelper {
callback.onSuccess(list);
} else {
if (response.has("message")) callback.onGetFailed(response.getString("message"));
else callback.onGetFailed("unknown error");
@SuppressWarnings("ThrowableResultOfMethodCallIgnored") JSONRPC2Error error = response.getError();
callback.onGetFailed(error.getCode(), error.getMessage());
}
} catch (Exception e) {
e.printStackTrace();
@@ -194,59 +194,57 @@ public class LedDHelper {
* @param ledStripe Stripe
*/
public void setColor(LedStripe ledStripe) {
Map<String, Object> hsv = new HashMap<>();
JSONObject jnson = new JSONObject();
JSONObject hsv = new JSONObject();
hsv.put("h", ledStripe.getColor().getHue());
hsv.put("s", ledStripe.getColor().getSaturation());
hsv.put("v", ledStripe.getColor().getValue());
try {
hsv.put("h", ledStripe.getColor().getHue());
hsv.put("s", ledStripe.getColor().getSaturation());
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);
JSONRPC2Request request = new JSONRPC2Request(ACTION_SETCOLOR, params, UUID.randomUUID().toString());
} catch (JSONException e) {
e.printStackTrace();
}
addRequestToQueue(jnson, null);
addRequestToQueue(request, null);
}
/**
* Get color using the stripeid
*
* @param ledStripe Stripe
* @throws JSONException no valid json
* @throws IOException socket error
*/
public void getColor(final LedStripe ledStripe, final RecieveColorCallback callback) throws JSONException, IOException {
JSONObject jnson = new JSONObject();
public void getColor(final LedStripe ledStripe, final RecieveColorCallback callback) {
HashMap<String, Object> params = new HashMap<>();
params.put("sid", ledStripe.getId());
jnson.put("action", ACTION_GETCOLOR);
jnson.put("sid", ledStripe.getId());
addRequestToQueue(jnson, new AnswerTask() {
addRequestToQueue(new JSONRPC2Request(ACTION_GETCOLOR, params, UUID.randomUUID().toString()), new AnswerTask() {
@Override
public void onConnectionFailed(String message) {
callback.onRecievFailed(message);
callback.onConnectionFailed(message);
}
@Override
public void onResponse(JSONObject response) {
try {
if (response.getBoolean("success")) {
JSONArray hsv = response.getJSONArray("color");
ledStripe.setColor(new HSV(hsv.getDouble(0), hsv.getDouble(1), hsv.getDouble(2)));
callback.onColorRecieved(ledStripe);
} else {
callback.onRecievFailed(response.getString("message"));
public void onResponse(JSONRPC2Response response) {
if (response.indicatesSuccess()) {
try {
JSONObject json = new JSONObject(response.getResult().toString());
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)));
callback.onColorRecieved(ledStripe);
} else {
callback.onRecievFailed(-1, "HSV was empty");
}
} catch (JSONException e) {
e.printStackTrace();
callback.onRecievFailed(-1, "Unhandeled JSON Exception");
}
} catch (Exception e) {
e.printStackTrace();
} else {
@SuppressWarnings("ThrowableResultOfMethodCallIgnored") JSONRPC2Error error = response.getError();
callback.onRecievFailed(error.getCode(), error.getMessage());
}
}
});
@@ -258,24 +256,22 @@ public class LedDHelper {
* @param c controller
* @param channel channel number
* @param value value (1= on, 0 = off)
* @throws JSONException
*/
public void testChannel(Controller c, int channel, int value) throws JSONException {
JSONObject jnson = new JSONObject();
public void testChannel(Controller c, int channel, int value) {
HashMap<String, Object> params = new HashMap<>();
jnson.put("action", ACTION_TESTCHANNEL);
jnson.put("cid", c.getId());
jnson.put("channel", channel);
jnson.put("value", value);
params.put("cid", c.getId());
params.put("channel", channel);
params.put("value", value);
addRequestToQueue(jnson, new AnswerTask() {
addRequestToQueue(new JSONRPC2Request(ACTION_TESTCHANNEL, params, UUID.randomUUID().toString()), new AnswerTask() {
@Override
public void onConnectionFailed(String message) {
}
@Override
public void onResponse(JSONObject response) {
public void onResponse(JSONRPC2Response response) {
}
});
@@ -283,26 +279,20 @@ public class LedDHelper {
/**
* Get information about an ledd daemon
*
* @throws JSONException no valid json
* @throws IOException socket error
*/
public void discover(final DiscoverCallback callback) throws JSONException, IOException {
JSONObject jnson = new JSONObject();
jnson.put("action", ACTION_DISCOVER);
addRequestToQueue(jnson, new AnswerTask() {
public void discover(final DiscoverCallback callback) {
addRequestToQueue(new JSONRPC2Request(ACTION_DISCOVER, UUID.randomUUID().toString()), new AnswerTask() {
@Override
public void onConnectionFailed(String message) {
callback.onConnectionFailed(message);
}
@Override
public void onResponse(JSONObject response) {
public void onResponse(JSONRPC2Response response) {
try {
if (response.getBoolean("success")) {
callback.onDiscoverSuccessfully(response.getString("version"));
if (response.indicatesSuccess()) {
JSONObject json = new JSONObject(response.getResult().toString());
callback.onDiscoverSuccessfully(json.getString("version"));
}
} catch (Exception e) {
e.printStackTrace();
@@ -313,39 +303,36 @@ public class LedDHelper {
/**
* 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 {
JSONObject jnson = new JSONObject();
public void addStripe(final LedStripe ledStripe, final AddStripeCallback callback) {
HashMap<String, Object> params = new HashMap<>();
HashMap<String, Object> mapping = new HashMap<>();
jnson.put("action", ACTION_ADDSTRIPES);
JSONObject stripe = new JSONObject();
params.put("name", ledStripe.getName());
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("g", ledStripe.getChannelGreen());
mapping.put("b", ledStripe.getChannelBlue());
stripe.put("map", mapping);
stripe.put("cid", ledStripe.getController().getId());
jnson.put("stripe", stripe);
params.put("map", mapping);
params.put("cid", ledStripe.getController().getId());
addRequestToQueue(jnson, new AnswerTask() {
addRequestToQueue(new JSONRPC2Request(ACTION_ADDSTRIPE, params, UUID.randomUUID().toString()), new AnswerTask() {
@Override
public void onConnectionFailed(String message) {
callback.onConnectionFailed(message);
}
@Override
public void onResponse(JSONObject response) {
public void onResponse(JSONRPC2Response response) {
try {
if (response.getBoolean("success")) {
ledStripe.setId(response.getInt("sid"));
if (response.indicatesSuccess()) {
JSONObject json = new JSONObject(response.getResult().toString());
ledStripe.setId(json.getInt("sid"));
callback.onAddSuccessfully(ledStripe);
} else {
@SuppressWarnings("ThrowableResultOfMethodCallIgnored") JSONRPC2Error error = response.getError();
callback.onAddFailed(error.getCode(), error.getMessage());
}
} catch (Exception e) {
e.printStackTrace();
@@ -354,8 +341,8 @@ public class LedDHelper {
});
}
private void addRequestToQueue(JSONObject json, AnswerTask task) {
dRequests.add(new LedDRequest(json, task));
private void addRequestToQueue(JSONRPC2Request request, AnswerTask task) {
if (request != null) dRequests.add(new LedDRequest(request, task));
}
public void teardown() {
@@ -389,8 +376,6 @@ public class LedDHelper {
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
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.callback.ConnectCallback;
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.JSONObject;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
@@ -65,11 +67,6 @@ public class ColorService extends Service {
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
worker.stop();
@@ -85,24 +82,24 @@ public class ColorService extends Service {
DataCallback dataCallback = new DataCallback() {
@Override
public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) {
JSONObject resp = null;
try {
resp = new JSONObject(new String(bb.getAllByteArray()));
} catch (JSONException e) {
e.printStackTrace();
JSONRPC2Response reqIn = null;
String dataStr = new String(bb.getAllByteArray());
if (!dataStr.isEmpty()) {
try {
reqIn = JSONRPC2Response.parse(dataStr);
} catch (JSONRPC2ParseException e) {
e.printStackTrace();
}
}
if (resp != null) {
try {
if (sendableHashMap.containsKey(resp.getString("ref"))) {
sendableHashMap.get(resp.getString("ref")).onResponse(resp);
sendableHashMap.remove(resp.getString("ref"));
if (timeoutHashMap.containsKey(resp.getString("ref")) && timeoutHashMap.get(resp.getString("ref")) != null)
timeoutHashMap.get(resp.getString("ref")).cancel(false);
timeoutHashMap.remove(resp.getString("ref"));
}
} catch (JSONException e) {
e.printStackTrace();
if (reqIn != null) {
if (sendableHashMap.containsKey(reqIn.getID().toString())) {
sendableHashMap.get(reqIn.getID().toString()).onResponse(reqIn);
sendableHashMap.remove(reqIn.getID().toString());
if (timeoutHashMap.containsKey(reqIn.getID().toString()) && timeoutHashMap.get(reqIn.getID().toString()) != null)
timeoutHashMap.get(reqIn.getID().toString()).cancel(false);
timeoutHashMap.remove(reqIn.getID().toString());
}
}
}
@@ -122,36 +119,46 @@ public class ColorService extends Service {
final T item = workQueue.take();
if (item instanceof Sendable) {
if (socketHashMap.containsKey(((Sendable) item).getRecipient()) && socketHashMap.get(((Sendable) item).getRecipient())
.getServer().isRunning()) {
final Sendable sendable = (Sendable) item;
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")
.getBytes
("UTF-8"), null);
sendableHashMap.put(((Sendable) item).getRef(), (Sendable) item);
Util.writeAll(socketHashMap.get(sendable.getRecipient()), (sendable.getRequest().toString() + "\n").getBytes("UTF-8"),
null);
sendableHashMap.put((String) sendable.getRequest().getID(), sendable);
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
public void run() {
((Sendable) item).onNoResponse();
timeoutHashMap.remove(((Sendable) item).getRef());
sendableHashMap.remove(((Sendable) item).getRef());
sendable.onNoResponse();
timeoutHashMap.remove(sendable.getRequest().getID());
sendableHashMap.remove(sendable.getRequest().getID());
}
}, 1000, TimeUnit.MILLISECONDS));
} else {
AsyncServer.getDefault().connectSocket(new InetSocketAddress(((Sendable) item).getRecipient().getAddress(), ((Sendable)
item).getRecipient().getPort()), new ConnectCallback() {
socketHashMap.put(sendable.getRecipient(), null);
AsyncServer.getDefault().connectSocket(new InetSocketAddress(sendable.getRecipient().getAddress(), sendable
.getRecipient().getPort()), new ConnectCallback() {
@Override
public void onConnectCompleted(Exception ex, final AsyncSocket socket) {
if (ex == null) {
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);
} 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 String queueSend(LedDDaemon rec, JSONObject msg, AnswerTask answerTask) throws JSONException {
Sendable sendable = new Sendable(msg, answerTask, rec);
queue.add(sendable);
return sendable.getRef();
public void queueSend(LedDDaemon rec, JSONRPC2Request request, AnswerTask answerTask) {
Sendable sendable = null;
try {
sendable = new Sendable(request, answerTask, rec);
} catch (JSONException e) {
e.printStackTrace();
}
if (sendable != null) {
queue.add(sendable);
}
}
}
}

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/>.
-->
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
<!-- The main content view -->
<LinearLayout 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">
android:id="@+id/main_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:orientation="vertical">
<!-- The main content view -->
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?android:attr/actionBarSize"
app:titleTextColor="@android:color/black">
<LinearLayout
</android.support.v7.widget.Toolbar>
<com.larswerkman.holocolorpicker.ColorPicker
android:id="@+id/picker"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
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" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?android:attr/actionBarSize"/>
<com.larswerkman.holocolorpicker.SaturationBar
android:id="@+id/saturationbar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
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.ColorPicker
android:id="@+id/picker"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="25dp"/>
<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" />
<com.larswerkman.holocolorpicker.SVBar
android:id="@+id/svbar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"/>
</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>
</LinearLayout>

View File

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

View File

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

View File

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

View File

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

View File

@@ -17,19 +17,70 @@
~ 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="192dp"
android:background="?attr/colorPrimaryDark"
android:gravity="bottom"
android:orientation="vertical"
android:padding="16dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="192dp"
android:background="?attr/colorPrimaryDark"
android:gravity="bottom"
android:padding="16dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<TextView
android:id="@+id/nvh_name"
android:layout_width="match_parent"
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"/>
</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>

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