18 Commits

Author SHA1 Message Date
ac5cb93fd9 Updated dependencies. Migrated to androidx (mostly). Stripping JSONRPC
next.
2018-12-01 14:43:18 +01:00
97b1f37164 updated to latest deps, needs some rework for incoming protobuf implementation 2017-04-14 20:07:30 +02:00
96a0bf9ed4 fixed some merge derps 2017-01-31 16:30:22 +01:00
23035084e8 updated deps and code to a more recent state 2017-01-31 16:15:24 +01:00
5872be4fe7 proper Timber integration
updated some deps
2016-05-17 00:38:30 +02:00
a776411a2e moved the lib to jitpack, awesome 2016-05-15 17:13:19 +02:00
86282e6872 fixed wrong icon used when adding a new profile 2016-05-15 15:19:35 +02:00
6c8e7bbfa0 added null check for stripes #8 2016-05-01 22:28:37 +02:00
1d1d27257c Added missing aar file 2016-05-01 22:04:55 +02:00
9d043c21a3 updated holo-color-picker
removed some debug out
2016-05-01 22:03:22 +02:00
ab2c219dca added badges for profile
fixed icon not showing when just added a profile
suppressed some annoying warnings
2016-05-01 00:58:24 +02:00
79c42216fc hockeyapp integration 2016-04-30 21:35:16 +02:00
a582a5b1bc renamed file to be not enormously long anymore 2016-04-30 21:02:23 +02:00
e1f6ca4f33 fixed int treated as string 2016-04-30 20:56:10 +02:00
c6887e5905 updated some jenkins related stuff 2016-04-30 20:48:36 +02:00
64b2f80848 added wrapper 2016-04-30 20:27:54 +02:00
58980c494e updated libs
added library management
changed some edittext to the right class
2016-04-30 20:17:07 +02:00
239429cb5e Added icons for the new drawer
Added profiles (not fully completed yet, but it works)
Removed some unused icons
2016-03-18 15:39:38 +01:00
75 changed files with 904 additions and 1002 deletions

View File

