package com.nutomic.syncthingandroid.fragments;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.google.common.base.Optional;
import com.nutomic.syncthingandroid.R;
import com.nutomic.syncthingandroid.activities.MainActivity;
import com.nutomic.syncthingandroid.activities.SettingsActivity;
import com.nutomic.syncthingandroid.activities.WebGuiActivity;
import com.nutomic.syncthingandroid.model.Connections;
import com.nutomic.syncthingandroid.model.SystemInfo;
import com.nutomic.syncthingandroid.model.SystemVersion;
import com.nutomic.syncthingandroid.service.RestApi;
import com.nutomic.syncthingandroid.service.SyncthingService;
import com.nutomic.syncthingandroid.util.Util;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
/**
* Displays information about the local device.
*/
public class DrawerFragment extends Fragment implements View.OnClickListener {
private TextView mDeviceId;
private TextView mCpuUsage;
private TextView mRamUsage;
private TextView mDownload;
private TextView mUpload;
private TextView mAnnounceServer;
private TextView mVersion;
private TextView mExitButton;
private Timer mTimer;
private MainActivity mActivity;
public void onDrawerOpened() {
mTimer = new Timer();
mTimer.schedule(new TimerTask() {
@Override
public void run() {
updateGui();
}
}, 0, SyncthingService.GUI_UPDATE_INTERVAL);
}
@Override
public void onResume() {
super.onResume();
updateExitButtonVisibility();
}
public void onDrawerClosed() {
if (mTimer != null) {
mTimer.cancel();
mTimer = null;
}
}
@Override
public void onDestroy() {
super.onDestroy();
onDrawerClosed();
}
/**
* Populates views and menu.
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_drawer, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
mDeviceId = (TextView) view.findViewById(R.id.device_id);
mCpuUsage = (TextView) view.findViewById(R.id.cpu_usage);
mRamUsage = (TextView) view.findViewById(R.id.ram_usage);
mDownload = (TextView) view.findViewById(R.id.download);
mUpload = (TextView) view.findViewById(R.id.upload);
mAnnounceServer = (TextView) view.findViewById(R.id.announce_server);
mVersion = (TextView) view.findViewById(R.id.version);
mExitButton = (TextView) view.findViewById(R.id.drawerActionExit);
view.findViewById(R.id.drawerActionWebGui)
.setOnClickListener(this);
view.findViewById(R.id.drawerActionShareId)
.setOnClickListener(this);
view.findViewById(R.id.drawerActionRestart)
.setOnClickListener(this);
view.findViewById(R.id.drawerActionSettings)
.setOnClickListener(this);
mExitButton.setOnClickListener(this);
updateExitButtonVisibility();
}
private void updateExitButtonVisibility() {
boolean alwaysInBackground = SyncthingService.alwaysRunInBackground(getActivity());
mExitButton.setVisibility(alwaysInBackground ? View.GONE : View.VISIBLE);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mActivity = (MainActivity) getActivity();
if (savedInstanceState != null && savedInstanceState.getBoolean("active")) {
onDrawerOpened();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("active", mTimer != null);
}
/**
* Invokes status callbacks.
*/
private void updateGui() {
if (mActivity.getApi() == null || getActivity() == null || getActivity().isFinishing())
return;
mActivity.getApi().getSystemInfo(this::onReceiveSystemInfo);
mActivity.getApi().getSystemVersion(this::onReceiveSystemVersion);
mActivity.getApi().getConnections(this::onReceiveConnections);
}
/**
* This will not do anything if gui updates are already scheduled.
*/
public void requestGuiUpdate() {
if (mTimer == null) {
updateGui();
}
}
/**
* Populates views with status received via {@link RestApi#getSystemInfo}.
*/
public void onReceiveSystemInfo(SystemInfo info) {
if (getActivity() == null)
return;
mDeviceId.setText(info.myID);
mDeviceId.setOnClickListener(v -> Util.copyDeviceId(getActivity(), mDeviceId.getText().toString()));
NumberFormat percentFormat = NumberFormat.getPercentInstance();
percentFormat.setMaximumFractionDigits(2);
mCpuUsage.setText(percentFormat.format(info.cpuPercent / 100));
mRamUsage.setText(Util.readableFileSize(mActivity, info.sys));
int announceTotal = info.discoveryMethods;
int announceConnected =
announceTotal - Optional.fromNullable(info.discoveryErrors).transform(Map::size).or(0);
mAnnounceServer.setText(String.format(Locale.getDefault(), "%1$d/%2$d",
announceConnected, announceTotal));
int color = (announceConnected > 0)
? R.color.text_green
: R.color.text_red;
mAnnounceServer.setTextColor(ContextCompat.getColor(getContext(), color));
}
/**
* Populates views with status received via {@link RestApi#getSystemInfo}.
*/
public void onReceiveSystemVersion(SystemVersion info) {
if (getActivity() == null)
return;
mVersion.setText(info.version);
}
/**
* Populates views with status received via {@link RestApi#getConnections}.
*/
private void onReceiveConnections(Connections connections) {
Connections.Connection c = connections.total;
mDownload.setText(Util.readableTransferRate(mActivity, c.inBits));
mUpload.setText(Util.readableTransferRate(mActivity, c.outBits));
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.drawerActionWebGui:
startActivity(new Intent(mActivity, WebGuiActivity.class));
mActivity.closeDrawer();
break;
case R.id.drawerActionShareId:
Intent i = new Intent(android.content.Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(android.content.Intent.EXTRA_TEXT, mDeviceId.getText());
startActivity(Intent.createChooser(i, "Share device ID with"));
mActivity.closeDrawer();
break;
case R.id.drawerActionSettings:
startActivity(new Intent(mActivity, SettingsActivity.class));
mActivity.closeDrawer();
break;
case R.id.drawerActionRestart:
mActivity.showRestartDialog();
mActivity.closeDrawer();
break;
case R.id.drawerActionExit:
mActivity.stopService(new Intent(mActivity, SyncthingService.class));
mActivity.finish();
mActivity.closeDrawer();
break;
}
}
}