ServiceHelper: return Optional for non-fallback function & renames

There wase one place where `null` was not checked. We use the fallback
function there.

For the `name` function we make clear that `"<unknown>"` is returned
iff the service is not known.
This commit is contained in:
Profpatsch 2024-01-08 10:54:07 +01:00
parent 1d8850d1b2
commit 91826b2428
14 changed files with 64 additions and 37 deletions

View File

@ -134,7 +134,7 @@ public class MainActivity extends AppCompatActivity {
}
ThemeHelper.setDayNightMode(this);
ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceId(this));
ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceIdOrFallback(this));
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceState);
@ -195,7 +195,7 @@ public class MainActivity extends AppCompatActivity {
@Override
public void onDrawerOpened(final View drawerView) {
lastService = ServiceHelper.getSelectedServiceId(MainActivity.this);
lastService = ServiceHelper.getSelectedServiceIdOrFallback(MainActivity.this);
}
@Override
@ -203,7 +203,8 @@ public class MainActivity extends AppCompatActivity {
if (servicesShown) {
toggleServices();
}
if (lastService != ServiceHelper.getSelectedServiceId(MainActivity.this)) {
if (lastService
!= ServiceHelper.getSelectedServiceIdOrFallback(MainActivity.this)) {
ActivityCompat.recreate(MainActivity.this);
}
}
@ -220,7 +221,7 @@ public class MainActivity extends AppCompatActivity {
*/
private void addDrawerMenuForCurrentService() throws ExtractionException {
//Tabs
final int currentServiceId = ServiceHelper.getSelectedServiceId(this);
final int currentServiceId = ServiceHelper.getSelectedServiceIdOrFallback(this);
final StreamingService service = NewPipe.getService(currentServiceId);
int kioskMenuItemId = 0;
@ -284,11 +285,11 @@ public class MainActivity extends AppCompatActivity {
private void changeService(final MenuItem item) {
drawerLayoutBinding.navigation.getMenu()
.getItem(ServiceHelper.getSelectedServiceId(this))
.getItem(ServiceHelper.getSelectedServiceIdOrFallback(this))
.setChecked(false);
ServiceHelper.setSelectedServiceId(this, item.getItemId());
drawerLayoutBinding.navigation.getMenu()
.getItem(ServiceHelper.getSelectedServiceId(this))
.getItem(ServiceHelper.getSelectedServiceIdOrFallback(this))
.setChecked(true);
}
@ -310,7 +311,8 @@ public class MainActivity extends AppCompatActivity {
NavigationHelper.openStatisticFragment(getSupportFragmentManager());
break;
default:
final StreamingService currentService = ServiceHelper.getSelectedService(this);
final StreamingService currentService =
ServiceHelper.getSelectedServiceOrFallback(this);
int kioskMenuItemId = 0;
for (final String kioskId : currentService.getKioskList().getAvailableKiosks()) {
if (kioskMenuItemId == item.getItemId()) {
@ -389,7 +391,7 @@ public class MainActivity extends AppCompatActivity {
}
}
drawerLayoutBinding.navigation.getMenu()
.getItem(ServiceHelper.getSelectedServiceId(this))
.getItem(ServiceHelper.getSelectedServiceIdOrFallback(this))
.setChecked(true);
}
@ -460,7 +462,7 @@ public class MainActivity extends AppCompatActivity {
// so it looks like the drawer isn't open when the user returns to MainActivity
mainBinding.getRoot().closeDrawer(GravityCompat.START, false);
try {
final int selectedServiceId = ServiceHelper.getSelectedServiceId(this);
final int selectedServiceId = ServiceHelper.getSelectedServiceIdOrFallback(this);
final String selectedServiceName = NewPipe.getService(selectedServiceId)
.getServiceInfo().getName();
drawerHeaderBinding.drawerHeaderServiceView.setText(selectedServiceName);

View File

@ -62,7 +62,7 @@ class ErrorInfo(
constructor(throwable: Throwable, userAction: UserAction, request: String) :
this(throwable, userAction, SERVICE_NONE, request)
constructor(throwable: Throwable, userAction: UserAction, request: String, serviceId: Int) :
this(throwable, userAction, ServiceHelper.getNameOfServiceById(serviceId), request)
this(throwable, userAction, ServiceHelper.getNameOfServiceByIdOrUnknown(serviceId), request)
constructor(throwable: Throwable, userAction: UserAction, request: String, info: Info?) :
this(throwable, userAction, getInfoServiceName(info), request)
@ -70,7 +70,7 @@ class ErrorInfo(
constructor(throwable: List<Throwable>, userAction: UserAction, request: String) :
this(throwable, userAction, SERVICE_NONE, request)
constructor(throwable: List<Throwable>, userAction: UserAction, request: String, serviceId: Int) :
this(throwable, userAction, ServiceHelper.getNameOfServiceById(serviceId), request)
this(throwable, userAction, ServiceHelper.getNameOfServiceByIdOrUnknown(serviceId), request)
constructor(throwable: List<Throwable>, userAction: UserAction, request: String, info: Info?) :
this(throwable, userAction, getInfoServiceName(info), request)
@ -83,7 +83,7 @@ class ErrorInfo(
throwableList.map { it.stackTraceToString() }.toTypedArray()
private fun getInfoServiceName(info: Info?) =
if (info == null) SERVICE_NONE else ServiceHelper.getNameOfServiceById(info.serviceId)
if (info == null) SERVICE_NONE else ServiceHelper.getNameOfServiceByIdOrUnknown(info.serviceId)
@StringRes
private fun getMessageStringId(

View File

@ -109,7 +109,7 @@ class ErrorPanelHelper(
if (!isNullOrEmpty((errorInfo.throwable as AccountTerminatedException).message)) {
errorServiceInfoTextView.text = context.resources.getString(
R.string.service_provides_reason,
ServiceHelper.getSelectedService(context)?.serviceInfo?.name ?: "<unknown>"
ServiceHelper.getSelectedServiceNameOrUnknown(context)
)
errorServiceInfoTextView.isVisible = true

View File

@ -171,7 +171,7 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte
if (item.getItemId() == R.id.action_search) {
try {
NavigationHelper.openSearchFragment(getFM(),
ServiceHelper.getSelectedServiceId(activity), "");
ServiceHelper.getSelectedServiceIdOrFallback(activity), "");
} catch (final Exception e) {
ErrorUtil.showUiErrorSnackbar(this, "Opening search fragment", e);
}

View File

@ -25,7 +25,7 @@ public class DefaultKioskFragment extends KioskFragment {
public void onResume() {
super.onResume();
if (serviceId != ServiceHelper.getSelectedServiceId(requireContext())) {
if (serviceId != ServiceHelper.getSelectedServiceIdOrFallback(requireContext())) {
if (currentWorker != null) {
currentWorker.dispose();
}
@ -36,7 +36,7 @@ public class DefaultKioskFragment extends KioskFragment {
private void updateSelectedDefaultKiosk() {
try {
serviceId = ServiceHelper.getSelectedServiceId(requireContext());
serviceId = ServiceHelper.getSelectedServiceIdOrFallback(requireContext());
final KioskList kioskList = NewPipe.getService(serviceId).getKioskList();
kioskId = kioskList.getDefaultKioskId();

View File

@ -60,7 +60,8 @@ public class LocalPlaylistStreamItemHolder extends LocalItemHolder {
itemVideoTitleView.setText(item.getStreamEntity().getTitle());
itemAdditionalDetailsView.setText(Localization
.concatenateStrings(item.getStreamEntity().getUploader(),
ServiceHelper.getNameOfServiceById(item.getStreamEntity().getServiceId())));
ServiceHelper.getNameOfServiceByIdOrUnknown(
item.getStreamEntity().getServiceId())));
if (item.getStreamEntity().getDuration() > 0) {
itemDurationView.setText(Localization

View File

@ -76,7 +76,8 @@ public class LocalStatisticStreamItemHolder extends LocalItemHolder {
Localization.shortViewCount(itemBuilder.getContext(), entry.getWatchCount()),
dateTimeFormatter.format(entry.getLatestAccessDate()),
// serviceName
ServiceHelper.getNameOfServiceById(entry.getStreamEntity().getServiceId()));
ServiceHelper.getNameOfServiceByIdOrUnknown(
entry.getStreamEntity().getServiceId()));
}
@Override

View File

@ -39,9 +39,10 @@ public class RemotePlaylistItemHolder extends PlaylistItemHolder {
// Here is where the uploader name is set in the bookmarked playlists library
if (!TextUtils.isEmpty(item.getUploader())) {
itemUploaderView.setText(Localization.concatenateStrings(item.getUploader(),
ServiceHelper.getNameOfServiceById(item.getServiceId())));
ServiceHelper.getNameOfServiceByIdOrUnknown(item.getServiceId())));
} else {
itemUploaderView.setText(ServiceHelper.getNameOfServiceById(item.getServiceId()));
itemUploaderView.setText(
ServiceHelper.getNameOfServiceByIdOrUnknown(item.getServiceId()));
}
PicassoHelper.loadPlaylistThumbnail(item.getThumbnailUrl()).into(itemThumbnailView);

View File

@ -89,7 +89,7 @@ public class SubscriptionsImportFragment extends BaseFragment {
if (supportedSources.isEmpty() && currentServiceId != Constants.NO_SERVICE_ID) {
ErrorUtil.showSnackbar(activity,
new ErrorInfo(new String[]{}, UserAction.SUBSCRIPTION_IMPORT_EXPORT,
ServiceHelper.getNameOfServiceById(currentServiceId),
ServiceHelper.getNameOfServiceByIdOrUnknown(currentServiceId),
"Service does not support importing subscriptions",
R.string.general_error));
activity.finish();

View File

@ -86,7 +86,7 @@ public final class PlayQueueActivity extends AppCompatActivity
protected void onCreate(final Bundle savedInstanceState) {
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceId(this));
ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceIdOrFallback(this));
queueControlBinding = ActivityPlayerQueueControlBinding.inflate(getLayoutInflater());
setContentView(queueControlBinding.getRoot());

View File

@ -25,7 +25,7 @@ public class PlayQueueItemBuilder {
holder.itemVideoTitleView.setText(item.getTitle());
}
holder.itemAdditionalDetailsView.setText(Localization.concatenateStrings(item.getUploader(),
ServiceHelper.getNameOfServiceById(item.getServiceId())));
ServiceHelper.getNameOfServiceByIdOrUnknown(item.getServiceId())));
if (item.getDuration() > 0) {
holder.itemDurationView.setText(Localization.getDurationString(item.getDuration()));

View File

@ -1,7 +1,7 @@
package org.schabi.newpipe.settings.tabs;
import static org.schabi.newpipe.settings.tabs.Tab.typeFrom;
import static org.schabi.newpipe.util.ServiceHelper.getNameOfServiceById;
import static org.schabi.newpipe.util.ServiceHelper.getNameOfServiceByIdOrUnknown;
import android.annotation.SuppressLint;
import android.app.Dialog;
@ -385,16 +385,18 @@ public class ChooseTabsFragment extends Fragment {
case DEFAULT_KIOSK:
return getString(R.string.default_kiosk_page_summary);
case KIOSK:
return getNameOfServiceById(((Tab.KioskTab) tab).getKioskServiceId())
return getNameOfServiceByIdOrUnknown(
((Tab.KioskTab) tab).getKioskServiceId())
+ "/" + tab.getTabName(requireContext());
case CHANNEL:
return getNameOfServiceById(((Tab.ChannelTab) tab).getChannelServiceId())
return getNameOfServiceByIdOrUnknown(
((Tab.ChannelTab) tab).getChannelServiceId())
+ "/" + tab.getTabName(requireContext());
case PLAYLIST:
final int serviceId = ((Tab.PlaylistTab) tab).getPlaylistServiceId();
final String serviceName = serviceId == -1
? getString(R.string.local)
: getNameOfServiceById(serviceId);
: getNameOfServiceByIdOrUnknown(serviceId);
return serviceName + "/" + tab.getTabName(requireContext());
default:
return tab.getTabName(requireContext());

View File

@ -505,7 +505,7 @@ public abstract class Tab {
}
private String getDefaultKioskId(final Context context) {
final int kioskServiceId = ServiceHelper.getSelectedServiceId(context);
final int kioskServiceId = ServiceHelper.getSelectedServiceIdOrFallback(context);
String kioskId = "";
try {

View File

@ -7,7 +7,6 @@ import android.content.SharedPreferences;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.preference.PreferenceManager;
@ -115,27 +114,48 @@ public final class ServiceHelper {
}
}
public static int getSelectedServiceId(final Context context) {
return Optional.ofNullable(getSelectedService(context))
public static int getSelectedServiceIdOrFallback(final Context context) {
return getSelectedService(context)
.orElse(DEFAULT_FALLBACK_SERVICE)
.getServiceId();
}
@Nullable
public static StreamingService getSelectedService(final Context context) {
public static StreamingService getSelectedServiceOrFallback(final Context context) {
return getSelectedService(context)
.orElse(DEFAULT_FALLBACK_SERVICE);
}
public static Optional<StreamingService> getSelectedService(final Context context) {
final String serviceName = PreferenceManager.getDefaultSharedPreferences(context)
.getString(context.getString(R.string.current_service_key),
context.getString(R.string.default_service_value));
try {
return NewPipe.getService(serviceName);
return Optional.of(NewPipe.getService(serviceName));
} catch (final ExtractionException e) {
return null;
return Optional.empty();
}
}
/** Get the name of the selected service.
*
* @param context
* @return The name of the service or {@literal "<unknown>"}
*/
@NonNull
public static String getNameOfServiceById(final int serviceId) {
public static String getSelectedServiceNameOrUnknown(final Context context) {
return getSelectedService(context)
.map(s -> s.getServiceInfo().getName())
.orElse("<unknown>");
}
/** Get the name of the service if it exists.
*
* @param serviceId
* @return The name of the service or {@literal "<unknown>"}
*/
@NonNull
public static String getNameOfServiceByIdOrUnknown(final int serviceId) {
return ServiceList.all().stream()
.filter(s -> s.getServiceId() == serviceId)
.findFirst()