@@ -21,24 +21,19 @@ buildscript {
mavenCentral() mavenCentral()
jcenter() jcenter()
flatDir { maven { url "https://jitpack.io" }
dirs 'libs'
}
}
dependencies {
classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
classpath 'com.github.ben-manes:gradle-versions-plugin:0.12.0'
} }
} }
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.hugo'
apply plugin: 'com.github.ben-manes.versions' repositories {
maven { url "https://jitpack.io" }
}
android { android {
compileSdkVersion 23 compileSdkVersion 28
buildToolsVersion '23.0.2' buildToolsVersion '28.0.3'
lintOptions { lintOptions {
abortOnError false abortOnError false
@@ -46,38 +41,31 @@ android {
defaultConfig { defaultConfig {
applicationId "com.idlegandalf.ledd" applicationId "com.idlegandalf.ledd"
minSdkVersion 18 minSdkVersion 24
targetSdkVersion 23 targetSdkVersion 28
versionCode 3 versionCode System.getenv("BUILD_NUMBER") as Integer ?: 100
versionName "1.0.3" versionName "2.0.0-SNAPSHOT"
archivesBaseName = "LedD-" + versionName + "-" + versionCode
} }
buildTypes {
release {
zipAlignEnabled true
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug { compileOptions {
zipAlignEnabled true targetCompatibility 1.8
} sourceCompatibility 1.8
} }
} }
dependencies { dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs') implementation fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.2.1' implementation 'com.koushikdutta.async:androidasync:2.2.1'
compile 'com.android.support:support-v4:23.2.1' implementation 'com.squareup.okhttp3:okhttp:3.12.0'
compile 'com.squareup.okhttp:okhttp:2.7.5' implementation 'com.jakewharton.timber:timber:4.7.1'
compile 'com.google.code.gson:gson:2.6.2' implementation 'com.google.code.gson:gson:2.8.5'
compile 'com.jakewharton:butterknife:7.0.1' implementation 'com.jakewharton:butterknife:8.8.1'
compile 'com.koushikdutta.async:androidasync:2.1.7' implementation 'com.github.madrapps:pikolo:1.1.6'
compile 'com.android.support:design:23.2.1' implementation 'com.google.guava:guava:27.0-android'
compile 'com.larswerkman:HoloColorPicker:1.5@aar' implementation('com.mikepenz:materialdrawer:6.1.1@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 transitive = true
} }
provided 'org.projectlombok:lombok:1.16.8' annotationProcessor 'org.projectlombok:lombok:1.18.4'
compileOnly 'org.projectlombok:lombok:1.18.4'
} }

Binary file not shown.

View File

@@ -17,9 +17,8 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>. ~ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<manifest <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.idlegandalf.ledd" package="com.idlegandalf.ledd">
xmlns:android="http://schemas.android.com/apk/res/android">
<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"/>

View File

@@ -27,9 +27,8 @@ import android.net.ConnectivityManager;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.support.design.widget.Snackbar; import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity; import android.util.SparseArray;
import android.support.v7.widget.Toolbar;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
@@ -37,54 +36,63 @@ import android.view.View;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import com.idlegandalf.ledd.callbacks.RecieveColorCallback; import com.google.android.material.snackbar.Snackbar;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.idlegandalf.ledd.callbacks.ReceiveColorCallback;
import com.idlegandalf.ledd.callbacks.StripesCallback; import com.idlegandalf.ledd.callbacks.StripesCallback;
import com.idlegandalf.ledd.components.HSV; import com.idlegandalf.ledd.components.HSV;
import com.idlegandalf.ledd.components.LedDDaemon; import com.idlegandalf.ledd.components.LedDDaemon;
import com.idlegandalf.ledd.components.LedStripe; import com.idlegandalf.ledd.components.LedStripe;
import com.idlegandalf.ledd.components.Profile;
import com.idlegandalf.ledd.fragments.AddProfileDialog;
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.idlegandalf.ledd.utils.RateLimiter;
import com.larswerkman.holocolorpicker.ColorPicker; import com.madrapps.pikolo.HSLColorPicker;
import com.larswerkman.holocolorpicker.SaturationBar; import com.madrapps.pikolo.listeners.SimpleColorSelectionListener;
import com.larswerkman.holocolorpicker.ValueBar;
import com.mikepenz.materialdrawer.Drawer; import com.mikepenz.materialdrawer.Drawer;
import com.mikepenz.materialdrawer.DrawerBuilder; import com.mikepenz.materialdrawer.DrawerBuilder;
import com.mikepenz.materialdrawer.holder.BadgeStyle; import com.mikepenz.materialdrawer.holder.BadgeStyle;
import com.mikepenz.materialdrawer.interfaces.OnCheckedChangeListener; import com.mikepenz.materialdrawer.interfaces.OnCheckedChangeListener;
import com.mikepenz.materialdrawer.model.DividerDrawerItem;
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem; import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
import com.mikepenz.materialdrawer.model.SecondaryDrawerItem;
import com.mikepenz.materialdrawer.model.SecondarySwitchDrawerItem; import com.mikepenz.materialdrawer.model.SecondarySwitchDrawerItem;
import com.mikepenz.materialdrawer.model.SwitchDrawerItem;
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
import java.lang.reflect.Type;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import butterknife.Bind; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import hugo.weaving.DebugLog; import timber.log.Timber;
public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerItemClickListener, OnCheckedChangeListener { public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerItemClickListener, Drawer.OnDrawerItemLongClickListener, OnCheckedChangeListener {
@Bind(R.id.main_layout) @BindView(R.id.main_layout)
LinearLayout scrollView; LinearLayout scrollView;
@Bind(R.id.toolbar) @BindView(R.id.toolbar)
Toolbar toolbar; Toolbar toolbar;
@Bind(R.id.picker) @BindView(R.id.picker)
ColorPicker colorPicker; HSLColorPicker colorPicker;
@Bind(R.id.saturationbar)
SaturationBar saturationBar;
@Bind(R.id.valuebar)
ValueBar valueBar;
Drawer mDrawer; Drawer mDrawer;
private List<IDrawerItem> mDaemons; private List<IDrawerItem> mDaemons;
private refreshDaemonsListener daemonsListener; private refreshDaemonsListener daemonsListener;
private List<LedStripe> ledStripes; private List<LedStripe> ledStripes;
private List<Profile> profiles;
private LedStripe mCurrentStripe; private LedStripe mCurrentStripe;
private boolean fromOnCreate = true; private boolean fromOnCreate = true;
private boolean autoColorSet = false; private boolean autoColorSet = false;
private RateLimiter limiter; private RateLimiter limiter;
private boolean isRefreshRunning = false; private boolean isRefreshRunning = false;
private Type profileList = new TypeToken<List<Profile>>() {
}.getType();
private PrimaryDrawerItem menuProfiles;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -92,56 +100,78 @@ public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerI
setContentView(R.layout.activity_color); setContentView(R.layout.activity_color);
ButterKnife.bind(this); ButterKnife.bind(this);
if (BuildConfig.DEBUG) {
Timber.plant(new Timber.DebugTree());
}
// 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() || networkInfo.getType() != ConnectivityManager.TYPE_WIFI) { 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() { Snackbar.make(scrollView, R.string.snackbar_no_wlan, Snackbar.LENGTH_INDEFINITE).setAction("RETRY", v -> {
@Override refreshStripes();
public void onClick(View v) {
refreshStripes();
}
}).show(); }).show();
} }
mDaemons = new ArrayList<>(); mDaemons = new ArrayList<>();
limiter = new RateLimiter(5.0, 100.0); limiter = new RateLimiter(30.0, 1000);
colorPicker.addSaturationBar(saturationBar); colorPicker.setColorSelectionListener(new SimpleColorSelectionListener() {
colorPicker.addValueBar(valueBar);
colorPicker.setShowOldCenterColor(false);
colorPicker.setOnColorChangedListener(new ColorPicker.OnColorChangedListener() {
@Override @Override
public void onColorChanged(int i) { public void onColorSelected(int color) {
if (mCurrentStripe != null && limiter.check() && !autoColorSet) { if (mCurrentStripe != null && limiter.check() && !autoColorSet) {
mCurrentStripe.setColor(i); mCurrentStripe.setColor(color);
} }
} }
}); });
setSupportActionBar(toolbar);
toolbar.setTitle(R.string.app_name); toolbar.setTitle(R.string.app_name);
mDrawer = new DrawerBuilder() mDrawer = new DrawerBuilder()
.withActivity(this) .withActivity(this)
.withToolbar(toolbar) .withToolbar(toolbar)
.withOnDrawerItemClickListener(this) .withOnDrawerItemClickListener(this)
.withOnDrawerItemLongClickListener(this)
.addStickyDrawerItems( .addStickyDrawerItems(
new PrimaryDrawerItem().withName(R.string.text_add_stripe).withTag("add_stripe").withSelectable(false), new PrimaryDrawerItem().withName(R.string.text_add_stripe).withTag("add_stripe").withSelectable(false).withIcon(R.drawable.ic_add_circle_black_48dp),
new PrimaryDrawerItem().withName(R.string.text_settings).withTag("settings").withSelectable(false) new PrimaryDrawerItem().withName(R.string.text_settings).withTag("settings").withSelectable(false).withIcon(R.drawable.ic_tune_black_48dp)
)
.addDrawerItems(
new DividerDrawerItem(),
menuProfiles = new PrimaryDrawerItem()
.withName("Profiles")
.withIcon(R.drawable.ic_save_black_48dp)
.withSelectable(false)
.withIsExpanded(true)
.withBadgeStyle(new BadgeStyle().withColor(Color.CYAN).withTextColor(Color.WHITE))
) )
.build(); .build();
menuProfiles.withSubItems(new SecondaryDrawerItem().withName("Add Profile").withTag("add_profile").withSelectable(false).withIcon(R.drawable.ic_add_circle_outline_black_48dp));
// enable Homebutton navigation to drawer // enable HomeButton navigation to drawer
if (getSupportActionBar() != null) { if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(false); getSupportActionBar().setDisplayHomeAsUpEnabled(false);
mDrawer.getActionBarDrawerToggle().setDrawerIndicatorEnabled(true); mDrawer.getActionBarDrawerToggle().setDrawerIndicatorEnabled(true);
} }
List<IDrawerItem> subProfiles = menuProfiles.getSubItems();
if (PreferenceManager.getDefaultSharedPreferences(this).contains("profiles")) {
profiles = new Gson().fromJson(PreferenceManager.getDefaultSharedPreferences(this).getString("profiles", ""), profileList);
for (Profile profile : profiles) {
subProfiles.add(0, new SecondaryDrawerItem().withName(profile.getName()).withTag(profile.getValues()).withSelectable(false).withIcon(R.drawable.ic_note_black_48dp));
}
} else {
profiles = new ArrayList<>();
}
menuProfiles.withSubItems(subProfiles);
mDrawer.updateItem(menuProfiles);
daemonsListener = new refreshDaemonsListener(); daemonsListener = new refreshDaemonsListener();
registerReceiver(daemonsListener, new IntentFilter(ColorApplication.INTENT_ACTION_REFRESH)); registerReceiver(daemonsListener, new IntentFilter(ColorApplication.INTENT_ACTION_REFRESH));
} }
@Override @Override
@@ -160,6 +190,8 @@ public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerI
@Override @Override
protected void onRestart() { protected void onRestart() {
super.onRestart(); super.onRestart();
ColorApplication.getInstance().onResume();
registerReceiver(daemonsListener, new IntentFilter(ColorApplication.INTENT_ACTION_REFRESH));
refreshStripes(); refreshStripes();
} }
@@ -176,8 +208,8 @@ public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerI
if (stripe != null) { if (stripe != null) {
if (isChecked) { if (isChecked) {
if (stripe == mCurrentStripe) { if (stripe == mCurrentStripe) {
if (colorPicker.getColor() != Color.BLACK) if (colorPicker.getSolidColor() != Color.BLACK)
stripe.setColor(colorPicker.getColor()); stripe.setColor(colorPicker.getSolidColor());
else { else {
colorPicker.setColor(Color.WHITE); colorPicker.setColor(Color.WHITE);
} }
@@ -214,7 +246,10 @@ public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerI
unregisterReceiver(daemonsListener); unregisterReceiver(daemonsListener);
if (mCurrentStripe != null) if (mCurrentStripe != null)
PreferenceManager.getDefaultSharedPreferences(this).edit().putInt("lastStripe", mCurrentStripe.getId()).commit(); PreferenceManager.getDefaultSharedPreferences(this).edit().putInt("lastStripe", mCurrentStripe.getId()).apply();
if (profiles != null)
PreferenceManager.getDefaultSharedPreferences(this).edit().putString("profiles", new Gson().toJson(profiles, profileList)).apply();
} }
@Override @Override
@@ -226,6 +261,7 @@ public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerI
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
if (!fromOnCreate) { if (!fromOnCreate) {
ColorApplication.getInstance().onResume(); ColorApplication.getInstance().onResume();
registerReceiver(daemonsListener, new IntentFilter(ColorApplication.INTENT_ACTION_REFRESH)); registerReceiver(daemonsListener, new IntentFilter(ColorApplication.INTENT_ACTION_REFRESH));
@@ -236,21 +272,41 @@ public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerI
} }
@SuppressWarnings("unchecked")
@Override @Override
public boolean onItemClick(View view, int position, IDrawerItem drawerItem) { public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
if (drawerItem.isSelectable()) { if (drawerItem.getTag() instanceof String) {
String tag = (String) drawerItem.getTag();
if (drawerItem.getTag() instanceof String) { switch (tag) {
String tag = (String) drawerItem.getTag(); case "add_stripe":
if (tag.equals("add_stripe")) {
new AddStripeDialog().show(getFragmentManager(), ""); new AddStripeDialog().show(getFragmentManager(), "");
return true; return true;
} else if (tag.equals("settings")) { case "settings":
return true; return true;
case "add_profile":
new AddProfileDialog().show(getFragmentManager(), "");
return true;
}
}
if (drawerItem.getTag() instanceof SparseArray) {
SparseArray<HSV> sparseArray = (SparseArray<HSV>) drawerItem.getTag();
if (ledStripes != null) {
for (LedStripe ledStripe : ledStripes) {
String json_workaround = new Gson().toJson(sparseArray.get(ledStripe.getId()));
HSV nHSV = new Gson().fromJson(json_workaround, new TypeToken<HSV>() {
}.getType());
if (nHSV != null) {
ledStripe.setColor(nHSV);
}
} }
} }
}
if (drawerItem.isSelectable()) {
if (drawerItem.getTag() instanceof Integer) { if (drawerItem.getTag() instanceof Integer) {
int tag = (int) drawerItem.getTag(); int tag = (int) drawerItem.getTag();
@@ -265,6 +321,30 @@ public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerI
return false; return false;
} }
@Override
public boolean onItemLongClick(View view, int position, IDrawerItem drawerItem) {
Timber.d("Longclick of %s", drawerItem.getClass().getName());
return false;
}
public List<LedStripe> getStripes() {
return ledStripes;
}
public void addProfile(Profile profile) {
if (profiles != null) {
profiles.add(profile);
List<IDrawerItem> subProfiles = menuProfiles.getSubItems();
subProfiles.add(0, new SecondaryDrawerItem().withName(profile.getName()).withSelectable(false).withTag(profile.getValues()).withIcon(R.drawable.ic_note_black_48dp));
menuProfiles.withSubItems(subProfiles).withIsExpanded(true).withBadge(String.valueOf(profiles.size()));
mDrawer.updateItem(menuProfiles);
}
}
@SuppressWarnings("deprecated")
public void refreshStripes() { public void refreshStripes() {
if (isRefreshRunning) if (isRefreshRunning)
return; return;
@@ -280,65 +360,65 @@ public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerI
@Override @Override
public void onSuccess(List<LedStripe> stripes) { public void onSuccess(List<LedStripe> stripes) {
ledStripes = stripes; ledStripes = stripes;
runOnUiThread(new Runnable() { runOnUiThread(() -> {
@Override PrimaryDrawerItem nDaemonMenu = null;
public void run() { long selectedItemId = -1;
PrimaryDrawerItem nDaemonMenu = null; for (IDrawerItem drawerItem : mDaemons) {
long selectedItemId = -1; if (((PrimaryDrawerItem) drawerItem).getName().getText().equals(dDaemon.toString())) {
for (IDrawerItem drawerItem : mDaemons) { nDaemonMenu = (PrimaryDrawerItem) drawerItem;
if (((PrimaryDrawerItem) drawerItem).getName().getText().equals(dDaemon.toString())) { break;
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();
} }
if (nDaemonMenu == null) {
nDaemonMenu = new PrimaryDrawerItem().withName(dDaemon.toString()).withTag(finalI).withSelectable(false).withIsExpanded(true).withIcon(R.drawable.ic_computer_black_48dp);
mDrawer.addItemAtPosition(nDaemonMenu, 0);
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 SwitchDrawerItem sItem = new SwitchDrawerItem()
.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()));
//noinspection deprecation
nDaemonMenu.withBadgeStyle(new BadgeStyle().withColor(getResources().getColor(R.color.material_drawer_accent)).withTextColor(Color.WHITE));
mDrawer.updateItem(nDaemonMenu);
if (selectedItemId != -1)
mDrawer.setSelection(selectedItemId);
//noinspection ConstantConditions
Snackbar.make(findViewById(android.R.id.content), R.string.snackbar_stripes_reloaded, Snackbar.LENGTH_LONG).show();
}); });
for (LedStripe stripe : ledStripes) { for (LedStripe stripe : ledStripes) {
stripe.getColor(new RecieveColorCallback() { stripe.getColor(new ReceiveColorCallback() {
@Override @Override
public void onConnectionFailed(String message) { public void onConnectionFailed(String message) {
} }
@Override @Override
public void onColorRecieved(LedStripe stripe) { public void onColorReceived(LedStripe stripe) {
if (stripe.isOn()) { if (stripe.isOn()) {
IDrawerItem sItem = findItemForStripe(stripe); IDrawerItem sItem = findItemForStripe(stripe);
@@ -346,18 +426,13 @@ public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerI
final SecondarySwitchDrawerItem cItem = (SecondarySwitchDrawerItem) sItem; final SecondarySwitchDrawerItem cItem = (SecondarySwitchDrawerItem) sItem;
cItem.withSwitchEnabled(true); cItem.withSwitchEnabled(true);
runOnUiThread(new Runnable() { runOnUiThread(() -> mDrawer.updateItem(cItem));
@Override
public void run() {
mDrawer.updateItem(cItem);
}
});
} }
} }
} }
@Override @Override
public void onRecievFailed(int code, String msg) { public void onReceiveFailed(int code, String msg) {
} }
@@ -367,6 +442,7 @@ public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerI
@Override @Override
public void onGetFailed(int code, String message) { public void onGetFailed(int code, String message) {
//noinspection ConstantConditions
Snackbar.make(findViewById(android.R.id.content), getString(R.string.snackbar_no_connection_stripes) + message, Snackbar Snackbar.make(findViewById(android.R.id.content), getString(R.string.snackbar_no_connection_stripes) + message, Snackbar
.LENGTH_LONG).show(); .LENGTH_LONG).show();
@@ -374,6 +450,7 @@ public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerI
@Override @Override
public void onConnectionFailed(String message) { public void onConnectionFailed(String message) {
//noinspection ConstantConditions
Snackbar.make(findViewById(android.R.id.content), getString(R.string.snackbar_connection_failed) + message, Snackbar Snackbar.make(findViewById(android.R.id.content), getString(R.string.snackbar_connection_failed) + message, Snackbar
.LENGTH_LONG).show(); .LENGTH_LONG).show();
} }
@@ -387,37 +464,33 @@ public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerI
isRefreshRunning = false; isRefreshRunning = false;
} }
@DebugLog
private void selectStripe(LedStripe stripe) { private void selectStripe(LedStripe stripe) {
mCurrentStripe = stripe; mCurrentStripe = stripe;
toolbar.setTitle(stripe.getName()); toolbar.setTitle(stripe.getName());
autoColorSet = true; autoColorSet = true;
mDrawer.closeDrawer(); mDrawer.closeDrawer();
mCurrentStripe.getColor(new RecieveColorCallback() { mCurrentStripe.getColor(new ReceiveColorCallback() {
@Override @Override
public void onColorRecieved(final LedStripe stripe) { public void onColorReceived(final LedStripe stripe) {
final HSV cColor = stripe.getColor(); final HSV cColor = stripe.getColor();
final int color = Color.HSVToColor(new float[]{(float) cColor.getHue(), (float) cColor.getSaturation(), (float) cColor.getValue()}); final int color = Color.HSVToColor(new float[]{(float) cColor.getHue(), (float) cColor.getSaturation(), (float) cColor.getValue()});
runOnUiThread(new Runnable() { runOnUiThread(() -> {
@Override colorPicker.setColor(color);
public void run() { autoColorSet = false;
colorPicker.setColor(color);
autoColorSet = false;
if (stripe.isOn()) { if (stripe.isOn()) {
IDrawerItem fItem = findItemForStripe(stripe); IDrawerItem fItem = findItemForStripe(stripe);
if (fItem != null) if (fItem != null)
((SecondarySwitchDrawerItem) fItem).withSwitchEnabled(true); ((SecondarySwitchDrawerItem) fItem).withSwitchEnabled(true);
}
} }
}); });
} }
@Override @Override
public void onRecievFailed(int code, String msg) { public void onReceiveFailed(int code, String msg) {
autoColorSet = false; autoColorSet = false;
} }
@@ -428,17 +501,7 @@ public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerI
}); });
} }
protected class refreshDaemonsListener extends BroadcastReceiver { @Nullable
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ColorApplication.INTENT_ACTION_REFRESH)) {
refreshStripes();
}
}
}
@DebugLog
private IDrawerItem findItemForStripe(LedStripe stripe) { private IDrawerItem findItemForStripe(LedStripe stripe) {
for (IDrawerItem dItem : mDaemons) { for (IDrawerItem dItem : mDaemons) {
if (((PrimaryDrawerItem) dItem).getSubItems() != null) { if (((PrimaryDrawerItem) dItem).getSubItems() != null) {
@@ -452,4 +515,14 @@ public class ColorActivity extends AppCompatActivity implements Drawer.OnDrawerI
return null; return null;
} }
protected class refreshDaemonsListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ColorApplication.INTENT_ACTION_REFRESH)) {
refreshStripes();
}
}
}
} }

View File

@@ -21,7 +21,6 @@ package com.idlegandalf.ledd;
import android.app.Application; import android.app.Application;
import android.content.Intent; import android.content.Intent;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.util.Log;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
@@ -34,6 +33,8 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import timber.log.Timber;
public class ColorApplication extends Application { public class ColorApplication extends Application {
public static final String TAG = "LedD"; public static final String TAG = "LedD";
public static final String INTENT_ACTION_REFRESH = "com.idlegandalf.ledd.action.refreshStripes"; public static final String INTENT_ACTION_REFRESH = "com.idlegandalf.ledd.action.refreshStripes";
@@ -74,18 +75,13 @@ public class ColorApplication extends Application {
} }
public List<LedDDaemon> getDaemons() { public List<LedDDaemon> getDaemons() {
ArrayList<LedDDaemon> ledDDaemons = new ArrayList<>(); return new ArrayList<>(ledDHelpers.keySet());
ledDDaemons.addAll(ledDHelpers.keySet());
return ledDDaemons;
} }
public void teardown() { public void teardown() {
for (LedDHelper dHelper : ledDHelpers.values()) { ledDHelpers.values().forEach(LedDHelper::teardown);
dHelper.teardown();
}
PreferenceManager.getDefaultSharedPreferences(this).edit().putString("daemons", new Gson().toJson(ledDHelpers.keySet())).commit(); PreferenceManager.getDefaultSharedPreferences(this).edit().putString("daemons", new Gson().toJson(ledDHelpers.keySet())).apply();
} }
public void onResume() { public void onResume() {
@@ -94,7 +90,7 @@ public class ColorApplication extends Application {
TypeToken<Set<LedDDaemon>>() { TypeToken<Set<LedDDaemon>>() {
}.getType()); }.getType());
Log.i(ColorApplication.TAG, "Loaded " + ledDDaemons.size() + " Daemons from preferences"); Timber.i("Loaded " + ledDDaemons.size() + " Daemons from preferences");
for (final LedDDaemon ledDDaemon : ledDDaemons) { for (final LedDDaemon ledDDaemon : ledDDaemons) {
final LedDHelper helper = new LedDHelper(ledDDaemon, getApplicationContext()); final LedDHelper helper = new LedDHelper(ledDDaemon, getApplicationContext());

View File

@@ -1,38 +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/>.
*/
package com.idlegandalf.ledd;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.idlegandalf.ledd.fragments.SettingsFragment;
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
// Display the fragment as the main content.
getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
}
}

View File

@@ -20,8 +20,8 @@ package com.idlegandalf.ledd.callbacks;
import com.idlegandalf.ledd.components.LedStripe; import com.idlegandalf.ledd.components.LedStripe;
public interface RecieveColorCallback extends BaseCallback { public interface ReceiveColorCallback extends BaseCallback {
void onColorRecieved(LedStripe stripe); void onColorReceived(LedStripe stripe);
void onRecievFailed(int code, String msg); void onReceiveFailed(int code, String msg);
} }

View File

@@ -33,8 +33,4 @@ public class HSV {
this.saturation = s; this.saturation = s;
this.value = v; this.value = v;
} }
public HSV() {
}
} }

View File

@@ -50,10 +50,7 @@ public class LedDDaemon {
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (o instanceof LedDDaemon) { return o instanceof LedDDaemon && address.equals(((LedDDaemon) o).address) && port == ((LedDDaemon) o).port;
if (address.equals(((LedDDaemon) o).address) && port == ((LedDDaemon) o).port) return true;
}
return false;
} }
@Override @Override

View File

@@ -19,12 +19,12 @@
package com.idlegandalf.ledd.components; package com.idlegandalf.ledd.components;
import android.graphics.Color; import android.graphics.Color;
import android.support.annotation.Nullable;
import com.idlegandalf.ledd.ColorApplication; import com.idlegandalf.ledd.ColorApplication;
import com.idlegandalf.ledd.callbacks.RecieveColorCallback; import com.idlegandalf.ledd.callbacks.ReceiveColorCallback;
import com.idlegandalf.ledd.helper.LedDHelper; import com.idlegandalf.ledd.helper.LedDHelper;
import hugo.weaving.DebugLog;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -69,7 +69,6 @@ public class LedStripe {
return String.format("%s->%s->%s (%d|%d|%d)", ledDDaemon, controller.getAddress(), name, channelRed, channelGreen, channelBlue); return String.format("%s->%s->%s (%d|%d|%d)", ledDDaemon, controller.getAddress(), name, channelRed, channelGreen, channelBlue);
} }
@DebugLog
public void setColor(int color) { public void setColor(int color) {
float[] hsv = new float[3]; float[] hsv = new float[3];
Color.colorToHSV(color, hsv); Color.colorToHSV(color, hsv);
@@ -89,14 +88,29 @@ public class LedStripe {
} }
} }
@DebugLog public void getColor(@Nullable final ReceiveColorCallback callback) {
public void getColor(RecieveColorCallback callback) {
checkHelper(); checkHelper();
helper.getColor(this, callback); helper.getColor(this, new ReceiveColorCallback() {
@Override
public void onColorReceived(LedStripe stripe) {
color = stripe.getColor();
if (callback != null)
callback.onColorReceived(LedStripe.this);
}
@Override
public void onReceiveFailed(int code, String msg) {
if (callback != null) callback.onReceiveFailed(code, msg);
}
@Override
public void onConnectionFailed(String message) {
if (callback != null) callback.onConnectionFailed(message);
}
});
} }
@DebugLog
public boolean isOn() { public boolean isOn() {
return color != null && color.getValue() != 0.0; return color != null && color.getValue() != 0.0;
} }

View File

@@ -0,0 +1,22 @@
package com.idlegandalf.ledd.components;
import android.util.SparseArray;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Profile {
private SparseArray<HSV> values;
private String name;
public Profile(SparseArray<HSV> hsvHashMap) {
setValues(hsvHashMap);
}
public Profile(String name) {
setValues(new SparseArray<HSV>());
setName(name);
}
}

View File

@@ -22,8 +22,6 @@ import android.app.Dialog;
import android.app.DialogFragment; import android.app.DialogFragment;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputLayout;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
@@ -31,6 +29,8 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.EditText; import android.widget.EditText;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.textfield.TextInputLayout;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.idlegandalf.ledd.ColorApplication; import com.idlegandalf.ledd.ColorApplication;
import com.idlegandalf.ledd.R; import com.idlegandalf.ledd.R;
@@ -42,22 +42,22 @@ import com.idlegandalf.ledd.helper.LedDHelper;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.text.ParsePosition; import java.text.ParsePosition;
import butterknife.Bind; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
public class AddControllerDialog extends DialogFragment implements DialogInterface.OnShowListener { public class AddControllerDialog extends DialogFragment implements DialogInterface.OnShowListener {
@Bind(R.id.input_i2c_layout) @BindView(R.id.input_i2c_layout)
TextInputLayout i2cLayout; TextInputLayout i2cLayout;
@Bind(R.id.input_i2c) @BindView(R.id.input_i2c)
EditText i2cText; EditText i2cText;
@Bind(R.id.input_address_layout) @BindView(R.id.input_address_layout)
TextInputLayout addressLayout; TextInputLayout addressLayout;
@Bind(R.id.input_address) @BindView(R.id.input_address)
EditText addressText; EditText addressText;
@Bind(R.id.input_channel_layout) @BindView(R.id.input_channel_layout)
TextInputLayout channelLayout; TextInputLayout channelLayout;
@Bind(R.id.input_channel) @BindView(R.id.input_channel)
EditText channelText; EditText channelText;
LedDDaemon dDaemon; LedDDaemon dDaemon;
@@ -140,80 +140,59 @@ public class AddControllerDialog extends DialogFragment implements DialogInterfa
} }
}); });
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() { alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(v -> {
@Override // TODO: AddStripeDialog.instance.onResume();
public void onClick(View v) { alertDialog.dismiss();
AddStripeDialog.instance.onResume();
alertDialog.dismiss();
}
}); });
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> {
@Override if (i2cText.getText().toString().isEmpty() || !isNumeric(i2cText.getText().toString())) {
public void onClick(View v) { i2cLayout.setError("No valid i2c device number");
if (i2cText.getText().toString().isEmpty() || !isNumeric(i2cText.getText().toString())) { return;
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]+")) { if (!addressText.getText().toString().contains("0x") || !addressText.getText().toString().split("x")[1].matches("-?[0-9a-fA-F]+")) {
addressLayout.setError("No valid hexdecimal address"); addressLayout.setError("No valid hexdecimal address");
return; return;
} }
if (channelText.getText().toString().isEmpty() || !isNumeric(channelText.getText().toString()) && Integer.parseInt(channelText if (channelText.getText().toString().isEmpty() || !isNumeric(channelText.getText().toString()) && Integer.parseInt(channelText
.getText().toString()) <= 0) { .getText().toString()) <= 0) {
channelLayout.setError("No valid channel amount"); channelLayout.setError("No valid channel amount");
return; return;
} }
Controller c = new Controller(); Controller c = new Controller();
c.setAddress(addressText.getText().toString()); c.setAddress(addressText.getText().toString());
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 = ColorApplication.getInstance().getHelperForDaemon(dDaemon); LedDHelper helper = ColorApplication.getInstance().getHelperForDaemon(dDaemon);
if (helper != null) { if (helper != null) {
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(() -> 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());
@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); dDaemon.getControllers().add(controller);
dismiss(); dismiss();
} }
@Override @Override
public void onAddFailed(final int code, final String msg) { public void onAddFailed(final int code, final String msg) {
getActivity().runOnUiThread(new Runnable() { getActivity().runOnUiThread(() -> Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0), getActivity().getString(R.string.snackbar_error) + msg, Snackbar.LENGTH_LONG).show());
@Override // TODO: AddStripeDialog.instance.onResume();
public void run() { dismiss();
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 @Override
public void onConnectionFailed(final String message) { public void onConnectionFailed(final String message) {
getActivity().runOnUiThread(new Runnable() { getActivity().runOnUiThread(() -> 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());
@Override // TODO: AddStripeDialog.instance.onResume();
public void run() { dismiss();
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();
}
});
}
} }
}); });
} }

