diff --git a/app/src/main/java/me/impy/aegis/helpers/UIRefresher.java b/app/src/main/java/me/impy/aegis/helpers/UIRefresher.java new file mode 100644 index 00000000..4ac16a7c --- /dev/null +++ b/app/src/main/java/me/impy/aegis/helpers/UIRefresher.java @@ -0,0 +1,41 @@ +package me.impy.aegis.helpers; + +import android.os.Handler; + +public class UIRefresher { + private boolean _running; + private Listener _listener; + private Handler _handler; + + public UIRefresher(Listener listener) { + _listener = listener; + _handler = new Handler(); + } + + public void start() { + if (_running) { + return; + } + _running = true; + + _listener.onRefresh(); + _handler.postDelayed(new Runnable() { + @Override + public void run() { + if (_running) { + _listener.onRefresh(); + _handler.postDelayed(this, _listener.getMillisTillNextRefresh()); + } + } + }, _listener.getMillisTillNextRefresh()); + } + + public void stop() { + _running = false; + } + + public interface Listener { + void onRefresh(); + long getMillisTillNextRefresh(); + } +} diff --git a/app/src/main/java/me/impy/aegis/ui/views/KeyProfileHolder.java b/app/src/main/java/me/impy/aegis/ui/views/KeyProfileHolder.java index 91753136..da19b193 100644 --- a/app/src/main/java/me/impy/aegis/ui/views/KeyProfileHolder.java +++ b/app/src/main/java/me/impy/aegis/ui/views/KeyProfileHolder.java @@ -1,7 +1,6 @@ package me.impy.aegis.ui.views; import android.graphics.PorterDuff; -import android.os.Handler; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.ImageView; @@ -10,6 +9,7 @@ import android.widget.TextView; import com.amulyakhare.textdrawable.TextDrawable; import me.impy.aegis.R; +import me.impy.aegis.helpers.UIRefresher; public class KeyProfileHolder extends RecyclerView.ViewHolder { private TextView _profileName; @@ -20,20 +20,31 @@ public class KeyProfileHolder extends RecyclerView.ViewHolder { private PeriodProgressBar _progressBar; - private Handler _uiHandler; - private boolean _running = false; + private UIRefresher _refresher; - KeyProfileHolder(final View view) { + public KeyProfileHolder(final View view) { super(view); _profileName = view.findViewById(R.id.profile_name); _profileCode = view.findViewById(R.id.profile_code); _profileIssuer = view.findViewById(R.id.profile_issuer); _profileDrawable = view.findViewById(R.id.ivTextDrawable); - _progressBar = view.findViewById(R.id.progressBar); - _uiHandler = new Handler(); + _progressBar = view.findViewById(R.id.progressBar); int primaryColorId = view.getContext().getResources().getColor(R.color.colorPrimary); _progressBar.getProgressDrawable().setColorFilter(primaryColorId, PorterDuff.Mode.SRC_IN); + + _refresher = new UIRefresher(new UIRefresher.Listener() { + @Override + public void onRefresh() { + refreshCode(); + _progressBar.refresh(); + } + + @Override + public long getMillisTillNextRefresh() { + return _profile.getEntry().getInfo().getMillisTillNextRotation(); + } + }); } public void setData(KeyProfile profile, boolean showIssuer, boolean showProgress) { @@ -57,30 +68,11 @@ public class KeyProfileHolder extends RecyclerView.ViewHolder { } public void startRefreshLoop() { - if (_running) { - return; - } - _running = true; - - refresh(); - _uiHandler.postDelayed(new Runnable() { - @Override - public void run() { - if (_running) { - refresh(); - _uiHandler.postDelayed(this, _profile.getEntry().getInfo().getMillisTillNextRotation()); - } - } - }, _profile.getEntry().getInfo().getMillisTillNextRotation()); + _refresher.start(); } public void stopRefreshLoop() { - _running = false; - } - - private void refresh() { - refreshCode(); - _progressBar.refresh(); + _refresher.stop(); } private void refreshCode() { diff --git a/app/src/main/java/me/impy/aegis/ui/views/KeyProfileView.java b/app/src/main/java/me/impy/aegis/ui/views/KeyProfileView.java index a0b0920a..30ac7ff7 100644 --- a/app/src/main/java/me/impy/aegis/ui/views/KeyProfileView.java +++ b/app/src/main/java/me/impy/aegis/ui/views/KeyProfileView.java @@ -2,7 +2,6 @@ package me.impy.aegis.ui.views; import android.graphics.PorterDuff; import android.os.Bundle; -import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -15,16 +14,17 @@ import me.impy.aegis.R; import me.impy.aegis.crypto.KeyInfo; import me.impy.aegis.db.DatabaseEntry; import me.impy.aegis.helpers.SimpleItemTouchHelperCallback; +import me.impy.aegis.helpers.UIRefresher; public class KeyProfileView extends Fragment implements KeyProfileAdapter.Listener { private KeyProfileAdapter _adapter; private Listener _listener; private PeriodProgressBar _progressBar; - private Handler _uiHandler; - private boolean _running = false; private boolean _showProgress = false; + private UIRefresher _refresher; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -35,7 +35,6 @@ public class KeyProfileView extends Fragment implements KeyProfileAdapter.Listen public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_keyprofile_view, container, false); - _uiHandler = new Handler(); _progressBar = view.findViewById(R.id.progressBar); int primaryColorId = getResources().getColor(R.color.colorPrimary); _progressBar.getProgressDrawable().setColorFilter(primaryColorId, PorterDuff.Mode.SRC_IN); @@ -49,6 +48,18 @@ public class KeyProfileView extends Fragment implements KeyProfileAdapter.Listen touchHelper.attachToRecyclerView(rvKeyProfiles); rvKeyProfiles.setAdapter(_adapter); + _refresher = new UIRefresher(new UIRefresher.Listener() { + @Override + public void onRefresh() { + refresh(); + } + + @Override + public long getMillisTillNextRefresh() { + return KeyInfo.getMillisTillNextRotation(_adapter.getUniformPeriod()); + } + }); + return view; } @@ -76,27 +87,13 @@ public class KeyProfileView extends Fragment implements KeyProfileAdapter.Listen } } - public void startRefreshLoop() { - if (_running) { - return; - } - _running = true; - - refresh(); - _uiHandler.postDelayed(new Runnable() { - @Override - public void run() { - if (_running) { - refresh(); - _uiHandler.postDelayed(this, KeyInfo.getMillisTillNextRotation(_adapter.getUniformPeriod())); - } - } - }, KeyInfo.getMillisTillNextRotation(_adapter.getUniformPeriod())); + private void startRefreshLoop() { + _refresher.start(); } private void stopRefreshLoop() { refresh(); - _running = false; + _refresher.stop(); } public void setListener(Listener listener) {