/*
* Copyright (c) 2015 OpenSilk Productions LLC
*
* 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 syncthing.android.ui.session;
import android.databinding.Bindable;
import android.databinding.BindingAdapter;
import android.support.v4.content.ContextCompat;
import android.widget.TextView;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.Duration;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;
import java.text.DecimalFormat;
import syncthing.android.R;
import syncthing.android.service.SyncthingUtils;
import syncthing.android.ui.common.ExpandableCard;
import syncthing.api.model.ConnectionInfo;
import syncthing.api.model.DeviceConfig;
import syncthing.api.model.SystemInfo;
import syncthing.api.model.Version;
/**
* Created by drew on 3/10/15.
*/
public class MyDeviceCard extends ExpandableCard {
static final DecimalFormat cpuFormat = new DecimalFormat("0.00");
static final PeriodFormatter uptimeFormatter;
static {
uptimeFormatter = new PeriodFormatterBuilder()
.appendDays()
.appendSuffix("d ")
.appendHours()
.appendSuffix("h ")
.appendMinutes()
.appendSuffix("m ")
.appendSeconds()
.appendSuffix("s")
.toFormatter();
}
protected DeviceConfig device;
protected Version version;
//connection info;
private long inbps = -1;
private long inBytesTotal = -1;
private long outbps = -1;
private long outBytesTotal = -1;
//system info
private boolean hasSystemInfo;
private long sys;
private double cpuPercent;
private long uptime;
private boolean discoveryEnabled;
private int discoveryFailures;
private int discoveryMethods;
private boolean relaysEnabled;
private int relaysFailures;
private int relaysTotal;
public MyDeviceCard(DeviceConfig device, ConnectionInfo connection, SystemInfo system, Version version) {
this.device = device;
this.version = version;
setConnectionInfo(connection);
setSystemInfo(system);
setExpanded(true);
}
public void setDevice(DeviceConfig device) {
if (!StringUtils.equals(this.device.deviceID, device.deviceID)) {
throw new IllegalArgumentException("Tried binding a different device to this card " +
device.deviceID +" != " + this.device.deviceID);
}
this.device = device;
notifyChange(syncthing.android.BR._all);//TODO only notify changed fields
}
public void setConnectionInfo(ConnectionInfo connection) {
if (connection == null) {
inbps = inBytesTotal = outbps = outBytesTotal = -1;
notifyChange(syncthing.android.BR.inbps);
notifyChange(syncthing.android.BR.inBytesTotal);
notifyChange(syncthing.android.BR.outbps);
notifyChange(syncthing.android.BR.outBytesTotal);
} else {
if (inbps != connection.inbps || inBytesTotal != connection.inBytesTotal) {
inbps = connection.inbps;
inBytesTotal = connection.inBytesTotal;
notifyChange(syncthing.android.BR.inbps);
notifyChange(syncthing.android.BR.inBytesTotal);
}
if (outbps != connection.outbps || outBytesTotal != connection.outBytesTotal) {
outbps = connection.outbps;
outBytesTotal = connection.outBytesTotal;
notifyChange(syncthing.android.BR.outbps);
notifyChange(syncthing.android.BR.outBytesTotal);
}
}
}
public void setSystemInfo(SystemInfo system) {
if (system == null) {
hasSystemInfo = false;
discoveryEnabled = relaysEnabled = false;
notifyChange(syncthing.android.BR.hasSystemInfo);
notifyChange(syncthing.android.BR.mem);
notifyChange(syncthing.android.BR.cpuPercent);
notifyChange(syncthing.android.BR.cpuPercentText);
notifyChange(syncthing.android.BR.uptime);
notifyChange(syncthing.android.BR.uptimeText);
notifyChange(syncthing.android.BR.discoveryEnabled);
notifyChange(syncthing.android.BR.discoveryFailures);
notifyChange(syncthing.android.BR.discoveryMethods);
notifyChange(syncthing.android.BR.relaysEnabled);
notifyChange(syncthing.android.BR.relaysFailures);
notifyChange(syncthing.android.BR.relaysTotal);
} else {
if (!hasSystemInfo) {
hasSystemInfo = true;
notifyChange(syncthing.android.BR.hasSystemInfo);
}
if (sys != system.sys) {
sys = system.sys;
notifyChange(syncthing.android.BR.mem);
}
if (cpuPercent != system.cpuPercent) {
cpuPercent = system.cpuPercent;
notifyChange(syncthing.android.BR.cpuPercent);
notifyChange(syncthing.android.BR.cpuPercentText);
}
if (uptime != system.uptime) {
uptime = system.uptime;
notifyChange(syncthing.android.BR.uptime);
notifyChange(syncthing.android.BR.uptimeText);
}
if (discoveryEnabled != system.discoveryEnabled) {
discoveryEnabled = system.discoveryEnabled;
notifyChange(syncthing.android.BR.discoveryEnabled);
}
int failures = 0;
if (system.discoveryErrors != null && !system.discoveryErrors.isEmpty()) {
failures = system.discoveryErrors.size();
}
if (discoveryFailures != failures || discoveryMethods != system.discoveryMethods) {
discoveryFailures = failures;
discoveryMethods = system.discoveryMethods;
notifyChange(syncthing.android.BR.discoveryFailures);
notifyChange(syncthing.android.BR.discoveryMethods);
}
if (relaysEnabled != system.relaysEnabled) {
relaysEnabled = system.relaysEnabled;
notifyChange(syncthing.android.BR.relaysEnabled);
}
int failed = 0, total = 0;
if (system.relayClientStatus != null) {
for (String r : system.relayClientStatus.keySet()) {
if (!system.relayClientStatus.get(r)) {
failed++;
}
total++;
}
}
if (relaysFailures != failed || relaysTotal != total) {
relaysFailures = failed;
relaysTotal = total;
notifyChange(syncthing.android.BR.relaysFailures);
notifyChange(syncthing.android.BR.relaysTotal);
}
}
}
public void setVersion(Version version) {
this.version = version;
notifyChange(syncthing.android.BR.versionText);
}
@Override
public int getLayout() {
return R.layout.session_mydevice;
}
@Bindable
public String getDeviceID() {
return device.deviceID;
}
@Bindable
public String getName() {
return SyncthingUtils.getDisplayName(device);
}
@Bindable
public long getInbps() {
return inbps;
}
@Bindable
public long getInBytesTotal(){
return inBytesTotal;
}
@Bindable
public long getOutbps() {
return outbps;
}
@Bindable
public long getOutBytesTotal() {
return outBytesTotal;
}
@Bindable
public long getMem() {
return sys;
}
@Bindable
public double getCpuPercent() {
return cpuPercent;
}
@Bindable
public String getCpuPercentText() {
return cpuFormat.format(getCpuPercent());
}
@Bindable
public boolean getHasSystemInfo() {
return hasSystemInfo;
}
@Bindable
public long getUptime() {
return uptime;
}
@Bindable
public String getUptimeText() {
return uptimeFormatter.print(Duration.standardSeconds(getUptime()).toPeriod());
}
@Bindable
public String getVersionText() {
return version != null ? version.toString() : "?";
}
@Bindable
public boolean isDiscoveryEnabled() {
return discoveryEnabled;
}
@Bindable
public int getDiscoveryFailures() {
return discoveryFailures;
}
@Bindable
public int getDiscoveryMethods() {
return discoveryMethods;
}
@Bindable
public boolean isRelaysEnabled() {
return relaysEnabled;
}
@Bindable
public int getRelaysFailures() {
return relaysFailures;
}
@Bindable
public int getRelaysTotal() {
return relaysTotal;
}
}