View File

@@ -25,8 +25,6 @@ import android.content.DialogInterface;
import android.net.nsd.NsdManager; import android.net.nsd.NsdManager;
import android.net.nsd.NsdServiceInfo; import android.net.nsd.NsdServiceInfo;
import android.os.Bundle; import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputLayout;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
@@ -38,6 +36,8 @@ import android.widget.EditText;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.textfield.TextInputLayout;
import com.google.common.net.InetAddresses; import com.google.common.net.InetAddresses;
import com.idlegandalf.ledd.ColorActivity; import com.idlegandalf.ledd.ColorActivity;
import com.idlegandalf.ledd.ColorApplication; import com.idlegandalf.ledd.ColorApplication;
@@ -49,18 +49,18 @@ import java.net.Inet4Address;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import butterknife.Bind; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
public class AddDaemonDialog extends DialogFragment implements DialogInterface.OnShowListener, NsdManager.DiscoveryListener { public class AddDaemonDialog extends DialogFragment implements DialogInterface.OnShowListener, NsdManager.DiscoveryListener {
private final String SERVICE_TYPE = "_ledd._tcp."; private final String SERVICE_TYPE = "_ledd._tcp.";
@Bind(R.id.input_ip) @BindView(R.id.input_ip)
EditText ip; EditText ip;
@Bind(R.id.input_ip_layout) @BindView(R.id.input_ip_layout)
TextInputLayout ip_lay; TextInputLayout ip_lay;
@Bind(R.id.host_container) @BindView(R.id.host_container)
LinearLayout hostContainer; LinearLayout hostContainer;
List<LedDDaemon> ledDDaemons = new ArrayList<>(); List<LedDDaemon> ledDDaemons = new ArrayList<>();
NsdManager mNsdManager; NsdManager mNsdManager;
@@ -108,46 +108,40 @@ public class AddDaemonDialog extends DialogFragment implements DialogInterface.O
} }
}); });
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() { alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(v -> {
@Override mNsdManager.stopServiceDiscovery(AddDaemonDialog.this);
public void onClick(View v) { // TODO: AddStripeDialog.instance.onResume();
mNsdManager.stopServiceDiscovery(AddDaemonDialog.this); alertDialog.dismiss();
AddStripeDialog.instance.onResume();
alertDialog.dismiss();
}
}); });
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> {
@Override String strIp = ip.getText().toString();
public void onClick(View v) { int port;
String strIp = ip.getText().toString();
int port;
if (strIp.contains(":")) { if (strIp.contains(":")) {
strIp = strIp.split(":")[0]; strIp = strIp.split(":")[0];
try { try {
port = Integer.parseInt(ip.getText().toString().split(":")[1]); port = Integer.parseInt(ip.getText().toString().split(":")[1]);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
ip_lay.setError("Please check your port"); ip_lay.setError("Please check your port");
return; return;
}
if (port < 1024 || port > 65535) {
ip_lay.setError("Port is out of range");
return;
}
} else {
port = 1425;
} }
if (InetAddresses.isInetAddress(strIp)) { if (port < 1024 || port > 65535) {
LedDDaemon daemon = new LedDDaemon(strIp, port); ip_lay.setError("Port is out of range");
return;
if (!ledDDaemons.contains(daemon)) addDaemon(new LedDDaemon(strIp, port));
else ip_lay.setError("Daemon already exist");
} else {
ip_lay.setError("No valid ip address");
} }
} else {
port = 1425;
}
if (InetAddresses.isInetAddress(strIp)) {
LedDDaemon daemon = new LedDDaemon(strIp, port);
if (!ledDDaemons.contains(daemon)) addDaemon(new LedDDaemon(strIp, port));
else ip_lay.setError("Daemon already exist");
} else {
ip_lay.setError("No valid ip address");
} }
}); });
} }
@@ -195,49 +189,43 @@ public class AddDaemonDialog extends DialogFragment implements DialogInterface.O
final LedDDaemon nLedDDaemon = new LedDDaemon(serviceInfo.getHost().getHostAddress(), serviceInfo.getPort()); final LedDDaemon nLedDDaemon = new LedDDaemon(serviceInfo.getHost().getHostAddress(), serviceInfo.getPort());
if (!ledDDaemons.contains(nLedDDaemon)) { if (!ledDDaemons.contains(nLedDDaemon)) {
getActivity().runOnUiThread(new Runnable() { getActivity().runOnUiThread(() -> {
@Override View v = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout
public void run() { .host_row, hostContainer, false);
View v = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout
.host_row, hostContainer, false);
TextView host = (TextView) v.findViewById(R.id.text_host); TextView host = (TextView) v.findViewById(R.id.text_host);
host.setText(nLedDDaemon.toString()); host.setText(nLedDDaemon.toString());
if (ColorApplication.getInstance().getDaemons().contains(nLedDDaemon)) { if (ColorApplication.getInstance().getDaemons().contains(nLedDDaemon)) {
v.setEnabled(false); v.setEnabled(false);
host.setEnabled(false); host.setEnabled(false);
}
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (v.isEnabled()) {
LedDDaemon d;
if (v instanceof TextView) {
d = (LedDDaemon) ((LinearLayout) v.getParent()).getTag();
} else {
d = (LedDDaemon) v.getTag();
}
if (d != null) {
addDaemon(d);
}
}
}
};
v.setOnClickListener(listener);
host.setOnClickListener(listener);
v.setTag(nLedDDaemon);
ledDDaemons.add(nLedDDaemon);
hostContainer.addView(v);
} }
View.OnClickListener listener = v1 -> {
if (v1.isEnabled()) {
LedDDaemon d;
if (v1 instanceof TextView) {
d = (LedDDaemon) ((LinearLayout) v1.getParent()).getTag();
} else {
d = (LedDDaemon) v1.getTag();
}
if (d != null) {
addDaemon(d);
}
}
};
v.setOnClickListener(listener);
host.setOnClickListener(listener);
v.setTag(nLedDDaemon);
ledDDaemons.add(nLedDDaemon);
hostContainer.addView(v);
}); });
} }
} }
@@ -286,28 +274,18 @@ public class AddDaemonDialog extends DialogFragment implements DialogInterface.O
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(() -> 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());
@Override // TODO: AddStripeDialog.instance.onResume();
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(); dismiss();
} }
@Override @Override
public void onDiscoverSuccessfully(final String version) { public void onDiscoverSuccessfully(final String version) {
getActivity().runOnUiThread(new Runnable() { getActivity().runOnUiThread(() -> Snackbar.make(((ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0),
@Override getActivity().getString(R.string.snackbar_added_daemon_version, version), Snackbar.LENGTH_LONG).show());
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(); ((ColorActivity) getActivity()).refreshStripes();
AddStripeDialog.instance.onResume(); // TODO: AddStripeDialog.instance.onResume();
dismiss(); dismiss();
} }
}); });

