Skip to content

Commit 0326eb1

Browse files
committed
Remember last selected instance
Reloads the current instance from the persistence layer (preferences)
1 parent 09774a2 commit 0326eb1

File tree

5 files changed

+105
-44
lines changed

5 files changed

+105
-44
lines changed

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

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,8 @@
8888
import org.schabi.newpipe.util.TLSSocketFactoryCompat;
8989
import org.schabi.newpipe.util.ThemeHelper;
9090
import org.schabi.newpipe.util.services.InstanceManager;
91-
import org.schabi.newpipe.util.services.PeertubeInstanceManager;
91+
import org.schabi.newpipe.util.services.InstanceManagerHelper;
9292
import org.schabi.newpipe.util.services.ServiceHelper;
93-
import org.schabi.newpipe.util.services.YoutubeLikeInstanceManager;
9493
import org.schabi.newpipe.views.FocusOverlayView;
9594

9695
import java.util.ArrayList;
@@ -392,16 +391,9 @@ private void showServices() {
392391
.add(R.id.menu_services_group, s.getServiceId(), ORDER, title)
393392
.setIcon(ServiceHelper.getIcon(s.getServiceId()));
394393

395-
// peertube specifics
396-
InstanceManager<?> instanceManager = null;
397-
if (s.getServiceId() == 0) {
398-
instanceManager = YoutubeLikeInstanceManager.MANAGER;
399-
} else if (s.getServiceId() == 3) {
400-
instanceManager = PeertubeInstanceManager.MANAGER;
401-
}
402-
if (instanceManager != null) {
403-
enhanceServiceMenu(menuItem, instanceManager);
404-
}
394+
// instance specifics
395+
InstanceManagerHelper.getManagerForServiceId(s.getServiceId())
396+
.ifPresent(im -> enhanceServiceMenu(menuItem, im));
405397
}
406398
drawerLayoutBinding.navigation.getMenu()
407399
.getItem(ServiceHelper.getSelectedServiceId(this))

app/src/main/java/org/schabi/newpipe/util/services/AbstractInstanceManager.java

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.schabi.newpipe.util.services;
22

33
import android.content.Context;
4+
import android.util.Log;
45

56
import androidx.annotation.StringRes;
67
import androidx.preference.PreferenceManager;
@@ -11,6 +12,7 @@
1112
import com.grack.nanojson.JsonStringWriter;
1213
import com.grack.nanojson.JsonWriter;
1314

15+
import org.schabi.newpipe.MainActivity;
1416
import org.schabi.newpipe.extractor.InstanceBasedStreamingService;
1517
import org.schabi.newpipe.extractor.instance.Instance;
1618

@@ -19,6 +21,8 @@
1921
import java.util.stream.Collectors;
2022

