Skip to content

Commit 66f6e2e

Browse files
authored
With changes for limited connection mode (commons-app#3934)
* With changed for limited connection mode * Java docs * With minor fix * Fix cosmetic issues * Fix ANR * Add Unit test
1 parent 59ee7b8 commit 66f6e2e

15 files changed

+389
-15
lines changed

app/src/main/java/fr/free/nrw/commons/CommonsApplication.java

+14-3
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import fr.free.nrw.commons.kvstore.JsonKvStore;
3737
import fr.free.nrw.commons.logging.FileLoggingTree;
3838
import fr.free.nrw.commons.logging.LogUtils;
39+
import fr.free.nrw.commons.media.CustomOkHttpNetworkFetcher;
3940
import fr.free.nrw.commons.settings.Prefs;
4041
import fr.free.nrw.commons.upload.FileUtils;
4142
import fr.free.nrw.commons.utils.ConfigUtils;
@@ -77,10 +78,19 @@
7778
)
7879

7980
public class CommonsApplication extends MultiDexApplication {
80-
@Inject SessionManager sessionManager;
81-
@Inject DBOpenHelper dbOpenHelper;
8281

83-
@Inject @Named("default_preferences") JsonKvStore defaultPrefs;
82+
public static final String IS_LIMITED_CONNECTION_MODE_ENABLED = "is_limited_connection_mode_enabled";
83+
@Inject
84+
SessionManager sessionManager;
85+
@Inject
86+
DBOpenHelper dbOpenHelper;
87+
88+
@Inject
89+
@Named("default_preferences")
90+
JsonKvStore defaultPrefs;
91+
92+
@Inject
93+
CustomOkHttpNetworkFetcher customOkHttpNetworkFetcher;
8494

8595
/**
8696
* Constants begin
@@ -147,6 +157,7 @@ public void onCreate() {
147157

148158
// Set DownsampleEnabled to True to downsample the image in case it's heavy
149159
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
160+
.setNetworkFetcher(customOkHttpNetworkFetcher)
150161
.setDownsampleEnabled(true)
151162
.build();
152163
try {

app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt

+1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ data class Contribution constructor(
8484
const val STATE_QUEUED = 2
8585
const val STATE_IN_PROGRESS = 3
8686
const val STATE_PAUSED = 4
87+
const val STATE_QUEUED_LIMITED_CONNECTION_MODE=5
8788

8889
/**
8990
* Formatting captions to the Wikibase format for sending labels

app/src/main/java/fr/free/nrw/commons/contributions/ContributionDao.java

+3
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ public Completable delete(final Contribution contribution) {
6161
@Query("SELECT * from contribution WHERE pageId=:pageId")
6262
public abstract Contribution getContribution(String pageId);
6363

64+
@Query("SELECT * from contribution WHERE state=:state")
65+
public abstract Single<List<Contribution>> getContribution(int state);
66+
6467
@Query("UPDATE contribution SET state=:state WHERE state in (:toUpdateStates)")
6568
public abstract Single<Integer> updateStates(int state, int[] toUpdateStates);
6669

app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java

+6
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ public void init(final int position, final Contribution contribution) {
6565
this.contribution = contribution;
6666
this.position = position;
6767
titleView.setText(contribution.getMedia().getMostRelevantCaption());
68+
69+
imageView.getHierarchy().setPlaceholderImage(R.drawable.image_placeholder);
70+
imageView.getHierarchy().setFailureImage(R.drawable.image_placeholder);
71+
72+
6873
final String imageSource = chooseImageSource(contribution.getMedia().getThumbUrl(),
6974
contribution.getLocalUri());
7075
if (!TextUtils.isEmpty(imageSource)) {
@@ -88,6 +93,7 @@ public void init(final int position, final Contribution contribution) {
8893
checkIfMediaExistsOnWikipediaPage(contribution);
8994
break;
9095
case Contribution.STATE_QUEUED:
96+
case Contribution.STATE_QUEUED_LIMITED_CONNECTION_MODE:
9197
stateView.setVisibility(View.VISIBLE);
9298
progressView.setVisibility(View.GONE);
9399
stateView.setText(R.string.contribution_state_queued);

app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ private void fetchCampaigns() {
474474
@Override
475475
public void retryUpload(Contribution contribution) {
476476
if (NetworkUtils.isInternetConnectionEstablished(getContext())) {
477-
if (contribution.getState() == STATE_FAILED || contribution.getState() == STATE_PAUSED && null != uploadService) {
477+
if (contribution.getState() == STATE_FAILED || contribution.getState() == STATE_PAUSED || contribution.getState()==Contribution.STATE_QUEUED_LIMITED_CONNECTION_MODE && null != uploadService) {
478478
uploadService.queue(contribution);
479479
Timber.d("Restarting for %s", contribution.toString());
480480
} else {

app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java

+45
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@
33
import android.annotation.SuppressLint;
44
import android.app.AlertDialog;
55
import android.content.Intent;
6+
import android.os.Build.VERSION;
7+
import android.os.Build.VERSION_CODES;
68
import android.os.Bundle;
79
import android.view.LayoutInflater;
810
import android.view.Menu;
911
import android.view.MenuInflater;
1012
import android.view.MenuItem;
1113
import android.view.View;
1214
import android.widget.ImageView;
15+
import android.widget.Switch;
1316
import android.widget.TextView;
1417
import androidx.annotation.Nullable;
1518
import androidx.core.view.GravityCompat;
@@ -21,6 +24,7 @@
2124
import butterknife.BindView;
2225
import butterknife.ButterKnife;
2326
import com.google.android.material.tabs.TabLayout;
27+
import fr.free.nrw.commons.CommonsApplication;
2428
import fr.free.nrw.commons.R;
2529
import fr.free.nrw.commons.auth.SessionManager;
2630
import fr.free.nrw.commons.location.LocationServiceManager;
@@ -33,6 +37,7 @@
3337
import fr.free.nrw.commons.theme.NavigationBaseActivity;
3438
import fr.free.nrw.commons.upload.UploadService;
3539
import fr.free.nrw.commons.utils.ViewUtil;
40+
import fr.free.nrw.commons.utils.ViewUtilWrapper;
3641
import io.reactivex.android.schedulers.AndroidSchedulers;
3742
import io.reactivex.schedulers.Schedulers;
3843
import java.util.List;
@@ -56,6 +61,8 @@ public class MainActivity extends NavigationBaseActivity implements FragmentMana
5661
NotificationController notificationController;
5762
@Inject
5863
QuizChecker quizChecker;
64+
@Inject
65+
ViewUtilWrapper viewUtilWrapper;
5966

6067

6168
public ContributionsActivityPagerAdapter contributionsActivityPagerAdapter;
@@ -70,6 +77,7 @@ public class MainActivity extends NavigationBaseActivity implements FragmentMana
7077
private TextView notificationCount;
7178
private NearbyParentFragment nearbyParentFragment;
7279

80+
@Override
7381
public void onCreate(Bundle savedInstanceState) {
7482
super.onCreate(savedInstanceState);
7583
setContentView(R.layout.activity_contributions);
@@ -280,9 +288,25 @@ public boolean onCreateOptionsMenu(Menu menu) {
280288
this.menu = menu;
281289
updateMenuItem();
282290
setNotificationCount();
291+
292+
updateLimitedConnectionToggle(menu);
293+
283294
return true;
284295
}
285296

297+
private void updateLimitedConnectionToggle(Menu menu) {
298+
MenuItem checkable = menu.findItem(R.id.toggle_limited_connection_mode);
299+
boolean isEnabled = defaultKvStore
300+
.getBoolean(CommonsApplication.IS_LIMITED_CONNECTION_MODE_ENABLED, false);
301+
302+
checkable.setChecked(isEnabled);
303+
final Switch switchToggleLimitedConnectionMode = checkable.getActionView()
304+
.findViewById(R.id.switch_toggle_limited_connection_mode);
305+
switchToggleLimitedConnectionMode.setChecked(isEnabled);
306+
switchToggleLimitedConnectionMode.setOnCheckedChangeListener(
307+
(buttonView, isChecked) -> toggleLimitedConnectionMode());
308+
}
309+
286310
@SuppressLint("CheckResult")
287311
private void setNotificationCount() {
288312
compositeDisposable.add(notificationController.getNotifications(false)
@@ -339,6 +363,27 @@ public boolean onOptionsItemSelected(MenuItem item) {
339363
}
340364
}
341365

366+
private void toggleLimitedConnectionMode() {
367+
defaultKvStore.putBoolean(CommonsApplication.IS_LIMITED_CONNECTION_MODE_ENABLED,
368+
!defaultKvStore
369+
.getBoolean(CommonsApplication.IS_LIMITED_CONNECTION_MODE_ENABLED, false));
370+
if (defaultKvStore
371+
.getBoolean(CommonsApplication.IS_LIMITED_CONNECTION_MODE_ENABLED, false)) {
372+
viewUtilWrapper
373+
.showShortToast(getBaseContext(), getString(R.string.limited_connection_enabled));
374+
} else {
375+
Intent intent = new Intent(this, UploadService.class);
376+
intent.setAction(UploadService.PROCESS_PENDING_LIMITED_CONNECTION_MODE_UPLOADS);
377+
if (VERSION.SDK_INT >= VERSION_CODES.O) {
378+
startForegroundService(intent);
379+
} else {
380+
startService(intent);
381+
}
382+
viewUtilWrapper
383+
.showShortToast(getBaseContext(), getString(R.string.limited_connection_disabled));
384+
}
385+
}
386+
342387
public class ContributionsActivityPagerAdapter extends FragmentPagerAdapter {
343388
FragmentManager fragmentManager;
344389

0 commit comments

Comments
 (0)