View File

@@ -0,0 +1,142 @@
package com.idlegandalf.ledd.fragments;
/*
* 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/>.
*/
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.google.android.material.textfield.TextInputLayout;
import com.idlegandalf.ledd.ColorActivity;
import com.idlegandalf.ledd.R;
import com.idlegandalf.ledd.components.LedStripe;
import com.idlegandalf.ledd.components.Profile;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
public class AddProfileDialog extends DialogFragment implements DialogInterface.OnShowListener {
@BindView(R.id.input_profile_name_layout)
TextInputLayout nameLayout;
@BindView(R.id.input_profile_name)
EditText nameText;
@BindView(R.id.container_linlay)
LinearLayout checkboxContainer;
List<LedStripe> mStripes;
List<CheckBox> mCheckboxes;
public Dialog onCreateDialog(Bundle savedInstanceState) {
View v = View.inflate(getActivity(), R.layout.fragment_addprofile, null);
ButterKnife.bind(this, v);
mStripes = ((ColorActivity) getActivity()).getStripes();
mCheckboxes = new ArrayList<>();
if (mStripes != null) {
for (LedStripe ledStripe : mStripes) {
CheckBox nC = (CheckBox) View.inflate(getActivity(), R.layout.fragment_addprofile_item, null);
nC.setText(ledStripe.getName());
mCheckboxes.add(nC);
checkboxContainer.addView(nC);
}
}
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(v).setPositiveButton("Save", null).setNegativeButton("Cancel", null);
AlertDialog dialog = builder.create();
dialog.setOnShowListener(this);
return dialog;
}
@Override
public void onShow(final DialogInterface dialog) {
final AlertDialog alertDialog = (AlertDialog) dialog;
nameText.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) {
nameLayout.setError(null);
}
});
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(v -> alertDialog.dismiss());
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> {
if (nameText.getText().toString().isEmpty()) {
nameLayout.setError("Please enter a name");
return;
}
int checked = 0;
for (CheckBox c : mCheckboxes) {
if (c.isChecked()) {
checked++;
mStripes.get(checkboxContainer.indexOfChild(c)).getColor();
}
}
if (checked < 2) {
Toast.makeText(getActivity(), "Please select at least two stripes for your profile", Toast.LENGTH_LONG).show();
return;
}
Profile profile = new Profile(nameText.getText().toString());
mCheckboxes.stream().filter(CompoundButton::isChecked).forEach(c -> {
LedStripe stripe = mStripes.get(checkboxContainer.indexOfChild(c));
profile.getValues().append(stripe.getId(), stripe.getColor());
});
((ColorActivity) getActivity()).addProfile(profile);
Toast.makeText(getActivity(), "Added profile " + nameText.getText().toString(), Toast.LENGTH_SHORT).show();
dismiss();
});
}
}

