From dd943393fae2a3152a2bf0cca05d6011ad970a79 Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Wed, 14 Sep 2022 17:36:02 +0530 Subject: [PATCH 1/2] Remove Loader and Add ViewModel,Repository in Dashboard Fragment --- .../testpress/testpress/network/AppService.kt | 11 +- .../repository/DashBoardRepository.kt | 46 ++++++ .../ui/fragments/DashboardFragment.java | 149 ++++++++---------- .../testpress/viewmodel/DashBoardViewModel.kt | 19 +++ 4 files changed, 137 insertions(+), 88 deletions(-) create mode 100644 app/src/main/java/in/testpress/testpress/repository/DashBoardRepository.kt create mode 100644 app/src/main/java/in/testpress/testpress/viewmodel/DashBoardViewModel.kt diff --git a/app/src/main/java/in/testpress/testpress/network/AppService.kt b/app/src/main/java/in/testpress/testpress/network/AppService.kt index c772d9173..16c1cd3f1 100644 --- a/app/src/main/java/in/testpress/testpress/network/AppService.kt +++ b/app/src/main/java/in/testpress/testpress/network/AppService.kt @@ -5,10 +5,11 @@ import `in`.testpress.network.TestpressApiClient import `in`.testpress.testpress.BuildConfig import `in`.testpress.testpress.core.Constants import `in`.testpress.testpress.models.InstituteSettings +import `in`.testpress.testpress.models.pojo.DashboardResponse import `in`.testpress.testpress.models.pojo.GenerateOTPResponse import `in`.testpress.testpress.models.pojo.OTPLoginResponse import android.content.Context -import retrofit.http.GET +import retrofit2.http.GET import retrofit2.http.Body import retrofit2.http.POST import kotlin.collections.HashMap @@ -17,6 +18,10 @@ const val OTP_URL = "/api/v2.5/auth/generate-otp/" const val VERIFY_OTP_URL = "/api/v2.5/auth/otp-login/" interface AppService { + + @GET("/api/v2.4/dashboard/") + fun getDashBoardData():RetrofitCall + @GET(Constants.Http.URL_INSTITUTE_SETTINGS_FRAG) fun getInstituteSettings(): RetrofitCall @@ -31,6 +36,10 @@ interface AppService { class AppNetwork(context: Context) : TestpressApiClient(BuildConfig.BASE_URL, context) { private fun getAppService() = retrofit.create(AppService::class.java) + fun getDashBoardData():RetrofitCall{ + return getAppService().getDashBoardData() + } + fun getInstituteSettings(): RetrofitCall { return getAppService().getInstituteSettings() } diff --git a/app/src/main/java/in/testpress/testpress/repository/DashBoardRepository.kt b/app/src/main/java/in/testpress/testpress/repository/DashBoardRepository.kt new file mode 100644 index 000000000..95950fb54 --- /dev/null +++ b/app/src/main/java/in/testpress/testpress/repository/DashBoardRepository.kt @@ -0,0 +1,46 @@ +package `in`.testpress.testpress.repository + +import `in`.testpress.network.NetworkBoundResource +import `in`.testpress.network.Resource +import `in`.testpress.network.RetrofitCall +import `in`.testpress.testpress.models.pojo.DashboardResponse +import `in`.testpress.testpress.network.AppNetwork +import `in`.testpress.testpress.util.PreferenceManager +import android.content.Context +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.google.gson.GsonBuilder + +class DashBoardRepository( + val context: Context +) { + private val service = AppNetwork(context) + + fun loadData(): LiveData> { + return object : NetworkBoundResource() { + + override fun loadFromDb(): LiveData { + val liveData = MutableLiveData() + liveData.postValue( + PreferenceManager.getDashboardDataPreferences(context) + ) + return liveData + } + + override fun saveNetworkResponseToDB(item: DashboardResponse) { + val gson = GsonBuilder().setPrettyPrinting().create() + val json = gson.toJson(item) + PreferenceManager.setDashboardData(context, json) + } + + override fun shouldFetch(data: DashboardResponse?): Boolean { + return true + } + + override fun createCall(): RetrofitCall { + return service.getDashBoardData() + } + }.asLiveData() + } + +} \ No newline at end of file diff --git a/app/src/main/java/in/testpress/testpress/ui/fragments/DashboardFragment.java b/app/src/main/java/in/testpress/testpress/ui/fragments/DashboardFragment.java index ce7482cd5..9509fa7ff 100644 --- a/app/src/main/java/in/testpress/testpress/ui/fragments/DashboardFragment.java +++ b/app/src/main/java/in/testpress/testpress/ui/fragments/DashboardFragment.java @@ -1,18 +1,12 @@ package in.testpress.testpress.ui.fragments; +import static in.testpress.testpress.BuildConfig.APPLICATION_ID; +import static in.testpress.testpress.util.PreferenceManager.getDashboardDataPreferences; + import android.accounts.Account; import android.accounts.AccountManager; import android.content.Context; import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; -import androidx.loader.app.LoaderManager; -import androidx.loader.content.Loader; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -20,14 +14,19 @@ import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.loader.content.Loader; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import com.facebook.shimmer.ShimmerFrameLayout; -import com.github.kevinsawicki.wishlist.Toaster; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import javax.inject.Inject; @@ -40,18 +39,15 @@ import in.testpress.testpress.models.DaoSession; import in.testpress.testpress.models.pojo.DashboardResponse; import in.testpress.testpress.models.pojo.DashboardSection; +import in.testpress.testpress.repository.DashBoardRepository; import in.testpress.testpress.ui.ThrowableLoader; import in.testpress.testpress.ui.adapters.DashboardAdapter; +import in.testpress.testpress.viewmodel.DashBoardViewModel; import io.sentry.Sentry; import io.sentry.protocol.User; -import static in.testpress.testpress.BuildConfig.APPLICATION_ID; -import static in.testpress.testpress.util.PreferenceManager.getDashboardDataPreferences; -import static in.testpress.testpress.util.PreferenceManager.setDashboardData; - -public class DashboardFragment extends Fragment implements - LoaderManager.LoaderCallbacks { +public class DashboardFragment extends Fragment { private ArrayList sections = new ArrayList<>(); @InjectView(R.id.recycler_View) @@ -77,16 +73,20 @@ public class DashboardFragment extends Fragment implements private DaoSession daoSession; protected Exception exception; DashboardResponse dashboardResponse; - + private DashBoardViewModel viewModel; @Override public void onCreate(@Nullable Bundle savedInstanceState) { Injector.inject(this); super.onCreate(savedInstanceState); - initLoader(); + initViewModel(); setUsernameInSentry(); } + private void initViewModel() { + viewModel = new DashBoardViewModel(new DashBoardRepository(requireContext())); + } + private void setUsernameInSentry() { AccountManager manager = (AccountManager) getActivity().getSystemService(Context.ACCOUNT_SERVICE); Account[] account = manager.getAccountsByType(APPLICATION_ID); @@ -97,6 +97,14 @@ private void setUsernameInSentry() { } } + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + Injector.inject(this); + getActivity().invalidateOptionsMenu(); + return inflater.inflate(R.layout.dashboard_view, null); + + } + @Override public void onViewCreated(final View view, final Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); @@ -106,6 +114,7 @@ public void onViewCreated(final View view, final Bundle savedInstanceState) { recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); swipeRefreshLayout.setEnabled(true); + showDataFromCacheIfAvailable(); addOnClickListeners(); } @@ -114,28 +123,10 @@ private void showDataFromCacheIfAvailable() { if (!getSections().isEmpty()) { adapter.setResponse(getDashboardDataPreferences(requireContext())); } else { - showLoading(); + loadData(); } } - private void showLoading() { - loadingPlaceholder.setVisibility(View.VISIBLE); - loadingPlaceholder.startShimmer(); - } - - private void hideShimmer() { - loadingPlaceholder.stopShimmer(); - loadingPlaceholder.setVisibility(View.GONE); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - Injector.inject(this); - getActivity().invalidateOptionsMenu(); - return inflater.inflate(R.layout.dashboard_view, null); - - } - private void addOnClickListeners() { swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override @@ -157,46 +148,46 @@ public void onClick(View v) { public void refresh() { if (getActivity() != null) { - getLoaderManager().restartLoader(0, null, this); + loadData(); } } - private List getSections() { - return getDashboardDataPreferences(getContext()).getAvailableSections(); + private void loadData() { + viewModel.loadData().observe(getViewLifecycleOwner(), dashboard -> { + showLoadingImage(); + switch (dashboard.getStatus()) { + case SUCCESS: { + swipeRefreshLayout.setRefreshing(false); + adapter.setResponse(Objects.requireNonNull(dashboard.getData())); + hideShimmer(); + break; + } + case ERROR: { + hideShimmer(); + setEmptyText(); + break; + } + } + }); } - @NonNull - @Override - public Loader onCreateLoader(int id, @Nullable Bundle args) { - return new ThrowableLoader(getContext(), dashboardResponse) { + private void showLoadingImage() { + loadingPlaceholder.setVisibility(View.VISIBLE); + loadingPlaceholder.startShimmer(); + } - @Override - public DashboardResponse loadData() throws Exception { - try { - return serviceProvider.getService(getActivity()).getDashboardData(); - } catch (Exception exception) { - throw exception; - } - } - }; + private void hideShimmer() { + loadingPlaceholder.stopShimmer(); + loadingPlaceholder.setVisibility(View.GONE); } - @Override - public void onLoadFinished(@NonNull Loader loader, DashboardResponse data) { - final Exception exception = getException(loader); - swipeRefreshLayout.setRefreshing(false); - hideShimmer(); - if (exception != null) { - this.exception = exception; - getLoaderManager().destroyLoader(loader.getId()); - adapter.setResponse(getDashboardDataPreferences(getContext())); - return; - } - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - String json = gson.toJson(data); - setDashboardData(getContext(), json); - adapter.setResponse(data); - adapter.notifyDataSetChanged(); + private void setEmptyText() { + setEmptyText(R.string.no_data_available, R.string.try_after_some_time, + R.drawable.ic_error_outline_black_18dp); + } + + private List getSections() { + return getDashboardDataPreferences(getContext()).getAvailableSections(); } @Override @@ -205,10 +196,6 @@ public void onResume() { refresh(); } - private void setEmptyText() { - setEmptyText(R.string.no_data_available, R.string.try_after_some_time, - R.drawable.ic_error_outline_black_18dp); - } protected int getErrorMessage(Exception exception) { if (exception instanceof IOException) { @@ -243,16 +230,4 @@ private void setEmptyText(final int title, final int description, final int icon retryButton.setVisibility(View.VISIBLE); } - @Override - public void onLoaderReset(@NonNull Loader loader) { - - } - - private void initLoader() { - if (firstCallback) { - getLoaderManager().initLoader(0, null, this); - firstCallback = false; - } - } - } diff --git a/app/src/main/java/in/testpress/testpress/viewmodel/DashBoardViewModel.kt b/app/src/main/java/in/testpress/testpress/viewmodel/DashBoardViewModel.kt new file mode 100644 index 000000000..f6988a407 --- /dev/null +++ b/app/src/main/java/in/testpress/testpress/viewmodel/DashBoardViewModel.kt @@ -0,0 +1,19 @@ +package `in`.testpress.testpress.viewmodel + +import `in`.testpress.network.Resource +import `in`.testpress.testpress.models.pojo.DashboardResponse +import `in`.testpress.testpress.repository.DashBoardRepository +import androidx.lifecycle.LiveData +import androidx.lifecycle.ViewModel + + +class DashBoardViewModel( + private val dashBoardRepository: DashBoardRepository +) : ViewModel() { + + fun loadData(): LiveData> { + return dashBoardRepository.loadData() + } + +} + From 8ce3f9084786ebc7c3f0e29714b9ed0137dd3062 Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Thu, 15 Sep 2022 12:24:48 +0530 Subject: [PATCH 2/2] Convert DashboardFragment Java to Kotlin --- .../testpress/testpress/TestpressModule.java | 4 +- .../testpress/testpress/ui/MainActivity.java | 5 +- .../ui/fragments/DashBoardFragment.kt | 200 +++++++++++++++ .../ui/fragments/DashboardFragment.java | 233 ------------------ 4 files changed, 204 insertions(+), 238 deletions(-) create mode 100644 app/src/main/java/in/testpress/testpress/ui/fragments/DashBoardFragment.kt delete mode 100644 app/src/main/java/in/testpress/testpress/ui/fragments/DashboardFragment.java diff --git a/app/src/main/java/in/testpress/testpress/TestpressModule.java b/app/src/main/java/in/testpress/testpress/TestpressModule.java index 94f785ac3..22fa8764b 100644 --- a/app/src/main/java/in/testpress/testpress/TestpressModule.java +++ b/app/src/main/java/in/testpress/testpress/TestpressModule.java @@ -45,7 +45,7 @@ import in.testpress.testpress.ui.ProfileDetailsActivity; import in.testpress.testpress.ui.ProfilePhotoActivity; import in.testpress.testpress.ui.WebViewActivity; -import in.testpress.testpress.ui.fragments.DashboardFragment; +import in.testpress.testpress.ui.fragments.DashBoardFragment; import in.testpress.testpress.ui.fragments.OTPVerificationFragment; import in.testpress.testpress.ui.fragments.PhoneAuthenticationFragment; import in.testpress.testpress.ui.fragments.UsernameAuthentication; @@ -89,7 +89,7 @@ ForumActivity.class, CreateForumActivity.class, WebViewActivity.class, - DashboardFragment.class, + DashBoardFragment.class, DoubtsActivity.class, LoginActivityV2.class, UsernameAuthentication.class, diff --git a/app/src/main/java/in/testpress/testpress/ui/MainActivity.java b/app/src/main/java/in/testpress/testpress/ui/MainActivity.java index 4524112eb..ec9b1196a 100644 --- a/app/src/main/java/in/testpress/testpress/ui/MainActivity.java +++ b/app/src/main/java/in/testpress/testpress/ui/MainActivity.java @@ -66,7 +66,7 @@ import in.testpress.testpress.models.InstituteSettingsDao; import in.testpress.testpress.models.SsoUrl; import in.testpress.testpress.models.Update; -import in.testpress.testpress.ui.fragments.DashboardFragment; +import in.testpress.testpress.ui.fragments.DashBoardFragment; import in.testpress.testpress.ui.fragments.DiscussionFragmentv2; import in.testpress.testpress.ui.utils.HandleMainMenu; import in.testpress.testpress.util.CommonUtils; @@ -75,7 +75,6 @@ import in.testpress.testpress.util.Strings; import in.testpress.testpress.util.UIUtils; import in.testpress.testpress.util.UpdateAppDialogManager; -import in.testpress.ui.fragments.DiscussionFragment; import io.sentry.android.core.SentryAndroid; import static in.testpress.testpress.BuildConfig.ALLOW_ANONYMOUS_USER; @@ -335,7 +334,7 @@ private void initScreen() { } if (isUserAuthenticated && mInstituteSettings.getShowGameFrontend()) { - addMenuItem(R.string.dashboard, R.drawable.ic_dashboard, new DashboardFragment()); + addMenuItem(R.string.dashboard, R.drawable.ic_dashboard, new DashBoardFragment()); } else { addMenuItem(R.string.dashboard, R.drawable.profile_default, new MainMenuFragment()); } diff --git a/app/src/main/java/in/testpress/testpress/ui/fragments/DashBoardFragment.kt b/app/src/main/java/in/testpress/testpress/ui/fragments/DashBoardFragment.kt new file mode 100644 index 000000000..ea0158142 --- /dev/null +++ b/app/src/main/java/in/testpress/testpress/ui/fragments/DashBoardFragment.kt @@ -0,0 +1,200 @@ +package `in`.testpress.testpress.ui.fragments + +import `in`.testpress.enums.Status +import `in`.testpress.network.Resource +import `in`.testpress.testpress.BuildConfig +import `in`.testpress.testpress.Injector +import `in`.testpress.testpress.R +import `in`.testpress.testpress.TestpressServiceProvider +import `in`.testpress.testpress.models.pojo.DashboardResponse +import `in`.testpress.testpress.models.pojo.DashboardSection +import `in`.testpress.testpress.repository.DashBoardRepository +import `in`.testpress.testpress.ui.adapters.DashboardAdapter +import `in`.testpress.testpress.util.PreferenceManager +import `in`.testpress.testpress.viewmodel.DashBoardViewModel +import android.accounts.AccountManager +import android.content.Context +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.LinearLayout +import android.widget.TextView +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout +import butterknife.ButterKnife +import butterknife.InjectView +import com.facebook.shimmer.ShimmerFrameLayout +import io.sentry.Sentry +import io.sentry.protocol.User +import javax.inject.Inject + +class DashBoardFragment : Fragment() { + + @InjectView(R.id.recycler_View) + lateinit var recyclerView: RecyclerView + + @InjectView(R.id.empty_container) + lateinit var emptyView: LinearLayout + + @InjectView(R.id.empty_title) + lateinit var emptyTitleView: TextView + + @InjectView(R.id.empty_description) + lateinit var emptyDescView: TextView + + @InjectView(R.id.retry_button) + lateinit var retryButton: Button + + @InjectView(R.id.swipe_container) + lateinit var swipeRefreshLayout: SwipeRefreshLayout + + @InjectView(R.id.shimmer_view_container) + lateinit var loadingPlaceholder: ShimmerFrameLayout + + @Inject + lateinit var serviceProvider: TestpressServiceProvider + private lateinit var adapter: DashboardAdapter + lateinit var exception: Exception + lateinit var dashboardResponse: DashboardResponse + private lateinit var viewModel: DashBoardViewModel + + override fun onCreate(savedInstanceState: Bundle?) { + Injector.inject(this) + super.onCreate(savedInstanceState) + + initViewModel() + setUsernameInSentry() + } + + private fun initViewModel() { + viewModel = ViewModelProvider(this, object : ViewModelProvider.Factory { + override fun create(modelClass: Class): T { + return DashBoardViewModel(DashBoardRepository(requireContext())) as T + } + }).get(DashBoardViewModel::class.java) + } + + private fun setUsernameInSentry() { + val manager = activity!!.getSystemService(Context.ACCOUNT_SERVICE) as AccountManager + val account = manager.getAccountsByType(BuildConfig.APPLICATION_ID) + if (account.isNotEmpty()) { + val user = User() + user.username = account[0].name + Sentry.setUser(user) + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + Injector.inject(this) + activity!!.invalidateOptionsMenu() + return inflater.inflate(R.layout.dashboard_view, null) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + ButterKnife.inject(this, view) + + setRecycleViewAdapter() + showDataFromCacheIfAvailable() + addOnClickListeners() + } + + private fun setRecycleViewAdapter() { + adapter = DashboardAdapter(context, DashboardResponse(), serviceProvider) + recyclerView.adapter = adapter + recyclerView.layoutManager = LinearLayoutManager(context) + swipeRefreshLayout.isEnabled = true + } + + private fun showDataFromCacheIfAvailable() { + if (getSections().isNotEmpty()) { + adapter.setResponse(PreferenceManager.getDashboardDataPreferences(requireContext())) + } else { + loadData() + } + } + + private fun getSections(): List { + return PreferenceManager.getDashboardDataPreferences(context).availableSections + } + + private fun addOnClickListeners() { + swipeRefreshLayout.setOnRefreshListener { + swipeRefreshLayout.isEnabled = true + refresh() + } + retryButton.setOnClickListener { + swipeRefreshLayout.visibility = View.VISIBLE + swipeRefreshLayout.isRefreshing = true + emptyView.visibility = View.GONE + refresh() + } + } + + fun refresh() { + if (activity != null) { + loadData() + } + } + + private fun loadData() { + viewModel.loadData().observe( + viewLifecycleOwner, + Observer> { dashBoard -> + showLoadingImage() + when (dashBoard.status) { + Status.SUCCESS -> { + swipeRefreshLayout.isRefreshing = false + adapter.setResponse(dashBoard.data) + hideShimmer() + } + Status.ERROR -> { + hideShimmer() + setEmptyText() + } + else -> {} + } + }) + } + + private fun showLoadingImage() { + loadingPlaceholder.visibility = View.VISIBLE + loadingPlaceholder.startShimmer() + } + + private fun hideShimmer() { + loadingPlaceholder.stopShimmer() + loadingPlaceholder.visibility = View.GONE + } + + private fun setEmptyText() { + setEmptyText( + R.string.no_data_available, R.string.try_after_some_time, + R.drawable.ic_error_outline_black_18dp + ) + } + + private fun setEmptyText(title: Int, description: Int, icon: Int) { + emptyView.visibility = View.VISIBLE + emptyTitleView.setText(title) + emptyTitleView.setCompoundDrawablesWithIntrinsicBounds(icon, 0, 0, 0) + emptyDescView.setText(description) + retryButton.visibility = View.VISIBLE + } + + override fun onResume() { + super.onResume() + refresh() + } +} \ No newline at end of file diff --git a/app/src/main/java/in/testpress/testpress/ui/fragments/DashboardFragment.java b/app/src/main/java/in/testpress/testpress/ui/fragments/DashboardFragment.java deleted file mode 100644 index 9509fa7ff..000000000 --- a/app/src/main/java/in/testpress/testpress/ui/fragments/DashboardFragment.java +++ /dev/null @@ -1,233 +0,0 @@ -package in.testpress.testpress.ui.fragments; - -import static in.testpress.testpress.BuildConfig.APPLICATION_ID; -import static in.testpress.testpress.util.PreferenceManager.getDashboardDataPreferences; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.content.Context; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; -import androidx.loader.content.Loader; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; - -import com.facebook.shimmer.ShimmerFrameLayout; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import javax.inject.Inject; - -import butterknife.ButterKnife; -import butterknife.InjectView; -import in.testpress.testpress.Injector; -import in.testpress.testpress.R; -import in.testpress.testpress.TestpressServiceProvider; -import in.testpress.testpress.core.TestpressService; -import in.testpress.testpress.models.DaoSession; -import in.testpress.testpress.models.pojo.DashboardResponse; -import in.testpress.testpress.models.pojo.DashboardSection; -import in.testpress.testpress.repository.DashBoardRepository; -import in.testpress.testpress.ui.ThrowableLoader; -import in.testpress.testpress.ui.adapters.DashboardAdapter; -import in.testpress.testpress.viewmodel.DashBoardViewModel; -import io.sentry.Sentry; -import io.sentry.protocol.User; - - -public class DashboardFragment extends Fragment { - - private ArrayList sections = new ArrayList<>(); - @InjectView(R.id.recycler_View) - RecyclerView recyclerView; - @InjectView(R.id.empty_container) - LinearLayout emptyView; - @InjectView(R.id.empty_title) - TextView emptyTitleView; - @InjectView(R.id.empty_description) - TextView emptyDescView; - @InjectView(R.id.retry_button) - Button retryButton; - @InjectView(R.id.swipe_container) - SwipeRefreshLayout swipeRefreshLayout; - @InjectView(R.id.shimmer_view_container) - ShimmerFrameLayout loadingPlaceholder; - - @Inject - protected TestpressServiceProvider serviceProvider; - private DashboardAdapter adapter; - private TestpressService testpressService; - private boolean firstCallback = true; - private DaoSession daoSession; - protected Exception exception; - DashboardResponse dashboardResponse; - private DashBoardViewModel viewModel; - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - Injector.inject(this); - super.onCreate(savedInstanceState); - initViewModel(); - setUsernameInSentry(); - } - - private void initViewModel() { - viewModel = new DashBoardViewModel(new DashBoardRepository(requireContext())); - } - - private void setUsernameInSentry() { - AccountManager manager = (AccountManager) getActivity().getSystemService(Context.ACCOUNT_SERVICE); - Account[] account = manager.getAccountsByType(APPLICATION_ID); - if (account.length > 0) { - User user = new User(); - user.setUsername(account[0].name); - Sentry.setUser(user); - } - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - Injector.inject(this); - getActivity().invalidateOptionsMenu(); - return inflater.inflate(R.layout.dashboard_view, null); - - } - - @Override - public void onViewCreated(final View view, final Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - ButterKnife.inject(this, view); - - adapter = new DashboardAdapter(getContext(), new DashboardResponse(), serviceProvider); - recyclerView.setAdapter(adapter); - recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - swipeRefreshLayout.setEnabled(true); - - showDataFromCacheIfAvailable(); - addOnClickListeners(); - } - - private void showDataFromCacheIfAvailable() { - if (!getSections().isEmpty()) { - adapter.setResponse(getDashboardDataPreferences(requireContext())); - } else { - loadData(); - } - } - - private void addOnClickListeners() { - swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - swipeRefreshLayout.setEnabled(true); - refresh(); - } - }); - retryButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - swipeRefreshLayout.setVisibility(View.VISIBLE); - swipeRefreshLayout.setRefreshing(true); - emptyView.setVisibility(View.GONE); - refresh(); - } - }); - } - - public void refresh() { - if (getActivity() != null) { - loadData(); - } - } - - private void loadData() { - viewModel.loadData().observe(getViewLifecycleOwner(), dashboard -> { - showLoadingImage(); - switch (dashboard.getStatus()) { - case SUCCESS: { - swipeRefreshLayout.setRefreshing(false); - adapter.setResponse(Objects.requireNonNull(dashboard.getData())); - hideShimmer(); - break; - } - case ERROR: { - hideShimmer(); - setEmptyText(); - break; - } - } - }); - } - - private void showLoadingImage() { - loadingPlaceholder.setVisibility(View.VISIBLE); - loadingPlaceholder.startShimmer(); - } - - private void hideShimmer() { - loadingPlaceholder.stopShimmer(); - loadingPlaceholder.setVisibility(View.GONE); - } - - private void setEmptyText() { - setEmptyText(R.string.no_data_available, R.string.try_after_some_time, - R.drawable.ic_error_outline_black_18dp); - } - - private List getSections() { - return getDashboardDataPreferences(getContext()).getAvailableSections(); - } - - @Override - public void onResume() { - super.onResume(); - refresh(); - } - - - protected int getErrorMessage(Exception exception) { - if (exception instanceof IOException) { - if (getSections().isEmpty()) { - setEmptyText(R.string.authentication_failed, R.string.testpress_please_login, - R.drawable.ic_error_outline_black_18dp); - } - return R.string.testpress_authentication_failed; - } else { - if (getSections().isEmpty()) { - setEmptyText(R.string.testpress_error_loading_contents, - R.string.testpress_some_thing_went_wrong_try_again, - R.drawable.ic_error_outline_black_18dp); - } - } - return R.string.testpress_some_thing_went_wrong_try_again; - } - - protected Exception getException(final Loader loader) { - if (loader instanceof ThrowableLoader) { - return ((ThrowableLoader) loader).clearException(); - } else { - return null; - } - } - - private void setEmptyText(final int title, final int description, final int icon) { - emptyView.setVisibility(View.VISIBLE); - emptyTitleView.setText(title); - emptyTitleView.setCompoundDrawablesWithIntrinsicBounds(icon, 0, 0, 0); - emptyDescView.setText(description); - retryButton.setVisibility(View.VISIBLE); - } - -}