Skip to content

Commit 6ed5dea

Browse files
Migrated Profile Package from Butterknife to View Binding (commons-app#5591)
* Butterknife to ViewBinding * code fix to pass all tests * code cleanup and tests migrated to binding * fix LoD
1 parent dbe739e commit 6ed5dea

File tree

7 files changed

+78
-100
lines changed

7 files changed

+78
-100
lines changed

app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ public View onCreateView(LayoutInflater inflater,
131131

132132
// If fragment is associated with ProfileActivity, then hide the tabLayout
133133
if (getActivity() instanceof ProfileActivity) {
134-
((ProfileActivity)getActivity()).tabLayout.setVisibility(View.GONE);
134+
((ProfileActivity)getActivity()).setTabLayoutVisibility(false);
135135
}
136136

137137
// Else if fragment is associated with MainActivity then hide that tab layout

app/src/main/java/fr/free/nrw/commons/profile/ProfileActivity.java

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,16 @@
1313
import android.widget.ImageView;
1414
import android.widget.TextView;
1515
import androidx.annotation.NonNull;
16-
import androidx.appcompat.widget.Toolbar;
1716
import androidx.core.content.FileProvider;
1817
import androidx.fragment.app.Fragment;
1918
import androidx.fragment.app.FragmentManager;
20-
import butterknife.BindView;
21-
import butterknife.ButterKnife;
2219
import com.google.android.material.tabs.TabLayout;
2320
import fr.free.nrw.commons.R;
2421
import fr.free.nrw.commons.Utils;
2522
import fr.free.nrw.commons.ViewPagerAdapter;
2623
import fr.free.nrw.commons.auth.SessionManager;
2724
import fr.free.nrw.commons.contributions.ContributionsFragment;
28-
import fr.free.nrw.commons.explore.ParentViewPager;
25+
import fr.free.nrw.commons.databinding.ActivityProfileBinding;
2926
import fr.free.nrw.commons.profile.achievements.AchievementsFragment;
3027
import fr.free.nrw.commons.profile.leaderboard.LeaderboardFragment;
3128
import fr.free.nrw.commons.theme.BaseActivity;
@@ -45,14 +42,7 @@ public class ProfileActivity extends BaseActivity {
4542

4643
private FragmentManager supportFragmentManager;
4744

48-
@BindView(R.id.viewPager)
49-
ParentViewPager viewPager;
50-
51-
@BindView(R.id.tab_layout)
52-
public TabLayout tabLayout;
53-
54-
@BindView(R.id.toolbar)
55-
Toolbar toolbar;
45+
public ActivityProfileBinding binding;
5646

5747
@Inject
5848
SessionManager sessionManager;
@@ -70,7 +60,7 @@ public class ProfileActivity extends BaseActivity {
7060
ContributionsFragment contributionsFragment;
7161

7262
public void setScroll(boolean canScroll){
73-
viewPager.setCanScroll(canScroll);
63+
binding.viewPager.setCanScroll(canScroll);
7464
}
7565
@Override
7666
protected void onRestoreInstanceState(final Bundle savedInstanceState) {
@@ -85,11 +75,13 @@ protected void onRestoreInstanceState(final Bundle savedInstanceState) {
8575
@Override
8676
protected void onCreate(Bundle savedInstanceState) {
8777
super.onCreate(savedInstanceState);
88-
setContentView(R.layout.activity_profile);
89-
ButterKnife.bind(this);
9078

91-
setSupportActionBar(toolbar);
92-
toolbar.setNavigationOnClickListener(view -> {
79+
binding = ActivityProfileBinding.inflate(getLayoutInflater());
80+
setContentView(binding.getRoot());
81+
setSupportActionBar(binding.toolbarBinding.toolbar);
82+
83+
84+
binding.toolbarBinding.toolbar.setNavigationOnClickListener(view -> {
9385
onSupportNavigateUp();
9486
});
9587

@@ -99,8 +91,8 @@ protected void onCreate(Bundle savedInstanceState) {
9991

10092
supportFragmentManager = getSupportFragmentManager();
10193
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
102-
viewPager.setAdapter(viewPagerAdapter);
103-
tabLayout.setupWithViewPager(viewPager);
94+
binding.viewPager.setAdapter(viewPagerAdapter);
95+
binding.tabLayout.setupWithViewPager(binding.viewPager);
10496
setTabs();
10597
}
10698

@@ -257,9 +249,17 @@ public void onBackPressed() {
257249
// Checking if MediaDetailPagerFragment is visible, If visible then show ContributionListFragment else close the ProfileActivity
258250
if(contributionsFragment != null && contributionsFragment.getMediaDetailPagerFragment() != null && contributionsFragment.getMediaDetailPagerFragment().isVisible()) {
259251
contributionsFragment.backButtonClicked();
260-
tabLayout.setVisibility(View.VISIBLE);
252+
binding.tabLayout.setVisibility(View.VISIBLE);
261253
}else {
262254
super.onBackPressed();
263255
}
264256
}
265-
}
257+
258+
/**
259+
* To set the visibility of tab layout
260+
* @param isVisible boolean
261+
*/
262+
public void setTabLayoutVisibility(boolean isVisible) {
263+
binding.tabLayout.setVisibility(isVisible ? View.VISIBLE : View.GONE);
264+
}
265+
}

app/src/main/java/fr/free/nrw/commons/profile/leaderboard/LeaderboardFragment.java

Lines changed: 45 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,14 @@
1414
import android.widget.AdapterView;
1515
import android.widget.AdapterView.OnItemSelectedListener;
1616
import android.widget.ArrayAdapter;
17-
import android.widget.Button;
18-
import android.widget.ProgressBar;
19-
import android.widget.Spinner;
2017
import android.widget.Toast;
2118
import androidx.annotation.Nullable;
2219
import androidx.lifecycle.ViewModelProvider;
2320
import androidx.recyclerview.widget.LinearLayoutManager;
2421
import androidx.recyclerview.widget.MergeAdapter;
25-
import androidx.recyclerview.widget.RecyclerView;
26-
import butterknife.BindView;
27-
import butterknife.ButterKnife;
2822
import fr.free.nrw.commons.R;
2923
import fr.free.nrw.commons.auth.SessionManager;
24+
import fr.free.nrw.commons.databinding.FragmentLeaderboardBinding;
3025
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
3126
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
3227
import fr.free.nrw.commons.profile.ProfileActivity;
@@ -44,20 +39,6 @@
4439
*/
4540
public class LeaderboardFragment extends CommonsDaggerSupportFragment {
4641

47-
@BindView(R.id.leaderboard_list)
48-
RecyclerView leaderboardListRecyclerView;
49-
50-
@BindView(R.id.progressBar)
51-
ProgressBar progressBar;
52-
53-
@BindView(R.id.category_spinner)
54-
Spinner categorySpinner;
55-
56-
@BindView(R.id.duration_spinner)
57-
Spinner durationSpinner;
58-
59-
@BindView(R.id.scroll)
60-
Button scrollButton;
6142

6243
@Inject
6344
SessionManager sessionManager;
@@ -110,6 +91,8 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
11091

11192
private String userName;
11293

94+
private FragmentLeaderboardBinding binding;
95+
11396
@Override
11497
public void onCreate(@Nullable final Bundle savedInstanceState) {
11598
super.onCreate(savedInstanceState);
@@ -120,19 +103,18 @@ public void onCreate(@Nullable final Bundle savedInstanceState) {
120103

121104
@Override
122105
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
123-
View rootView = inflater.inflate(R.layout.fragment_leaderboard, container, false);
124-
ButterKnife.bind(this, rootView);
106+
binding = FragmentLeaderboardBinding.inflate(inflater, container, false);
125107

126108
hideLayouts();
127109

128110
// Leaderboard currently unimplemented in Beta flavor. Skip all API calls and disable menu
129111
if(ConfigUtils.isBetaFlavour()) {
130-
progressBar.setVisibility(View.GONE);
131-
scrollButton.setVisibility(View.GONE);
132-
return rootView;
112+
binding.progressBar.setVisibility(View.GONE);
113+
binding.scroll.setVisibility(View.GONE);
114+
return binding.getRoot();
133115
}
134116

135-
progressBar.setVisibility(View.VISIBLE);
117+
binding.progressBar.setVisibility(View.VISIBLE);
136118
setSpinners();
137119

138120
/**
@@ -152,11 +134,11 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
152134

153135
setLeaderboard(duration, category, limit, offset);
154136

155-
durationSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
137+
binding.durationSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
156138
@Override
157139
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
158140

159-
duration = durationValues[durationSpinner.getSelectedItemPosition()];
141+
duration = durationValues[binding.durationSpinner.getSelectedItemPosition()];
160142
refreshLeaderboard();
161143
}
162144

@@ -165,10 +147,10 @@ public void onNothingSelected(AdapterView<?> adapterView) {
165147
}
166148
});
167149

168-
categorySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
150+
binding.categorySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
169151
@Override
170152
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
171-
category = categoryValues[categorySpinner.getSelectedItemPosition()];
153+
category = categoryValues[binding.categorySpinner.getSelectedItemPosition()];
172154
refreshLeaderboard();
173155
}
174156

@@ -178,10 +160,10 @@ public void onNothingSelected(AdapterView<?> adapterView) {
178160
});
179161

180162

181-
scrollButton.setOnClickListener(view -> scrollToUserRank());
163+
binding.scroll.setOnClickListener(view -> scrollToUserRank());
182164

183165

184-
return rootView;
166+
return binding.getRoot();
185167
}
186168

187169
@Override
@@ -226,9 +208,12 @@ private void scrollToUserRank() {
226208
if(userRank==0){
227209
Toast.makeText(getContext(),R.string.no_achievements_yet,Toast.LENGTH_SHORT).show();
228210
}else {
229-
if (Objects.requireNonNull(leaderboardListRecyclerView.getAdapter()).getItemCount()
211+
if (binding == null) {
212+
return;
213+
}
214+
if (Objects.requireNonNull(binding.leaderboardList.getAdapter()).getItemCount()
230215
> userRank + 1) {
231-
leaderboardListRecyclerView.smoothScrollToPosition(userRank + 1);
216+
binding.leaderboardList.smoothScrollToPosition(userRank + 1);
232217
} else {
233218
if (viewModel != null) {
234219
viewModel.refresh(duration, category, userRank + 1, 0);
@@ -247,12 +232,12 @@ private void setSpinners() {
247232
ArrayAdapter<CharSequence> categoryAdapter = ArrayAdapter.createFromResource(getContext(),
248233
R.array.leaderboard_categories, android.R.layout.simple_spinner_item);
249234
categoryAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
250-
categorySpinner.setAdapter(categoryAdapter);
235+
binding.categorySpinner.setAdapter(categoryAdapter);
251236

252237
ArrayAdapter<CharSequence> durationAdapter = ArrayAdapter.createFromResource(getContext(),
253238
R.array.leaderboard_durations, android.R.layout.simple_spinner_item);
254239
durationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
255-
durationSpinner.setAdapter(durationAdapter);
240+
binding.durationSpinner.setAdapter(durationAdapter);
256241
}
257242

258243
/**
@@ -297,16 +282,16 @@ private void setViews(LeaderboardResponse response, String duration, String cate
297282
UserDetailAdapter userDetailAdapter= new UserDetailAdapter(response);
298283
MergeAdapter mergeAdapter = new MergeAdapter(userDetailAdapter, leaderboardListAdapter);
299284
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
300-
leaderboardListRecyclerView.setLayoutManager(linearLayoutManager);
301-
leaderboardListRecyclerView.setAdapter(mergeAdapter);
285+
binding.leaderboardList.setLayoutManager(linearLayoutManager);
286+
binding.leaderboardList.setAdapter(mergeAdapter);
302287
viewModel.getListLiveData().observe(getViewLifecycleOwner(), leaderboardListAdapter::submitList);
303288
viewModel.getProgressLoadStatus().observe(getViewLifecycleOwner(), status -> {
304289
if (Objects.requireNonNull(status).equalsIgnoreCase(LOADING)) {
305290
showProgressBar();
306291
} else if (status.equalsIgnoreCase(LOADED)) {
307292
hideProgressBar();
308293
if (scrollToRank) {
309-
leaderboardListRecyclerView.smoothScrollToPosition(userRank + 1);
294+
binding.leaderboardList.smoothScrollToPosition(userRank + 1);
310295
}
311296
}
312297
});
@@ -316,32 +301,32 @@ private void setViews(LeaderboardResponse response, String duration, String cate
316301
* to hide progressbar
317302
*/
318303
private void hideProgressBar() {
319-
if (progressBar != null) {
320-
progressBar.setVisibility(View.GONE);
321-
categorySpinner.setVisibility(View.VISIBLE);
322-
durationSpinner.setVisibility(View.VISIBLE);
323-
scrollButton.setVisibility(View.VISIBLE);
324-
leaderboardListRecyclerView.setVisibility(View.VISIBLE);
304+
if (binding != null) {
305+
binding.progressBar.setVisibility(View.GONE);
306+
binding.categorySpinner.setVisibility(View.VISIBLE);
307+
binding.durationSpinner.setVisibility(View.VISIBLE);
308+
binding.scroll.setVisibility(View.VISIBLE);
309+
binding.leaderboardList.setVisibility(View.VISIBLE);
325310
}
326311
}
327312

328313
/**
329314
* to show progressbar
330315
*/
331316
private void showProgressBar() {
332-
if (progressBar != null) {
333-
progressBar.setVisibility(View.VISIBLE);
317+
if (binding != null) {
318+
binding.progressBar.setVisibility(View.VISIBLE);
319+
binding.scroll.setVisibility(View.INVISIBLE);
334320
}
335-
scrollButton.setVisibility(View.INVISIBLE);
336321
}
337322

338323
/**
339324
* used to hide the layouts while fetching results from api
340325
*/
341326
private void hideLayouts(){
342-
categorySpinner.setVisibility(View.INVISIBLE);
343-
durationSpinner.setVisibility(View.INVISIBLE);
344-
leaderboardListRecyclerView.setVisibility(View.INVISIBLE);
327+
binding.categorySpinner.setVisibility(View.INVISIBLE);
328+
binding.durationSpinner.setVisibility(View.INVISIBLE);
329+
binding.leaderboardList.setVisibility(View.INVISIBLE);
345330
}
346331

347332
/**
@@ -364,7 +349,15 @@ private boolean checkAccount(){
364349
*/
365350
private void onError() {
366351
ViewUtil.showLongToast(getActivity(), getResources().getString(R.string.error_occurred));
367-
progressBar.setVisibility(View.GONE);
352+
if (binding!=null) {
353+
binding.progressBar.setVisibility(View.GONE);
354+
}
368355
}
369356

357+
@Override
358+
public void onDestroy() {
359+
super.onDestroy();
360+
compositeDisposable.clear();
361+
binding = null;
362+
}
370363
}

app/src/main/res/layout/activity_profile.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
android:orientation="vertical">
1212

1313
<include
14+
android:id="@+id/toolbarBinding"
1415
layout="@layout/toolbar"
1516
android:layout_width="match_parent"
1617
android:layout_height="wrap_content" />
@@ -45,4 +46,4 @@
4546
</RelativeLayout>
4647
</LinearLayout>
4748

48-
</androidx.drawerlayout.widget.DrawerLayout>
49+
</androidx.drawerlayout.widget.DrawerLayout>

app/src/test/kotlin/fr/free/nrw/commons/TestCommonsApplication.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import fr.free.nrw.commons.___location.LocationServiceManager
1717
class TestCommonsApplication : Application() {
1818
private var mockApplicationComponent: CommonsApplicationComponent? = null
1919

20+
2021
override fun onCreate() {
2122
if (mockApplicationComponent == null) {
2223
mockApplicationComponent = DaggerCommonsApplicationComponent.builder()
@@ -64,4 +65,4 @@ class MockCommonsApplicationModule(appContext: Context) : CommonsApplicationModu
6465
override fun provideDBOpenHelper(context: Context): DBOpenHelper = mockDbOpenHelper
6566

6667
override fun provideLruCache(): LruCache<String, String> = lruCache
67-
}
68+
}

0 commit comments

Comments
 (0)