View File

@@ -23,8 +23,6 @@ import android.app.Dialog;
import android.app.DialogFragment; import android.app.DialogFragment;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputLayout;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
@@ -39,6 +37,8 @@ import android.widget.RelativeLayout;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.Toast; import android.widget.Toast;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.textfield.TextInputLayout;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.idlegandalf.ledd.ColorActivity; import com.idlegandalf.ledd.ColorActivity;
import com.idlegandalf.ledd.ColorApplication; import com.idlegandalf.ledd.ColorApplication;
@@ -54,42 +54,41 @@ import java.text.NumberFormat;
import java.text.ParsePosition; import java.text.ParsePosition;
import java.util.List; import java.util.List;
import butterknife.Bind; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import butterknife.OnClick; import butterknife.OnClick;
public class AddStripeDialog extends DialogFragment implements DialogInterface.OnShowListener { public class AddStripeDialog extends DialogFragment implements DialogInterface.OnShowListener {
public static AddStripeDialog instance; @BindView(R.id.spinner_daemon)
@Bind(R.id.spinner_daemon)
Spinner daemonSpinner; Spinner daemonSpinner;
@Bind(R.id.spinner_controller) @BindView(R.id.spinner_controller)
Spinner controllerSpinner; Spinner controllerSpinner;
@Bind(R.id.choose_controller_lay) @BindView(R.id.choose_controller_lay)
RelativeLayout controllerLayout; RelativeLayout controllerLayout;
@Bind(R.id.input_stripe_name_lay) @BindView(R.id.input_stripe_name_lay)
TextInputLayout stripeNameLay; TextInputLayout stripeNameLay;
@Bind(R.id.input_stripe_name) @BindView(R.id.input_stripe_name)
EditText stripeNameText; EditText stripeNameText;
@Bind(R.id.input_channel_r_lay) @BindView(R.id.input_channel_r_lay)
TextInputLayout channelRLay; TextInputLayout channelRLay;
@Bind(R.id.input_channel_r) @BindView(R.id.input_channel_r)
EditText channelR; EditText channelR;
@Bind(R.id.input_channel_g_lay) @BindView(R.id.input_channel_g_lay)
TextInputLayout channelGLay; TextInputLayout channelGLay;
@Bind(R.id.input_channel_g) @BindView(R.id.input_channel_g)
EditText channelG; EditText channelG;
@Bind(R.id.input_channel_b_lay) @BindView(R.id.input_channel_b_lay)
TextInputLayout channelBLay; TextInputLayout channelBLay;
@Bind(R.id.input_channel_b) @BindView(R.id.input_channel_b)
EditText channelB; EditText channelB;
@Bind(R.id.stripe_mapping_lay) @BindView(R.id.stripe_mapping_lay)
LinearLayout stripeMapping; LinearLayout stripeMapping;
@Bind(R.id.imgbuttn_togglechannel_r) @BindView(R.id.imgbuttn_togglechannel_r)
ImageButton channelRBttn; ImageButton channelRBttn;
@Bind(R.id.imgbuttn_togglechannel_g) @BindView(R.id.imgbuttn_togglechannel_g)
ImageButton channelGBttn; ImageButton channelGBttn;
@Bind(R.id.imgbuttn_togglechannel_b) @BindView(R.id.imgbuttn_togglechannel_b)
ImageButton channelBBttn; ImageButton channelBBttn;
ArrayAdapter<LedDDaemon> daemonArrayAdapter; ArrayAdapter<LedDDaemon> daemonArrayAdapter;
ArrayAdapter<Controller> controllerArrayAdapter; ArrayAdapter<Controller> controllerArrayAdapter;
@@ -106,7 +105,6 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
View v = View.inflate(getActivity(), R.layout.fragment_addstripe, null); View v = View.inflate(getActivity(), R.layout.fragment_addstripe, null);
ButterKnife.bind(this, v); ButterKnife.bind(this, v);
instance = this;
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(v).setPositiveButton("Add", null).setNegativeButton("Cancel", null); builder.setView(v).setPositiveButton("Add", null).setNegativeButton("Cancel", null);
@@ -205,20 +203,17 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
} }
}); });
ImageButton.OnClickListener imgListener = new View.OnClickListener() { ImageButton.OnClickListener imgListener = v -> {
@Override switch (v.getId()) {
public void onClick(View v) { case R.id.imgbuttn_togglechannel_r:
switch (v.getId()) { testChannel(channelR, (ImageButton) v);
case R.id.imgbuttn_togglechannel_r: break;
testChannel(channelR, (ImageButton) v); case R.id.imgbuttn_togglechannel_g:
break; testChannel(channelG, (ImageButton) v);
case R.id.imgbuttn_togglechannel_g: break;
testChannel(channelG, (ImageButton) v); case R.id.imgbuttn_togglechannel_b:
break; testChannel(channelB, (ImageButton) v);
case R.id.imgbuttn_togglechannel_b: break;
testChannel(channelB, (ImageButton) v);
break;
}
} }
}; };
@@ -226,71 +221,53 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
channelGBttn.setOnClickListener(imgListener); channelGBttn.setOnClickListener(imgListener);
channelBBttn.setOnClickListener(imgListener); channelBBttn.setOnClickListener(imgListener);
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() { alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(v -> alertDialog.dismiss());
@Override
public void onClick(View v) { alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> {
alertDialog.dismiss(); if (!mDaemonSelected) {
Toast.makeText(getActivity(), "Please select Daemon and Controller", Toast.LENGTH_LONG).show();
return;
} }
});
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { if (stripeNameText.getText().toString().isEmpty()) {
@Override stripeNameLay.setError("Please set the Stripe name");
public void onClick(View v) { return;
if (!mDaemonSelected) { }
Toast.makeText(getActivity(), "Please select Daemon and Controller", Toast.LENGTH_LONG).show();
return;
}
if (stripeNameText.getText().toString().isEmpty()) { if (channelR.getText().toString().isEmpty() || channelG.getText().toString().isEmpty() || channelB.getText().toString().isEmpty()) {
stripeNameLay.setError("Please set the Stripe name"); Toast.makeText(getActivity(), "Please add mapping for all channels", Toast.LENGTH_LONG).show();
return; return;
} }
if (channelR.getText().toString().isEmpty() || channelG.getText().toString().isEmpty() || channelB.getText().toString().isEmpty()) { LedStripe stripe = new LedStripe(Integer.parseInt(channelR.getText().toString()), Integer.parseInt(channelG.getText().toString()),
Toast.makeText(getActivity(), "Please add mapping for all channels", Toast.LENGTH_LONG).show(); Integer.parseInt(channelB.getText().toString()), stripeNameText.getText().toString());
return; stripe.setLedDDaemon((LedDDaemon) daemonSpinner.getSelectedItem());
} stripe.setController((Controller) controllerSpinner.getSelectedItem());
LedStripe stripe = new LedStripe(Integer.parseInt(channelR.getText().toString()), Integer.parseInt(channelG.getText().toString()), LedDHelper helper = ColorApplication.getInstance().getHelperForDaemon((LedDDaemon) daemonSpinner.getSelectedItem());
Integer.parseInt(channelB.getText().toString()), stripeNameText.getText().toString());
stripe.setLedDDaemon((LedDDaemon) daemonSpinner.getSelectedItem());
stripe.setController((Controller) controllerSpinner.getSelectedItem());
LedDHelper helper = ColorApplication.getInstance().getHelperForDaemon((LedDDaemon) daemonSpinner.getSelectedItem()); if (helper != null) {
helper.addStripe(stripe, new AddStripeCallback() {
@Override
public void onAddSuccessfully(final LedStripe stripe) {
ColorActivity activity = ((ColorActivity) getActivity());
activity.refreshStripes();
if (helper != null) { getActivity().runOnUiThread(() -> 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());
helper.addStripe(stripe, new AddStripeCallback() { dismiss();
@Override }
public void onAddSuccessfully(final LedStripe stripe) {
ColorActivity activity = ((ColorActivity) getActivity());
activity.refreshStripes();
getActivity().runOnUiThread(new Runnable() { @Override
@Override public void onAddFailed(int code, String msg) {
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();
}
@Override }
public void onAddFailed(int code, String msg) {
} @Override
public void onConnectionFailed(final String message) {
@Override getActivity().runOnUiThread(() -> 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());
public void onConnectionFailed(final String message) { dismiss();
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();
}
});
}
} }
}); });
@@ -359,17 +336,14 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
super.onResume(); super.onResume();
ColorApplication.getInstance().onResume(); ColorApplication.getInstance().onResume();
getActivity().runOnUiThread(new Runnable() { getActivity().runOnUiThread(() -> {
@Override if (daemonArrayAdapter != null) {
public void run() { daemonArrayAdapter.clear();
if (daemonArrayAdapter != null) { daemonArrayAdapter.addAll(ColorApplication.getInstance().getDaemons());
daemonArrayAdapter.clear(); }
daemonArrayAdapter.addAll(ColorApplication.getInstance().getDaemons());
}
if (controllerArrayAdapter != null && mDaemonSelected) { if (controllerArrayAdapter != null && mDaemonSelected) {
refreshController((LedDDaemon) daemonSpinner.getSelectedItem()); refreshController((LedDDaemon) daemonSpinner.getSelectedItem());
}
} }
}); });
} }
@@ -409,12 +383,9 @@ public class AddStripeDialog extends DialogFragment implements DialogInterface.O
helper.getStripes(new StripesCallback() { helper.getStripes(new StripesCallback() {
@Override @Override
public void onSuccess(List<LedStripe> stripes) { public void onSuccess(List<LedStripe> stripes) {
getActivity().runOnUiThread(new Runnable() { getActivity().runOnUiThread(() -> {
@Override controllerArrayAdapter.addAll(ledDDaemon.getControllers());
public void run() { toggleAll(stripeMapping, true);
controllerArrayAdapter.addAll(ledDDaemon.getControllers());
toggleAll(stripeMapping, true);
}
}); });
} }

View File

@@ -23,13 +23,11 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.ServiceConnection; import android.content.ServiceConnection;
import android.os.IBinder; import android.os.IBinder;
import android.util.Log;
import com.idlegandalf.ledd.ColorApplication;
import com.idlegandalf.ledd.callbacks.AddControllerCallback; import com.idlegandalf.ledd.callbacks.AddControllerCallback;
import com.idlegandalf.ledd.callbacks.AddStripeCallback; import com.idlegandalf.ledd.callbacks.AddStripeCallback;
import com.idlegandalf.ledd.callbacks.DiscoverCallback; import com.idlegandalf.ledd.callbacks.DiscoverCallback;
import com.idlegandalf.ledd.callbacks.RecieveColorCallback; import com.idlegandalf.ledd.callbacks.ReceiveColorCallback;
import com.idlegandalf.ledd.callbacks.StripesCallback; import com.idlegandalf.ledd.callbacks.StripesCallback;
import com.idlegandalf.ledd.components.AnswerTask; import com.idlegandalf.ledd.components.AnswerTask;
import com.idlegandalf.ledd.components.Controller; import com.idlegandalf.ledd.components.Controller;
@@ -53,6 +51,8 @@ import java.util.Map;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import timber.log.Timber;
public class LedDHelper { public class LedDHelper {
final String ACTION_SETCOLOR = "set_color"; final String ACTION_SETCOLOR = "set_color";
final String ACTION_GETCOLOR = "get_color"; final String ACTION_GETCOLOR = "get_color";
@@ -70,7 +70,7 @@ public class LedDHelper {
@Override @Override
public void onServiceConnected(ComponentName className, IBinder service) { public void onServiceConnected(ComponentName className, IBinder service) {
Log.d(ColorApplication.TAG, "ColorService bound!"); Timber.d("ColorService bound!");
requestWorker = new Worker<>(dRequests, (ColorService.ColorBinder) service, ledDDaemon); requestWorker = new Worker<>(dRequests, (ColorService.ColorBinder) service, ledDDaemon);
mBound = true; mBound = true;
new Thread(requestWorker).start(); new Thread(requestWorker).start();
@@ -215,7 +215,7 @@ public class LedDHelper {
* *
* @param ledStripe Stripe * @param ledStripe Stripe
*/ */
public void getColor(final LedStripe ledStripe, final RecieveColorCallback callback) { public void getColor(final LedStripe ledStripe, final ReceiveColorCallback callback) {
HashMap<String, Object> params = new HashMap<>(); HashMap<String, Object> params = new HashMap<>();
params.put("sid", ledStripe.getId()); params.put("sid", ledStripe.getId());
@@ -232,19 +232,18 @@ public class LedDHelper {
JSONObject json = new JSONObject(response.getResult().toString()); JSONObject json = new JSONObject(response.getResult().toString());
JSONArray hsv = json.getJSONArray("color"); JSONArray hsv = json.getJSONArray("color");
if (hsv.length() == 3) { 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.onColorReceived(ledStripe);
} else { } else {
callback.onRecievFailed(-1, "HSV was empty"); callback.onReceiveFailed(-1, "HSV was empty");
} }
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
callback.onRecievFailed(-1, "Unhandeled JSON Exception"); callback.onReceiveFailed(-1, "Unhandeled JSON Exception");
} }
} else { } else {
@SuppressWarnings("ThrowableResultOfMethodCallIgnored") JSONRPC2Error error = response.getError(); @SuppressWarnings("ThrowableResultOfMethodCallIgnored") JSONRPC2Error error = response.getError();
callback.onRecievFailed(error.getCode(), error.getMessage()); callback.onReceiveFailed(error.getCode(), error.getMessage());
} }
} }
}); });

View File

@@ -31,7 +31,6 @@ import com.koushikdutta.async.AsyncSocket;
import com.koushikdutta.async.ByteBufferList; import com.koushikdutta.async.ByteBufferList;
import com.koushikdutta.async.DataEmitter; 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.DataCallback; import com.koushikdutta.async.callback.DataCallback;
import com.thetransactioncompany.jsonrpc2.JSONRPC2ParseException; import com.thetransactioncompany.jsonrpc2.JSONRPC2ParseException;
import com.thetransactioncompany.jsonrpc2.JSONRPC2Request; import com.thetransactioncompany.jsonrpc2.JSONRPC2Request;
@@ -55,7 +54,7 @@ public class ColorService extends Service {
@Override @Override
public int onStartCommand(Intent intent, int flags, int startId) { public int onStartCommand(Intent intent, int flags, int startId) {
return -1; return Service.START_STICKY;
} }
@Override @Override
@@ -136,32 +135,26 @@ public class ColorService extends Service {
null); null);
sendableHashMap.put((String) sendable.getRequest().getID(), sendable); sendableHashMap.put((String) sendable.getRequest().getID(), sendable);
if (!poolExecutor.isTerminating() && !poolExecutor.isTerminated()) if (!poolExecutor.isTerminating() && !poolExecutor.isTerminated())
timeoutHashMap.put((String) sendable.getRequest().getID(), poolExecutor.schedule(new Runnable() { timeoutHashMap.put((String) sendable.getRequest().getID(), poolExecutor.schedule(() -> {
@Override sendable.onNoResponse();
public void run() { timeoutHashMap.remove(sendable.getRequest().getID());
sendable.onNoResponse(); sendableHashMap.remove(sendable.getRequest().getID());
timeoutHashMap.remove(sendable.getRequest().getID());
sendableHashMap.remove(sendable.getRequest().getID());
}
}, 1000, TimeUnit.MILLISECONDS)); }, 1000, TimeUnit.MILLISECONDS));
} else { } else {
socketHashMap.put(sendable.getRecipient(), null); socketHashMap.put(sendable.getRecipient(), null);
AsyncServer.getDefault().connectSocket(new InetSocketAddress(sendable.getRecipient().getAddress(), sendable AsyncServer.getDefault().connectSocket(new InetSocketAddress(sendable.getRecipient().getAddress(), sendable
.getRecipient().getPort()), new ConnectCallback() { .getRecipient().getPort()), (ex, socket) -> {
@Override if (ex == null) {
public void onConnectCompleted(Exception ex, final AsyncSocket socket) { socket.setDataCallback(dataCallback);
if (ex == null) {
socket.setDataCallback(dataCallback);
socketHashMap.put(sendable.getRecipient(), socket); socketHashMap.put(sendable.getRecipient(), socket);
//if (!workQueue.contains(item)) -> needs equals implementation //if (!workQueue.contains(item)) -> needs equals implementation
workQueue.add(item); workQueue.add(item);
} else { } else {
sendable.onConnectionFailed(ex.getMessage()); sendable.onConnectionFailed(ex.getMessage());
} }
} });
});
} }
} }
} catch (InterruptedException ex) { } catch (InterruptedException ex) {

View File

@@ -1,146 +0,0 @@
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);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 933 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 436 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 355 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 522 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 573 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 436 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 702 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 355 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 653 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 678 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 814 B

