Skip to content

Commit 29b69b3

Browse files
committed
List divider added for tablet and landscape mode.
NMC-2142: Upload file button text size configured.
1 parent 20809a4 commit 29b69b3

12 files changed

Lines changed: 452 additions & 2 deletions

File tree

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.nmc.android.utils
2+
3+
import android.content.res.Configuration
4+
import com.owncloud.android.MainApp
5+
import com.owncloud.android.R
6+
7+
object DisplayUtils {
8+
9+
@JvmStatic
10+
fun isShowDividerForList(): Boolean = isTablet() || isLandscapeOrientation()
11+
12+
@JvmStatic
13+
fun isTablet(): Boolean = MainApp.getAppContext().resources.getBoolean(R.bool.isTablet)
14+
15+
@JvmStatic
16+
fun isLandscapeOrientation(): Boolean =
17+
MainApp.getAppContext().resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
18+
}

app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import android.content.pm.PackageManager;
2121
import android.os.Bundle;
2222
import android.os.Environment;
23+
import android.util.TypedValue;
2324
import android.view.Menu;
2425
import android.view.MenuItem;
2526
import android.view.View;
@@ -58,6 +59,7 @@
5859
import java.io.File;
5960
import java.util.ArrayList;
6061
import java.util.List;
62+
import java.util.Locale;
6163

6264
import javax.inject.Inject;
6365

