Skip to content

Commit d3565a7

Browse files
Rediriontossj
authored andcommitted
Merge pull request TeamNewPipe/NewPipe#5358 from XiangRongLin/testable_prettytime
Make Localization.relativeTime testable
1 parent f49d6b1 commit d3565a7

File tree

4 files changed

+74
-46
lines changed

4 files changed

+74
-46
lines changed

app/src/main/java/org/schabi/newpipelegacy/App.java

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,26 @@
66
import android.content.SharedPreferences;
77
import android.os.Build;
88
import android.util.Log;
9-
109
import androidx.annotation.NonNull;
1110
import androidx.annotation.Nullable;
1211
import androidx.multidex.MultiDexApplication;
1312
import androidx.preference.PreferenceManager;
14-
1513
import com.nostra13.universalimageloader.cache.memory.impl.LRULimitedMemoryCache;
1614
import com.nostra13.universalimageloader.core.ImageLoader;
1715
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
18-
16+
import io.reactivex.rxjava3.disposables.Disposable;
17+
import io.reactivex.rxjava3.exceptions.CompositeException;
18+
import io.reactivex.rxjava3.exceptions.MissingBackpressureException;
19+
import io.reactivex.rxjava3.exceptions.OnErrorNotImplementedException;
20+
import io.reactivex.rxjava3.exceptions.UndeliverableException;
21+
import io.reactivex.rxjava3.functions.Consumer;
22+
import io.reactivex.rxjava3.plugins.RxJavaPlugins;
23+
import java.io.IOException;
24+
import java.io.InterruptedIOException;
25+
import java.net.SocketException;
26+
import java.util.Arrays;
27+
import java.util.Collections;
28+
import java.util.List;
1929
import org.acra.ACRA;
2030
import org.acra.config.ACRAConfigurationException;
2131
import org.acra.config.CoreConfiguration;
@@ -31,21 +41,6 @@
3141
import org.schabi.newpipelegacy.util.ServiceHelper;
3242
import org.schabi.newpipelegacy.util.StateSaver;
3343

34-
import java.io.IOException;
35-
import java.io.InterruptedIOException;
36-
import java.net.SocketException;
37-
import java.util.Arrays;
38-
import java.util.Collections;
39-
import java.util.List;
40-
41-
import io.reactivex.rxjava3.disposables.Disposable;
42-
import io.reactivex.rxjava3.exceptions.CompositeException;
43-
import io.reactivex.rxjava3.exceptions.MissingBackpressureException;
44-
import io.reactivex.rxjava3.exceptions.OnErrorNotImplementedException;
45-
import io.reactivex.rxjava3.exceptions.UndeliverableException;
46-
import io.reactivex.rxjava3.functions.Consumer;
47-
import io.reactivex.rxjava3.plugins.RxJavaPlugins;
48-
4944
/*
5045
* Copyright (C) Hans-Christoph Steiner 2016 <[email protected]>
5146
* App.java is part of NewPipe.
@@ -93,9 +88,9 @@ public void onCreate() {
9388
SettingsActivity.initSettings(this);
9489

9590
NewPipe.init(getDownloader(),
96-
Localization.getPreferredLocalization(this),
97-
Localization.getPreferredContentCountry(this));
98-
Localization.init(getApplicationContext());
91+
Localization.getPreferredLocalization(this),
92+
Localization.getPreferredContentCountry(this));
93+
Localization.initPrettyTime(Localization.resolvePrettyTime(getApplicationContext()));
9994

10095
StateSaver.init(this);
10196
initNotificationChannels();

app/src/main/java/org/schabi/newpipelegacy/MainActivity.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
package org.schabi.newpipelegacy;
2222

23+
import static org.schabi.newpipelegacy.util.Localization.assureCorrectAppLanguage;
24+
2325
import android.content.BroadcastReceiver;
2426
import android.content.Context;
2527
import android.content.Intent;
@@ -41,7 +43,6 @@
4143
import android.widget.ArrayAdapter;
4244
import android.widget.FrameLayout;
4345
import android.widget.Spinner;
44-
4546
import androidx.annotation.NonNull;
4647
import androidx.appcompat.app.ActionBar;
4748
import androidx.appcompat.app.ActionBarDrawerToggle;
@@ -52,9 +53,10 @@
5253
import androidx.fragment.app.Fragment;
5354
import androidx.fragment.app.FragmentManager;
5455
import androidx.preference.PreferenceManager;
55-
5656
import com.google.android.material.bottomsheet.BottomSheetBehavior;
57-
57+
import java.util.ArrayList;
58+
import java.util.List;
59+
import java.util.Objects;
5860
import org.schabi.newpipelegacy.databinding.ActivityMainBinding;
5961
import org.schabi.newpipelegacy.databinding.DrawerHeaderBinding;
6062
import org.schabi.newpipelegacy.databinding.DrawerLayoutBinding;
@@ -87,12 +89,6 @@
8789
import org.schabi.newpipelegacy.util.ThemeHelper;
8890
import org.schabi.newpipelegacy.views.FocusOverlayView;
8991

90-
import java.util.ArrayList;
91-
import java.util.List;
92-
import java.util.Objects;
93-
94-
import static org.schabi.newpipelegacy.util.Localization.assureCorrectAppLanguage;
95-
9692
public class MainActivity extends AppCompatActivity {
9793
private static final String TAG = "MainActivity";
9894
public static final boolean DEBUG = !BuildConfig.BUILD_TYPE.equals("release");
@@ -470,7 +466,7 @@ protected void onDestroy() {
470466
protected void onResume() {
471467
assureCorrectAppLanguage(this);
472468
// Change the date format to match the selected language on resume
473-
Localization.init(getApplicationContext());
469+
Localization.initPrettyTime(Localization.resolvePrettyTime(getApplicationContext()));
474470
super.onResume();
475471

476472
// Close drawer on return, and don't show animation,

app/src/main/java/org/schabi/newpipelegacy/util/Localization.java

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,10 @@
99
import android.os.Build;
1010
import android.text.TextUtils;
1111
import android.util.DisplayMetrics;
12-
1312
import androidx.annotation.NonNull;
1413
import androidx.annotation.PluralsRes;
1514
import androidx.annotation.StringRes;
1615
import androidx.preference.PreferenceManager;
17-
18-
import org.ocpsoft.prettytime.PrettyTime;
19-
import org.ocpsoft.prettytime.units.Decade;
20-
import org.schabi.newpipelegacy.R;
21-
import org.schabi.newpipe.extractor.ListExtractor;
22-
import org.schabi.newpipe.extractor.localization.ContentCountry;
23-
import org.schabi.newpipelegacy.ktx.OffsetDateTimeKt;
24-
2516
import java.math.BigDecimal;
2617
import java.math.RoundingMode;
2718
import java.text.NumberFormat;
@@ -33,6 +24,12 @@
3324
import java.util.Calendar;
3425
import java.util.List;
3526
import java.util.Locale;
27+
import org.ocpsoft.prettytime.PrettyTime;
28+
import org.ocpsoft.prettytime.units.Decade;
29+
import org.schabi.newpipelegacy.R;
30+
import org.schabi.newpipe.extractor.ListExtractor;
31+
import org.schabi.newpipe.extractor.localization.ContentCountry;
32+
import org.schabi.newpipelegacy.ktx.OffsetDateTimeKt;
3633

3734

3835
/*
@@ -62,10 +59,6 @@ public final class Localization {
6259

6360
private Localization() { }
6461

65-
public static void init(final Context context) {
66-
initPrettyTime(context);
67-
}
68-
6962
@NonNull
7063
public static String concatenateStrings(final String... strings) {
7164
return concatenateStrings(Arrays.asList(strings));
@@ -307,12 +300,16 @@ public static String localizeDuration(final Context context, final int durationI
307300
// Pretty Time
308301
//////////////////////////////////////////////////////////////////////////*/
309302

