Skip to content

Commit

Permalink
Add support for swipe to refresh
Browse files Browse the repository at this point in the history
  • Loading branch information
aanorbel committed Jan 24, 2024
1 parent deb078c commit e09a1fd
Show file tree
Hide file tree
Showing 8 changed files with 461 additions and 303 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package org.openobservatory.ooniprobe.activity;

import android.view.View;

import androidx.annotation.IdRes;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;

import com.google.gson.Gson;

Expand Down Expand Up @@ -42,4 +46,18 @@ public void bindTestService() {
}
}


/**
* Remove the progress fragment.
* <p>
* This method is called when the task is completed.
*/
protected void removeProgressFragment(@IdRes int id) {
Fragment fragment = getSupportFragmentManager().findFragmentById(id);
if (fragment != null && fragment.isAdded()) {
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
}
findViewById(id).setVisibility(View.GONE);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,11 @@ private void scheduleWorkers() {
.build()
).build()
);
// TODO(aanorbel): add rules before checking updates
fetchManualUpdate();
}

public void fetchManualUpdate() {
OneTimeWorkRequest manualWorkRequest = new OneTimeWorkRequest.Builder(ManualUpdateDescriptorsWorker.class)
.setConstraints(
new Constraints.Builder()
Expand Down Expand Up @@ -466,19 +470,6 @@ private Optional<Long> getRunId(Uri uri) {
}
}

/**
* Remove the progress fragment.
* <p>
* This method is called when the task is completed.
*/
private void removeProgressFragment(@IdRes int id) {
Fragment fragment = getSupportFragmentManager().findFragmentById(id);
if (fragment != null && fragment.isAdded()) {
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
}
findViewById(id).setVisibility(View.GONE);
}

@Override
public void onConfirmation(Serializable extra, int i) {
if (extra == null) return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,39 @@
import androidx.annotation.Nullable;
import androidx.core.text.TextUtilsCompat;
import androidx.core.view.ViewCompat;
import androidx.work.Constraints;
import androidx.work.Data;
import androidx.work.ExistingWorkPolicy;
import androidx.work.NetworkType;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkInfo;
import androidx.work.WorkManager;

import com.google.android.material.checkbox.MaterialCheckBox;
import com.google.android.material.snackbar.Snackbar;

import org.openobservatory.engine.BaseNettest;
import org.openobservatory.ooniprobe.R;
import org.openobservatory.ooniprobe.activity.customwebsites.CustomWebsiteActivity;
import org.openobservatory.ooniprobe.activity.overview.OverviewTestsExpandableListViewAdapter;
import org.openobservatory.ooniprobe.activity.overview.OverviewViewModel;
import org.openobservatory.ooniprobe.activity.reviewdescriptorupdates.ReviewDescriptorUpdatesActivity;
import org.openobservatory.ooniprobe.common.AbstractDescriptor;
import org.openobservatory.ooniprobe.common.OONITests;
import org.openobservatory.ooniprobe.common.PreferenceManager;
import org.openobservatory.ooniprobe.common.ReadMorePlugin;
import org.openobservatory.ooniprobe.common.worker.ManualUpdateDescriptorsWorker;
import org.openobservatory.ooniprobe.databinding.ActivityOverviewBinding;
import org.openobservatory.ooniprobe.fragment.dynamicprogressbar.OONIRunDynamicProgressBar;
import org.openobservatory.ooniprobe.fragment.dynamicprogressbar.OnActionListener;
import org.openobservatory.ooniprobe.fragment.dynamicprogressbar.ProgressType;
import org.openobservatory.ooniprobe.model.database.InstalledDescriptor;
import org.openobservatory.ooniprobe.model.database.Result;
import org.openobservatory.ooniprobe.model.database.TestDescriptor;

import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.Objects;

import javax.inject.Inject;

Expand Down Expand Up @@ -179,6 +193,93 @@ private void setUpOnCLickListeners() {
binding.customUrl.setOnClickListener(view -> customUrlClick());
binding.uninstallLink.setOnClickListener(view -> viewModel.uninstallLinkClicked(this, (InstalledDescriptor) descriptor));
binding.automaticUpdatesSwitch.setOnCheckedChangeListener((compoundButton, isChecked) -> viewModel.automaticUpdatesSwitchClicked(isChecked));
if (descriptor instanceof InstalledDescriptor) {
binding.swipeRefresh.setOnRefreshListener(() -> {
binding.swipeRefresh.setRefreshing(false);

Data.Builder data = new Data.Builder();
data.putLongArray(ManualUpdateDescriptorsWorker.KEY_DESCRIPTOR_IDS, new long[]{Objects.requireNonNull(descriptor.getDescriptor()).getRunId()});
OneTimeWorkRequest manualWorkRequest = new OneTimeWorkRequest.Builder(ManualUpdateDescriptorsWorker.class)
.setConstraints(
new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
).setInputData(data.build())
.build();

WorkManager.getInstance(this)
.beginUniqueWork(
ManualUpdateDescriptorsWorker.UPDATED_DESCRIPTORS_WORK_NAME,
ExistingWorkPolicy.REPLACE,
manualWorkRequest
).enqueue();

WorkManager.getInstance(this)
.getWorkInfoByIdLiveData(manualWorkRequest.getId())
.observe(this, this::onManualUpdatesFetchComplete);

});
} else {
binding.swipeRefresh.setEnabled(false);
}
}


/**
* Listens to updates from the {@link ManualUpdateDescriptorsWorker}.
* <p>
* This method is called after the {@link ManualUpdateDescriptorsWorker} is enqueued.
* The {@link ManualUpdateDescriptorsWorker} task is to fetch updates for the descriptors.
* <p>
* If the task is successful, the {@link WorkInfo} object will contain the updated descriptors.
* Otherwise, the {@link WorkInfo} object will be null.
*
* @param workInfo The {@link WorkInfo} of the task.
*/
private void onManualUpdatesFetchComplete(WorkInfo workInfo) {
if (workInfo != null) {
binding.reviewUpdateNotificationFragment.setVisibility(View.VISIBLE);
switch (workInfo.getState()) {
case SUCCEEDED -> getSupportFragmentManager()
.beginTransaction()
.add(
R.id.review_update_notification_fragment,
OONIRunDynamicProgressBar.newInstance(ProgressType.REVIEW_LINK, new OnActionListener() {
@Override
public void onActionButtonCLicked() {

startActivity(
ReviewDescriptorUpdatesActivity.newIntent(
OverviewActivity.this,
workInfo.getOutputData().getString(ManualUpdateDescriptorsWorker.KEY_UPDATED_DESCRIPTORS)
)
);
removeProgressFragment(R.id.review_update_notification_fragment);
}

@Override
public void onCloseButtonClicked() {
removeProgressFragment(R.id.review_update_notification_fragment);
}
}),
OONIRunDynamicProgressBar.getTAG() + "_review_update_success_notification"
).commit();
case ENQUEUED -> getSupportFragmentManager()
.beginTransaction()
.add(
R.id.review_update_notification_fragment,
OONIRunDynamicProgressBar.newInstance(ProgressType.UPDATE_LINK, null),
OONIRunDynamicProgressBar.getTAG() + "_review_update_enqueued_notification"
).commit();
case FAILED -> Snackbar.make(
binding.getRoot(),
R.string.Modal_Error,
Snackbar.LENGTH_LONG
).show();
default -> {
}
}
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,4 +141,10 @@ class TestDescriptorManager @Inject constructor(
return false
}
}

fun getDescriptorsFromIds(ids: Array<Long>): List<TestDescriptor> {
return SQLite.select().from(TestDescriptor::class.java)
.where(TestDescriptor_Table.runId.`in`(ids.toList()))
.queryList()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,13 @@ class ManualUpdateDescriptorsWorker(

val updatedDescriptors: ArrayList<TestDescriptor> = ArrayList()

for (descriptor in d.testDescriptorManager.getDescriptorWithAutoUpdateDisabled()) {
val descriptors = inputData.getLongArray(KEY_DESCRIPTOR_IDS)?.let {
d.testDescriptorManager.getDescriptorsFromIds(it.toTypedArray())
}.run {
d.testDescriptorManager.getDescriptorWithAutoUpdateDisabled()
}

for (descriptor in descriptors) {
Log.d(TAG, "Fetching updates for ${descriptor.runId}")

val updatedDescriptor: TestDescriptor =
Expand Down Expand Up @@ -148,6 +154,9 @@ class ManualUpdateDescriptorsWorker(
@JvmField
var KEY_UPDATED_DESCRIPTORS =
"${AutoUpdateDescriptorsWorker::class.java.name}.KEY_UPDATED_DESCRIPTORS"
@JvmField
var KEY_DESCRIPTOR_IDS =
"${AutoUpdateDescriptorsWorker::class.java.name}.KEY_DESCRIPTOR_IDS"
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import org.openobservatory.engine.BaseNettest
import org.openobservatory.ooniprobe.R
import org.openobservatory.ooniprobe.activity.AbstractActivity
import org.openobservatory.ooniprobe.activity.MainActivity
import org.openobservatory.ooniprobe.activity.OverviewActivity
import org.openobservatory.ooniprobe.activity.RunningActivity
import org.openobservatory.ooniprobe.activity.runtests.RunTestsActivity
Expand Down Expand Up @@ -69,6 +70,11 @@ class DashboardFragment : Fragment(), View.OnClickListener {
addAll(items)
}
}

binding.swipeRefresh.setOnRefreshListener {
(requireActivity() as MainActivity).fetchManualUpdate()
binding.swipeRefresh.isRefreshing = false
}
}

override fun onResume() {
Expand Down
Loading

0 comments on commit e09a1fd

Please sign in to comment.