View File

@@ -16,58 +16,26 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>. ~ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<!-- The main content view -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <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:id="@+id/main_layout"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
android:orientation="vertical"> android:orientation="vertical">
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" <Toolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
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:titleTextColor="@android:color/black" />
</android.support.v7.widget.Toolbar> <com.github.madrapps.HSLColorPicker
<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.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.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>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?><!--
<!--
~ LEDD Project ~ LEDD Project
~ Copyright (C) 2015 LEDD Team ~ Copyright (C) 2015 LEDD Team
~ ~
@@ -18,15 +17,16 @@
--> -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content" xmlns:tools="http://schemas.android.com/tools"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:focusableInTouchMode="true" android:layout_height="wrap_content"
android:minWidth="350dp" android:focusableInTouchMode="true"
android:orientation="vertical" android:minWidth="350dp"
android:paddingLeft="15dp" android:orientation="vertical"
android:paddingRight="15dp" android:paddingLeft="15dp"
android:paddingTop="15dp"> android:paddingTop="15dp"
android:paddingRight="15dp">
<RelativeLayout <RelativeLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
@@ -36,68 +36,68 @@
android:id="@+id/img_host" android:id="@+id/img_host"
android:layout_width="35dp" android:layout_width="35dp"
android:layout_height="35dp" android:layout_height="35dp"
android:src="@drawable/ic_developer_board_black_48dp"/> android:src="@drawable/ic_developer_board_black_48dp"
tools:ignore="ContentDescription" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignBottom="@id/img_host"
android:layout_alignTop="@id/img_host" android:layout_alignTop="@id/img_host"
android:layout_marginLeft="7dp" android:layout_alignBottom="@id/img_host"
android:layout_toRightOf="@id/img_host" android:layout_marginStart="7dp"
android:layout_toEndOf="@id/img_host"
android:gravity="center" android:gravity="center"
android:text="@string/text_add_controller" android:text="@string/text_add_controller"
android:textAppearance="?android:textAppearanceMedium" android:textAppearance="?android:textAppearanceMedium" />
/>
</RelativeLayout> </RelativeLayout>
<android.support.design.widget.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/input_i2c_layout" android:id="@+id/input_i2c_layout"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="15dp" android:layout_marginTop="15dp"
app:errorEnabled="true"> app:errorEnabled="true">
<EditText <com.google.android.material.textfield.TextInputEditText
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="@string/hint_i2c_device" android:hint="@string/hint_i2c_device"
android:inputType="number" android:inputType="number"
android:minWidth="350dp"/> android:minWidth="350dp" />
</android.support.design.widget.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<android.support.design.widget.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/input_address_layout" android:id="@+id/input_address_layout"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
app:errorEnabled="true"> app:errorEnabled="true">
<EditText <com.google.android.material.textfield.TextInputEditText
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="@string/hint_controller_address" android:hint="@string/hint_controller_address"
android:minWidth="350dp"/> android:minWidth="350dp" />
</android.support.design.widget.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<android.support.design.widget.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/input_channel_layout" android:id="@+id/input_channel_layout"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
app:errorEnabled="true"> app:errorEnabled="true">
<EditText <com.google.android.material.textfield.TextInputEditText
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="@string/hint_channels" android:hint="@string/hint_channels"
android:inputType="number" android:inputType="number"
android:minWidth="350dp"/> android:minWidth="350dp" />
</android.support.design.widget.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
</LinearLayout> </LinearLayout>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?><!--
<!--
~ LEDD Project ~ LEDD Project
~ Copyright (C) 2015 LEDD Team ~ Copyright (C) 2015 LEDD Team
~ ~
@@ -18,15 +17,16 @@
--> -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content" xmlns:tools="http://schemas.android.com/tools"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:focusableInTouchMode="true" android:layout_height="wrap_content"
android:minWidth="250dp" android:focusableInTouchMode="true"
android:orientation="vertical" android:minWidth="250dp"
android:paddingLeft="15dp" android:orientation="vertical"
android:paddingRight="15dp" android:paddingLeft="15dp"
android:paddingTop="15dp"> android:paddingRight="15dp"
android:paddingTop="15dp">
<RelativeLayout <RelativeLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
@@ -36,27 +36,29 @@
android:id="@+id/img_host" android:id="@+id/img_host"
android:layout_width="35dp" android:layout_width="35dp"
android:layout_height="35dp" android:layout_height="35dp"
android:src="@drawable/ic_computer_black_48dp"/> android:src="@drawable/ic_computer_black_48dp"
tools:ignore="ContentDescription" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignBottom="@id/img_host" android:layout_alignBottom="@id/img_host"
android:layout_alignTop="@id/img_host" android:layout_alignTop="@id/img_host"
android:layout_marginLeft="7dp" android:layout_marginStart="7dp"
android:layout_toRightOf="@id/img_host" android:layout_toEndOf="@id/img_host"
android:gravity="center" android:layout_toStartOf="@id/progress_daemon"
android:gravity="start|center_vertical"
android:text="@string/text_choose_daemon" android:text="@string/text_choose_daemon"
android:textAppearance="?android:textAppearanceMedium" android:textAppearance="?android:textAppearanceMedium" />
/>
<ProgressBar <ProgressBar
android:id="@+id/progress_daemon"
android:layout_width="35dp" android:layout_width="35dp"
android:layout_height="35dp" android:layout_height="35dp"
android:layout_alignParentRight="true" android:layout_alignParentEnd="true"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_marginLeft="5dp" android:layout_marginStart="5dp"
android:indeterminate="true"/> android:indeterminate="true" />
</RelativeLayout> </RelativeLayout>
@@ -70,7 +72,7 @@
android:id="@+id/host_container" android:id="@+id/host_container"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"/> android:orientation="vertical" />
</ScrollView> </ScrollView>
@@ -81,20 +83,20 @@
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:text="@string/text_or" android:text="@string/text_or"
android:textAppearance="?android:textAppearanceMedium"/> android:textAppearance="?android:textAppearanceMedium" />
<android.support.design.widget.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/input_ip_layout" android:id="@+id/input_ip_layout"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:errorEnabled="true"> app:errorEnabled="true">
<EditText <com.google.android.material.textfield.TextInputEditText
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="@string/hint_daemon_ip_port" android:hint="@string/hint_daemon_ip_port"
android:minWidth="250dp"/> android:minWidth="250dp" />
</android.support.design.widget.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
</LinearLayout> </LinearLayout>