310-
private static void initPrettyTime(final Context context) {
311-
prettyTime = new PrettyTime(getAppLocale(context));
303+
public static void initPrettyTime(final PrettyTime time) {
304+
prettyTime = time;
312305
// Do not use decades as YouTube doesn't either.
313306
prettyTime.removeUnit(Decade.class);
314307
}
315308

309+
public static PrettyTime resolvePrettyTime(final Context context) {
310+
return new PrettyTime(getAppLocale(context));
311+
}
312+
316313
public static String relativeTime(final OffsetDateTime offsetDateTime) {
317314
return relativeTime(OffsetDateTimeKt.toCalendar(offsetDateTime));
318315
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.schabi.newpipelegacy.util
2+
3+
import org.junit.Assert.assertEquals
4+
import org.junit.Test
5+
import org.ocpsoft.prettytime.PrettyTime
6+
import java.text.SimpleDateFormat
7+
import java.time.OffsetDateTime
8+
import java.time.ZoneOffset
9+
import java.util.GregorianCalendar
10+
import java.util.Locale
11+
12+
class LocalizationTest {
13+
14+
@Test
15+
fun `After initializing pretty time relativeTime() with a Calendar must work`() {
16+
val reference = SimpleDateFormat("yyyy/MM/dd").parse("2021/1/1")
17+
Localization.initPrettyTime(PrettyTime(reference, Locale.ENGLISH))
18+
19+
val actual = Localization.relativeTime(GregorianCalendar(2021, 1, 6))
20+
21+
// yes this assertion is true, even if it should be 5 days, it works as it is. Future research required.
22+
assertEquals("1 month from now", actual)
23+
}
24+
25+
@Test(expected = NullPointerException::class)
26+
fun `relativeTime() must fail without initializing pretty time`() {
27+
Localization.relativeTime(GregorianCalendar(2021, 1, 6))
28+
}
29+
30+
@Test
31+
fun `relativeTime() with a OffsetDateTime must work`() {
32+
val reference = SimpleDateFormat("yyyy/MM/dd").parse("2021/1/1")
33+
Localization.initPrettyTime(PrettyTime(reference, Locale.ENGLISH))
34+
35+
val offset = OffsetDateTime.of(2021, 1, 6, 0, 0, 0, 0, ZoneOffset.UTC)
36+
val actual = Localization.relativeTime(offset)
37+
38+
assertEquals("5 days from now", actual)
39+
}
40+
}

0 commit comments

Comments
 (0)