@@ -8,29 +8,27 @@ import android.view.View
88import android .view .ViewGroup
99import android .widget .Button
1010import android .widget .EditText
11+ import android .widget .ProgressBar
1112import android .widget .TextView
1213import android .widget .Toast
13- import com .example .core .Foo
1414import com .example .scala_3_android_java .R
15- import scala . util .{ Left , Right }
16- import java . util . concurrent . Executors
15+ import androidx . lifecycle . Observer
16+ import scala . compiletime . uninitialized
1717
1818object MainFragment :
1919 def newInstance = MainFragment ()
2020
2121class MainFragment extends Fragment :
22- private var mViewModel : MainViewModel = _
23- // private var messageTextView: TextView = _
24- private var inputOrgText : EditText = _
25- private var inputRepoText : EditText = _
26- private var submitButton : Button = _
27- private var queryResultTextView : TextView = _
28- private val executor = Executors .newSingleThreadExecutor()
22+ private var viewModel : MainViewModel = uninitialized
23+ private var inputOrgText : EditText = uninitialized
24+ private var inputRepoText : EditText = uninitialized
25+ private var submitButton : Button = uninitialized
26+ private var queryResultTextView : TextView = uninitialized
27+ private var progressBar : ProgressBar = uninitialized
2928
3029 override def onCreate (savedInstanceState : Bundle ): Unit =
3130 super .onCreate(savedInstanceState)
32- mViewModel = ViewModelProvider (this ).get(classOf [MainViewModel ])
33- // TODO: Use the ViewModel
31+ viewModel = ViewModelProvider (this ).get(classOf [MainViewModel ])
3432
3533 override def onCreateView (inflater : LayoutInflater ,
3634 container : ViewGroup ,
@@ -39,41 +37,58 @@ class MainFragment extends Fragment:
3937
4038 override def onViewCreated (view : View , savedInstanceState : Bundle ): Unit =
4139 super .onViewCreated(view, savedInstanceState)
40+
4241 // Find view references
4342// messageTextView = view.findViewById(R.id.message_text_view)
4443 inputOrgText = view.findViewById(R .id.input_organisation)
4544 inputRepoText = view.findViewById(R .id.input_repository)
4645 submitButton = view.findViewById(R .id.submit_button)
4746 queryResultTextView = view.findViewById(R .id.query_result_text_view)
47+ progressBar = view.findViewById(R .id.progress_bar)
48+
4849// // Observe the LiveData from ViewModel
49- // mViewModel .getMessage.observe(getViewLifecycleOwner, (message: String) =>
50+ // viewModel .getMessage.observe(getViewLifecycleOwner, (message: String) =>
5051// // Update the UI when data changes
5152// messageTextView.setText("\n" + message)
5253// )
54+
55+ // Observe the ProjectInfoState LiveData
56+ viewModel.getProjectInfoState.observe(getViewLifecycleOwner, {
57+ case Initial =>
58+ progressBar.setVisibility(View .GONE )
59+ queryResultTextView.setText(" Enter organization and repository to search" )
60+
61+ case Loading =>
62+ progressBar.setVisibility(View .VISIBLE )
63+ queryResultTextView.setText(" Loading..." )
64+
65+ case Error (message) =>
66+ progressBar.setVisibility(View .GONE )
67+ queryResultTextView.setText(" " )
68+ Toast .makeText(getContext, s " An error occurred: $message" , Toast .LENGTH_LONG ).show()
69+
70+ case Success (projectInfo) =>
71+ progressBar.setVisibility(View .GONE )
72+ queryResultTextView.setText(
73+ s """
74+ |Project: ${inputOrgText.getText}/ ${inputRepoText.getText}
75+ |Description: ${projectInfo.description}
76+ |Stars: ${projectInfo.stars}
77+ | ${if projectInfo.topic.isEmpty then " " else s " Topics: ${projectInfo.topic.mkString(" , " )}" }
78+ """ .stripMargin)
79+ })
80+
5381 // Set up the button click listener
5482 submitButton.setOnClickListener(new View .OnClickListener () {
5583 override def onClick (v : View ): Unit =
5684 // Get the input from the EditText
57- val org = inputOrgText.getText.toString
58- val repo = inputRepoText.getText.toString
59- // Execute side effect on a background thread
60- executor.execute(() =>
61- val result = Foo .getProjectInfo(org, repo)
62- // Update UI on the main thread
63- getActivity.runOnUiThread(() =>
64- result match
65- case Left (error) =>
66- queryResultTextView.setText(" " )
67- // Optionally, you can show a Toast with the error
68- Toast .makeText(getContext, s " An error occurred: $error" , Toast .LENGTH_LONG ).show()
69- case Right (projectInfo) =>
70- queryResultTextView.setText(s " ${projectInfo.description}, stars: ${projectInfo.stars}" )
71- )
72- )
73- // Here you can send your user input to the ViewModel to update the data
74- // mViewModel.processInput(userInput)
75- })
85+ val org = inputOrgText.getText.toString.trim
86+ val repo = inputRepoText.getText.toString.trim
7687
77- override def onDestroyView (): Unit =
78- super .onDestroyView()
79- executor.shutdown()
88+ // Validate input
89+ if org.isEmpty || repo.isEmpty then
90+ Toast .makeText(getContext, " Please enter both organization and repository" , Toast .LENGTH_SHORT ).show()
91+ else
92+ // Use the ViewModel to fetch project info
93+ viewModel.fetchProjectInfo(org, repo)
94+ })
0 commit comments