2123
public abstract class AbstractInstanceManager<I extends Instance> implements InstanceManager<I> {
24+
private static final String TAG = "AbsInstanceManager";
25+
2226
protected abstract InstanceBasedStreamingService<I> getRelatedStreamingService();
2327

2428
protected abstract I createInstanceFromPersistence(JsonObject jsonObject);
@@ -28,9 +32,8 @@ public abstract class AbstractInstanceManager<I extends Instance> implements Ins
2832
@StringRes
2933
protected abstract int getListPersistenceKey();
3034

31-
3235
@Override
33-
public List<I> saveInstanceList(final List<I> instances, final Context context) {
36+
public void saveInstanceList(final List<I> instances, final Context context) {
3437
final JsonStringWriter jsonWriter = JsonWriter.string().object().array("instances");
3538
for (final I instance : instances) {
3639
jsonWriter.object();
@@ -42,15 +45,14 @@ public List<I> saveInstanceList(final List<I> instances, final Context context)
4245
.edit()
4346
.putString(context.getString(getListPersistenceKey()), jsonToSave)
4447
.apply();
45-
return null;
4648
}
4749

4850
@Override
4951
public List<I> getInstanceList(final Context context) {
5052
final String savedInstanceListKey = context.getString(getListPersistenceKey());
5153
final String savedJson = PreferenceManager.getDefaultSharedPreferences(context)
5254
.getString(savedInstanceListKey, null);
53-
if (null == savedJson) {
55+
if (savedJson == null) {
5456
return getDefaultInstanceList();
5557
}
5658

@@ -90,6 +92,33 @@ public I saveCurrentInstance(final I instance, final Context context) {
9092
return instance;
9193
}
9294

95+
@Override
96+
public void reloadCurrentInstanceFromPersistence(final Context context) {
97+
final String json = PreferenceManager.getDefaultSharedPreferences(context)
98+
.getString(context.getString(getSelectedInstancePersistenceKey()), null);
99+
if (json == null) {
100+
return;
101+
}
102+
103+
final JsonObject jsonObject;
104+
try {
105+
jsonObject = JsonParser.object().from(json);
106+
} catch (final JsonParserException e) {
107+
if (MainActivity.DEBUG) {
108+
Log.w(TAG, "Failed to load instance from settings", e);
109+
}
110+
return;
111+
}
112+
113+
try {
114+
getRelatedStreamingService().setInstance(createInstanceFromPersistence(jsonObject));
115+
} catch (final Exception e) {
116+
if (MainActivity.DEBUG) {
117+
Log.w(TAG, "Failed to load instance from settings", e);
118+
}
119+
}
120+
}
121+
93122
@Override
94123
public I getCurrentInstance() {
95124
try {

app/src/main/java/org/schabi/newpipe/util/services/InstanceManager.java

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,55 @@
66

77
import java.util.List;
88

9+
/**
10+
* Manages service instances.
11+
*
12+
* @param <I>
13+
*/
914
public interface InstanceManager<I extends Instance> {
10-
List<I> saveInstanceList(List<I> instances, Context context);
11-
15+
/**
16+
* Saves the instance list (to persistence/preferences).
17+
*
18+
* @param instances instance list
19+
* @param context Context
20+
*/
21+
void saveInstanceList(List<I> instances, Context context);
22+
23+
/**
24+
* Returns the current instance list.
25+
*
26+
* @param context Context
27+
* @return instance list
28+
*/
1229
List<I> getInstanceList(Context context);
1330

31+
/**
32+
* Returns the current instance (from memory / the corresponding streaming-service).
33+
*
34+
* @return The current instance
35+
*/
1436
I getCurrentInstance();
1537

38+
/**
39+
* Reloads the current instance from the persistence layer (preferences).
40+
*
41+
* @param context Context
42+
*/
43+
void reloadCurrentInstanceFromPersistence(Context context);
44+
45+
/**
46+
* Saves the instance as the currently used one (also to the persistence).
47+
*
48+
* @param instance The instance
49+
* @param context Context
50+
* @return the saved instance
51+
*/
1652
I saveCurrentInstance(I instance, Context context);
1753

54+
/**
55+
* Restores the default values.
56+
*
57+
* @param context Context
58+
*/
1859
void restoreDefaults(Context context);
1960
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.schabi.newpipe.util.services;
2+
3+
import org.schabi.newpipe.extractor.instance.Instance;
4+
5+
import java.util.Optional;
6+
7+
public final class InstanceManagerHelper {
8+
private InstanceManagerHelper() {
9+
// No impl
10+
}
11+
12+
@SuppressWarnings("java:S1452") // otherwise generics won't work!
13+
public static Optional<? extends InstanceManager<? extends Instance>> getManagerForServiceId(
14+
final int serviceId
15+
) {
16+
if (serviceId == 0) {
17+
return Optional.of(YoutubeLikeInstanceManager.MANAGER);
18+
} else if (serviceId == 3) {
19+
return Optional.of(PeertubeInstanceManager.MANAGER);
20+
}
21+
return Optional.empty();
22+
}
23+
}

app/src/main/java/org/schabi/newpipe/util/services/ServiceHelper.java

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,17 @@
33
import static org.schabi.newpipe.extractor.ServiceList.SoundCloud;
44

55
import android.content.Context;
6-
import android.content.SharedPreferences;
76

87
import androidx.annotation.DrawableRes;
98
import androidx.annotation.StringRes;
109
import androidx.preference.PreferenceManager;
1110

12-
import com.grack.nanojson.JsonObject;
13-
import com.grack.nanojson.JsonParser;
14-
import com.grack.nanojson.JsonParserException;
15-
1611
import org.schabi.newpipe.R;
1712
import org.schabi.newpipe.extractor.NewPipe;
1813
import org.schabi.newpipe.extractor.ServiceList;
1914
import org.schabi.newpipe.extractor.StreamingService;
2015
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
2116
import org.schabi.newpipe.extractor.instance.Instance;
22-
import org.schabi.newpipe.extractor.services.peertube.PeertubeInstance;
2317
import org.schabi.newpipe.extractor.services.youtube.invidious.InvidiousInstance;
2418

2519
import java.util.OptionalInt;
@@ -174,26 +168,8 @@ public static boolean isBeta(final StreamingService s) {
174168
}
175169

176170
public static void initService(final Context context, final int serviceId) {
177-
if (serviceId == ServiceList.PeerTube.getServiceId()) {
178-
final SharedPreferences sharedPreferences = PreferenceManager
179-
.getDefaultSharedPreferences(context);
180-
final String json = sharedPreferences.getString(context.getString(
181-
R.string.peertube_selected_instance_key), null);
182-
if (null == json) {
183-
return;
184-
}
185-
186-
final JsonObject jsonObject;
187-
try {
188-
jsonObject = JsonParser.object().from(json);
189-
} catch (final JsonParserException e) {
190-
return;
191-
}
192-
final String name = jsonObject.getString("name");
193-
final String url = jsonObject.getString("url");
194-
final PeertubeInstance instance = new PeertubeInstance(url, name);
195-
ServiceList.PeerTube.setInstance(instance);
196-
}
171+
InstanceManagerHelper.getManagerForServiceId(serviceId)
172+
.ifPresent(im -> im.reloadCurrentInstanceFromPersistence(context));
197173
}
198174

199175
public static void initServices(final Context context) {

0 commit comments

Comments
 (0)