1
0
Fork 0
mirror of https://github.com/syncthing/syncthing-android.git synced 2024-11-26 14:21:16 +00:00

Stop polling when the user doesn't look at a tab (#32)

* Fix status tab refresh

* Stop polling when the user doesn't look at a tab
This commit is contained in:
Catfriend1 2018-08-25 22:28:25 +02:00 committed by GitHub
parent a834edb2bd
commit 4164798955
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 170 additions and 46 deletions

View file

@ -2,7 +2,9 @@ package com.nutomic.syncthingandroid.fragments;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
@ -12,6 +14,7 @@ import android.widget.ListView;
import com.nutomic.syncthingandroid.R;
import com.nutomic.syncthingandroid.activities.DeviceActivity;
import com.nutomic.syncthingandroid.activities.MainActivity;
import com.nutomic.syncthingandroid.activities.SyncthingActivity;
import com.nutomic.syncthingandroid.model.Device;
import com.nutomic.syncthingandroid.service.Constants;
@ -22,8 +25,6 @@ import com.nutomic.syncthingandroid.views.DevicesAdapter;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
/**
* Displays a list of all existing devices.
@ -31,36 +32,65 @@ import java.util.TimerTask;
public class DeviceListFragment extends ListFragment implements SyncthingService.OnServiceStateChangeListener,
ListView.OnItemClickListener {
private final static String TAG = "DeviceListFragment";
private final static Comparator<Device> DEVICES_COMPARATOR = (lhs, rhs) -> lhs.name.compareTo(rhs.name);
private DevicesAdapter mAdapter;
private Runnable mUpdateListRunnable = new Runnable() {
@Override
public void run() {
onTimerEvent();
mUpdateListHandler.postDelayed(this, Constants.GUI_UPDATE_INTERVAL);
}
};
private Timer mTimer;
private final Handler mUpdateListHandler = new Handler();
private Boolean mLastVisibleToUser = false;
private DevicesAdapter mAdapter;
private SyncthingService.State mServiceState = SyncthingService.State.INIT;
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
{
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// User switched to the current tab, start handler.
startUpdateListHandler();
} else {
// User switched away to another tab, stop handler.
stopUpdateListHandler();
}
mLastVisibleToUser = isVisibleToUser;
}
@Override
public void onPause() {
stopUpdateListHandler();
super.onPause();
if (mTimer != null) {
mTimer.cancel();
}
@Override
public void onResume() {
super.onResume();
if (mLastVisibleToUser) {
startUpdateListHandler();
}
}
private void startUpdateListHandler() {
Log.v(TAG, "startUpdateListHandler");
mUpdateListHandler.removeCallbacks(mUpdateListRunnable);
mUpdateListHandler.post(mUpdateListRunnable);
}
private void stopUpdateListHandler() {
Log.v(TAG, "stopUpdateListHandler");
mUpdateListHandler.removeCallbacks(mUpdateListRunnable);
}
@Override
public void onServiceStateChange(SyncthingService.State currentState) {
if (currentState != SyncthingService.State.ACTIVE)
return;
mTimer = new Timer();
mTimer.schedule(new TimerTask() {
@Override
public void run() {
if (getActivity() == null)
return;
getActivity().runOnUiThread(DeviceListFragment.this::updateList);
}
}, 0, Constants.GUI_UPDATE_INTERVAL);
mServiceState = currentState;
}
@Override
@ -72,6 +102,29 @@ public class DeviceListFragment extends ListFragment implements SyncthingService
getListView().setOnItemClickListener(this);
}
/**
* Invokes updateList which polls the REST API for device status updates
* while the user is looking at the current tab.
*/
private void onTimerEvent() {
if (mServiceState != SyncthingService.State.ACTIVE) {
return;
}
MainActivity mainActivity = (MainActivity) getActivity();
if (mainActivity == null) {
return;
}
if (mainActivity.isFinishing()) {
return;
}
RestApi restApi = mainActivity.getApi();
if (restApi == null) {
return;
}
Log.v(TAG, "Invoking updateList on UI thread");
mainActivity.runOnUiThread(DeviceListFragment.this::updateList);
}
/**
* Refreshes ListView by updating devices and info.
*

View file

@ -2,7 +2,9 @@ package com.nutomic.syncthingandroid.fragments;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
@ -11,6 +13,7 @@ import android.widget.AdapterView;
import com.nutomic.syncthingandroid.R;
import com.nutomic.syncthingandroid.activities.FolderActivity;
import com.nutomic.syncthingandroid.activities.MainActivity;
import com.nutomic.syncthingandroid.activities.SyncthingActivity;
import com.nutomic.syncthingandroid.model.Folder;
import com.nutomic.syncthingandroid.service.Constants;
@ -19,8 +22,6 @@ import com.nutomic.syncthingandroid.service.SyncthingService;
import com.nutomic.syncthingandroid.views.FoldersAdapter;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
/**
* Displays a list of all existing folders.
@ -28,34 +29,63 @@ import java.util.TimerTask;
public class FolderListFragment extends ListFragment implements SyncthingService.OnServiceStateChangeListener,
AdapterView.OnItemClickListener {
private FoldersAdapter mAdapter;
private final static String TAG = "FolderListFragment";
private Timer mTimer;
private Runnable mUpdateListRunnable = new Runnable() {
@Override
public void run() {
onTimerEvent();
mUpdateListHandler.postDelayed(this, Constants.GUI_UPDATE_INTERVAL);
}
};
private final Handler mUpdateListHandler = new Handler();
private Boolean mLastVisibleToUser = false;
private FoldersAdapter mAdapter;
private SyncthingService.State mServiceState = SyncthingService.State.INIT;
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
{
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// User switched to the current tab, start handler.
startUpdateListHandler();
} else {
// User switched away to another tab, stop handler.
stopUpdateListHandler();
}
mLastVisibleToUser = isVisibleToUser;
}
@Override
public void onPause() {
stopUpdateListHandler();
super.onPause();
if (mTimer != null) {
mTimer.cancel();
}
@Override
public void onResume() {
super.onResume();
if (mLastVisibleToUser) {
startUpdateListHandler();
}
}
private void startUpdateListHandler() {
Log.v(TAG, "startUpdateListHandler");
mUpdateListHandler.removeCallbacks(mUpdateListRunnable);
mUpdateListHandler.post(mUpdateListRunnable);
}
private void stopUpdateListHandler() {
Log.v(TAG, "stopUpdateListHandler");
mUpdateListHandler.removeCallbacks(mUpdateListRunnable);
}
@Override
public void onServiceStateChange(SyncthingService.State currentState) {
if (currentState != SyncthingService.State.ACTIVE)
return;
mTimer = new Timer();
mTimer.schedule(new TimerTask() {
@Override
public void run() {
if (getActivity() == null)
return;
getActivity().runOnUiThread(FolderListFragment.this::updateList);
}
}, 0, Constants.GUI_UPDATE_INTERVAL);
mServiceState = currentState;
}
@Override
@ -67,6 +97,29 @@ public class FolderListFragment extends ListFragment implements SyncthingService
getListView().setOnItemClickListener(this);
}
/**
* Invokes updateList which polls the REST API for folder status updates
* while the user is looking at the current tab.
*/
private void onTimerEvent() {
if (mServiceState != SyncthingService.State.ACTIVE) {
return;
}
MainActivity mainActivity = (MainActivity) getActivity();
if (mainActivity == null) {
return;
}
if (mainActivity.isFinishing()) {
return;
}
RestApi restApi = mainActivity.getApi();
if (restApi == null) {
return;
}
Log.v(TAG, "Invoking updateList on UI thread");
mainActivity.runOnUiThread(FolderListFragment.this::updateList);
}
/**
* Refreshes ListView by updating folders and info.
*

View file

@ -74,23 +74,41 @@ public class StatusFragment extends ListFragment implements SyncthingService.OnS
public void setUserVisibleHint(boolean isVisibleToUser)
{
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && !mLastVisibleToUser) {
if (isVisibleToUser) {
// User switched to the current tab, start handler.
mRestApiQueryHandler.post(mRestApiQueryRunnable);
} else if (!isVisibleToUser && mLastVisibleToUser) {
startRestApiQueryHandler();
} else {
// User switched away to another tab, stop handler.
mRestApiQueryHandler.removeCallbacks(mRestApiQueryRunnable);
stopRestApiQueryHandler();
}
mLastVisibleToUser = isVisibleToUser;
}
@Override
public void onPause() {
mRestApiQueryHandler.removeCallbacks(mRestApiQueryRunnable);
stopRestApiQueryHandler();
super.onPause();
}
@Override
public void onResume() {
super.onResume();
if (mLastVisibleToUser) {
startRestApiQueryHandler();
}
}
private void startRestApiQueryHandler() {
Log.v(TAG, "startUpdateListHandler");
mRestApiQueryHandler.removeCallbacks(mRestApiQueryRunnable);
mRestApiQueryHandler.post(mRestApiQueryRunnable);
}
private void stopRestApiQueryHandler() {
Log.v(TAG, "stopUpdateListHandler");
mRestApiQueryHandler.removeCallbacks(mRestApiQueryRunnable);
}
@Override
public void onServiceStateChange(SyncthingService.State currentState) {
mServiceState = currentState;