@@ -200,6 +202,19 @@ public void onCreate(Bundle savedInstanceState) {
200202
binding.uploadFilesBtnUpload.setOnClickListener(this);
201203
binding.uploadFilesBtnUpload.setEnabled(mLocalFolderPickerMode);
202204

205+
//reduce the button text size so that the text doesn't go to next line
206+
//this should only happen for GERMAN language
207+
//and device should not be tablet and should be in portrait mode
208+
if (!com.nmc.android.utils.DisplayUtils.isTablet() && !com.nmc.android.utils.DisplayUtils.isLandscapeOrientation()) {
209+
if (Locale.getDefault().getLanguage().equals(Locale.GERMAN.getLanguage())
210+
|| Locale.getDefault().getLanguage().equals(Locale.GERMANY.getLanguage())) {
211+
binding.uploadFilesBtnUpload.setTextSize(TypedValue.COMPLEX_UNIT_PX,
212+
getResources().getDimensionPixelSize(R.dimen.txt_size_13sp));
213+
binding.uploadFilesBtnCancel.setTextSize(TypedValue.COMPLEX_UNIT_PX,
214+
getResources().getDimensionPixelSize(R.dimen.txt_size_13sp));
215+
}
216+
}
217+
203218
int localBehaviour = preferences.getUploaderBehaviour();
204219

205220
// file upload spinner

app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import android.content.Context;
1515
import android.content.Intent;
1616
import android.content.IntentFilter;
17+
import android.content.res.Configuration;
1718
import android.os.Bundle;
1819
import android.view.Menu;
1920
import android.view.MenuInflater;
@@ -42,10 +43,12 @@
4243
import com.owncloud.android.ui.adapter.UploadListAdapter;
4344
import com.owncloud.android.ui.decoration.MediaGridItemDecoration;
4445
import com.owncloud.android.utils.DisplayUtils;
46+
import com.owncloud.android.ui.decoration.SimpleListItemDividerDecoration;
4547
import com.owncloud.android.utils.FilesSyncHelper;
4648

4749
import javax.inject.Inject;
4850

51+
import androidx.annotation.NonNull;
4952
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
5053
import androidx.recyclerview.widget.GridLayoutManager;
5154
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
@@ -90,6 +93,8 @@ public class UploadListActivity extends FileActivity {
9093

9194
private UploadListLayoutBinding binding;
9295

96+
private SimpleListItemDividerDecoration simpleListItemDividerDecoration;
97+
9398
public static Intent createIntent(OCFile file, User user, Integer flag, Context context) {
9499
Intent intent = new Intent(context, UploadListActivity.class);
95100
if (flag != null) {
@@ -168,6 +173,8 @@ private void setupContent() {
168173
int spacing = getResources().getDimensionPixelSize(R.dimen.media_grid_spacing);
169174
binding.list.addItemDecoration(new MediaGridItemDecoration(spacing));
170175
binding.list.setLayoutManager(lm);
176+
simpleListItemDividerDecoration = new SimpleListItemDividerDecoration(this, R.drawable.item_divider, true);
177+
addListItemDecorator();
171178
binding.list.setAdapter(uploadListAdapter);
172179

173180
viewThemeUtils.androidx.themeSwipeRefreshLayout(swipeListRefreshLayout);
@@ -177,6 +184,23 @@ private void setupContent() {
177184
uploadListAdapter.loadUploadItemsFromDb();
178185
}
179186

187+
private void addListItemDecorator() {
188+
if (com.nmc.android.utils.DisplayUtils.isShowDividerForList()) {
189+
//check and remove divider item decorator if exist then add item decorator
190+
removeListDividerDecorator();
191+
binding.list.addItemDecoration(simpleListItemDividerDecoration);
192+
}
193+
}
194+
195+
/**
196+
* method to remove the divider item decorator
197+
*/
198+
private void removeListDividerDecorator() {
199+
if (binding.list.getItemDecorationCount() > 0) {
200+
binding.list.removeItemDecoration(simpleListItemDividerDecoration);
201+
}
202+
}
203+
180204
private void loadItems() {
181205
uploadListAdapter.loadUploadItemsFromDb();
182206

@@ -357,4 +381,20 @@ public void onReceive(Context context, Intent intent) {
357381
});
358382
}
359383
}
384+
385+
@Override
386+
public void onConfigurationChanged(@NonNull Configuration newConfig) {
387+
super.onConfigurationChanged(newConfig);
388+
//this should only run when device is not tablet because we are adding dividers in tablet for both the
389+
// orientations
390+
if (!com.nmc.android.utils.DisplayUtils.isTablet()) {
391+
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
392+
//add the divider item decorator when orientation is landscape
393+
addListItemDecorator();
394+
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
395+
//remove the divider item decorator when orientation is portrait
396+
removeListDividerDecorator();
397+
}
398+
}
399+
}
360400
}

app/src/main/java/com/owncloud/android/ui/decoration/SimpleListItemDividerDecoration.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import android.util.DisplayMetrics;
1515
import android.view.View;
1616

17+
import androidx.core.content.ContextCompat;
1718
import androidx.recyclerview.widget.DividerItemDecoration;
1819
import androidx.recyclerview.widget.RecyclerView;
1920

@@ -25,7 +26,8 @@ public class SimpleListItemDividerDecoration extends DividerItemDecoration {
2526

2627
private final Rect bounds = new Rect();
2728
private Drawable divider;
28-
private int leftPadding;
29+
private int leftPadding = 0;
30+
private boolean hasFooter;
2931

3032
/**
3133
* Default divider will be used
@@ -38,6 +40,17 @@ public SimpleListItemDividerDecoration(Context context) {
3840
styledAttributes.recycle();
3941
}
4042

43+
/**
44+
* Custom divider will be used
45+
*
46+
* @param hasFooter if recyclerview has footer and no divider should be shown for footer then pass true else false
47+
*/
48+
public SimpleListItemDividerDecoration(Context context, int resId, boolean hasFooter) {
49+
super(context, DividerItemDecoration.VERTICAL);
50+
this.hasFooter = hasFooter;
51+
divider = ContextCompat.getDrawable(context, resId);
52+
}
53+
4154
@Override
4255
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
4356
canvas.save();
@@ -51,7 +64,12 @@ public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state)
5164
right = parent.getWidth();
5265
}
5366

