More groundwork for ProfileFragmentViewModel

This commit is contained in:
Ammar Githam 2021-06-09 09:09:40 +09:00
parent eaac191588
commit ed8ca2da02
8 changed files with 71 additions and 11 deletions

View File

@ -132,7 +132,7 @@ public class ProfilePicDialogFragment extends DialogFragment {
private void fetchAvatar() { private void fetchAvatar() {
if (isLoggedIn) { if (isLoggedIn) {
final UserRepository repository = UserRepository.INSTANCE; final UserRepository repository = UserRepository.Companion.getInstance();
repository.getUserInfo(id, CoroutineUtilsKt.getContinuation((user, throwable) -> AppExecutors.INSTANCE.getMainThread().execute(() -> { repository.getUserInfo(id, CoroutineUtilsKt.getContinuation((user, throwable) -> AppExecutors.INSTANCE.getMainThread().execute(() -> {
if (throwable != null) { if (throwable != null) {
final Context context = getContext(); final Context context = getContext();

View File

@ -90,6 +90,7 @@ import awais.instagrabber.utils.Utils;
import awais.instagrabber.viewmodels.AppStateViewModel; import awais.instagrabber.viewmodels.AppStateViewModel;
import awais.instagrabber.viewmodels.HighlightsViewModel; import awais.instagrabber.viewmodels.HighlightsViewModel;
import awais.instagrabber.viewmodels.ProfileFragmentViewModel; import awais.instagrabber.viewmodels.ProfileFragmentViewModel;
import awais.instagrabber.viewmodels.ProfileFragmentViewModelFactory;
import awais.instagrabber.webservices.DirectMessagesService; import awais.instagrabber.webservices.DirectMessagesService;
import awais.instagrabber.webservices.FriendshipService; import awais.instagrabber.webservices.FriendshipService;
import awais.instagrabber.webservices.GraphQLService; import awais.instagrabber.webservices.GraphQLService;
@ -336,14 +337,18 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
directMessagesService = isLoggedIn ? DirectMessagesService.INSTANCE : null; directMessagesService = isLoggedIn ? DirectMessagesService.INSTANCE : null;
storiesService = isLoggedIn ? StoriesService.INSTANCE : null; storiesService = isLoggedIn ? StoriesService.INSTANCE : null;
mediaService = isLoggedIn ? MediaService.INSTANCE : null; mediaService = isLoggedIn ? MediaService.INSTANCE : null;
userRepository = isLoggedIn ? UserRepository.INSTANCE : null; userRepository = isLoggedIn ? UserRepository.Companion.getInstance() : null;
graphQLService = isLoggedIn ? null : GraphQLService.INSTANCE; graphQLService = isLoggedIn ? null : GraphQLService.INSTANCE;
final Context context = getContext(); final Context context = getContext();
if (context == null) return; if (context == null) return;
accountRepository = AccountRepository.getInstance(AccountDataSource.getInstance(context)); accountRepository = AccountRepository.getInstance(AccountDataSource.getInstance(context));
favoriteRepository = FavoriteRepository.getInstance(FavoriteDataSource.getInstance(context)); favoriteRepository = FavoriteRepository.getInstance(FavoriteDataSource.getInstance(context));
appStateViewModel = new ViewModelProvider(fragmentActivity).get(AppStateViewModel.class); appStateViewModel = new ViewModelProvider(fragmentActivity).get(AppStateViewModel.class);
viewModel = new ViewModelProvider(this).get(ProfileFragmentViewModel.class); viewModel = new ViewModelProvider(this, new ProfileFragmentViewModelFactory(
UserRepository.Companion.getInstance(),
this,
getArguments()
)).get(ProfileFragmentViewModel.class);
setHasOptionsMenu(true); setHasOptionsMenu(true);
} }

View File

@ -285,7 +285,7 @@ public class MorePreferencesFragment extends BasePreferencesFragment {
// adds cookies to database for quick access // adds cookies to database for quick access
final long uid = CookieUtils.getUserIdFromCookie(cookie); final long uid = CookieUtils.getUserIdFromCookie(cookie);
final UserRepository userRepository = UserRepository.INSTANCE; final UserRepository userRepository = UserRepository.Companion.getInstance();
userRepository.getUserInfo(uid, CoroutineUtilsKt.getContinuation((user, throwable) -> AppExecutors.INSTANCE.getMainThread().execute(() -> { userRepository.getUserInfo(uid, CoroutineUtilsKt.getContinuation((user, throwable) -> AppExecutors.INSTANCE.getMainThread().execute(() -> {
if (throwable != null) { if (throwable != null) {
Log.e(TAG, "Error fetching user info", throwable); Log.e(TAG, "Error fetching user info", throwable);

View File

@ -33,7 +33,7 @@ public class AppStateViewModel extends AndroidViewModel {
cookie = settingsHelper.getString(Constants.COOKIE); cookie = settingsHelper.getString(Constants.COOKIE);
final boolean isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != 0; final boolean isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != 0;
if (!isLoggedIn) return; if (!isLoggedIn) return;
userRepository = UserRepository.INSTANCE; userRepository = UserRepository.Companion.getInstance();
// final AccountRepository accountRepository = AccountRepository.getInstance(AccountDataSource.getInstance(application)); // final AccountRepository accountRepository = AccountRepository.getInstance(AccountDataSource.getInstance(application));
fetchProfileDetails(); fetchProfileDetails();
} }

View File

@ -1,10 +1,16 @@
package awais.instagrabber.viewmodels package awais.instagrabber.viewmodels
import android.os.Bundle
import android.util.Log
import androidx.lifecycle.* import androidx.lifecycle.*
import androidx.savedstate.SavedStateRegistryOwner
import awais.instagrabber.repositories.responses.User import awais.instagrabber.repositories.responses.User
import awais.instagrabber.utils.extensions.TAG
import awais.instagrabber.webservices.UserRepository
class ProfileFragmentViewModel( class ProfileFragmentViewModel(
state: SavedStateHandle, state: SavedStateHandle,
userRepository: UserRepository,
) : ViewModel() { ) : ViewModel() {
private val _profile = MutableLiveData<User?>() private val _profile = MutableLiveData<User?>()
val profile: LiveData<User?> = _profile val profile: LiveData<User?> = _profile
@ -16,6 +22,21 @@ class ProfileFragmentViewModel(
private set private set
init { init {
// Log.d(TAG, state.keys().toString()) Log.d(TAG, "${state.keys()} $userRepository")
}
}
@Suppress("UNCHECKED_CAST")
class ProfileFragmentViewModelFactory(
private val userRepository: UserRepository,
owner: SavedStateRegistryOwner,
defaultArgs: Bundle? = null,
) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
override fun <T : ViewModel> create(
key: String,
modelClass: Class<T>,
handle: SavedStateHandle,
): T {
return ProfileFragmentViewModel(handle, userRepository) as T
} }
} }

View File

@ -70,7 +70,7 @@ public class UserSearchViewModel extends ViewModel {
if (TextUtils.isEmpty(csrfToken) || viewerId <= 0 || TextUtils.isEmpty(deviceUuid)) { if (TextUtils.isEmpty(csrfToken) || viewerId <= 0 || TextUtils.isEmpty(deviceUuid)) {
throw new IllegalArgumentException("User is not logged in!"); throw new IllegalArgumentException("User is not logged in!");
} }
userRepository = UserRepository.INSTANCE; userRepository = UserRepository.Companion.getInstance();
directMessagesService = DirectMessagesService.INSTANCE; directMessagesService = DirectMessagesService.INSTANCE;
rankedRecipientsCache = RankedRecipientsCache.INSTANCE; rankedRecipientsCache = RankedRecipientsCache.INSTANCE;
if ((rankedRecipientsCache.isFailed() || rankedRecipientsCache.isExpired()) && !rankedRecipientsCache.isUpdateInitiated()) { if ((rankedRecipientsCache.isFailed() || rankedRecipientsCache.isExpired()) && !rankedRecipientsCache.isUpdateInitiated()) {

View File

@ -7,8 +7,7 @@ import awais.instagrabber.repositories.responses.UserSearchResponse
import awais.instagrabber.webservices.RetrofitFactory.retrofit import awais.instagrabber.webservices.RetrofitFactory.retrofit
import java.util.* import java.util.*
object UserRepository { class UserRepository(private val service: UserService) {
private val service: UserService = retrofit.create(UserService::class.java)
suspend fun getUserInfo(uid: Long): User { suspend fun getUserInfo(uid: Long): User {
val response = service.getUserInfo(uid) val response = service.getUserInfo(uid)
@ -26,4 +25,16 @@ object UserRepository {
val timezoneOffset = TimeZone.getDefault().rawOffset.toFloat() / 1000 val timezoneOffset = TimeZone.getDefault().rawOffset.toFloat() / 1000
return service.search(timezoneOffset, query) return service.search(timezoneOffset, query)
} }
companion object {
@Volatile
private var INSTANCE: UserRepository? = null
fun getInstance(): UserRepository {
return INSTANCE ?: synchronized(this) {
val service: UserService = retrofit.create(UserService::class.java)
UserRepository(service).also { INSTANCE = it }
}
}
}
} }

View File

@ -2,17 +2,40 @@ package awais.instagrabber.viewmodels
import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.SavedStateHandle
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import awais.instagrabber.repositories.UserService
import awais.instagrabber.repositories.responses.FriendshipStatus
import awais.instagrabber.repositories.responses.UserSearchResponse
import awais.instagrabber.repositories.responses.WrappedUser
import awais.instagrabber.webservices.UserRepository
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
internal class ProfileFragmentViewModelTest { internal class ProfileFragmentViewModelTest {
private val userService = object: UserService {
override suspend fun getUserInfo(uid: Long): WrappedUser {
TODO("Not yet implemented")
}
override suspend fun getUsernameInfo(username: String): WrappedUser {
TODO("Not yet implemented")
}
override suspend fun getUserFriendship(uid: Long): FriendshipStatus {
TODO("Not yet implemented")
}
override suspend fun search(timezoneOffset: Float, query: String): UserSearchResponse {
TODO("Not yet implemented")
}
}
@Test @Test
fun testNoUsernameNoCurrentUser() { fun testNoUsernameNoCurrentUser() {
val state = SavedStateHandle(mutableMapOf<String, Any>( val state = SavedStateHandle(mutableMapOf<String, Any>(
"username" to "" "username" to ""
)) ))
val viewModel = ProfileFragmentViewModel(state) val userRepository = UserRepository(userService)
val viewModel = ProfileFragmentViewModel(state, userRepository)
} }
} }