Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor ConnectionManager intialization #468

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 2 additions & 9 deletions app/src/main/java/org/jellyfin/androidtv/TvApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.jellyfin.androidtv.livetv.TvManager;
import org.jellyfin.androidtv.model.DisplayPriorityType;
import org.jellyfin.androidtv.model.LogonCredentials;
import org.jellyfin.androidtv.model.repository.ConnectionManagerRepository;
import org.jellyfin.androidtv.playback.ExternalPlayerActivity;
import org.jellyfin.androidtv.playback.MediaManager;
import org.jellyfin.androidtv.playback.PlaybackController;
Expand Down Expand Up @@ -77,7 +78,6 @@ public class TvApp extends Application {
private static final String TAG = "Jellyfin-AndroidTV";

private ILogger logger;
private IConnectionManager connectionManager;
private PlaybackManager playbackManager;
private GsonJsonSerializer serializer;
private static TvApp app;
Expand Down Expand Up @@ -152,14 +152,6 @@ public void setLogger(ILogger value) {
logger = value;
}

public IConnectionManager getConnectionManager() {
return connectionManager;
}

public void setConnectionManager(IConnectionManager connectionManager) {
this.connectionManager = connectionManager;
}

public UserDto getCurrentUser() {
if (currentUser == null)
logger.Error("Called getCurrentUser() but value was null.");
Expand All @@ -182,6 +174,7 @@ public void setSerializer(GsonJsonSerializer serializer) {
}

public ApiClient getApiClient() {
IConnectionManager connectionManager = ConnectionManagerRepository.Companion.getInstance(this).getConnectionManager();
return currentUser != null ? connectionManager.GetApiClient(currentUser) : null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.jellyfin.androidtv.R;
import org.jellyfin.androidtv.TvApp;
import org.jellyfin.androidtv.model.ChapterItemInfo;
import org.jellyfin.androidtv.model.repository.ConnectionManagerRepository;
import org.jellyfin.androidtv.ui.GridButton;
import org.jellyfin.androidtv.util.ImageUtils;
import org.jellyfin.androidtv.util.TimeUtils;
Expand All @@ -17,6 +18,7 @@
import java.util.Date;

import org.jellyfin.apiclient.interaction.EmptyResponse;
import org.jellyfin.apiclient.interaction.IConnectionManager;
import org.jellyfin.apiclient.interaction.Response;
import org.jellyfin.apiclient.model.apiclient.ServerInfo;
import org.jellyfin.apiclient.model.dto.BaseItemDto;
Expand Down Expand Up @@ -501,9 +503,9 @@ public String getChildCountStr() {
}

public String getBackdropImageUrl() {
switch (type) {
case BaseItem:
return ImageUtils.getBackdropImageUrl(baseItem, TvApp.getApplication().getConnectionManager().GetApiClient(baseItem), true);
if (type == ItemType.BaseItem) {
final IConnectionManager connectionManager = ConnectionManagerRepository.Companion.getInstance(TvApp.getApplication()).getConnectionManager();
return ImageUtils.getBackdropImageUrl(baseItem, connectionManager.GetApiClient(baseItem), true);
}

return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@
import org.jellyfin.androidtv.livetv.LiveTvGuideActivity;
import org.jellyfin.androidtv.model.ChapterItemInfo;
import org.jellyfin.androidtv.model.ViewType;
import org.jellyfin.androidtv.model.repository.ConnectionManagerRepository;
import org.jellyfin.androidtv.playback.MediaManager;
import org.jellyfin.androidtv.util.KeyProcessor;
import org.jellyfin.androidtv.util.Utils;
import org.jellyfin.androidtv.util.apiclient.AuthenticationHelper;
import org.jellyfin.androidtv.util.apiclient.PlaybackHelper;
import org.jellyfin.apiclient.interaction.IConnectionManager;
import org.jellyfin.apiclient.interaction.Response;
import org.jellyfin.apiclient.model.dto.BaseItemDto;
import org.jellyfin.apiclient.model.dto.BaseItemType;
Expand Down Expand Up @@ -252,7 +254,8 @@ public void onResponse(BaseItemDto response) {
break;
case Server:
//Log in to selected server
AuthenticationHelper.signInToServer(application.getConnectionManager(), rowItem.getServerInfo().getAddress(), activity);
final IConnectionManager connectionManager = ConnectionManagerRepository.Companion.getInstance(activity).getConnectionManager();
AuthenticationHelper.signInToServer(connectionManager, rowItem.getServerInfo().getAddress(), activity);
break;

case User:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.jellyfin.androidtv.model.ChangeTriggerType;
import org.jellyfin.androidtv.model.ChapterItemInfo;
import org.jellyfin.androidtv.model.FilterOptions;
import org.jellyfin.androidtv.model.repository.ConnectionManagerRepository;
import org.jellyfin.androidtv.playback.MediaManager;
import org.jellyfin.androidtv.presentation.IPositionablePresenter;
import org.jellyfin.androidtv.presentation.TextItemPresenter;
Expand All @@ -34,6 +35,7 @@
import java.util.TimeZone;

import org.jellyfin.apiclient.interaction.EmptyResponse;
import org.jellyfin.apiclient.interaction.IConnectionManager;
import org.jellyfin.apiclient.interaction.Response;
import org.jellyfin.apiclient.model.apiclient.ServerInfo;
import org.jellyfin.apiclient.model.dto.BaseItemDto;
Expand Down Expand Up @@ -803,8 +805,9 @@ private void LoadServers() {

private void RetrieveViews() {
final ItemRowAdapter adapter = this;
UserDto user = TvApp.getApplication().getCurrentUser();
TvApp.getApplication().getConnectionManager().GetApiClient(user).GetUserViews(user.getId(), new Response<ItemsResult>() {
final UserDto user = TvApp.getApplication().getCurrentUser();
final IConnectionManager connectionManager = ConnectionManagerRepository.Companion.getInstance(TvApp.getApplication()).getConnectionManager();
connectionManager.GetApiClient(user).GetUserViews(user.getId(), new Response<ItemsResult>() {
@Override
public void onResponse(ItemsResult response) {
if (response.getTotalRecordCount() > 0) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package org.jellyfin.androidtv.model.repository

import android.content.Context
import org.jellyfin.androidtv.BuildConfig
import org.jellyfin.androidtv.eventhandling.TvApiEventListener
import org.jellyfin.androidtv.model.compat.AndroidProfile
import org.jellyfin.androidtv.util.ProfileHelper
import org.jellyfin.apiclient.interaction.AndroidConnectionManager
import org.jellyfin.apiclient.interaction.AndroidDevice
import org.jellyfin.apiclient.interaction.VolleyHttpClient
import org.jellyfin.apiclient.interaction.connectionmanager.ConnectionManager
import org.jellyfin.apiclient.logging.AndroidLogger
import org.jellyfin.apiclient.model.logging.ILogger
import org.jellyfin.apiclient.model.serialization.GsonJsonSerializer
import org.jellyfin.apiclient.model.serialization.IJsonSerializer
import org.jellyfin.apiclient.model.session.ClientCapabilities
import org.jellyfin.apiclient.model.session.GeneralCommandType

class ConnectionManagerRepository private constructor(val connectionManager: ConnectionManager, val logger: ILogger, val serializer: IJsonSerializer) {
companion object {
@Volatile
private var INSTANCE: ConnectionManagerRepository? = null

fun getInstance(context: Context): ConnectionManagerRepository =
INSTANCE ?: synchronized(this) {
INSTANCE ?: buildConnectionManager(context).also { INSTANCE = it }
}

private fun buildConnectionManager(context: Context): ConnectionManagerRepository {
thornbill marked this conversation as resolved.
Show resolved Hide resolved
thornbill marked this conversation as resolved.
Show resolved Hide resolved
val serializer: IJsonSerializer = GsonJsonSerializer()
val logger: ILogger = AndroidLogger("Jellyfin-AndroidLogger")
val capabilities = ClientCapabilities().apply {
this.deviceProfile = AndroidProfile(ProfileHelper.getProfileOptions())
this.playableMediaTypes = arrayListOf("Video", "Audio")
this.supportsContentUploading = false
this.supportsSync = false
this.supportsMediaControl = true
this.supportedCommands = arrayListOf(
GeneralCommandType.DisplayContent.toString(),
GeneralCommandType.DisplayMessage.toString()
)
}

return ConnectionManagerRepository(
AndroidConnectionManager(
context.applicationContext,
serializer,
logger,
VolleyHttpClient(logger, context.applicationContext),
"Android TV",
BuildConfig.VERSION_NAME,
AndroidDevice(context.applicationContext),
capabilities,
TvApiEventListener()
),
logger,
serializer
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@
import org.jellyfin.androidtv.browsing.CustomBrowseFragment;
import org.jellyfin.androidtv.itemhandling.BaseRowItem;
import org.jellyfin.androidtv.itemhandling.ItemRowAdapter;
import org.jellyfin.androidtv.model.repository.ConnectionManagerRepository;
import org.jellyfin.androidtv.presentation.CardPresenter;
import org.jellyfin.androidtv.presentation.GridButtonPresenter;
import org.jellyfin.androidtv.ui.GridButton;
import org.jellyfin.androidtv.util.apiclient.AuthenticationHelper;
import org.jellyfin.apiclient.interaction.IConnectionManager;
import org.jellyfin.apiclient.interaction.Response;
import org.jellyfin.apiclient.model.apiclient.ServerInfo;
import org.jellyfin.apiclient.model.serialization.GsonJsonSerializer;
Expand Down Expand Up @@ -75,7 +77,8 @@ public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
switch (((GridButton) item).getId()) {
case SWITCH_SERVER:
// Present server selection
mApplication.getConnectionManager().GetAvailableServers(new Response<ArrayList<ServerInfo>>() {
final IConnectionManager connectionManager = ConnectionManagerRepository.Companion.getInstance(requireContext()).getConnectionManager();
connectionManager.GetAvailableServers(new Response<ArrayList<ServerInfo>>() {
@Override
public void onResponse(ArrayList<ServerInfo> serverResponse) {
Intent serverIntent = new Intent(getActivity(), SelectServerActivity.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,23 @@
import android.os.Bundle;
import android.os.Handler;

import org.jellyfin.androidtv.BuildConfig;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
import androidx.preference.PreferenceManager;

import org.jellyfin.androidtv.R;
import org.jellyfin.androidtv.TvApp;
import org.jellyfin.androidtv.browsing.MainActivity;
import org.jellyfin.androidtv.details.FullDetailsActivity;
import org.jellyfin.androidtv.eventhandling.TvApiEventListener;
import org.jellyfin.androidtv.itemhandling.ItemLauncher;
import org.jellyfin.androidtv.model.compat.AndroidProfile;
import org.jellyfin.androidtv.model.repository.ConnectionManagerRepository;
import org.jellyfin.androidtv.playback.MediaManager;
import org.jellyfin.androidtv.playback.PlaybackManager;
import org.jellyfin.androidtv.util.ProfileHelper;
import org.jellyfin.androidtv.util.Utils;
import org.jellyfin.androidtv.util.apiclient.AuthenticationHelper;
import org.jellyfin.apiclient.interaction.AndroidConnectionManager;
import org.jellyfin.apiclient.interaction.AndroidDevice;
import org.jellyfin.apiclient.interaction.ApiEventListener;
import org.jellyfin.apiclient.interaction.ConnectionResult;
import org.jellyfin.apiclient.interaction.IConnectionManager;
import org.jellyfin.apiclient.interaction.Response;
Expand All @@ -33,16 +34,6 @@
import org.jellyfin.apiclient.model.dto.UserDto;
import org.jellyfin.apiclient.model.logging.ILogger;
import org.jellyfin.apiclient.model.serialization.GsonJsonSerializer;
import org.jellyfin.apiclient.model.session.ClientCapabilities;
import org.jellyfin.apiclient.model.session.GeneralCommandType;

import java.util.ArrayList;

import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
import androidx.preference.PreferenceManager;

public class StartupActivity extends FragmentActivity {
private static final int NETWORK_PERMISSION = 1;
Expand Down Expand Up @@ -142,36 +133,9 @@ private void establishConnection() {

// The underlying http stack. Developers can inject their own if desired
VolleyHttpClient volleyHttpClient = new VolleyHttpClient(logger, application);
TvApp.getApplication().setHttpClient(volleyHttpClient);
ClientCapabilities capabilities = new ClientCapabilities();
ArrayList<String> playableTypes = new ArrayList<>();
playableTypes.add("Video");
playableTypes.add("Audio");
ArrayList<String> supportedCommands = new ArrayList<>();
supportedCommands.add(GeneralCommandType.DisplayContent.toString());
supportedCommands.add(GeneralCommandType.DisplayMessage.toString());

capabilities.setPlayableMediaTypes(playableTypes);
capabilities.setSupportsContentUploading(false);
capabilities.setSupportsSync(false);
capabilities.setDeviceProfile(new AndroidProfile(ProfileHelper.getProfileOptions()));
capabilities.setSupportsMediaControl(true);
capabilities.setSupportedCommands(supportedCommands);
application.setHttpClient(volleyHttpClient);

GsonJsonSerializer jsonSerializer = new GsonJsonSerializer();
ApiEventListener apiEventListener = new TvApiEventListener();

final IConnectionManager connectionManager = new AndroidConnectionManager(application,
jsonSerializer,
logger,
volleyHttpClient,
"Android TV",
BuildConfig.VERSION_NAME,
new AndroidDevice(application),
capabilities,
apiEventListener);

application.setConnectionManager(connectionManager);
application.setSerializer(jsonSerializer);
application.setPlaybackManager(new PlaybackManager(new AndroidDevice(application), logger));

Expand All @@ -181,6 +145,8 @@ private void establishConnection() {
//Load any saved login creds
application.setConfiguredAutoCredentials(AuthenticationHelper.getSavedLoginCredentials(TvApp.CREDENTIALS_PATH));

final IConnectionManager connectionManager = ConnectionManagerRepository.Companion.getInstance(this).getConnectionManager();

//And use those credentials if option is set
if (application.getIsAutoLoginConfigured() || application.getDirectItemId() != null) {
//Auto login as configured user - first connect to server
Expand Down
23 changes: 12 additions & 11 deletions app/src/main/java/org/jellyfin/androidtv/util/KeyProcessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.jellyfin.androidtv.details.PhotoPlayerActivity;
import org.jellyfin.androidtv.itemhandling.AudioQueueItem;
import org.jellyfin.androidtv.itemhandling.BaseRowItem;
import org.jellyfin.androidtv.model.repository.ConnectionManagerRepository;
import org.jellyfin.androidtv.playback.AudioNowPlayingActivity;
import org.jellyfin.androidtv.playback.MediaManager;
import org.jellyfin.androidtv.querying.StdItemQuery;
Expand All @@ -25,6 +26,7 @@
import java.util.List;

import org.jellyfin.apiclient.interaction.EmptyResponse;
import org.jellyfin.apiclient.interaction.IConnectionManager;
import org.jellyfin.apiclient.interaction.Response;
import org.jellyfin.apiclient.model.dto.BaseItemDto;
import org.jellyfin.apiclient.model.dto.BaseItemType;
Expand Down Expand Up @@ -232,18 +234,17 @@ private static void createServerMenu(final BaseRowItem rowItem, final BaseActivi
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case MENU_FORGET:
TvApp.getApplication().getConnectionManager().DeleteServer(rowItem.getItemId(), new EmptyResponse() {
@Override
public void onResponse() {
activity.sendMessage(CustomMessage.RemoveCurrentItem);
}
});
return true;
default:
return false;
if (item.getItemId() == MENU_FORGET) {
final IConnectionManager connectionManager = ConnectionManagerRepository.Companion.getInstance(activity).getConnectionManager();
connectionManager.DeleteServer(rowItem.getItemId(), new EmptyResponse() {
@Override
public void onResponse() {
activity.sendMessage(CustomMessage.RemoveCurrentItem);
}
});
return true;
}
return false;
}
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.jellyfin.androidtv.browsing.MainActivity;
import org.jellyfin.androidtv.details.FullDetailsActivity;
import org.jellyfin.androidtv.model.LogonCredentials;
import org.jellyfin.androidtv.model.repository.ConnectionManagerRepository;
import org.jellyfin.androidtv.startup.SelectServerActivity;
import org.jellyfin.androidtv.startup.SelectUserActivity;
import org.jellyfin.androidtv.util.DelayedMessage;
Expand Down Expand Up @@ -52,7 +53,8 @@ public void onClick(DialogInterface dialog, int whichButton) {
String addressValue = address.getText().toString();
TvApp.getApplication().getLogger().Debug("Entered address: %s", addressValue);
if (!addressValue.isEmpty()) {
signInToServer(TvApp.getApplication().getConnectionManager(), addressValue, activity);
final IConnectionManager connectionManager = ConnectionManagerRepository.Companion.getInstance(activity).getConnectionManager();
signInToServer(connectionManager, addressValue, activity);
}
}
}).show();
Expand Down