/*
* Light Controller, to Control wifi LED Lighting
* Copyright (C) 2014 Eliot Stocker
*
* 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 tv.piratemedia.lightcontroler;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.StrictMode;
import android.preference.PreferenceManager;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.widget.Toolbar;
import android.text.InputType;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;
import android.support.v7.app.ActionBarActivity;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.Theme;
import com.astuetz.PagerSlidingTabStrip;
import com.devadvance.circularseekbar.CircularSeekBar;
import com.heinrichreimersoftware.materialdrawer.DrawerFrameLayout;
import com.heinrichreimersoftware.materialdrawer.structure.DrawerItem;
import com.heinrichreimersoftware.materialdrawer.structure.DrawerProfile;
import com.larswerkman.holocolorpicker.ColorPicker;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.UUID;
import tv.piratemedia.lightcontroler.api.ControlProviders;
import tv.piratemedia.lightcontroler.wear.DataLayerListenerService;
import tv.piratemedia.lightcontroler.pebble.pebbleSender;
public class controller extends ActionBarActivity {
/**
* The serialization (saved instance state) Bundle key representing the
* current dropdown position.
*/
private static final String STATE_SELECTED_NAVIGATION_ITEM = "selected_navigation_item";
final UUID appUuid = UUID.fromString("1d6c7f01-d948-42a6-aa4e-b2084210ebbc");
private static controlCommands Controller;
private static boolean micStarted = false;
private static boolean candleMode = false;
private static Context ctx;
public SaveState appState = null;
private static SharedPreferences prefs;
private Toolbar mActionBarToolbar;
private PagerSlidingTabStrip tabs;
private PopupWindow mMenu;
private View MenuView;
public MyHandler mHandler = null;
private utils Utils;
private boolean gotDevice = false;
private String DeviceMac = "";
private DrawerFrameLayout drawer;
private pebbleSender pSender;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_controller);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
drawer = (DrawerFrameLayout) findViewById(R.id.drawer);
setupApp();
mHandler = new MyHandler();
Controller = new controlCommands(this, mHandler);
ctx = this;
Intent i = new Intent(this, notificationService.class);
i.setAction(notificationService.START_SERVICE);
this.startService(i);
if(Build.VERSION.SDK_INT == 22) {
//getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark));
drawer.setStatusBarBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
}
drawer.setStatusBarBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
appState = new SaveState(this);
Utils = new utils(this);
new DataLayerListenerService();
//Call Pebble sender, get it to check if pebble is connceted and send up light states
//Todo need to rethink this as pebble app only gets communication if its running. So maybe detect if app is running, then send? or when app becomes active, send
if(prefs.getBoolean("pref_pebble", false)){
Log.d("Controller", "Pebble pref is active, lets start the app up");
new pebbleSender(ctx).initialConnect(Controller);
new pebbleSender(ctx).sendZoneNames();
}else{
//TODO add this functionality so the broadcast listener for pebble stops (pebbleReceiver) so we dont have it running in background listening for things
Log.d("Controller", "Pebble prefs is inactive. Lets shut down the listener service so its not running anymore");
}
}
class MyHandler extends Handler {
public void handleMessage(Message msg) {
switch(msg.what) {
case controlCommands.DISCOVERED_DEVICE:
String[] DeviceInfo = (String[])msg.obj;
String Mac = DeviceInfo[1];
String IP = DeviceInfo[0];
newDeviceFound(IP, Mac);
break;
case controlCommands.LIST_WIFI_NETWORKS:
String NetworkString = (String)msg.obj;
String[] Networks = NetworkString.split("\\n\\r");
listWifiNetworks(Networks);
}
}
}
private void listWifiNetworks(final String[] Networks) {
String[] ShowNetworks = new String[Networks.length - 4];
for(int i = 2; i < Networks.length - 2; i++) {
String[] NetworkInfo = Networks[i].split(",");
ShowNetworks[i - 2] = NetworkInfo[1]+" - "+NetworkInfo[4]+"%";
}
// Set an EditText view to get user input
final EditText input = new EditText(this);
input.setHint("Password");
input.setSingleLine(true);
input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
final Context _this = this;
new MaterialDialog.Builder(this)
.title("Controller Wifi Networks")
.theme(Theme.DARK)
.items(ShowNetworks)
.itemsCallbackSingleChoice(-1, new MaterialDialog.ListCallbackSingleChoice() {
@Override
public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
final String[] NetworkInfo = Networks[which + 2].split(",");
if (NetworkInfo[3].equals("NONE")) {
Controller.setWifiNetwork(NetworkInfo[1]);
} else {
new MaterialDialog.Builder(_this)
.title("Password For: " + NetworkInfo[1])
.theme(Theme.DARK)
.customView(input, false)
.content("Please type the network password")
.positiveText("OK")
.negativeText("Cancel")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
Controller.setWifiNetwork(NetworkInfo[1], "WPA2PSK", "AES", input.getText().toString());
}
})
.build()
.show();
}
return false;
}
})
.positiveText("Select")
.negativeText("Cancel")
.build()
.show();
}
private void newDeviceFound(final String IP, final String Mac) {
final SharedPreferences Devices = this.getSharedPreferences("devices", MODE_PRIVATE);
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
Devices.edit().putBoolean(Mac+"-known",true).commit();
prefs.edit().putString("pref_light_controller_ip", IP).commit();
Devices.edit().putString(Mac+"-online",Utils.getWifiName());
gotDevice = true;
DeviceMac = Mac;
break;
case DialogInterface.BUTTON_NEGATIVE:
Devices.edit().putBoolean(Mac+"-known",false).commit();
break;
}
}
};
if(Devices.getAll().size() < 1) {
prefs.edit().putString("pref_light_controller_ip", IP).commit();
Devices.edit().putBoolean(Mac+"-known",true);
Devices.edit().putString(Mac+"-online",Utils.getWifiName());
gotDevice = true;
DeviceMac = Mac;
} else {
if (!Devices.contains(Mac + "-known")) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("A new Light Control device has been found, Would you like to save/control it?").setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("No", dialogClickListener).show();
} else {
if (Devices.getBoolean(Mac + "-known", false)) {
gotDevice = true;
prefs.edit().putString("pref_light_controller_ip", IP).commit();
DeviceMac = Mac;
}
}
}
}
@Override
protected void onResume() {
super.onResume();
gotDevice = false;
if(!Utils.isWifiConnection()) {
}
attemptDiscovery();
}
@Override
protected void onDestroy() {
super.onDestroy();
Controller.killUDPC();
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
private void attemptDiscovery() {
prefs = PreferenceManager.getDefaultSharedPreferences(this);
if(!prefs.getBoolean("pref_disable_auto_find", false)) {
Controller.discover();
}
/* Code to try and unregister pebble stuff if its unselcted in settings menu. not quite sure where to put this though, what reloads after a settings change?
ComponentName pebblereceiver = new ComponentName(ctx,pebbleReceiver.class);
int status = ctx.getPackageManager().getComponentEnabledSetting(pebblereceiver);
if(status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
Log.d("Package", "pebbl receiver is enabled");
} else if(status == PackageManager.COMPONENT_ENABLED_STATE_DISABLED){
Log.d("Package", "pebbl receiver is disabled");
}
Log.d("Packge", "Test log"); */
//start timer here for no discovery (try 3 times)
}
private void setupApp() {
mActionBarToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
setSupportActionBar(mActionBarToolbar);
prefs = PreferenceManager.getDefaultSharedPreferences(this);
if(!prefs.getBoolean("rgbw_enabled", false) && !prefs.getBoolean("white_enabled", false)) {
askControlType();
} else {
final ViewPager pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(new ControllerPager(getSupportFragmentManager(), this, this));
tabs = (PagerSlidingTabStrip) findViewById(R.id.pager_title_strip);
tabs.setViewPager(pager);
if(!prefs.getBoolean("navigation_tabs", false)) {
drawer.setProfile(
new DrawerProfile()
.setAvatar(getResources().getDrawable(R.drawable.icon))
.setBackground(getResources().getDrawable(R.drawable.drawer_profile_background))
.setName("Light Controller")
);
mActionBarToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
mActionBarToolbar.setNavigationIcon(R.drawable.ic_menu_white_24dp);
pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mActionBarToolbar.setTitle(pager.getAdapter().getPageTitle(position));
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
this.setTitle(pager.getAdapter().getPageTitle(0));
mActionBarToolbar.setTitle(pager.getAdapter().getPageTitle(0));
tabs.setVisibility(View.GONE);
for(int i = 0; i < pager.getAdapter().getCount(); i++) {
if(i == 5) {
drawer.addDivider();
}
drawer.addItem(new DrawerItem()
.setTextMode(DrawerItem.SINGLE_LINE)
.setTextPrimary(pager.getAdapter().getPageTitle(i).toString())
.setOnItemClickListener(new DrawerItem.OnItemClickListener() {
@Override
public void onClick(DrawerItem drawerItem, int i, int i2) {
int item = i2;
if(item > 4) {
item--;
}
pager.setCurrentItem(item, true);
drawer.closeDrawer();
}
}));
}
final PackageManager pm = getPackageManager();
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory("tv.piratemedia.lightcontroller.plugin");
List<ResolveInfo> resolveInfos = pm.queryIntentActivities(mainIntent, 0);
if(resolveInfos.size() > 0) {
drawer.addDivider();
for (final ResolveInfo info : resolveInfos) {
drawer.addItem(new DrawerItem()
.setTextMode(DrawerItem.SINGLE_LINE)
.setTextPrimary(info.loadLabel(pm).toString())
.setImage(info.loadIcon(pm))
.setOnItemClickListener(new DrawerItem.OnItemClickListener() {
@Override
public void onClick(DrawerItem drawerItem, int i, int i2) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory("tv.piratemedia.lightcontroller.plugin");
intent.setComponent(new ComponentName(info.activityInfo.packageName, info.activityInfo.name));
startActivity(intent);
drawer.closeDrawer();
}
}));
}
}
drawer.addDivider();
drawer.addItem(new DrawerItem()
.setTextMode(DrawerItem.SINGLE_LINE)
.setTextPrimary(getResources().getString(R.string.action_settings))
.setOnItemClickListener(new DrawerItem.OnItemClickListener() {
@Override
public void onClick(DrawerItem drawerItem, int i, int i2) {
Intent intent = new Intent(getApplicationContext(), controlPreferences.class);
startActivity(intent);
finish();
drawer.closeDrawer();
}
}));
} else {
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
}
}
private void askControlType() {
String[] Options = new String[3];
Options[0] = "White Bulbs Only";
Options[1] = "RGBW Bulbs Only";
Options[2] = "Both White and RGBW Bulbs";
final Activity _this = this;
new MaterialDialog.Builder(this)
.title("Which bulbs do you have?")
.theme(Theme.LIGHT)
.items(Options)
.cancelable(false)
.itemsCallbackSingleChoice(-1, new MaterialDialog.ListCallbackSingleChoice() {
@Override
public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
switch (which) {
case 0:
prefs.edit().putBoolean("white_enabled", true).apply();
break;
case 1:
prefs.edit().putBoolean("rgbw_enabled", true).apply();
break;
case 2:
prefs.edit().putBoolean("white_enabled", true).apply();
prefs.edit().putBoolean("rgbw_enabled", true).apply();
break;
}
setupApp();
return false;
}
})
.build()
.show();
}
private void setActionbarColor(int c) {
mActionBarToolbar.setBackgroundColor(c);
try {
tabs.setBackgroundColor(c);
} catch(Exception e) {
//do nothing
}
float[] hsv = new float[3];
Color.colorToHSV(c, hsv);
hsv[2] *= 0.8f; // value component
c = Color.HSVToColor(hsv);
drawer.setStatusBarBackgroundColor(c);
//little hack to make the statusbar background redraw when called from another thread
drawer.openDrawer();
drawer.closeDrawer();
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Restore the previously serialized current dropdown position.
if (savedInstanceState.containsKey(STATE_SELECTED_NAVIGATION_ITEM)) {
/*getActionBar().setSelectedNavigationItem(
savedInstanceState.getInt(STATE_SELECTED_NAVIGATION_ITEM));*/
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
// Serialize the current dropdown position.
/*outState.putInt(STATE_SELECTED_NAVIGATION_ITEM,
getActionBar().getSelectedNavigationIndex());*/
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
if(prefs.getBoolean("navigation_tabs", false)) {
getMenuInflater().inflate(R.menu.controller, menu);
} else if(prefs.getBoolean("rgbw_enabled", false) && prefs.getBoolean("white_enabled", false)) {
getMenuInflater().inflate(R.menu.controller_alt, menu);
Log.d("menus", "alt menu");
} else {
Log.d("menus", "no menu");
}
return true;
}
public void popupMenu() {
MenuView = View.inflate(this, R.layout.menu, null);
TextView settings = (TextView) MenuView.findViewById(R.id.settings_menu_item);
TextView DeviceSetup = (TextView) MenuView.findViewById(R.id.setup_menu_item);
if(DeviceMac.toLowerCase().equals(Utils.GetWifiMac().replace(":","").toLowerCase())) {
DeviceSetup.setVisibility(View.VISIBLE);
} else {
DeviceSetup.setVisibility(View.GONE);
}
settings.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
closeMenu();
Intent intent = new Intent(getApplicationContext(), controlPreferences.class);
startActivity(intent);
finish();
}
});
DeviceSetup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Controller.getWifiNetworks();
closeMenu();
}
});
MenuView.setAnimation(AnimationUtils.loadAnimation(this, R.anim.slide_in_corner));
mMenu = new PopupWindow(MenuView, LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
mMenu.setContentView(MenuView);
mMenu.setTouchable(true);
if(Build.VERSION.SDK_INT == 21) {
mMenu.setElevation((int)dipToPixels(this, 10));
}
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
mMenu.setAnimationStyle(R.anim.abc_slide_in_top);
mMenu.setBackgroundDrawable(new BitmapDrawable());
mMenu.setFocusable(true);
mMenu.setOutsideTouchable(false);
mMenu.showAtLocation(findViewById(R.id.container), 0, size.x - (int)dipToPixels(this, 208), (int)dipToPixels(this, 32));
mMenu.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
MenuView.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.slide_out_corner));
}
});
}
public void closeMenu() {
mMenu.dismiss();
}
public static float dipToPixels(Context context, float dipValue) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue, metrics);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
Intent intent = new Intent(this, controlPreferences.class);
startActivity(intent);
return true;
// } else if(id == R.id.action_menu) {
// popupMenu();
// return true;
} else if(id == R.id.action_global_on) {
Controller.globalOn();
} else if(id == R.id.action_global_off) {
Controller.globalOff();
} else if(id == android.R.id.home) {
drawer.openDrawer();
}
return super.onOptionsItemSelected(item);
}
private File getScreen() {
Long tsLong = System.currentTimeMillis()/1000;
String ts = tsLong.toString();
String mPath = Environment.getExternalStorageDirectory().toString() + "/bug_report_"+ts+".jpg";
// create bitmap screen capture
Bitmap bitmap;
View v1 = getWindow().getDecorView().getRootView();
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);
OutputStream fout = null;
File imageFile = new File(mPath);
try {
fout = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
fout.flush();
fout.close();
return imageFile;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* A placeholder fragment containing a simple view.
*/
public static class ControllerPager extends FragmentPagerAdapter {
Fragment G1 = null;
Fragment G2 = null;
Fragment z1 = null;
Fragment z2 = null;
Fragment z3 = null;
Fragment z4 = null;
Fragment z5 = null;
Fragment z6 = null;
Fragment z7 = null;
Fragment z8 = null;
private controller mThis;
private SharedPreferences prefs;
private Context context;
public ControllerPager(FragmentManager fm, controller t, Context context) {
super(fm);
prefs = PreferenceManager.getDefaultSharedPreferences(context);
mThis = t;
this.context = context;
}
@Override
public android.support.v4.app.Fragment getItem(int i) {
if(!prefs.getBoolean("rgbw_enabled", false) && i > 0) {
i += 4;
}
switch(i) {
case 0:
if(G1 == null) {
G1 = RGBWFragment.newInstance(0);
}
return G1;
case 1:
if(z1 == null) {
z1 = RGBWFragment.newInstance(1);
}
return z1;
case 2:
if(z2 == null) {
z2 = RGBWFragment.newInstance(2);
}
return z2;
case 3:
if(z3 == null) {
z3 = RGBWFragment.newInstance(3);
}
return z3;
case 4:
if(z4 == null) {
z4 = RGBWFragment.newInstance(4);
}
return z4;
case 5:
if(G2 == null) {
G2 = WhiteFragment.newInstance(0);
}
return G2;
case 6:
if(z5 == null) {
z5 = WhiteFragment.newInstance(1);
}
return z5;
case 7:
if(z6 == null) {
z6 = WhiteFragment.newInstance(2);
}
return z6;
case 8:
if(z7 == null) {
z7 = WhiteFragment.newInstance(3);
}
return z7;
case 9:
if(z8 == null) {
z8 = WhiteFragment.newInstance(4);
}
return z8;
default:
if(G1 == null) {
G1 = RGBWFragment.newInstance(0);
}
return G1;
}
}
public void setupZone(int zone) {
Intent i = new Intent();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName(context.getPackageName(), zoneSetup.class.getCanonicalName()));
int z = zone;
if(z > 4) {
intent.putExtra("type", "white");
if(z > 8) {
z = 0;
} else {
z -= 4;
}
} else {
intent.putExtra("type", "color");
}
intent.putExtra("zone", z);
intent.putExtra("index", zone);
context.startActivity(intent);
}
public int getIndex(String type, int Zone) {
switch(type) {
case "color":
return Zone;
case "white":
int r = Zone - 4;
if(r > 4) {
r = 0;
}
return r;
default:
return -1;
}
}
@Override
public int getCount() {
int count = 0;
if(prefs.getBoolean("rgbw_enabled", false)) {
count += 5;
}
if(prefs.getBoolean("white_enabled", false)) {
count += 5;
}
return count;
}
@Override
public CharSequence getPageTitle(int position) {
if(!prefs.getBoolean("rgbw_enabled", false) && position > 0) {
position += 4;
}
switch(position) {
case 0: return "All Color";
case 1: return prefs.getString("pref_zone1", "Zone 1");
case 2: return prefs.getString("pref_zone2", "Zone 2");
case 3: return prefs.getString("pref_zone3", "Zone 3");
case 4: return prefs.getString("pref_zone4", "Zone 4");
case 5: return "All White";
case 6: return prefs.getString("pref_zone5", "White 1");
case 7: return prefs.getString("pref_zone6", "White 2");
case 8: return prefs.getString("pref_zone7", "White 3");
case 9: return prefs.getString("pref_zone8", "White 4");
}
return "unknown";
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
int savedColor = mThis.appState.getColor(position);
if(savedColor < 0) {
mThis.setActionbarColor(savedColor);
} else {
mThis.setActionbarColor(mThis.getResources().getColor(R.color.colorPrimary));
}
}
}
public static class RGBWFragment extends Fragment {
public boolean recreateView = false;
private View cacheView = null;
private boolean disabled = true;
/**
* The fragment argument representing the section number for this
* fragment.
*/
private static final String ARG_SECTION_NUMBER = "section_number";
/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static RGBWFragment newInstance(int sectionNumber) {
RGBWFragment fragment = new RGBWFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public RGBWFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(!recreateView) {
final View rootView = inflater.inflate(R.layout.rgbw_control, container, false);
SeekBar brightness = (SeekBar) rootView.findViewById(R.id.brightness);
Button on = (Button) rootView.findViewById(R.id.on);
Button off = (Button) rootView.findViewById(R.id.off);
Button disco = (Button) rootView.findViewById(R.id.disco);
Button dplus = (Button) rootView.findViewById(R.id.dplus);
Button dminus = (Button) rootView.findViewById(R.id.dminus);
Button white = (Button) rootView.findViewById(R.id.white);
Button night = (Button) rootView.findViewById(R.id.night);
final ColorPicker color = (ColorPicker) rootView.findViewById(R.id.color);
SeekBar tolerance = (SeekBar) rootView.findViewById(R.id.mictolerance);
final Button toggleMic = (Button) rootView.findViewById(R.id.mic);
final Button toggleCandle = (Button) rootView.findViewById(R.id.candle_mode);
Spinner modeSpinner = (Spinner) rootView.findViewById(R.id.movement_modes);
final LinearLayout modeContainer = (LinearLayout) rootView.findViewById(R.id.modes_container);
ArrayAdapter<CharSequence> modeAdapter = ArrayAdapter.createFromResource(ctx,
R.array.modes_array, android.R.layout.simple_spinner_item);
modeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
modeSpinner.setAdapter(modeAdapter);
//Return State
//io.setChecked(((controller)getActivity()).appState.getOnOff(getArguments().getInt(ARG_SECTION_NUMBER)));
brightness.setProgress((int) (((controller)getActivity()).appState.getBrightness(getArguments().getInt(ARG_SECTION_NUMBER)) * 100f));
int savedColor = ((controller)getActivity()).appState.getColor(getArguments().getInt(ARG_SECTION_NUMBER));
if(savedColor < 0) {
color.setColor(savedColor);
((controller) getActivity()).setActionbarColor(savedColor);
}
if (micStarted) {
toggleMic.setText("Stop Listening");
} else {
toggleMic.setText("Start Listening");
}
if (candleMode) {
toggleCandle.setText("Stop Candle Mode");
} else {
toggleCandle.setText("Start Candle Mode");
}
modeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
try {
for (int i = 0; i < modeContainer.getChildCount(); i++) {
modeContainer.getChildAt(i).setVisibility(View.GONE);
}
modeContainer.getChildAt(position).setVisibility(View.VISIBLE);
} catch(NullPointerException e) {
e.printStackTrace();
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
color.setShowOldCenterColor(false);
color.setOnColorChangedListener(new ColorPicker.OnColorChangedListener() {
@Override
public void onColorChanged(int i) {
if(!disabled) {
Controller.setColor(ControlProviders.ZONE_TYPE_COLOR, getArguments().getInt(ARG_SECTION_NUMBER), i);
((controller) getActivity()).setActionbarColor(i);
/*ToggleButton io = (ToggleButton) rootView.findViewById(R.id.onoff);
io.setChecked(true);*/
}
}
});
brightness.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
Controller.setBrightness(ControlProviders.ZONE_TYPE_COLOR, getArguments().getInt(ARG_SECTION_NUMBER), (float)progress / 100f);
/*ToggleButton io = (ToggleButton) rootView.findViewById(R.id.onoff);
io.setChecked(true);*/
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
Controller.finishBrightness(ControlProviders.ZONE_TYPE_COLOR, getArguments().getInt(ARG_SECTION_NUMBER), (float)seekBar.getProgress() / 100f);
}
});
on.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Controller.LightsOn(ControlProviders.ZONE_TYPE_COLOR, getArguments().getInt(ARG_SECTION_NUMBER));
}
});
off.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Controller.LightsOff(ControlProviders.ZONE_TYPE_COLOR, getArguments().getInt(ARG_SECTION_NUMBER));
}
});
/*io.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
Controller.LightsOn(getArguments().getInt(ARG_SECTION_NUMBER));
} else {
Controller.LightsOff(getArguments().getInt(ARG_SECTION_NUMBER));
}
}
});*/
disco.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Controller.toggleDiscoMode(getArguments().getInt(ARG_SECTION_NUMBER));
/*ToggleButton io = (ToggleButton) rootView.findViewById(R.id.onoff);
io.setChecked(true);*/
}
});
dplus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Controller.discoModeFaster();
/*ToggleButton io = (ToggleButton) rootView.findViewById(R.id.onoff);
io.setChecked(true);*/
}
});
dminus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Controller.discoModeSlower();
/*ToggleButton io = (ToggleButton) rootView.findViewById(R.id.onoff);
io.setChecked(true);*/
}
});
white.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Controller.setToWhite(ControlProviders.ZONE_TYPE_COLOR, getArguments().getInt(ARG_SECTION_NUMBER));
/*ToggleButton io = (ToggleButton) rootView.findViewById(R.id.onoff);
io.setChecked(true);*/
((controller) getActivity()).setActionbarColor(Color.parseColor("#ffee58"));
}
});
night.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Controller.setToNight(ControlProviders.ZONE_TYPE_COLOR, getArguments().getInt(ARG_SECTION_NUMBER));
}
});
tolerance.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
Controller.tolerance[0] = progress;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
toggleMic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!micStarted) {
toggleMic.setText("Stop Listening");
Controller.startMeasuringVol(getArguments().getInt(ARG_SECTION_NUMBER));
micStarted = true;
} else {
toggleMic.setText("Start Listening");
Controller.stopMeasuringVol();
micStarted = false;
}
}
});
toggleCandle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!candleMode) {
toggleCandle.setText("Stop Candle Mode");
Controller.startCandleMode(getArguments().getInt(ARG_SECTION_NUMBER));
candleMode = true;
} else {
toggleCandle.setText("Start Candle Mode");
Controller.stopCandleMode();
candleMode = false;
}
}
});
recreateView = true;
cacheView = rootView;
Handler handler = new Handler();
handler.postDelayed(new Runnable(){
@Override
public void run(){
disabled = false;
}
}, 500);
return rootView;
} else {
disabled = true;
try {
((ViewGroup)cacheView.getParent()).removeView(cacheView);
} catch(Exception e) {
}
Handler handler = new Handler();
handler.postDelayed(new Runnable(){
@Override
public void run(){
disabled = false;
}
}, 500);
return cacheView;
}
}
}
public static class WhiteFragment extends Fragment {
public boolean recreateView = false;
private View cacheView = null;
private boolean disabled = true;
private int BrightnessCache = 0;
private int WarmthCache = 0;
private boolean brightnessTouching = false;
private boolean warmthTouching = false;
/**
* The fragment argument representing the section number for this
* fragment.
*/
private static final String ARG_SECTION_NUMBER = "section_number";
/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static WhiteFragment newInstance(int sectionNumber) {
WhiteFragment fragment = new WhiteFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public WhiteFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(!recreateView) {
final View rootView = inflater.inflate(R.layout.white_control, container, false);
final CircularSeekBar brightness = (CircularSeekBar) rootView.findViewById(R.id.brightness);
CircularSeekBar warmth = (CircularSeekBar) rootView.findViewById(R.id.warmth);
final TextView brightnessvalue = (TextView) rootView.findViewById(R.id.brightnessvalue);
final TextView warmthvalue = (TextView) rootView.findViewById(R.id.warmthvalue);
Button on = (Button) rootView.findViewById(R.id.on);
Button off = (Button) rootView.findViewById(R.id.off);
Button full = (Button) rootView.findViewById(R.id.full);
Button night = (Button) rootView.findViewById(R.id.night);
//Return State
//io.setChecked(((controller)getActivity()).appState.getOnOff(getArguments().getInt(ARG_SECTION_NUMBER)));
brightness.setProgress((int) (((controller)getActivity()).appState.getBrightness(getArguments().getInt(ARG_SECTION_NUMBER)) * 100));
int savedColor = ((controller)getActivity()).appState.getColor(getArguments().getInt(ARG_SECTION_NUMBER));
if(savedColor < 0) {
((controller) getActivity()).setActionbarColor(getResources().getColor(R.color.colorPrimary));
}
brightness.setProgress(10);
brightness.setOnSeekBarChangeListener(new CircularSeekBar.OnCircularSeekBarChangeListener() {
@Override
public void onProgressChanged(CircularSeekBar circularSeekBar, int progress, boolean fromUser) {
if(brightnessTouching) {
if (progress < 11) {
brightnessvalue.setText("" + (progress - 10));
} else {
brightnessvalue.setText("+" + (progress - 10));
}
if (progress > BrightnessCache) {
for (int i = progress; i > BrightnessCache; i--) {
Controller.setBrightnessUpOne(ControlProviders.ZONE_TYPE_WHITE, getArguments().getInt(ARG_SECTION_NUMBER));
}
} else if (progress < BrightnessCache) {
for (int i = progress; i < BrightnessCache; i++) {
Controller.setBrightnessDownOne(ControlProviders.ZONE_TYPE_WHITE, getArguments().getInt(ARG_SECTION_NUMBER));
}
}
BrightnessCache = progress;
}
}
@Override
public void onStopTrackingTouch(CircularSeekBar seekBar) {
brightnessTouching = false;
brightnessvalue.setAlpha(0.0f);
int brightness = seekBar.getProgress() - 10;
/*if(brightness != 0) {
seekBar.setProgress(8);
Controller.setBrightnessJog(getArguments().getInt(ARG_SECTION_NUMBER), brightness);
}*/
seekBar.setProgress(10);
}
@Override
public void onStartTrackingTouch(CircularSeekBar seekBar) {
brightnessvalue.setAlpha(1.0f);
BrightnessCache = 11;
//Controller.LightsOn(getArguments().getInt(ARG_SECTION_NUMBER));
brightnessTouching = true;
}
});
warmth.setProgress(10);
warmth.setOnSeekBarChangeListener(new CircularSeekBar.OnCircularSeekBarChangeListener() {
@Override
public void onProgressChanged(CircularSeekBar circularSeekBar, int progress, boolean fromUser) {
if(warmthTouching) {
progress = 20 - progress;
if (progress < 11) {
warmthvalue.setText("" + (progress - 10));
} else {
warmthvalue.setText("+" + (progress - 10));
}
if (progress > WarmthCache) {
for (int i = progress; i > WarmthCache; i--) {
Controller.setWarmthUpOne(ControlProviders.ZONE_TYPE_WHITE, getArguments().getInt(ARG_SECTION_NUMBER));
}
} else if (progress < WarmthCache) {
for (int i = progress; i < WarmthCache; i++) {
Controller.setWarmthDownOne(ControlProviders.ZONE_TYPE_WHITE, getArguments().getInt(ARG_SECTION_NUMBER));
}
}
WarmthCache = progress;
}
}
@Override
public void onStopTrackingTouch(CircularSeekBar seekBar) {
warmthTouching = false;
warmthvalue.setAlpha(0.0f);
int warmth = seekBar.getProgress() - 10;
/*if(warmth != 0) {
seekBar.setProgress(8);
Controller.setWarmthJog(getArguments().getInt(ARG_SECTION_NUMBER), warmth);
}*/
seekBar.setProgress(10);
}
@Override
public void onStartTrackingTouch(CircularSeekBar seekBar) {
warmthvalue.setAlpha(1.0f);
WarmthCache = 11;
//Controller.LightsOn(getArguments().getInt(ARG_SECTION_NUMBER));
warmthTouching = true;
}
});
on.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Controller.LightsOn(ControlProviders.ZONE_TYPE_WHITE, getArguments().getInt(ARG_SECTION_NUMBER));
}
});
off.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Controller.LightsOff(ControlProviders.ZONE_TYPE_WHITE, getArguments().getInt(ARG_SECTION_NUMBER));
}
});
/*io.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
Controller.LightsOn(getArguments().getInt(ARG_SECTION_NUMBER));
} else {
Controller.LightsOff(getArguments().getInt(ARG_SECTION_NUMBER));
}
}
});*/
full.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Controller.setToFull(ControlProviders.ZONE_TYPE_WHITE, getArguments().getInt(ARG_SECTION_NUMBER));
/*ToggleButton io = (ToggleButton) rootView.findViewById(R.id.onoff);
io.setChecked(true);*/
}
});
night.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Controller.setToNight(ControlProviders.ZONE_TYPE_WHITE, getArguments().getInt(ARG_SECTION_NUMBER));
/*ToggleButton io = (ToggleButton) rootView.findViewById(R.id.onoff);
io.setChecked(true);*/
}
});
recreateView = true;
cacheView = rootView;
Handler handler = new Handler();
handler.postDelayed(new Runnable(){
@Override
public void run(){
disabled = false;
}
}, 500);
return rootView;
} else {
disabled = true;
try {
((ViewGroup) cacheView.getParent()).removeView(cacheView);
} catch(Exception e) {
}
Handler handler = new Handler();
handler.postDelayed(new Runnable(){
@Override
public void run(){
disabled = false;
}
}, 500);
return cacheView;
}
}
}
}