View File

@@ -0,0 +1,90 @@
<?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"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusableInTouchMode="true"
android:minWidth="350dp"
android:orientation="vertical"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:paddingTop="15dp">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/img_host"
android:layout_width="35dp"
android:layout_height="35dp"
android:src="@drawable/ic_save_black_48dp"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/img_host"
android:layout_alignTop="@id/img_host"
android:layout_marginStart="7dp"
android:layout_toEndOf="@id/img_host"
android:gravity="center"
android:text="@string/add_profile"
android:textAppearance="?android:textAppearanceMedium" />
</RelativeLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/choose_stripes_to_include" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp">
<LinearLayout
android:id="@+id/container_linlay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</ScrollView>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/input_profile_name_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
app:errorEnabled="true">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/input_profile_name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/profile_name"
android:inputType="text"
android:minWidth="350dp" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp" />

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?><!--
<!--
~ LEDD Project ~ LEDD Project
~ Copyright (C) 2015 LEDD Team ~ Copyright (C) 2015 LEDD Team
~ ~
@@ -18,15 +17,16 @@
--> -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content" xmlns:tools="http://schemas.android.com/tools"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:focusableInTouchMode="true" android:layout_height="wrap_content"
android:minWidth="250dp" android:focusableInTouchMode="true"
android:orientation="vertical" android:minWidth="250dp"
android:paddingLeft="15dp" android:orientation="vertical"
android:paddingRight="15dp" android:paddingLeft="15dp"
android:paddingTop="15dp"> android:paddingRight="15dp"
android:paddingTop="15dp">
<RelativeLayout <RelativeLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
@@ -36,19 +36,19 @@
android:id="@+id/img_host" android:id="@+id/img_host"
android:layout_width="25dp" android:layout_width="25dp"
android:layout_height="25dp" android:layout_height="25dp"
android:src="@drawable/ic_computer_black_48dp"/> android:src="@drawable/ic_computer_black_48dp"
tools:ignore="ContentDescription" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignBottom="@id/img_host" android:layout_alignBottom="@id/img_host"
android:layout_alignTop="@id/img_host" android:layout_alignTop="@id/img_host"
android:layout_marginLeft="7dp" android:layout_marginStart="7dp"
android:layout_toRightOf="@id/img_host" android:layout_toEndOf="@id/img_host"
android:gravity="center" android:gravity="center"
android:text="@string/text_choose_daemon" android:text="@string/text_choose_daemon"
android:textAppearance="?android:textAppearanceSmall" android:textAppearance="?android:textAppearanceSmall" />
/>
</RelativeLayout> </RelativeLayout>
@@ -62,20 +62,21 @@
android:id="@+id/imgbuttn_adddaemon" android:id="@+id/imgbuttn_adddaemon"
android:layout_width="28dp" android:layout_width="28dp"
android:layout_height="28dp" android:layout_height="28dp"
android:layout_alignParentRight="true" android:layout_alignParentEnd="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp" android:layout_marginStart="10dp"
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:src="@drawable/ic_add_circle_black_48dp"/> android:src="@drawable/ic_add_circle_black_48dp"
tools:ignore="ContentDescription" />
<Spinner <Spinner
android:id="@+id/spinner_daemon" android:id="@+id/spinner_daemon"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:layout_toLeftOf="@id/imgbuttn_adddaemon"/> android:layout_toStartOf="@id/imgbuttn_adddaemon" />
</RelativeLayout> </RelativeLayout>
@@ -89,19 +90,19 @@
android:id="@+id/img_controller" android:id="@+id/img_controller"
android:layout_width="25dp" android:layout_width="25dp"
android:layout_height="25dp" android:layout_height="25dp"
android:src="@drawable/ic_developer_board_black_48dp"/> android:src="@drawable/ic_developer_board_black_48dp"
tools:ignore="ContentDescription" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignBottom="@id/img_controller" android:layout_alignBottom="@id/img_controller"
android:layout_alignTop="@id/img_controller" android:layout_alignTop="@id/img_controller"
android:layout_marginLeft="7dp" android:layout_marginStart="7dp"
android:layout_toRightOf="@id/img_controller" android:layout_toEndOf="@id/img_controller"
android:gravity="center" android:gravity="center"
android:text="@string/text_choose_controller" android:text="@string/text_choose_controller"
android:textAppearance="?android:textAppearanceSmall" android:textAppearance="?android:textAppearanceSmall" />
/>
</RelativeLayout> </RelativeLayout>
@@ -115,20 +116,21 @@
android:id="@+id/imgbuttn_addcontroller" android:id="@+id/imgbuttn_addcontroller"
android:layout_width="28dp" android:layout_width="28dp"
android:layout_height="28dp" android:layout_height="28dp"
android:layout_alignParentRight="true" android:layout_alignParentEnd="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp" android:layout_marginStart="10dp"
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:src="@drawable/ic_add_circle_black_48dp"/> android:src="@drawable/ic_add_circle_black_48dp"
tools:ignore="ContentDescription" />
<Spinner <Spinner
android:id="@+id/spinner_controller" android:id="@+id/spinner_controller"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:layout_toLeftOf="@id/imgbuttn_addcontroller"/> android:layout_toStartOf="@id/imgbuttn_addcontroller" />
</RelativeLayout> </RelativeLayout>
@@ -141,53 +143,52 @@
android:id="@+id/img_stripe" android:id="@+id/img_stripe"
android:layout_width="25dp" android:layout_width="25dp"
android:layout_height="25dp" android:layout_height="25dp"
android:src="@drawable/ic_wb_iridescent_black_48dp"/> android:src="@drawable/ic_wb_iridescent_black_48dp"
tools:ignore="ContentDescription" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignBottom="@id/img_stripe" android:layout_alignBottom="@id/img_stripe"
android:layout_alignTop="@id/img_stripe" android:layout_alignTop="@id/img_stripe"
android:layout_marginLeft="7dp" android:layout_marginStart="7dp"
android:layout_toRightOf="@id/img_stripe" android:layout_toEndOf="@id/img_stripe"
android:gravity="center" android:gravity="center"
android:text="@string/text_stripe_properties" android:text="@string/text_stripe_properties"
android:textAppearance="?android:textAppearanceSmall" android:textAppearance="?android:textAppearanceSmall" />
/>
</RelativeLayout> </RelativeLayout>
<android.support.design.widget.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/input_stripe_name_lay" android:id="@+id/input_stripe_name_lay"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:layout_marginLeft="10dp" android:layout_marginStart="10dp"
android:layout_marginTop="15dp" android:layout_marginTop="15dp"
app:errorEnabled="true"> app:errorEnabled="true">
<EditText <com.google.android.material.textfield.TextInputEditText
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="@string/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> </com.google.android.material.textfield.TextInputLayout>
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="9dp" android:layout_marginStart="9dp"
android:layout_marginTop="15dp" android:layout_marginTop="15dp"
android:gravity="center" android:gravity="center"
android:text="@string/text_channel_mapping" android:text="@string/text_channel_mapping"
android:textAppearance="?android:textAppearanceSmall" android:textAppearance="?android:textAppearanceSmall" />
/>
<HorizontalScrollView <HorizontalScrollView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="10dp" android:layout_marginStart="10dp"
android:layout_marginTop="10dp"> android:layout_marginTop="10dp">
<LinearLayout <LinearLayout
@@ -196,79 +197,82 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal"> android:orientation="horizontal">
<android.support.design.widget.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/input_channel_r_lay" android:id="@+id/input_channel_r_lay"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<EditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/input_channel_r" android:id="@+id/input_channel_r"
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="@string/hint_channel_r" android:hint="@string/hint_channel_r"
android:inputType="number"/> android:inputType="number" />
</android.support.design.widget.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<ImageButton <ImageButton
android:id="@+id/imgbuttn_togglechannel_r" android:id="@+id/imgbuttn_togglechannel_r"
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" android:layout_height="24dp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginLeft="5dp" android:layout_marginStart="5dp"
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:src="@drawable/ic_visibility_off_black_48dp"/> android:src="@drawable/ic_visibility_off_black_48dp"
tools:ignore="ContentDescription" />
<android.support.design.widget.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/input_channel_g_lay" android:id="@+id/input_channel_g_lay"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="10dp"> android:layout_marginStart="10dp">
<EditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/input_channel_g" android:id="@+id/input_channel_g"
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="@string/hint_channel_g" android:hint="@string/hint_channel_g"
android:inputType="number"/> android:inputType="number" />
</android.support.design.widget.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<ImageButton <ImageButton
android:id="@+id/imgbuttn_togglechannel_g" android:id="@+id/imgbuttn_togglechannel_g"
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" android:layout_height="24dp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginLeft="5dp" android:layout_marginStart="5dp"
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:src="@drawable/ic_visibility_off_black_48dp"/> android:src="@drawable/ic_visibility_off_black_48dp"
tools:ignore="ContentDescription" />
<android.support.design.widget.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/input_channel_b_lay" android:id="@+id/input_channel_b_lay"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="10dp"> android:layout_marginStart="10dp">
<EditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/input_channel_b" android:id="@+id/input_channel_b"
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="@string/hint_channel_b" android:hint="@string/hint_channel_b"
android:inputType="number"/> android:inputType="number" />
</android.support.design.widget.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<ImageButton <ImageButton
android:id="@+id/imgbuttn_togglechannel_b" android:id="@+id/imgbuttn_togglechannel_b"
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" android:layout_height="24dp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginLeft="5dp" android:layout_marginStart="5dp"
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:src="@drawable/ic_visibility_off_black_48dp"/> android:src="@drawable/ic_visibility_off_black_48dp"
tools:ignore="ContentDescription" />
</LinearLayout> </LinearLayout>
</HorizontalScrollView> </HorizontalScrollView>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?><!--
<!--
~ LEDD Project ~ LEDD Project
~ Copyright (C) 2015 LEDD Team ~ Copyright (C) 2015 LEDD Team
~ ~
@@ -18,31 +17,36 @@
--> -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" xmlns:tools="http://schemas.android.com/tools"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:layout_marginTop="5dp" android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground" android:layout_marginTop="5dp"
android:clickable="true" android:background="?android:attr/selectableItemBackground"
android:gravity="center_horizontal" android:clickable="true"
android:orientation="horizontal" android:gravity="center_horizontal"
android:paddingLeft="7dp"> android:orientation="horizontal"
android:paddingStart="7dp"
android:focusable="true"
tools:ignore="RtlSymmetry">
<ImageView <ImageView
android:layout_width="25dp" android:layout_width="25dp"
android:layout_height="25dp" android:layout_height="25dp"
android:src="@drawable/ic_developer_board_black_48dp"/> android:src="@drawable/ic_developer_board_black_48dp"
tools:ignore="ContentDescription" />
<TextView <TextView
android:id="@+id/text_host" android:id="@+id/text_host"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp" android:layout_marginStart="10dp"
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="" android:text=""
android:textAppearance="?android:textAppearanceMedium" android:textAppearance="?android:textAppearanceMedium"
android:textColor="@color/primaryColorDark"/> android:textColor="@color/primaryColorDark"
android:focusable="true" />
</LinearLayout> </LinearLayout>