54-
final int childCount = parent.getChildCount();
67+
int childCount = parent.getChildCount();
68+
69+
if (hasFooter) {
70+
childCount = childCount - 1;
71+
}
72+
5573
for (int i = 0; i < childCount; i++) {
5674
final View child = parent.getChildAt(i);
5775
parent.getDecoratedBoundsWithMargins(child, bounds);

app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import android.app.Activity;
2020
import android.content.Context;
2121
import android.content.Intent;
22+
import android.content.res.Configuration;
2223
import android.os.AsyncTask;
2324
import android.os.Bundle;
2425
import android.os.Handler;
@@ -33,6 +34,7 @@
3334
import android.view.MenuItem;
3435
import android.view.View;
3536
import android.view.ViewGroup;
37+
import android.view.ViewTreeObserver;
3638
import android.widget.AbsListView;
3739
import android.widget.Toast;
3840

@@ -51,6 +53,7 @@
5153
import com.nextcloud.client.editimage.EditImageActivity;
5254
import com.nextcloud.client.jobs.BackgroundJobManager;
5355
import com.nextcloud.client.network.ClientFactory;
56+
import com.nextcloud.client.preferences.AppPreferencesImpl;
5457
import com.nextcloud.client.utils.Throttler;
5558
import com.nextcloud.common.NextcloudClient;
5659
import com.nextcloud.ui.fileactions.FileActionsBottomSheet;
@@ -88,6 +91,8 @@
8891
import com.owncloud.android.ui.activity.UploadFilesActivity;
8992
import com.owncloud.android.ui.adapter.CommonOCFileListAdapterInterface;
9093
import com.owncloud.android.ui.adapter.OCFileListAdapter;
94+
import com.owncloud.android.ui.decoration.MediaGridItemDecoration;
95+
import com.owncloud.android.ui.decoration.SimpleListItemDividerDecoration;
9196
import com.owncloud.android.ui.dialog.ChooseRichDocumentsTemplateDialogFragment;
9297
import com.owncloud.android.ui.dialog.ChooseTemplateDialogFragment;
9398
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
@@ -233,6 +238,9 @@ public class OCFileListFragment extends ExtendedListFragment implements
233238
protected String mLimitToMimeType;
234239
private FloatingActionButton mFabMain;
235240

241+
private SimpleListItemDividerDecoration simpleListItemDividerDecoration;
242+
private MediaGridItemDecoration mediaGridItemDecoration;
243+
236244
@Inject DeviceInfo deviceInfo;
237245

238246
protected enum MenuItemAddRemove {
@@ -246,6 +254,13 @@ protected enum MenuItemAddRemove {
246254

247255
private List<MenuItem> mOriginalMenuItems = new ArrayList<>();
248256

257+
private int maxColumnSizeLandscape = 5;
258+
259+
//this variable will help us to provide number of span count for grid view
260+
//the width for single item is approx to 360
261+
private static final int GRID_ITEM_DEFAULT_WIDTH = 360;
262+
private static final int DEFAULT_FALLBACK_SPAN_COUNT = 1;
263+
249264
@Override
250265
public void onCreate(Bundle savedInstanceState) {
251266
super.onCreate(savedInstanceState);
@@ -459,6 +474,10 @@ protected void setAdapter(Bundle args) {
459474
viewThemeUtils
460475
);
461476

477+
simpleListItemDividerDecoration = new SimpleListItemDividerDecoration(getContext(), R.drawable.item_divider, true);
478+
int spacing = getResources().getDimensionPixelSize(R.dimen.media_grid_spacing);
479+
mediaGridItemDecoration = new MediaGridItemDecoration(spacing);
480+
462481
setRecyclerViewAdapter(mAdapter);
463482

464483
fastScrollUtils.applyFastScroll(getRecyclerView());
@@ -1649,6 +1668,7 @@ public void switchToListView() {
16491668
if (isGridEnabled()) {
16501669
switchLayoutManager(false);
16511670
}
1671+
addRemoveRecyclerViewItemDecorator();
16521672
}
16531673

16541674
public void setGridAsPreferred() {
@@ -1660,6 +1680,33 @@ public void switchToGridView() {
16601680
if (!isGridEnabled()) {
16611681
switchLayoutManager(true);
16621682
}
1683+
addRemoveRecyclerViewItemDecorator();
1684+
}
1685+
1686+
private void addRemoveRecyclerViewItemDecorator() {
1687+
if (getRecyclerView().getLayoutManager() instanceof GridLayoutManager) {
1688+
removeItemDecorator();
1689+
if (getRecyclerView().getItemDecorationCount() == 0) {
1690+
getRecyclerView().addItemDecoration(mediaGridItemDecoration);
1691+
int padding = getResources().getDimensionPixelSize(R.dimen.grid_recyclerview_padding);
1692+
getRecyclerView().setPadding(padding, padding, padding, padding);
1693+
}
1694+
} else {
1695+
removeItemDecorator();
1696+
if (getRecyclerView().getItemDecorationCount() == 0 && com.nmc.android.utils.DisplayUtils.isShowDividerForList()) {
1697+
getRecyclerView().addItemDecoration(simpleListItemDividerDecoration);
1698+
getRecyclerView().setPadding(0, 0, 0, 0);
1699+
}
1700+
}
1701+
}
1702+
1703+
/**
1704+
* method to remove the item decorator
1705+
*/
1706+
private void removeItemDecorator() {
1707+
while (getRecyclerView().getItemDecorationCount() > 0) {
1708+
getRecyclerView().removeItemDecorationAt(0);
1709+
}
16631710
}
16641711

16651712
public void switchLayoutManager(boolean grid) {
@@ -1690,12 +1737,40 @@ public int getSpanSize(int position) {
16901737
}
16911738

16921739
getRecyclerView().setLayoutManager(layoutManager);
1740+
updateSpanCount(getResources().getConfiguration());
16931741
getRecyclerView().scrollToPosition(position);
16941742
getAdapter().setGridView(grid);
16951743
getRecyclerView().setAdapter(getAdapter());
16961744
getAdapter().notifyDataSetChanged();
16971745
}
16981746

1747+
/**
1748+
* method will calculate the number of spans required for grid item and will update the span accordingly
1749+
*
1750+
* @param isGrid
1751+
*/
1752+
private void calculateAndUpdateSpanCount(boolean isGrid) {
1753+
getRecyclerView().getViewTreeObserver().addOnGlobalLayoutListener(
1754+
new ViewTreeObserver.OnGlobalLayoutListener() {
1755+
@Override
1756+
public void onGlobalLayout() {
1757+
getRecyclerView().getViewTreeObserver().removeOnGlobalLayoutListener(this);
1758+
if (isGrid) {
1759+
int viewWidth = getRecyclerView().getMeasuredWidth();
1760+
int newSpanCount = viewWidth / GRID_ITEM_DEFAULT_WIDTH;
1761+
RecyclerView.LayoutManager layoutManager = getRecyclerView().getLayoutManager();
1762+
if (layoutManager instanceof GridLayoutManager) {
1763+
if (newSpanCount < 1) {
1764+
newSpanCount = DEFAULT_FALLBACK_SPAN_COUNT;
1765+
}
1766+
((GridLayoutManager) layoutManager).setSpanCount(newSpanCount);
1767+
layoutManager.requestLayout();
1768+
}
1769+
}
1770+
}
1771+
});
1772+
}
1773+
16991774
public CommonOCFileListAdapterInterface getCommonAdapter() {
17001775
return mAdapter;
17011776
}
@@ -2275,4 +2350,52 @@ private boolean isAPKorAAB(Set<OCFile> files) {
22752350
}
22762351
return false;
22772352
}
2353+
2354+
@Override
2355+
public void onConfigurationChanged(@NonNull Configuration newConfig) {
2356+
super.onConfigurationChanged(newConfig);
2357+
if (getAdapter() != null) {
2358+
getAdapter().notifyDataSetChanged();
2359+
}
2360+
updateSpanCount(newConfig);
2361+
}
2362+
2363+
/**
2364+
* method will update the span count on basis of device orientation for the file listing
2365+
*
2366+
* @param newConfig current configuration
2367+
*/
2368+
private void updateSpanCount(Configuration newConfig) {
2369+
//this should only run when current view is not media gallery
2370+
if (getAdapter() != null) {
2371+
int maxColumnSize = (int) AppPreferencesImpl.DEFAULT_GRID_COLUMN;
2372+
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
2373+
//add the divider item decorator when orientation is landscape and device is not tablet
2374+
//because we don't have to add divider again as it is already added
2375+
if (!com.nmc.android.utils.DisplayUtils.isTablet()) {
2376+
addRemoveRecyclerViewItemDecorator();
2377+
}
2378+
maxColumnSize = maxColumnSizeLandscape;
2379+
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
2380+
//remove the divider item decorator when orientation is portrait and when device is not tablet
2381+
//because we have to show divider in both landscape and portrait mode
2382+
if (!com.nmc.android.utils.DisplayUtils.isTablet()) {
2383+
removeItemDecorator();
2384+
}
2385+
maxColumnSize = (int) AppPreferencesImpl.DEFAULT_GRID_COLUMN;
2386+
}
2387+
2388+
if (isGridEnabled()) {
2389+
//for tablet calculate size on the basis of screen width
2390+
if (com.nmc.android.utils.DisplayUtils.isTablet()) {
2391+
calculateAndUpdateSpanCount(true);
2392+
} else {
2393+
//and for phones directly show the hardcoded column size
2394+
if (getRecyclerView().getLayoutManager() instanceof GridLayoutManager) {
2395+
((GridLayoutManager) getRecyclerView().getLayoutManager()).setSpanCount(maxColumnSize);
2396+
}
2397+
}
2398+
}
2399+
}
2400+
}
22782401
}

0 commit comments

Comments
 (0)