Skip to content

Commit 49494f1

Browse files
committed
List divider added for tablet and landscape mode.
NMC-2142: Upload file button text size configured.
1 parent 8f42be4 commit 49494f1

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;
@@ -55,6 +56,7 @@
5556
import java.io.File;
5657
import java.util.ArrayList;
5758
import java.util.List;
59+
import java.util.Locale;
5860

5961
import javax.inject.Inject;
6062

@@ -194,6 +196,19 @@ public void onCreate(Bundle savedInstanceState) {
194196
binding.uploadFilesBtnUpload.setOnClickListener(this);
195197
binding.uploadFilesBtnUpload.setEnabled(mLocalFolderPickerMode);
196198

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

199214
// 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;
@@ -43,11 +44,13 @@
4344
import com.owncloud.android.ui.adapter.UploadListAdapter;
4445
import com.owncloud.android.ui.decoration.MediaGridItemDecoration;
4546
import com.owncloud.android.utils.DisplayUtils;
47+
import com.owncloud.android.ui.decoration.SimpleListItemDividerDecoration;
4648
import com.owncloud.android.utils.FilesSyncHelper;
4749
import com.owncloud.android.utils.theme.ViewThemeUtils;
4850

4951
import javax.inject.Inject;
5052

53+
import androidx.annotation.NonNull;
5154
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
5255
import androidx.recyclerview.widget.GridLayoutManager;
5356
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
@@ -98,6 +101,8 @@ public class UploadListActivity extends FileActivity {
98101

99102
private UploadListLayoutBinding binding;
100103

104+
private SimpleListItemDividerDecoration simpleListItemDividerDecoration;
105+
101106
public static Intent createIntent(OCFile file, User user, Integer flag, Context context) {
102107
Intent intent = new Intent(context, UploadListActivity.class);
103108
if (flag != null) {
@@ -176,6 +181,8 @@ private void setupContent() {
176181
int spacing = getResources().getDimensionPixelSize(R.dimen.media_grid_spacing);
177182
binding.list.addItemDecoration(new MediaGridItemDecoration(spacing));
178183
binding.list.setLayoutManager(lm);
184+
simpleListItemDividerDecoration = new SimpleListItemDividerDecoration(this, R.drawable.item_divider, true);
185+
addListItemDecorator();
179186
binding.list.setAdapter(uploadListAdapter);
180187

181188
viewThemeUtils.androidx.themeSwipeRefreshLayout(swipeListRefreshLayout);
@@ -185,6 +192,23 @@ private void setupContent() {
185192
uploadListAdapter.loadUploadItemsFromDb();
186193
}
187194

195+
private void addListItemDecorator() {
196+
if (com.nmc.android.utils.DisplayUtils.isShowDividerForList()) {
197+
//check and remove divider item decorator if exist then add item decorator
198+
removeListDividerDecorator();
199+
binding.list.addItemDecoration(simpleListItemDividerDecoration);
200+
}
201+
}
202+
203+
/**
204+
* method to remove the divider item decorator
205+
*/
206+
private void removeListDividerDecorator() {
207+
if (binding.list.getItemDecorationCount() > 0) {
208+
binding.list.removeItemDecoration(simpleListItemDividerDecoration);
209+
}
210+
}
211+
188212
private void loadItems() {
189213
uploadListAdapter.loadUploadItemsFromDb();
190214

@@ -372,4 +396,20 @@ public void onReceive(Context context, Intent intent) {
372396
});
373397
}
374398
}
399+
400+
@Override
401+
public void onConfigurationChanged(@NonNull Configuration newConfig) {
402+
super.onConfigurationChanged(newConfig);
403+
//this should only run when device is not tablet because we are adding dividers in tablet for both the
404+
// orientations
405+
if (!com.nmc.android.utils.DisplayUtils.isTablet()) {
406+
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
407+
//add the divider item decorator when orientation is landscape
408+
addListItemDecorator();
409+
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
410+
//remove the divider item decorator when orientation is portrait
411+
removeListDividerDecorator();
412+
}
413+
}
414+
}
375415
}

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
@@ -18,6 +18,7 @@
1818
import android.app.Activity;
1919
import android.content.Context;
2020
import android.content.Intent;
21+
import android.content.res.Configuration;
2122
import android.os.AsyncTask;
2223
import android.os.Bundle;
2324
import android.os.Handler;
@@ -32,6 +33,7 @@
3233
import android.view.MenuItem;
3334
import android.view.View;
3435
import android.view.ViewGroup;
36+
import android.view.ViewTreeObserver;
3537
import android.widget.AbsListView;
3638
import android.widget.Toast;
3739

@@ -52,6 +54,7 @@
5254
import com.nextcloud.client.jobs.BackgroundJobManager;
5355
import com.nextcloud.client.network.ClientFactory;
5456
import com.nextcloud.client.preferences.AppPreferences;
57+
import com.nextcloud.client.preferences.AppPreferencesImpl;
5558
import com.nextcloud.client.utils.Throttler;
5659
import com.nextcloud.common.NextcloudClient;
5760
import com.nextcloud.ui.fileactions.FileActionsBottomSheet;
@@ -87,6 +90,8 @@
8790
import com.owncloud.android.ui.activity.UploadFilesActivity;
8891
import com.owncloud.android.ui.adapter.CommonOCFileListAdapterInterface;
8992
import com.owncloud.android.ui.adapter.OCFileListAdapter;
93+
import com.owncloud.android.ui.decoration.MediaGridItemDecoration;
94+
import com.owncloud.android.ui.decoration.SimpleListItemDividerDecoration;
9095
import com.owncloud.android.ui.dialog.ChooseRichDocumentsTemplateDialogFragment;
9196
import com.owncloud.android.ui.dialog.ChooseTemplateDialogFragment;
9297
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
@@ -232,6 +237,9 @@ public class OCFileListFragment extends ExtendedListFragment implements
232237
protected String mLimitToMimeType;
233238
private FloatingActionButton mFabMain;
234239

240+
private SimpleListItemDividerDecoration simpleListItemDividerDecoration;
241+
private MediaGridItemDecoration mediaGridItemDecoration;
242+
235243
@Inject DeviceInfo deviceInfo;
236244

237245
protected enum MenuItemAddRemove {
@@ -245,6 +253,13 @@ protected enum MenuItemAddRemove {
245253

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

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

461+
simpleListItemDividerDecoration = new SimpleListItemDividerDecoration(getContext(), R.drawable.item_divider, true);
462+
int spacing = getResources().getDimensionPixelSize(R.dimen.media_grid_spacing);
463+
mediaGridItemDecoration = new MediaGridItemDecoration(spacing);
464+
446465
setRecyclerViewAdapter(mAdapter);
447466

448467
fastScrollUtils.applyFastScroll(getRecyclerView());
@@ -1520,6 +1539,7 @@ public void switchToListView() {
15201539
if (isGridEnabled()) {
15211540
switchLayoutManager(false);
15221541
}
1542+
addRemoveRecyclerViewItemDecorator();
15231543
}
15241544

15251545
public void setGridAsPreferred() {
@@ -1531,6 +1551,33 @@ public void switchToGridView() {
15311551
if (!isGridEnabled()) {
15321552
switchLayoutManager(true);
15331553
}
1554+
addRemoveRecyclerViewItemDecorator();
1555+
}
1556+
1557+
private void addRemoveRecyclerViewItemDecorator() {
1558+
if (getRecyclerView().getLayoutManager() instanceof GridLayoutManager) {
1559+
removeItemDecorator();
1560+
if (getRecyclerView().getItemDecorationCount() == 0) {
1561+
getRecyclerView().addItemDecoration(mediaGridItemDecoration);
1562+
int padding = getResources().getDimensionPixelSize(R.dimen.grid_recyclerview_padding);
1563+
getRecyclerView().setPadding(padding, padding, padding, padding);
1564+
}
1565+
} else {
1566+
removeItemDecorator();
1567+
if (getRecyclerView().getItemDecorationCount() == 0 && com.nmc.android.utils.DisplayUtils.isShowDividerForList()) {
1568+
getRecyclerView().addItemDecoration(simpleListItemDividerDecoration);
1569+
getRecyclerView().setPadding(0, 0, 0, 0);
1570+
}
1571+
}
1572+
}
1573+
1574+
/**
1575+
* method to remove the item decorator
1576+
*/
1577+
private void removeItemDecorator() {
1578+
while (getRecyclerView().getItemDecorationCount() > 0) {
1579+
getRecyclerView().removeItemDecorationAt(0);
1580+
}
15341581
}
15351582

15361583
public void switchLayoutManager(boolean grid) {
@@ -1561,12 +1608,40 @@ public int getSpanSize(int position) {
15611608
}
15621609

15631610
getRecyclerView().setLayoutManager(layoutManager);
1611+
updateSpanCount(getResources().getConfiguration());
15641612
getRecyclerView().scrollToPosition(position);
15651613
getAdapter().setGridView(grid);
15661614
getRecyclerView().setAdapter(getAdapter());
15671615
getAdapter().notifyDataSetChanged();
15681616
}
15691617

1618+
/**
1619+
* method will calculate the number of spans required for grid item and will update the span accordingly
1620+
*
1621+
* @param isGrid
1622+
*/
1623+
private void calculateAndUpdateSpanCount(boolean isGrid) {
1624+
getRecyclerView().getViewTreeObserver().addOnGlobalLayoutListener(
1625+
new ViewTreeObserver.OnGlobalLayoutListener() {
1626+
@Override
1627+
public void onGlobalLayout() {
1628+
getRecyclerView().getViewTreeObserver().removeOnGlobalLayoutListener(this);
1629+
if (isGrid) {
1630+
int viewWidth = getRecyclerView().getMeasuredWidth();
1631+
int newSpanCount = viewWidth / GRID_ITEM_DEFAULT_WIDTH;
1632+
RecyclerView.LayoutManager layoutManager = getRecyclerView().getLayoutManager();
1633+
if (layoutManager instanceof GridLayoutManager) {
1634+
if (newSpanCount < 1) {
1635+
newSpanCount = DEFAULT_FALLBACK_SPAN_COUNT;
1636+
}
1637+
((GridLayoutManager) layoutManager).setSpanCount(newSpanCount);
1638+
layoutManager.requestLayout();
1639+
}
1640+
}
1641+
}
1642+
});
1643+
}
1644+
15701645
public CommonOCFileListAdapterInterface getCommonAdapter() {
15711646
return mAdapter;
15721647
}
@@ -2139,4 +2214,52 @@ private boolean isAPKorAAB(Set<OCFile> files) {
21392214
}
21402215
return false;
21412216
}
2217+
2218+
@Override
2219+
public void onConfigurationChanged(@NonNull Configuration newConfig) {
2220+
super.onConfigurationChanged(newConfig);
2221+
if (getAdapter() != null) {
2222+
getAdapter().notifyDataSetChanged();
2223+
}
2224+
updateSpanCount(newConfig);
2225+
}
2226+
2227+
/**
2228+
* method will update the span count on basis of device orientation for the file listing
2229+
*
2230+
* @param newConfig current configuration
2231+
*/
2232+
private void updateSpanCount(Configuration newConfig) {
2233+
//this should only run when current view is not media gallery
2234+
if (getAdapter() != null) {
2235+
int maxColumnSize = (int) AppPreferencesImpl.DEFAULT_GRID_COLUMN;
2236+
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
2237+
//add the divider item decorator when orientation is landscape and device is not tablet
2238+
//because we don't have to add divider again as it is already added
2239+
if (!com.nmc.android.utils.DisplayUtils.isTablet()) {
2240+
addRemoveRecyclerViewItemDecorator();
2241+
}
2242+
maxColumnSize = maxColumnSizeLandscape;
2243+
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
2244+
//remove the divider item decorator when orientation is portrait and when device is not tablet
2245+
//because we have to show divider in both landscape and portrait mode
2246+
if (!com.nmc.android.utils.DisplayUtils.isTablet()) {
2247+
removeItemDecorator();
2248+
}
2249+
maxColumnSize = (int) AppPreferencesImpl.DEFAULT_GRID_COLUMN;
2250+
}
2251+
2252+
if (isGridEnabled()) {
2253+
//for tablet calculate size on the basis of screen width
2254+
if (com.nmc.android.utils.DisplayUtils.isTablet()) {
2255+
calculateAndUpdateSpanCount(true);
2256+
} else {
2257+
//and for phones directly show the hardcoded column size
2258+
if (getRecyclerView().getLayoutManager() instanceof GridLayoutManager) {
2259+
((GridLayoutManager) getRecyclerView().getLayoutManager()).setSpanCount(maxColumnSize);
2260+
}
2261+
}
2262+
}
2263+
}
2264+
}
21422265
}

0 commit comments

Comments
 (0)