View File

@@ -1,86 +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/>.
-->
<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: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"/>
<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,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?><!--
<!--
~ LEDD Project ~ LEDD Project
~ Copyright (C) 2015 LEDD Team ~ Copyright (C) 2015 LEDD Team
~ ~
@@ -17,12 +16,11 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>. ~ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<CheckedTextView <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1" android:id="@android:id/text1"
style="?android:attr/spinnerDropDownItemStyle" style="?android:attr/spinnerDropDownItemStyle"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight" android:layout_height="?android:attr/listPreferredItemHeight"
android:ellipsize="marquee" android:ellipsize="marquee"
android:singleLine="true" android:singleLine="true"
android:textColor="@android:color/black"/> android:textColor="@android:color/black" />

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?><!--
<!--
~ LEDD Project ~ LEDD Project
~ Copyright (C) 2015 LEDD Team ~ Copyright (C) 2015 LEDD Team
~ ~
@@ -17,13 +16,12 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>. ~ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<TextView <TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1" android:id="@android:id/text1"
style="?android:attr/spinnerItemStyle" style="?android:attr/spinnerItemStyle"
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:ellipsize="marquee" android:ellipsize="marquee"
android:singleLine="true" android:singleLine="true"
android:textAlignment="inherit" android:textAlignment="inherit"
android:textColor="@android:color/black"/> android:textColor="@android:color/black" />

View File

@@ -46,5 +46,8 @@
<string name="snackbar_added_daemon_version">Added LedD Daemon version: %1$s</string> <string name="snackbar_added_daemon_version">Added LedD Daemon version: %1$s</string>
<string name="snackbar_added_stripe_id">Added Stripe (Id=%1$d)</string> <string name="snackbar_added_stripe_id">Added Stripe (Id=%1$d)</string>
<string name="snackbar_failed_add_stripe">Failed to add Stripe: </string> <string name="snackbar_failed_add_stripe">Failed to add Stripe: </string>
<string name="add_profile">Add Profile</string>
<string name="choose_stripes_to_include">Choose stripes to include</string>
<string name="profile_name">Profile name</string>
</resources> </resources>

View File

@@ -22,7 +22,7 @@
Base application theme, dependent on API level. This theme is replaced Base application theme, dependent on API level. This theme is replaced
by AppBaseTheme from res/values-vXX/styles.xml on newer devices. by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
--> -->
<style name="AppBaseTheme" parent="MaterialDrawerTheme.Light.DarkToolbar.TranslucentStatus"> <style name="AppBaseTheme" parent="MaterialDrawerTheme.Light.DarkToolbar">
<!-- <!--
Theme customizations available in newer API levels can go in Theme customizations available in newer API levels can go in
res/values-vXX/styles.xml, while customizations related to res/values-vXX/styles.xml, while customizations related to

View File

@@ -1,41 +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/>.
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<EditTextPreference
android:defaultValue="0.0.0.0"
android:inputType="phone"
android:key="pref_key_host"
android:summary="hostip the dameon is running on (restart required)"
android:title="IP"/>
<EditTextPreference
android:defaultValue="8825"
android:inputType="phone"
android:key="pref_key_port"
android:summary="port the dameon is running on (restart required)"
android:title="Port"/>
<EditTextPreference
android:defaultValue="0"
android:inputType="phone"
android:key="pref_key_chan"
android:summary="start channel of the stripe"
android:title="Channel"/>
</PreferenceScreen>

View File

@@ -16,22 +16,19 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
repositories { repositories {
jcenter() jcenter()
google()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:2.0.0-beta7' classpath 'com.android.tools.build:gradle:3.2.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
} }
} }
allprojects { allprojects {
repositories { repositories {
jcenter() jcenter()
google()
} }
} }

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@@ -1,6 +1,6 @@
#Sun Nov 30 16:28:30 CET 2014 #Sat Dec 01 13:51:30 CET 2018
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip

10
gradlew vendored Normal file → Executable file
View File

@@ -42,11 +42,6 @@ case "`uname`" in
;; ;;
esac esac
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# Attempt to set APP_HOME # Attempt to set APP_HOME
# Resolve links: $0 may be a link # Resolve links: $0 may be a link
PRG="$0" PRG="$0"
@@ -61,9 +56,9 @@ while [ -h "$PRG" ] ; do
fi fi
done done
SAVED="`pwd`" SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&- cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`" APP_HOME="`pwd -P`"
cd "$SAVED" >&- cd "$SAVED" >/dev/null
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -114,6 +109,7 @@ fi
if $cygwin ; then if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"` APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath # We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`