syncedFolders = syncedFolderProvider.getSyncedFolders();
diff --git a/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java b/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java
index fdaf368100..dc225655a6 100644
--- a/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java
+++ b/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java
@@ -75,6 +75,7 @@ import android.widget.Toast;
import com.blikoon.qrcodescanner.QrCodeActivity;
import com.google.android.material.snackbar.Snackbar;
+import com.nextcloud.android.common.ui.color.ColorUtil;
import com.nextcloud.client.account.User;
import com.nextcloud.client.account.UserAccountManager;
import com.nextcloud.client.device.DeviceInfo;
@@ -118,8 +119,8 @@ import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertL
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.ErrorMessageAdapter;
import com.owncloud.android.utils.PermissionUtil;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
-import com.owncloud.android.utils.theme.ThemeToolbarUtils;
+import com.owncloud.android.utils.theme.CapabilityUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.io.InputStream;
import java.net.URLDecoder;
@@ -233,8 +234,8 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
@Inject OnboardingService onboarding;
@Inject DeviceInfo deviceInfo;
@Inject PassCodeManager passCodeManager;
- @Inject ThemeToolbarUtils themeToolbarUtils;
- @Inject ThemeDrawableUtils themeDrawableUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
+ @Inject ColorUtil colorUtil;
private boolean onlyAdd = false;
@SuppressLint("ResourceAsColor") @ColorInt
@@ -439,7 +440,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
accountSetupWebviewBinding.loginWebviewProgressBar.setVisibility(View.GONE);
accountSetupWebviewBinding.loginWebview.setVisibility(View.VISIBLE);
- themeToolbarUtils.colorStatusBar(AuthenticatorActivity.this, primaryColor);
+ viewThemeUtils.platform.colorStatusBar(AuthenticatorActivity.this, primaryColor);
getWindow().setNavigationBarColor(primaryColor);
}
@@ -529,8 +530,8 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
if (deviceInfo.hasCamera(this)) {
accountSetupBinding.scanQr.setOnClickListener(v -> onScan());
- themeDrawableUtils.tintDrawable(accountSetupBinding.scanQr.getDrawable(),
- getResources().getColor(R.color.login_text_color));
+ viewThemeUtils.platform.colorDrawable(accountSetupBinding.scanQr.getDrawable(),
+ getResources().getColor(R.color.login_text_color));
} else {
accountSetupBinding.scanQr.setVisibility(View.GONE);
}
@@ -1131,6 +1132,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
if (success) {
accountManager.setCurrentOwnCloudAccount(mAccount.name);
+ setupColorCapability();
if (onlyAdd) {
finish();
} else {
@@ -1190,6 +1192,17 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
}
}
+ /**
+ * Caches a fake OCCapability with only the server color, so that it is immediately available for drawing the next
+ * screens
+ */
+ private void setupColorCapability() {
+ final OCCapability colorCapability = new OCCapability();
+ colorCapability.setServerColor(colorUtil.colorToHexString(primaryColor));
+ colorCapability.setAccountName(mAccount.name);
+ CapabilityUtils.updateCapability(colorCapability);
+ }
+
/**
* Updates the authentication token.
*
diff --git a/app/src/main/java/com/owncloud/android/authentication/DeepLinkLoginActivity.java b/app/src/main/java/com/owncloud/android/authentication/DeepLinkLoginActivity.java
index 050a4884d1..ecfd878d4e 100644
--- a/app/src/main/java/com/owncloud/android/authentication/DeepLinkLoginActivity.java
+++ b/app/src/main/java/com/owncloud/android/authentication/DeepLinkLoginActivity.java
@@ -7,13 +7,8 @@ import android.widget.Toast;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-
-import javax.inject.Inject;
public class DeepLinkLoginActivity extends AuthenticatorActivity implements Injectable {
- @Inject
- public ThemeColorUtils themeColorUtils;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -35,7 +30,6 @@ public class DeepLinkLoginActivity extends AuthenticatorActivity implements Inje
LoginUrlInfo loginUrlInfo = parseLoginDataUrl(prefix, data.toString());
TextView loginText = findViewById(R.id.loginInfo);
- loginText.setTextColor(themeColorUtils.fontColor(this));
loginText.setText(String.format("Login with %1$s to %2$s", loginUrlInfo.username,
loginUrlInfo.serverAddress));
} catch (IllegalArgumentException e) {
diff --git a/app/src/main/java/com/owncloud/android/datamodel/MediaProvider.java b/app/src/main/java/com/owncloud/android/datamodel/MediaProvider.java
index ce59d72fca..6746273de4 100644
--- a/app/src/main/java/com/owncloud/android/datamodel/MediaProvider.java
+++ b/app/src/main/java/com/owncloud/android/datamodel/MediaProvider.java
@@ -29,7 +29,7 @@ import android.provider.MediaStore;
import com.owncloud.android.MainApp;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.utils.PermissionUtil;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.io.File;
import java.util.ArrayList;
@@ -74,9 +74,9 @@ public final class MediaProvider {
int itemLimit,
@Nullable final AppCompatActivity activity,
boolean getWithoutActivity,
- ThemeSnackbarUtils themeSnackbarUtils) {
+ final ViewThemeUtils viewThemeUtils) {
// check permissions
- checkPermissions(activity, themeSnackbarUtils);
+ checkPermissions(activity, viewThemeUtils);
// query media/image folders
Cursor cursorFolders = null;
@@ -174,10 +174,10 @@ public final class MediaProvider {
}
private static void checkPermissions(@Nullable AppCompatActivity activity,
- ThemeSnackbarUtils themeSnackbarUtils) {
+ final ViewThemeUtils viewThemeUtils) {
if (activity != null &&
!PermissionUtil.checkExternalStoragePermission(activity.getApplicationContext())) {
- PermissionUtil.requestExternalStoragePermission(activity, themeSnackbarUtils, true);
+ PermissionUtil.requestExternalStoragePermission(activity, viewThemeUtils, true);
}
}
@@ -185,9 +185,9 @@ public final class MediaProvider {
int itemLimit,
@Nullable final AppCompatActivity activity,
boolean getWithoutActivity,
- ThemeSnackbarUtils themeSnackbarUtils) {
+ final ViewThemeUtils viewThemeUtils) {
// check permissions
- checkPermissions(activity, themeSnackbarUtils);
+ checkPermissions(activity, viewThemeUtils);
// query media/image folders
Cursor cursorFolders = null;
diff --git a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java
index b415af22ad..79562821ee 100644
--- a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java
+++ b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java
@@ -65,8 +65,7 @@ import com.owncloud.android.utils.BitmapUtils;
import com.owncloud.android.utils.DisplayUtils.AvatarGenerationListener;
import com.owncloud.android.utils.FileStorageUtils;
import com.owncloud.android.utils.MimeTypeUtil;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
@@ -757,18 +756,15 @@ public final class ThumbnailsCacheManager {
private File mFile;
private String mImageKey;
private final Context mContext;
- private final ThemeColorUtils themeColorUtils;
- private final ThemeDrawableUtils themeDrawableUtils;
+ private final ViewThemeUtils viewThemeUtils;
public MediaThumbnailGenerationTask(ImageView imageView,
Context context,
- ThemeColorUtils themeColorUtils,
- ThemeDrawableUtils themeDrawableUtils) {
+ ViewThemeUtils viewThemeUtils) {
// Use a WeakReference to ensure the ImageView can be garbage collected
mImageViewReference = new WeakReference<>(imageView);
mContext = context;
- this.themeColorUtils = themeColorUtils;
- this.themeDrawableUtils = themeDrawableUtils;
+ this.viewThemeUtils = viewThemeUtils;
}
@Override
@@ -816,8 +812,7 @@ public final class ThumbnailsCacheManager {
if (mFile != null) {
if (mFile.isDirectory()) {
imageView.setImageDrawable(MimeTypeUtil.getDefaultFolderIcon(mContext,
- themeColorUtils,
- themeDrawableUtils));
+ viewThemeUtils));
} else {
if (MimeTypeUtil.isVideo(mFile)) {
imageView.setImageBitmap(ThumbnailsCacheManager.mDefaultVideo);
@@ -825,8 +820,7 @@ public final class ThumbnailsCacheManager {
imageView.setImageDrawable(MimeTypeUtil.getFileTypeIcon(null,
mFile.getName(),
mContext,
- themeColorUtils,
- themeDrawableUtils));
+ viewThemeUtils));
}
}
}
diff --git a/app/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java b/app/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java
index 58de082eea..06fa844e19 100644
--- a/app/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java
+++ b/app/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java
@@ -36,9 +36,7 @@ import com.nextcloud.client.preferences.AppPreferences;
import com.owncloud.android.MainApp;
import com.owncloud.android.datamodel.UploadsStorageManager;
import com.owncloud.android.lib.common.utils.Log_OC;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
@@ -60,7 +58,7 @@ public class BootupBroadcastReceiver extends BroadcastReceiver {
@Inject PowerManagementService powerManagementService;
@Inject BackgroundJobManager backgroundJobManager;
@Inject Clock clock;
- @Inject ThemeSnackbarUtils themeSnackbarUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
/**
* Receives broadcast intent reporting that the system was just boot up. *
@@ -80,7 +78,7 @@ public class BootupBroadcastReceiver extends BroadcastReceiver {
powerManagementService,
backgroundJobManager,
clock,
- themeSnackbarUtils);
+ viewThemeUtils);
MainApp.initContactsBackup(accountManager, backgroundJobManager);
} else {
Log_OC.d(TAG, "Getting wrong intent: " + intent.getAction());
diff --git a/app/src/main/java/com/owncloud/android/files/services/FileDownloader.java b/app/src/main/java/com/owncloud/android/files/services/FileDownloader.java
index d4ea859c58..cbe4d37aea 100644
--- a/app/src/main/java/com/owncloud/android/files/services/FileDownloader.java
+++ b/app/src/main/java/com/owncloud/android/files/services/FileDownloader.java
@@ -68,7 +68,7 @@ import com.owncloud.android.ui.preview.PreviewImageActivity;
import com.owncloud.android.ui.preview.PreviewImageFragment;
import com.owncloud.android.utils.ErrorMessageAdapter;
import com.owncloud.android.utils.MimeTypeUtil;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.io.File;
import java.security.SecureRandom;
@@ -127,7 +127,7 @@ public class FileDownloader extends Service
@Inject UserAccountManager accountManager;
@Inject UploadsStorageManager uploadsStorageManager;
@Inject LocalBroadcastManager localBroadcastManager;
- @Inject ThemeColorUtils themeColorUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
public static String getDownloadAddedMessage() {
return FileDownloader.class.getName() + DOWNLOAD_ADDED_MESSAGE;
@@ -152,12 +152,12 @@ public class FileDownloader extends Service
mServiceHandler = new ServiceHandler(mServiceLooper, this);
mBinder = new FileDownloaderBinder();
- NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setContentTitle(
+ NotificationCompat.Builder builder = NotificationUtils.newNotificationBuilder(this, viewThemeUtils).setContentTitle(
getApplicationContext().getResources().getString(R.string.app_name))
.setContentText(getApplicationContext().getResources().getString(R.string.foreground_service_download))
.setSmallIcon(R.drawable.notification_icon)
- .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.notification_icon))
- .setColor(themeColorUtils.primaryColor(getApplicationContext(), true));
+ .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.notification_icon));
+
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
builder.setChannelId(NotificationUtils.NOTIFICATION_CHANNEL_DOWNLOAD);
@@ -544,7 +544,7 @@ public class FileDownloader extends Service
private void notifyDownloadStart(DownloadFileOperation download) {
/// create status notification with a progress bar
mLastPercent = 0;
- mNotificationBuilder = NotificationUtils.newNotificationBuilder(this, themeColorUtils);
+ mNotificationBuilder = NotificationUtils.newNotificationBuilder(this, viewThemeUtils);
mNotificationBuilder
.setSmallIcon(R.drawable.notification_icon)
.setTicker(getString(R.string.downloader_download_in_progress_ticker))
diff --git a/app/src/main/java/com/owncloud/android/files/services/FileUploader.java b/app/src/main/java/com/owncloud/android/files/services/FileUploader.java
index 41c93cf780..84b587686a 100644
--- a/app/src/main/java/com/owncloud/android/files/services/FileUploader.java
+++ b/app/src/main/java/com/owncloud/android/files/services/FileUploader.java
@@ -78,7 +78,7 @@ import com.owncloud.android.ui.activity.ConflictsResolveActivity;
import com.owncloud.android.ui.activity.UploadListActivity;
import com.owncloud.android.ui.notifications.NotificationUtils;
import com.owncloud.android.utils.ErrorMessageAdapter;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.io.File;
import java.security.SecureRandom;
@@ -201,7 +201,7 @@ public class FileUploader extends Service
@Inject ConnectivityService connectivityService;
@Inject PowerManagementService powerManagementService;
@Inject LocalBroadcastManager localBroadcastManager;
- @Inject ThemeColorUtils themeColorUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
private IndexedForest mPendingUploads = new IndexedForest<>();
@@ -237,12 +237,11 @@ public class FileUploader extends Service
mServiceHandler = new ServiceHandler(mServiceLooper, this);
mBinder = new FileUploaderBinder();
- NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setContentTitle(
- getApplicationContext().getResources().getString(R.string.app_name))
+ NotificationCompat.Builder builder = NotificationUtils.newNotificationBuilder(this, viewThemeUtils).setContentTitle(
+ getApplicationContext().getResources().getString(R.string.app_name))
.setContentText(getApplicationContext().getResources().getString(R.string.foreground_service_upload))
.setSmallIcon(R.drawable.notification_icon)
- .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.notification_icon))
- .setColor(themeColorUtils.primaryColor(getApplicationContext(), true));
+ .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.notification_icon));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder.setChannelId(NotificationUtils.NOTIFICATION_CHANNEL_UPLOAD);
@@ -689,7 +688,7 @@ public class FileUploader extends Service
private void notifyUploadStart(UploadFileOperation upload) {
// / create status notification with a progress bar
mLastPercent = 0;
- mNotificationBuilder = NotificationUtils.newNotificationBuilder(this, themeColorUtils);
+ mNotificationBuilder = NotificationUtils.newNotificationBuilder(this, viewThemeUtils);
mNotificationBuilder
.setOngoing(true)
.setSmallIcon(R.drawable.notification_icon)
diff --git a/app/src/main/java/com/owncloud/android/media/MediaControlView.java b/app/src/main/java/com/owncloud/android/media/MediaControlView.java
index d9c378d073..d3d01a3ed7 100644
--- a/app/src/main/java/com/owncloud/android/media/MediaControlView.java
+++ b/app/src/main/java/com/owncloud/android/media/MediaControlView.java
@@ -41,8 +41,7 @@ import android.widget.TextView;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.lib.common.utils.Log_OC;
-import com.owncloud.android.utils.theme.ThemeBarUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.Formatter;
import java.util.Locale;
@@ -72,9 +71,7 @@ public class MediaControlView extends FrameLayout implements OnClickListener, On
private ImageButton rewindButton;
@Inject
- ThemeColorUtils themeColorUtils;
- @Inject
- ThemeBarUtils themeBarUtils;
+ ViewThemeUtils viewThemeUtils;
public MediaControlView(Context context,
@@ -137,10 +134,10 @@ public class MediaControlView extends FrameLayout implements OnClickListener, On
if (progressBar != null) {
if (progressBar instanceof SeekBar) {
SeekBar seeker = (SeekBar) progressBar;
- themeBarUtils.colorHorizontalSeekBar(seeker, getContext(), themeColorUtils);
+ viewThemeUtils.platform.themeHorizontalSeekBar(seeker);
seeker.setOnSeekBarChangeListener(this);
} else {
- themeBarUtils.colorHorizontalProgressBar(progressBar, themeColorUtils.primaryAccentColor(getContext()));
+ viewThemeUtils.platform.themeHorizontalProgressBar(progressBar);
}
progressBar.setMax(1000);
}
diff --git a/app/src/main/java/com/owncloud/android/operations/CreateFolderOperation.java b/app/src/main/java/com/owncloud/android/operations/CreateFolderOperation.java
index 09017fa330..83ab79867a 100644
--- a/app/src/main/java/com/owncloud/android/operations/CreateFolderOperation.java
+++ b/app/src/main/java/com/owncloud/android/operations/CreateFolderOperation.java
@@ -195,7 +195,7 @@ public class CreateFolderOperation extends SyncOperation implements OnRemoteOper
return result;
} catch (Exception e) {
if (!EncryptionUtils.unlockFolder(parent, client, token).isSuccess()) {
- throw new RuntimeException("Could not clean up after failing folder creation!");
+ throw new RuntimeException("Could not clean up after failing folder creation!", e);
}
// remove folder
diff --git a/app/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java b/app/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java
index f995ee5d54..69917018f6 100644
--- a/app/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java
+++ b/app/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java
@@ -48,7 +48,7 @@ import com.owncloud.android.operations.UpdateOCVersionOperation;
import com.owncloud.android.ui.activity.ErrorsWhileCopyingHandlerActivity;
import com.owncloud.android.ui.notifications.NotificationUtils;
import com.owncloud.android.utils.DataHolderUtil;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import org.apache.jackrabbit.webdav.DavException;
@@ -122,7 +122,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
*/
private SyncResult mSyncResult;
- private final ThemeColorUtils themeColorUtils;
+ private final ViewThemeUtils viewThemeUtils;
/**
* Creates a {@link FileSyncAdapter}
@@ -132,9 +132,9 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
public FileSyncAdapter(Context context,
boolean autoInitialize,
UserAccountManager userAccountManager,
- ThemeColorUtils themeColorUtils) {
+ final ViewThemeUtils viewThemeUtils) {
super(context, autoInitialize, userAccountManager);
- this.themeColorUtils = themeColorUtils;
+ this.viewThemeUtils = viewThemeUtils;
}
/**
@@ -146,9 +146,9 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
boolean autoInitialize,
boolean allowParallelSyncs,
UserAccountManager userAccountManager,
- ThemeColorUtils themeColorUtils) {
+ final ViewThemeUtils viewThemeUtils) {
super(context, autoInitialize, allowParallelSyncs, userAccountManager);
- this.themeColorUtils = themeColorUtils;
+ this.viewThemeUtils = viewThemeUtils;
}
@@ -524,7 +524,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
private NotificationCompat.Builder createNotificationBuilder() {
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getContext());
notificationBuilder.setSmallIcon(R.drawable.notification_icon).setAutoCancel(true);
- notificationBuilder.setColor(themeColorUtils.primaryColor(getContext(), true));
+ viewThemeUtils.androidx.themeNotificationCompatBuilder(getContext(), notificationBuilder);
return notificationBuilder;
}
diff --git a/app/src/main/java/com/owncloud/android/syncadapter/FileSyncService.java b/app/src/main/java/com/owncloud/android/syncadapter/FileSyncService.java
index e47d9d2387..c718320888 100644
--- a/app/src/main/java/com/owncloud/android/syncadapter/FileSyncService.java
+++ b/app/src/main/java/com/owncloud/android/syncadapter/FileSyncService.java
@@ -25,7 +25,7 @@ import android.content.Intent;
import android.os.IBinder;
import com.nextcloud.client.account.UserAccountManager;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
@@ -44,7 +44,7 @@ public class FileSyncService extends Service {
private static final Object syncAdapterLock = new Object();
@Inject UserAccountManager userAccountManager;
- @Inject ThemeColorUtils themeColorUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
/*
* {@inheritDoc}
@@ -54,7 +54,7 @@ public class FileSyncService extends Service {
AndroidInjection.inject(this);
synchronized (syncAdapterLock) {
if (syncAdapter == null) {
- syncAdapter = new FileSyncAdapter(getApplicationContext(), true, userAccountManager, themeColorUtils);
+ syncAdapter = new FileSyncAdapter(getApplicationContext(), true, userAccountManager, viewThemeUtils);
}
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/AvatarGroupLayout.java b/app/src/main/java/com/owncloud/android/ui/AvatarGroupLayout.java
index fd1a0a742e..788e409564 100644
--- a/app/src/main/java/com/owncloud/android/ui/AvatarGroupLayout.java
+++ b/app/src/main/java/com/owncloud/android/ui/AvatarGroupLayout.java
@@ -38,9 +38,7 @@ import com.owncloud.android.R;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.shares.ShareeUser;
import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeAvatarUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.List;
@@ -86,9 +84,7 @@ public class AvatarGroupLayout extends RelativeLayout implements DisplayUtils.Av
public void setAvatars(@NonNull User user,
@NonNull List sharees,
- ThemeColorUtils themeColorUtils,
- ThemeDrawableUtils themeDrawableUtils,
- ThemeAvatarUtils themeAvatarUtils) {
+ final ViewThemeUtils viewThemeUtils) {
@NonNull Context context = getContext();
removeAllViews();
RelativeLayout.LayoutParams avatarLayoutParams;
@@ -114,7 +110,7 @@ public class AvatarGroupLayout extends RelativeLayout implements DisplayUtils.Av
if (avatarCount == 0 && sharees.size() > MAX_AVATAR_COUNT) {
avatar.setImageResource(R.drawable.ic_people);
- themeDrawableUtils.setIconColor(avatar.getDrawable());
+ viewThemeUtils.platform.tintTextDrawable(context, avatar.getDrawable());
} else {
sharee = sharees.get(avatarCount);
switch (sharee.getShareType()) {
@@ -122,7 +118,7 @@ public class AvatarGroupLayout extends RelativeLayout implements DisplayUtils.Av
case EMAIL:
case ROOM:
case CIRCLE:
- themeAvatarUtils.createAvatar(sharee.getShareType(), avatar, context, themeColorUtils);
+ viewThemeUtils.files.createAvatar(sharee.getShareType(), avatar, context);
break;
case FEDERATED:
showFederatedShareAvatar(context,
@@ -130,7 +126,7 @@ public class AvatarGroupLayout extends RelativeLayout implements DisplayUtils.Av
avatarRadius,
resources,
avatar,
- themeDrawableUtils);
+ viewThemeUtils);
break;
default:
avatar.setTag(sharee);
@@ -159,7 +155,7 @@ public class AvatarGroupLayout extends RelativeLayout implements DisplayUtils.Av
float avatarRadius,
Resources resources,
ImageView avatar,
- ThemeDrawableUtils themeDrawableUtils) {
+ ViewThemeUtils viewThemeUtils) {
// maybe federated share
String[] split = user.split("@");
String userId = split[0];
@@ -173,10 +169,10 @@ public class AvatarGroupLayout extends RelativeLayout implements DisplayUtils.Av
placeholder = TextDrawable.createAvatarByUserId(userId, avatarRadius);
} catch (Exception e) {
Log_OC.e(TAG, "Error calculating RGB value for active account icon.", e);
- placeholder = themeDrawableUtils.tintDrawable(ResourcesCompat.getDrawable(resources,
- R.drawable.account_circle_white,
- null),
- R.color.black);
+ placeholder = viewThemeUtils.platform.colorDrawable(ResourcesCompat.getDrawable(resources,
+ R.drawable.account_circle_white,
+ null),
+ ContextCompat.getColor(context, R.color.black));
}
avatar.setTag(null);
diff --git a/app/src/main/java/com/owncloud/android/ui/ThemeableSwitchPreference.java b/app/src/main/java/com/owncloud/android/ui/ThemeableSwitchPreference.java
index 181d1bd087..8707cef2d0 100644
--- a/app/src/main/java/com/owncloud/android/ui/ThemeableSwitchPreference.java
+++ b/app/src/main/java/com/owncloud/android/ui/ThemeableSwitchPreference.java
@@ -21,8 +21,6 @@
package com.owncloud.android.ui;
import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.Color;
import android.preference.SwitchPreference;
import android.util.AttributeSet;
import android.view.View;
@@ -30,21 +28,17 @@ import android.view.ViewGroup;
import android.widget.Switch;
import com.owncloud.android.MainApp;
-import com.owncloud.android.R;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
-import androidx.appcompat.app.AppCompatDelegate;
-import androidx.core.graphics.drawable.DrawableCompat;
-
/**
* Themeable switch preference TODO Migrate to androidx
*/
public class ThemeableSwitchPreference extends SwitchPreference {
@Inject
- ThemeColorUtils themeColorUtils;
+ ViewThemeUtils viewThemeUtils;
public ThemeableSwitchPreference(Context context) {
super(context);
@@ -71,37 +65,13 @@ public class ThemeableSwitchPreference extends SwitchPreference {
}
private void findSwitch(ViewGroup viewGroup) {
- ColorStateList thumbColorStateList = null;
- ColorStateList trackColorStateList = null;
-
for (int i = 0; i < viewGroup.getChildCount(); i++) {
View child = viewGroup.getChildAt(i);
if (child instanceof Switch) {
Switch switchView = (Switch) child;
- if(thumbColorStateList == null && trackColorStateList == null) {
- int thumbColor = themeColorUtils.primaryAccentColor(getContext());
- if (themeColorUtils.darkTheme(getContext()) &&
- AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
- thumbColor = Color.WHITE;
- }
- int trackColor = Color.argb(77, Color.red(thumbColor), Color.green(thumbColor), Color.blue(thumbColor));
- int trackColorUnchecked = getContext().getResources().getColor(R.color.switch_track_color_unchecked);
- thumbColorStateList = new ColorStateList(
- new int[][]{new int[]{android.R.attr.state_checked}, new int[]{}},
- new int[]{thumbColor, getContext().getResources().getColor(R.color.switch_thumb_color_unchecked)});
- trackColorStateList = new ColorStateList(
- new int[][]{new int[]{android.R.attr.state_checked},
- new int[]{}},
- new int[]{trackColor, trackColorUnchecked});
- }
-
- // setting the thumb color
- DrawableCompat.setTintList(switchView.getThumbDrawable(), thumbColorStateList);
-
- // setting the track color
- DrawableCompat.setTintList(switchView.getTrackDrawable(), trackColorStateList);
+ viewThemeUtils.platform.colorSwitch(switchView);
break;
} else if (child instanceof ViewGroup) {
diff --git a/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java b/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java
index 8138de7d7b..c449c50855 100644
--- a/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java
@@ -41,6 +41,7 @@ import com.owncloud.android.ui.interfaces.ActivityListInterface;
import com.owncloud.android.ui.preview.PreviewImageActivity;
import com.owncloud.android.ui.preview.PreviewImageFragment;
import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.List;
@@ -70,6 +71,7 @@ public class ActivitiesActivity extends DrawerActivity implements ActivityListIn
@Inject ActivitiesRepository activitiesRepository;
@Inject FilesRepository filesRepository;
@Inject ClientFactory clientFactory;
+ @Inject ViewThemeUtils viewThemeUtils;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -84,7 +86,7 @@ public class ActivitiesActivity extends DrawerActivity implements ActivityListIn
// setup toolbar
setupToolbar();
- themeLayoutUtils.colorSwipeRefreshLayout(this, binding.swipeContainingList);
+ viewThemeUtils.androidx.themeSwipeRefreshLayout(binding.swipeContainingList);
// setup drawer
setupDrawer(R.id.nav_activity);
@@ -114,8 +116,7 @@ public class ActivitiesActivity extends DrawerActivity implements ActivityListIn
this,
clientFactory,
false,
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
binding.list.setAdapter(adapter);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.java
index 1851a190d1..05662f63b7 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.java
@@ -64,7 +64,9 @@ public class CommunityActivity extends DrawerActivity {
contributeForumView.setMovementMethod(LinkMovementMethod.getInstance());
contributeForumView.setText(Html.fromHtml(getString(R.string.community_contribute_forum_text) + " " +
getString(R.string.community_contribute_forum_text_link,
- themeColorUtils.primaryColorToHexString(this),
+ viewThemeUtils
+ .files
+ .primaryColorToHexString(this),
getString(R.string.help_link),
getString(R.string.community_contribute_forum_forum))));
@@ -72,7 +74,7 @@ public class CommunityActivity extends DrawerActivity {
contributeTranslationView.setMovementMethod(LinkMovementMethod.getInstance());
contributeTranslationView.setText(Html.fromHtml(
getString(R.string.community_contribute_translate_link,
- themeColorUtils.primaryColorToHexString(this),
+ viewThemeUtils.files.primaryColorToHexString(this),
getString(R.string.translation_link),
getString(R.string.community_contribute_translate_translate)) + " " +
getString(R.string.community_contribute_translate_text)));
@@ -82,11 +84,11 @@ public class CommunityActivity extends DrawerActivity {
contributeGithubView.setText(Html.fromHtml(
getString(R.string.community_contribute_github_text,
getString(R.string.community_contribute_github_text_link,
- themeColorUtils.primaryColorToHexString(this),
+ viewThemeUtils.files.primaryColorToHexString(this),
getString(R.string.contributing_link)))));
MaterialButton reportButton = binding.communityTestingReport;
- themeButtonUtils.colorPrimaryButton(reportButton, this, themeColorUtils);
+ viewThemeUtils.material.colorMaterialButtonPrimaryFilled(reportButton);
reportButton.setOnClickListener(v -> DisplayUtils.startLinkIntent(this, R.string.report_issue_empty_link));
binding.communityBetaFdroid.setOnClickListener(
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java
index 313efc0911..39549d63df 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java
@@ -54,7 +54,6 @@ import android.webkit.URLUtil;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
-import android.widget.ProgressBar;
import android.widget.TextView;
import com.bumptech.glide.GenericRequestBuilder;
@@ -66,6 +65,7 @@ import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.navigation.NavigationView;
+import com.google.android.material.progressindicator.LinearProgressIndicator;
import com.nextcloud.client.account.User;
import com.nextcloud.client.di.Injectable;
import com.nextcloud.client.network.ClientFactory;
@@ -113,8 +113,6 @@ import com.owncloud.android.utils.svg.SVGorImage;
import com.owncloud.android.utils.svg.SvgOrImageBitmapTranscoder;
import com.owncloud.android.utils.svg.SvgOrImageDecoder;
import com.owncloud.android.utils.theme.CapabilityUtils;
-import com.owncloud.android.utils.theme.ThemeBarUtils;
-import com.owncloud.android.utils.theme.ThemeMenuUtils;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@@ -149,6 +147,7 @@ public abstract class DrawerActivity extends ToolbarActivity
private static final int MENU_ORDER_EXTERNAL_LINKS = 3;
private static final int MENU_ITEM_EXTERNAL_LINK = 111;
private static final int MAX_LOGO_SIZE_PX = 1000;
+ private static final int RELATIVE_THRESHOLD_WARNING = 80;
/**
* Reference to the drawer layout.
@@ -188,7 +187,7 @@ public abstract class DrawerActivity extends ToolbarActivity
/**
* progress bar of the quota view.
*/
- private ProgressBar mQuotaProgressBar;
+ private LinearProgressIndicator mQuotaProgressBar;
/**
* text view of the quota view.
@@ -210,12 +209,6 @@ public abstract class DrawerActivity extends ToolbarActivity
@Inject
ClientFactory clientFactory;
- @Inject
- ThemeMenuUtils themeMenuUtils;
-
- @Inject
- ThemeBarUtils themeBarUtils;
-
/**
* Initializes the drawer, its content and highlights the menu item with the given id. This method needs to be
* called after the content view has been set.
@@ -287,9 +280,8 @@ public abstract class DrawerActivity extends ToolbarActivity
Drawable backArrow = ResourcesCompat.getDrawable(getResources(),
R.drawable.ic_arrow_back,
null);
- mDrawerToggle.setHomeAsUpIndicator(
- themeDrawableUtils.tintDrawable(backArrow, themeColorUtils.appBarPrimaryFontColor(this)));
- mDrawerToggle.getDrawerArrowDrawable().setColor(themeColorUtils.appBarPrimaryFontColor(this));
+
+ viewThemeUtils.platform.tintToolbarArrowDrawable(this, mDrawerToggle, backArrow);
}
/**
@@ -297,10 +289,10 @@ public abstract class DrawerActivity extends ToolbarActivity
*/
private void setupQuotaElement() {
mQuotaView = (LinearLayout) findQuotaViewById(R.id.drawer_quota);
- mQuotaProgressBar = (ProgressBar) findQuotaViewById(R.id.drawer_quota_ProgressBar);
+ mQuotaProgressBar = (LinearProgressIndicator) findQuotaViewById(R.id.drawer_quota_ProgressBar);
mQuotaTextPercentage = (TextView) findQuotaViewById(R.id.drawer_quota_percentage);
mQuotaTextLink = (TextView) findQuotaViewById(R.id.drawer_quota_link);
- themeBarUtils.colorProgressBar(mQuotaProgressBar, themeColorUtils.primaryColor(this));
+ viewThemeUtils.material.colorProgressBar(mQuotaProgressBar);
}
public void updateHeader() {
@@ -309,11 +301,11 @@ public abstract class DrawerActivity extends ToolbarActivity
OCCapability capability = getCapabilities();
String logo = capability.getServerLogo();
- int primaryColor = themeColorUtils.primaryColor(getAccount(), false, this);
+ int primaryColor = themeColorUtils.unchangedPrimaryColor(getAccount(), this);
// set background to primary color
LinearLayout drawerHeader = mNavigationViewHeader.findViewById(R.id.drawer_header_view);
- drawerHeader.setBackgroundColor(themeColorUtils.unchangedPrimaryColor(getAccount(), this));
+ drawerHeader.setBackgroundColor(primaryColor);
if (!TextUtils.isEmpty(logo) && URLUtil.isValidUrl(logo)) {
// background image
@@ -379,13 +371,6 @@ public abstract class DrawerActivity extends ToolbarActivity
}
- /**
- * setup drawer header, basically the logo color
- */
- private void setupDrawerHeader(FrameLayout drawerHeader) {
- drawerHeader.setBackgroundColor(themeColorUtils.primaryColor(getAccount(), true, this));
- }
-
/**
* setup drawer content, basically setting the item selected listener.
*
@@ -702,9 +687,12 @@ public abstract class DrawerActivity extends ToolbarActivity
mQuotaProgressBar.setProgress(relative);
- themeBarUtils.colorProgressBar(mQuotaProgressBar, DisplayUtils.getRelativeInfoColor(this,
- relative,
- themeColorUtils));
+ if (relative < RELATIVE_THRESHOLD_WARNING) {
+ viewThemeUtils.material.colorProgressBar(mQuotaProgressBar);
+ } else {
+ viewThemeUtils.material.colorProgressBar(mQuotaProgressBar,
+ getResources().getColor(R.color.infolevel_warning));
+ }
updateQuotaLink();
showQuota(true);
@@ -787,26 +775,9 @@ public abstract class DrawerActivity extends ToolbarActivity
*/
protected void setDrawerMenuItemChecked(int menuItemId) {
if (mNavigationView != null && mNavigationView.getMenu().findItem(menuItemId) != null) {
+ viewThemeUtils.platform.colorNavigationView(mNavigationView);
mCheckedMenuItem = menuItemId;
- MenuItem currentItem = mNavigationView.getMenu().findItem(menuItemId);
- int drawerColor = getResources().getColor(R.color.drawer_text_color);
- int activeColor = themeColorUtils.primaryColor(null, true, true, this);
-
- currentItem.setChecked(true);
-
- // For each menu item, change the color of the selected item, and of the other items
- for (int i = 0; i < mNavigationView.getMenu().size(); i++) {
- MenuItem menuItem = mNavigationView.getMenu().getItem(i);
- if (menuItem.getIcon() != null) {
- if (menuItem == currentItem) {
- themeDrawableUtils.tintDrawable(currentItem.getIcon(), activeColor);
- themeMenuUtils.tintMenuItemText(currentItem, activeColor);
- } else {
- themeDrawableUtils.tintDrawable(menuItem.getIcon(), drawerColor);
- themeMenuUtils.tintMenuItemText(menuItem, drawerColor);
- }
- }
- }
+ mNavigationView.getMenu().findItem(menuItemId).setChecked(true);
} else {
Log_OC.w(TAG, "setDrawerMenuItemChecked has been called with invalid menu-item-ID");
}
@@ -919,7 +890,7 @@ public abstract class DrawerActivity extends ToolbarActivity
if (menuItem != null) {
if (drawable != null) {
- menuItem.setIcon(themeDrawableUtils.tintDrawable(drawable, greyColor));
+ menuItem.setIcon(viewThemeUtils.platform.colorDrawable(drawable, greyColor));
} else {
menuItem.setIcon(R.drawable.ic_link);
}
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java
index 9321dfc40b..1c24457b82 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java
@@ -78,7 +78,7 @@ public abstract class EditorWebView extends ExternalSiteWebView {
R.string.timeout_richDocuments, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.common_back, v -> closeView());
- themeSnackbarUtils.colorSnackbar(getApplicationContext(), snackbar);
+ viewThemeUtils.material.themeSnackbar(snackbar);
setLoadingSnackbar(snackbar);
snackbar.show();
}
@@ -159,8 +159,7 @@ public abstract class EditorWebView extends ExternalSiteWebView {
file.isGroupFolder(),
file.getMountType(),
this,
- themeColorUtils,
- themeDrawableUtils));
+ viewThemeUtils));
} else {
if ((MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file)) && file.getRemoteId() != null) {
// Thumbnail in cache?
@@ -182,10 +181,8 @@ public abstract class EditorWebView extends ExternalSiteWebView {
} else {
Drawable icon = MimeTypeUtil.getFileTypeIcon(file.getMimeType(),
file.getFileName(),
- user,
getApplicationContext(),
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
binding.thumbnail.setImageDrawable(icon);
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java b/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java
index 03736ce9f5..9267245d9f 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java
@@ -202,7 +202,7 @@ public class ExternalSiteWebView extends FileActivity {
private void setupActionBar(String title) {
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
- themeToolbarUtils.setColoredTitle(actionBar, title, this);
+ viewThemeUtils.files.themeActionBar(this, actionBar, title);
if (showSidebar) {
actionBar.setDisplayHomeAsUpEnabled(true);
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java
index b10033f48a..cddf45cd94 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java
@@ -89,11 +89,12 @@ import com.owncloud.android.ui.fragment.FileDetailFragment;
import com.owncloud.android.ui.fragment.FileDetailSharingFragment;
import com.owncloud.android.ui.fragment.OCFileListFragment;
import com.owncloud.android.ui.helpers.FileOperationsHelper;
+import com.owncloud.android.ui.preview.PreviewImageActivity;
import com.owncloud.android.utils.ClipboardUtil;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.ErrorMessageAdapter;
import com.owncloud.android.utils.FilesSyncHelper;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
@@ -103,6 +104,7 @@ import javax.inject.Inject;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
+import androidx.appcompat.app.ActionBar;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
@@ -172,9 +174,6 @@ public abstract class FileActivity extends DrawerActivity
@Inject
BackgroundJobManager backgroundJobManager;
- @Inject
- ThemeSnackbarUtils themeSnackbarUtils;
-
@Override
public void showFiles(boolean onDeviceOnly) {
// must be specialized in subclasses
@@ -205,9 +204,10 @@ public abstract class FileActivity extends DrawerActivity
mFileOperationsHelper.setOpIdWaitingFor(
savedInstanceState.getLong(KEY_WAITING_FOR_OP_ID, Long.MAX_VALUE)
);
- themeToolbarUtils.setColoredTitle(getSupportActionBar(),
- savedInstanceState.getString(KEY_ACTION_BAR_TITLE),
- this);
+ final ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null && !(this instanceof PreviewImageActivity)) {
+ viewThemeUtils.files.themeActionBar(this, actionBar, savedInstanceState.getString(KEY_ACTION_BAR_TITLE));
+ }
} else {
User user = getIntent().getParcelableExtra(FileActivity.EXTRA_USER);
mFile = getIntent().getParcelableExtra(FileActivity.EXTRA_FILE);
@@ -700,12 +700,12 @@ public abstract class FileActivity extends DrawerActivity
public static void copyAndShareFileLink(FileActivity activity,
OCFile file,
String link,
- ThemeSnackbarUtils themeSnackbarUtils) {
+ final ViewThemeUtils viewThemeUtils) {
ClipboardUtil.copyToClipboard(activity, link, false);
Snackbar snackbar = Snackbar.make(activity.findViewById(android.R.id.content), R.string.clipboard_text_copied,
Snackbar.LENGTH_LONG)
.setAction(R.string.share, v -> showShareLinkDialog(activity, file, link));
- themeSnackbarUtils.colorSnackbar(activity, snackbar);
+ viewThemeUtils.material.themeSnackbar(snackbar);
snackbar.show();
}
@@ -774,7 +774,7 @@ public abstract class FileActivity extends DrawerActivity
snackbar = Snackbar.make(sharingFragment.getView(), result.getMessage(), Snackbar.LENGTH_LONG);
}
- themeSnackbarUtils.colorSnackbar(this, snackbar);
+ viewThemeUtils.material.themeSnackbar(snackbar);
snackbar.show();
}
}
@@ -800,7 +800,7 @@ public abstract class FileActivity extends DrawerActivity
}
}
- copyAndShareFileLink(this, file, link, themeSnackbarUtils);
+ copyAndShareFileLink(this, file, link, viewThemeUtils);
if (sharingFragment != null) {
sharingFragment.onUpdateShareInformation(result, file);
@@ -834,7 +834,7 @@ public abstract class FileActivity extends DrawerActivity
operation,
getResources()),
Snackbar.LENGTH_LONG);
- themeSnackbarUtils.colorSnackbar(this, snackbar);
+ viewThemeUtils.material.themeSnackbar(snackbar);
snackbar.show();
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java
index 5dcca733aa..de8c6ef6ef 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java
@@ -65,7 +65,7 @@ import com.nextcloud.client.network.ConnectivityService;
import com.nextcloud.client.preferences.AppPreferences;
import com.nextcloud.client.utils.IntentUtil;
import com.nextcloud.java.util.Optional;
-import com.nextcloud.utils.view.FastScroll;
+import com.nextcloud.utils.view.FastScrollUtils;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.databinding.FilesBinding;
@@ -231,6 +231,9 @@ public class FileDisplayActivity extends FileActivity
@Inject
ConnectivityService connectivityService;
+ @Inject
+ FastScrollUtils fastScrollUtils;
+
public static Intent openFileIntent(Context context, User user, OCFile file) {
final Intent intent = new Intent(context, PreviewImageActivity.class);
intent.putExtra(FileActivity.EXTRA_FILE, file);
@@ -272,7 +275,7 @@ public class FileDisplayActivity extends FileActivity
mSwitchAccountButton.setOnClickListener(v -> showManageAccountsDialog());
- FastScroll.fixAppBarForFastScroll(binding.appbar.appbar, binding.rootLayout);
+ fastScrollUtils.fixAppBarForFastScroll(binding.appbar.appbar, binding.rootLayout);
// Init Fragment without UI to retain AsyncTask across configuration changes
@@ -314,8 +317,7 @@ public class FileDisplayActivity extends FileActivity
.create();
alertDialog.show();
- themeButtonUtils.themeBorderlessButton(themeColorUtils,
- alertDialog.getButton(AlertDialog.BUTTON_POSITIVE));
+ viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE));
} catch (WindowManager.BadTokenException e) {
Log_OC.e(TAG, "Error showing wrong storage info, so skipping it: " + e.getMessage());
}
@@ -333,7 +335,7 @@ public class FileDisplayActivity extends FileActivity
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
getSupportFragmentManager().beginTransaction().remove(fragment).commitNowAllowingStateLoss();
- PermissionUtil.requestExternalStoragePermission(this, themeSnackbarUtils);
+ PermissionUtil.requestExternalStoragePermission(this, viewThemeUtils);
}
}
}
@@ -343,7 +345,7 @@ public class FileDisplayActivity extends FileActivity
super.onPostCreate(savedInstanceState);
- PermissionUtil.requestExternalStoragePermission(this, themeSnackbarUtils);
+ PermissionUtil.requestExternalStoragePermission(this, viewThemeUtils);
if (getIntent().getParcelableExtra(OCFileListFragment.SEARCH_EVENT) != null) {
switchToSearchFragment(savedInstanceState);
@@ -686,7 +688,7 @@ public class FileDisplayActivity extends FileActivity
searchView.setIconified(false);
});
- themeToolbarUtils.themeSearchView(searchView, this);
+ viewThemeUtils.androidx.themeToolbarSearchView(searchView);
// populate list of menu items to show/hide when drawer is opened/closed
mDrawerMenuItemstoShowHideList = new ArrayList<>(1);
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt
index 088121c731..56f2e9458e 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt
@@ -342,8 +342,8 @@ open class FolderPickerActivity :
val atRoot = currentDir == null || currentDir.parentId == 0L
actionBar.setDisplayHomeAsUpEnabled(!atRoot)
actionBar.setHomeButtonEnabled(!atRoot)
- themeToolbarUtils.tintBackButton(actionBar, this)
- themeToolbarUtils.setColoredTitle(supportActionBar, if (atRoot) caption else currentDir!!.fileName, this)
+ val title = if (atRoot) caption ?: "" else currentDir!!.fileName
+ viewThemeUtils.files.themeActionBar(this, actionBar, title)
}
}
@@ -354,14 +354,14 @@ open class FolderPickerActivity :
mCancelBtn = findViewById(R.id.folder_picker_btn_cancel)
mChooseBtn = findViewById(R.id.folder_picker_btn_choose)
if (mChooseBtn != null) {
- themeButtonUtils.colorPrimaryButton(mChooseBtn, this, themeColorUtils)
+ viewThemeUtils.material.colorMaterialButtonPrimaryFilled(mChooseBtn!!)
mChooseBtn!!.setOnClickListener(this)
}
if (mCancelBtn != null) {
if (this is FilePickerActivity) {
- themeButtonUtils.colorPrimaryButton(mCancelBtn, this, themeColorUtils)
+ viewThemeUtils.material.colorMaterialButtonPrimaryFilled(mCancelBtn!!)
} else {
- mCancelBtn!!.setTextColor(themeColorUtils.primaryColor(this, true))
+ viewThemeUtils.material.colorMaterialButtonPrimaryOutlined(mCancelBtn!!)
}
mCancelBtn!!.setOnClickListener(this)
}
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java
index 59f6764d7a..f4679bec50 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java
@@ -131,12 +131,9 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
+ viewThemeUtils.files.themeActionBar(this, actionBar, R.string.prefs_manage_accounts);
}
- // set title Action bar
- updateActionBarTitleAndHomeButtonByString(getResources().getString(R.string.prefs_manage_accounts));
- themeToolbarUtils.tintBackButton(actionBar, this);
-
List users = accountManager.getAllUsers();
originalUsers = toAccountNames(users);
@@ -156,8 +153,7 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
multipleAccountsSupported,
true,
true,
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
recyclerView.setAdapter(userListAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
@@ -312,8 +308,7 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
multipleAccountsSupported,
false,
true,
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
recyclerView.setAdapter(userListAdapter);
runOnUiThread(() -> userListAdapter.notifyDataSetChanged());
} catch (OperationCanceledException e) {
@@ -367,8 +362,7 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
multipleAccountsSupported,
false,
true,
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
recyclerView.setAdapter(userListAdapter);
} else {
onBackPressed();
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java
index 1c626494dd..97c0d8dc78 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java
@@ -85,7 +85,7 @@ public class NotificationsActivity extends DrawerActivity implements Notificatio
// use account from intent (opened via android notification can have a different account than current one)
if (getIntent() != null && getIntent().getExtras() != null) {
String accountName = getIntent().getExtras().getString(NotificationWork.KEY_NOTIFICATION_ACCOUNT);
- if(accountName != null && optionalUser.isPresent()) {
+ if (accountName != null && optionalUser.isPresent()) {
User user = optionalUser.get();
if (user.getAccountName().equalsIgnoreCase(accountName)) {
accountManager.setCurrentOwnCloudAccount(accountName);
@@ -100,8 +100,8 @@ public class NotificationsActivity extends DrawerActivity implements Notificatio
updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_item_notifications));
- themeLayoutUtils.colorSwipeRefreshLayout(this, binding.swipeContainingList);
- themeLayoutUtils.colorSwipeRefreshLayout(this, binding.swipeContainingEmpty);
+ viewThemeUtils.androidx.themeSwipeRefreshLayout(binding.swipeContainingList);
+ viewThemeUtils.androidx.themeSwipeRefreshLayout(binding.swipeContainingEmpty);
// setup drawer
setupDrawer(R.id.nav_notifications);
@@ -109,8 +109,8 @@ public class NotificationsActivity extends DrawerActivity implements Notificatio
if (!optionalUser.isPresent()) {
// show error
runOnUiThread(() -> setEmptyContent(
- getString(R.string.notifications_no_results_headline),
- getString(R.string.account_not_found))
+ getString(R.string.notifications_no_results_headline),
+ getString(R.string.account_not_found))
);
return;
}
@@ -149,7 +149,7 @@ public class NotificationsActivity extends DrawerActivity implements Notificatio
final ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(getContentResolver());
final String accountName = optionalUser.isPresent() ? optionalUser.get().getAccountName() : "";
final boolean usesOldLogin = arbitraryDataProvider.getBooleanValue(accountName,
- UserAccountManager.ACCOUNT_USES_STANDARD_PASSWORD);
+ UserAccountManager.ACCOUNT_USES_STANDARD_PASSWORD);
if (usesOldLogin) {
snackbar = Snackbar.make(binding.emptyList.emptyListView,
@@ -258,7 +258,7 @@ public class NotificationsActivity extends DrawerActivity implements Notificatio
private void initializeAdapter() {
initializeClient();
if (adapter == null) {
- adapter = new NotificationListAdapter(client, this, themeColorUtils, themeButtonUtils);
+ adapter = new NotificationListAdapter(client, this, viewThemeUtils);
binding.list.setAdapter(adapter);
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java
index 555a5061da..3fe049ef39 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java
@@ -42,9 +42,7 @@ import com.owncloud.android.R;
import com.owncloud.android.authentication.PassCodeManager;
import com.owncloud.android.databinding.PasscodelockBinding;
import com.owncloud.android.lib.common.utils.Log_OC;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeTextInputUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.Arrays;
@@ -63,7 +61,7 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
public final static String ACTION_REQUEST_WITH_RESULT = "ACTION_REQUEST_WITH_RESULT";
public final static String ACTION_CHECK_WITH_RESULT = "ACTION_CHECK_WITH_RESULT";
public final static String ACTION_CHECK = "ACTION_CHECK";
- public final static String KEY_PASSCODE = "KEY_PASSCODE";
+ public final static String KEY_PASSCODE = "KEY_PASSCODE";
public final static String KEY_CHECK_RESULT = "KEY_CHECK_RESULT";
public final static String PREFERENCE_PASSCODE_D = "PrefPinCode";
@@ -74,9 +72,7 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
@Inject AppPreferences preferences;
@Inject PassCodeManager passCodeManager;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeTextInputUtils themeTextInputUtils;
- @Inject ThemeButtonUtils themeButtonUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
private PasscodelockBinding binding;
private final EditText[] passCodeEditTexts = new EditText[4];
private String[] passCodeDigits = {"", "", "", ""};
@@ -85,37 +81,30 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
/**
* Initializes the activity.
+ *
+ * An intent with a valid ACTION is expected; if none is found, an {@link IllegalArgumentException} will be thrown.
*
- * An intent with a valid ACTION is expected; if none is found, an
- * {@link IllegalArgumentException} will be thrown.
- *
- * @param savedInstanceState Previously saved state - irrelevant in this case
+ * @param savedInstanceState Previously saved state - irrelevant in this case
*/
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = PasscodelockBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
- int elementColor = themeColorUtils.primaryColor(this, true);
- themeButtonUtils.themeBorderlessButton(themeColorUtils.primaryColor(this, true), binding.cancel);
+ viewThemeUtils.platform.colorTextButtons(binding.cancel);
passCodeEditTexts[0] = binding.txt0;
- themeTextInputUtils.colorEditText(passCodeEditTexts[0], elementColor);
- themeTextInputUtils.themeEditText(this, passCodeEditTexts[0], false, themeColorUtils);
+ passCodeEditTexts[1] = binding.txt1;
+ passCodeEditTexts[2] = binding.txt2;
+ passCodeEditTexts[3] = binding.txt3;
+
+ for (EditText passCodeEditText : passCodeEditTexts) {
+ viewThemeUtils.platform.colorEditText(passCodeEditText);
+ }
+
passCodeEditTexts[0].requestFocus();
- passCodeEditTexts[1] = binding.txt1;
- themeTextInputUtils.colorEditText(passCodeEditTexts[1], elementColor);
- themeTextInputUtils.themeEditText(this, passCodeEditTexts[1], false, themeColorUtils);
-
- passCodeEditTexts[2] = binding.txt2;
- themeTextInputUtils.colorEditText(passCodeEditTexts[2], elementColor);
- themeTextInputUtils.themeEditText(this, passCodeEditTexts[2], false, themeColorUtils);
-
- passCodeEditTexts[3] = binding.txt3;
- themeTextInputUtils.colorEditText(passCodeEditTexts[3], elementColor);
- themeTextInputUtils.themeEditText(this, passCodeEditTexts[3], false, themeColorUtils);
Window window = getWindow();
if (window != null) {
@@ -135,10 +124,10 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
confirmingPassCode = savedInstanceState.getBoolean(PassCodeActivity.KEY_CONFIRMING_PASSCODE);
passCodeDigits = savedInstanceState.getStringArray(PassCodeActivity.KEY_PASSCODE_DIGITS);
}
- if(confirmingPassCode){
+ if (confirmingPassCode) {
// the app was in the passcodeconfirmation
requestPassCodeConfirmation();
- }else{
+ } else {
// pass code preference has just been activated in SettingsActivity;
// will receive and confirm pass code value
binding.header.setText(R.string.pass_code_configure_your_pass_code);
@@ -162,13 +151,12 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
}
/**
- * Enables or disables the cancel button to allow the user interrupt the ACTION
- * requested to the activity.
+ * Enables or disables the cancel button to allow the user interrupt the ACTION requested to the activity.
*
- * @param enabled 'True' makes the cancel button available, 'false' hides it.
+ * @param enabled 'True' makes the cancel button available, 'false' hides it.
*/
- protected void setCancelButtonEnabled(boolean enabled){
- if(enabled){
+ protected void setCancelButtonEnabled(boolean enabled) {
+ if (enabled) {
binding.cancel.setVisibility(View.VISIBLE);
binding.cancel.setOnClickListener(new OnClickListener() {
@Override
@@ -235,9 +223,9 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
/**
* Processes the pass code entered by the user just after the last digit was in.
- *
- * Takes into account the action requested to the activity, the currently saved pass code and
- * the previously typed pass code, if any.
+ *
+ * Takes into account the action requested to the activity, the currently saved pass code and the previously typed
+ * pass code, if any.
*/
private void processFullPassCode() {
if (ACTION_CHECK.equals(getIntent().getAction())) {
@@ -249,7 +237,7 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
hideSoftKeyboard();
finish();
- } else {
+ } else {
preferences.increasePinWrongAttempts();
showErrorAndRestart(R.string.pass_code_wrong, R.string.pass_code_enter_pass_code, View.INVISIBLE);
@@ -278,8 +266,8 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
} else {
showErrorAndRestart(
- R.string.pass_code_mismatch, R.string.pass_code_configure_your_pass_code, View.VISIBLE
- );
+ R.string.pass_code_mismatch, R.string.pass_code_configure_your_pass_code, View.VISIBLE
+ );
}
}
}
@@ -292,7 +280,7 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
inputMethodManager.hideSoftInputFromWindow(
focusedView.getWindowToken(),
0
- );
+ );
}
}
@@ -309,10 +297,9 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
/**
- * Ask to the user for retyping the pass code just entered before saving it as the current pass
- * code.
+ * Ask to the user for retyping the pass code just entered before saving it as the current pass code.
*/
- protected void requestPassCodeConfirmation(){
+ protected void requestPassCodeConfirmation() {
clearBoxes();
binding.header.setText(R.string.pass_code_reenter_your_pass_code);
binding.explanation.setVisibility(View.INVISIBLE);
@@ -322,7 +309,7 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
/**
* Compares pass code entered by the user with the value currently saved in the app.
*
- * @return 'True' if entered pass code equals to the saved one.
+ * @return 'True' if entered pass code equals to the saved one.
*/
protected boolean checkPassCode() {
@@ -337,12 +324,11 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
}
/**
- * Compares pass code retyped by the user in the input fields with the value entered just
- * before.
+ * Compares pass code retyped by the user in the input fields with the value entered just before.
*
- * @return 'True' if retyped pass code equals to the entered before.
+ * @return 'True' if retyped pass code equals to the entered before.
*/
- protected boolean confirmPassCode(){
+ protected boolean confirmPassCode() {
confirmingPassCode = false;
boolean result = true;
@@ -355,7 +341,7 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
/**
* Sets the input fields to empty strings and puts the focus on the first one.
*/
- protected void clearBoxes(){
+ protected void clearBoxes() {
for (EditText mPassCodeEditText : passCodeEditTexts) {
mPassCodeEditText.setText("");
}
@@ -363,12 +349,12 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
}
/**
- * Overrides click on the BACK arrow to correctly cancel ACTION_ENABLE or ACTION_DISABLE, while
- * preventing than ACTION_CHECK may be worked around.
+ * Overrides click on the BACK arrow to correctly cancel ACTION_ENABLE or ACTION_DISABLE, while preventing than
+ * ACTION_CHECK may be worked around.
*
- * @param keyCode Key code of the key that triggered the down event.
- * @param event Event triggered.
- * @return 'True' when the key event was processed by this method.
+ * @param keyCode Key code of the key that triggered the down event.
+ * @param event Event triggered.
+ * @return 'True' when the key event was processed by this method.
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
@@ -448,18 +434,16 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
/**
* Constructor
*
- * @param index Position in the pass code of the input field that will be bound to
- * this watcher.
- * @param lastOne 'True' means that watcher corresponds to the last position of the
- * pass code.
+ * @param index Position in the pass code of the input field that will be bound to this watcher.
+ * @param lastOne 'True' means that watcher corresponds to the last position of the pass code.
*/
PassCodeDigitTextWatcher(int index, boolean lastOne) {
mIndex = index;
- mLastOne = lastOne;
+ mLastOne = lastOne;
if (mIndex < 0) {
throw new IllegalArgumentException(
- "Invalid index in " + PassCodeDigitTextWatcher.class.getSimpleName() +
- " constructor"
+ "Invalid index in " + PassCodeDigitTextWatcher.class.getSimpleName() +
+ " constructor"
);
}
}
@@ -469,13 +453,11 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
}
/**
- * Performs several actions when the user types a digit in an input field:
- * - saves the input digit to the state of the activity; this will allow retyping the
- * pass code to confirm it.
- * - moves the focus automatically to the next field
- * - for the last field, triggers the processing of the full pass code
+ * Performs several actions when the user types a digit in an input field: - saves the input digit to the state
+ * of the activity; this will allow retyping the pass code to confirm it. - moves the focus automatically to the
+ * next field - for the last field, triggers the processing of the full pass code
*
- * @param s Changed text
+ * @param s Changed text
*/
@Override
public void afterTextChanged(Editable s) {
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java
index be4246003c..a24572d606 100755
--- a/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java
@@ -52,7 +52,6 @@ import android.view.WindowManager.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
-import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
@@ -93,8 +92,7 @@ import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.ErrorMessageAdapter;
import com.owncloud.android.utils.FileSortOrder;
import com.owncloud.android.utils.MimeType;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeTextInputUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.io.File;
import java.io.FileWriter;
@@ -202,11 +200,11 @@ public class ReceiveExternalFilesActivity extends FileActivity
// Init Fragment without UI to retain AsyncTask across configuration changes
FragmentManager fm = getSupportFragmentManager();
TaskRetainerFragment taskRetainerFragment =
- (TaskRetainerFragment) fm.findFragmentByTag(TaskRetainerFragment.FTAG_TASK_RETAINER_FRAGMENT);
+ (TaskRetainerFragment) fm.findFragmentByTag(TaskRetainerFragment.FTAG_TASK_RETAINER_FRAGMENT);
if (taskRetainerFragment == null) {
taskRetainerFragment = new TaskRetainerFragment();
fm.beginTransaction()
- .add(taskRetainerFragment, TaskRetainerFragment.FTAG_TASK_RETAINER_FRAGMENT).commit();
+ .add(taskRetainerFragment, TaskRetainerFragment.FTAG_TASK_RETAINER_FRAGMENT).commit();
} // else, Fragment already created and retained across configuration change
}
@@ -221,9 +219,9 @@ public class ReceiveExternalFilesActivity extends FileActivity
if (!somethingToUpload()) {
showErrorDialog(
- R.string.uploader_error_message_no_file_to_upload,
- R.string.uploader_error_title_no_file_to_upload
- );
+ R.string.uploader_error_message_no_file_to_upload,
+ R.string.uploader_error_title_no_file_to_upload
+ );
}
super.setAccount(account, savedAccount);
@@ -297,7 +295,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
builder.setIcon(R.drawable.ic_warning);
builder.setTitle(R.string.uploader_wrn_no_account_title);
builder.setMessage(String.format(getString(R.string.uploader_wrn_no_account_text),
- getString(R.string.app_name)));
+ getString(R.string.app_name)));
builder.setCancelable(false);
builder.setPositiveButton(R.string.uploader_wrn_no_account_setup_btn_text, (dialog, which) -> {
// using string value since in API7 this
@@ -310,7 +308,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
startActivityForResult(intent, REQUEST_CODE__SETUP_ACCOUNT);
});
builder.setNeutralButton(R.string.uploader_wrn_no_account_quit_btn_text,
- (dialog, which) -> getActivity().finish());
+ (dialog, which) -> getActivity().finish());
return builder.create();
}
}
@@ -331,8 +329,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
private Spinner mSpinner;
@Inject AppPreferences preferences;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeTextInputUtils themeTextInputUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
public static DialogInputUploadFilename newInstance(String subjectText, String extraText) {
DialogInputUploadFilename dialog = new DialogInputUploadFilename();
@@ -370,7 +367,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
View view = layout.inflate(R.layout.upload_file_dialog, null);
ArrayAdapter adapter
- = new ArrayAdapter<>(requireContext(), android.R.layout.simple_spinner_item);
+ = new ArrayAdapter<>(requireContext(), android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
int selectPos = 0;
@@ -387,17 +384,17 @@ public class ReceiveExternalFilesActivity extends FileActivity
mText.add(internetShortcutUrlText(extraText));
mFilenameBase.add(filename);
mFilenameSuffix.add(URL_FILE_SUFFIX);
- adapter.add(String.format(str,URL_FILE_SUFFIX));
+ adapter.add(String.format(str, URL_FILE_SUFFIX));
mText.add(internetShortcutWeblocText(extraText));
mFilenameBase.add(filename);
mFilenameSuffix.add(WEBLOC_FILE_SUFFIX);
- adapter.add(String.format(str,WEBLOC_FILE_SUFFIX));
+ adapter.add(String.format(str, WEBLOC_FILE_SUFFIX));
mText.add(internetShortcutDesktopText(extraText, filename));
mFilenameBase.add(filename);
mFilenameSuffix.add(DESKTOP_FILE_SUFFIX);
- adapter.add(String.format(str,DESKTOP_FILE_SUFFIX));
+ adapter.add(String.format(str, DESKTOP_FILE_SUFFIX));
selectPos = preferences.getUploadUrlFileExtensionUrlSelectedPos();
mFileCategory = CATEGORY_URL;
@@ -407,12 +404,12 @@ public class ReceiveExternalFilesActivity extends FileActivity
mText.add(internetShortcutUrlText(texts[2]));
mFilenameBase.add(texts[0]);
mFilenameSuffix.add(URL_FILE_SUFFIX);
- adapter.add(String.format(str,URL_FILE_SUFFIX));
+ adapter.add(String.format(str, URL_FILE_SUFFIX));
mText.add(internetShortcutWeblocText(texts[2]));
mFilenameBase.add(texts[0]);
mFilenameSuffix.add(WEBLOC_FILE_SUFFIX);
- adapter.add(String.format(str,WEBLOC_FILE_SUFFIX));
+ adapter.add(String.format(str, WEBLOC_FILE_SUFFIX));
mText.add(internetShortcutDesktopText(texts[2], texts[0]));
mFilenameBase.add(texts[0]);
@@ -427,10 +424,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
final TextInputLayout userInputContainer = view.findViewById(R.id.user_input_container);
setFilename(userInput, selectPos);
userInput.requestFocus();
- themeTextInputUtils.colorTextInput(userInputContainer,
- userInput,
- themeColorUtils.primaryColor(getContext()),
- themeColorUtils.primaryAccentColor(getContext()));
+ viewThemeUtils.material.colorTextInputLayout(userInputContainer);
final Spinner spinner = view.findViewById(R.id.file_type);
setupSpinner(adapter, selectPos, userInput, spinner);
@@ -525,8 +519,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
}
}
- private void setFilename(EditText inputText, int selectPos)
- {
+ private void setFilename(EditText inputText, int selectPos) {
String filename = mFilenameBase.get(selectPos) + mFilenameSuffix.get(selectPos);
inputText.setText(filename);
int selectionStart = 0;
@@ -534,8 +527,8 @@ public class ReceiveExternalFilesActivity extends FileActivity
int selectionEnd = extensionStart >= 0 ? extensionStart : filename.length();
if (selectionEnd >= 0) {
inputText.setSelection(
- Math.min(selectionStart, selectionEnd),
- Math.max(selectionStart, selectionEnd));
+ Math.min(selectionStart, selectionEnd),
+ Math.max(selectionStart, selectionEnd));
}
}
@@ -579,18 +572,18 @@ public class ReceiveExternalFilesActivity extends FileActivity
private String internetShortcutUrlText(String url) {
return "[InternetShortcut]\r\n" +
- "URL=" + url + "\r\n";
+ "URL=" + url + "\r\n";
}
private String internetShortcutWeblocText(String url) {
return "\n" +
- "\n" +
- "\n" +
- "\n" +
- "URL\n" +
- "" + url + "\n" +
- "\n" +
- "\n";
+ "\n" +
+ "\n" +
+ "\n" +
+ "URL\n" +
+ "" + url + "\n" +
+ "\n" +
+ "\n";
}
private String internetShortcutDesktopText(String url, String filename) {
@@ -654,7 +647,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
if (files.size() < position) {
throw new IndexOutOfBoundsException("Incorrect item selected");
}
- if (files.get(position).isFolder()){
+ if (files.get(position).isFolder()) {
OCFile folderToEnter = files.get(position);
startSyncFolderOperation(folderToEnter);
mParents.push(folderToEnter.getFileName());
@@ -713,8 +706,8 @@ public class ReceiveExternalFilesActivity extends FileActivity
private void setupActionBarSubtitle() {
ActionBar actionBar = getSupportActionBar();
- if (isHaveMultipleAccount()) {
- themeToolbarUtils.setColoredSubtitle(actionBar, getAccount().name, this);
+ if (isHaveMultipleAccount() && actionBar != null) {
+ viewThemeUtils.files.themeActionBar(this, actionBar, getAccount().name);
} else if (actionBar != null) {
actionBar.setSubtitle(null);
}
@@ -734,9 +727,9 @@ public class ReceiveExternalFilesActivity extends FileActivity
if (actionBar != null) {
if (TextUtils.isEmpty(current_dir)) {
- themeToolbarUtils.setColoredTitle(actionBar, R.string.uploader_top_message, this);
+ viewThemeUtils.files.themeActionBar(this, actionBar, R.string.uploader_top_message);
} else {
- themeToolbarUtils.setColoredTitle(actionBar, current_dir, this);
+ viewThemeUtils.files.themeActionBar(this, actionBar, current_dir);
}
actionBar.setDisplayHomeAsUpEnabled(notRoot);
@@ -753,7 +746,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
if (files.isEmpty()) {
setMessageForEmptyList(R.string.file_list_empty_headline, R.string.empty,
- R.drawable.uploads);
+ R.drawable.uploads);
} else {
mEmptyListContainer.setVisibility(View.GONE);
@@ -773,30 +766,20 @@ public class ReceiveExternalFilesActivity extends FileActivity
new int[]{R.id.filename},
getStorageManager(),
getUser().get(),
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
binding.list.setAdapter(sa);
}
MaterialButton btnChooseFolder = binding.uploaderChooseFolder;
- themeButtonUtils.colorPrimaryButton(btnChooseFolder, this, themeColorUtils);
+ viewThemeUtils.material.colorMaterialButtonPrimaryFilled(btnChooseFolder);
btnChooseFolder.setOnClickListener(this);
- if (mFile.canWrite()) {
- btnChooseFolder.setEnabled(true);
- themeButtonUtils.colorPrimaryButton(btnChooseFolder, this, themeColorUtils);
- } else {
- btnChooseFolder.setEnabled(false);
- btnChooseFolder.setBackgroundColor(Color.GRAY);
- }
+ btnChooseFolder.setEnabled(mFile.canWrite());
- themeToolbarUtils.colorStatusBar(this);
+ viewThemeUtils.platform.themeStatusBar(this);
- themeToolbarUtils.tintBackButton(actionBar, this);
-
- Button btnNewFolder = binding.uploaderCancel;
- btnNewFolder.setTextColor(themeColorUtils.primaryColor(this, true));
- btnNewFolder.setOnClickListener(this);
+ viewThemeUtils.material.colorMaterialButtonPrimaryOutlined(binding.uploaderCancel);
+ binding.uploaderCancel.setOnClickListener(this);
binding.list.setOnItemClickListener(this);
@@ -820,8 +803,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
if (mEmptyListContainer != null && mEmptyListMessage != null) {
mEmptyListHeadline.setText(headline);
mEmptyListMessage.setText(message);
- mEmptyListIcon.setImageDrawable(
- themeDrawableUtils.tintDrawable(icon, themeColorUtils.primaryColor(this, true)));
+ mEmptyListIcon.setImageDrawable(viewThemeUtils.platform.tintPrimaryDrawable(this, icon));
mEmptyListIcon.setVisibility(View.VISIBLE);
mEmptyListMessage.setVisibility(View.VISIBLE);
}
@@ -840,13 +822,13 @@ public class ReceiveExternalFilesActivity extends FileActivity
// perform folder synchronization
RemoteOperation syncFolderOp = new RefreshFolderOperation(folder,
- currentSyncTime,
- false,
- false,
- getStorageManager(),
- getUser().orElseThrow(RuntimeException::new),
- getApplicationContext()
- );
+ currentSyncTime,
+ false,
+ false,
+ getStorageManager(),
+ getUser().orElseThrow(RuntimeException::new),
+ getApplicationContext()
+ );
syncFolderOp.execute(getAccount(), this, null, null);
}
@@ -898,23 +880,23 @@ public class ReceiveExternalFilesActivity extends FileActivity
private boolean somethingToUpload() {
return (mStreamsToUpload != null && mStreamsToUpload.size() > 0 && mStreamsToUpload.get(0) != null ||
- mUploadFromTmpFile);
+ mUploadFromTmpFile);
}
public void uploadFile(String tmpName, String filename) {
FileUploader.uploadNewFile(
- getBaseContext(),
- getUser().orElseThrow(RuntimeException::new),
- tmpName,
- mFile.getRemotePath() + filename,
- FileUploader.LOCAL_BEHAVIOUR_COPY,
- null,
- true,
- UploadFileOperation.CREATED_BY_USER,
- false,
- false,
- NameCollisionPolicy.ASK_USER
- );
+ getBaseContext(),
+ getUser().orElseThrow(RuntimeException::new),
+ tmpName,
+ mFile.getRemotePath() + filename,
+ FileUploader.LOCAL_BEHAVIOUR_COPY,
+ null,
+ true,
+ UploadFileOperation.CREATED_BY_USER,
+ false,
+ false,
+ NameCollisionPolicy.ASK_USER
+ );
finish();
}
@@ -952,9 +934,9 @@ public class ReceiveExternalFilesActivity extends FileActivity
}
showErrorDialog(
- messageResId,
- messageResTitle
- );
+ messageResId,
+ messageResTitle
+ );
}
}
@@ -970,8 +952,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
}
/**
- * Updates the view associated to the activity after the finish of an operation
- * trying create a new folder
+ * Updates the view associated to the activity after the finish of an operation trying create a new folder
*
* @param operation Creation operation performed.
* @param result Result of the creation.
@@ -986,8 +967,8 @@ public class ReceiveExternalFilesActivity extends FileActivity
} else {
try {
DisplayUtils.showSnackMessage(
- this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources())
- );
+ this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources())
+ );
} catch (NotFoundException e) {
Log_OC.e(TAG, "Error while trying to show fail message ", e);
@@ -1046,7 +1027,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
newFolderMenuItem.setEnabled(mFile.canWrite());
// hacky as no default way is provided
- themeToolbarUtils.themeSearchView(searchView, this);
+ viewThemeUtils.androidx.themeToolbarSearchView(searchView);
return true;
}
@@ -1072,7 +1053,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
return retval;
}
- private OCFile getCurrentFolder(){
+ private OCFile getCurrentFolder() {
OCFile file = mFile;
if (file != null) {
if (file.isFolder()) {
@@ -1103,9 +1084,9 @@ public class ReceiveExternalFilesActivity extends FileActivity
String accountName = intent.getStringExtra(FileSyncAdapter.EXTRA_ACCOUNT_NAME);
String syncFolderRemotePath = intent.getStringExtra(FileSyncAdapter.EXTRA_FOLDER_PATH);
RemoteOperationResult syncResult = (RemoteOperationResult)
- DataHolderUtil.getInstance().retrieve(intent.getStringExtra(FileSyncAdapter.EXTRA_RESULT));
+ DataHolderUtil.getInstance().retrieve(intent.getStringExtra(FileSyncAdapter.EXTRA_RESULT));
boolean sameAccount = getAccount() != null && accountName.equals(getAccount().name)
- && getStorageManager() != null;
+ && getStorageManager() != null;
if (sameAccount) {
@@ -1121,10 +1102,10 @@ public class ReceiveExternalFilesActivity extends FileActivity
if (currentDir == null) {
// current folder was removed from the server
DisplayUtils.showSnackMessage(
- getActivity(),
- R.string.sync_current_folder_was_removed,
- getCurrentFolder().getFileName()
- );
+ getActivity(),
+ R.string.sync_current_folder_was_removed,
+ getCurrentFolder().getFileName()
+ );
browseToRoot();
} else {
@@ -1140,11 +1121,11 @@ public class ReceiveExternalFilesActivity extends FileActivity
}
mSyncInProgress = !FileSyncAdapter.EVENT_FULL_SYNC_END.equals(event) &&
- !RefreshFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED.equals(event);
+ !RefreshFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED.equals(event);
if (RefreshFolderOperation.EVENT_SINGLE_FOLDER_CONTENTS_SYNCED.equals(event)
- /// TODO refactor and make common
- && syncResult != null && !syncResult.isSuccess()) {
+ /// TODO refactor and make common
+ && syncResult != null && !syncResult.isSuccess()) {
if (syncResult.getCode() == ResultCode.UNAUTHORIZED ||
(syncResult.isException() && syncResult.getException()
@@ -1181,9 +1162,9 @@ public class ReceiveExternalFilesActivity extends FileActivity
/**
* Show an error dialog, forcing the user to click a single button to exit the activity
*
- * @param messageResId Resource id of the message to show in the dialog.
- * @param messageResTitle Resource id of the title to show in the dialog. 0 to show default alert message.
- * -1 to show no title.
+ * @param messageResId Resource id of the message to show in the dialog.
+ * @param messageResTitle Resource id of the title to show in the dialog. 0 to show default alert message. -1 to
+ * show no title.
*/
private void showErrorDialog(int messageResId, int messageResTitle) {
@@ -1194,7 +1175,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
R.string.common_back,
-1,
-1
- );
+ );
errorDialog.setCancelable(false);
errorDialog.setOnConfirmationListener(
new ConfirmationDialogFragment.ConfirmationDialogFragmentListener() {
@@ -1213,7 +1194,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
// not used at the moment
}
}
- );
+ );
errorDialog.show(getSupportFragmentManager(), FTAG_ERROR_FRAGMENT);
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java
index 3855578349..f9ddae3036 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java
@@ -31,11 +31,11 @@ import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Configuration;
-import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
+import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
@@ -75,11 +75,7 @@ import com.owncloud.android.utils.DeviceCredentialUtils;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.EncryptionUtils;
import com.owncloud.android.utils.MimeTypeUtil;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeTextUtils;
-import com.owncloud.android.utils.theme.ThemeToolbarUtils;
-import com.owncloud.android.utils.theme.ThemeUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.ArrayList;
import java.util.List;
@@ -92,19 +88,21 @@ import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatDelegate;
+import androidx.core.content.ContextCompat;
+import androidx.core.content.res.ResourcesCompat;
/**
* An Activity that allows the user to change the application's settings.
- *
+ *
* It proxies the necessary calls via {@link androidx.appcompat.app.AppCompatDelegate} to be used with AppCompat.
*/
-public class SettingsActivity extends ThemedPreferenceActivity
+public class SettingsActivity extends PreferenceActivity
implements StorageMigration.StorageMigrationProgressListener, LoadingVersionNumberTask.VersionDevInterface,
Injectable {
private static final String TAG = SettingsActivity.class.getSimpleName();
- public static final String PREFERENCE_LOCK= "lock";
+ public static final String PREFERENCE_LOCK = "lock";
public static final String LOCK_NONE = "none";
public static final String LOCK_PASSCODE = "passcode";
@@ -140,21 +138,14 @@ public class SettingsActivity extends ThemedPreferenceActivity
@Inject AppPreferences preferences;
@Inject UserAccountManager accountManager;
@Inject ClientFactory clientFactory;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeToolbarUtils themeToolbarUtils;
- @Inject ThemeUtils themeUtils;
- @Inject ThemeTextUtils themeTextUtils;
- @Inject ThemeButtonUtils themeButtonUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
+
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (themeUtils.themingEnabled(this)) {
- setTheme(R.style.FallbackThemingTheme);
- }
-
getDelegate().installViewFactory();
getDelegate().onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
@@ -164,7 +155,6 @@ public class SettingsActivity extends ThemedPreferenceActivity
// Register context menu for list of preferences.
registerForContextMenu(getListView());
- int accentColor = themeColorUtils.primaryAccentColor(this);
String appVersion = getAppVersion();
PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference("preference_screen");
@@ -174,31 +164,33 @@ public class SettingsActivity extends ThemedPreferenceActivity
setupBaseUri();
// General
- setupGeneralCategory(accentColor);
+ setupGeneralCategory();
// Synced folders
- setupAutoUploadCategory(accentColor, preferenceScreen);
+ setupAutoUploadCategory(preferenceScreen);
// Details
- setupDetailsCategory(accentColor, preferenceScreen);
+ setupDetailsCategory(preferenceScreen);
// More
- setupMoreCategory(accentColor);
+ setupMoreCategory();
// About
- setupAboutCategory(accentColor, appVersion);
+ setupAboutCategory(appVersion);
// Dev
- setupDevCategory(accentColor, preferenceScreen);
+ setupDevCategory(preferenceScreen);
+
+ // workaround for mismatched color when app dark mode and system dark mode don't agree
+ setListBackground();
}
- private void setupDevCategory(int accentColor, PreferenceScreen preferenceScreen) {
+ private void setupDevCategory(PreferenceScreen preferenceScreen) {
// Dev category
PreferenceCategory preferenceCategoryDev = (PreferenceCategory) findPreference("dev_category");
if (getResources().getBoolean(R.bool.is_beta)) {
- preferenceCategoryDev.setTitle(themeTextUtils.getColoredTitle(getString(R.string.prefs_category_dev),
- accentColor));
+ viewThemeUtils.files.themePreferenceCategory(preferenceCategoryDev);
/* Link to dev apks */
Preference pDevLink = findPreference("dev_link");
@@ -235,10 +227,9 @@ public class SettingsActivity extends ThemedPreferenceActivity
}
}
- private void setupAboutCategory(int accentColor, String appVersion) {
- PreferenceCategory preferenceCategoryAbout = (PreferenceCategory) findPreference("about");
- preferenceCategoryAbout.setTitle(themeTextUtils.getColoredTitle(getString(R.string.prefs_category_about),
- accentColor));
+ private void setupAboutCategory(String appVersion) {
+ final PreferenceCategory preferenceCategoryAbout = (PreferenceCategory) findPreference("about");
+ viewThemeUtils.files.themePreferenceCategory(preferenceCategoryAbout);
/* About App */
Preference pAboutApp = findPreference("about_app");
@@ -288,7 +279,7 @@ public class SettingsActivity extends ThemedPreferenceActivity
} else {
intent = new Intent(getApplicationContext(), ExternalSiteWebView.class);
intent.putExtra(ExternalSiteWebView.EXTRA_TITLE,
- getResources().getString(R.string.privacy));
+ getResources().getString(R.string.privacy));
intent.putExtra(ExternalSiteWebView.EXTRA_URL, privacyUrl.toString());
intent.putExtra(ExternalSiteWebView.EXTRA_SHOW_SIDEBAR, false);
intent.putExtra(ExternalSiteWebView.EXTRA_MENU_ITEM_ID, -1);
@@ -321,10 +312,9 @@ public class SettingsActivity extends ThemedPreferenceActivity
}
}
- private void setupMoreCategory(int accentColor) {
- PreferenceCategory preferenceCategoryMore = (PreferenceCategory) findPreference("more");
- preferenceCategoryMore.setTitle(themeTextUtils.getColoredTitle(getString(R.string.prefs_category_more),
- accentColor));
+ private void setupMoreCategory() {
+ final PreferenceCategory preferenceCategoryMore = (PreferenceCategory) findPreference("more");
+ viewThemeUtils.files.themePreferenceCategory(preferenceCategoryMore);
setupAutoUploadPreference(preferenceCategoryMore);
@@ -386,7 +376,6 @@ public class SettingsActivity extends ThemedPreferenceActivity
}
-
private void setupRecommendPreference(PreferenceCategory preferenceCategoryMore) {
boolean recommendEnabled = getResources().getBoolean(R.bool.recommend_enabled);
Preference pRecommend = findPreference("recommend");
@@ -402,11 +391,11 @@ public class SettingsActivity extends ThemedPreferenceActivity
String downloadUrlGooglePlayStore = getString(R.string.url_app_download);
String downloadUrlFDroid = getString(R.string.fdroid_link);
String downloadUrls = String.format(getString(R.string.recommend_urls),
- downloadUrlGooglePlayStore, downloadUrlFDroid);
+ downloadUrlGooglePlayStore, downloadUrlFDroid);
String recommendSubject = String.format(getString(R.string.recommend_subject), appName);
String recommendText = String.format(getString(R.string.recommend_text),
- appName, downloadUrls);
+ appName, downloadUrls);
intent.putExtra(Intent.EXTRA_SUBJECT, recommendSubject);
intent.putExtra(Intent.EXTRA_TEXT, recommendText);
@@ -501,9 +490,9 @@ public class SettingsActivity extends ThemedPreferenceActivity
} catch (Throwable t) {
Log_OC.e(TAG, "Base Uri for account could not be resolved to call DAVdroid!", t);
DisplayUtils.showSnackMessage(
- activity,
- R.string.prefs_calendar_contacts_address_resolve_error
- );
+ activity,
+ R.string.prefs_calendar_contacts_address_resolve_error
+ );
}
return true;
});
@@ -513,10 +502,9 @@ public class SettingsActivity extends ThemedPreferenceActivity
}
}
- private void setupDetailsCategory(int accentColor, PreferenceScreen preferenceScreen) {
+ private void setupDetailsCategory(PreferenceScreen preferenceScreen) {
PreferenceCategory preferenceCategoryDetails = (PreferenceCategory) findPreference("details");
- preferenceCategoryDetails.setTitle(themeTextUtils.getColoredTitle(getString(R.string.prefs_category_details),
- accentColor));
+ viewThemeUtils.files.themePreferenceCategory(preferenceCategoryDetails);
boolean fPassCodeEnabled = getResources().getBoolean(R.bool.passcode_enabled);
boolean fDeviceCredentialsEnabled = getResources().getBoolean(R.bool.device_credentials_enabled);
@@ -609,11 +597,10 @@ public class SettingsActivity extends ThemedPreferenceActivity
}
}
- private void setupAutoUploadCategory(int accentColor, PreferenceScreen preferenceScreen) {
- PreferenceCategory preferenceCategorySyncedFolders =
+ private void setupAutoUploadCategory(PreferenceScreen preferenceScreen) {
+ final PreferenceCategory preferenceCategorySyncedFolders =
(PreferenceCategory) findPreference("synced_folders_category");
- preferenceCategorySyncedFolders.setTitle(themeTextUtils.getColoredTitle(getString(R.string.drawer_synced_folders),
- accentColor));
+ viewThemeUtils.files.themePreferenceCategory(preferenceCategorySyncedFolders);
if (!getResources().getBoolean(R.bool.syncedFolder_light)) {
preferenceScreen.removePreference(preferenceCategorySyncedFolders);
@@ -653,7 +640,7 @@ public class SettingsActivity extends ThemedPreferenceActivity
Intent i = new Intent(getApplicationContext(), PassCodeActivity.class);
i.setAction(PassCodeActivity.ACTION_REQUEST_WITH_RESULT);
startActivityForResult(i, ACTION_REQUEST_PASSCODE);
- } else if (LOCK_DEVICE_CREDENTIALS.equals(lock)){
+ } else if (LOCK_DEVICE_CREDENTIALS.equals(lock)) {
if (!DeviceCredentialUtils.areCredentialsAvailable(getApplicationContext())) {
DisplayUtils.showSnackMessage(this, R.string.prefs_lock_device_credentials_not_setup);
} else {
@@ -680,10 +667,9 @@ public class SettingsActivity extends ThemedPreferenceActivity
}
}
- private void setupGeneralCategory(int accentColor) {
- PreferenceCategory preferenceCategoryGeneral = (PreferenceCategory) findPreference("general");
- preferenceCategoryGeneral.setTitle(themeTextUtils.getColoredTitle(getString(R.string.prefs_category_general),
- accentColor));
+ private void setupGeneralCategory() {
+ final PreferenceCategory preferenceCategoryGeneral = (PreferenceCategory) findPreference("general");
+ viewThemeUtils.files.themePreferenceCategory(preferenceCategoryGeneral);
prefStoragePath = (ListPreference) findPreference(AppPreferencesImpl.STORAGE_PATH);
if (prefStoragePath != null) {
@@ -737,11 +723,16 @@ public class SettingsActivity extends ThemedPreferenceActivity
DarkMode mode = DarkMode.valueOf((String) newValue);
preferences.setDarkThemeMode(mode);
MainApp.setAppTheme(mode);
+ setListBackground();
return true;
});
}
+ private void setListBackground() {
+ getListView().setBackgroundColor(ContextCompat.getColor(this, R.color.bg_default));
+ }
+
private String getAppVersion() {
String temp;
try {
@@ -764,12 +755,17 @@ public class SettingsActivity extends ThemedPreferenceActivity
ActionBar actionBar = getDelegate().getSupportActionBar();
if (actionBar != null) {
- themeToolbarUtils.setColoredTitle(actionBar, getString(R.string.actionbar_settings), this);
- themeToolbarUtils.colorStatusBar(this);
- actionBar.setBackgroundDrawable(new ColorDrawable(themeColorUtils.primaryAppbarColor(this)));
-
+ viewThemeUtils.platform.themeStatusBar(this);
actionBar.setDisplayHomeAsUpEnabled(true);
- themeToolbarUtils.tintBackButton(actionBar, this);
+ actionBar.setDisplayShowTitleEnabled(true);
+ if (this.getResources() != null) {
+ viewThemeUtils.androidx.themeActionBar(this,
+ actionBar,
+ getString(R.string.actionbar_settings),
+ ResourcesCompat.getDrawable(this.getResources(),
+ R.drawable.ic_arrow_back,
+ null));
+ }
}
}
@@ -798,7 +794,7 @@ public class SettingsActivity extends ThemedPreferenceActivity
} else {
// no f-droid market app or Play store installed --> launch browser for f-droid url
Intent downloadIntent = new Intent(Intent.ACTION_VIEW,
- Uri.parse("https://f-droid.org/repository/browse/?fdid=at.bitfire.davdroid"));
+ Uri.parse("https://f-droid.org/repository/browse/?fdid=at.bitfire.davdroid"));
DisplayUtils.startIntentIfAppAvailable(downloadIntent, this, R.string.no_browser_available);
DisplayUtils.showSnackMessage(this, R.string.prefs_calendar_contacts_no_store_error);
@@ -819,7 +815,6 @@ public class SettingsActivity extends ThemedPreferenceActivity
}
-
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
@@ -834,7 +829,7 @@ public class SettingsActivity extends ThemedPreferenceActivity
String passcode = data.getStringExtra(PassCodeActivity.KEY_PASSCODE);
if (passcode != null && passcode.length() == 4) {
SharedPreferences.Editor appPrefs = PreferenceManager
- .getDefaultSharedPreferences(getApplicationContext()).edit();
+ .getDefaultSharedPreferences(getApplicationContext()).edit();
for (int i = 1; i <= 4; ++i) {
appPrefs.putString(PassCodeActivity.PREFERENCE_PASSCODE_D + i, passcode.substring(i - 1, i));
@@ -887,8 +882,7 @@ public class SettingsActivity extends ThemedPreferenceActivity
.create();
alertDialog.show();
- themeButtonUtils.themeBorderlessButton(themeColorUtils,
- alertDialog.getButton(AlertDialog.BUTTON_POSITIVE));
+ viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE));
}
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java
index 120c91bc84..bcdf08985a 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java
@@ -23,7 +23,6 @@ package com.owncloud.android.ui.activity;
import android.app.Activity;
import android.graphics.Bitmap;
-import android.graphics.PorterDuff;
import android.os.Bundle;
import com.nextcloud.client.account.User;
@@ -79,15 +78,12 @@ public class ShareActivity extends FileActivity {
file.isGroupFolder(),
file.getMountType(),
this,
- themeColorUtils,
- themeDrawableUtils));
+ viewThemeUtils));
} else {
binding.shareFileIcon.setImageDrawable(MimeTypeUtil.getFileTypeIcon(file.getMimeType(),
file.getFileName(),
- optionalUser.get(),
this,
- themeColorUtils,
- themeDrawableUtils));
+ viewThemeUtils));
if (MimeTypeUtil.isImage(file)) {
String remoteId = String.valueOf(file.getRemoteId());
Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(remoteId);
@@ -100,8 +96,7 @@ public class ShareActivity extends FileActivity {
// Name
binding.shareFileName.setText(getResources().getString(R.string.share_file, file.getFileName()));
- binding.shareHeaderDivider.getBackground().setColorFilter(themeColorUtils.primaryAccentColor(this),
- PorterDuff.Mode.SRC_ATOP);
+ viewThemeUtils.platform.colorViewBackground(binding.shareHeaderDivider);
// Size
binding.shareFileSize.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength()));
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
index 02fcad2c12..061cbad6e7 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
@@ -66,8 +66,7 @@ import com.owncloud.android.ui.dialog.SyncedFolderPreferencesDialogFragment.OnSy
import com.owncloud.android.ui.dialog.parcel.SyncedFolderParcelable
import com.owncloud.android.utils.PermissionUtil
import com.owncloud.android.utils.SyncedFolderUtils
-import com.owncloud.android.utils.theme.ThemeButtonUtils
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils
+import com.owncloud.android.utils.theme.ViewThemeUtils
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@@ -159,10 +158,7 @@ class SyncedFoldersActivity :
lateinit var backgroundJobManager: BackgroundJobManager
@Inject
- lateinit var themeButtonUtils: ThemeButtonUtils
-
- @Inject
- lateinit var themeSnackBarUtils: ThemeSnackbarUtils
+ lateinit var viewThemeUtils: ViewThemeUtils
private lateinit var binding: SyncedFoldersLayoutBinding
private lateinit var adapter: SyncedFolderAdapter
@@ -243,7 +239,7 @@ class SyncedFoldersActivity :
.setTitle(R.string.autoupload_disable_power_save_check)
.setMessage(getString(R.string.power_save_check_dialog_message))
.show()
- themeButtonUtils.themeBorderlessButton(themeColorUtils, alertDialog.getButton(AlertDialog.BUTTON_POSITIVE))
+ viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE))
}
/**
@@ -252,10 +248,17 @@ class SyncedFoldersActivity :
private fun setupContent() {
val gridWidth = resources.getInteger(R.integer.media_grid_width)
val lightVersion = resources.getBoolean(R.bool.syncedFolder_light)
- adapter = SyncedFolderAdapter(this, clock, gridWidth, this, lightVersion, themeColorUtils, themeDrawableUtils)
+ adapter = SyncedFolderAdapter(
+ this,
+ clock,
+ gridWidth,
+ this,
+ lightVersion,
+ viewThemeUtils
+ )
syncedFolderProvider = SyncedFolderProvider(contentResolver, preferences, clock)
binding.emptyList.emptyListIcon.setImageResource(R.drawable.nav_synced_folders)
- themeButtonUtils.colorPrimaryButton(binding.emptyList.emptyListViewAction, this, themeColorUtils)
+ viewThemeUtils.material.colorMaterialButtonPrimaryFilled(binding.emptyList.emptyListViewAction)
val lm = GridLayoutManager(this, gridWidth)
adapter.setLayoutManager(lm)
val spacing = resources.getDimensionPixelSize(R.dimen.media_grid_spacing)
@@ -291,7 +294,7 @@ class SyncedFoldersActivity :
perFolderMediaItemLimit,
this@SyncedFoldersActivity,
false,
- themeSnackbarUtils
+ viewThemeUtils
)
mediaFolders.addAll(
MediaProvider.getVideoFolders(
@@ -299,7 +302,7 @@ class SyncedFoldersActivity :
perFolderMediaItemLimit,
this@SyncedFoldersActivity,
false,
- themeSnackbarUtils
+ viewThemeUtils
)
)
val syncedFolderArrayList = syncedFolderProvider.syncedFolders
@@ -548,7 +551,7 @@ class SyncedFoldersActivity :
)
onSyncFolderSettingsClick(0, emptyCustomFolder)
} else {
- PermissionUtil.requestExternalStoragePermission(this, themeSnackBarUtils, true)
+ PermissionUtil.requestExternalStoragePermission(this, viewThemeUtils, true)
}
result = super.onOptionsItemSelected(item)
}
@@ -775,7 +778,7 @@ class SyncedFoldersActivity :
load(getItemsDisplayedPerFolder(), true)
} else {
// permission denied --> request again
- PermissionUtil.requestExternalStoragePermission(this, themeSnackbarUtils, true)
+ PermissionUtil.requestExternalStoragePermission(this, viewThemeUtils, true)
}
}
else -> super.onRequestPermissionsResult(requestCode, permissions, grantResults)
@@ -802,8 +805,7 @@ class SyncedFoldersActivity :
.setIcon(R.drawable.ic_battery_alert)
if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
val alertDialog = alertDialogBuilder.show()
- themeButtonUtils.themeBorderlessButton(
- themeColorUtils,
+ viewThemeUtils.platform.colorTextButtons(
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL)
)
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt b/app/src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt
index f0dfe7811f..07e33b3e26 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt
@@ -26,6 +26,7 @@ import android.net.Uri
import android.widget.Toast
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature
+import com.nextcloud.android.common.ui.util.PlatformThemeUtil
import com.nextcloud.client.appinfo.AppInfo
import com.nextcloud.client.device.DeviceInfo
import com.owncloud.android.R
@@ -67,7 +68,7 @@ class TextEditorWebView : EditorWebView() {
WebSettingsCompat.DARK_STRATEGY_WEB_THEME_DARKENING_ONLY
)
}
- if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK) && themeUtils.isDarkModeActive(this)) {
+ if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK) && PlatformThemeUtil.isDarkMode(this)) {
WebSettingsCompat.setForceDark(getWebView().settings, WebSettingsCompat.FORCE_DARK_ON)
}
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ThemedPreferenceActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ThemedPreferenceActivity.java
deleted file mode 100644
index 2cf02cd145..0000000000
--- a/app/src/main/java/com/owncloud/android/ui/activity/ThemedPreferenceActivity.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Nextcloud Android client application
- *
- * @author Daniel Bailey
- * Copyright (C) 2019 Daniel Bailey
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this program. If not, see .
- */
-
-package com.owncloud.android.ui.activity;
-
-import android.os.Bundle;
-import android.preference.PreferenceActivity;
-
-import com.nextcloud.client.preferences.AppPreferences;
-import com.nextcloud.client.preferences.DarkMode;
-
-import javax.inject.Inject;
-
-import androidx.annotation.Nullable;
-
-public class ThemedPreferenceActivity extends PreferenceActivity {
-
- /**
- * Tracks whether the activity should be recreate()'d after a theme change
- */
- private boolean themeChangePending;
- private boolean paused;
-
- @Inject AppPreferences preferences;
-
- private AppPreferences.Listener onThemeChangedListener = new AppPreferences.Listener() {
- @Override
- public void onDarkThemeModeChanged(DarkMode mode) {
- preferences.setDarkThemeMode(mode);
-
- if (paused) {
- themeChangePending = true;
- return;
- }
- recreate();
- }
- };
-
- @Override
- protected void onPostCreate(@Nullable Bundle savedInstanceState) {
- super.onPostCreate(savedInstanceState);
- preferences.addListener(onThemeChangedListener);
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- preferences.removeListener(onThemeChangedListener);
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- paused = true;
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- paused = false;
-
- if (themeChangePending) {
- recreate();
- }
- }
-}
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java
index edb745d7ec..a6512ca79c 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java
@@ -37,6 +37,7 @@ import android.widget.RelativeLayout;
import android.widget.TextView;
import com.google.android.material.appbar.AppBarLayout;
+import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.card.MaterialCardView;
import com.google.android.material.textview.MaterialTextView;
@@ -44,12 +45,9 @@ import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
-import com.owncloud.android.utils.theme.ThemeLayoutUtils;
-import com.owncloud.android.utils.theme.ThemeToolbarUtils;
import com.owncloud.android.utils.theme.ThemeUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
@@ -58,8 +56,6 @@ import androidx.annotation.StringRes;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.AppCompatSpinner;
-import androidx.appcompat.widget.Toolbar;
-import androidx.core.content.ContextCompat;
/**
* Base class providing toolbar registration functionality, see {@link #setupToolbar(boolean, boolean)}.
@@ -71,7 +67,7 @@ public abstract class ToolbarActivity extends BaseActivity implements Injectable
private AppBarLayout mAppBar;
private RelativeLayout mDefaultToolbar;
- private Toolbar mToolbar;
+ private MaterialToolbar mToolbar;
private MaterialCardView mHomeSearchToolbar;
private ImageView mPreviewImage;
private FrameLayout mPreviewImageContainer;
@@ -81,22 +77,16 @@ public abstract class ToolbarActivity extends BaseActivity implements Injectable
private boolean isHomeSearchToolbarShow = false;
@Inject public ThemeColorUtils themeColorUtils;
- @Inject public ThemeLayoutUtils themeLayoutUtils;
- @Inject public ThemeToolbarUtils themeToolbarUtils;
@Inject public ThemeUtils themeUtils;
- @Inject public ThemeDrawableUtils themeDrawableUtils;
- @Inject public ThemeButtonUtils themeButtonUtils;
+ @Inject public ViewThemeUtils viewThemeUtils;
/**
* Toolbar setup that must be called in implementer's {@link #onCreate} after {@link #setContentView} if they want
* to use the toolbar.
*/
private void setupToolbar(boolean isHomeSearchToolbarShow, boolean showSortListButtonGroup) {
- int fontColor = themeColorUtils.appBarPrimaryFontColor(this);
-
mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
- themeToolbarUtils.colorStatusBar(this);
mAppBar = findViewById(R.id.appbar);
mDefaultToolbar = findViewById(R.id.default_toolbar);
@@ -120,13 +110,10 @@ public abstract class ToolbarActivity extends BaseActivity implements Injectable
mToolbarSpinner = findViewById(R.id.toolbar_spinner);
- if (mToolbar.getOverflowIcon() != null) {
- themeDrawableUtils.tintDrawable(mToolbar.getOverflowIcon(), fontColor);
- }
-
- if (mToolbar.getNavigationIcon() != null) {
- themeDrawableUtils.tintDrawable(mToolbar.getNavigationIcon(), fontColor);
- }
+ viewThemeUtils.material.themeToolbar(mToolbar);
+ viewThemeUtils.material.colorToolbarOverflowIcon(mToolbar);
+ viewThemeUtils.platform.themeStatusBar(this);
+ viewThemeUtils.material.colorMaterialTextButton(mSwitchAccountButton);
}
public void setupToolbar() {
@@ -171,18 +158,21 @@ public abstract class ToolbarActivity extends BaseActivity implements Injectable
@SuppressLint("PrivateResource")
private void showHomeSearchToolbar(boolean isShow) {
+ viewThemeUtils.material.themeToolbar(mToolbar);
if (isShow) {
+ viewThemeUtils.platform.resetStatusBar(this);
mAppBar.setStateListAnimator(AnimatorInflater.loadStateListAnimator(mAppBar.getContext(),
R.animator.appbar_elevation_off));
mDefaultToolbar.setVisibility(View.GONE);
mHomeSearchToolbar.setVisibility(View.VISIBLE);
- themeToolbarUtils.colorStatusBar(this, ContextCompat.getColor(this, R.color.bg_default));
+ viewThemeUtils.material.themeCardView(mHomeSearchToolbar);
+ viewThemeUtils.material.themeSearchBarText(mSearchText);
} else {
mAppBar.setStateListAnimator(AnimatorInflater.loadStateListAnimator(mAppBar.getContext(),
R.animator.appbar_elevation_on));
+ viewThemeUtils.platform.themeStatusBar(this);
mDefaultToolbar.setVisibility(View.VISIBLE);
mHomeSearchToolbar.setVisibility(View.GONE);
- themeToolbarUtils.colorStatusBar(this);
}
}
@@ -198,10 +188,10 @@ public abstract class ToolbarActivity extends BaseActivity implements Injectable
// set & color the chosen title
ActionBar actionBar = getSupportActionBar();
- themeToolbarUtils.setColoredTitle(actionBar, titleToSet, this);
// set home button properties
if (actionBar != null) {
+ actionBar.setTitle(titleToSet);
actionBar.setDisplayShowTitleEnabled(true);
}
}
@@ -209,10 +199,12 @@ public abstract class ToolbarActivity extends BaseActivity implements Injectable
/**
* checks if the given file is the root folder.
*
+ *
* @param file file to be checked if it is the root folder
* @return true
if it is null
or the root folder, else returns false
*/
public boolean isRoot(OCFile file) {
+
return file == null || (file.isFolder() && file.getParentId() == FileDataStorageManager.ROOT_PARENT_ID);
}
@@ -291,7 +283,10 @@ public abstract class ToolbarActivity extends BaseActivity implements Injectable
public void updateToolbarSubtitle(@NonNull String subtitle) {
ActionBar actionBar = getSupportActionBar();
- themeToolbarUtils.setColoredSubtitle(actionBar, subtitle, this);
+ if (actionBar != null) {
+ actionBar.setSubtitle(subtitle);
+ viewThemeUtils.androidx.themeActionBarSubtitle(this, actionBar);
+ }
}
public void clearToolbarSubtitle() {
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java
index 2f6eadb712..4d7dd31c6b 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java
@@ -41,6 +41,7 @@ import com.nextcloud.client.account.User;
import com.nextcloud.client.di.Injectable;
import com.nextcloud.client.preferences.AppPreferences;
import com.owncloud.android.R;
+import com.owncloud.android.databinding.UploadFilesLayoutBinding;
import com.owncloud.android.files.services.FileUploader;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.ui.adapter.StoragePathAdapter;
@@ -55,7 +56,6 @@ import com.owncloud.android.ui.fragment.LocalFileListFragment;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.FileSortOrder;
import com.owncloud.android.utils.PermissionUtil;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
import java.io.File;
import java.util.ArrayList;
@@ -98,7 +98,6 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
private static final String WAIT_DIALOG_TAG = "WAIT";
@Inject AppPreferences preferences;
- @Inject ThemeSnackbarUtils themeSnackbarUtils;
private Account mAccountOnCreation;
private ArrayAdapter mDirectories;
private boolean mLocalFolderPickerMode;
@@ -110,8 +109,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
private LocalStoragePathPickerDialogFragment dialog;
private Menu mOptionsMenu;
private SearchView mSearchView;
- private Spinner mBehaviourSpinner;
- private MaterialButton uploadButton;
+ private UploadFilesLayoutBinding binding;
@VisibleForTesting
@@ -174,30 +172,27 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
fillDirectoryDropdown();
// Inflate and set the layout view
- setContentView(R.layout.upload_files_layout);
+ binding = UploadFilesLayoutBinding.inflate(getLayoutInflater());
+ setContentView(binding.getRoot());
if (mLocalFolderPickerMode) {
- findViewById(R.id.upload_options).setVisibility(View.GONE);
- ((MaterialButton) findViewById(R.id.upload_files_btn_upload)).setText(R.string.uploader_btn_alternative_text);
+ binding.uploadOptions.setVisibility(View.GONE);
+ binding.uploadFilesBtnUpload.setText(R.string.uploader_btn_alternative_text);
}
mFileListFragment = (LocalFileListFragment) getSupportFragmentManager().findFragmentByTag("local_files_list");
// Set input controllers
- MaterialButton cancelButton = findViewById(R.id.upload_files_btn_cancel);
- cancelButton.setTextColor(themeColorUtils.primaryColor(this, true));
- cancelButton.setOnClickListener(this);
+ viewThemeUtils.material.colorMaterialButtonPrimaryOutlined(binding.uploadFilesBtnCancel);
+ binding.uploadFilesBtnCancel.setOnClickListener(this);
- uploadButton = findViewById(R.id.upload_files_btn_upload);
- themeButtonUtils.colorPrimaryButton(uploadButton, this, themeColorUtils);
- uploadButton.setOnClickListener(this);
- uploadButton.setEnabled(mLocalFolderPickerMode);
+ viewThemeUtils.material.colorMaterialButtonPrimaryFilled(binding.uploadFilesBtnUpload);
+ binding.uploadFilesBtnUpload.setOnClickListener(this);
+ binding.uploadFilesBtnUpload.setEnabled(mLocalFolderPickerMode);
int localBehaviour = preferences.getUploaderBehaviour();
// file upload spinner
- mBehaviourSpinner = findViewById(R.id.upload_files_spinner_behaviour);
-
List behaviours = new ArrayList<>();
behaviours.add(getString(R.string.uploader_upload_files_behaviour_move_to_nextcloud_folder,
themeUtils.getDefaultDisplayNameForRootFolder(this)));
@@ -207,13 +202,13 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
ArrayAdapter behaviourAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item,
behaviours);
behaviourAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- mBehaviourSpinner.setAdapter(behaviourAdapter);
- mBehaviourSpinner.setSelection(localBehaviour);
+ binding.uploadFilesSpinnerBehaviour.setAdapter(behaviourAdapter);
+ binding.uploadFilesSpinnerBehaviour.setSelection(localBehaviour);
// setup the toolbar
setupToolbar();
- findViewById(R.id.sort_list_button_group).setVisibility(View.VISIBLE);
- findViewById(R.id.switch_grid_view_button).setVisibility(View.GONE);
+ binding.uploadFilesToolbar.sortListButtonGroup.setVisibility(View.VISIBLE);
+ binding.uploadFilesToolbar.switchGridViewButton.setVisibility(View.GONE);
// Action bar setup
ActionBar actionBar = getSupportActionBar();
@@ -223,7 +218,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
actionBar.setDisplayHomeAsUpEnabled(mCurrentDir != null);
actionBar.setDisplayShowTitleEnabled(false);
- themeToolbarUtils.tintBackButton(actionBar, this);
+ viewThemeUtils.files.themeActionBar(this, actionBar);
}
showToolbarSpinner();
@@ -261,7 +256,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
}
private void requestPermissions() {
- PermissionUtil.requestExternalStoragePermission(this, themeSnackbarUtils, true);
+ PermissionUtil.requestExternalStoragePermission(this, viewThemeUtils, true);
}
public void showToolbarSpinner() {
@@ -294,11 +289,10 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
setSelectAllMenuItem(selectAll, mSelectAll);
}
- int fontColor = themeColorUtils.appBarPrimaryFontColor(this);
final MenuItem item = menu.findItem(R.id.action_search);
mSearchView = (SearchView) MenuItemCompat.getActionView(item);
- themeToolbarUtils.themeSearchView(mSearchView, this);
- themeDrawableUtils.tintDrawable(menu.findItem(R.id.action_choose_storage_path).getIcon(), fontColor);
+ viewThemeUtils.androidx.themeToolbarSearchView(mSearchView);
+ viewThemeUtils.platform.tintTextDrawable(this, menu.findItem(R.id.action_choose_storage_path).getIcon());
mSearchView.setOnSearchClickListener(v -> mToolbarSpinner.setVisibility(View.GONE));
@@ -456,7 +450,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
private void updateUploadButtonActive() {
final boolean anySelected = mFileListFragment.getCheckedFilesCount() > 0;
- uploadButton.setEnabled(anySelected || mLocalFolderPickerMode);
+ binding.uploadFilesBtnUpload.setEnabled(anySelected || mLocalFolderPickerMode);
}
private void setSelectAllMenuItem(MenuItem selectAll, boolean checked) {
@@ -466,7 +460,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
selectAll.setIcon(R.drawable.ic_select_none);
} else {
selectAll.setIcon(
- themeDrawableUtils.tintDrawable(R.drawable.ic_select_all, themeColorUtils.primaryColor(this)));
+ viewThemeUtils.platform.tintPrimaryDrawable(this, R.drawable.ic_select_all));
}
updateUploadButtonActive();
}
@@ -508,7 +502,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
data.putExtra(LOCAL_BASE_PATH, mCurrentDir.getAbsolutePath());
// set result code
- switch (mBehaviourSpinner.getSelectedItemPosition()) {
+ switch (binding.uploadFilesSpinnerBehaviour.getSelectedItemPosition()) {
case 0: // move to nextcloud folder
setResult(RESULT_OK_AND_MOVE, data);
break;
@@ -527,7 +521,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
}
// store behaviour
- preferences.setUploaderBehaviour(mBehaviourSpinner.getSelectedItemPosition());
+ preferences.setUploaderBehaviour(binding.uploadFilesSpinnerBehaviour.getSelectedItemPosition());
}
finish();
@@ -576,16 +570,16 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
private void checkWritableFolder(File folder) {
boolean canWriteIntoFolder = folder.canWrite();
- mBehaviourSpinner.setEnabled(canWriteIntoFolder);
+ binding.uploadFilesSpinnerBehaviour.setEnabled(canWriteIntoFolder);
TextView textView = findViewById(R.id.upload_files_upload_files_behaviour_text);
if (canWriteIntoFolder) {
textView.setText(getString(R.string.uploader_upload_files_behaviour));
int localBehaviour = preferences.getUploaderBehaviour();
- mBehaviourSpinner.setSelection(localBehaviour);
+ binding.uploadFilesSpinnerBehaviour.setSelection(localBehaviour);
} else {
- mBehaviourSpinner.setSelection(1);
+ binding.uploadFilesSpinnerBehaviour.setSelection(1);
textView.setText(new StringBuilder().append(getString(R.string.uploader_upload_files_behaviour))
.append(' ')
.append(getString(R.string.uploader_upload_files_behaviour_not_writable))
@@ -647,7 +641,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
finish();
} else {
new CheckAvailableSpaceTask(this, mFileListFragment.getCheckedFilePaths())
- .execute(mBehaviourSpinner.getSelectedItemPosition() == 0);
+ .execute(binding.uploadFilesSpinnerBehaviour.getSelectedItemPosition() == 0);
}
} else {
requestPermissions();
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java
index e9c4827c35..7ef10d7fa9 100755
--- a/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java
@@ -56,6 +56,7 @@ import com.owncloud.android.operations.CheckCurrentCredentialsOperation;
import com.owncloud.android.ui.adapter.UploadListAdapter;
import com.owncloud.android.ui.decoration.MediaGridItemDecoration;
import com.owncloud.android.utils.FilesSyncHelper;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
@@ -99,6 +100,9 @@ public class UploadListActivity extends FileActivity {
@Inject
LocalBroadcastManager localBroadcastManager;
+ @Inject
+ ViewThemeUtils viewThemeUtils;
+
private UploadListLayoutBinding binding;
public static Intent createIntent(OCFile file, User user, Integer flag, Context context) {
@@ -155,9 +159,7 @@ public class UploadListActivity extends FileActivity {
connectivityService,
powerManagementService,
clock,
- themeColorUtils,
- themeDrawableUtils,
- themeBarUtils);
+ viewThemeUtils);
final GridLayoutManager lm = new GridLayoutManager(this, 1);
uploadListAdapter.setLayoutManager(lm);
@@ -167,7 +169,7 @@ public class UploadListActivity extends FileActivity {
binding.list.setLayoutManager(lm);
binding.list.setAdapter(uploadListAdapter);
- themeLayoutUtils.colorSwipeRefreshLayout(this, swipeListRefreshLayout);
+ viewThemeUtils.androidx.themeSwipeRefreshLayout(swipeListRefreshLayout);
swipeListRefreshLayout.setOnRefreshListener(this::refresh);
loadItems();
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java
index 14692a72dd..760a843d30 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java
@@ -27,7 +27,6 @@
package com.owncloud.android.ui.activity;
-import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Bundle;
@@ -61,6 +60,7 @@ import com.owncloud.android.ui.dialog.AccountRemovalConfirmationDialog;
import com.owncloud.android.ui.events.TokenPushEvent;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.PushUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
@@ -70,13 +70,11 @@ import java.util.List;
import javax.inject.Inject;
-import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.appcompat.app.ActionBar;
import androidx.core.content.res.ResourcesCompat;
-import androidx.core.graphics.drawable.DrawableCompat;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.Lifecycle;
import androidx.recyclerview.widget.RecyclerView;
@@ -134,11 +132,10 @@ public class UserInfoActivity extends DrawerActivity implements Injectable {
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
- themeToolbarUtils.tintBackButton(actionBar, this);
+ viewThemeUtils.files.themeActionBar(this, actionBar);
}
- binding.userinfoList.setAdapter(
- new UserInfoAdapter(null, themeColorUtils.primaryColor(getAccount(), true, this)));
+ binding.userinfoList.setAdapter(new UserInfoAdapter(null, viewThemeUtils));
if (userInfo != null) {
populateUserInfoUi(userInfo);
@@ -207,21 +204,23 @@ public class UserInfoActivity extends DrawerActivity implements Injectable {
if (backgroundImageView != null) {
String background = getStorageManager().getCapability(user.getAccountName()).getServerBackground();
- int primaryColor = themeColorUtils.primaryColor(getAccount(), false, this);
if (URLUtil.isValidUrl(background)) {
// background image
SimpleTarget target = new SimpleTarget() {
@Override
public void onResourceReady(Drawable resource, GlideAnimation glideAnimation) {
- Drawable[] drawables = {new ColorDrawable(primaryColor), resource};
+ Drawable[] drawables = {
+ viewThemeUtils.platform.getPrimaryColorDrawable(backgroundImageView.getContext()),
+ resource};
LayerDrawable layerDrawable = new LayerDrawable(drawables);
backgroundImageView.setImageDrawable(layerDrawable);
}
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable) {
- Drawable[] drawables = {new ColorDrawable(primaryColor),
+ Drawable[] drawables = {
+ viewThemeUtils.platform.getPrimaryColorDrawable(backgroundImageView.getContext()),
ResourcesCompat.getDrawable(getResources(),
R.drawable.background,
null)};
@@ -239,7 +238,8 @@ public class UserInfoActivity extends DrawerActivity implements Injectable {
.into(target);
} else {
// plain color
- backgroundImageView.setImageDrawable(new ColorDrawable(primaryColor));
+ backgroundImageView.setImageDrawable(
+ viewThemeUtils.platform.getPrimaryColorDrawable(backgroundImageView.getContext()));
}
}
}
@@ -255,8 +255,6 @@ public class UserInfoActivity extends DrawerActivity implements Injectable {
binding.userinfoIcon,
this);
- int tint = themeColorUtils.primaryColor(user.toPlatformAccount(), true, this);
-
if (!TextUtils.isEmpty(userInfo.getDisplayName())) {
binding.userinfoFullName.setText(userInfo.getDisplayName());
}
@@ -275,7 +273,7 @@ public class UserInfoActivity extends DrawerActivity implements Injectable {
binding.emptyList.emptyListView.setVisibility(View.GONE);
if (binding.userinfoList.getAdapter() instanceof UserInfoAdapter) {
- binding.userinfoList.setAdapter(new UserInfoAdapter(createUserInfoDetails(userInfo), tint));
+ binding.userinfoList.setAdapter(new UserInfoAdapter(createUserInfoDetails(userInfo), viewThemeUtils));
}
binding.loadingContent.setVisibility(View.GONE);
@@ -373,7 +371,7 @@ public class UserInfoActivity extends DrawerActivity implements Injectable {
protected static class UserInfoAdapter extends RecyclerView.Adapter {
protected List mDisplayList;
- @ColorInt protected int mTintColor;
+ protected ViewThemeUtils viewThemeUtils;
public static class ViewHolder extends RecyclerView.ViewHolder {
protected UserInfoDetailsTableItemBinding binding;
@@ -384,9 +382,9 @@ public class UserInfoActivity extends DrawerActivity implements Injectable {
}
}
- public UserInfoAdapter(List displayList, @ColorInt int tintColor) {
+ public UserInfoAdapter(List displayList, ViewThemeUtils viewThemeUtils) {
mDisplayList = displayList == null ? new LinkedList<>() : displayList;
- mTintColor = tintColor;
+ this.viewThemeUtils = viewThemeUtils;
}
public void setData(List displayList) {
@@ -411,7 +409,7 @@ public class UserInfoActivity extends DrawerActivity implements Injectable {
holder.binding.icon.setImageResource(item.icon);
holder.binding.text.setText(item.text);
holder.binding.icon.setContentDescription(item.iconContentDescription);
- DrawableCompat.setTint(holder.binding.icon.getDrawable(), mTintColor);
+ viewThemeUtils.platform.colorImageView(holder.binding.icon);
}
@Override
diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/ActivityAndVersionListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/ActivityAndVersionListAdapter.java
index 880a7f8737..96aa6aea5e 100644
--- a/app/src/main/java/com/owncloud/android/ui/adapter/ActivityAndVersionListAdapter.java
+++ b/app/src/main/java/com/owncloud/android/ui/adapter/ActivityAndVersionListAdapter.java
@@ -40,8 +40,7 @@ import com.owncloud.android.lib.resources.files.model.FileVersion;
import com.owncloud.android.ui.interfaces.ActivityListInterface;
import com.owncloud.android.ui.interfaces.VersionListInterface;
import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.Collections;
import java.util.Date;
@@ -61,16 +60,14 @@ public class ActivityAndVersionListAdapter extends ActivityListAdapter {
ActivityListInterface activityListInterface,
VersionListInterface.View versionListInterface,
ClientFactory clientFactory,
- ThemeColorUtils themeColorUtils,
- ThemeDrawableUtils themeDrawableUtils
+ ViewThemeUtils viewThemeUtils
) {
super(context,
currentAccountProvider,
activityListInterface,
clientFactory,
true,
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
this.versionListInterface = versionListInterface;
}
diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java
index f70f901396..c73bd7a578 100644
--- a/app/src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java
+++ b/app/src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java
@@ -72,8 +72,7 @@ import com.owncloud.android.utils.MimeTypeUtil;
import com.owncloud.android.utils.glide.CustomGlideStreamLoader;
import com.owncloud.android.utils.svg.SvgBitmapTranscoder;
import com.owncloud.android.utils.svg.SvgDecoder;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.io.InputStream;
import java.util.ArrayList;
@@ -100,8 +99,7 @@ public class ActivityListAdapter extends RecyclerView.Adapter values;
private boolean isDetailView;
- private ThemeColorUtils themeColorUtils;
- private ThemeDrawableUtils themeDrawableUtils;
+ private ViewThemeUtils viewThemeUtils;
public ActivityListAdapter(
Context context,
@@ -109,8 +107,7 @@ public class ActivityListAdapter extends RecyclerView.Adapter();
this.context = context;
this.currentAccountProvider = currentAccountProvider;
@@ -118,8 +115,7 @@ public class ActivityListAdapter extends RecyclerView.Adapter activityItems, NextcloudClient client, boolean clear) {
@@ -287,14 +283,12 @@ public class ActivityListAdapter extends RecyclerView.Adapter(), CommonOCFileListAdapterInterface, PopupTextProvider {
var files: List = mutableListOf()
private val ocFileListDelegate: OCFileListDelegate
@@ -83,8 +81,7 @@ class GalleryAdapter(
transferServiceGetter,
showMetadata = false,
showShareAvatar = false,
- themeColorUtils,
- themeDrawableUtils
+ viewThemeUtils
)
}
diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.java b/app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.java
index 07c24e3a09..4c03f82e3d 100644
--- a/app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.java
+++ b/app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.java
@@ -35,8 +35,7 @@ import com.owncloud.android.databinding.FileDetailsShareLinkShareItemBinding;
import com.owncloud.android.lib.resources.shares.OCShare;
import com.owncloud.android.lib.resources.shares.ShareType;
import com.owncloud.android.ui.fragment.util.SharingMenuHelper;
-import com.owncloud.android.utils.theme.ThemeAvatarUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
@@ -45,8 +44,7 @@ import androidx.recyclerview.widget.RecyclerView;
class LinkShareViewHolder extends RecyclerView.ViewHolder {
private FileDetailsShareLinkShareItemBinding binding;
private Context context;
- private ThemeColorUtils themeColorUtils;
- private ThemeAvatarUtils themeAvatarUtils;
+ private ViewThemeUtils viewThemeUtils;
public LinkShareViewHolder(@NonNull View itemView) {
super(itemView);
@@ -54,13 +52,11 @@ class LinkShareViewHolder extends RecyclerView.ViewHolder {
public LinkShareViewHolder(FileDetailsShareLinkShareItemBinding binding,
Context context,
- ThemeColorUtils themeColorUtils,
- ThemeAvatarUtils themeAvatarUtils) {
+ final ViewThemeUtils viewThemeUtils) {
this(binding.getRoot());
this.binding = binding;
this.context = context;
- this.themeColorUtils = themeColorUtils;
- this.themeAvatarUtils = themeAvatarUtils;
+ this.viewThemeUtils = viewThemeUtils;
}
public void bind(OCShare publicShare, ShareeListAdapterListener listener) {
@@ -83,7 +79,7 @@ class LinkShareViewHolder extends RecyclerView.ViewHolder {
binding.name.setText(R.string.share_link);
}
- themeAvatarUtils.colorIconImageViewWithBackground(binding.icon, context, themeColorUtils);
+ viewThemeUtils.platform.colorImageViewBackgroundAndIcon(binding.icon);
}
String permissionName = SharingMenuHelper.getPermissionName(context, publicShare);
@@ -98,6 +94,7 @@ class LinkShareViewHolder extends RecyclerView.ViewHolder {
if (!TextUtils.isEmpty(permissionName)) {
binding.permissionName.setText(permissionName);
binding.permissionName.setVisibility(View.VISIBLE);
+ viewThemeUtils.androidx.colorPrimaryTextViewElement(binding.permissionName);
} else {
binding.permissionName.setVisibility(View.GONE);
}
diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java
index f716dd4e64..0f3d047cd8 100644
--- a/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java
+++ b/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java
@@ -40,8 +40,7 @@ import com.owncloud.android.ui.interfaces.LocalFileListFragmentInterface;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.FileSortOrder;
import com.owncloud.android.utils.MimeTypeUtil;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.io.File;
import java.util.ArrayList;
@@ -73,8 +72,7 @@ public class LocalFileListAdapter extends RecyclerView.Adapter checkedFiles;
- private ThemeColorUtils themeColorUtils;
- private ThemeDrawableUtils themeDrawableUtils;
+ private ViewThemeUtils viewThemeUtils;
private static final int VIEWTYPE_ITEM = 0;
private static final int VIEWTYPE_FOOTER = 1;
@@ -85,15 +83,13 @@ public class LocalFileListAdapter extends RecyclerView.Adapter();
- this.themeColorUtils = themeColorUtils;
- this.themeDrawableUtils = themeDrawableUtils;
+ this.viewThemeUtils = viewThemeUtils;
swapDirectory(directory);
}
@@ -181,9 +177,9 @@ public class LocalFileListAdapter extends RecyclerView.Adapter localFileListFragmentInterface
.onItemClicked(finalFile));
@@ -231,12 +227,9 @@ public class LocalFileListAdapter extends RecyclerView.Adapter notificationsList;
private final OwnCloudClient client;
private final NotificationsActivity notificationsActivity;
- private final ThemeColorUtils themeColorUtils;
- private final ThemeButtonUtils themeButtonUtils;
+ private final ViewThemeUtils viewThemeUtils;
public NotificationListAdapter(OwnCloudClient client,
NotificationsActivity notificationsActivity,
- ThemeColorUtils themeColorUtils,
- ThemeButtonUtils themeButtonUtils) {
+ ViewThemeUtils viewThemeUtils) {
this.notificationsList = new ArrayList<>();
this.client = client;
this.notificationsActivity = notificationsActivity;
- this.themeColorUtils = themeColorUtils;
- this.themeButtonUtils = themeButtonUtils;
+ this.viewThemeUtils = viewThemeUtils;
foregroundColorSpanBlack = new ForegroundColorSpan(
notificationsActivity.getResources().getColor(R.color.text_color));
}
@@ -153,7 +149,7 @@ public class NotificationListAdapter extends RecyclerView.Adapter overflowActions = new ArrayList<>();
-
+
if (notification.getActions().size() > 2) {
- for (Action action: notification.getActions()) {
+ for (Action action : notification.getActions()) {
if (action.primary) {
- button = new MaterialButton(notificationsActivity);
+ final MaterialButton button = new MaterialButton(notificationsActivity);
button.setAllCaps(false);
button.setText(action.label);
@@ -216,29 +208,27 @@ public class NotificationListAdapter extends RecyclerView.Adapter {
- PopupMenu popup = new PopupMenu(notificationsActivity, finalButton);
+ moreButton.setOnClickListener(v -> {
+ PopupMenu popup = new PopupMenu(notificationsActivity, moreButton);
for (Action action : overflowActions) {
popup.getMenu().add(action.label).setOnMenuItemClickListener(item -> {
@@ -256,24 +246,23 @@ public class NotificationListAdapter extends RecyclerView.Adapter ocFileListFragmentInterface.onHeaderClicked());
} else {
ListGridImageViewHolder gridViewHolder = (ListGridImageViewHolder) holder;
@@ -416,7 +404,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter ocFileListFragmentInterface.onShareIconClick(file));
} else {
diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt
index b15bfd251c..d783741ac1 100644
--- a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt
+++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt
@@ -34,8 +34,7 @@ import com.owncloud.android.ui.activity.ComponentsGetter
import com.owncloud.android.ui.fragment.SearchType
import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface
import com.owncloud.android.utils.DisplayUtils
-import com.owncloud.android.utils.theme.ThemeColorUtils
-import com.owncloud.android.utils.theme.ThemeDrawableUtils
+import com.owncloud.android.utils.theme.ViewThemeUtils
@Suppress("LongParameterList", "TooManyFunctions")
class OCFileListDelegate(
@@ -49,8 +48,7 @@ class OCFileListDelegate(
private val transferServiceGetter: ComponentsGetter,
private val showMetadata: Boolean,
private var showShareAvatar: Boolean,
- private var themeColorUtils: ThemeColorUtils,
- private var themeDrawableUtils: ThemeDrawableUtils
+ private var viewThemeUtils: ViewThemeUtils
) {
private val checkedFiles: MutableSet = HashSet()
private var highlightedItem: OCFile? = null
@@ -106,8 +104,7 @@ class OCFileListDelegate(
context,
gridViewHolder.shimmerThumbnail,
preferences,
- themeColorUtils,
- themeDrawableUtils
+ viewThemeUtils
)
// item layout + click listeners
bindGridItemLayout(file, gridViewHolder)
@@ -162,10 +159,7 @@ class OCFileListDelegate(
.getColor(R.color.selected_item_background)
)
gridViewHolder.checkbox.setImageDrawable(
- themeDrawableUtils.tintDrawable(
- R.drawable.ic_checkbox_marked,
- themeColorUtils.primaryColor(context)
- )
+ viewThemeUtils.platform.tintPrimaryDrawable(context, R.drawable.ic_checkbox_marked)
)
} else {
gridViewHolder.itemLayout.setBackgroundColor(context.resources.getColor(R.color.bg_default))
diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/QuickSharingPermissionsAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/QuickSharingPermissionsAdapter.kt
index 36e54ee8ae..ea19b15476 100644
--- a/app/src/main/java/com/owncloud/android/ui/adapter/QuickSharingPermissionsAdapter.kt
+++ b/app/src/main/java/com/owncloud/android/ui/adapter/QuickSharingPermissionsAdapter.kt
@@ -27,15 +27,17 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.owncloud.android.databinding.ItemQuickSharePermissionsBinding
import com.owncloud.android.datamodel.QuickPermissionModel
+import com.owncloud.android.utils.theme.ViewThemeUtils
class QuickSharingPermissionsAdapter(
private val quickPermissionList: MutableList,
- private val onPermissionChangeListener: QuickSharingPermissionViewHolder.OnPermissionChangeListener
+ private val onPermissionChangeListener: QuickSharingPermissionViewHolder.OnPermissionChangeListener,
+ private val viewThemeUtils: ViewThemeUtils
) :
RecyclerView.Adapter() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val binding = ItemQuickSharePermissionsBinding.inflate(LayoutInflater.from(parent.context), parent, false)
- return QuickSharingPermissionViewHolder(binding, binding.root, onPermissionChangeListener)
+ return QuickSharingPermissionViewHolder(binding, binding.root, onPermissionChangeListener, viewThemeUtils)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
@@ -51,7 +53,8 @@ class QuickSharingPermissionsAdapter(
class QuickSharingPermissionViewHolder(
val binding: ItemQuickSharePermissionsBinding,
itemView: View,
- val onPermissionChangeListener: OnPermissionChangeListener
+ val onPermissionChangeListener: OnPermissionChangeListener,
+ private val viewThemeUtils: ViewThemeUtils
) :
RecyclerView
.ViewHolder(itemView) {
@@ -59,6 +62,7 @@ class QuickSharingPermissionsAdapter(
fun bindData(quickPermissionModel: QuickPermissionModel) {
binding.tvQuickShareName.text = quickPermissionModel.permissionName
if (quickPermissionModel.isSelected) {
+ viewThemeUtils.platform.colorImageView(binding.tvQuickShareCheckIcon)
binding.tvQuickShareCheckIcon.visibility = View.VISIBLE
} else {
binding.tvQuickShareCheckIcon.visibility = View.INVISIBLE
diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/RichDocumentsTemplateAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/RichDocumentsTemplateAdapter.java
index 82413ca364..79dbf908b4 100644
--- a/app/src/main/java/com/owncloud/android/ui/adapter/RichDocumentsTemplateAdapter.java
+++ b/app/src/main/java/com/owncloud/android/ui/adapter/RichDocumentsTemplateAdapter.java
@@ -36,7 +36,7 @@ import com.owncloud.android.datamodel.Template;
import com.owncloud.android.ui.dialog.ChooseRichDocumentsTemplateDialogFragment;
import com.owncloud.android.utils.NextcloudServer;
import com.owncloud.android.utils.glide.CustomGlideStreamLoader;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.ArrayList;
import java.util.List;
@@ -56,8 +56,7 @@ public class RichDocumentsTemplateAdapter extends RecyclerView.Adapter shares,
ShareeListAdapterListener listener,
String userId,
User user,
- ThemeColorUtils themeColorUtils,
- ThemeAvatarUtils themeAvatarUtils) {
+ final ViewThemeUtils viewThemeUtils) {
this.fileActivity = fileActivity;
this.shares = shares;
this.listener = listener;
this.userId = userId;
this.user = user;
- this.themeColorUtils = themeColorUtils;
- this.themeAvatarUtils = themeAvatarUtils;
+ this.viewThemeUtils = viewThemeUtils;
avatarRadiusDimension = fileActivity.getResources().getDimension(R.dimen.user_icon_radius);
@@ -101,8 +97,7 @@ public class ShareeListAdapter extends RecyclerView.Adapter();
this.light = light;
this.hideItems = true;
- this.themeColorUtils = themeColorUtils;
- this.themeDrawableUtils = themeDrawableUtils;
+ this.viewThemeUtils = viewThemeUtils;
this.thumbnailThreadPool = Executors.newCachedThreadPool();
shouldShowHeadersForEmptySections(true);
@@ -348,8 +344,7 @@ public class SyncedFolderAdapter extends SectionedRecyclerViewAdapter(templateList.getTemplates().values()).get(position), themeColorUtils, themeDrawableUtils);
+ holder.setData(new ArrayList<>(templateList.getTemplates().values()).get(position));
}
public void setTemplateList(TemplateList templateList) {
@@ -125,6 +116,7 @@ public class TemplateAdapter extends RecyclerView.Adapter asyncTasks = new ArrayList<>();
- private final ThemeColorUtils themeColorUtils;
- private final ThemeDrawableUtils themeDrawableUtils;
+ private final ViewThemeUtils viewThemeUtils;
public TrashbinListAdapter(
TrashbinActivityInterface trashbinActivityInterface,
@@ -79,8 +77,7 @@ public class TrashbinListAdapter extends RecyclerView.Adapter();
this.trashbinActivityInterface = trashbinActivityInterface;
@@ -88,8 +85,7 @@ public class TrashbinListAdapter extends RecyclerView.Adapter trashbinFiles, boolean clear) {
@@ -226,8 +222,7 @@ public class TrashbinListAdapter extends RecyclerView.Adapter
ResourcesCompat.getDrawable(context.resources, R.drawable.ic_deck, null)
else ->
- MimeTypeUtil.getFileTypeIcon(mimetype, entry.title, context, themeColorUtils, themeDrawableUtils)
+ MimeTypeUtil.getFileTypeIcon(mimetype, entry.title, context, viewThemeUtils)
}
}
- val color = themeColorUtils.primaryColor(context)
- drawable!!.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP)
- return drawable
+ return viewThemeUtils.platform.tintPrimaryDrawable(context, drawable)!!
}
private inner class RoundIfNeededListener(private val entry: SearchResultEntry) :
diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapter.kt
index 5f1d557144..bc5651f49a 100644
--- a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapter.kt
+++ b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapter.kt
@@ -40,8 +40,7 @@ import com.owncloud.android.datamodel.FileDataStorageManager
import com.owncloud.android.datamodel.ThumbnailsCacheManager.InitDiskCacheTask
import com.owncloud.android.ui.interfaces.UnifiedSearchListInterface
import com.owncloud.android.ui.unifiedsearch.UnifiedSearchSection
-import com.owncloud.android.utils.theme.ThemeColorUtils
-import com.owncloud.android.utils.theme.ThemeDrawableUtils
+import com.owncloud.android.utils.theme.ViewThemeUtils
/**
* This Adapter populates a SectionedRecyclerView with search results by unified search
@@ -53,8 +52,7 @@ class UnifiedSearchListAdapter(
private val user: User,
private val clientFactory: ClientFactory,
private val context: Context,
- private val themeColorUtils: ThemeColorUtils,
- private val themeDrawableUtils: ThemeDrawableUtils
+ private val viewThemeUtils: ViewThemeUtils
) : SectionedRecyclerViewAdapter() {
companion object {
private const val VIEW_TYPE_EMPTY = Int.MAX_VALUE
@@ -71,7 +69,7 @@ class UnifiedSearchListAdapter(
parent,
false
)
- UnifiedSearchHeaderViewHolder(binding, themeColorUtils, context)
+ UnifiedSearchHeaderViewHolder(binding, viewThemeUtils, context)
}
VIEW_TYPE_FOOTER -> {
val binding = UnifiedSearchFooterBinding.inflate(
@@ -94,8 +92,7 @@ class UnifiedSearchListAdapter(
storageManager,
listInterface,
context,
- themeColorUtils,
- themeDrawableUtils
+ viewThemeUtils
)
}
VIEW_TYPE_EMPTY -> {
diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java
index 2c76229bd8..d2702f4b3b 100755
--- a/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java
+++ b/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java
@@ -24,7 +24,6 @@
package com.owncloud.android.ui.adapter;
-import android.accounts.Account;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
@@ -65,9 +64,7 @@ import com.owncloud.android.ui.activity.ConflictsResolveActivity;
import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.MimeTypeUtil;
-import com.owncloud.android.utils.theme.ThemeBarUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.io.File;
import java.util.Arrays;
@@ -90,9 +87,7 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter toggleSectionExpanded(section));
@@ -172,9 +167,7 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter> data,
@@ -61,15 +59,13 @@ public class UploaderAdapter extends SimpleAdapter {
int[] to,
FileDataStorageManager storageManager,
User user,
- ThemeColorUtils themeColorUtils,
- ThemeDrawableUtils themeDrawableUtils) {
+ ViewThemeUtils viewThemeUtils) {
super(context, data, resource, from, to);
this.user = user;
mStorageManager = storageManager;
mContext = context;
inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- this.themeColorUtils = themeColorUtils;
- this.themeDrawableUtils = themeDrawableUtils;
+ this.viewThemeUtils = viewThemeUtils;
}
@Override
@@ -109,11 +105,9 @@ public class UploaderAdapter extends SimpleAdapter {
file.isSharedViaLink(),
file.isEncrypted(),
file.isGroupFolder(),
- user,
file.getMountType(),
mContext,
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
fileIcon.setImageDrawable(icon);
} else {
// get Thumbnail if file is image
@@ -148,10 +142,8 @@ public class UploaderAdapter extends SimpleAdapter {
} else {
final Drawable icon = MimeTypeUtil.getFileTypeIcon(file.getMimeType(),
file.getFileName(),
- user,
mContext,
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
fileIcon.setImageDrawable(icon);
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java
index e484433af7..4b75827d3c 100644
--- a/app/src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java
+++ b/app/src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java
@@ -42,8 +42,7 @@ import com.owncloud.android.databinding.AccountItemBinding;
import com.owncloud.android.lib.common.OwnCloudAccount;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.ArrayList;
import java.util.List;
@@ -70,8 +69,7 @@ public class UserListAdapter extends RecyclerView.Adapter
private final String userId;
private final WeakReference activityWeakReference;
private final ClientFactory clientFactory;
- private final ThemeColorUtils themeColorUtils;
- private final ThemeDrawableUtils themeDrawableUtils;
+ private final ViewThemeUtils viewThemeUtils;
public RetrieveHoverCardAsyncTask(User user,
String userId,
FragmentActivity activity,
ClientFactory clientFactory,
- ThemeColorUtils themeColorUtils,
- ThemeDrawableUtils themeDrawableUtils) {
+ ViewThemeUtils viewThemeUtils) {
this.user = user;
this.userId = userId;
this.activityWeakReference = new WeakReference<>(activity);
this.clientFactory = clientFactory;
- this.themeColorUtils = themeColorUtils;
- this.themeDrawableUtils = themeDrawableUtils;
+ this.viewThemeUtils = viewThemeUtils;
}
@Override
@@ -84,7 +80,11 @@ public class RetrieveHoverCardAsyncTask extends AsyncTask
if (activity != null && activity.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) {
if (hoverCard.getActions().size() > 0) {
- new ProfileBottomSheetDialog(activity, user, hoverCard, themeColorUtils, themeDrawableUtils).show();
+ new ProfileBottomSheetDialog(activity,
+ user,
+ hoverCard,
+ viewThemeUtils)
+ .show();
} else {
DisplayUtils.showSnackMessage(activity, R.string.no_actions);
}
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/AccountRemovalConfirmationDialog.java b/app/src/main/java/com/owncloud/android/ui/dialog/AccountRemovalConfirmationDialog.java
index be264a9a7c..f2863b1975 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/AccountRemovalConfirmationDialog.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/AccountRemovalConfirmationDialog.java
@@ -25,12 +25,12 @@ package com.owncloud.android.ui.dialog;
import android.app.Dialog;
import android.os.Bundle;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.nextcloud.client.account.User;
import com.nextcloud.client.di.Injectable;
import com.nextcloud.client.jobs.BackgroundJobManager;
import com.owncloud.android.R;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
@@ -43,8 +43,7 @@ public class AccountRemovalConfirmationDialog extends DialogFragment implements
private static final String KEY_USER = "USER";
@Inject BackgroundJobManager backgroundJobManager;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeButtonUtils themeButtonUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
private User user;
public static AccountRemovalConfirmationDialog newInstance(User user) {
@@ -69,22 +68,24 @@ public class AccountRemovalConfirmationDialog extends DialogFragment implements
AlertDialog alertDialog = (AlertDialog) getDialog();
- themeButtonUtils.themeBorderlessButton(themeColorUtils,
- alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
- alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
+ viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
+ alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
- return new AlertDialog.Builder(requireActivity(), R.style.Theme_ownCloud_Dialog)
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireActivity())
.setTitle(R.string.delete_account)
.setMessage(getResources().getString(R.string.delete_account_warning, user.getAccountName()))
.setIcon(R.drawable.ic_warning)
.setPositiveButton(R.string.common_ok,
(dialogInterface, i) -> backgroundJobManager.startAccountRemovalJob(user.getAccountName(),
false))
- .setNeutralButton(R.string.common_cancel, null)
- .create();
+ .setNeutralButton(R.string.common_cancel, null);
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(requireActivity(), builder);
+
+ return builder.create();
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ChooseRichDocumentsTemplateDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ChooseRichDocumentsTemplateDialogFragment.java
index fa5a1ec24e..8bb336bf45 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/ChooseRichDocumentsTemplateDialogFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/ChooseRichDocumentsTemplateDialogFragment.java
@@ -35,6 +35,7 @@ import android.view.Window;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.common.collect.Sets;
import com.nextcloud.client.account.CurrentAccountProvider;
import com.nextcloud.client.account.User;
@@ -59,9 +60,7 @@ import com.owncloud.android.ui.adapter.RichDocumentsTemplateAdapter;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.FileStorageUtils;
import com.owncloud.android.utils.NextcloudServer;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeTextInputUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
@@ -89,9 +88,7 @@ public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment im
@Inject CurrentAccountProvider currentAccount;
@Inject ClientFactory clientFactory;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeButtonUtils themeButtonUtils;
- @Inject ThemeTextInputUtils themeTextInputUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
@Inject FileDataStorageManager fileDataStorageManager;
private RichDocumentsTemplateAdapter adapter;
private OCFile parentFolder;
@@ -123,9 +120,8 @@ public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment im
AlertDialog alertDialog = (AlertDialog) getDialog();
positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
- themeButtonUtils.themeBorderlessButton(themeColorUtils,
- positiveButton,
- alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
+ viewThemeUtils.platform.colorTextButtons(positiveButton,
+ alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
positiveButton.setOnClickListener(this);
positiveButton.setEnabled(false);
@@ -165,10 +161,7 @@ public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment im
View view = binding.getRoot();
binding.filename.requestFocus();
- themeTextInputUtils.colorTextInput(binding.filenameContainer,
- binding.filename,
- themeColorUtils.primaryColor(getContext()),
- themeColorUtils.primaryAccentColor(getContext()));
+ viewThemeUtils.material.colorTextInputLayout(binding.filenameContainer);
Type type = Type.valueOf(arguments.getString(ARG_TYPE));
new FetchTemplateTask(this, client).execute(type);
@@ -180,7 +173,7 @@ public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment im
getContext(),
currentAccount,
clientFactory,
- themeColorUtils);
+ viewThemeUtils);
binding.list.setAdapter(adapter);
binding.filename.addTextChangedListener(new TextWatcher() {
@@ -218,11 +211,14 @@ public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment im
});
// Build the dialog
- AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(activity);
builder.setView(view)
.setPositiveButton(R.string.create, null)
.setNeutralButton(R.string.common_cancel, null)
.setTitle(getTitle(type));
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(activity, builder);
+
Dialog dialog = builder.create();
Window window = dialog.getWindow();
@@ -323,7 +319,7 @@ public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment im
Template template,
String path,
User user
- ) {
+ ) {
this.client = client;
this.chooseTemplateDialogFragmentWeakReference = new WeakReference<>(chooseTemplateDialogFragment);
this.template = template;
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ChooseTemplateDialogFragment.kt b/app/src/main/java/com/owncloud/android/ui/dialog/ChooseTemplateDialogFragment.kt
index 32a0f2e22d..9304d70bcb 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/ChooseTemplateDialogFragment.kt
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/ChooseTemplateDialogFragment.kt
@@ -35,6 +35,7 @@ import android.widget.Button
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
import androidx.recyclerview.widget.GridLayoutManager
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.nextcloud.android.lib.resources.directediting.DirectEditingCreateFileRemoteOperation
import com.nextcloud.android.lib.resources.directediting.DirectEditingObtainListOfTemplatesRemoteOperation
import com.nextcloud.client.account.CurrentAccountProvider
@@ -58,10 +59,7 @@ import com.owncloud.android.ui.activity.TextEditorWebView
import com.owncloud.android.ui.adapter.TemplateAdapter
import com.owncloud.android.utils.DisplayUtils
import com.owncloud.android.utils.FileStorageUtils
-import com.owncloud.android.utils.theme.ThemeButtonUtils
-import com.owncloud.android.utils.theme.ThemeColorUtils
-import com.owncloud.android.utils.theme.ThemeDrawableUtils
-import com.owncloud.android.utils.theme.ThemeTextInputUtils
+import com.owncloud.android.utils.theme.ViewThemeUtils
import java.lang.ref.WeakReference
import javax.inject.Inject
@@ -78,21 +76,12 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
@Inject
lateinit var currentAccount: CurrentAccountProvider
- @Inject
- lateinit var themeColorUtils: ThemeColorUtils
-
- @Inject
- lateinit var themeDrawableUtils: ThemeDrawableUtils
-
- @Inject
- lateinit var themeButtonUtils: ThemeButtonUtils
-
- @Inject
- lateinit var themeTextInputUtils: ThemeTextInputUtils
-
@Inject
lateinit var fileDataStorageManager: FileDataStorageManager
+ @Inject
+ lateinit var viewThemeUtils: ViewThemeUtils
+
private var adapter: TemplateAdapter? = null
private var parentFolder: OCFile? = null
private var title: String? = null
@@ -111,8 +100,7 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
val alertDialog = dialog as AlertDialog
val button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE)
- themeButtonUtils.themeBorderlessButton(
- themeColorUtils,
+ viewThemeUtils.platform.colorTextButtons(
button,
alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL)
)
@@ -144,11 +132,8 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
val view: View = binding.root
binding.filename.requestFocus()
- themeTextInputUtils.colorTextInput(
- binding.filenameContainer,
- binding.filename,
- themeColorUtils.primaryColor(context),
- themeColorUtils.primaryAccentColor(context)
+ viewThemeUtils.material.colorTextInputLayout(
+ binding.filenameContainer
)
binding.filename.addTextChangedListener(object : TextWatcher {
@@ -173,17 +158,19 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
context,
currentAccount,
clientFactory,
- themeColorUtils,
- themeDrawableUtils
+ viewThemeUtils
)
binding.list.adapter = adapter
// Build the dialog
- val builder = AlertDialog.Builder(activity)
+ val builder = MaterialAlertDialogBuilder(activity)
builder.setView(view)
.setPositiveButton(R.string.create, null)
.setNeutralButton(R.string.common_cancel, null)
.setTitle(title)
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.list.context, builder)
+
val dialog: Dialog = builder.create()
val window = dialog.window
window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java
index 53f8fbe751..7c0c19001d 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java
@@ -20,10 +20,10 @@ import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
@@ -44,8 +44,8 @@ public class ConfirmationDialogFragment extends DialogFragment implements Inject
public static final String FTAG_CONFIRMATION = "CONFIRMATION_FRAGMENT";
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeButtonUtils themeButtonUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
+
private ConfirmationDialogFragmentListener mListener;
@@ -84,10 +84,11 @@ public class ConfirmationDialogFragment extends DialogFragment implements Inject
AlertDialog alertDialog = (AlertDialog) getDialog();
- themeButtonUtils.themeBorderlessButton(themeColorUtils,
- alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
- alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE),
- alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
+ if(alertDialog != null) {
+ viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
+ alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE),
+ alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
+ }
}
public void setOnConfirmationListener(ConfirmationDialogFragmentListener listener) {
@@ -120,7 +121,7 @@ public class ConfirmationDialogFragment extends DialogFragment implements Inject
messageArguments = new String[]{};
}
- AlertDialog.Builder builder = new AlertDialog.Builder(activity, R.style.Theme_ownCloud_Dialog)
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(activity)
.setIcon(R.drawable.ic_warning)
.setIconAttribute(android.R.attr.alertDialogIcon)
.setMessage(String.format(getString(messageId), messageArguments));
@@ -155,6 +156,9 @@ public class ConfirmationDialogFragment extends DialogFragment implements Inject
dialog.dismiss();
});
}
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(activity, builder);
+
return builder.create();
}
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.java
index 8ace741f72..47ca18a5be 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.java
@@ -29,6 +29,7 @@ import android.view.View;
import android.widget.Button;
import android.widget.Toast;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.nextcloud.client.account.User;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
@@ -39,10 +40,7 @@ import com.owncloud.android.datamodel.ThumbnailsCacheManager;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.ui.adapter.LocalFileListAdapter;
import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeCheckableUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.io.File;
import java.util.ArrayList;
@@ -72,10 +70,7 @@ public class ConflictsResolveDialog extends DialogFragment implements Injectable
private User user;
private final List asyncTasks = new ArrayList<>();
private Button positiveButton;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeDrawableUtils themeDrawableUtils;
- @Inject ThemeButtonUtils themeButtonUtils;
- @Inject ThemeCheckableUtils themeCheckableUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
private static final String KEY_NEW_FILE = "file";
private static final String KEY_EXISTING_FILE = "ocfile";
@@ -123,9 +118,8 @@ public class ConflictsResolveDialog extends DialogFragment implements Injectable
}
positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
- themeButtonUtils.themeBorderlessButton(themeColorUtils,
- positiveButton,
- alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
+ viewThemeUtils.platform.colorTextButtons(positiveButton,
+ alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
positiveButton.setEnabled(false);
}
@@ -161,12 +155,11 @@ public class ConflictsResolveDialog extends DialogFragment implements Injectable
// Inflate the layout for the dialog
binding = ConflictResolveDialogBinding.inflate(requireActivity().getLayoutInflater());
- themeCheckableUtils.tintCheckbox(themeColorUtils.primaryColor(getContext()),
- binding.newCheckbox,
- binding.existingCheckbox);
+ viewThemeUtils.platform.themeCheckbox(binding.newCheckbox);
+ viewThemeUtils.platform.themeCheckbox(binding.existingCheckbox);
// Build the dialog
- AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireActivity());
builder.setView(binding.getRoot())
.setPositiveButton(R.string.common_ok, (dialog, which) -> {
if (listener != null) {
@@ -201,8 +194,7 @@ public class ConflictsResolveDialog extends DialogFragment implements Injectable
LocalFileListAdapter.setThumbnail(newFile,
binding.newThumbnail,
getContext(),
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
// set info for existing file
binding.existingSize.setText(DisplayUtils.bytesToHumanReadable(existingFile.getFileLength()));
@@ -220,8 +212,7 @@ public class ConflictsResolveDialog extends DialogFragment implements Injectable
getContext(),
null,
null,
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
View.OnClickListener checkBoxClickListener = v ->
positiveButton.setEnabled(binding.newCheckbox.isChecked() || binding.existingCheckbox.isChecked());
@@ -238,6 +229,8 @@ public class ConflictsResolveDialog extends DialogFragment implements Injectable
positiveButton.setEnabled(binding.newCheckbox.isChecked() || binding.existingCheckbox.isChecked());
});
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.existingFileContainer.getContext(), builder);
+
return builder.create();
}
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/CreateFolderDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/CreateFolderDialogFragment.java
index 3f00e82f2c..e095cfac98 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/CreateFolderDialogFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/CreateFolderDialogFragment.java
@@ -33,6 +33,7 @@ import android.view.WindowManager.LayoutParams;
import android.widget.Button;
import android.widget.TextView;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.common.collect.Sets;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
@@ -42,9 +43,7 @@ import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.lib.resources.files.FileUtils;
import com.owncloud.android.ui.activity.ComponentsGetter;
import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeTextInputUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.List;
import java.util.Set;
@@ -67,10 +66,9 @@ public class CreateFolderDialogFragment
public static final String CREATE_FOLDER_FRAGMENT = "CREATE_FOLDER_FRAGMENT";
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeButtonUtils themeButtonUtils;
- @Inject ThemeTextInputUtils themeTextInputUtils;
@Inject FileDataStorageManager fileDataStorageManager;
+ @Inject ViewThemeUtils viewThemeUtils;
+
private OCFile mParentFolder;
private Button positiveButton;
@@ -99,9 +97,8 @@ public class CreateFolderDialogFragment
if (alertDialog != null) {
positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
- themeButtonUtils.themeBorderlessButton(themeColorUtils,
- positiveButton,
- alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
+ viewThemeUtils.platform.colorTextButtons(positiveButton,
+ alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
}
}
@@ -118,10 +115,7 @@ public class CreateFolderDialogFragment
// Setup layout
binding.userInput.setText("");
binding.userInput.requestFocus();
- themeTextInputUtils.colorTextInput(binding.userInputContainer,
- binding.userInput,
- themeColorUtils.primaryColor(getActivity()),
- themeColorUtils.primaryAccentColor(getActivity()));
+ viewThemeUtils.material.colorTextInputLayout(binding.userInputContainer);
OCFile parentFolder = requireArguments().getParcelable(ARG_PARENT_FOLDER);
List folderContent = fileDataStorageManager.getFolderContent(parentFolder, false);
@@ -173,11 +167,14 @@ public class CreateFolderDialogFragment
});
// Build the dialog
- AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireActivity());
builder.setView(view)
.setPositiveButton(R.string.folder_confirm_create, this)
.setNeutralButton(R.string.common_cancel, this)
.setTitle(R.string.uploader_info_dirname);
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.userInputContainer.getContext(), builder);
+
AlertDialog d = builder.create();
Window window = d.getWindow();
@@ -192,8 +189,8 @@ public class CreateFolderDialogFragment
public void onClick(DialogInterface dialog, int which) {
if (which == AlertDialog.BUTTON_POSITIVE) {
String newFolderName =
- ((TextView)(getDialog().findViewById(R.id.user_input)))
- .getText().toString().trim();
+ ((TextView) (getDialog().findViewById(R.id.user_input)))
+ .getText().toString().trim();
if (TextUtils.isEmpty(newFolderName)) {
DisplayUtils.showSnackMessage(getActivity(), R.string.filename_empty);
@@ -207,6 +204,7 @@ public class CreateFolderDialogFragment
}
String path = mParentFolder.getDecryptedRemotePath() + newFolderName + OCFile.PATH_SEPARATOR;
+
((ComponentsGetter) getActivity()).getFileOperationsHelper().createFolder(path);
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ExpirationDatePickerDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/ExpirationDatePickerDialogFragment.java
index 4c40e0711f..f1c16c6b49 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/ExpirationDatePickerDialogFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/ExpirationDatePickerDialogFragment.java
@@ -32,7 +32,7 @@ import android.widget.DatePicker;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.Calendar;
@@ -54,7 +54,7 @@ public class ExpirationDatePickerDialogFragment
/** Parameter constant for date chosen initially */
private static final String ARG_CHOSEN_DATE_IN_MILLIS = "CHOSEN_DATE_IN_MILLIS";
- @Inject ThemeColorUtils themeColorUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
private OnExpiryDateListener onExpiryDateListener;
/**
@@ -83,9 +83,10 @@ public class ExpirationDatePickerDialogFragment
final Dialog currentDialog = getDialog();
if (currentDialog != null) {
final DatePickerDialog dialog = (DatePickerDialog) currentDialog;
- dialog.getButton(DatePickerDialog.BUTTON_NEUTRAL).setTextColor(themeColorUtils.primaryColor(getContext(), true));
- dialog.getButton(DatePickerDialog.BUTTON_NEGATIVE).setTextColor(themeColorUtils.primaryColor(getContext(), true));
- dialog.getButton(DatePickerDialog.BUTTON_POSITIVE).setTextColor(themeColorUtils.primaryColor(getContext(), true));
+
+ viewThemeUtils.platform.colorTextButtons(dialog.getButton(DatePickerDialog.BUTTON_NEUTRAL),
+ dialog.getButton(DatePickerDialog.BUTTON_NEGATIVE),
+ dialog.getButton(DatePickerDialog.BUTTON_POSITIVE));
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/IndeterminateProgressDialog.java b/app/src/main/java/com/owncloud/android/ui/dialog/IndeterminateProgressDialog.java
index 67b1f4e1c7..891249e9b0 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/IndeterminateProgressDialog.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/IndeterminateProgressDialog.java
@@ -29,7 +29,7 @@ import android.widget.ProgressBar;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
@@ -42,7 +42,7 @@ public class IndeterminateProgressDialog extends DialogFragment implements Injec
private static final String ARG_MESSAGE_ID = IndeterminateProgressDialog.class.getCanonicalName() + ".ARG_MESSAGE_ID";
private static final String ARG_CANCELABLE = IndeterminateProgressDialog.class.getCanonicalName() + ".ARG_CANCELABLE";
- @Inject ThemeColorUtils themeColorUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
/**
* Public factory method to get dialog instances.
@@ -71,14 +71,9 @@ public class IndeterminateProgressDialog extends DialogFragment implements Injec
/// create indeterminate progress dialog
final ProgressDialog progressDialog = new ProgressDialog(getActivity(), R.style.ProgressDialogTheme);
progressDialog.setIndeterminate(true);
- progressDialog.setOnShowListener(new DialogInterface.OnShowListener() {
- @Override
- public void onShow(DialogInterface dialog) {
- ProgressBar v = progressDialog.findViewById(android.R.id.progress);
- v.getIndeterminateDrawable().setColorFilter(themeColorUtils.primaryAccentColor(getContext()),
- android.graphics.PorterDuff.Mode.MULTIPLY);
-
- }
+ progressDialog.setOnShowListener(dialog -> {
+ ProgressBar v = progressDialog.findViewById(android.R.id.progress);
+ viewThemeUtils.platform.tintDrawable(requireContext(), v.getIndeterminateDrawable());
});
/// set message
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/LoadingDialog.java b/app/src/main/java/com/owncloud/android/ui/dialog/LoadingDialog.java
index c4eeb3b308..016d8ea7f8 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/LoadingDialog.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/LoadingDialog.java
@@ -19,7 +19,6 @@
package com.owncloud.android.ui.dialog;
import android.app.Dialog;
-import android.graphics.PorterDuff;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -30,7 +29,7 @@ import android.widget.TextView;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
@@ -39,7 +38,7 @@ import androidx.fragment.app.DialogFragment;
public class LoadingDialog extends DialogFragment implements Injectable {
- @Inject ThemeColorUtils themeColorUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
private String mMessage;
@Override
@@ -66,8 +65,7 @@ public class LoadingDialog extends DialogFragment implements Injectable {
// set progress wheel color
ProgressBar progressBar = v.findViewById(R.id.loadingBar);
- progressBar.getIndeterminateDrawable().setColorFilter(themeColorUtils.primaryAccentColor(getContext()),
- PorterDuff.Mode.SRC_IN);
+ viewThemeUtils.platform.tintDrawable(requireContext(), progressBar.getIndeterminateDrawable());
return v;
}
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/LocalStoragePathPickerDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/LocalStoragePathPickerDialogFragment.java
index 132ee40617..96e39d372a 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/LocalStoragePathPickerDialogFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/LocalStoragePathPickerDialogFragment.java
@@ -27,14 +27,14 @@ import android.os.Environment;
import android.view.LayoutInflater;
import android.view.View;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
import com.owncloud.android.databinding.StoragePathDialogBinding;
import com.owncloud.android.ui.adapter.StoragePathAdapter;
import com.owncloud.android.ui.adapter.StoragePathItem;
import com.owncloud.android.utils.FileStorageUtils;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.io.File;
import java.util.ArrayList;
@@ -60,8 +60,7 @@ public class LocalStoragePathPickerDialogFragment extends DialogFragment
private static Set internalStoragePaths = new HashSet<>();
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeButtonUtils themeButtonUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
static {
internalStoragePaths.add("/storage/emulated/legacy");
@@ -82,8 +81,7 @@ public class LocalStoragePathPickerDialogFragment extends DialogFragment
AlertDialog alertDialog = (AlertDialog) getDialog();
if (alertDialog != null) {
- themeButtonUtils.themeBorderlessButton(themeColorUtils,
- alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE));
+ viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE));
}
}
@@ -97,7 +95,7 @@ public class LocalStoragePathPickerDialogFragment extends DialogFragment
public Dialog onCreateDialog(Bundle savedInstanceState) {
if (!(getActivity() instanceof StoragePathAdapter.StoragePathAdapterListener)) {
throw new IllegalArgumentException("Calling activity must implement " +
- "StoragePathAdapter.StoragePathAdapterListener");
+ "StoragePathAdapter.StoragePathAdapterListener");
}
// Inflate the layout for the dialog
@@ -111,11 +109,13 @@ public class LocalStoragePathPickerDialogFragment extends DialogFragment
binding.storagePathRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
// Build the dialog
- AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(binding.getRoot().getContext());
builder.setView(view)
.setNegativeButton(R.string.common_cancel, this)
.setTitle(R.string.storage_choose_location);
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.getRoot().getContext(), builder);
+
return builder.create();
}
@@ -137,7 +137,7 @@ public class LocalStoragePathPickerDialogFragment extends DialogFragment
for (FileStorageUtils.StandardDirectory standardDirectory : FileStorageUtils.StandardDirectory.getStandardDirectories()) {
addIfExists(storagePathItems, standardDirectory.getIcon(), getString(standardDirectory.getDisplayName()),
- Environment.getExternalStoragePublicDirectory(standardDirectory.getName()).getAbsolutePath());
+ Environment.getExternalStoragePublicDirectory(standardDirectory.getName()).getAbsolutePath());
}
String sdCard = getString(R.string.storage_internal_storage);
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/MultipleAccountsDialog.java b/app/src/main/java/com/owncloud/android/ui/dialog/MultipleAccountsDialog.java
index 063cdbfe99..e985db2a42 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/MultipleAccountsDialog.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/MultipleAccountsDialog.java
@@ -35,6 +35,7 @@ import android.view.View;
import android.view.Window;
import android.view.WindowManager;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.nextcloud.client.account.User;
import com.nextcloud.client.account.UserAccountManager;
import com.nextcloud.client.di.Injectable;
@@ -42,8 +43,7 @@ import com.owncloud.android.R;
import com.owncloud.android.databinding.MultipleAccountsBinding;
import com.owncloud.android.ui.adapter.UserListAdapter;
import com.owncloud.android.ui.adapter.UserListItem;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.ArrayList;
import java.util.List;
@@ -51,15 +51,13 @@ import java.util.List;
import javax.inject.Inject;
import androidx.annotation.NonNull;
-import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
import androidx.recyclerview.widget.LinearLayoutManager;
public class MultipleAccountsDialog extends DialogFragment implements Injectable, UserListAdapter.ClickListener {
@Inject UserAccountManager accountManager;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeDrawableUtils themeDrawableUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
public boolean highlightCurrentlyActiveAccount = true;
@NonNull
@@ -75,7 +73,7 @@ public class MultipleAccountsDialog extends DialogFragment implements Injectable
MultipleAccountsBinding binding = MultipleAccountsBinding.inflate(inflater, null, false);
final Context parent = getActivity();
- AlertDialog.Builder builder = new AlertDialog.Builder(parent);
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(binding.getRoot().getContext());
UserListAdapter adapter = new UserListAdapter(parent,
accountManager,
@@ -84,14 +82,16 @@ public class MultipleAccountsDialog extends DialogFragment implements Injectable
false,
highlightCurrentlyActiveAccount,
false,
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
binding.list.setHasFixedSize(true);
binding.list.setLayoutManager(new LinearLayoutManager(activity));
binding.list.setAdapter(adapter);
builder.setView(binding.getRoot()).setTitle(R.string.common_choose_account);
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.getRoot().getContext(), builder);
+
Dialog dialog = builder.create();
Window window = dialog.getWindow();
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/NoteDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/NoteDialogFragment.java
index 7e4c292956..5ae7cf2141 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/NoteDialogFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/NoteDialogFragment.java
@@ -29,15 +29,14 @@ import android.view.View;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
import com.owncloud.android.databinding.NoteDialogBinding;
import com.owncloud.android.lib.resources.shares.OCShare;
import com.owncloud.android.ui.activity.ComponentsGetter;
import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeTextInputUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
@@ -53,9 +52,7 @@ public class NoteDialogFragment extends DialogFragment implements DialogInterfac
private static final String ARG_SHARE = "SHARE";
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeButtonUtils themeButtonUtils;
- @Inject ThemeTextInputUtils themeTextInputUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
private OCShare share;
private NoteDialogBinding binding;
@@ -86,9 +83,8 @@ public class NoteDialogFragment extends DialogFragment implements DialogInterfac
AlertDialog alertDialog = (AlertDialog) getDialog();
- themeButtonUtils.themeBorderlessButton(themeColorUtils,
- alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
- alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
+ viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
+ alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
}
@NonNull
@@ -102,17 +98,17 @@ public class NoteDialogFragment extends DialogFragment implements DialogInterfac
// Setup layout
binding.noteText.setText(share.getNote());
binding.noteText.requestFocus();
- themeTextInputUtils.colorTextInput(binding.noteContainer,
- binding.noteText,
- themeColorUtils.primaryColor(getContext()),
- themeColorUtils.primaryAccentColor(getContext()));
+ viewThemeUtils.material.colorTextInputLayout(binding.noteContainer);
// Build the dialog
- AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(binding.noteContainer.getContext());
builder.setView(view)
.setPositiveButton(R.string.note_confirm, this)
.setNeutralButton(R.string.common_cancel, this)
.setTitle(R.string.send_note);
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.noteContainer.getContext(), builder);
+
Dialog dialog = builder.create();
Window window = dialog.getWindow();
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.java
index 3edf9a7f0d..64b832b34d 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.java
@@ -28,13 +28,10 @@ import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.ui.activity.ComponentsGetter;
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment.ConfirmationDialogFragmentListener;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
import java.util.ArrayList;
import java.util.Collection;
-import javax.inject.Inject;
-
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
@@ -49,8 +46,6 @@ public class RemoveFilesDialogFragment extends ConfirmationDialogFragment implem
private static final int SINGLE_SELECTION = 1;
private static final String ARG_TARGET_FILES = "TARGET_FILES";
- @Inject ThemeColorUtils themeColorUtils;
-
private Collection mTargetFiles;
private ActionMode actionMode;
@@ -133,13 +128,13 @@ public class RemoveFilesDialogFragment extends ConfirmationDialogFragment implem
public void onStart() {
super.onStart();
- int color = themeColorUtils.primaryAccentColor(getActivity());
-
AlertDialog alertDialog = (AlertDialog) getDialog();
- alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(color);
- alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(color);
- alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(color);
+ if (alertDialog != null) {
+ viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
+ alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE),
+ alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
+ }
}
@NonNull
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java
index 20d38e841f..e56d58cb5a 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java
@@ -38,6 +38,7 @@ import android.view.Window;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.common.collect.Sets;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
@@ -47,8 +48,7 @@ import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.lib.resources.files.FileUtils;
import com.owncloud.android.ui.activity.ComponentsGetter;
import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeTextInputUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.List;
import java.util.Set;
@@ -71,14 +71,14 @@ public class RenameFileDialogFragment
private static final String ARG_TARGET_FILE = "TARGET_FILE";
private static final String ARG_PARENT_FOLDER = "PARENT_FOLDER";
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeTextInputUtils themeTextInputUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
@Inject FileDataStorageManager fileDataStorageManager;
private EditBoxDialogBinding binding;
private OCFile mTargetFile;
private Button positiveButton;
+
/**
* Public factory method to create new RenameFileDialogFragment instances.
*
@@ -92,21 +92,18 @@ public class RenameFileDialogFragment
args.putParcelable(ARG_PARENT_FOLDER, parentFolder);
frag.setArguments(args);
return frag;
-
}
@Override
public void onStart() {
super.onStart();
- int color = themeColorUtils.primaryAccentColor(getContext());
-
AlertDialog alertDialog = (AlertDialog) getDialog();
if (alertDialog != null) {
positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
- positiveButton.setTextColor(color);
- alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(color);
+ viewThemeUtils.platform.colorTextButtons(positiveButton,
+ alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
}
}
@@ -123,10 +120,7 @@ public class RenameFileDialogFragment
// Setup layout
String currentName = mTargetFile.getFileName();
binding.userInput.setText(currentName);
- themeTextInputUtils.colorTextInput(binding.userInputContainer,
- binding.userInput,
- themeColorUtils.primaryColor(getActivity()),
- themeColorUtils.primaryAccentColor(getActivity()));
+ viewThemeUtils.material.colorTextInputLayout(binding.userInputContainer);
int extensionStart = mTargetFile.isFolder() ? -1 : currentName.lastIndexOf('.');
int selectionEnd = extensionStart >= 0 ? extensionStart : currentName.length();
binding.userInput.setSelection(0, selectionEnd);
@@ -179,11 +173,14 @@ public class RenameFileDialogFragment
});
// Build the dialog
- AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireActivity());
builder.setView(view)
.setPositiveButton(R.string.file_rename, this)
.setNeutralButton(R.string.common_cancel, this)
.setTitle(R.string.rename_dialog_title);
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.userInputContainer.getContext(), builder);
+
Dialog d = builder.create();
Window window = d.getWindow();
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/RenamePublicShareDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/RenamePublicShareDialogFragment.java
index 90f29a2a84..a85491ffc1 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/RenamePublicShareDialogFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/RenamePublicShareDialogFragment.java
@@ -23,22 +23,21 @@ package com.owncloud.android.ui.dialog;
import android.app.Dialog;
import android.content.DialogInterface;
-import android.graphics.PorterDuff;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
-import android.widget.EditText;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
import com.owncloud.android.databinding.EditBoxDialogBinding;
import com.owncloud.android.lib.resources.shares.OCShare;
import com.owncloud.android.ui.activity.ComponentsGetter;
import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
@@ -47,7 +46,7 @@ import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
/**
- * Dialog to rename a public share
+ * Dialog to rename a public share.
*/
public class RenamePublicShareDialogFragment
extends DialogFragment implements DialogInterface.OnClickListener, Injectable {
@@ -56,7 +55,7 @@ public class RenamePublicShareDialogFragment
public static final String RENAME_PUBLIC_SHARE_FRAGMENT = "RENAME_PUBLIC_SHARE_FRAGMENT";
- @Inject ThemeColorUtils themeColorUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
private EditBoxDialogBinding binding;
private OCShare publicShare;
@@ -67,27 +66,23 @@ public class RenamePublicShareDialogFragment
args.putParcelable(ARG_PUBLIC_SHARE, share);
frag.setArguments(args);
return frag;
-
}
@Override
public void onStart() {
super.onStart();
- int color = themeColorUtils.primaryAccentColor(getContext());
-
AlertDialog alertDialog = (AlertDialog) getDialog();
if (alertDialog != null) {
- alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(color);
- alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(color);
+ viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
+ alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
}
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
- int accentColor = themeColorUtils.primaryAccentColor(getContext());
publicShare = requireArguments().getParcelable(ARG_PUBLIC_SHARE);
// Inflate the layout for the dialog
@@ -96,18 +91,19 @@ public class RenamePublicShareDialogFragment
View view = binding.getRoot();
// Setup layout
- EditText inputText = binding.userInput;
- inputText.setText(publicShare.getLabel());
- inputText.requestFocus();
- inputText.getBackground().setColorFilter(accentColor, PorterDuff.Mode.SRC_ATOP);
- inputText.setHighlightColor(themeColorUtils.primaryColor(getActivity()));
+ viewThemeUtils.material.colorTextInputLayout(binding.userInputContainer);
+ binding.userInput.setText(publicShare.getLabel());
+ binding.userInput.requestFocus();
// Build the dialog
- AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(view.getContext());
builder.setView(view)
.setPositiveButton(R.string.file_rename, this)
.setNeutralButton(R.string.common_cancel, this)
.setTitle(R.string.public_share_name);
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.userInput.getContext(), builder);
+
Dialog dialog = builder.create();
Window window = dialog.getWindow();
@@ -118,7 +114,6 @@ public class RenamePublicShareDialogFragment
return dialog;
}
-
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == AlertDialog.BUTTON_POSITIVE) {
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/SendShareDialog.java b/app/src/main/java/com/owncloud/android/ui/dialog/SendShareDialog.java
index fbb14c5cc1..c991646b15 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/SendShareDialog.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/SendShareDialog.java
@@ -3,7 +3,6 @@ package com.owncloud.android.ui.dialog;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ResolveInfo;
-import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.LayoutInflater;
@@ -28,8 +27,7 @@ import com.owncloud.android.ui.adapter.SendButtonAdapter;
import com.owncloud.android.ui.components.SendButtonData;
import com.owncloud.android.ui.helpers.FileOperationsHelper;
import com.owncloud.android.utils.MimeTypeUtil;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.ArrayList;
import java.util.List;
@@ -79,8 +77,7 @@ public class SendShareDialog extends BottomSheetDialogFragment implements Inject
private boolean sharingPublicPasswordEnforced;
private boolean sharingPublicAskForPassword;
private FileOperationsHelper fileOperationsHelper;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeSnackbarUtils themeSnackbarUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
public static SendShareDialog newInstance(OCFile file, boolean hideNcSharingOptions, OCCapability capability) {
@@ -131,11 +128,11 @@ public class SendShareDialog extends BottomSheetDialogFragment implements Inject
// Share via link button
TextView shareLinkText = view.findViewById(R.id.share_link_button);
- shareLinkText.setOnClickListener(v -> shareByLink(themeSnackbarUtils));
+ shareLinkText.setOnClickListener(v -> shareByLink());
ImageView shareLinkImageView = view.findViewById(R.id.share_link_icon);
themeShareButtonImage(shareLinkImageView);
- shareLinkImageView.setOnClickListener(v -> shareByLink(themeSnackbarUtils));
+ shareLinkImageView.setOnClickListener(v -> shareByLink());
if (hideNcSharingOptions) {
sendShareButtons.setVisibility(View.GONE);
@@ -185,9 +182,9 @@ public class SendShareDialog extends BottomSheetDialogFragment implements Inject
BottomSheetBehavior.from((View) requireView().getParent()).setState(BottomSheetBehavior.STATE_EXPANDED);
}
- private void shareByLink(ThemeSnackbarUtils themeSnackbarUtils) {
+ private void shareByLink() {
if (file.isSharedViaLink()) {
- ((FileActivity) getActivity()).getFileOperationsHelper().getFileWithLink(file, themeSnackbarUtils);
+ ((FileActivity) getActivity()).getFileOperationsHelper().getFileWithLink(file, viewThemeUtils);
} else if (sharingPublicPasswordEnforced || sharingPublicAskForPassword) {
// password enforced by server, request to the user before trying to create
requestPasswordForShareViaLink();
@@ -207,11 +204,7 @@ public class SendShareDialog extends BottomSheetDialogFragment implements Inject
}
private void themeShareButtonImage(ImageView shareImageView) {
- shareImageView.getBackground().setColorFilter(themeColorUtils.primaryColor(getContext().getApplicationContext(),
- true),
- PorterDuff.Mode.SRC_IN);
- shareImageView.getDrawable().mutate().setColorFilter(themeColorUtils.fontColor(getContext().getApplicationContext()),
- PorterDuff.Mode.SRC_IN);
+ viewThemeUtils.files.themeAvatarButton(shareImageView);
}
private void showResharingNotAllowedSnackbar() {
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/SetupEncryptionDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/SetupEncryptionDialogFragment.java
index 80343159bd..b1fa949779 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/SetupEncryptionDialogFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/SetupEncryptionDialogFragment.java
@@ -24,18 +24,17 @@ import android.accounts.AccountManager;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
-import android.widget.TextView;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.nextcloud.client.account.User;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
+import com.owncloud.android.databinding.SetupEncryptionDialogBinding;
import com.owncloud.android.datamodel.ArbitraryDataProvider;
import com.owncloud.android.lib.common.accounts.AccountUtils;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
@@ -47,8 +46,7 @@ import com.owncloud.android.lib.resources.users.SendCSROperation;
import com.owncloud.android.lib.resources.users.StorePrivateKeyOperation;
import com.owncloud.android.utils.CsrHelper;
import com.owncloud.android.utils.EncryptionUtils;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.io.IOException;
import java.security.KeyPair;
@@ -62,7 +60,6 @@ import javax.inject.Inject;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog;
-import androidx.core.graphics.drawable.DrawableCompat;
import androidx.fragment.app.DialogFragment;
import static com.owncloud.android.utils.EncryptionUtils.decodeStringToBase64Bytes;
@@ -89,19 +86,16 @@ public class SetupEncryptionDialogFragment extends DialogFragment implements Inj
private static final String KEY_FAILED = "KEY_FAILED";
private static final String KEY_GENERATE = "KEY_GENERATE";
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeButtonUtils themeButtonUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
private User user;
- private TextView textView;
- private TextView passphraseTextView;
private ArbitraryDataProvider arbitraryDataProvider;
private Button positiveButton;
private Button neutralButton;
private DownloadKeysAsyncTask task;
- private TextView passwordField;
private String keyResult;
private List keyWords;
+ private SetupEncryptionDialogBinding binding;
/**
* Public factory method to create new SetupEncryptionDialogFragment instance
@@ -123,11 +117,11 @@ public class SetupEncryptionDialogFragment extends DialogFragment implements Inj
AlertDialog alertDialog = (AlertDialog) getDialog();
- positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
- neutralButton = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL);
- themeButtonUtils.themeBorderlessButton(themeColorUtils,
- positiveButton,
- neutralButton);
+ if (alertDialog != null) {
+ positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
+ neutralButton = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL);
+ viewThemeUtils.platform.colorTextButtons(positiveButton, neutralButton);
+ }
task = new DownloadKeysAsyncTask();
task.execute();
@@ -136,34 +130,28 @@ public class SetupEncryptionDialogFragment extends DialogFragment implements Inj
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
- int primaryColor = themeColorUtils.primaryColor(getContext());
user = getArguments().getParcelable(ARG_USER);
arbitraryDataProvider = new ArbitraryDataProvider(getContext().getContentResolver());
// Inflate the layout for the dialog
LayoutInflater inflater = getActivity().getLayoutInflater();
+ binding = SetupEncryptionDialogBinding.inflate(inflater, null, false);
// Setup layout
- View v = inflater.inflate(R.layout.setup_encryption_dialog, null);
- textView = v.findViewById(R.id.encryption_status);
- passphraseTextView = v.findViewById(R.id.encryption_passphrase);
- passwordField = v.findViewById(R.id.encryption_passwordInput);
- passwordField.getBackground().setColorFilter(primaryColor, PorterDuff.Mode.SRC_ATOP);
+ viewThemeUtils.material.colorTextInputLayout(binding.encryptionPasswordInputContainer);
- Drawable wrappedDrawable = DrawableCompat.wrap(passwordField.getBackground());
- DrawableCompat.setTint(wrappedDrawable, primaryColor);
- passwordField.setBackgroundDrawable(wrappedDrawable);
-
- return createDialog(v);
+ return createDialog(binding.getRoot());
}
@NonNull
private Dialog createDialog(View v) {
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(v.getContext());
builder.setView(v).setPositiveButton(R.string.common_ok, null)
- .setNeutralButton(R.string.common_cancel, null)
- .setTitle(R.string.end_to_end_encryption_title);
+ .setNeutralButton(R.string.common_cancel, null)
+ .setTitle(R.string.end_to_end_encryption_title);
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(v.getContext(), builder);
Dialog dialog = builder.create();
dialog.setCanceledOnTouchOutside(false);
@@ -188,18 +176,18 @@ public class SetupEncryptionDialogFragment extends DialogFragment implements Inj
intentCreated.putExtra(SUCCESS, true);
intentCreated.putExtra(ARG_POSITION, getArguments().getInt(ARG_POSITION));
getTargetFragment().onActivityResult(getTargetRequestCode(),
- SETUP_ENCRYPTION_RESULT_CODE, intentCreated);
+ SETUP_ENCRYPTION_RESULT_CODE, intentCreated);
break;
case KEY_EXISTING_USED:
Log_OC.d(TAG, "Decrypt private key");
- textView.setText(R.string.end_to_end_encryption_decrypting);
+ binding.encryptionStatus.setText(R.string.end_to_end_encryption_decrypting);
try {
String privateKey = task.get();
- String mnemonicUnchanged = passwordField.getText().toString();
- String mnemonic = passwordField.getText().toString().replaceAll("\\s", "")
+ String mnemonicUnchanged = binding.encryptionPasswordInput.getText().toString();
+ String mnemonic = binding.encryptionPasswordInput.getText().toString().replaceAll("\\s", "")
.toLowerCase(Locale.ROOT);
String decryptedPrivateKey = EncryptionUtils.decryptPrivateKey(privateKey,
mnemonic);
@@ -239,13 +227,13 @@ public class SetupEncryptionDialogFragment extends DialogFragment implements Inj
SETUP_ENCRYPTION_RESULT_CODE, intentExisting);
} catch (Exception e) {
- textView.setText(R.string.end_to_end_encryption_wrong_password);
+ binding.encryptionStatus.setText(R.string.end_to_end_encryption_wrong_password);
Log_OC.d(TAG, "Error while decrypting private key: " + e.getMessage());
}
break;
case KEY_GENERATE:
- passphraseTextView.setVisibility(View.GONE);
+ binding.encryptionPassphrase.setVisibility(View.GONE);
positiveButton.setVisibility(View.GONE);
neutralButton.setVisibility(View.GONE);
getDialog().setTitle(R.string.end_to_end_encryption_storing_keys);
@@ -270,7 +258,7 @@ public class SetupEncryptionDialogFragment extends DialogFragment implements Inj
protected void onPreExecute() {
super.onPreExecute();
- textView.setText(R.string.end_to_end_encryption_retrieving_keys);
+ binding.encryptionStatus.setText(R.string.end_to_end_encryption_retrieving_keys);
positiveButton.setVisibility(View.INVISIBLE);
neutralButton.setVisibility(View.INVISIBLE);
}
@@ -319,11 +307,11 @@ public class SetupEncryptionDialogFragment extends DialogFragment implements Inj
keyWords = EncryptionUtils.getRandomWords(12, requireContext());
showMnemonicInfo();
} catch (IOException e) {
- textView.setText(R.string.common_error);
+ binding.encryptionStatus.setText(R.string.common_error);
}
} else if (!privateKey.isEmpty()) {
- textView.setText(R.string.end_to_end_encryption_enter_password);
- passwordField.setVisibility(View.VISIBLE);
+ binding.encryptionStatus.setText(R.string.end_to_end_encryption_enter_password);
+ binding.encryptionPasswordInputContainer.setVisibility(View.VISIBLE);
positiveButton.setVisibility(View.VISIBLE);
} else {
Log_OC.e(TAG, "Got empty private key string");
@@ -336,7 +324,7 @@ public class SetupEncryptionDialogFragment extends DialogFragment implements Inj
protected void onPreExecute() {
super.onPreExecute();
- textView.setText(R.string.end_to_end_encryption_generating_keys);
+ binding.encryptionStatus.setText(R.string.end_to_end_encryption_generating_keys);
}
@Override
@@ -370,7 +358,7 @@ public class SetupEncryptionDialogFragment extends DialogFragment implements Inj
String privateKeyString = EncryptionUtils.encodeBytesToBase64String(privateKey.getEncoded());
String privatePemKeyString = EncryptionUtils.privateKeyToPEM(privateKey);
String encryptedPrivateKey = EncryptionUtils.encryptPrivateKey(privatePemKeyString,
- generateMnemonicString(false));
+ generateMnemonicString(false));
// upload encryptedPrivateKey
StorePrivateKeyOperation storePrivateKeyOperation = new StorePrivateKeyOperation(encryptedPrivateKey);
@@ -380,10 +368,10 @@ public class SetupEncryptionDialogFragment extends DialogFragment implements Inj
Log_OC.d(TAG, "private key success");
arbitraryDataProvider.storeOrUpdateKeyValue(user.getAccountName(), EncryptionUtils.PRIVATE_KEY,
- privateKeyString);
+ privateKeyString);
arbitraryDataProvider.storeOrUpdateKeyValue(user.getAccountName(), EncryptionUtils.PUBLIC_KEY, publicKey);
arbitraryDataProvider.storeOrUpdateKeyValue(user.getAccountName(), EncryptionUtils.MNEMONIC,
- generateMnemonicString(true));
+ generateMnemonicString(true));
keyResult = KEY_CREATED;
return (String) storePrivateKeyResult.getData().get(0);
@@ -434,16 +422,17 @@ public class SetupEncryptionDialogFragment extends DialogFragment implements Inj
public void showMnemonicInfo() {
requireDialog().setTitle(R.string.end_to_end_encryption_passphrase_title);
- textView.setText(R.string.end_to_end_encryption_keywords_description);
+ binding.encryptionStatus.setText(R.string.end_to_end_encryption_keywords_description);
+ viewThemeUtils.material.colorTextInputLayout(binding.encryptionPasswordInputContainer);
- passphraseTextView.setText(generateMnemonicString(true));
+ binding.encryptionPassphrase.setText(generateMnemonicString(true));
- passphraseTextView.setVisibility(View.VISIBLE);
+ binding.encryptionPassphrase.setVisibility(View.VISIBLE);
positiveButton.setText(R.string.end_to_end_encryption_confirm_button);
positiveButton.setVisibility(View.VISIBLE);
neutralButton.setVisibility(View.VISIBLE);
- themeButtonUtils.themeBorderlessButton(themeColorUtils, positiveButton, neutralButton);
+ viewThemeUtils.platform.colorTextButtons(positiveButton, neutralButton);
keyResult = KEY_GENERATE;
}
@@ -453,11 +442,11 @@ public class SetupEncryptionDialogFragment extends DialogFragment implements Inj
keyResult = KEY_FAILED;
requireDialog().setTitle(R.string.common_error);
- textView.setText(R.string.end_to_end_encryption_unsuccessful);
- passphraseTextView.setVisibility(View.GONE);
+ binding.encryptionStatus.setText(R.string.end_to_end_encryption_unsuccessful);
+ binding.encryptionPassphrase.setVisibility(View.GONE);
positiveButton.setText(R.string.end_to_end_encryption_dialog_close);
positiveButton.setVisibility(View.VISIBLE);
- positiveButton.setTextColor(themeColorUtils.primaryAccentColor(getContext()));
+ viewThemeUtils.platform.colorTextButtons(positiveButton);
}
@VisibleForTesting
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ShareLinkToDialog.java b/app/src/main/java/com/owncloud/android/ui/dialog/ShareLinkToDialog.java
index 77679f891a..6f55e0004f 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/ShareLinkToDialog.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/ShareLinkToDialog.java
@@ -36,6 +36,7 @@ import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.owncloud.android.R;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.ui.activity.CopyToClipboardActivity;
@@ -125,7 +126,7 @@ public class ShareLinkToDialog extends DialogFragment {
titleId = R.string.activity_chooser_title;
}
- return new AlertDialog.Builder(getActivity())
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getActivity())
.setTitle(titleId)
.setAdapter(mAdapter, new DialogInterface.OnClickListener() {
@Override
@@ -141,8 +142,8 @@ public class ShareLinkToDialog extends DialogFragment {
// Send the file
getActivity().startActivity(mIntent);
}
- })
- .create();
+ });
+ return builder.create();
}
class ActivityAdapter extends ArrayAdapter {
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java
index 479616004b..0c51a1b327 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java
@@ -29,6 +29,7 @@ import android.view.View;
import android.view.Window;
import android.view.WindowManager;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
import com.owncloud.android.databinding.PasswordDialogBinding;
@@ -36,9 +37,7 @@ import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.lib.resources.shares.OCShare;
import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeTextInputUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
@@ -59,9 +58,7 @@ public class SharePasswordDialogFragment extends DialogFragment implements Dialo
private static final String ARG_ASK_FOR_PASSWORD = "ASK_FOR_PASSWORD";
public static final String PASSWORD_FRAGMENT = "PASSWORD_FRAGMENT";
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeButtonUtils themeButtonUtils;
- @Inject ThemeTextInputUtils themeTextInputUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
private PasswordDialogBinding binding;
private OCFile file;
@@ -75,11 +72,10 @@ public class SharePasswordDialogFragment extends DialogFragment implements Dialo
AlertDialog alertDialog = (AlertDialog) getDialog();
if (alertDialog != null) {
- themeButtonUtils.themeBorderlessButton(themeColorUtils,
- alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
- alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE));
- themeButtonUtils.themeBorderlessButton(getResources().getColor(R.color.highlight_textColor_Warning),
- alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
+ viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
+ alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE));
+ viewThemeUtils.platform.colorTextButtons(getResources().getColor(R.color.highlight_textColor_Warning),
+ alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> {
String password = binding.sharePassword.getText().toString();
@@ -104,9 +100,8 @@ public class SharePasswordDialogFragment extends DialogFragment implements Dialo
* Public factory method to create new SharePasswordDialogFragment instances.
*
* @param file OCFile bound to the public share that which password will be set or updated
- * @param createShare When 'true', the request for password will be followed by the creation of a new
- * public link; when 'false', a public share is assumed to exist, and the password
- * is bound to it.
+ * @param createShare When 'true', the request for password will be followed by the creation of a new public link;
+ * when 'false', a public share is assumed to exist, and the password is bound to it.
* @return Dialog ready to show.
*/
public static SharePasswordDialogFragment newInstance(OCFile file, boolean createShare, boolean askForPassword) {
@@ -163,10 +158,7 @@ public class SharePasswordDialogFragment extends DialogFragment implements Dialo
// Setup layout
binding.sharePassword.setText("");
- themeTextInputUtils.colorTextInput(binding.sharePasswordContainer,
- binding.sharePassword,
- themeColorUtils.primaryColor(getActivity()),
- themeColorUtils.primaryAccentColor(getActivity()));
+ viewThemeUtils.material.colorTextInputLayout(binding.sharePasswordContainer);
binding.sharePassword.requestFocus();
int negativeButtonCaption;
@@ -180,13 +172,16 @@ public class SharePasswordDialogFragment extends DialogFragment implements Dialo
}
// Build the dialog
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(view.getContext());
builder.setView(view)
.setPositiveButton(R.string.common_ok, null)
.setNegativeButton(negativeButtonCaption, this)
- .setNeutralButton(R.string.common_delete, this)
+ .setNeutralButton(R.string.common_delete, this)
.setTitle(title);
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(view.getContext(), builder);
+
Dialog d = builder.create();
Window window = d.getWindow();
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/SortingOrderDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/SortingOrderDialogFragment.java
index bdb459d890..764ca5c5e4 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/SortingOrderDialogFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/SortingOrderDialogFragment.java
@@ -24,19 +24,17 @@ package com.owncloud.android.ui.dialog;
import android.app.Dialog;
import android.graphics.Typeface;
import android.os.Bundle;
-import android.view.LayoutInflater;
import android.view.View;
-import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView;
-import com.google.android.material.button.MaterialButton;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
+import com.owncloud.android.databinding.SortingOrderFragmentBinding;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.utils.FileSortOrder;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
@@ -53,13 +51,12 @@ public class SortingOrderDialogFragment extends DialogFragment implements Inject
public static final String SORTING_ORDER_FRAGMENT = "SORTING_ORDER_FRAGMENT";
private static final String KEY_SORT_ORDER = "SORT_ORDER";
- private View mView;
+ private SortingOrderFragmentBinding binding;
private View[] mTaggedViews;
- private MaterialButton mCancel;
private String mCurrentSortOrderName;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeButtonUtils themeButtonUtils;
+
+ @Inject ViewThemeUtils viewThemeUtils;
public static SortingOrderDialogFragment newInstance(FileSortOrder sortOrder) {
SortingOrderDialogFragment dialogFragment = new SortingOrderDialogFragment();
@@ -79,55 +76,42 @@ public class SortingOrderDialogFragment extends DialogFragment implements Inject
// keep the state of the fragment on configuration changes
setRetainInstance(true);
- mView = null;
+ binding = null;
mCurrentSortOrderName = getArguments().getString(KEY_SORT_ORDER, FileSortOrder.sort_a_to_z.name);
}
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- Log_OC.d(TAG, "onCreateView, savedInstanceState is " + savedInstanceState);
-
- mView = inflater.inflate(R.layout.sorting_order_fragment, container, false);
-
- setupDialogElements(mView);
- setupListeners();
-
- return mView;
- }
-
/**
* find all relevant UI elements and set their values.
*
- * @param view the parent view
+ * @param binding the parent binding
*/
- private void setupDialogElements(View view) {
- mCancel = view.findViewById(R.id.cancel);
- mCancel.setTextColor(themeColorUtils.primaryAccentColor(getContext()));
+ private void setupDialogElements(SortingOrderFragmentBinding binding) {
+ viewThemeUtils.platform.colorTextButtons(binding.cancel);
mTaggedViews = new View[12];
- mTaggedViews[0] = view.findViewById(R.id.sortByNameAscending);
+ mTaggedViews[0] = binding.sortByNameAscending;
mTaggedViews[0].setTag(FileSortOrder.sort_a_to_z);
- mTaggedViews[1] = view.findViewById(R.id.sortByNameAZText);
+ mTaggedViews[1] = binding.sortByNameAZText;
mTaggedViews[1].setTag(FileSortOrder.sort_a_to_z);
- mTaggedViews[2] = view.findViewById(R.id.sortByNameDescending);
+ mTaggedViews[2] = binding.sortByNameDescending;
mTaggedViews[2].setTag(FileSortOrder.sort_z_to_a);
- mTaggedViews[3] = view.findViewById(R.id.sortByNameZAText);
+ mTaggedViews[3] = binding.sortByNameZAText;
mTaggedViews[3].setTag(FileSortOrder.sort_z_to_a);
- mTaggedViews[4] = view.findViewById(R.id.sortByModificationDateAscending);
+ mTaggedViews[4] = binding.sortByModificationDateAscending;
mTaggedViews[4].setTag(FileSortOrder.sort_old_to_new);
- mTaggedViews[5] = view.findViewById(R.id.sortByModificationDateOldestFirstText);
+ mTaggedViews[5] = binding.sortByModificationDateOldestFirstText;
mTaggedViews[5].setTag(FileSortOrder.sort_old_to_new);
- mTaggedViews[6] = view.findViewById(R.id.sortByModificationDateDescending);
+ mTaggedViews[6] = binding.sortByModificationDateDescending;
mTaggedViews[6].setTag(FileSortOrder.sort_new_to_old);
- mTaggedViews[7] = view.findViewById(R.id.sortByModificationDateNewestFirstText);
+ mTaggedViews[7] = binding.sortByModificationDateNewestFirstText;
mTaggedViews[7].setTag(FileSortOrder.sort_new_to_old);
- mTaggedViews[8] = view.findViewById(R.id.sortBySizeAscending);
+ mTaggedViews[8] = binding.sortBySizeAscending;
mTaggedViews[8].setTag(FileSortOrder.sort_small_to_big);
- mTaggedViews[9] = view.findViewById(R.id.sortBySizeSmallestFirstText);
+ mTaggedViews[9] = binding.sortBySizeSmallestFirstText;
mTaggedViews[9].setTag(FileSortOrder.sort_small_to_big);
- mTaggedViews[10] = view.findViewById(R.id.sortBySizeDescending);
+ mTaggedViews[10] = binding.sortBySizeDescending;
mTaggedViews[10].setTag(FileSortOrder.sort_big_to_small);
- mTaggedViews[11] = view.findViewById(R.id.sortBySizeBiggestFirstText);
+ mTaggedViews[11] = binding.sortBySizeBiggestFirstText;
mTaggedViews[11].setTag(FileSortOrder.sort_big_to_small);
setupActiveOrderSelection();
@@ -137,17 +121,17 @@ public class SortingOrderDialogFragment extends DialogFragment implements Inject
* tints the icon reflecting the actual sorting choice in the apps primary color.
*/
private void setupActiveOrderSelection() {
- final int color = themeColorUtils.primaryColor(null, true, true, getContext());
- for (View view: mTaggedViews) {
+ for (View view : mTaggedViews) {
if (!((FileSortOrder) view.getTag()).name.equals(mCurrentSortOrderName)) {
continue;
}
if (view instanceof ImageButton) {
- themeButtonUtils.colorImageButton((ImageButton) view, color);
+ viewThemeUtils.platform.themeImageButton((ImageButton) view);
+ ((ImageButton) view).setSelected(true);
}
if (view instanceof TextView) {
- ((TextView)view).setTextColor(color);
- ((TextView)view).setTypeface(Typeface.DEFAULT_BOLD);
+ viewThemeUtils.platform.colorPrimaryTextViewElement((TextView) view);
+ ((TextView) view).setTypeface(Typeface.DEFAULT_BOLD);
}
}
}
@@ -156,7 +140,7 @@ public class SortingOrderDialogFragment extends DialogFragment implements Inject
* setup all listeners.
*/
private void setupListeners() {
- mCancel.setOnClickListener(view -> dismiss());
+ binding.cancel.setOnClickListener(view -> dismiss());
OnSortOrderClickListener sortOrderClickListener = new OnSortOrderClickListener();
@@ -168,7 +152,17 @@ public class SortingOrderDialogFragment extends DialogFragment implements Inject
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
- return super.onCreateDialog(savedInstanceState);
+ binding = SortingOrderFragmentBinding.inflate(requireActivity().getLayoutInflater(), null, false);
+
+ setupDialogElements(binding);
+ setupListeners();
+
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(binding.getRoot().getContext());
+ builder.setView(binding.getRoot());
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.getRoot().getContext(), builder);
+
+ return builder.create();
}
@Override
@@ -185,7 +179,7 @@ public class SortingOrderDialogFragment extends DialogFragment implements Inject
public void onClick(View v) {
dismissAllowingStateLoss();
((SortingOrderDialogFragment.OnSortingOrderListener) getActivity())
- .onSortingOrderChosen((FileSortOrder) v.getTag());
+ .onSortingOrderChosen((FileSortOrder) v.getTag());
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/SslUntrustedCertDialog.java b/app/src/main/java/com/owncloud/android/ui/dialog/SslUntrustedCertDialog.java
index a669afb080..3046976902 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/SslUntrustedCertDialog.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/SslUntrustedCertDialog.java
@@ -32,6 +32,8 @@ import android.view.Window;
import android.webkit.SslErrorHandler;
import android.widget.Button;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
import com.owncloud.android.databinding.SslUntrustedCertLayoutBinding;
import com.owncloud.android.lib.common.network.CertificateCombinedException;
@@ -41,11 +43,14 @@ import com.owncloud.android.ui.adapter.CertificateCombinedExceptionViewAdapter;
import com.owncloud.android.ui.adapter.SslCertificateViewAdapter;
import com.owncloud.android.ui.adapter.SslErrorViewAdapter;
import com.owncloud.android.ui.adapter.X509CertificateViewAdapter;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.cert.X509Certificate;
+import javax.inject.Inject;
+
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
@@ -56,10 +61,12 @@ import androidx.fragment.app.DialogFragment;
* Abstract implementation of common functionality for different dialogs that
* get the information about the error and the certificate from different classes.
*/
-public class SslUntrustedCertDialog extends DialogFragment {
+public class SslUntrustedCertDialog extends DialogFragment implements Injectable {
private final static String TAG = SslUntrustedCertDialog.class.getSimpleName();
+ @Inject ViewThemeUtils viewThemeUtils;
+
protected SslUntrustedCertLayoutBinding binding;
protected SslErrorHandler mHandler;
protected X509Certificate m509Certificate;
@@ -110,7 +117,6 @@ public class SslUntrustedCertDialog extends DialogFragment {
return dialog;
}
-
@Override
public void onAttach(@NonNull Activity activity) {
Log_OC.d(TAG, "onAttach");
@@ -120,7 +126,6 @@ public class SslUntrustedCertDialog extends DialogFragment {
}
}
-
@Override
public void onCreate(Bundle savedInstanceState) {
Log_OC.d(TAG, "onCreate, savedInstanceState is " + savedInstanceState);
@@ -165,7 +170,12 @@ public class SslUntrustedCertDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Log_OC.d(TAG, "onCreateDialog, savedInstanceState is " + savedInstanceState);
- final Dialog dialog = super.onCreateDialog(savedInstanceState);
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(binding.getRoot().getContext());
+ builder.setView(binding.getRoot());
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.getRoot().getContext(), builder);
+
+ final Dialog dialog = builder.create();
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
return dialog;
}
@@ -190,7 +200,6 @@ public class SslUntrustedCertDialog extends DialogFragment {
}
}
-
private class OnCertificateTrusted implements OnClickListener {
@Override
@@ -210,13 +219,10 @@ public class SslUntrustedCertDialog extends DialogFragment {
}
}
}
-
}
-
public interface OnSslUntrustedCertListener {
void onSavedCertificate();
-
void onFailedSavingCertificate();
}
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/SslValidatorDialog.java b/app/src/main/java/com/owncloud/android/ui/dialog/SslValidatorDialog.java
index f935bfad6d..2373681946 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/SslValidatorDialog.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/SslValidatorDialog.java
@@ -26,9 +26,9 @@ import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
-import android.widget.TextView;
import com.owncloud.android.R;
+import com.owncloud.android.databinding.SslValidatorLayoutBinding;
import com.owncloud.android.lib.common.network.CertificateCombinedException;
import com.owncloud.android.lib.common.network.NetworkUtils;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
@@ -55,7 +55,7 @@ public class SslValidatorDialog extends Dialog {
private OnSslValidatorListener mListener;
private CertificateCombinedException mException;
- private View mView;
+ private SslValidatorLayoutBinding binding;
/**
@@ -95,10 +95,10 @@ public class SslValidatorDialog extends Dialog {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
- mView = getLayoutInflater().inflate(R.layout.ssl_validator_layout, null);
- setContentView(mView);
-
- mView.findViewById(R.id.ok).setOnClickListener(
+ binding = SslValidatorLayoutBinding.inflate(getLayoutInflater());
+ setContentView(binding.getRoot());
+
+ binding.ok.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -121,16 +121,16 @@ public class SslValidatorDialog extends Dialog {
}
}
});
-
- mView.findViewById(R.id.cancel).setOnClickListener(
+
+ binding.cancel.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
cancel();
}
});
-
- mView.findViewById(R.id.details_btn).setOnClickListener(
+
+ binding.detailsBtn.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -152,27 +152,27 @@ public class SslValidatorDialog extends Dialog {
mException = (CertificateCombinedException) result.getException();
/// clean
- mView.findViewById(R.id.reason_cert_not_trusted).setVisibility(View.GONE);
- mView.findViewById(R.id.reason_cert_expired).setVisibility(View.GONE);
- mView.findViewById(R.id.reason_cert_not_yet_valid).setVisibility(View.GONE);
- mView.findViewById(R.id.reason_hostname_not_verified).setVisibility(View.GONE);
- mView.findViewById(R.id.details_scroll).setVisibility(View.GONE);
+ binding.reasonCertNotTrusted.setVisibility(View.GONE);
+ binding.reasonCertExpired.setVisibility(View.GONE);
+ binding.reasonCertNotYetValid.setVisibility(View.GONE);
+ binding.reasonHostnameNotVerified.setVisibility(View.GONE);
+ binding.detailsScroll.setVisibility(View.GONE);
/// refresh
if (mException.getCertPathValidatorException() != null) {
- mView.findViewById(R.id.reason_cert_not_trusted).setVisibility(View.VISIBLE);
+ binding.reasonCertNotTrusted.setVisibility(View.VISIBLE);
}
if (mException.getCertificateExpiredException() != null) {
- mView.findViewById(R.id.reason_cert_expired).setVisibility(View.VISIBLE);
+ binding.reasonCertExpired.setVisibility(View.VISIBLE);
}
if (mException.getCertificateNotYetValidException() != null) {
- mView.findViewById(R.id.reason_cert_not_yet_valid).setVisibility(View.VISIBLE);
+ binding.reasonCertNotYetValid.setVisibility(View.VISIBLE);
}
if (mException.getSslPeerUnverifiedException() != null ) {
- mView.findViewById(R.id.reason_hostname_not_verified).setVisibility(View.VISIBLE);
+ binding.reasonHostnameNotVerified.setVisibility(View.VISIBLE);
}
showCertificateData(mException.getServerCertificate());
@@ -194,10 +194,8 @@ public class SslValidatorDialog extends Dialog {
}
private void showSignature(X509Certificate cert) {
- TextView sigView = mView.findViewById(R.id.value_signature);
- TextView algorithmView = mView.findViewById(R.id.value_signature_algorithm);
- sigView.setText(getHex(cert.getSignature()));
- algorithmView.setText(cert.getSigAlgName());
+ binding.valueSignature.setText(getHex(cert.getSignature()));
+ binding.valueSignatureAlgorithm.setText(cert.getSigAlgName());
}
public String getHex(final byte [] raw) {
@@ -216,106 +214,91 @@ public class SslValidatorDialog extends Dialog {
@SuppressWarnings("deprecation")
private void showValidity(Date notBefore, Date notAfter) {
- TextView fromView = mView.findViewById(R.id.value_validity_from);
- TextView toView = mView.findViewById(R.id.value_validity_to);
- fromView.setText(notBefore.toLocaleString());
- toView.setText(notAfter.toLocaleString());
+ binding.valueValidityFrom.setText(notBefore.toLocaleString());
+ binding.valueValidityTo.setText(notAfter.toLocaleString());
}
private void showSubject(X500Principal subject) {
Map s = parsePrincipal(subject);
- TextView cnView = mView.findViewById(R.id.value_subject_CN);
- TextView oView = mView.findViewById(R.id.value_subject_O);
- TextView ouView = mView.findViewById(R.id.value_subject_OU);
- TextView cView = mView.findViewById(R.id.value_subject_C);
- TextView stView = mView.findViewById(R.id.value_subject_ST);
- TextView lView = mView.findViewById(R.id.value_subject_L);
if (s.get("CN") != null) {
- cnView.setText(s.get("CN"));
- cnView.setVisibility(View.VISIBLE);
+ binding.valueSubjectCN.setText(s.get("CN"));
+ binding.valueSubjectCN.setVisibility(View.VISIBLE);
} else {
- cnView.setVisibility(View.GONE);
+ binding.valueSubjectCN.setVisibility(View.GONE);
}
if (s.get("O") != null) {
- oView.setText(s.get("O"));
- oView.setVisibility(View.VISIBLE);
+ binding.valueSubjectO.setText(s.get("O"));
+ binding.valueSubjectO.setVisibility(View.VISIBLE);
} else {
- oView.setVisibility(View.GONE);
+ binding.valueSubjectO.setVisibility(View.GONE);
}
if (s.get("OU") != null) {
- ouView.setText(s.get("OU"));
- ouView.setVisibility(View.VISIBLE);
+ binding.valueSubjectOU.setText(s.get("OU"));
+ binding.valueSubjectOU.setVisibility(View.VISIBLE);
} else {
- ouView.setVisibility(View.GONE);
+ binding.valueSubjectOU.setVisibility(View.GONE);
}
if (s.get("C") != null) {
- cView.setText(s.get("C"));
- cView.setVisibility(View.VISIBLE);
+ binding.valueSubjectC.setText(s.get("C"));
+ binding.valueSubjectC.setVisibility(View.VISIBLE);
} else {
- cView.setVisibility(View.GONE);
+ binding.valueSubjectC.setVisibility(View.GONE);
}
if (s.get("ST") != null) {
- stView.setText(s.get("ST"));
- stView.setVisibility(View.VISIBLE);
+ binding.valueSubjectST.setText(s.get("ST"));
+ binding.valueSubjectST.setVisibility(View.VISIBLE);
} else {
- stView.setVisibility(View.GONE);
+ binding.valueSubjectST.setVisibility(View.GONE);
}
if (s.get("L") != null) {
- lView.setText(s.get("L"));
- lView.setVisibility(View.VISIBLE);
+ binding.valueSubjectL.setText(s.get("L"));
+ binding.valueSubjectL.setVisibility(View.VISIBLE);
} else {
- lView.setVisibility(View.GONE);
+ binding.valueSubjectL.setVisibility(View.GONE);
}
}
private void showIssuer(X500Principal issuer) {
Map s = parsePrincipal(issuer);
- TextView cnView = mView.findViewById(R.id.value_issuer_CN);
- TextView oView = mView.findViewById(R.id.value_issuer_O);
- TextView ouView = mView.findViewById(R.id.value_issuer_OU);
- TextView cView = mView.findViewById(R.id.value_issuer_C);
- TextView stView = mView.findViewById(R.id.value_issuer_ST);
- TextView lView = mView.findViewById(R.id.value_issuer_L);
if (s.get("CN") != null) {
- cnView.setText(s.get("CN"));
- cnView.setVisibility(View.VISIBLE);
+ binding.valueIssuerCN.setText(s.get("CN"));
+ binding.valueIssuerCN.setVisibility(View.VISIBLE);
} else {
- cnView.setVisibility(View.GONE);
+ binding.valueIssuerCN.setVisibility(View.GONE);
}
if (s.get("O") != null) {
- oView.setText(s.get("O"));
- oView.setVisibility(View.VISIBLE);
+ binding.valueIssuerO.setText(s.get("O"));
+ binding.valueIssuerO.setVisibility(View.VISIBLE);
} else {
- oView.setVisibility(View.GONE);
+ binding.valueIssuerO.setVisibility(View.GONE);
}
if (s.get("OU") != null) {
- ouView.setText(s.get("OU"));
- ouView.setVisibility(View.VISIBLE);
+ binding.valueIssuerOU.setText(s.get("OU"));
+ binding.valueIssuerOU.setVisibility(View.VISIBLE);
} else {
- ouView.setVisibility(View.GONE);
+ binding.valueIssuerOU.setVisibility(View.GONE);
}
if (s.get("C") != null) {
- cView.setText(s.get("C"));
- cView.setVisibility(View.VISIBLE);
+ binding.valueIssuerC.setText(s.get("C"));
+ binding.valueIssuerC.setVisibility(View.VISIBLE);
} else {
- cView.setVisibility(View.GONE);
+ binding.valueIssuerC.setVisibility(View.GONE);
}
if (s.get("ST") != null) {
- stView.setText(s.get("ST"));
- stView.setVisibility(View.VISIBLE);
+ binding.valueIssuerST.setText(s.get("ST"));
+ binding.valueIssuerST.setVisibility(View.VISIBLE);
} else {
- stView.setVisibility(View.GONE);
+ binding.valueIssuerST.setVisibility(View.GONE);
}
if (s.get("L") != null) {
- lView.setText(s.get("L"));
- lView.setVisibility(View.VISIBLE);
+ binding.valueIssuerL.setText(s.get("L"));
+ binding.valueIssuerL.setVisibility(View.VISIBLE);
} else {
- lView.setVisibility(View.GONE);
+ binding.valueIssuerL.setVisibility(View.GONE);
}
}
-
private Map parsePrincipal(X500Principal principal) {
Map result = new HashMap<>();
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/StoragePermissionDialogFragment.kt b/app/src/main/java/com/owncloud/android/ui/dialog/StoragePermissionDialogFragment.kt
index 63607bc9db..18fd276fe2 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/StoragePermissionDialogFragment.kt
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/StoragePermissionDialogFragment.kt
@@ -32,8 +32,7 @@ import com.nextcloud.client.di.Injectable
import com.owncloud.android.R
import com.owncloud.android.databinding.StoragePermissionDialogBinding
import com.owncloud.android.ui.dialog.StoragePermissionDialogFragment.Listener
-import com.owncloud.android.utils.theme.ThemeButtonUtils
-import com.owncloud.android.utils.theme.ThemeColorUtils
+import com.owncloud.android.utils.theme.ViewThemeUtils
import javax.inject.Inject
/**
@@ -51,16 +50,13 @@ class StoragePermissionDialogFragment(val listener: Listener, val permissionRequ
private lateinit var binding: StoragePermissionDialogBinding
@Inject
- lateinit var themeButtonUtils: ThemeButtonUtils
-
- @Inject
- lateinit var themeColorUtils: ThemeColorUtils
+ lateinit var viewThemeUtils: ViewThemeUtils
override fun onStart() {
super.onStart()
dialog?.let {
val alertDialog = it as AlertDialog
- themeButtonUtils.themeBorderlessButton(themeColorUtils, alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE))
+ viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE))
}
}
@@ -77,12 +73,12 @@ class StoragePermissionDialogFragment(val listener: Listener, val permissionRequ
binding.storagePermissionExplanation.text = getString(explanationResource, getString(R.string.app_name))
// Setup layout
- themeButtonUtils.colorPrimaryButton(binding.btnFullAccess, context, themeColorUtils)
+ viewThemeUtils.material.colorMaterialButtonPrimaryFilled(binding.btnFullAccess)
binding.btnFullAccess.setOnClickListener {
listener.onClickFullAccess()
dismiss()
}
- themeButtonUtils.themeBorderlessButton(themeColorUtils, binding.btnReadOnly)
+ viewThemeUtils.platform.colorTextButtons(binding.btnReadOnly)
binding.btnReadOnly.setOnClickListener {
listener.onClickMediaReadOnly()
dismiss()
@@ -93,16 +89,18 @@ class StoragePermissionDialogFragment(val listener: Listener, val permissionRequ
permissionRequired -> R.string.file_management_permission
else -> R.string.file_management_permission_optional
}
- val dialog = MaterialAlertDialogBuilder(requireActivity(), R.style.Theme_ownCloud_Dialog)
+
+ val builder = MaterialAlertDialogBuilder(binding.btnReadOnly.context)
.setTitle(titleResource)
.setView(view)
.setNegativeButton(R.string.common_cancel) { _, _ ->
listener.onCancel()
dismiss()
}
- .create()
- return dialog
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.btnReadOnly.context, builder)
+
+ return builder.create()
}
interface Listener {
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/SyncFileNotEnoughSpaceDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/SyncFileNotEnoughSpaceDialogFragment.java
index 83e864fb14..a614a8a8a6 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/SyncFileNotEnoughSpaceDialogFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/SyncFileNotEnoughSpaceDialogFragment.java
@@ -31,6 +31,9 @@ import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment.ConfirmationDialogFragmentListener;
import com.owncloud.android.ui.fragment.OCFileListFragment;
import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
+
+import javax.inject.Inject;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
@@ -47,6 +50,8 @@ public class SyncFileNotEnoughSpaceDialogFragment extends ConfirmationDialogFrag
private OCFile targetFile;
+ @Inject ViewThemeUtils viewThemeUtils;
+
public static SyncFileNotEnoughSpaceDialogFragment newInstance(OCFile file, long availableDeviceSpace) {
Bundle args = new Bundle();
SyncFileNotEnoughSpaceDialogFragment frag = new SyncFileNotEnoughSpaceDialogFragment();
@@ -57,7 +62,7 @@ public class SyncFileNotEnoughSpaceDialogFragment extends ConfirmationDialogFrag
args.putInt(ARG_TITLE_ID, R.string.sync_not_enough_space_dialog_title);
args.putInt(ARG_MESSAGE_RESOURCE_ID, R.string.sync_not_enough_space_dialog_placeholder);
args.putStringArray(ARG_MESSAGE_ARGUMENTS,
- new String[] {
+ new String[]{
file.getFileName(),
properFileSize,
properDiskAvailableSpace});
@@ -83,10 +88,9 @@ public class SyncFileNotEnoughSpaceDialogFragment extends ConfirmationDialogFrag
AlertDialog alertDialog = (AlertDialog) getDialog();
if (alertDialog != null) {
- themeButtonUtils.themeBorderlessButton(themeColorUtils,
- alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
- alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL),
- alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE));
+ viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
+ alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL),
+ alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE));
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/SyncedFolderPreferencesDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/SyncedFolderPreferencesDialogFragment.java
index eb2b794123..5e140291ff 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/SyncedFolderPreferencesDialogFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/SyncedFolderPreferencesDialogFragment.java
@@ -24,20 +24,19 @@ import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
-import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.TextUtils;
import android.text.style.StyleSpan;
-import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
-import android.view.ViewGroup;
import android.widget.TextView;
import com.google.android.material.button.MaterialButton;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
+import com.owncloud.android.databinding.SyncedFoldersSettingsLayoutBinding;
import com.owncloud.android.datamodel.MediaFolderType;
import com.owncloud.android.datamodel.SyncedFolderDisplayItem;
import com.owncloud.android.files.services.NameCollisionPolicy;
@@ -47,9 +46,7 @@ import com.owncloud.android.ui.activity.UploadFilesActivity;
import com.owncloud.android.ui.dialog.parcel.SyncedFolderParcelable;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.FileStorageUtils;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeCheckableUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.io.File;
@@ -81,10 +78,8 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
private final static float alphaEnabled = 1.0f;
private final static float alphaDisabled = 0.7f;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeButtonUtils themeButtonUtils;
- @Inject ThemeCheckableUtils themeCheckableUtils;
- protected View mView;
+ @Inject ViewThemeUtils viewThemeUtils;
+
private CharSequence[] mUploadBehaviorItemStrings;
private CharSequence[] mNameCollisionPolicyItemStrings;
private SwitchCompat mEnabledSwitch;
@@ -104,6 +99,7 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
private boolean behaviourDialogShown;
private boolean nameCollisionPolicyDialogShown;
private AlertDialog behaviourDialog;
+ private SyncedFoldersSettingsLayoutBinding binding;
public static SyncedFolderPreferencesDialogFragment newInstance(SyncedFolderDisplayItem syncedFolder, int section) {
if (syncedFolder == null) {
@@ -135,99 +131,82 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
// keep the state of the fragment on configuration changes
setRetainInstance(true);
- mView = null;
+ binding = null;
mSyncedFolder = getArguments().getParcelable(SYNCED_FOLDER_PARCELABLE);
mUploadBehaviorItemStrings = getResources().getTextArray(R.array.pref_behaviour_entries);
mNameCollisionPolicyItemStrings = getResources().getTextArray(R.array.pref_name_collision_policy_entries);
}
- @Override
- public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- Log_OC.d(TAG, "onCreateView, savedInstanceState is " + savedInstanceState);
-
- mView = inflater.inflate(R.layout.synced_folders_settings_layout, container, false);
-
- setupDialogElements(mView);
- setupListeners(mView);
-
- return mView;
- }
-
/**
* find all relevant UI elements and set their values.
*
- * @param view the parent view
+ * @param binding the parent binding
*/
- private void setupDialogElements(View view) {
- int accentColor = themeColorUtils.primaryAccentColor(getContext());
-
+ private void setupDialogElements(SyncedFoldersSettingsLayoutBinding binding) {
if (mSyncedFolder.getType().getId() > MediaFolderType.CUSTOM.getId()) {
// hide local folder chooser and delete for non-custom folders
- view.findViewById(R.id.local_folder_container).setVisibility(View.GONE);
- view.findViewById(R.id.delete).setVisibility(View.GONE);
+ binding.localFolderContainer.setVisibility(View.GONE);
+ binding.delete.setVisibility(View.GONE);
} else if (mSyncedFolder.getId() <= UNPERSISTED_ID) {
// Hide delete/enabled for unpersisted custom folders
- view.findViewById(R.id.delete).setVisibility(View.GONE);
- view.findViewById(R.id.sync_enabled).setVisibility(View.GONE);
+ binding.delete.setVisibility(View.GONE);
+ binding.syncEnabled.setVisibility(View.GONE);
// auto set custom folder to enabled
mSyncedFolder.setEnabled(true);
// switch text to create headline
- ((TextView) view.findViewById(R.id.synced_folders_settings_title))
- .setText(R.string.autoupload_create_new_custom_folder);
+ binding.syncedFoldersSettingsTitle.setText(R.string.autoupload_create_new_custom_folder);
// disable save button
- view.findViewById(R.id.save).setEnabled(false);
+ binding.save.setEnabled(false);
} else {
- view.findViewById(R.id.local_folder_container).setVisibility(View.GONE);
+ binding.localFolderContainer.setVisibility(View.GONE);
}
// find/saves UI elements
- mEnabledSwitch = view.findViewById(R.id.sync_enabled);
- themeCheckableUtils.tintSwitch(mEnabledSwitch, themeColorUtils);
+ mEnabledSwitch = binding.syncEnabled;
+ viewThemeUtils.androidx.colorSwitchCompat(mEnabledSwitch);
- mLocalFolderPath = view.findViewById(R.id.synced_folders_settings_local_folder_path);
+ mLocalFolderPath = binding.syncedFoldersSettingsLocalFolderPath;
- mLocalFolderSummary = view.findViewById(R.id.local_folder_summary);
- mRemoteFolderSummary = view.findViewById(R.id.remote_folder_summary);
+ mLocalFolderSummary = binding.localFolderSummary;
+ mRemoteFolderSummary = binding.remoteFolderSummary;
- mUploadOnWifiCheckbox = view.findViewById(R.id.setting_instant_upload_on_wifi_checkbox);
+ mUploadOnWifiCheckbox = binding.settingInstantUploadOnWifiCheckbox;
- mUploadOnChargingCheckbox = view.findViewById(R.id.setting_instant_upload_on_charging_checkbox);
+ mUploadOnChargingCheckbox = binding.settingInstantUploadOnChargingCheckbox;
- mUploadExistingCheckbox = view.findViewById(R.id.setting_instant_upload_existing_checkbox);
+ mUploadExistingCheckbox = binding.settingInstantUploadExistingCheckbox;
- mUploadUseSubfoldersCheckbox = view.findViewById(
- R.id.setting_instant_upload_path_use_subfolders_checkbox);
+ mUploadUseSubfoldersCheckbox = binding.settingInstantUploadPathUseSubfoldersCheckbox;
- themeCheckableUtils.tintCheckbox(accentColor,
- mUploadOnWifiCheckbox,
- mUploadOnChargingCheckbox,
- mUploadExistingCheckbox,
- mUploadUseSubfoldersCheckbox);
+ viewThemeUtils.platform.themeCheckbox(mUploadOnWifiCheckbox,
+ mUploadOnChargingCheckbox,
+ mUploadExistingCheckbox,
+ mUploadUseSubfoldersCheckbox);
- mUploadBehaviorSummary = view.findViewById(R.id.setting_instant_behaviour_summary);
+ mUploadBehaviorSummary = binding.settingInstantBehaviourSummary;
- mNameCollisionPolicySummary = view.findViewById(R.id.setting_instant_name_collision_policy_summary);
+ mNameCollisionPolicySummary = binding.settingInstantNameCollisionPolicySummary;
- mCancel = view.findViewById(R.id.cancel);
- mSave = view.findViewById(R.id.save);
+ mCancel = binding.cancel;
+ mSave = binding.save;
- themeButtonUtils.themeBorderlessButton(themeColorUtils, mCancel, mSave);
+ viewThemeUtils.platform.colorTextButtons(mCancel, mSave);
// Set values
setEnabled(mSyncedFolder.isEnabled());
if (!TextUtils.isEmpty(mSyncedFolder.getLocalPath())) {
mLocalFolderPath.setText(
- DisplayUtils.createTextWithSpan(
- String.format(
- getString(R.string.synced_folders_preferences_folder_path),
- mSyncedFolder.getLocalPath()),
- mSyncedFolder.getFolderName(),
- new StyleSpan(Typeface.BOLD)));
+ DisplayUtils.createTextWithSpan(
+ String.format(
+ getString(R.string.synced_folders_preferences_folder_path),
+ mSyncedFolder.getLocalPath()),
+ mSyncedFolder.getFolderName(),
+ new StyleSpan(Typeface.BOLD)));
mLocalFolderSummary.setText(FileStorageUtils.pathToUserFriendlyDisplay(
mSyncedFolder.getLocalPath(),
getActivity(),
@@ -264,13 +243,13 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
mSyncedFolder.setEnabled(enabled);
mEnabledSwitch.setChecked(enabled);
- setupViews(mView, enabled);
+ setupViews(binding, enabled);
}
/**
- * set (new) remote path on activity result of the folder picker activity. The result gets originally propagated
- * to the underlying activity since the picker is an activity and the result can't get passed to the dialog
- * fragment directly.
+ * set (new) remote path on activity result of the folder picker activity. The result gets originally propagated to
+ * the underlying activity since the picker is an activity and the result can't get passed to the dialog fragment
+ * directly.
*
* @param path the remote path to be set
*/
@@ -281,9 +260,9 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
}
/**
- * set (new) local path on activity result of the folder picker activity. The result gets originally propagated
- * to the underlying activity since the picker is an activity and the result can't get passed to the dialog
- * fragment directly.
+ * set (new) local path on activity result of the folder picker activity. The result gets originally propagated to
+ * the underlying activity since the picker is an activity and the result can't get passed to the dialog fragment
+ * directly.
*
* @param path the local path to be set
*/
@@ -291,20 +270,20 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
mSyncedFolder.setLocalPath(path);
mLocalFolderSummary.setText(FileStorageUtils.pathToUserFriendlyDisplay(path, getActivity(), getResources()));
mLocalFolderPath.setText(
- DisplayUtils.createTextWithSpan(
- String.format(
- getString(R.string.synced_folders_preferences_folder_path),
- mSyncedFolder.getLocalPath()),
- new File(mSyncedFolder.getLocalPath()).getName(),
- new StyleSpan(Typeface.BOLD)));
+ DisplayUtils.createTextWithSpan(
+ String.format(
+ getString(R.string.synced_folders_preferences_folder_path),
+ mSyncedFolder.getLocalPath()),
+ new File(mSyncedFolder.getLocalPath()).getName(),
+ new StyleSpan(Typeface.BOLD)));
checkAndUpdateSaveButtonState();
}
private void checkAndUpdateSaveButtonState() {
if (mSyncedFolder.getLocalPath() != null && mSyncedFolder.getRemotePath() != null) {
- mView.findViewById(R.id.save).setEnabled(true);
+ binding.save.setEnabled(true);
} else {
- mView.findViewById(R.id.save).setEnabled(false);
+ binding.save.setEnabled(false);
}
checkWritableFolder();
@@ -312,18 +291,18 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
private void checkWritableFolder() {
if (!mSyncedFolder.isEnabled()) {
- mView.findViewById(R.id.setting_instant_behaviour_container).setEnabled(false);
- mView.findViewById(R.id.setting_instant_behaviour_container).setAlpha(alphaDisabled);
+ binding.settingInstantBehaviourContainer.setEnabled(false);
+ binding.settingInstantBehaviourContainer.setAlpha(alphaDisabled);
return;
}
if (mSyncedFolder.getLocalPath() != null && new File(mSyncedFolder.getLocalPath()).canWrite()) {
- mView.findViewById(R.id.setting_instant_behaviour_container).setEnabled(true);
- mView.findViewById(R.id.setting_instant_behaviour_container).setAlpha(alphaEnabled);
+ binding.settingInstantBehaviourContainer.setEnabled(true);
+ binding.settingInstantBehaviourContainer.setAlpha(alphaEnabled);
mUploadBehaviorSummary.setText(mUploadBehaviorItemStrings[mSyncedFolder.getUploadActionInteger()]);
} else {
- mView.findViewById(R.id.setting_instant_behaviour_container).setEnabled(false);
- mView.findViewById(R.id.setting_instant_behaviour_container).setAlpha(alphaDisabled);
+ binding.settingInstantBehaviourContainer.setEnabled(false);
+ binding.settingInstantBehaviourContainer.setAlpha(alphaDisabled);
mSyncedFolder.setUploadAction(
getResources().getTextArray(R.array.pref_behaviour_entryValues)[0].toString());
@@ -332,47 +311,38 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
}
}
- private void setupViews(View view, boolean enable) {
+ private void setupViews(SyncedFoldersSettingsLayoutBinding binding, boolean enable) {
float alpha;
if (enable) {
alpha = alphaEnabled;
} else {
alpha = alphaDisabled;
}
- view.findViewById(R.id.setting_instant_upload_on_wifi_container).setEnabled(enable);
- view.findViewById(R.id.setting_instant_upload_on_wifi_container).setAlpha(alpha);
+ binding.settingInstantUploadOnWifiContainer.setEnabled(enable);
+ binding.settingInstantUploadOnWifiContainer.setAlpha(alpha);
- view.findViewById(R.id.setting_instant_upload_on_charging_container).setEnabled(enable);
- view.findViewById(R.id.setting_instant_upload_on_charging_container).setAlpha(alpha);
+ binding.settingInstantUploadOnChargingContainer.setEnabled(enable);
+ binding.settingInstantUploadOnChargingContainer.setAlpha(alpha);
- view.findViewById(R.id.setting_instant_upload_existing_container).setEnabled(enable);
- view.findViewById(R.id.setting_instant_upload_existing_container).setAlpha(alpha);
+ binding.settingInstantUploadExistingContainer.setEnabled(enable);
+ binding.settingInstantUploadExistingContainer.setAlpha(alpha);
- view.findViewById(R.id.setting_instant_upload_path_use_subfolders_container).setEnabled(enable);
- view.findViewById(R.id.setting_instant_upload_path_use_subfolders_container).setAlpha(alpha);
+ binding.settingInstantUploadPathUseSubfoldersContainer.setEnabled(enable);
+ binding.settingInstantUploadPathUseSubfoldersContainer.setAlpha(alpha);
- view.findViewById(R.id.remote_folder_container).setEnabled(enable);
- view.findViewById(R.id.remote_folder_container).setAlpha(alpha);
+ binding.remoteFolderContainer.setEnabled(enable);
+ binding.remoteFolderContainer.setAlpha(alpha);
- view.findViewById(R.id.local_folder_container).setEnabled(enable);
- view.findViewById(R.id.local_folder_container).setAlpha(alpha);
+ binding.localFolderContainer.setEnabled(enable);
+ binding.localFolderContainer.setAlpha(alpha);
- view.findViewById(R.id.setting_instant_name_collision_policy_container).setEnabled(enable);
- view.findViewById(R.id.setting_instant_name_collision_policy_container).setAlpha(alpha);
+ binding.settingInstantNameCollisionPolicyContainer.setEnabled(enable);
+ binding.settingInstantNameCollisionPolicyContainer.setAlpha(alpha);
- if (enable) {
- themeCheckableUtils.tintCheckbox(themeColorUtils.primaryAccentColor(getContext()),
- mUploadOnWifiCheckbox,
- mUploadOnChargingCheckbox,
- mUploadExistingCheckbox,
- mUploadUseSubfoldersCheckbox);
- } else {
- themeCheckableUtils.tintCheckbox(Color.GRAY,
- mUploadOnWifiCheckbox,
- mUploadOnChargingCheckbox,
- mUploadExistingCheckbox,
- mUploadUseSubfoldersCheckbox);
- }
+ mUploadOnWifiCheckbox.setEnabled(enable);
+ mUploadOnChargingCheckbox.setEnabled(enable);
+ mUploadExistingCheckbox.setEnabled(enable);
+ mUploadUseSubfoldersCheckbox.setEnabled(enable);
checkWritableFolder();
}
@@ -380,14 +350,14 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
/**
* setup all listeners.
*
- * @param view the parent view
+ * @param binding the parent binding
*/
- private void setupListeners(View view) {
+ private void setupListeners(SyncedFoldersSettingsLayoutBinding binding) {
mSave.setOnClickListener(new OnSyncedFolderSaveClickListener());
mCancel.setOnClickListener(new OnSyncedFolderCancelClickListener());
- view.findViewById(R.id.delete).setOnClickListener(new OnSyncedFolderDeleteClickListener());
+ binding.delete.setOnClickListener(new OnSyncedFolderDeleteClickListener());
- view.findViewById(R.id.setting_instant_upload_on_wifi_container).setOnClickListener(
+ binding.settingInstantUploadOnWifiContainer.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
@@ -396,7 +366,7 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
}
});
- view.findViewById(R.id.setting_instant_upload_on_charging_container).setOnClickListener(
+ binding.settingInstantUploadOnChargingContainer.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
@@ -405,52 +375,52 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
}
});
- view.findViewById(R.id.setting_instant_upload_existing_container).setOnClickListener(
- new OnClickListener() {
- @Override
- public void onClick(View v) {
- mSyncedFolder.setExisting(!mSyncedFolder.isExisting());
- mUploadExistingCheckbox.toggle();
- }
- });
+ binding.settingInstantUploadExistingContainer.setOnClickListener(
+ new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mSyncedFolder.setExisting(!mSyncedFolder.isExisting());
+ mUploadExistingCheckbox.toggle();
+ }
+ });
- view.findViewById(R.id.setting_instant_upload_path_use_subfolders_container).setOnClickListener(
- new OnClickListener() {
- @Override
- public void onClick(View v) {
- mSyncedFolder.setSubfolderByDate(!mSyncedFolder.isSubfolderByDate());
- mUploadUseSubfoldersCheckbox.toggle();
- }
- });
+ binding.settingInstantUploadPathUseSubfoldersContainer.setOnClickListener(
+ new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mSyncedFolder.setSubfolderByDate(!mSyncedFolder.isSubfolderByDate());
+ mUploadUseSubfoldersCheckbox.toggle();
+ }
+ });
- view.findViewById(R.id.remote_folder_container).setOnClickListener(v -> {
+ binding.remoteFolderContainer.setOnClickListener(v -> {
Intent action = new Intent(getActivity(), FolderPickerActivity.class);
getActivity().startActivityForResult(action, REQUEST_CODE__SELECT_REMOTE_FOLDER);
});
- view.findViewById(R.id.local_folder_container).setOnClickListener(v -> {
+ binding.localFolderContainer.setOnClickListener(v -> {
Intent action = new Intent(getActivity(), UploadFilesActivity.class);
action.putExtra(UploadFilesActivity.KEY_LOCAL_FOLDER_PICKER_MODE, true);
action.putExtra(REQUEST_CODE_KEY, REQUEST_CODE__SELECT_LOCAL_FOLDER);
getActivity().startActivityForResult(action, REQUEST_CODE__SELECT_LOCAL_FOLDER);
});
- view.findViewById(R.id.sync_enabled).setOnClickListener(new OnClickListener() {
+ binding.syncEnabled.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
setEnabled(!mSyncedFolder.isEnabled());
}
});
- view.findViewById(R.id.setting_instant_behaviour_container).setOnClickListener(
- new OnClickListener() {
- @Override
- public void onClick(View v) {
- showBehaviourDialog();
- }
- });
+ binding.settingInstantBehaviourContainer.setOnClickListener(
+ new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showBehaviourDialog();
+ }
+ });
- view.findViewById(R.id.setting_instant_name_collision_policy_container).setOnClickListener(
+ binding.settingInstantNameCollisionPolicyContainer.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
@@ -460,35 +430,38 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
}
private void showBehaviourDialog() {
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getActivity());
builder.setTitle(R.string.prefs_instant_behaviour_dialogTitle)
- .setSingleChoiceItems(getResources().getTextArray(R.array.pref_behaviour_entries),
- mSyncedFolder.getUploadActionInteger(),
- new
- DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- mSyncedFolder.setUploadAction(
- getResources().getTextArray(
- R.array.pref_behaviour_entryValues)[which].toString());
- mUploadBehaviorSummary.setText(SyncedFolderPreferencesDialogFragment
- .this.mUploadBehaviorItemStrings[which]);
- behaviourDialogShown = false;
- dialog.dismiss();
- }
- })
- .setOnCancelListener(new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- behaviourDialogShown = false;
- }
- });
+ .setSingleChoiceItems(getResources().getTextArray(R.array.pref_behaviour_entries),
+ mSyncedFolder.getUploadActionInteger(),
+ new
+ DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ mSyncedFolder.setUploadAction(
+ getResources().getTextArray(
+ R.array.pref_behaviour_entryValues)[which].toString());
+ mUploadBehaviorSummary.setText(SyncedFolderPreferencesDialogFragment
+ .this.mUploadBehaviorItemStrings[which]);
+ behaviourDialogShown = false;
+ dialog.dismiss();
+ }
+ })
+ .setOnCancelListener(new DialogInterface.OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ behaviourDialogShown = false;
+ }
+ });
behaviourDialogShown = true;
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(getActivity(), builder);
+
behaviourDialog = builder.create();
behaviourDialog.show();
}
private void showNameCollisionPolicyDialog() {
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getActivity());
builder.setTitle(R.string.pref_instant_name_collision_policy_dialogTitle)
.setSingleChoiceItems(getResources().getTextArray(R.array.pref_name_collision_policy_entries),
@@ -497,6 +470,9 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
.setOnCancelListener(dialog -> nameCollisionPolicyDialogShown = false);
nameCollisionPolicyDialogShown = true;
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(getActivity(), builder);
+
behaviourDialog = builder.create();
behaviourDialog.show();
}
@@ -504,9 +480,19 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
- final Dialog dialog = super.onCreateDialog(savedInstanceState);
- dialog.setTitle(null);
- return dialog;
+ Log_OC.d(TAG, "onCreateView, savedInstanceState is " + savedInstanceState);
+
+ binding = SyncedFoldersSettingsLayoutBinding.inflate(requireActivity().getLayoutInflater(), null, false);
+
+ setupDialogElements(binding);
+ setupListeners(binding);
+
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(binding.getRoot().getContext());
+ builder.setView(binding.getRoot());
+
+ viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.getRoot().getContext(), builder);
+
+ return builder.create();
}
@Override
@@ -534,14 +520,14 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
behaviourDialogShown = savedInstanceState != null &&
- savedInstanceState.getBoolean(BEHAVIOUR_DIALOG_STATE, false);
+ savedInstanceState.getBoolean(BEHAVIOUR_DIALOG_STATE, false);
nameCollisionPolicyDialogShown = savedInstanceState != null &&
savedInstanceState.getBoolean(NAME_COLLISION_POLICY_DIALOG_STATE, false);
if (behaviourDialogShown) {
showBehaviourDialog();
}
- if (nameCollisionPolicyDialogShown){
+ if (nameCollisionPolicyDialogShown) {
showNameCollisionPolicyDialog();
}
@@ -594,6 +580,7 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment implem
/**
* Get index for name collision selection dialog.
+ *
* @return 0 if ASK_USER, 1 if OVERWRITE, 2 if RENAME, 3 if SKIP, Otherwise: 0
*/
static private Integer getSelectionIndexForNameCollisionPolicy(NameCollisionPolicy nameCollisionPolicy) {
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java
index 233cc36b6b..93209f54a6 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java
@@ -68,10 +68,7 @@ import com.owncloud.android.ui.activity.UploadFilesActivity;
import com.owncloud.android.ui.adapter.LocalFileListAdapter;
import com.owncloud.android.ui.adapter.OCFileListAdapter;
import com.owncloud.android.ui.events.SearchEvent;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
-import com.owncloud.android.utils.theme.ThemeLayoutUtils;
-import com.owncloud.android.utils.theme.ThemeToolbarUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import org.greenrobot.eventbus.EventBus;
@@ -116,10 +113,8 @@ public class ExtendedListFragment extends Fragment implements
@Inject AppPreferences preferences;
@Inject UserAccountManager accountManager;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeLayoutUtils themeLayoutUtils;
- @Inject ThemeToolbarUtils themeToolbarUtils;
- @Inject ThemeDrawableUtils themeDrawableUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
+
private ScaleGestureDetector mScaleGestureDetector;
protected SwipeRefreshLayout mRefreshListLayout;
protected MaterialButton mSortButton;
@@ -183,13 +178,10 @@ public class ExtendedListFragment extends Fragment implements
public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) {
final MenuItem item = menu.findItem(R.id.action_search);
searchView = (SearchView) MenuItemCompat.getActionView(item);
+ viewThemeUtils.androidx.themeToolbarSearchView(searchView);
closeButton = searchView.findViewById(androidx.appcompat.R.id.search_close_btn);
searchView.setOnQueryTextListener(this);
searchView.setOnCloseListener(this);
- themeToolbarUtils.themeSearchView(searchView, requireContext());
-
- SearchView.SearchAutoComplete theTextArea = searchView.findViewById(R.id.search_src_text);
- theTextArea.setHighlightColor(themeColorUtils.primaryAccentColor(getContext()));
final Handler handler = new Handler();
@@ -347,11 +339,17 @@ public class ExtendedListFragment extends Fragment implements
// Pull-down to refresh layout
mRefreshListLayout = binding.swipeContainingList;
- themeLayoutUtils.colorSwipeRefreshLayout(getContext(), mRefreshListLayout);
+ viewThemeUtils.androidx.themeSwipeRefreshLayout(mRefreshListLayout);
mRefreshListLayout.setOnRefreshListener(this);
mSortButton = getActivity().findViewById(R.id.sort_button);
+ if (mSortButton != null) {
+ viewThemeUtils.material.colorMaterialTextButton(mSortButton);
+ }
mSwitchGridViewButton = getActivity().findViewById(R.id.switch_grid_view_button);
+ if (mSwitchGridViewButton != null) {
+ viewThemeUtils.material.colorMaterialTextButton(mSwitchGridViewButton);
+ }
return v;
}
@@ -587,8 +585,7 @@ public class ExtendedListFragment extends Fragment implements
if (tintIcon) {
if (getContext() != null) {
mEmptyListIcon.setImageDrawable(
- themeDrawableUtils.tintDrawable(icon,
- themeColorUtils.primaryColor(getContext(), true)));
+ viewThemeUtils.platform.tintPrimaryDrawable(getContext(), icon));
}
} else {
mEmptyListIcon.setImageResource(icon);
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FeatureFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/FeatureFragment.java
index 90de6aa4d7..4377b02b02 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/FeatureFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/FeatureFragment.java
@@ -1,6 +1,7 @@
package com.owncloud.android.ui.fragment;
import android.content.Context;
+import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
@@ -16,18 +17,19 @@ import android.widget.TextView;
import com.nextcloud.client.di.Injectable;
import com.owncloud.android.R;
import com.owncloud.android.features.FeatureItem;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.core.content.res.ResourcesCompat;
import androidx.fragment.app.Fragment;
public class FeatureFragment extends Fragment implements Injectable {
private FeatureItem item;
- @Inject ThemeDrawableUtils themeDrawableUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
static public FeatureFragment newInstance(FeatureItem item) {
FeatureFragment f = new FeatureFragment();
@@ -53,7 +55,8 @@ public class FeatureFragment extends Fragment implements Injectable {
ImageView whatsNewImage = view.findViewById(R.id.whatsNewImage);
if (item.shouldShowImage()) {
- whatsNewImage.setImageDrawable(themeDrawableUtils.tintDrawable(item.getImage(), fontColor));
+ final Drawable image = ResourcesCompat.getDrawable(getResources(), item.getImage(), null);
+ whatsNewImage.setImageDrawable(viewThemeUtils.platform.colorDrawable(image, fontColor));
}
TextView whatsNewTitle = view.findViewById(R.id.whatsNewTitle);
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java
index 19a2abc564..9c4865423a 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java
@@ -59,11 +59,7 @@ import com.owncloud.android.ui.helpers.FileOperationsHelper;
import com.owncloud.android.ui.interfaces.ActivityListInterface;
import com.owncloud.android.ui.interfaces.VersionListInterface;
import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
-import com.owncloud.android.utils.theme.ThemeLayoutUtils;
-import com.owncloud.android.utils.theme.ThemeTextInputUtils;
-import com.owncloud.android.utils.theme.ThemeToolbarUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import org.apache.commons.httpclient.HttpStatus;
import org.greenrobot.eventbus.EventBus;
@@ -114,11 +110,7 @@ public class FileDetailActivitiesFragment extends Fragment implements
@Inject UserAccountManager accountManager;
@Inject ClientFactory clientFactory;
@Inject ContentResolver contentResolver;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeLayoutUtils themeLayoutUtils;
- @Inject ThemeToolbarUtils themeToolbarUtils;
- @Inject ThemeDrawableUtils themeDrawableUtils;
- @Inject ThemeTextInputUtils themeTextInputUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
public static FileDetailActivitiesFragment newInstance(OCFile file, User user) {
FileDetailActivitiesFragment fragment = new FileDetailActivitiesFragment();
@@ -151,8 +143,8 @@ public class FileDetailActivitiesFragment extends Fragment implements
setupView();
- themeLayoutUtils.colorSwipeRefreshLayout(getContext(), binding.swipeContainingEmpty);
- themeLayoutUtils.colorSwipeRefreshLayout(getContext(), binding.swipeContainingList);
+ viewThemeUtils.androidx.themeSwipeRefreshLayout(binding.swipeContainingEmpty);
+ viewThemeUtils.androidx.themeSwipeRefreshLayout(binding.swipeContainingList);
fetchAndSetData(-1);
@@ -183,10 +175,7 @@ public class FileDetailActivitiesFragment extends Fragment implements
binding.submitComment.setOnClickListener(v -> submitComment());
- themeTextInputUtils.colorTextInput(binding.commentInputFieldContainer,
- binding.commentInputField,
- themeColorUtils.primaryColor(getContext()),
- themeColorUtils.primaryAccentColor(getContext()));
+ viewThemeUtils.material.colorTextInputLayout(binding.commentInputFieldContainer);
DisplayUtils.setAvatar(user,
this,
@@ -245,8 +234,7 @@ public class FileDetailActivitiesFragment extends Fragment implements
this,
this,
clientFactory,
- themeColorUtils,
- themeDrawableUtils
+ viewThemeUtils
);
binding.list.setAdapter(adapter);
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java
index 5ee810c876..bb49671fef 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java
@@ -72,9 +72,7 @@ import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
import com.owncloud.android.ui.events.FavoriteEvent;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.MimeTypeUtil;
-import com.owncloud.android.utils.theme.ThemeBarUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeLayoutUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@@ -116,9 +114,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener,
@Inject UserAccountManager accountManager;
@Inject ClientFactory clientFactory;
@Inject FileDataStorageManager storageManager;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeLayoutUtils themeLayoutUtils;
- @Inject ThemeBarUtils themeBarUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
@Inject BackgroundJobManager backgroundJobManager;
/**
@@ -233,7 +229,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener,
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
if (getFile() != null && user != null) {
- themeBarUtils.colorHorizontalProgressBar(binding.progressBar, themeColorUtils.primaryAccentColor(getContext()));
+ viewThemeUtils.platform.themeHorizontalProgressBar(binding.progressBar);
progressListener = new ProgressListener(binding.progressBar);
binding.cancelBtn.setOnClickListener(this);
binding.favorite.setOnClickListener(this);
@@ -257,7 +253,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener,
binding.tabLayout.removeAllTabs();
binding.tabLayout.addTab(binding.tabLayout.newTab().setText(R.string.drawer_item_activities).setIcon(R.drawable.ic_activity));
- themeLayoutUtils.colorTabLayout(getContext().getApplicationContext(), binding.tabLayout);
+ viewThemeUtils.material.themeTabLayout(binding.tabLayout);
if (!getFile().isEncrypted()) {
binding.tabLayout.addTab(binding.tabLayout.newTab().setText(R.string.share_dialog_title).setIcon(R.drawable.shared_via_users));
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java
index 446b2b634c..f67dd70993 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java
@@ -61,11 +61,7 @@ import com.owncloud.android.ui.fragment.util.FileDetailSharingFragmentHelper;
import com.owncloud.android.ui.helpers.FileOperationsHelper;
import com.owncloud.android.utils.ClipboardUtil;
import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeAvatarUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
-import com.owncloud.android.utils.theme.ThemeToolbarUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.ArrayList;
import java.util.List;
@@ -101,11 +97,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
@Inject UserAccountManager accountManager;
@Inject ClientFactory clientFactory;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeToolbarUtils themeToolbarUtils;
- @Inject ThemeSnackbarUtils themeSnackbarUtils;
- @Inject ThemeDrawableUtils themeDrawableUtils;
- @Inject ThemeAvatarUtils themeAvatarUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
public static FileDetailSharingFragment newInstance(OCFile file, User user) {
FileDetailSharingFragment fragment = new FileDetailSharingFragment();
@@ -171,8 +163,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
this,
userId,
user,
- themeColorUtils,
- themeAvatarUtils));
+ viewThemeUtils));
binding.sharesList.setLayoutManager(new LinearLayoutManager(getContext()));
setupView();
@@ -206,7 +197,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
(SearchManager) fileActivity.getSystemService(Context.SEARCH_SERVICE),
binding.searchView,
fileActivity.getComponentName());
- themeToolbarUtils.themeSearchView(binding.searchView, requireContext());
+ viewThemeUtils.androidx.themeToolbarSearchView(binding.searchView);
if (file.canReshare()) {
binding.searchView.setQueryHint(getResources().getString(R.string.share_search));
@@ -289,7 +280,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
private void showSendLinkTo(OCShare publicShare) {
if (file.isSharedViaLink()) {
if (TextUtils.isEmpty(publicShare.getShareLink())) {
- fileOperationsHelper.getFileWithLink(file, themeSnackbarUtils);
+ fileOperationsHelper.getFileWithLink(file, viewThemeUtils);
} else {
FileDisplayActivity.showShareLinkDialog(fileActivity, file, publicShare.getShareLink());
}
@@ -299,7 +290,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
public void copyLink(OCShare share) {
if (file.isSharedViaLink()) {
if (TextUtils.isEmpty(share.getShareLink())) {
- fileOperationsHelper.getFileWithLink(file, themeSnackbarUtils);
+ fileOperationsHelper.getFileWithLink(file, viewThemeUtils);
} else {
ClipboardUtil.copyToClipboard(getActivity(), share.getShareLink());
}
@@ -314,7 +305,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
@Override
@VisibleForTesting
public void showSharingMenuActionSheet(OCShare share) {
- new FileDetailSharingMenuBottomSheetDialog(fileActivity, this, share).show();
+ new FileDetailSharingMenuBottomSheetDialog(fileActivity, this, share, viewThemeUtils).show();
}
/**
@@ -324,7 +315,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
*/
@Override
public void showPermissionsDialog(OCShare share) {
- new QuickSharingPermissionsBottomSheetDialog(fileActivity, this, share).show();
+ new QuickSharingPermissionsBottomSheetDialog(fileActivity, this, share, viewThemeUtils).show();
}
/**
@@ -395,8 +386,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
shareWith,
fileActivity,
clientFactory,
- themeColorUtils,
- themeDrawableUtils).execute();
+ viewThemeUtils).execute();
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingMenuBottomSheetDialog.java b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingMenuBottomSheetDialog.java
index 83dd05421a..aea75ca074 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingMenuBottomSheetDialog.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingMenuBottomSheetDialog.java
@@ -31,6 +31,7 @@ import com.owncloud.android.databinding.FileDetailsSharingMenuBottomSheetFragmen
import com.owncloud.android.lib.resources.shares.OCShare;
import com.owncloud.android.lib.resources.shares.ShareType;
import com.owncloud.android.ui.activity.FileActivity;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
/**
* File Details Sharing option menus {@link android.app.Dialog} styled as a bottom sheet for main actions.
@@ -39,13 +40,16 @@ public class FileDetailSharingMenuBottomSheetDialog extends BottomSheetDialog {
private FileDetailsSharingMenuBottomSheetFragmentBinding binding;
private final FileDetailsSharingMenuBottomSheetActions actions;
private final OCShare ocShare;
+ private final ViewThemeUtils viewThemeUtils;
public FileDetailSharingMenuBottomSheetDialog(FileActivity fileActivity,
FileDetailsSharingMenuBottomSheetActions actions,
- OCShare ocShare) {
+ OCShare ocShare,
+ ViewThemeUtils viewThemeUtils) {
super(fileActivity);
this.actions = actions;
this.ocShare = ocShare;
+ this.viewThemeUtils = viewThemeUtils;
}
@Override
@@ -58,6 +62,14 @@ public class FileDetailSharingMenuBottomSheetDialog extends BottomSheetDialog {
getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
+ viewThemeUtils.platform.themeDialog(binding.getRoot());
+
+ viewThemeUtils.platform.colorImageView(binding.menuIconAddAnotherLink);
+ viewThemeUtils.platform.colorImageView(binding.menuIconAdvancedPermissions);
+ viewThemeUtils.platform.colorImageView(binding.menuIconSendLink);
+ viewThemeUtils.platform.colorImageView(binding.menuIconUnshare);
+ viewThemeUtils.platform.colorImageView(binding.menuIconSendNewEmail);
+
updateUI();
setupClickListener();
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt
index 9c07c757cb..e3be7adefd 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt
@@ -29,6 +29,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
+import com.nextcloud.client.di.Injectable
import com.owncloud.android.R
import com.owncloud.android.databinding.FileDetailsSharingProcessFragmentBinding
import com.owncloud.android.datamodel.OCFile
@@ -41,8 +42,10 @@ import com.owncloud.android.ui.fragment.util.SharingMenuHelper
import com.owncloud.android.ui.helpers.FileOperationsHelper
import com.owncloud.android.utils.ClipboardUtil
import com.owncloud.android.utils.DisplayUtils
+import com.owncloud.android.utils.theme.ViewThemeUtils
import java.text.SimpleDateFormat
import java.util.Date
+import javax.inject.Inject
/**
* Fragment class to show share permission options, set expiration date, change label, set password, send note
@@ -53,7 +56,10 @@ import java.util.Date
* 2. This will handle both Advanced Permissions and Send New Email functionality for existing shares to modify them.
*/
@Suppress("TooManyFunctions")
-class FileDetailsSharingProcessFragment : Fragment(), ExpirationDatePickerDialogFragment.OnExpiryDateListener {
+class FileDetailsSharingProcessFragment :
+ Fragment(),
+ Injectable,
+ ExpirationDatePickerDialogFragment.OnExpiryDateListener {
companion object {
const val TAG = "FileDetailsSharingProcessFragment"
@@ -100,6 +106,9 @@ class FileDetailsSharingProcessFragment : Fragment(), ExpirationDatePickerDialog
}
}
+ @Inject
+ lateinit var viewThemeUtils: ViewThemeUtils
+
private lateinit var onEditShareListener: FileDetailSharingFragment.OnEditShareListener
private lateinit var binding: FileDetailsSharingProcessFragmentBinding
@@ -164,6 +173,31 @@ class FileDetailsSharingProcessFragment : Fragment(), ExpirationDatePickerDialog
showShareProcessSecond()
}
implementClickEvents()
+
+ themeView()
+ }
+
+ private fun themeView() {
+ viewThemeUtils.platform.colorPrimaryTextViewElement(binding.shareProcessEditShareLink)
+ viewThemeUtils.platform.colorPrimaryTextViewElement(binding.shareProcessAdvancePermissionTitle)
+
+ viewThemeUtils.platform.themeRadioButton(binding.shareProcessPermissionReadOnly)
+ viewThemeUtils.platform.themeRadioButton(binding.shareProcessPermissionUploadEditing)
+ viewThemeUtils.platform.themeRadioButton(binding.shareProcessPermissionFileDrop)
+
+ viewThemeUtils.platform.themeCheckbox(binding.shareProcessAllowResharingCheckbox)
+
+ viewThemeUtils.androidx.colorSwitchCompat(binding.shareProcessSetPasswordSwitch)
+ viewThemeUtils.androidx.colorSwitchCompat(binding.shareProcessSetExpDateSwitch)
+ viewThemeUtils.androidx.colorSwitchCompat(binding.shareProcessHideDownloadCheckbox)
+ viewThemeUtils.androidx.colorSwitchCompat(binding.shareProcessChangeNameSwitch)
+
+ viewThemeUtils.material.colorTextInputLayout(binding.shareProcessEnterPasswordContainer)
+ viewThemeUtils.material.colorTextInputLayout(binding.shareProcessChangeNameContainer)
+ viewThemeUtils.material.colorTextInputLayout(binding.noteContainer)
+
+ viewThemeUtils.material.colorMaterialButtonPrimaryFilled(binding.shareProcessBtnNext)
+ viewThemeUtils.material.colorMaterialButtonPrimaryOutlined(binding.shareProcessBtnCancel)
}
override fun onConfigurationChanged(newConfig: Configuration) {
@@ -251,7 +285,7 @@ class FileDetailsSharingProcessFragment : Fragment(), ExpirationDatePickerDialog
// external share
if (shareType == ShareType.EMAIL) {
binding.shareProcessChangeNameSwitch.visibility = View.GONE
- binding.shareProcessChangeNameEt.visibility = View.GONE
+ binding.shareProcessChangeNameContainer.visibility = View.GONE
updateViewForExternalAndLinkShare()
}
// link share
@@ -259,7 +293,7 @@ class FileDetailsSharingProcessFragment : Fragment(), ExpirationDatePickerDialog
updateViewForExternalAndLinkShare()
binding.shareProcessChangeNameSwitch.visibility = View.VISIBLE
if (share != null) {
- binding.shareProcessChangeNameEt.setText(share?.label)
+ binding.shareProcessChangeName.setText(share?.label)
binding.shareProcessChangeNameSwitch.isChecked = !TextUtils.isEmpty(share?.label)
}
showChangeNameInput(binding.shareProcessChangeNameSwitch.isChecked)
@@ -267,7 +301,7 @@ class FileDetailsSharingProcessFragment : Fragment(), ExpirationDatePickerDialog
// internal share
else {
binding.shareProcessChangeNameSwitch.visibility = View.GONE
- binding.shareProcessChangeNameEt.visibility = View.GONE
+ binding.shareProcessChangeNameContainer.visibility = View.GONE
binding.shareProcessHideDownloadCheckbox.visibility = View.GONE
binding.shareProcessAllowResharingCheckbox.visibility = View.VISIBLE
binding.shareProcessSetPasswordSwitch.visibility = View.GONE
@@ -383,9 +417,9 @@ class FileDetailsSharingProcessFragment : Fragment(), ExpirationDatePickerDialog
}
private fun showChangeNameInput(isChecked: Boolean) {
- binding.shareProcessChangeNameEt.visibility = if (isChecked) View.VISIBLE else View.GONE
+ binding.shareProcessChangeNameContainer.visibility = if (isChecked) View.VISIBLE else View.GONE
if (!isChecked) {
- binding.shareProcessChangeNameEt.setText("")
+ binding.shareProcessChangeName.setText("")
}
}
@@ -417,7 +451,7 @@ class FileDetailsSharingProcessFragment : Fragment(), ExpirationDatePickerDialog
}
private fun showPasswordInput(isChecked: Boolean) {
- binding.shareProcessEnterPassword.visibility = if (isChecked) View.VISIBLE else View.GONE
+ binding.shareProcessEnterPasswordContainer.visibility = if (isChecked) View.VISIBLE else View.GONE
// reset the password if switch is unchecked
if (!isChecked) {
@@ -462,7 +496,7 @@ class FileDetailsSharingProcessFragment : Fragment(), ExpirationDatePickerDialog
}
if (binding.shareProcessChangeNameSwitch.isChecked &&
- binding.shareProcessChangeNameEt.text?.trim().isNullOrEmpty()
+ binding.shareProcessChangeName.text?.trim().isNullOrEmpty()
) {
DisplayUtils.showSnackMessage(binding.root, R.string.label_empty)
return
@@ -499,7 +533,7 @@ class FileDetailsSharingProcessFragment : Fragment(), ExpirationDatePickerDialog
binding.shareProcessHideDownloadCheckbox.isChecked,
binding.shareProcessEnterPassword.text.toString().trim(),
chosenExpDateInMills,
- binding.shareProcessChangeNameEt.text.toString().trim()
+ binding.shareProcessChangeName.text.toString().trim()
)
// copy the share link if available
if (!TextUtils.isEmpty(share?.shareLink)) {
@@ -527,7 +561,7 @@ class FileDetailsSharingProcessFragment : Fragment(), ExpirationDatePickerDialog
binding.shareProcessEnterPassword.text.toString().trim(),
chosenExpDateInMills,
noteText,
- binding.shareProcessChangeNameEt.text.toString().trim()
+ binding.shareProcessChangeName.text.toString().trim()
)
}
removeCurrentFragment()
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.java
index 03637712db..cacaca6a4c 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.java
@@ -34,7 +34,7 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
-import com.nextcloud.utils.view.FastScroll;
+import com.nextcloud.utils.view.FastScrollUtils;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
@@ -47,7 +47,6 @@ import com.owncloud.android.ui.adapter.GalleryAdapter;
import com.owncloud.android.ui.asynctasks.GallerySearchTask;
import com.owncloud.android.ui.events.ChangeMenuEvent;
import com.owncloud.android.ui.fragment.util.GalleryFastScrollViewHelper;
-import com.owncloud.android.utils.theme.ThemeMenuUtils;
import javax.inject.Inject;
@@ -74,8 +73,8 @@ public class GalleryFragment extends OCFileListFragment implements GalleryFragme
private OCFile remoteFile;
private GalleryFragmentBottomSheetDialog galleryFragmentBottomSheetDialog;
- @Inject ThemeMenuUtils themeMenuUtils;
@Inject FileDataStorageManager fileDataStorageManager;
+ @Inject FastScrollUtils fastScrollUtils;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -139,8 +138,7 @@ public class GalleryFragment extends OCFileListFragment implements GalleryFragme
this,
preferences,
mContainerActivity,
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
setRecyclerViewAdapter(mAdapter);
@@ -149,11 +147,9 @@ public class GalleryFragment extends OCFileListFragment implements GalleryFragme
mAdapter.setLayoutManager(layoutManager);
getRecyclerView().setLayoutManager(layoutManager);
- FastScroll.applyFastScroll(requireContext(),
- themeColorUtils,
- themeDrawableUtils,
- getRecyclerView(),
- new GalleryFastScrollViewHelper(getRecyclerView(), mAdapter));
+ fastScrollUtils.applyFastScroll(
+ getRecyclerView(),
+ new GalleryFastScrollViewHelper(getRecyclerView(), mAdapter));
}
@Override
@@ -252,8 +248,7 @@ public class GalleryFragment extends OCFileListFragment implements GalleryFragme
MenuItem menuItem = menu.findItem(R.id.action_three_dot_icon);
if (menuItem != null) {
- themeMenuUtils.tintMenuIcon(menuItem,
- themeColorUtils.appBarPrimaryFontColor(requireContext()));
+ viewThemeUtils.platform.colorMenuItemText(requireContext(), menuItem);
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragmentBottomSheetDialog.kt b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragmentBottomSheetDialog.kt
index d1fb2f84bb..1199018795 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragmentBottomSheetDialog.kt
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragmentBottomSheetDialog.kt
@@ -26,11 +26,17 @@ import android.view.View
import android.view.ViewGroup
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
+import com.nextcloud.client.di.Injectable
import com.owncloud.android.databinding.FragmentGalleryBottomSheetBinding
+import com.owncloud.android.utils.theme.ViewThemeUtils
+import javax.inject.Inject
class GalleryFragmentBottomSheetDialog(
private val actions: GalleryFragmentBottomSheetActions
-) : BottomSheetDialogFragment() {
+) : BottomSheetDialogFragment(), Injectable {
+ @Inject
+ lateinit var viewThemeUtils: ViewThemeUtils
+
private lateinit var binding: FragmentGalleryBottomSheetBinding
private lateinit var mBottomBehavior: BottomSheetBehavior<*>
private var currentMediaState: MediaState = MediaState.MEDIA_STATE_DEFAULT
@@ -52,7 +58,17 @@ class GalleryFragmentBottomSheetDialog(
mBottomBehavior.state = BottomSheetBehavior.STATE_EXPANDED
}
- private fun setupLayout() {
+ fun setupLayout() {
+ listOf(
+ binding.tickMarkShowImages,
+ binding.tickMarkShowVideo,
+ binding.hideImagesImageview,
+ binding.hideVideoImageView,
+ binding.selectMediaFolderImageView
+ ).forEach {
+ viewThemeUtils.platform.colorImageView(it)
+ }
+
when (currentMediaState) {
MediaState.MEDIA_STATE_PHOTOS_ONLY -> {
binding.tickMarkShowImages.visibility = View.VISIBLE
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java
index 8d8bfa0881..db5e8dc4a4 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java
@@ -135,8 +135,7 @@ public class LocalFileListFragment extends ExtendedListFragment implements
this,
preferences,
getActivity(),
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
setRecyclerViewAdapter(mAdapter);
listDirectory(mContainerActivity.getInitialDirectory());
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.java
index 741c09cb0c..6db23e9a8b 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.java
@@ -22,9 +22,7 @@ package com.owncloud.android.ui.fragment;
import android.os.Bundle;
import android.view.View;
-import android.view.ViewGroup;
-import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.gson.Gson;
import com.nextcloud.client.account.User;
@@ -42,11 +40,8 @@ import com.owncloud.android.lib.resources.status.OCCapability;
import com.owncloud.android.ui.activity.AppScanActivity;
import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.utils.MimeTypeUtil;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
import com.owncloud.android.utils.theme.ThemeUtils;
-
-import javax.inject.Inject;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
/**
* FAB menu {@link android.app.Dialog} styled as a bottom sheet for main actions.
@@ -59,9 +54,8 @@ public class OCFileListBottomSheetDialog extends BottomSheetDialog implements In
private final DeviceInfo deviceInfo;
private final User user;
private final OCFile file;
- private final ThemeColorUtils themeColorUtils;
private final ThemeUtils themeUtils;
- private final ThemeDrawableUtils themeDrawableUtils;
+ private final ViewThemeUtils viewThemeUtils;
public OCFileListBottomSheetDialog(FileActivity fileActivity,
@@ -69,18 +63,16 @@ public class OCFileListBottomSheetDialog extends BottomSheetDialog implements In
DeviceInfo deviceInfo,
User user,
OCFile file,
- ThemeColorUtils themeColorUtils,
ThemeUtils themeUtils,
- ThemeDrawableUtils themeDrawableUtils) {
+ ViewThemeUtils viewThemeUtils) {
super(fileActivity);
this.actions = actions;
this.fileActivity = fileActivity;
this.deviceInfo = deviceInfo;
this.user = user;
this.file = file;
- this.themeColorUtils = themeColorUtils;
this.themeUtils = themeUtils;
- this.themeDrawableUtils = themeDrawableUtils;
+ this.viewThemeUtils = viewThemeUtils;
}
@Override
@@ -89,15 +81,12 @@ public class OCFileListBottomSheetDialog extends BottomSheetDialog implements In
binding = FileListActionsBottomSheetFragmentBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
- if (getWindow() != null) {
- getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
- }
-
- int primaryColor = themeColorUtils.primaryColor(getContext(), true);
- themeDrawableUtils.tintDrawable(binding.menuIconUploadFiles.getDrawable(), primaryColor);
- themeDrawableUtils.tintDrawable(binding.menuIconUploadFromApp.getDrawable(), primaryColor);
- themeDrawableUtils.tintDrawable(binding.menuIconDirectCameraUpload.getDrawable(), primaryColor);
- themeDrawableUtils.tintDrawable(binding.menuIconMkdir.getDrawable(), primaryColor);
+ viewThemeUtils.platform.colorImageView(binding.menuIconUploadFiles);
+ viewThemeUtils.platform.colorImageView(binding.menuIconUploadFromApp);
+ viewThemeUtils.platform.colorImageView(binding.menuIconDirectCameraUpload);
+ viewThemeUtils.platform.colorImageView(binding.menuIconScanDocUpload);
+ viewThemeUtils.platform.colorImageView(binding.menuIconMkdir);
+ viewThemeUtils.platform.colorImageView(binding.menuIconAddFolderInfo);
binding.addToCloud.setText(getContext().getResources().getString(R.string.add_to_cloud,
themeUtils.getDefaultDisplayNameForRootFolder(getContext())));
@@ -135,10 +124,8 @@ public class OCFileListBottomSheetDialog extends BottomSheetDialog implements In
creatorViewBinding.creatorThumbnail.setImageDrawable(
MimeTypeUtil.getFileTypeIcon(creator.getMimetype(),
creator.getExtension(),
- user,
- getContext(),
- themeColorUtils,
- themeDrawableUtils));
+ creatorViewBinding.creatorThumbnail.getContext(),
+ viewThemeUtils));
creatorView.setOnClickListener(v -> {
actions.showTemplate(creator, creatorViewBinding.creatorName.getText().toString());
@@ -165,19 +152,17 @@ public class OCFileListBottomSheetDialog extends BottomSheetDialog implements In
// != "": info set -> hide button
if (file.getRichWorkspace() == null || !"".equals(file.getRichWorkspace())) {
binding.menuCreateRichWorkspace.setVisibility(View.GONE);
+ binding.menuCreateRichWorkspaceDivider.setVisibility(View.GONE);
} else {
binding.menuCreateRichWorkspace.setVisibility(View.VISIBLE);
+ binding.menuCreateRichWorkspaceDivider.setVisibility(View.VISIBLE);
}
} else {
binding.menuCreateRichWorkspace.setVisibility(View.GONE);
+ binding.menuCreateRichWorkspaceDivider.setVisibility(View.GONE);
}
setupClickListener();
-
- setOnShowListener(d ->
- BottomSheetBehavior.from((View) binding.getRoot().getParent())
- .setPeekHeight(binding.getRoot().getMeasuredHeight())
- );
}
private void setupClickListener() {
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialogFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialogFragment.kt
index 810f9ed8e4..e9c6646cf4 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialogFragment.kt
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialogFragment.kt
@@ -29,9 +29,8 @@ import com.nextcloud.client.device.DeviceInfo
import com.nextcloud.client.di.Injectable
import com.owncloud.android.datamodel.OCFile
import com.owncloud.android.ui.activity.FileActivity
-import com.owncloud.android.utils.theme.ThemeColorUtils
-import com.owncloud.android.utils.theme.ThemeDrawableUtils
import com.owncloud.android.utils.theme.ThemeUtils
+import com.owncloud.android.utils.theme.ViewThemeUtils
import javax.inject.Inject
class OCFileListBottomSheetDialogFragment(
@@ -42,14 +41,11 @@ class OCFileListBottomSheetDialogFragment(
private val file: OCFile
) : DialogFragment(), Injectable {
- @Inject
- lateinit var themeColorUtils: ThemeColorUtils
-
@Inject
lateinit var themeUtils: ThemeUtils
@Inject
- lateinit var themeDrawableUtils: ThemeDrawableUtils
+ lateinit var viewThemeUtils: ViewThemeUtils
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return OCFileListBottomSheetDialog(
@@ -58,9 +54,8 @@ class OCFileListBottomSheetDialogFragment(
deviceInfo,
user,
file,
- themeColorUtils,
themeUtils,
- themeDrawableUtils
+ viewThemeUtils
)
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
index a188cddbfd..931fae53a1 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
@@ -27,7 +27,6 @@ package com.owncloud.android.ui.fragment;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
-import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
@@ -43,7 +42,6 @@ import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.Toast;
-import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.behavior.HideBottomViewOnScrollBehavior;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
@@ -60,7 +58,7 @@ import com.nextcloud.client.network.ClientFactory;
import com.nextcloud.client.preferences.AppPreferences;
import com.nextcloud.client.utils.Throttler;
import com.nextcloud.common.NextcloudClient;
-import com.nextcloud.utils.view.FastScroll;
+import com.nextcloud.utils.view.FastScrollUtils;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.ArbitraryDataProvider;
@@ -109,11 +107,8 @@ import com.owncloud.android.utils.EncryptionUtils;
import com.owncloud.android.utils.FileSortOrder;
import com.owncloud.android.utils.FileStorageUtils;
import com.owncloud.android.utils.MimeTypeUtil;
-import com.owncloud.android.utils.theme.ThemeAvatarUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeFabUtils;
-import com.owncloud.android.utils.theme.ThemeToolbarUtils;
import com.owncloud.android.utils.theme.ThemeUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import org.apache.commons.httpclient.HttpStatus;
import org.greenrobot.eventbus.EventBus;
@@ -135,6 +130,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.ActionBar;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
+import androidx.core.content.ContextCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.GridLayoutManager;
@@ -195,13 +191,11 @@ public class OCFileListFragment extends ExtendedListFragment implements
@Inject UserAccountManager accountManager;
@Inject ClientFactory clientFactory;
@Inject Throttler throttler;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeFabUtils themeFabUtils;
- @Inject ThemeToolbarUtils themeToolbarUtils;
@Inject ThemeUtils themeUtils;
- @Inject ThemeAvatarUtils themeAvatarUtils;
@Inject ArbitraryDataProvider arbitraryDataProvider;
@Inject BackgroundJobManager backgroundJobManager;
+ @Inject ViewThemeUtils viewThemeUtils;
+ @Inject FastScrollUtils fastScrollUtils;
protected FileFragment.ContainerActivity mContainerActivity;
@@ -321,7 +315,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
mFabMain = requireActivity().findViewById(R.id.fab_main);
if (mFabMain != null) { // is not available in FolderPickerActivity
- themeFabUtils.colorFloatingActionButton(mFabMain, R.drawable.ic_plus, requireContext());
+ viewThemeUtils.material.themeFAB(mFabMain);
}
Log_OC.i(TAG, "onCreateView() end");
@@ -426,14 +420,12 @@ public class OCFileListFragment extends ExtendedListFragment implements
this,
hideItemOptions,
isGridViewPreferred(mFile),
- themeColorUtils,
- themeDrawableUtils,
- themeAvatarUtils
+ viewThemeUtils
);
setRecyclerViewAdapter(mAdapter);
- FastScroll.applyFastScroll(requireContext(), themeColorUtils, themeDrawableUtils, getRecyclerView());
+ fastScrollUtils.applyFastScroll(getRecyclerView());
}
protected void prepareCurrentSearch(SearchEvent event) {
@@ -472,7 +464,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
FileActivity activity = (FileActivity) getActivity();
if (mFabMain != null) { // is not available in FolderPickerActivity
- themeFabUtils.colorFloatingActionButton(mFabMain, R.drawable.ic_plus, requireContext());
+ viewThemeUtils.material.themeFAB(mFabMain);
mFabMain.setOnClickListener(v -> {
final OCFileListBottomSheetDialogFragment dialog =
new OCFileListBottomSheetDialogFragment(activity,
@@ -723,7 +715,9 @@ public class OCFileListFragment extends ExtendedListFragment implements
mode.invalidate();
//set actionMode color
- themeToolbarUtils.colorStatusBar(getActivity(), themeColorUtils.actionModeColor(requireContext()));
+ viewThemeUtils.platform.colorStatusBar(
+ getActivity(),
+ ContextCompat.getColor(getContext(), R.color.action_mode_background));
// hide FAB in multi selection mode
setFabVisible(false);
@@ -784,6 +778,11 @@ public class OCFileListFragment extends ExtendedListFragment implements
setFabVisible(true);
}
+ Activity activity = getActivity();
+ if (activity != null) {
+ viewThemeUtils.platform.resetStatusBar(activity);
+ }
+
getCommonAdapter().setMultiSelect(false);
getCommonAdapter().clearCheckedItems();
}
@@ -1743,10 +1742,11 @@ public class OCFileListFragment extends ExtendedListFragment implements
protected void setTitle(final String title) {
getActivity().runOnUiThread(() -> {
if (getActivity() != null) {
- ActionBar actionBar = ((FileDisplayActivity) getActivity()).getSupportActionBar();
+ final ActionBar actionBar = ((FileDisplayActivity) getActivity()).getSupportActionBar();
+ final Context context = getContext();
- if (actionBar != null) {
- themeToolbarUtils.setColoredTitle(actionBar, title, getContext());
+ if (actionBar != null && context != null) {
+ viewThemeUtils.files.themeActionBar(context, actionBar, title);
}
}
});
@@ -1871,7 +1871,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
getActivity().runOnUiThread(() -> {
if (visible) {
mFabMain.show();
- themeFabUtils.colorFloatingActionButton(mFabMain, requireContext());
+ viewThemeUtils.material.themeFAB(mFabMain);
} else {
mFabMain.hide();
}
@@ -1921,10 +1921,10 @@ public class OCFileListFragment extends ExtendedListFragment implements
getActivity().runOnUiThread(() -> {
if (enabled) {
mFabMain.setEnabled(true);
- themeFabUtils.colorFloatingActionButton(mFabMain, requireContext());
+ viewThemeUtils.material.themeFAB(mFabMain);
} else {
mFabMain.setEnabled(false);
- themeFabUtils.colorFloatingActionButton(mFabMain, requireContext(), Color.GRAY);
+ viewThemeUtils.material.themeFAB(mFabMain);
}
});
}
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/ProfileBottomSheetDialog.kt b/app/src/main/java/com/owncloud/android/ui/fragment/ProfileBottomSheetDialog.kt
index b1fb38d25e..564773e90c 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/ProfileBottomSheetDialog.kt
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/ProfileBottomSheetDialog.kt
@@ -39,8 +39,7 @@ import com.owncloud.android.R
import com.owncloud.android.databinding.ProfileBottomSheetActionBinding
import com.owncloud.android.databinding.ProfileBottomSheetFragmentBinding
import com.owncloud.android.utils.DisplayUtils
-import com.owncloud.android.utils.theme.ThemeColorUtils
-import com.owncloud.android.utils.theme.ThemeDrawableUtils
+import com.owncloud.android.utils.theme.ViewThemeUtils
/**
* Show actions of an user
@@ -49,8 +48,7 @@ class ProfileBottomSheetDialog(
private val fileActivity: FragmentActivity,
private val user: User,
private val hoverCard: HoverCard,
- private val themeColorUtils: ThemeColorUtils,
- private val themeDrawableUtils: ThemeDrawableUtils
+ private val viewThemeUtils: ViewThemeUtils
) : BottomSheetDialog(fileActivity), DisplayUtils.AvatarGenerationListener {
private var _binding: ProfileBottomSheetFragmentBinding? = null
@@ -64,7 +62,8 @@ class ProfileBottomSheetDialog(
if (window != null) {
window!!.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
}
- val primaryColor = themeColorUtils.primaryColor(context, true)
+
+ viewThemeUtils.platform.themeDialog(binding.root)
binding.icon.tag = hoverCard.userId
DisplayUtils.setAvatar(
@@ -106,7 +105,7 @@ class ProfileBottomSheetDialog(
null
)
)
- themeDrawableUtils.tintDrawable(actionBinding.icon.drawable, primaryColor)
+ viewThemeUtils.platform.tintPrimaryDrawable(context, actionBinding.icon.drawable)
creatorView.setOnClickListener { v: View? ->
send(hoverCard.userId, action)
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/QuickSharingPermissionsBottomSheetDialog.java b/app/src/main/java/com/owncloud/android/ui/fragment/QuickSharingPermissionsBottomSheetDialog.java
index 2725f047c6..0e337dbdd3 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/QuickSharingPermissionsBottomSheetDialog.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/QuickSharingPermissionsBottomSheetDialog.java
@@ -34,6 +34,7 @@ import com.owncloud.android.lib.resources.shares.OCShare;
import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.ui.adapter.QuickSharingPermissionsAdapter;
import com.owncloud.android.ui.fragment.util.SharingMenuHelper;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.ArrayList;
import java.util.List;
@@ -53,14 +54,17 @@ public class QuickSharingPermissionsBottomSheetDialog extends BottomSheetDialog
private final QuickPermissionSharingBottomSheetActions actions;
private final FileActivity fileActivity;
private final OCShare ocShare;
+ private final ViewThemeUtils viewThemeUtils;
public QuickSharingPermissionsBottomSheetDialog(FileActivity fileActivity,
QuickPermissionSharingBottomSheetActions actions,
- OCShare ocShare) {
+ OCShare ocShare,
+ ViewThemeUtils viewThemeUtils) {
super(fileActivity);
this.actions = actions;
this.ocShare = ocShare;
this.fileActivity = fileActivity;
+ this.viewThemeUtils = viewThemeUtils;
}
@Override
@@ -73,6 +77,8 @@ public class QuickSharingPermissionsBottomSheetDialog extends BottomSheetDialog
getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
+ viewThemeUtils.platform.themeDialog(binding.getRoot());
+
setUpRecyclerView();
setOnShowListener(d ->
BottomSheetBehavior.from((View) binding.getRoot().getParent())
@@ -82,17 +88,21 @@ public class QuickSharingPermissionsBottomSheetDialog extends BottomSheetDialog
private void setUpRecyclerView() {
List quickPermissionModelList = getQuickPermissionList();
- QuickSharingPermissionsAdapter adapter = new QuickSharingPermissionsAdapter(quickPermissionModelList, new QuickSharingPermissionsAdapter.QuickSharingPermissionViewHolder.OnPermissionChangeListener() {
- @Override
- public void onPermissionChanged(int position) {
- handlePermissionChanged(quickPermissionModelList, position);
- }
+ QuickSharingPermissionsAdapter adapter = new QuickSharingPermissionsAdapter(
+ quickPermissionModelList,
+ new QuickSharingPermissionsAdapter.QuickSharingPermissionViewHolder.OnPermissionChangeListener() {
+ @Override
+ public void onPermissionChanged(int position) {
+ handlePermissionChanged(quickPermissionModelList, position);
+ }
- @Override
- public void onDismissSheet() {
- dismiss();
- }
- });
+ @Override
+ public void onDismissSheet() {
+ dismiss();
+ }
+ },
+ viewThemeUtils
+ );
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(fileActivity);
binding.rvQuickSharePermissions.setLayoutManager(linearLayoutManager);
binding.rvQuickSharePermissions.setAdapter(adapter);
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt
index 846b4f5fd3..962d9eb0d0 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt
@@ -54,8 +54,7 @@ import com.owncloud.android.ui.unifiedsearch.ProviderID
import com.owncloud.android.ui.unifiedsearch.UnifiedSearchSection
import com.owncloud.android.ui.unifiedsearch.UnifiedSearchViewModel
import com.owncloud.android.utils.DisplayUtils
-import com.owncloud.android.utils.theme.ThemeColorUtils
-import com.owncloud.android.utils.theme.ThemeDrawableUtils
+import com.owncloud.android.utils.theme.ViewThemeUtils
import javax.inject.Inject
/**
@@ -84,10 +83,7 @@ class UnifiedSearchFragment : Fragment(), Injectable, UnifiedSearchListInterface
lateinit var clientFactory: ClientFactory
@Inject
- lateinit var themeColorUtils: ThemeColorUtils
-
- @Inject
- lateinit var themeDrawableUtils: ThemeDrawableUtils
+ lateinit var viewThemeUtils: ViewThemeUtils
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -127,10 +123,7 @@ class UnifiedSearchFragment : Fragment(), Injectable, UnifiedSearchListInterface
binding.emptyList.emptyListViewText.text =
requireContext().getString(R.string.file_list_empty_unified_search_no_results)
binding.emptyList.emptyListIcon.setImageDrawable(
- themeDrawableUtils.tintDrawable(
- R.drawable.ic_search_grey,
- themeColorUtils.primaryColor(context, true)
- )
+ viewThemeUtils.platform.tintPrimaryDrawable(requireContext(), R.drawable.ic_search_grey)
)
}
}
@@ -186,8 +179,7 @@ class UnifiedSearchFragment : Fragment(), Injectable, UnifiedSearchListInterface
currentAccountProvider.user,
clientFactory,
requireContext(),
- themeColorUtils,
- themeDrawableUtils
+ viewThemeUtils
)
adapter.shouldShowFooters(true)
adapter.setLayoutManager(gridLayoutManager)
@@ -235,6 +227,7 @@ class UnifiedSearchFragment : Fragment(), Injectable, UnifiedSearchListInterface
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
val item = menu.findItem(R.id.action_search)
val searchView = MenuItemCompat.getActionView(item) as SearchView
+ viewThemeUtils.androidx.themeToolbarSearchView(searchView)
searchView.setQuery(vm.query.value, false)
searchView.setOnQueryTextListener(this)
searchView.isIconified = false
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupFragment.java
index 547087f80e..07fedb17a7 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupFragment.java
@@ -37,7 +37,6 @@ import android.widget.Toast;
import com.nextcloud.client.account.User;
import com.nextcloud.client.di.Injectable;
import com.nextcloud.client.jobs.BackgroundJobManager;
-import com.nextcloud.client.preferences.AppPreferences;
import com.nextcloud.java.util.Optional;
import com.owncloud.android.R;
import com.owncloud.android.databinding.BackupFragmentBinding;
@@ -53,11 +52,8 @@ import com.owncloud.android.ui.fragment.FileFragment;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.MimeTypeUtil;
import com.owncloud.android.utils.PermissionUtil;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeCheckableUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeToolbarUtils;
import com.owncloud.android.utils.theme.ThemeUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.ArrayList;
import java.util.Calendar;
@@ -91,12 +87,10 @@ public class BackupFragment extends FileFragment implements DatePickerDialog.OnD
private BackupFragmentBinding binding;
@Inject BackgroundJobManager backgroundJobManager;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeToolbarUtils themeToolbarUtils;
@Inject ThemeUtils themeUtils;
- @Inject ThemeCheckableUtils themeCheckableUtils;
- @Inject ThemeButtonUtils themeButtonUtils;
+
@Inject ArbitraryDataProvider arbitraryDataProvider;
+ @Inject ViewThemeUtils viewThemeUtils;
private Date selectedDate;
private boolean calendarPickerOpen;
@@ -156,16 +150,14 @@ public class BackupFragment extends FileFragment implements DatePickerDialog.OnD
ActionBar actionBar = contactsPreferenceActivity != null ? contactsPreferenceActivity.getSupportActionBar() : null;
if (actionBar != null) {
- themeToolbarUtils.setColoredTitle(actionBar, getString(R.string.backup_title), getContext());
-
actionBar.setDisplayHomeAsUpEnabled(true);
- themeToolbarUtils.tintBackButton(actionBar, getContext());
+ viewThemeUtils.files.themeActionBar(requireContext(), actionBar, R.string.backup_title);
}
- themeCheckableUtils.tintSwitch(binding.contacts, themeColorUtils);
- themeCheckableUtils.tintSwitch(binding.calendar, themeColorUtils);
- themeCheckableUtils.tintSwitch(binding.dailyBackup, themeColorUtils);
+ viewThemeUtils.androidx.colorSwitchCompat(binding.contacts);
+ viewThemeUtils.androidx.colorSwitchCompat(binding.calendar);
+ viewThemeUtils.androidx.colorSwitchCompat(binding.dailyBackup);
binding.dailyBackup.setChecked(arbitraryDataProvider.getBooleanValue(user,
PREFERENCE_CONTACTS_AUTOMATIC_BACKUP));
@@ -202,12 +194,11 @@ public class BackupFragment extends FileFragment implements DatePickerDialog.OnD
calendarPickerOpen = true;
}
- themeButtonUtils.colorPrimaryButton(binding.backupNow, getContext(), themeColorUtils);
- themeButtonUtils.themeBorderlessButton(themeColorUtils, binding.contactsDatepicker);
+ viewThemeUtils.material.colorMaterialButtonPrimaryFilled(binding.backupNow);
+ viewThemeUtils.material.colorMaterialButtonPrimaryOutlined(binding.contactsDatepicker);
- int primaryAccentColor = themeColorUtils.primaryAccentColor(getContext());
- binding.dataToBackUpTitle.setTextColor(primaryAccentColor);
- binding.backupSettingsTitle.setTextColor(primaryAccentColor);
+ viewThemeUtils.platform.colorTextView(binding.dataToBackUpTitle);
+ viewThemeUtils.platform.colorTextView(binding.backupSettingsTitle);
return view;
}
@@ -292,7 +283,7 @@ public class BackupFragment extends FileFragment implements DatePickerDialog.OnD
if (folder != null) {
RefreshFolderOperation operation = new RefreshFolderOperation(folder, System.currentTimeMillis(),
- false, false, storageManager, user, context);
+ false, false, storageManager, user, context);
RemoteOperationResult result = operation.execute(user, context);
return result.isSuccess();
@@ -312,7 +303,7 @@ public class BackupFragment extends FileFragment implements DatePickerDialog.OnD
Collections.sort(backupFiles, new AlphanumComparator<>());
if (backupFiles == null || backupFiles.isEmpty()) {
- binding.contactsDatepicker.setVisibility(View.GONE);
+ binding.contactsDatepicker.setVisibility(View.INVISIBLE);
} else {
binding.contactsDatepicker.setVisibility(View.VISIBLE);
}
@@ -464,7 +455,7 @@ public class BackupFragment extends FileFragment implements DatePickerDialog.OnD
backgroundJobManager.cancelPeriodicCalendarBackup(user);
}
- arbitraryDataProvider.storeOrUpdateKeyValue(user.getAccountName(),
+ arbitraryDataProvider.storeOrUpdateKeyValue(user.getAccountName(),
PREFERENCE_CONTACTS_AUTOMATIC_BACKUP,
String.valueOf(enabled));
}
@@ -562,15 +553,15 @@ public class BackupFragment extends FileFragment implements DatePickerDialog.OnD
datePickerDialog.setTitle("");
datePickerDialog.show();
- datePickerDialog.getButton(DatePickerDialog.BUTTON_NEGATIVE).setTextColor(themeColorUtils.primaryColor(getContext(), true));
- datePickerDialog.getButton(DatePickerDialog.BUTTON_POSITIVE).setTextColor(themeColorUtils.primaryColor(getContext(), true));
+ viewThemeUtils.platform.colorTextButtons(datePickerDialog.getButton(DatePickerDialog.BUTTON_NEGATIVE),
+ datePickerDialog.getButton(DatePickerDialog.BUTTON_POSITIVE));
// set background to transparent
datePickerDialog.getButton(DatePickerDialog.BUTTON_NEGATIVE).setBackgroundColor(0x00000000);
datePickerDialog.getButton(DatePickerDialog.BUTTON_POSITIVE).setBackgroundColor(0x00000000);
} else {
DisplayUtils.showSnackMessage(getView().findViewById(R.id.contacts_linear_layout),
- R.string.contacts_preferences_something_strange_happened);
+ R.string.contacts_preferences_something_strange_happened);
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListAdapter.kt b/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListAdapter.kt
index d0cb7bb956..dec70b3342 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListAdapter.kt
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListAdapter.kt
@@ -26,7 +26,6 @@ import android.content.Context
import android.content.res.Resources
import android.database.Cursor
import android.graphics.BitmapFactory
-import android.graphics.PorterDuff
import android.graphics.drawable.Drawable
import android.provider.ContactsContract
import android.view.LayoutInflater
@@ -51,7 +50,7 @@ import com.owncloud.android.ui.TextDrawable
import com.owncloud.android.ui.fragment.contactsbackup.BackupListFragment.getDisplayName
import com.owncloud.android.utils.BitmapUtils
import com.owncloud.android.utils.DisplayUtils
-import com.owncloud.android.utils.theme.ThemeColorUtils
+import com.owncloud.android.utils.theme.ViewThemeUtils
import ezvcard.VCard
import ezvcard.property.Photo
import third_parties.sufficientlysecure.AndroidCalendar
@@ -64,7 +63,7 @@ class BackupListAdapter(
private val checkedCalendars: HashMap = HashMap(),
val backupListFragment: BackupListFragment,
val context: Context,
- private val themeColorUtils: ThemeColorUtils
+ private val viewThemeUtils: ViewThemeUtils
) : SectionedRecyclerViewAdapter() {
private val calendarFiles = arrayListOf()
private val contacts = arrayListOf()
@@ -160,7 +159,7 @@ class BackupListAdapter(
override fun onBindHeaderViewHolder(holder: SectionedViewHolder?, section: Int, expanded: Boolean) {
val headerViewHolder = holder as BackupListHeaderViewHolder
- headerViewHolder.binding.name.setTextColor(themeColorUtils.primaryColor(context))
+ viewThemeUtils.platform.colorPrimaryTextViewElement(headerViewHolder.binding.name)
if (section == SECTION_CALENDAR) {
headerViewHolder.binding.name.text = context.resources.getString(R.string.calendars)
@@ -207,6 +206,7 @@ class BackupListAdapter(
setChecked(checkedVCards.contains(position), holder.binding.name)
holder.binding.name.text = getDisplayName(vCard)
+ viewThemeUtils.platform.themeCheckedTextView(holder.binding.name)
// photo
if (vCard.photos.size > 0) {
@@ -229,24 +229,13 @@ class BackupListAdapter(
private fun setChecked(checked: Boolean, checkedTextView: CheckedTextView) {
checkedTextView.isChecked = checked
- if (checked) {
- checkedTextView.checkMarkDrawable
- .setColorFilter(themeColorUtils.primaryColor(context), PorterDuff.Mode.SRC_ATOP)
- } else {
- checkedTextView.checkMarkDrawable.clearColorFilter()
- }
}
private fun toggleVCard(holder: ContactItemViewHolder, position: Int) {
holder.binding.name.isChecked = !holder.binding.name.isChecked
if (holder.binding.name.isChecked) {
- holder.binding.name.checkMarkDrawable.setColorFilter(
- themeColorUtils.primaryColor(context),
- PorterDuff.Mode.SRC_ATOP
- )
checkedVCards.add(position)
} else {
- holder.binding.name.checkMarkDrawable.clearColorFilter()
checkedVCards.remove(position)
}
@@ -295,6 +284,7 @@ class BackupListAdapter(
val calendarName = name.substring(0, name.indexOf("_"))
val date = name.substring(name.lastIndexOf("_") + 1).replace(".ics", "").replace("-", ":")
holder.binding.name.text = context.resources.getString(R.string.calendar_name_linewrap, calendarName, date)
+ viewThemeUtils.platform.themeCheckedTextView(holder.binding.name)
holder.setCalendars(ArrayList(AndroidCalendar.loadAll(context.contentResolver)))
holder.binding.spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, calendarPosition: Int, id: Long) {
@@ -313,14 +303,9 @@ class BackupListAdapter(
val checkedTextView = holder.binding.name
checkedTextView.isChecked = !checkedTextView.isChecked
if (checkedTextView.isChecked) {
- checkedTextView.checkMarkDrawable.setColorFilter(
- themeColorUtils.primaryColor(context),
- PorterDuff.Mode.SRC_ATOP
- )
holder.showCalendars(true)
checkedCalendars[calendarFiles[position].storagePath] = 0
} else {
- checkedTextView.checkMarkDrawable.clearColorFilter()
checkedCalendars.remove(calendarFiles[position].storagePath)
holder.showCalendars(false)
}
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListFragment.java
index 63faba0821..fed19fa241 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListFragment.java
@@ -54,8 +54,7 @@ import com.owncloud.android.ui.events.VCardToggleEvent;
import com.owncloud.android.ui.fragment.FileFragment;
import com.owncloud.android.utils.MimeTypeUtil;
import com.owncloud.android.utils.PermissionUtil;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeToolbarUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@@ -94,8 +93,7 @@ public class BackupListFragment extends FileFragment implements Injectable {
@Inject UserAccountManager accountManager;
@Inject ClientFactory clientFactory;
@Inject BackgroundJobManager backgroundJobManager;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeToolbarUtils themeToolbarUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
private TransferManagerConnection fileDownloader;
private LoadContactsTask loadContactsTask = null;
private ContactsAccount selectedAccount;
@@ -142,9 +140,7 @@ public class BackupListFragment extends FileFragment implements Injectable {
if (contactsPreferenceActivity != null) {
ActionBar actionBar = contactsPreferenceActivity.getSupportActionBar();
if (actionBar != null) {
- themeToolbarUtils.setColoredTitle(actionBar,
- R.string.actionbar_calendar_contacts_restore,
- getContext());
+ viewThemeUtils.files.themeActionBar(requireContext(), actionBar, R.string.actionbar_calendar_contacts_restore);
actionBar.setDisplayHomeAsUpEnabled(true);
}
contactsPreferenceActivity.setDrawerIndicatorEnabled(false);
@@ -157,7 +153,7 @@ public class BackupListFragment extends FileFragment implements Injectable {
new HashMap<>(),
this,
requireContext(),
- themeColorUtils);
+ viewThemeUtils);
} else {
HashMap checkedCalendarItems = new HashMap<>();
String[] checkedCalendarItemsArray = savedInstanceState.getStringArray(CHECKED_CALENDAR_ITEMS_ARRAY_KEY);
@@ -187,7 +183,7 @@ public class BackupListFragment extends FileFragment implements Injectable {
checkedCalendarItems,
this,
requireContext(),
- themeColorUtils);
+ viewThemeUtils);
}
binding.list.setAdapter(listAdapter);
@@ -252,7 +248,7 @@ public class BackupListFragment extends FileFragment implements Injectable {
closeFragment();
});
- binding.restoreSelected.setTextColor(themeColorUtils.primaryAccentColor(getContext()));
+ viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(binding.restoreSelected);
return view;
}
diff --git a/app/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/app/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java
index 5976906fe9..b0a751130a 100755
--- a/app/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java
+++ b/app/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java
@@ -85,7 +85,7 @@ import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.FileStorageUtils;
import com.owncloud.android.utils.PermissionUtil;
import com.owncloud.android.utils.UriUtils;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import org.greenrobot.eventbus.EventBus;
@@ -497,13 +497,13 @@ public class FileOperationsHelper {
}
}
- public void getFileWithLink(@NonNull OCFile file, ThemeSnackbarUtils themeSnackbarUtils) {
+ public void getFileWithLink(@NonNull OCFile file, final ViewThemeUtils viewThemeUtils) {
List shares = fileActivity.getStorageManager().getSharesByPathAndType(file.getRemotePath(),
ShareType.PUBLIC_LINK,
"");
if (shares.size() == SINGLE_LINK_SIZE) {
- FileActivity.copyAndShareFileLink(fileActivity, file, shares.get(0).getShareLink(), themeSnackbarUtils);
+ FileActivity.copyAndShareFileLink(fileActivity, file, shares.get(0).getShareLink(), viewThemeUtils);
} else {
if (fileActivity instanceof FileDisplayActivity) {
((FileDisplayActivity) fileActivity).showDetails(file, 1);
diff --git a/app/src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.java b/app/src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.java
index 5a98fff485..6c70dc45c9 100644
--- a/app/src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.java
+++ b/app/src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.java
@@ -25,7 +25,7 @@ import android.os.Handler;
import android.os.HandlerThread;
import android.os.Process;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.security.SecureRandom;
@@ -61,8 +61,10 @@ public final class NotificationUtils {
* @param context Context that will use the builder to create notifications
* @return An instance of the regular {@link NotificationCompat.Builder}.
*/
- public static NotificationCompat.Builder newNotificationBuilder(Context context, ThemeColorUtils themeColorUtils) {
- return new NotificationCompat.Builder(context).setColor(themeColorUtils.primaryColor(context));
+ public static NotificationCompat.Builder newNotificationBuilder(Context context, final ViewThemeUtils viewThemeUtils) {
+ final NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
+ viewThemeUtils.androidx.themeNotificationCompatBuilder(context, builder);
+ return builder;
}
@SuppressFBWarnings("DMI")
diff --git a/app/src/main/java/com/owncloud/android/ui/preview/FileDownloadFragment.java b/app/src/main/java/com/owncloud/android/ui/preview/FileDownloadFragment.java
index 3e4dda2688..ffca7c685a 100644
--- a/app/src/main/java/com/owncloud/android/ui/preview/FileDownloadFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/preview/FileDownloadFragment.java
@@ -34,8 +34,7 @@ import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.lib.common.network.OnDatatransferProgressListener;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.ui.fragment.FileFragment;
-import com.owncloud.android.utils.theme.ThemeBarUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.lang.ref.WeakReference;
@@ -62,8 +61,7 @@ public class FileDownloadFragment extends FileFragment implements OnClickListene
private View mView;
private User user;
- @Inject ThemeColorUtils themeColorUtils;
- @Inject ThemeBarUtils themeBarUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
public ProgressListener mProgressListener;
private boolean mListening;
@@ -145,7 +143,7 @@ public class FileDownloadFragment extends FileFragment implements OnClickListene
mView = inflater.inflate(R.layout.file_download_fragment, container, false);
ProgressBar progressBar = mView.findViewById(R.id.progressBar);
- themeBarUtils.colorHorizontalProgressBar(progressBar, themeColorUtils.primaryAccentColor(getContext()));
+ viewThemeUtils.platform.themeHorizontalProgressBar(progressBar);
mProgressListener = new ProgressListener(progressBar);
(mView.findViewById(R.id.cancelBtn)).setOnClickListener(this);
diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewBitmapActivity.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewBitmapActivity.kt
index 33481876ce..d71a5dab6d 100644
--- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewBitmapActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewBitmapActivity.kt
@@ -24,17 +24,23 @@ package com.owncloud.android.ui.preview
import android.graphics.BitmapFactory
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
+import com.nextcloud.client.di.Injectable
import com.owncloud.android.databinding.ActivityPreviewBitmapBinding
+import com.owncloud.android.utils.theme.ViewThemeUtils
+import javax.inject.Inject
/**
* Zoomable preview of a single bitmap
*/
-class PreviewBitmapActivity : AppCompatActivity() {
+class PreviewBitmapActivity : AppCompatActivity(), Injectable {
companion object {
const val EXTRA_BITMAP_PATH = "EXTRA_BITMAP_PATH"
}
+ @Inject
+ lateinit var viewThemeUtils: ViewThemeUtils
+
private lateinit var binding: ActivityPreviewBitmapBinding
override fun onCreate(savedInstanceState: Bundle?) {
@@ -47,6 +53,7 @@ class PreviewBitmapActivity : AppCompatActivity() {
supportActionBar?.let {
it.setDisplayHomeAsUpEnabled(true)
it.setDisplayShowHomeEnabled(true)
+ viewThemeUtils.files.setWhiteBackButton(this, it)
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java
index 45041d71c5..df1ac4616b 100644
--- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java
@@ -122,7 +122,10 @@ public class PreviewImageActivity extends FileActivity implements
// ActionBar
updateActionBarTitleAndHomeButton(null);
- themeToolbarUtils.tintBackButton(actionBar, this, Color.WHITE);
+ if (actionBar != null) {
+ viewThemeUtils.files.setWhiteBackButton(this, actionBar);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
mFullScreenAnchorView = getWindow().getDecorView();
// to keep our UI controls visibility in line with system bars visibility
diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextFileFragment.java b/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextFileFragment.java
index c53f6b5be3..8bf2d483ff 100644
--- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextFileFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextFileFragment.java
@@ -42,6 +42,7 @@ import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.MimeTypeUtil;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import org.mozilla.universalchardet.ReaderFactory;
@@ -73,6 +74,7 @@ public class PreviewTextFileFragment extends PreviewTextFragment {
private User user;
@Inject UserAccountManager accountManager;
+ @Inject ViewThemeUtils viewThemeUtils;
public static PreviewTextFileFragment create(User user, OCFile file, boolean openSearch, String searchQuery) {
Bundle args = new Bundle();
@@ -228,7 +230,7 @@ public class PreviewTextFileFragment extends PreviewTextFragment {
if (textView != null) {
originalText = stringWriter.toString();
- setText(textView, originalText, getFile(), requireActivity(), false, false, themeColorUtils);
+ setText(textView, originalText, getFile(), requireActivity(), false, false, viewThemeUtils);
if (searchView != null) {
searchView.setOnQueryTextListener(PreviewTextFileFragment.this);
@@ -260,6 +262,7 @@ public class PreviewTextFileFragment extends PreviewTextFragment {
menuItem.setVisible(true);
searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
searchView.setMaxWidth(Integer.MAX_VALUE);
+ viewThemeUtils.androidx.themeToolbarSearchView(searchView);
if (searchOpen) {
searchView.setIconified(false);
diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java b/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java
index 23a64cd99c..f8e2ad4e7d 100644
--- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java
@@ -23,7 +23,6 @@ import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Color;
-import android.graphics.PorterDuff;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
@@ -48,7 +47,7 @@ import com.owncloud.android.ui.fragment.FileFragment;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.MimeTypeUtil;
import com.owncloud.android.utils.StringUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
@@ -88,7 +87,7 @@ public abstract class PreviewTextFragment extends FileFragment implements Search
@Inject UserAccountManager accountManager;
@Inject DeviceInfo deviceInfo;
- @Inject ThemeColorUtils themeColorUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
protected TextFilePreviewBinding binding;
@@ -174,23 +173,23 @@ public abstract class PreviewTextFragment extends FileFragment implements Search
resources.getColor(R.color.primary));
binding.textPreview.setText(Html.fromHtml(coloredText.replace("\n", "
")));
} else {
- setText(binding.textPreview, originalText, getFile(), activity, false, false, themeColorUtils);
+ setText(binding.textPreview, originalText, getFile(), activity, false, false, viewThemeUtils);
}
}
protected static Spanned getRenderedMarkdownText(Activity activity,
String markdown,
- ThemeColorUtils themeColorUtils) {
+ ViewThemeUtils viewThemeUtils) {
Prism4j prism4j = new Prism4j(new MarkwonGrammarLocator());
Prism4jTheme prism4jTheme = Prism4jThemeDefault.create();
TaskListDrawable drawable = new TaskListDrawable(Color.GRAY, Color.GRAY, Color.WHITE);
- drawable.setColorFilter(themeColorUtils.primaryColor(activity, true), PorterDuff.Mode.SRC_ATOP);
+ viewThemeUtils.platform.tintPrimaryDrawable(activity, drawable);
final Markwon markwon = Markwon.builder(activity)
.usePlugin(new AbstractMarkwonPlugin() {
@Override
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
- builder.linkColor(themeColorUtils.primaryColor(activity, true));
+ builder.linkColor(viewThemeUtils.platform.primaryColor(activity));
builder.headingBreakHeight(0);
}
@@ -225,7 +224,7 @@ public abstract class PreviewTextFragment extends FileFragment implements Search
Activity activity,
boolean ignoreMimetype,
boolean preview,
- ThemeColorUtils themeColorUtils) {
+ ViewThemeUtils viewThemeUtils) {
if (text == null) {
return;
}
@@ -236,7 +235,7 @@ public abstract class PreviewTextFragment extends FileFragment implements Search
// clickable links prevent to open full view of rich workspace
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
- textView.setText(getRenderedMarkdownText(activity, text, themeColorUtils));
+ textView.setText(getRenderedMarkdownText(activity, text, viewThemeUtils));
} else {
textView.setText(text);
}
diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.java b/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.java
index 4ab987e6fe..3d7c5a52d0 100644
--- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.java
@@ -38,7 +38,7 @@ import com.owncloud.android.R;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.ui.activity.FileDisplayActivity;
import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeFabUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import javax.inject.Inject;
@@ -50,7 +50,7 @@ public class PreviewTextStringFragment extends PreviewTextFragment {
private static final String EXTRA_FILE = "FILE";
@Inject UserAccountManager accountManager;
- @Inject ThemeFabUtils themeFabUtils;
+ @Inject ViewThemeUtils viewThemeUtils;
/**
* Creates an empty fragment for previews.
@@ -100,7 +100,9 @@ public class PreviewTextStringFragment extends PreviewTextFragment {
fabMain.setVisibility(View.VISIBLE);
fabMain.setEnabled(true);
fabMain.setOnClickListener(v -> edit());
- themeFabUtils.colorFloatingActionButton(fabMain, R.drawable.ic_edit, requireContext());
+
+ fabMain.setImageResource(R.drawable.ic_edit);
+ viewThemeUtils.material.themeFAB(fabMain);
return view;
}
@@ -117,6 +119,7 @@ public class PreviewTextStringFragment extends PreviewTextFragment {
searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
searchView.setOnQueryTextListener(this);
searchView.setMaxWidth(Integer.MAX_VALUE);
+ viewThemeUtils.androidx.themeToolbarSearchView(searchView);
if (searchOpen) {
searchView.setIconified(false);
@@ -127,7 +130,7 @@ public class PreviewTextStringFragment extends PreviewTextFragment {
void loadAndShowTextPreview() {
originalText = getFile().getRichWorkspace();
- setText(binding.textPreview, originalText, getFile(), requireActivity(), true, false, themeColorUtils);
+ setText(binding.textPreview, originalText, getFile(), requireActivity(), true, false, viewThemeUtils);
binding.textPreview.setVisibility(View.VISIBLE);
binding.emptyListProgress.setVisibility(View.GONE);
diff --git a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.java b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.java
index 96e6ecbbe8..7a823e21fb 100644
--- a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.java
@@ -49,6 +49,7 @@ import com.owncloud.android.ui.dialog.SortingOrderDialogFragment;
import com.owncloud.android.ui.interfaces.TrashbinActivityInterface;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.FileSortOrder;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.util.List;
@@ -73,6 +74,8 @@ public class TrashbinActivity extends DrawerActivity implements
@Inject AppPreferences preferences;
@Inject CurrentAccountProvider accountProvider;
@Inject ClientFactory clientFactory;
+ @Inject ViewThemeUtils viewThemeUtils;
+
private TrashbinListAdapter trashbinListAdapter;
@VisibleForTesting
@@ -141,17 +144,18 @@ public class TrashbinActivity extends DrawerActivity implements
preferences,
this,
getUser().orElse(accountProvider.getUser()),
- themeColorUtils,
- themeDrawableUtils
+ viewThemeUtils
);
recyclerView.setAdapter(trashbinListAdapter);
recyclerView.setHasFixedSize(true);
recyclerView.setHasFooter(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
- themeLayoutUtils.colorSwipeRefreshLayout(this, binding.swipeContainingList);
+ viewThemeUtils.androidx.themeSwipeRefreshLayout(binding.swipeContainingList);
binding.swipeContainingList.setOnRefreshListener(this::loadFolder);
+ viewThemeUtils.material.colorMaterialTextButton(findViewById(R.id.sort_button));
+
findViewById(R.id.sort_button).setOnClickListener(l ->
openSortingOrderDialogFragment(getSupportFragmentManager(),
preferences.getSortOrderByType(
diff --git a/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java b/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java
index 3b1187f6e2..3a1e1337dd 100644
--- a/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java
+++ b/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java
@@ -80,8 +80,7 @@ import com.owncloud.android.ui.fragment.OCFileListFragment;
import com.owncloud.android.utils.glide.CustomGlideUriLoader;
import com.owncloud.android.utils.svg.SvgDecoder;
import com.owncloud.android.utils.svg.SvgDrawableTranscoder;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import org.greenrobot.eventbus.EventBus;
@@ -127,7 +126,6 @@ public final class DisplayUtils {
private static final String[] sizeSuffixes = {"B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"};
private static final int[] sizeScales = {0, 0, 1, 1, 1, 2, 2, 2, 2};
- private static final int RELATIVE_THRESHOLD_WARNING = 80;
private static final String MIME_TYPE_UNKNOWN = "Unknown type";
private static final String HTTP_PROTOCOL = "http://";
@@ -336,22 +334,6 @@ public final class DisplayUtils {
showFuture);
}
-
- /**
- * determines the info level color based on {@link #RELATIVE_THRESHOLD_WARNING}.
- *
- * @param context the app's context
- * @param relative relative value for which the info level color should be looked up
- * @return info level color
- */
- public static int getRelativeInfoColor(Context context, int relative, ThemeColorUtils themeColorUtils) {
- if (relative < RELATIVE_THRESHOLD_WARNING) {
- return themeColorUtils.primaryColor(context, true);
- } else {
- return context.getResources().getColor(R.color.infolevel_warning);
- }
- }
-
public static CharSequence getRelativeDateTimeString(Context c, long time, long minResolution,
long transitionResolution, int flags) {
return getRelativeDateTimeString(c, time, minResolution, transitionResolution, flags, false);
@@ -846,8 +828,7 @@ public final class DisplayUtils {
Context context,
LoaderImageView shimmerThumbnail,
AppPreferences preferences,
- ThemeColorUtils themeColorUtils,
- ThemeDrawableUtils themeDrawableUtils) {
+ ViewThemeUtils viewThemeUtils) {
if (file.isFolder()) {
stopShimmer(shimmerThumbnail, thumbnailView);
thumbnailView.setImageDrawable(MimeTypeUtil
@@ -857,8 +838,7 @@ public final class DisplayUtils {
file.isGroupFolder(),
file.getMountType(),
context,
- themeColorUtils,
- themeDrawableUtils));
+ viewThemeUtils));
} else {
if (file.getRemoteId() != null && file.isPreviewAvailable()) {
// Thumbnail in cache?
@@ -899,10 +879,8 @@ public final class DisplayUtils {
if (thumbnail == null) {
Drawable drawable = MimeTypeUtil.getFileTypeIcon(file.getMimeType(),
file.getFileName(),
- user,
context,
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
if (drawable == null) {
drawable = ResourcesCompat.getDrawable(context.getResources(),
R.drawable.file_image,
@@ -952,10 +930,8 @@ public final class DisplayUtils {
stopShimmer(shimmerThumbnail, thumbnailView);
thumbnailView.setImageDrawable(MimeTypeUtil.getFileTypeIcon(file.getMimeType(),
file.getFileName(),
- user,
context,
- themeColorUtils,
- themeDrawableUtils));
+ viewThemeUtils));
}
}
}
diff --git a/app/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java b/app/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java
index 7a82487104..cd44c80b3b 100644
--- a/app/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java
+++ b/app/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java
@@ -23,13 +23,11 @@ import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.webkit.MimeTypeMap;
-import com.nextcloud.client.account.User;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.lib.common.network.WebdavEntry;
import com.owncloud.android.lib.resources.files.model.ServerFileInterface;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.io.File;
import java.util.ArrayList;
@@ -40,7 +38,6 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
-import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
/**
@@ -95,32 +92,13 @@ public final class MimeTypeUtil {
public static Drawable getFileTypeIcon(String mimetype,
String filename,
Context context,
- ThemeColorUtils themeColorUtils,
- ThemeDrawableUtils themeDrawableUtils) {
- return getFileTypeIcon(mimetype, filename, null, context, themeColorUtils, themeDrawableUtils);
- }
-
- /**
- * Returns the Drawable of an image to use as icon associated to a known MIME type.
- *
- * @param mimetype MIME type string; if NULL, the method tries to guess it from the extension in filename
- * @param filename Name, with extension.
- * @param user user which color should be used
- * @return Drawable of an image resource.
- */
- @Nullable
- public static Drawable getFileTypeIcon(String mimetype,
- String filename,
- @Nullable User user,
- Context context,
- ThemeColorUtils themeColorUtils,
- ThemeDrawableUtils themeDrawableUtils) {
+ ViewThemeUtils viewThemeUtils) {
if (context != null) {
int iconId = MimeTypeUtil.getFileTypeIconId(mimetype, filename);
Drawable icon = ContextCompat.getDrawable(context, iconId);
if (R.drawable.file_zip == iconId) {
- themeDrawableUtils.tintDrawable(icon, themeColorUtils.primaryColor(user, true, context));
+ viewThemeUtils.platform.tintPrimaryDrawable(context, icon);
}
return icon;
@@ -147,50 +125,21 @@ public final class MimeTypeUtil {
return determineIconIdByMimeTypeList(possibleMimeTypes);
}
- /**
- * Returns the resource identifier of an image to use as icon associated to a type of folder.
- *
- * @param isSharedViaUsers flag if the folder is shared via the users system
- * @param isSharedViaLink flag if the folder is publicly shared via link
- * @return Identifier of an image resource.
- */
- public static Drawable getFolderTypeIcon(boolean isSharedViaUsers,
- boolean isSharedViaLink,
- boolean isEncrypted,
- boolean isGroupfolder,
- WebdavEntry.MountType mountType,
- Context context,
- ThemeColorUtils themeColorUtils,
- ThemeDrawableUtils themeDrawableUtils) {
- return getFolderTypeIcon(isSharedViaUsers,
- isSharedViaLink,
- isEncrypted,
- isGroupfolder,
- null,
- mountType,
- context,
- themeColorUtils,
- themeDrawableUtils);
- }
-
/**
* Returns the resource identifier of an image to use as icon associated to a type of folder.
*
* @param isSharedViaUsers flag if the folder is shared via the users system
* @param isSharedViaLink flag if the folder is publicly shared via link
* @param isEncrypted flag if the folder is encrypted
- * @param user user which color should be used
* @return Identifier of an image resource.
*/
public static Drawable getFolderTypeIcon(boolean isSharedViaUsers,
boolean isSharedViaLink,
boolean isEncrypted,
boolean isGroupFolder,
- @Nullable User user,
WebdavEntry.MountType mountType,
Context context,
- ThemeColorUtils themeColorUtils,
- ThemeDrawableUtils themeDrawableUtils) {
+ ViewThemeUtils viewThemeUtils) {
int drawableId;
if (isSharedViaLink) {
@@ -207,26 +156,22 @@ public final class MimeTypeUtil {
drawableId = R.drawable.folder;
}
- int color = themeColorUtils.primaryColor(user != null ? user.toPlatformAccount() : null,
- true,
- context);
- return themeDrawableUtils.tintDrawable(drawableId, color);
+ Drawable drawable = ContextCompat.getDrawable(context, drawableId);
+ viewThemeUtils.platform.tintPrimaryDrawable(context, drawable);
+ return drawable;
}
public static Drawable getDefaultFolderIcon(Context context,
- ThemeColorUtils themeColorUtils,
- ThemeDrawableUtils themeDrawableUtils) {
+ ViewThemeUtils viewThemeUtils) {
return getFolderTypeIcon(false,
false,
false,
false,
WebdavEntry.MountType.INTERNAL,
context,
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
}
-
/**
* Returns a single MIME type of all the possible, by inspection of the file extension, and taking
* into account the MIME types known by ownCloud first.
diff --git a/app/src/main/java/com/owncloud/android/utils/PermissionUtil.kt b/app/src/main/java/com/owncloud/android/utils/PermissionUtil.kt
index 182eefb45c..ca919a233d 100644
--- a/app/src/main/java/com/owncloud/android/utils/PermissionUtil.kt
+++ b/app/src/main/java/com/owncloud/android/utils/PermissionUtil.kt
@@ -42,7 +42,7 @@ import com.nextcloud.client.preferences.AppPreferences
import com.nextcloud.client.preferences.AppPreferencesImpl
import com.owncloud.android.R
import com.owncloud.android.ui.dialog.StoragePermissionDialogFragment
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils
+import com.owncloud.android.utils.theme.ViewThemeUtils
object PermissionUtil {
const val PERMISSIONS_EXTERNAL_STORAGE = 1
@@ -116,7 +116,7 @@ object PermissionUtil {
@JvmOverloads
fun requestExternalStoragePermission(
activity: AppCompatActivity,
- themeSnackbarUtils: ThemeSnackbarUtils,
+ viewThemeUtils: ViewThemeUtils,
permissionRequired: Boolean = false
) {
if (!checkExternalStoragePermission(activity)) {
@@ -124,20 +124,20 @@ object PermissionUtil {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> {
if (canRequestAllFilesPermission(activity)) {
// can request All Files, show choice
- showPermissionChoiceDialog(activity, permissionRequired, themeSnackbarUtils)
+ showPermissionChoiceDialog(activity, permissionRequired, viewThemeUtils)
} else {
// can not request all files, request READ_EXTERNAL_STORAGE
requestStoragePermission(
activity,
Manifest.permission.READ_EXTERNAL_STORAGE,
- themeSnackbarUtils
+ viewThemeUtils
)
}
}
else -> requestStoragePermission(
activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
- themeSnackbarUtils
+ viewThemeUtils
)
}
}
@@ -146,10 +146,11 @@ object PermissionUtil {
/**
* Request a storage permission
*/
+ // TODO inject this class to avoid passing ViewThemeUtils around
private fun requestStoragePermission(
activity: Activity,
permission: String,
- themeSnackbarUtils: ThemeSnackbarUtils
+ viewThemeUtils: ViewThemeUtils
) {
fun doRequest() {
ActivityCompat.requestPermissions(
@@ -171,7 +172,7 @@ object PermissionUtil {
.setAction(R.string.common_ok) {
doRequest()
}
- .also { themeSnackbarUtils.colorSnackbar(activity, it) }
+ .also { viewThemeUtils.material.themeSnackbar(it) }
.show()
} else {
// No explanation needed, request the permission.
@@ -205,7 +206,7 @@ object PermissionUtil {
private fun showPermissionChoiceDialog(
activity: AppCompatActivity,
permissionRequired: Boolean,
- themeSnackbarUtils: ThemeSnackbarUtils
+ viewThemeUtils: ViewThemeUtils
) {
val preferences: AppPreferences = AppPreferencesImpl.fromContext(activity)
@@ -228,7 +229,7 @@ object PermissionUtil {
requestStoragePermission(
activity,
Manifest.permission.READ_EXTERNAL_STORAGE,
- themeSnackbarUtils
+ viewThemeUtils
)
}
}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/CapabilityUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/CapabilityUtils.java
index d236cec390..7055a6ee8b 100644
--- a/app/src/main/java/com/owncloud/android/utils/theme/CapabilityUtils.java
+++ b/app/src/main/java/com/owncloud/android/utils/theme/CapabilityUtils.java
@@ -34,9 +34,6 @@ import com.owncloud.android.lib.resources.status.OCCapability;
import java.util.HashMap;
import java.util.Map;
-/**
- * Utility class with methods for client side button theming.
- */
public final class CapabilityUtils {
private static final Map cachedCapabilities = new HashMap<>();
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt b/app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt
new file mode 100644
index 0000000000..e5b83865a3
--- /dev/null
+++ b/app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt
@@ -0,0 +1,256 @@
+/*
+ * Nextcloud Android client application
+ *
+ * @author Álvaro Brey
+ * Copyright (C) 2022 Álvaro Brey
+ * Copyright (C) 2022 Nextcloud GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see .
+ *
+ */
+
+package com.owncloud.android.utils.theme
+
+import android.content.Context
+import android.content.res.ColorStateList
+import android.graphics.Color
+import android.graphics.PorterDuff
+import android.graphics.drawable.Drawable
+import android.preference.PreferenceCategory
+import android.text.Spannable
+import android.text.SpannableString
+import android.text.style.ForegroundColorSpan
+import android.widget.ImageView
+import androidx.annotation.DrawableRes
+import androidx.annotation.Px
+import androidx.annotation.StringRes
+import androidx.appcompat.app.ActionBar
+import androidx.core.content.res.ResourcesCompat
+import com.google.android.material.card.MaterialCardView
+import com.nextcloud.android.common.ui.color.ColorUtil
+import com.nextcloud.android.common.ui.theme.MaterialSchemes
+import com.nextcloud.android.common.ui.theme.ViewThemeUtilsBase
+import com.nextcloud.android.common.ui.theme.utils.AndroidViewThemeUtils
+import com.nextcloud.android.common.ui.theme.utils.AndroidXViewThemeUtils
+import com.nextcloud.utils.view.FastScrollPopupBackground
+import com.owncloud.android.R
+import com.owncloud.android.lib.common.utils.Log_OC
+import com.owncloud.android.lib.resources.shares.ShareType
+import me.zhanghai.android.fastscroll.FastScrollerBuilder
+import me.zhanghai.android.fastscroll.PopupStyles
+import javax.inject.Inject
+
+class FilesSpecificViewThemeUtils @Inject constructor(
+ schemes: MaterialSchemes,
+ private val colorUtil: ColorUtil,
+ private val androidViewThemeUtils: AndroidViewThemeUtils,
+ private val androidXViewThemeUtils: AndroidXViewThemeUtils
+) : ViewThemeUtilsBase(schemes) {
+ // not ported to common lib because PreferenceCategory is deprecated
+ fun themePreferenceCategory(category: PreferenceCategory) {
+ withScheme(category.context) {
+ val text: Spannable = SpannableString(category.title)
+ text.setSpan(
+ ForegroundColorSpan(it.primary),
+ 0,
+ text.length,
+ Spannable.SPAN_INCLUSIVE_INCLUSIVE
+ )
+ category.title = text
+ }
+ }
+
+ fun createAvatar(type: ShareType?, avatar: ImageView, context: Context) {
+ fun createAvatarBase(@DrawableRes icon: Int, padding: Int = AvatarPadding.SMALL) {
+ avatar.setImageResource(icon)
+ avatar.background = ResourcesCompat.getDrawable(
+ context.resources,
+ R.drawable.round_bgnd,
+ null
+ )
+ avatar.cropToPadding = true
+ avatar.setPadding(padding, padding, padding, padding)
+ }
+
+ when (type) {
+ ShareType.GROUP -> {
+ createAvatarBase(R.drawable.ic_group)
+ androidViewThemeUtils.colorImageViewBackgroundAndIcon(avatar)
+ }
+ ShareType.ROOM -> {
+ createAvatarBase(R.drawable.first_run_talk, AvatarPadding.LARGE)
+ androidViewThemeUtils.colorImageViewBackgroundAndIcon(avatar)
+ }
+ ShareType.CIRCLE -> {
+ createAvatarBase(R.drawable.ic_circles)
+ avatar.background.setColorFilter(
+ context.resources.getColor(R.color.nc_grey),
+ PorterDuff.Mode.SRC_IN
+ )
+ avatar.drawable.mutate().setColorFilter(
+ context.resources.getColor(R.color.icon_on_nc_grey),
+ PorterDuff.Mode.SRC_IN
+ )
+ }
+ ShareType.EMAIL -> {
+ createAvatarBase(R.drawable.ic_email, AvatarPadding.LARGE)
+ androidViewThemeUtils.colorImageViewBackgroundAndIcon(avatar)
+ }
+ else -> Log_OC.d(TAG, "Unknown share type")
+ }
+ }
+
+ fun themeFastScrollerBuilder(context: Context, builder: FastScrollerBuilder): FastScrollerBuilder {
+ return withScheme(context) { scheme ->
+ builder
+ .useMd2Style()
+ .setThumbDrawable(getThumbDrawable(context))
+ .setPopupStyle {
+ PopupStyles.MD2.accept(it)
+ it.background = FastScrollPopupBackground(context, scheme.primary)
+ }
+ }
+ }
+
+ private fun getThumbDrawable(
+ context: Context
+ ): Drawable {
+ val thumbDrawable =
+ ResourcesCompat.getDrawable(
+ context.resources,
+ me.zhanghai.android.fastscroll.R.drawable.afs_md2_thumb,
+ null
+ )
+ return androidViewThemeUtils.tintPrimaryDrawable(context, thumbDrawable)!!
+ }
+
+ /**
+ * Sets title and colors the actionbar, the title and the back arrow
+ */
+ // TODO move back arrow resource to lib and use lib method directly?
+ fun themeActionBar(context: Context, actionBar: ActionBar, title: String) {
+ val backArrow = ResourcesCompat.getDrawable(
+ context.resources,
+ R.drawable.ic_arrow_back,
+ null
+ )!!
+ androidXViewThemeUtils.themeActionBar(
+ context,
+ actionBar,
+ title,
+ backArrow
+ )
+ }
+
+ /**
+ * Sets title and colors the actionbar, the title and the back arrow
+ */
+ fun themeActionBar(context: Context, actionBar: ActionBar, @StringRes titleRes: Int) {
+ val title = context.getString(titleRes)
+ themeActionBar(
+ context,
+ actionBar,
+ title
+ )
+ }
+
+ /**
+ * Colors actionbar background and back arrow but not the title
+ */
+ fun themeActionBar(context: Context, actionBar: ActionBar) {
+ val backArrow = ResourcesCompat.getDrawable(
+ context.resources,
+ R.drawable.ic_arrow_back,
+ null
+ )!!
+ androidXViewThemeUtils.themeActionBar(context, actionBar, backArrow)
+ }
+
+ fun themeTemplateCardView(cardView: MaterialCardView) {
+ withScheme(cardView.context) { scheme ->
+ cardView.setStrokeColor(
+ ColorStateList(
+ arrayOf(
+ intArrayOf(android.R.attr.state_checked),
+ intArrayOf(-android.R.attr.state_checked)
+ ),
+ intArrayOf(
+ scheme.primary,
+ scheme.outline
+ )
+ )
+ )
+ }
+ }
+
+ fun themeStatusCardView(cardView: MaterialCardView) {
+ withScheme(cardView) { scheme ->
+ val background = cardView.context.getColor(R.color.grey_200)
+ cardView.backgroundTintList =
+ ColorStateList(
+ arrayOf(
+ intArrayOf(android.R.attr.state_checked),
+ intArrayOf(-android.R.attr.state_checked)
+ ),
+ intArrayOf(
+ scheme.secondaryContainer,
+ background
+ )
+ )
+ cardView.setStrokeColor(
+ ColorStateList(
+ arrayOf(
+ intArrayOf(android.R.attr.state_checked),
+ intArrayOf(-android.R.attr.state_checked)
+ ),
+ intArrayOf(
+ scheme.onSecondaryContainer,
+ scheme.surface
+ )
+ )
+ )
+ }
+ }
+
+ fun themeAvatarButton(shareImageView: ImageView) {
+ withScheme(shareImageView.context) { scheme ->
+ shareImageView.background.setColorFilter(scheme.primary, PorterDuff.Mode.SRC_IN)
+ shareImageView.drawable.mutate().setColorFilter(scheme.onPrimary, PorterDuff.Mode.SRC_IN)
+ }
+ }
+
+ fun primaryColorToHexString(context: Context): String {
+ return withScheme(context) { scheme ->
+ colorUtil.colorToHexString(scheme.primary)
+ }
+ }
+
+ fun setWhiteBackButton(context: Context, supportActionBar: ActionBar) {
+ val backArrow = ResourcesCompat.getDrawable(context.resources, R.drawable.ic_arrow_back, null)
+ val tinted = androidViewThemeUtils.colorDrawable(backArrow!!, Color.WHITE)
+ supportActionBar.setHomeAsUpIndicator(tinted)
+ }
+
+ companion object {
+ private val TAG = FilesSpecificViewThemeUtils::class.simpleName
+
+ private object AvatarPadding {
+ @Px
+ const val SMALL = 4
+
+ @Px
+ const val LARGE = 8
+ }
+ }
+}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/MaterialSchemesProvider.kt b/app/src/main/java/com/owncloud/android/utils/theme/MaterialSchemesProvider.kt
new file mode 100644
index 0000000000..09bae79587
--- /dev/null
+++ b/app/src/main/java/com/owncloud/android/utils/theme/MaterialSchemesProvider.kt
@@ -0,0 +1,38 @@
+/*
+ * Nextcloud Android client application
+ *
+ * @author Álvaro Brey
+ * Copyright (C) 2022 Álvaro Brey
+ * Copyright (C) 2022 Nextcloud GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see .
+ *
+ */
+
+package com.owncloud.android.utils.theme
+
+import com.nextcloud.android.common.ui.theme.MaterialSchemes
+import com.nextcloud.client.account.User
+import com.owncloud.android.lib.resources.status.OCCapability
+
+interface MaterialSchemesProvider {
+ fun getMaterialSchemesForUser(user: User): MaterialSchemes
+ fun getMaterialSchemesForCapability(capability: OCCapability): MaterialSchemes
+ fun getMaterialSchemesForCurrentUser(): MaterialSchemes
+
+ /**
+ * Color schemes for when there's no logged in user
+ */
+ fun getDefaultMaterialSchemes(): MaterialSchemes
+}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/MaterialSchemesProviderImpl.kt b/app/src/main/java/com/owncloud/android/utils/theme/MaterialSchemesProviderImpl.kt
new file mode 100644
index 0000000000..929dc6959f
--- /dev/null
+++ b/app/src/main/java/com/owncloud/android/utils/theme/MaterialSchemesProviderImpl.kt
@@ -0,0 +1,80 @@
+/*
+ * Nextcloud Android client application
+ *
+ * @author Álvaro Brey
+ * Copyright (C) 2022 Álvaro Brey
+ * Copyright (C) 2022 Nextcloud GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see .
+ *
+ */
+
+package com.owncloud.android.utils.theme
+
+import android.content.Context
+import androidx.core.content.ContextCompat
+import com.nextcloud.android.common.ui.theme.MaterialSchemes
+import com.nextcloud.client.account.AnonymousUser
+import com.nextcloud.client.account.User
+import com.nextcloud.client.account.UserAccountManager
+import com.nextcloud.client.logger.Logger
+import com.owncloud.android.R
+import com.owncloud.android.lib.resources.status.OCCapability
+import java.util.concurrent.ConcurrentHashMap
+import javax.inject.Inject
+
+internal class MaterialSchemesProviderImpl @Inject constructor(
+ private val logger: Logger,
+ private val context: Context,
+ private val userAccountManager: UserAccountManager,
+ private val themeFactory: ServerThemeImpl.Factory
+) : MaterialSchemesProvider {
+
+ private val themeCache: MutableMap = ConcurrentHashMap()
+
+ override fun getMaterialSchemesForUser(user: User): MaterialSchemes {
+ val url: String = user.server.uri.toString()
+
+ if (!themeCache.containsKey(url)) {
+ val capability = CapabilityUtils.getCapability(user, context)
+ themeCache[url] = getMaterialSchemesForCapability(capability)
+ }
+
+ return themeCache[url]!!
+ }
+
+ override fun getMaterialSchemesForCapability(capability: OCCapability): MaterialSchemes {
+ val serverTheme = themeFactory.create(capability)
+ return MaterialSchemes.fromServerTheme(serverTheme)
+ }
+
+ override fun getMaterialSchemesForCurrentUser(): MaterialSchemes {
+ return when (val user = userAccountManager.user) {
+ is AnonymousUser -> {
+ logger.d(TAG, "User is anonymous, using default schemes")
+ getDefaultMaterialSchemes()
+ }
+ else -> getMaterialSchemesForUser(user)
+ }
+ }
+
+ override fun getDefaultMaterialSchemes(): MaterialSchemes {
+ val primaryColor = ContextCompat.getColor(context, R.color.primary)
+ return MaterialSchemes.fromColor(primaryColor)
+ }
+
+ companion object {
+ private val TAG = MaterialSchemesProviderImpl::class.java.simpleName
+ }
+}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ServerThemeImpl.kt b/app/src/main/java/com/owncloud/android/utils/theme/ServerThemeImpl.kt
new file mode 100644
index 0000000000..2a2d78b132
--- /dev/null
+++ b/app/src/main/java/com/owncloud/android/utils/theme/ServerThemeImpl.kt
@@ -0,0 +1,55 @@
+/*
+ * Nextcloud Android client application
+ *
+ * @author Álvaro Brey
+ * Copyright (C) 2022 Álvaro Brey
+ * Copyright (C) 2022 Nextcloud GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see .
+ *
+ */
+
+package com.owncloud.android.utils.theme
+
+import com.nextcloud.android.common.ui.color.ColorUtil
+import com.nextcloud.android.common.ui.theme.ServerTheme
+import com.owncloud.android.R
+import com.owncloud.android.lib.resources.status.OCCapability
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+
+class ServerThemeImpl @AssistedInject constructor(colorUtil: ColorUtil, @Assisted capability: OCCapability) :
+ ServerTheme {
+ override val colorElement: Int
+ override val colorElementBright: Int
+ override val colorElementDark: Int
+ override val colorText: Int
+ override val primaryColor: Int
+
+ init {
+ primaryColor =
+ colorUtil.getNullSafeColorWithFallbackRes(capability.serverColor, R.color.colorPrimary)
+ colorElement = colorUtil.getNullSafeColor(capability.serverElementColor, primaryColor)
+ colorElementBright =
+ colorUtil.getNullSafeColor(capability.serverElementColorBright, primaryColor)
+ colorElementDark = colorUtil.getNullSafeColor(capability.serverElementColorDark, primaryColor)
+ colorText = colorUtil.getTextColor(capability.serverTextColor, primaryColor)
+ }
+
+ @AssistedFactory
+ interface Factory {
+ fun create(capability: OCCapability): ServerThemeImpl
+ }
+}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ThemeAvatarUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/ThemeAvatarUtils.java
deleted file mode 100644
index ab3595cddd..0000000000
--- a/app/src/main/java/com/owncloud/android/utils/theme/ThemeAvatarUtils.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * @author Andy Scherzinger
- * Copyright (C) 2017 Tobias Kaminsky
- * Copyright (C) 2017 Nextcloud GmbH
- * Copyright (C) 2018 Andy Scherzinger
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-package com.owncloud.android.utils.theme;
-
-import android.content.Context;
-import android.graphics.PorterDuff;
-import android.widget.ImageView;
-
-import com.owncloud.android.R;
-import com.owncloud.android.lib.resources.shares.ShareType;
-
-import androidx.core.content.res.ResourcesCompat;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-
-/**
- * Utility class with methods for client side button theming.
- */
-public final class ThemeAvatarUtils {
- public void colorIconImageViewWithBackground(ImageView imageView,
- Context context,
- ThemeColorUtils themeColorUtils) {
- int primaryColor = themeColorUtils.primaryColor(null, true, false, context);
-
- imageView.getBackground().setColorFilter(primaryColor, PorterDuff.Mode.SRC_IN);
- imageView.getDrawable().mutate().setColorFilter(themeColorUtils.getColorForPrimary(primaryColor, context),
- PorterDuff.Mode.SRC_IN);
- }
-
- @SuppressFBWarnings(
- value = "SF_SWITCH_NO_DEFAULT",
- justification = "We only create avatars for a subset of share types")
- public void createAvatar(ShareType type,
- ImageView avatar,
- Context context,
- ThemeColorUtils themeColorUtils) {
- switch (type) {
- case GROUP:
- avatar.setImageResource(R.drawable.ic_group);
- avatar.setBackground(ResourcesCompat.getDrawable(context.getResources(),
- R.drawable.round_bgnd,
- null));
- avatar.setCropToPadding(true);
- avatar.setPadding(4, 4, 4, 4);
- colorIconImageViewWithBackground(avatar, context, themeColorUtils);
- break;
-
- case ROOM:
- avatar.setImageResource(R.drawable.first_run_talk);
- avatar.setBackground(ResourcesCompat.getDrawable(context.getResources(),
- R.drawable.round_bgnd,
- null));
- avatar.setCropToPadding(true);
- avatar.setPadding(8, 8, 8, 8);
- colorIconImageViewWithBackground(avatar, context, themeColorUtils);
- break;
-
- case CIRCLE:
- avatar.setImageResource(R.drawable.ic_circles);
- avatar.setBackground(ResourcesCompat.getDrawable(context.getResources(),
- R.drawable.round_bgnd,
- null));
- avatar.getBackground().setColorFilter(context.getResources().getColor(R.color.nc_grey),
- PorterDuff.Mode.SRC_IN);
- avatar.getDrawable().mutate().setColorFilter(context.getResources().getColor(R.color.icon_on_nc_grey),
- PorterDuff.Mode.SRC_IN);
- avatar.setCropToPadding(true);
- avatar.setPadding(4, 4, 4, 4);
- break;
-
- case EMAIL:
- avatar.setImageResource(R.drawable.ic_email);
- avatar.setBackground(ResourcesCompat.getDrawable(context.getResources(),
- R.drawable.round_bgnd,
- null));
- avatar.setCropToPadding(true);
- avatar.setPadding(8, 8, 8, 8);
- avatar.getBackground().setColorFilter(context.getResources().getColor(R.color.nc_grey),
- PorterDuff.Mode.SRC_IN);
- avatar.getDrawable().mutate().setColorFilter(context.getResources().getColor(R.color.icon_on_nc_grey),
- PorterDuff.Mode.SRC_IN);
- break;
- }
- }
-}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ThemeBarUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/ThemeBarUtils.java
deleted file mode 100644
index 4e75a29e2c..0000000000
--- a/app/src/main/java/com/owncloud/android/utils/theme/ThemeBarUtils.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * @author Andy Scherzinger
- * Copyright (C) 2017 Tobias Kaminsky
- * Copyright (C) 2017 Nextcloud GmbH
- * Copyright (C) 2018 Andy Scherzinger
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-package com.owncloud.android.utils.theme;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.PorterDuff;
-import android.widget.ProgressBar;
-import android.widget.SeekBar;
-
-import androidx.annotation.ColorInt;
-
-/**
- * Utility class with methods for client side button theming.
- */
-public final class ThemeBarUtils {
- /**
- * sets the coloring of the given progress bar to given color.
- *
- * @param progressBar the progress bar to be colored
- * @param color the color to be used
- */
- public void colorHorizontalProgressBar(ProgressBar progressBar, @ColorInt int color) {
- if (progressBar != null) {
- progressBar.getIndeterminateDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
- progressBar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
- }
- }
-
- /**
- * sets the coloring of the given progress bar's progress to given color.
- *
- * @param progressBar the progress bar to be colored
- * @param color the color to be used
- */
- public void colorProgressBar(ProgressBar progressBar, @ColorInt int color) {
- if (progressBar != null) {
- progressBar.setProgressTintList(ColorStateList.valueOf(color));
- }
- }
-
- /**
- * sets the coloring of the given seek bar to color_accent.
- *
- * @param seekBar the seek bar to be colored
- */
- public void colorHorizontalSeekBar(SeekBar seekBar, Context context, ThemeColorUtils themeColorUtils) {
- int color = themeColorUtils.primaryAccentColor(context);
-
- colorHorizontalProgressBar(seekBar, color);
- seekBar.getThumb().setColorFilter(color, PorterDuff.Mode.SRC_IN);
- }
-
- public void themeProgressBar(Context context, ProgressBar progressBar, ThemeColorUtils themeColorUtils) {
- // TODO harmonize methods
- int color = themeColorUtils.primaryAccentColor(context);
- progressBar.getIndeterminateDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
- }
-}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ThemeButtonUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/ThemeButtonUtils.java
deleted file mode 100644
index 74cb20cb7c..0000000000
--- a/app/src/main/java/com/owncloud/android/utils/theme/ThemeButtonUtils.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * @author Andy Scherzinger
- * Copyright (C) 2017 Tobias Kaminsky
- * Copyright (C) 2017 Nextcloud GmbH
- * Copyright (C) 2018 Andy Scherzinger
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-package com.owncloud.android.utils.theme;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.Color;
-import android.graphics.PorterDuff;
-import android.widget.Button;
-import android.widget.ImageButton;
-
-import com.owncloud.android.R;
-
-import androidx.annotation.ColorInt;
-import androidx.annotation.Nullable;
-import androidx.core.content.ContextCompat;
-
-/**
- * Utility class with methods for client side button theming.
- */
-public final class ThemeButtonUtils {
- /**
- * sets the tinting of the given ImageButton's icon to color_accent.
- *
- * @param imageButton the image button who's icon should be colored
- */
- public void colorImageButton(ImageButton imageButton, @ColorInt int color) {
- if (imageButton != null) {
- imageButton.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
- }
- }
-
- public void colorPrimaryButton(Button button, Context context, ThemeColorUtils themeColorUtils) {
- int primaryColor = themeColorUtils.primaryColor(null, true, false, context);
- int fontColor = themeColorUtils.fontColor(context, false);
-
- button.setBackgroundColor(primaryColor);
-
- if (Color.BLACK == primaryColor) {
- button.setTextColor(Color.WHITE);
- } else if (Color.WHITE == primaryColor) {
- button.setTextColor(Color.BLACK);
- } else {
- button.setTextColor(fontColor);
- }
- }
-
- /**
- * theme buttons based on accent color.
- *
- * @param buttons borderless buttons to be themed
- */
- public void themeBorderlessButton(ThemeColorUtils themeColorUtils, @Nullable Button... buttons) {
- if (buttons == null || buttons.length < 1) {
- return;
- }
- themeBorderlessButton(themeColorUtils.primaryAccentColor(buttons[0].getContext()), buttons);
- }
-
- /**
- * theme buttons based on given color.
- *
- * @param color theme color
- * @param buttons borderless buttons to be themed
- */
- public void themeBorderlessButton(int color, @Nullable Button... buttons) {
- if (buttons == null || buttons.length < 1) {
- return;
- }
- Context context = buttons[0].getContext();
- int disabledColor = ContextCompat.getColor(context, R.color.disabled_text);
- ColorStateList colorStateList = new ColorStateList(
- new int[][]{
- new int[]{android.R.attr.state_enabled}, // enabled
- new int[]{-android.R.attr.state_enabled}, // disabled
- },
- new int[]{
- color,
- disabledColor
- }
- );
- for (Button button: buttons) {
- button.setTextColor(colorStateList);
- }
- }
-}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ThemeCheckableUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/ThemeCheckableUtils.java
deleted file mode 100644
index 2f69cb4d45..0000000000
--- a/app/src/main/java/com/owncloud/android/utils/theme/ThemeCheckableUtils.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * @author Andy Scherzinger
- * Copyright (C) 2017 Tobias Kaminsky
- * Copyright (C) 2017 Nextcloud GmbH
- * Copyright (C) 2018 Andy Scherzinger
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-package com.owncloud.android.utils.theme;
-
-import android.content.res.ColorStateList;
-import android.graphics.Color;
-
-import com.owncloud.android.R;
-
-import androidx.appcompat.app.AppCompatDelegate;
-import androidx.appcompat.widget.AppCompatCheckBox;
-import androidx.appcompat.widget.SwitchCompat;
-import androidx.core.graphics.drawable.DrawableCompat;
-import androidx.core.widget.CompoundButtonCompat;
-
-/**
- * Utility class with methods for client side checkable theming.
- */
-public final class ThemeCheckableUtils {
- public void tintCheckbox(int color, AppCompatCheckBox... checkBoxes) {
- if (checkBoxes != null) {
- for (AppCompatCheckBox checkBox : checkBoxes) {
- CompoundButtonCompat.setButtonTintList(checkBox, new ColorStateList(
- new int[][]{
- new int[]{-android.R.attr.state_checked},
- new int[]{android.R.attr.state_checked},
- },
- new int[]{
- Color.GRAY,
- color
- }
- ));
- }
- }
- }
-
- public void tintSwitch(SwitchCompat switchView, ThemeColorUtils themeColorUtils) {
- int trackColor = switchView.getContext().getResources().getColor(R.color.grey_200);
- ColorStateList thumbColorStateList;
- ColorStateList trackColorStateList;
- int thumbColor = themeColorUtils.primaryAccentColor(switchView.getContext());
- if (themeColorUtils.darkTheme(switchView.getContext()) &&
- AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
- thumbColor = Color.WHITE;
- trackColor = Color.DKGRAY;
- }
- thumbColorStateList = new ColorStateList(
- new int[][]{new int[]{android.R.attr.state_checked}, new int[]{}},
- new int[]{thumbColor, switchView.getContext().getResources().getColor(R.color.switch_thumb_color_unchecked)});
- trackColorStateList = new ColorStateList(
- new int[][]{new int[]{android.R.attr.state_checked},
- new int[]{}},
- new int[]{trackColor, trackColor});
- DrawableCompat.setTintList(switchView.getThumbDrawable(), thumbColorStateList);
- DrawableCompat.setTintList(switchView.getTrackDrawable(), trackColorStateList);
- }
-}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ThemeColorUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/ThemeColorUtils.java
index fae8703d2f..92980125f9 100644
--- a/app/src/main/java/com/owncloud/android/utils/theme/ThemeColorUtils.java
+++ b/app/src/main/java/com/owncloud/android/utils/theme/ThemeColorUtils.java
@@ -24,277 +24,20 @@ package com.owncloud.android.utils.theme;
import android.accounts.Account;
import android.content.Context;
-import android.content.res.Configuration;
import android.graphics.Color;
-import com.nextcloud.client.account.User;
+import com.nextcloud.android.common.ui.util.PlatformThemeUtil;
import com.owncloud.android.R;
-import com.owncloud.android.lib.resources.status.OCCapability;
-
-import androidx.appcompat.app.AppCompatDelegate;
-import androidx.core.content.ContextCompat;
-import androidx.core.graphics.ColorUtils;
import static com.owncloud.android.utils.theme.CapabilityUtils.getCapability;
/**
* Utility class with methods for theming related.
+ *
+ * @deprecated use material 3 Schemes and utilities from common lib instead
*/
+@Deprecated
public class ThemeColorUtils {
-
- private static final int INDEX_LUMINATION = 2;
- private static final double MAX_LIGHTNESS = 0.92;
- public static final double LUMINATION_THRESHOLD = 0.8;
-
- public ThemeColorUtils() {
- }
-
- public int primaryAccentColor(Context context) {
- OCCapability capability = CapabilityUtils.getCapability(context);
-
- try {
- float adjust;
- if (isDarkModeActive(context)) {
- adjust = +0.5f;
- } else {
- adjust = -0.1f;
- }
- return adjustLightness(adjust, Color.parseColor(capability.getServerColor()), 0.35f);
- } catch (Exception e) {
- return context.getResources().getColor(R.color.color_accent);
- }
- }
-
- public int primaryDarkColor(Context context) {
- return primaryDarkColor(null, context);
- }
-
- public int primaryDarkColor(Account account, Context context) {
- OCCapability capability = CapabilityUtils.getCapability(account, context);
-
- try {
- return calculateDarkColor(Color.parseColor(capability.getServerColor()), context);
- } catch (Exception e) {
- return context.getResources().getColor(R.color.primary_dark);
- }
- }
-
- public int calculateDarkColor(int color, Context context) {
- try {
- return adjustLightness(-0.2f, color, -1f);
- } catch (Exception e) {
- return context.getResources().getColor(R.color.primary_dark);
- }
- }
-
- public int primaryColor(Context context) {
- return primaryColor(context, false);
- }
-
- public int primaryColor(Context context, boolean replaceEdgeColors) {
- User nullUser = null;
- return primaryColor(nullUser, replaceEdgeColors, context);
- }
-
- public int primaryColor(User user, boolean replaceEdgeColors, Context context) {
- return primaryColor(user != null ? user.toPlatformAccount() : null,
- replaceEdgeColors,
- false,
- context);
- }
-
- public int primaryColor(Account account, boolean replaceEdgeColors, Context context) {
- return primaryColor(account, replaceEdgeColors, false, context);
- }
-
- /**
- * return the primary color defined in the server-side theming respecting Android dark/light theming and edge case
- * scenarios including drawer menu.
- *
- * @param account the Nextcloud user
- * @param replaceEdgeColors flag if edge case color scenarios should be handled
- * @param replaceEdgeColorsByInvertedColor flag in edge case handling should be done via color inversion
- * (black/white)
- * @param context the context (needed to load client-side colors)
- * @return the color
- */
- public int primaryColor(Account account,
- boolean replaceEdgeColors,
- boolean replaceEdgeColorsByInvertedColor,
- Context context) {
- if (context == null) {
- return Color.GRAY;
- }
-
- try {
- int color = Color.parseColor(getCapability(account, context).getServerColor());
- if (replaceEdgeColors) {
- if (isDarkModeActive(context)) {
- if (Color.BLACK == color) {
- if (replaceEdgeColorsByInvertedColor) {
- return Color.WHITE;
- } else {
- return getNeutralGrey(context);
- }
- } else {
- return color;
- }
- } else {
- if (Color.WHITE == color) {
- if (replaceEdgeColorsByInvertedColor) {
- return Color.BLACK;
- } else {
- return getNeutralGrey(context);
- }
- } else {
- return color;
- }
- }
- } else {
- return color;
- }
- } catch (Exception e) {
- return context.getResources().getColor(R.color.primary);
- }
- }
-
- public int getNeutralGrey(Context context) {
- return darkTheme(context) ? context.getResources().getColor(R.color.fg_contrast) : Color.GRAY;
- }
-
- public boolean themingEnabled(Context context) {
- return CapabilityUtils.getCapability(context).getServerColor() != null &&
- !CapabilityUtils.getCapability(context).getServerColor().isEmpty();
- }
-
- /**
- * returns the font color based on the server side theming and uses black/white as a fallback based on
- * replaceWhite.
- *
- * @param context the context
- * @param replaceWhite FLAG to return white/black if server side color isn't available
- * @return int font color to use
- */
- public int fontColor(Context context, boolean replaceWhite) {
- if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
- if (replaceWhite) {
- return Color.BLACK;
- } else {
- return Color.WHITE;
- }
- }
-
- try {
- return Color.parseColor(getCapability(context).getServerTextColor());
- } catch (Exception e) {
- if (darkTheme(context)) {
- return Color.WHITE;
- } else {
- return Color.BLACK;
- }
- }
- }
-
- public int fontColor(Context context) {
- return fontColor(context, false);
- }
-
- /**
- * Tests if light color is set
- *
- * @param color the color
- * @return true if primaryColor is lighter than MAX_LIGHTNESS
- */
- public boolean lightTheme(int color) {
- float[] hsl = colorToHSL(color);
-
- return hsl[INDEX_LUMINATION] >= MAX_LIGHTNESS;
- }
-
- /**
- * Tests if dark color is set
- *
- * @return true if dark theme -> e.g.use light font color, darker accent color
- */
- public boolean darkTheme(Context context) {
- int primaryColor = primaryColor(context);
- float[] hsl = colorToHSL(primaryColor);
-
- return hsl[INDEX_LUMINATION] <= 0.55;
- }
-
- public int primaryAppbarColor(Context context) {
- return ContextCompat.getColor(context, R.color.appbar);
- }
-
- public int appBarPrimaryFontColor(Context context) {
- return ContextCompat.getColor(context, R.color.fontAppbar);
- }
-
- public int appBarSecondaryFontColor(Context context) {
- return ContextCompat.getColor(context, R.color.fontSecondaryAppbar);
- }
-
- public int actionModeColor(Context context) {
- return ContextCompat.getColor(context, R.color.action_mode_background);
- }
-
- /**
- * Adjust lightness of given color
- *
- * @param lightnessDelta values -1..+1
- * @param color original color
- * @param threshold 0..1 as maximum value, -1 to disable
- * @return color adjusted by lightness
- */
- public int adjustLightness(float lightnessDelta, int color, float threshold) {
- float[] hsl = colorToHSL(color);
-
- if (threshold == -1f) {
- hsl[INDEX_LUMINATION] += lightnessDelta;
- } else {
- hsl[INDEX_LUMINATION] = Math.min(hsl[INDEX_LUMINATION] + lightnessDelta, threshold);
- }
-
- return ColorUtils.HSLToColor(hsl);
- }
-
- private float[] colorToHSL(int color) {
- float[] hsl = new float[3];
- ColorUtils.RGBToHSL(Color.red(color), Color.green(color), Color.blue(color), hsl);
-
- return hsl;
- }
-
- public String colorToHexString(int color) {
- return String.format("#%06X", 0xFFFFFF & color);
- }
-
- /**
- * returns a primary color matching color for texts/icons on top of a primary-colored element (like buttons).
- *
- * @param primaryColor the primary color
- */
- public int getColorForPrimary(int primaryColor, Context context) {
- if (Color.BLACK == primaryColor) {
- return Color.WHITE;
- } else if (Color.WHITE == primaryColor) {
- return Color.BLACK;
- } else {
- return fontColor(context, false);
- }
- }
-
- public static boolean isDarkModeActive(Context context) {
- int nightModeFlag = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
-
- return Configuration.UI_MODE_NIGHT_YES == nightModeFlag;
- }
-
- public String primaryColorToHexString(Context context) {
- return String.format("#%06X", 0xFFFFFF & primaryColor(context, true));
- }
-
public int unchangedPrimaryColor(Account account, Context context) {
try {
return Color.parseColor(getCapability(account, context).getServerColor());
@@ -307,7 +50,7 @@ public class ThemeColorUtils {
try {
return Color.parseColor(getCapability(context).getServerTextColor());
} catch (Exception e) {
- if (darkTheme(context)) {
+ if (PlatformThemeUtil.isDarkMode(context)) {
return Color.WHITE;
} else {
return Color.BLACK;
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ThemeDrawableUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/ThemeDrawableUtils.java
deleted file mode 100644
index 68138b9f49..0000000000
--- a/app/src/main/java/com/owncloud/android/utils/theme/ThemeDrawableUtils.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * @author Andy Scherzinger
- * Copyright (C) 2017 Tobias Kaminsky
- * Copyright (C) 2017 Nextcloud GmbH
- * Copyright (C) 2018 Andy Scherzinger
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-package com.owncloud.android.utils.theme;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
-
-import androidx.annotation.DrawableRes;
-import androidx.annotation.Nullable;
-import androidx.appcompat.app.AppCompatDelegate;
-import androidx.core.content.res.ResourcesCompat;
-import androidx.core.graphics.drawable.DrawableCompat;
-
-/**
- * Utility class with methods for client side button theming.
- */
-public final class ThemeDrawableUtils {
- private final Context context;
-
- public ThemeDrawableUtils(Context context) {
- this.context = context;
- }
-
- public Drawable tintDrawable(@DrawableRes int id, int color) {
- return tintDrawable(ResourcesCompat.getDrawable(context.getResources(), id, null), color);
- }
-
- @Nullable
- public Drawable tintDrawable(Drawable drawable, int color) {
- if (drawable != null) {
- Drawable wrap = DrawableCompat.wrap(drawable);
- wrap.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
-
- return wrap;
- }
-
- return null;
- }
-
- public void setIconColor(Drawable drawable) {
- int color;
-
- if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
- color = Color.WHITE;
- } else {
- color = Color.BLACK;
- }
-
- tintDrawable(drawable, color);
- }
-}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ThemeFabUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/ThemeFabUtils.java
deleted file mode 100644
index 250e1a4e42..0000000000
--- a/app/src/main/java/com/owncloud/android/utils/theme/ThemeFabUtils.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * @author Andy Scherzinger
- * Copyright (C) 2017 Tobias Kaminsky
- * Copyright (C) 2017 Nextcloud GmbH
- * Copyright (C) 2018 Andy Scherzinger
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-package com.owncloud.android.utils.theme;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-
-import com.google.android.material.floatingactionbutton.FloatingActionButton;
-
-import androidx.annotation.DrawableRes;
-
-/**
- * Utility class with methods for client side FAB theming.
- */
-public class ThemeFabUtils {
- private final ThemeColorUtils themeColorUtils;
- private final ThemeDrawableUtils themeDrawableUtils;
-
- public ThemeFabUtils(ThemeColorUtils themeColorUtils,
- ThemeDrawableUtils themeDrawableUtils) {
- this.themeColorUtils = themeColorUtils;
- this.themeDrawableUtils = themeDrawableUtils;
- }
-
- public void colorFloatingActionButton(FloatingActionButton button,
- @DrawableRes int drawable,
- Context context) {
- int primaryColor = themeColorUtils.primaryColor(null, true, false, context);
-
- colorFloatingActionButton(button, context, primaryColor);
- button.setImageDrawable(themeDrawableUtils.tintDrawable(drawable,
- themeColorUtils.getColorForPrimary(primaryColor,
- context)));
- }
-
- public void colorFloatingActionButton(FloatingActionButton button,
- Context context) {
- colorFloatingActionButton(button,
- context,
- themeColorUtils.primaryColor(null, true, false, context));
- }
-
- public void colorFloatingActionButton(FloatingActionButton button,
- Context context,
- int primaryColor) {
- colorFloatingActionButton(button, primaryColor, themeColorUtils.calculateDarkColor(primaryColor, context));
- }
-
- public void colorFloatingActionButton(FloatingActionButton button, int backgroundColor, int rippleColor) {
- button.setBackgroundTintList(ColorStateList.valueOf(backgroundColor));
- button.setRippleColor(rippleColor);
- }
-}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ThemeLayoutUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/ThemeLayoutUtils.java
deleted file mode 100644
index 14e5615ad6..0000000000
--- a/app/src/main/java/com/owncloud/android/utils/theme/ThemeLayoutUtils.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * @author Andy Scherzinger
- * Copyright (C) 2017 Tobias Kaminsky
- * Copyright (C) 2017 Nextcloud GmbH
- * Copyright (C) 2018 Andy Scherzinger
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-package com.owncloud.android.utils.theme;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.Color;
-
-import com.google.android.material.tabs.TabLayout;
-import com.owncloud.android.R;
-
-import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
-
-/**
- * Utility class with methods for client side checkable theming.
- */
-public class ThemeLayoutUtils {
- private final ThemeColorUtils themeColorUtils;
-
- public ThemeLayoutUtils(ThemeColorUtils themeColorUtils) {
- this.themeColorUtils = themeColorUtils;
- }
-
- public void colorSwipeRefreshLayout(Context context,
- SwipeRefreshLayout swipeRefreshLayout) {
- int primaryColor = themeColorUtils.primaryColor(context);
- int darkColor = themeColorUtils.primaryDarkColor(context);
- int accentColor = themeColorUtils.primaryAccentColor(context);
-
- swipeRefreshLayout.setColorSchemeColors(accentColor, primaryColor, darkColor);
- swipeRefreshLayout.setProgressBackgroundColorSchemeResource(R.color.bg_elevation_one);
- }
-
- public void colorTabLayout(Context context, TabLayout tabLayout) {
- int primaryColor = themeColorUtils.primaryColor(context, true);
- int textColor = context.getResources().getColor(R.color.text_color);
- tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
- tabLayout.setSelectedTabIndicatorColor(primaryColor);
- tabLayout.setTabTextColors(textColor, primaryColor);
- tabLayout.setTabIconTint(new ColorStateList(
- new int[][]{
- new int[]{android.R.attr.state_selected},
- new int[]{android.R.attr.state_enabled},
- new int[]{-android.R.attr.state_enabled}
- },
- new int[]{
- primaryColor,
- textColor,
- Color.GRAY
- }
- ));
- }
-}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ThemeMenuUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/ThemeMenuUtils.java
deleted file mode 100644
index 7b862b665f..0000000000
--- a/app/src/main/java/com/owncloud/android/utils/theme/ThemeMenuUtils.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * @author Andy Scherzinger
- * @author TSI-mc
- * Copyright (C) 2017 Tobias Kaminsky
- * Copyright (C) 2017 Nextcloud GmbH
- * Copyright (C) 2018 Andy Scherzinger
- * Copyright (C) 2022 TSI-mc
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-package com.owncloud.android.utils.theme;
-
-import android.graphics.drawable.Drawable;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.style.ForegroundColorSpan;
-import android.view.MenuItem;
-
-import androidx.annotation.NonNull;
-import androidx.core.graphics.drawable.DrawableCompat;
-
-/**
- * Utility class with methods for client side checkable theming.
- */
-public final class ThemeMenuUtils {
- /**
- * Will change a menu item text tint
- *
- * @param item the menu item object
- * @param color the wanted color (as resource or color)
- */
- public void tintMenuItemText(MenuItem item, int color) {
- SpannableString newItemTitle = new SpannableString(item.getTitle());
- newItemTitle.setSpan(new ForegroundColorSpan(color), 0, newItemTitle.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- item.setTitle(newItemTitle);
- }
-
- /**
- * tinting menu item color
- *
- * @param item the menu item object
- * @param color the color wanted as a color resource
- */
- public void tintMenuIcon(@NonNull MenuItem item, int color) {
- Drawable normalDrawable = item.getIcon();
- Drawable wrapDrawable = DrawableCompat.wrap(normalDrawable);
- DrawableCompat.setTint(wrapDrawable, color);
- item.setIcon(wrapDrawable);
- }
-}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ThemeSnackbarUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/ThemeSnackbarUtils.java
deleted file mode 100644
index 6511954fe4..0000000000
--- a/app/src/main/java/com/owncloud/android/utils/theme/ThemeSnackbarUtils.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * @author Andy Scherzinger
- * Copyright (C) 2017 Tobias Kaminsky
- * Copyright (C) 2017 Nextcloud GmbH
- * Copyright (C) 2018 Andy Scherzinger
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-package com.owncloud.android.utils.theme;
-
-import android.content.Context;
-
-import com.google.android.material.snackbar.Snackbar;
-import com.owncloud.android.R;
-
-import androidx.core.content.ContextCompat;
-
-/**
- * Utility class with methods for client side button theming.
- */
-public final class ThemeSnackbarUtils {
- /**
- * set the Nextcloud standard colors for the snackbar.
- *
- * @param context the context relevant for setting the color according to the context's theme
- * @param snackbar the snackbar to be colored
- */
- public void colorSnackbar(Context context, Snackbar snackbar) {
- // Changing action button text color
- snackbar.setActionTextColor(ContextCompat.getColor(context, R.color.fg_inverse));
- }
-}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ThemeTextInputUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/ThemeTextInputUtils.java
deleted file mode 100644
index c7a7e471d2..0000000000
--- a/app/src/main/java/com/owncloud/android/utils/theme/ThemeTextInputUtils.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * @author Andy Scherzinger
- * Copyright (C) 2017 Tobias Kaminsky
- * Copyright (C) 2017 Nextcloud GmbH
- * Copyright (C) 2018 Andy Scherzinger
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-package com.owncloud.android.utils.theme;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.Color;
-import android.graphics.PorterDuff;
-import android.widget.EditText;
-
-import com.google.android.material.textfield.TextInputEditText;
-import com.google.android.material.textfield.TextInputLayout;
-import com.owncloud.android.R;
-
-import androidx.core.content.ContextCompat;
-
-/**
- * Utility class with methods for client side text input theming.
- */
-public final class ThemeTextInputUtils {
- /**
- * Sets the color of the (containerized) text input TextInputLayout to {@code color} for hint text, box stroke and
- * highlight color.
- *
- * @param textInputLayout the TextInputLayout instance
- * @param textInputEditText the TextInputEditText child element
- * @param color the color to be used for the hint text and box stroke
- */
- public void colorTextInput(TextInputLayout textInputLayout,
- TextInputEditText textInputEditText,
- int color,
- int errorColor) {
- textInputEditText.setHighlightColor(color);
- colorTextInputLayout(textInputLayout, color, errorColor);
- }
-
- /**
- * Sets the color of the TextInputLayout to {@code color} for hint text and box stroke.
- *
- * @param textInputLayout the TextInputLayout instance
- * @param color the color to be used for the hint text and box stroke
- */
- private void colorTextInputLayout(TextInputLayout textInputLayout, int color, int errorColor) {
- textInputLayout.setBoxStrokeColor(color);
- textInputLayout.setErrorIconTintList(new ColorStateList(
- new int[][]{
- new int[]{-android.R.attr.state_focused},
- new int[]{android.R.attr.state_focused},
- },
- new int[]{
- errorColor,
- errorColor
- }
- ));
- textInputLayout.setErrorTextColor(new ColorStateList(
- new int[][]{
- new int[]{-android.R.attr.state_focused},
- new int[]{android.R.attr.state_focused},
- },
- new int[]{
- errorColor,
- errorColor
- }
- ));
- textInputLayout.setBoxStrokeErrorColor(new ColorStateList(
- new int[][]{
- new int[]{-android.R.attr.state_focused},
- new int[]{android.R.attr.state_focused},
- },
- new int[]{
- errorColor,
- errorColor
- }
- ));
- textInputLayout.setDefaultHintTextColor(new ColorStateList(
- new int[][]{
- new int[]{-android.R.attr.state_focused},
- new int[]{android.R.attr.state_focused},
- },
- new int[]{
- Color.GRAY,
- color
- }
- ));
- }
-
- public void themeEditText(Context context,
- EditText editText,
- boolean themedBackground,
- ThemeColorUtils themeColorUtils) {
- if (editText == null) {
- return;
- }
-
- int color = ContextCompat.getColor(context, R.color.text_color);
-
- if (themedBackground) {
- if (themeColorUtils.darkTheme(context)) {
- color = ContextCompat.getColor(context, R.color.themed_fg);
- } else {
- color = ContextCompat.getColor(context, R.color.themed_fg_inverse);
- }
- }
-
- setEditTextColor(context, editText, color);
- }
-
- public void setEditTextColor(Context context, EditText editText, int color) {
- editText.setTextColor(color);
- editText.setHighlightColor(context.getResources().getColor(R.color.fg_contrast));
- }
-
- public void colorEditText(EditText editText, int color) {
- if (editText != null) {
- editText.setTextColor(color);
- editText.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
- }
- }
-}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ThemeTextUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/ThemeTextUtils.java
deleted file mode 100644
index 1d3a300921..0000000000
--- a/app/src/main/java/com/owncloud/android/utils/theme/ThemeTextUtils.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * @author Andy Scherzinger
- * Copyright (C) 2017 Tobias Kaminsky
- * Copyright (C) 2017 Nextcloud GmbH
- * Copyright (C) 2018 Andy Scherzinger
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-package com.owncloud.android.utils.theme;
-
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.Spanned;
-import android.text.style.ForegroundColorSpan;
-
-/**
- * Utility class with methods for client side checkable theming.
- */
-public final class ThemeTextUtils {
- public Spanned getColoredTitle(String title, int color) {
- Spannable text = new SpannableString(title);
- text.setSpan(new ForegroundColorSpan(color),
- 0,
- text.length(),
- Spannable.SPAN_INCLUSIVE_INCLUSIVE);
-
- return text;
- }
-
-
-}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ThemeToolbarUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/ThemeToolbarUtils.java
deleted file mode 100644
index 2939c9c7fc..0000000000
--- a/app/src/main/java/com/owncloud/android/utils/theme/ThemeToolbarUtils.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * @author Andy Scherzinger
- * Copyright (C) 2017 Tobias Kaminsky
- * Copyright (C) 2017 Nextcloud GmbH
- * Copyright (C) 2018 Andy Scherzinger
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-package com.owncloud.android.utils.theme;
-
-import android.app.Activity;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.style.ForegroundColorSpan;
-import android.view.View;
-import android.view.Window;
-import android.widget.ImageView;
-
-import com.owncloud.android.R;
-
-import androidx.annotation.ColorInt;
-import androidx.annotation.Nullable;
-import androidx.appcompat.app.ActionBar;
-import androidx.appcompat.widget.SearchView;
-import androidx.core.content.res.ResourcesCompat;
-
-/**
- * Utility class with methods for client side action/toolbar theming.
- */
-public class ThemeToolbarUtils {
- private final ThemeColorUtils themeColorUtils;
- private final ThemeDrawableUtils themeDrawableUtils;
- private final ThemeTextInputUtils themeTextInputUtils;
-
- public ThemeToolbarUtils(ThemeColorUtils themeColorUtils,
- ThemeDrawableUtils themeDrawableUtils,
- ThemeTextInputUtils themeTextInputUtils) {
- this.themeColorUtils = themeColorUtils;
- this.themeDrawableUtils = themeDrawableUtils;
- this.themeTextInputUtils = themeTextInputUtils;
- }
-
- /**
- * For activities that do not use drawer, e.g. Settings, this can be used to correctly tint back button based on
- * theme
- *
- * @param supportActionBar the back button's action bar
- */
- public void tintBackButton(@Nullable ActionBar supportActionBar, Context context) {
- tintBackButton(supportActionBar, context, themeColorUtils.appBarPrimaryFontColor(context));
- }
-
- public void tintBackButton(@Nullable ActionBar supportActionBar, Context context, @ColorInt int color) {
- if (supportActionBar == null) {
- return;
- }
-
- Drawable backArrow = ResourcesCompat.getDrawable(context.getResources(), R.drawable.ic_arrow_back, null);
- supportActionBar.setHomeAsUpIndicator(themeDrawableUtils.tintDrawable(backArrow, color));
- }
-
- /**
- * Set color of title to white/black depending on background color
- *
- * @param actionBar actionBar to be used
- * @param title title to be shown
- */
- public void setColoredTitle(@Nullable ActionBar actionBar, String title, Context context) {
- if (actionBar != null) {
- Spannable text = new SpannableString(title);
- text.setSpan(new ForegroundColorSpan(themeColorUtils.appBarPrimaryFontColor(context)),
- 0,
- text.length(),
- Spannable.SPAN_INCLUSIVE_INCLUSIVE);
- actionBar.setTitle(text);
- }
- }
-
- public void setColoredTitle(@Nullable ActionBar actionBar, int titleId, Context context) {
- setColoredTitle(actionBar, context.getString(titleId), context);
- }
-
- /**
- * Set color of subtitle to white/black depending on background color
- *
- * @param actionBar actionBar to be used
- * @param title title to be shown
- */
- public void setColoredSubtitle(@Nullable ActionBar actionBar, String title, Context context) {
- if (actionBar != null) {
- Spannable text = new SpannableString(title);
- text.setSpan(new ForegroundColorSpan(themeColorUtils.appBarSecondaryFontColor(context)),
- 0,
- text.length(),
- Spannable.SPAN_INCLUSIVE_INCLUSIVE);
- actionBar.setSubtitle(text);
- }
- }
-
- /**
- * Theme search view
- *
- * @param searchView searchView to be changed
- * @param context the app's context
- */
- public void themeSearchView(SearchView searchView, Context context) {
- // hacky as no default way is provided
- int fontColor = themeColorUtils.appBarPrimaryFontColor(context);
- SearchView.SearchAutoComplete editText = searchView.findViewById(R.id.search_src_text);
- editText.setTextSize(16);
- themeTextInputUtils.setEditTextColor(context, editText, fontColor);
- editText.setHintTextColor(themeColorUtils.appBarSecondaryFontColor(context));
-
- ImageView closeButton = searchView.findViewById(androidx.appcompat.R.id.search_close_btn);
- closeButton.setColorFilter(fontColor);
- ImageView searchButton = searchView.findViewById(androidx.appcompat.R.id.search_button);
- searchButton.setColorFilter(fontColor);
- }
-
- /**
- * Sets the color of the status bar to {@code color}.
- *
- * @param fragmentActivity fragment activity
- * @param color the color
- */
- public void colorStatusBar(Activity fragmentActivity, @ColorInt int color) {
- Window window = fragmentActivity.getWindow();
- boolean isLightTheme = themeColorUtils.lightTheme(color);
- if (window != null) {
- window.setStatusBarColor(color);
- View decor = window.getDecorView();
- if (isLightTheme) {
- int systemUiFlagLightStatusBar;
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- systemUiFlagLightStatusBar = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
- } else {
- systemUiFlagLightStatusBar = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
- }
- decor.setSystemUiVisibility(systemUiFlagLightStatusBar);
- } else {
- decor.setSystemUiVisibility(0);
- }
- }
- }
-
- public void colorStatusBar(Activity fragmentActivity) {
- colorStatusBar(fragmentActivity, themeColorUtils.primaryAppbarColor(fragmentActivity));
- }
-}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ThemeUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/ThemeUtils.java
index 0939c8d809..94a5207c05 100644
--- a/app/src/main/java/com/owncloud/android/utils/theme/ThemeUtils.java
+++ b/app/src/main/java/com/owncloud/android/utils/theme/ThemeUtils.java
@@ -51,10 +51,4 @@ public final class ThemeUtils {
}
}
}
-
- public boolean isDarkModeActive(Context context) {
- int nightModeFlag = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
-
- return Configuration.UI_MODE_NIGHT_YES == nightModeFlag;
- }
}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ViewThemeUtils.kt b/app/src/main/java/com/owncloud/android/utils/theme/ViewThemeUtils.kt
new file mode 100644
index 0000000000..38da91860b
--- /dev/null
+++ b/app/src/main/java/com/owncloud/android/utils/theme/ViewThemeUtils.kt
@@ -0,0 +1,55 @@
+/*
+ * Nextcloud Android client application
+ *
+ * @author Álvaro Brey
+ * Copyright (C) 2022 Álvaro Brey
+ * Copyright (C) 2022 Nextcloud GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see .
+ *
+ */
+
+package com.owncloud.android.utils.theme
+
+import com.nextcloud.android.common.ui.color.ColorUtil
+import com.nextcloud.android.common.ui.theme.MaterialSchemes
+import com.nextcloud.android.common.ui.theme.ViewThemeUtilsBase
+import com.nextcloud.android.common.ui.theme.utils.AndroidViewThemeUtils
+import com.nextcloud.android.common.ui.theme.utils.AndroidXViewThemeUtils
+import com.nextcloud.android.common.ui.theme.utils.DialogViewThemeUtils
+import com.nextcloud.android.common.ui.theme.utils.MaterialViewThemeUtils
+import javax.inject.Inject
+
+/**
+ * Child fields intentionally constructed instead of injected in order to reuse schemes for performance
+ */
+class ViewThemeUtils @Inject constructor(
+ schemes: MaterialSchemes,
+ colorUtil: ColorUtil
+) : ViewThemeUtilsBase(schemes) {
+ @JvmField
+ val platform = AndroidViewThemeUtils(schemes, colorUtil)
+
+ @JvmField
+ val material = MaterialViewThemeUtils(schemes, colorUtil)
+
+ @JvmField
+ val androidx = AndroidXViewThemeUtils(schemes, platform)
+
+ @JvmField
+ val dialog = DialogViewThemeUtils(schemes)
+
+ @JvmField
+ val files = FilesSpecificViewThemeUtils(schemes, colorUtil, platform, androidx)
+}
diff --git a/app/src/main/res/layout/account_item.xml b/app/src/main/res/layout/account_item.xml
index 7dbe268cb5..f942d11740 100644
--- a/app/src/main/res/layout/account_item.xml
+++ b/app/src/main/res/layout/account_item.xml
@@ -27,7 +27,8 @@
android:layout_margin="@dimen/standard_quarter_margin"
android:orientation="horizontal"
app:cardBackgroundColor="@color/transparent"
- app:cardElevation="0dp">
+ app:cardElevation="0dp"
+ app:strokeWidth="@dimen/zero">
@@ -93,7 +94,7 @@
android:layout_height="wrap_content"
android:text="@string/daily_backup"
android:textColor="@color/text_color"
- android:textSize="14sp" />
+ android:textSize="@dimen/two_line_primary_text_size" />
-
-
+ android:layout_marginTop="@dimen/standard_margin"
+ android:gravity="center"
+ android:orientation="horizontal"
+ android:weightSum="1.0">
+
+
+
diff --git a/app/src/main/res/layout/backuplist_fragment.xml b/app/src/main/res/layout/backuplist_fragment.xml
index e8394f3d7d..d1b312f74f 100644
--- a/app/src/main/res/layout/backuplist_fragment.xml
+++ b/app/src/main/res/layout/backuplist_fragment.xml
@@ -54,6 +54,9 @@
style="@style/Button.Borderless"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/standard_margin"
+ android:layout_marginEnd="@dimen/standard_margin"
+ android:minHeight="@dimen/minimum_size_for_touchable_area"
android:text="@string/restore_selected" />
diff --git a/app/src/main/res/layout/dialog_choose_account.xml b/app/src/main/res/layout/dialog_choose_account.xml
index dd77ce5edd..d99f9dec73 100644
--- a/app/src/main/res/layout/dialog_choose_account.xml
+++ b/app/src/main/res/layout/dialog_choose_account.xml
@@ -44,12 +44,6 @@
app:layout_constraintTop_toBottomOf="@id/current_account"
tools:visibility="visible">
-
-
+ app:cardCornerRadius="@dimen/button_corner_radius"
+ app:cardElevation="0dp"
+ app:checkedIcon="@null">
+ app:cardCornerRadius="@dimen/button_corner_radius"
+ app:cardElevation="0dp"
+ app:checkedIcon="@null">
+ app:cardCornerRadius="@dimen/button_corner_radius"
+ app:cardElevation="0dp"
+ app:checkedIcon="@null">
+ app:cardCornerRadius="@dimen/button_corner_radius"
+ app:cardElevation="0dp"
+ app:checkedIcon="@null">
@@ -432,9 +443,9 @@
.
-->
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools">
+ android:paddingRight="@dimen/drawer_content_horizontal_padding"
+ android:paddingBottom="@dimen/standard_padding"
+ android:visibility="gone"
+ tools:visibility="visible">
-
+ android:text="@string/drawer_quota"
+ app:trackCornerRadius="5dp"
+ app:trackThickness="5dp"
+ tools:progress="50" />
+ android:padding="@dimen/dialog_padding">
-
-
+ android:scrollbars="vertical" />
diff --git a/app/src/main/res/layout/file_details_fragment.xml b/app/src/main/res/layout/file_details_fragment.xml
index a9879e7349..a779e4cf59 100644
--- a/app/src/main/res/layout/file_details_fragment.xml
+++ b/app/src/main/res/layout/file_details_fragment.xml
@@ -185,7 +185,6 @@
android:background="@color/bg_default"
app:tabGravity="center"
app:tabMode="fixed"
- app:tabTextAppearance="@style/AppTabTextAppearance"
app:tabTextColor="@color/text_color"
app:tabInlineLabel="true" />
diff --git a/app/src/main/res/layout/file_details_sharing_menu_bottom_sheet_fragment.xml b/app/src/main/res/layout/file_details_sharing_menu_bottom_sheet_fragment.xml
index d8e48e5fdc..b0313fba36 100644
--- a/app/src/main/res/layout/file_details_sharing_menu_bottom_sheet_fragment.xml
+++ b/app/src/main/res/layout/file_details_sharing_menu_bottom_sheet_fragment.xml
@@ -25,15 +25,16 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
+ android:paddingTop="@dimen/dialog_padding"
android:background="@color/bg_default">
@@ -63,8 +64,7 @@
@@ -96,8 +96,7 @@
@@ -131,8 +130,7 @@
@@ -164,8 +162,7 @@
-
diff --git a/app/src/main/res/layout/file_details_sharing_process_fragment.xml b/app/src/main/res/layout/file_details_sharing_process_fragment.xml
index 249ef8dde1..5514622bf6 100644
--- a/app/src/main/res/layout/file_details_sharing_process_fragment.xml
+++ b/app/src/main/res/layout/file_details_sharing_process_fragment.xml
@@ -24,9 +24,9 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:minHeight="400dp"
android:focusable="true"
- android:focusableInTouchMode="true">
+ android:focusableInTouchMode="true"
+ android:minHeight="400dp">
@@ -66,18 +66,21 @@
android:id="@+id/share_process_permission_read_only"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:minHeight="@dimen/minimum_size_for_touchable_area"
android:text="@string/link_share_view_only" />
@@ -88,7 +91,8 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/standard_margin"
android:text="@string/advanced_settings"
- android:textColor="@color/secondary_text_color"
+ android:textColor="@color/primary"
+ android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/share_process_permission_radio_group" />
@@ -97,6 +101,7 @@
android:id="@+id/share_process_allow_resharing_checkbox"
android:layout_width="0dp"
android:layout_height="wrap_content"
+ android:minHeight="@dimen/minimum_size_for_touchable_area"
android:text="@string/allow_resharing"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
@@ -108,39 +113,54 @@
android:id="@+id/share_process_set_password_switch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:minHeight="@dimen/minimum_size_for_touchable_area"
android:text="@string/share_no_password_title"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/share_process_allow_resharing_checkbox" />
-
+ tools:visibility="visible">
+
+
+
+
+
+
+ app:layout_constraintTop_toBottomOf="@+id/share_process_enter_password_container" />
@@ -163,6 +183,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/standard_half_margin"
+ android:minHeight="@dimen/minimum_size_for_touchable_area"
android:text="@string/share_via_link_hide_download"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
@@ -175,23 +196,36 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/standard_half_margin"
+ android:minHeight="@dimen/minimum_size_for_touchable_area"
android:text="@string/link_name"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/share_process_hide_download_checkbox" />
-
+ tools:visibility="visible">
+
+
+
+
+
+
+ share_process_change_name_container" />
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="@+id/share_process_btn_next" />
+
diff --git a/app/src/main/res/layout/file_list_actions_bottom_sheet_creator.xml b/app/src/main/res/layout/file_list_actions_bottom_sheet_creator.xml
index 5e437c3e5e..50aafa58ae 100644
--- a/app/src/main/res/layout/file_list_actions_bottom_sheet_creator.xml
+++ b/app/src/main/res/layout/file_list_actions_bottom_sheet_creator.xml
@@ -22,20 +22,22 @@
@@ -44,7 +46,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:layout_marginStart="@dimen/standard_margin"
+ android:layout_marginStart="@dimen/bottom_sheet_text_start_margin"
android:text="@string/create_new_presentation"
android:textColor="@color/text_color"
android:textSize="@dimen/bottom_sheet_text_size" />
diff --git a/app/src/main/res/layout/file_list_actions_bottom_sheet_fragment.xml b/app/src/main/res/layout/file_list_actions_bottom_sheet_fragment.xml
index 06440c2e51..35c652aa6c 100644
--- a/app/src/main/res/layout/file_list_actions_bottom_sheet_fragment.xml
+++ b/app/src/main/res/layout/file_list_actions_bottom_sheet_fragment.xml
@@ -17,10 +17,10 @@
License along with this program. If not, see .
-->
@@ -66,9 +67,10 @@
@@ -97,9 +99,10 @@
@@ -128,8 +131,9 @@
-
-
-
-
+ android:visibility="gone"
+ tools:visibility="visible">
@@ -244,9 +232,10 @@
@@ -273,9 +262,10 @@
-
-
-
+ android:visibility="gone"
+ tools:visibility="visible">
-
-
-
+ android:orientation="vertical" />
+
+
+ app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior"
+ app:srcCompat="@drawable/ic_plus"
+ tools:visibility="visible"/>
diff --git a/app/src/main/res/layout/fragment_gallery_bottom_sheet.xml b/app/src/main/res/layout/fragment_gallery_bottom_sheet.xml
index aa628c8979..5201aa0cea 100644
--- a/app/src/main/res/layout/fragment_gallery_bottom_sheet.xml
+++ b/app/src/main/res/layout/fragment_gallery_bottom_sheet.xml
@@ -127,6 +127,7 @@
android:paddingBottom="@dimen/standard_half_padding">
+ android:layout_height="@dimen/bottom_sheet_item_height"
+ android:background="?android:attr/selectableItemBackground"
+ android:paddingStart="@dimen/standard_padding"
+ android:paddingEnd="@dimen/standard_padding">
+ android:padding="@dimen/dialog_padding">
+ android:layout_marginBottom="@dimen/standard_margin"
+ tools:text="@string/end_to_end_encryption_keywords_description" />
+ android:visibility="gone"
+ tools:text="passphrase"
+ tools:visibility="visible" />
-
+ tools:visibility="visible">
+
+
+
+
+
diff --git a/app/src/main/res/layout/sorting_order_fragment.xml b/app/src/main/res/layout/sorting_order_fragment.xml
index 2bd6600b14..8388e705a5 100644
--- a/app/src/main/res/layout/sorting_order_fragment.xml
+++ b/app/src/main/res/layout/sorting_order_fragment.xml
@@ -24,6 +24,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minWidth="300dp"
+ android:padding="@dimen/dialog_padding"
android:orientation="vertical">
+ android:text="@string/sort_by"
+ android:paddingBottom="@dimen/standard_padding"/>
+ android:paddingEnd="@dimen/standard_half_padding"
+ android:paddingBottom="@dimen/standard_half_padding"
+ android:src="@drawable/ic_alphabetical_asc" />
-
-
+
diff --git a/app/src/main/res/layout/upload_files_layout.xml b/app/src/main/res/layout/upload_files_layout.xml
index 03c214e504..ee799542bc 100644
--- a/app/src/main/res/layout/upload_files_layout.xml
+++ b/app/src/main/res/layout/upload_files_layout.xml
@@ -23,7 +23,8 @@
android:layout_height="fill_parent"
android:orientation="vertical">
-
+
#ffffff
#121212
- #717171
#000000
- #2D2D2D
#818181
#222222
#ffffff
@@ -45,8 +43,6 @@
#ffffff
#737373
- #2a2a2a
- #B3FFFFFF
@color/white
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index de115bc2ff..f844b3156f 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -27,7 +27,6 @@
#ffffff
#ff888888
#eeeeee
- #656565
#FFFFFF
#DDDDDD
#EEEEEE
@@ -52,7 +51,6 @@
#ffffff
#ffffff
#FFFFFF
- #FFFFFF
#000000
@color/color_accent
#ffffff
@@ -77,14 +75,8 @@
#757575
#616161
- #FFFFFF
- #4D000000
#80000000
-
- #FFFFFF
- #000000
-
@android:color/white
#666666
diff --git a/app/src/main/res/values/dims.xml b/app/src/main/res/values/dims.xml
index 11670f1ea3..af96f9423f 100644
--- a/app/src/main/res/values/dims.xml
+++ b/app/src/main/res/values/dims.xml
@@ -20,13 +20,16 @@
164dp
12sp
20dp
- 56dp
+ 40dp
+ 56dp
+ 80dp
40dp
128dp
8dp
3dp
128dp
512
+ 28dp
16dp
32dp
8dp
@@ -140,4 +143,7 @@
48dp
24dp
400dp
+ 24dp
+ 24dp
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 31dc7cc3ce..3a973dc787 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -19,11 +19,11 @@
-->
-
-
-
-
-
-
-
@@ -149,7 +152,7 @@
-
-
-
-
-
-
-
-
+
+
-
@@ -276,7 +287,7 @@
- @color/secondary_text_color
-
@@ -292,10 +303,9 @@
-
@@ -339,7 +349,7 @@
-
-
-
-
-
-
-
+
+
-
-
@@ -448,4 +457,30 @@
- @android:id/background
- ?android:attr/colorBackground
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/test/java/com/nextcloud/client/jobs/BackgroundJobFactoryTest.kt b/app/src/test/java/com/nextcloud/client/jobs/BackgroundJobFactoryTest.kt
index 62fd204626..86d2cbce78 100644
--- a/app/src/test/java/com/nextcloud/client/jobs/BackgroundJobFactoryTest.kt
+++ b/app/src/test/java/com/nextcloud/client/jobs/BackgroundJobFactoryTest.kt
@@ -35,9 +35,7 @@ import com.nextcloud.client.network.ConnectivityService
import com.nextcloud.client.preferences.AppPreferences
import com.owncloud.android.datamodel.ArbitraryDataProvider
import com.owncloud.android.datamodel.UploadsStorageManager
-import com.owncloud.android.utils.theme.ThemeButtonUtils
-import com.owncloud.android.utils.theme.ThemeColorUtils
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils
+import com.owncloud.android.utils.theme.ViewThemeUtils
import org.greenrobot.eventbus.EventBus
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
@@ -46,7 +44,6 @@ import org.junit.Test
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.whenever
-import javax.inject.Provider
class BackgroundJobFactoryTest {
@@ -102,13 +99,7 @@ class BackgroundJobFactoryTest {
private lateinit var deckApi: DeckApi
@Mock
- private lateinit var themeColorUtils: ThemeColorUtils
-
- @Mock
- private lateinit var themeSnackbarUtils: ThemeSnackbarUtils
-
- @Mock
- private lateinit var themeButtonUtils: ThemeButtonUtils
+ private lateinit var viewThemeUtils: ViewThemeUtils
private lateinit var factory: BackgroundJobFactory
@@ -121,7 +112,7 @@ class BackgroundJobFactoryTest {
contentResolver,
clock,
powerManagementService,
- Provider { backgroundJobManager },
+ { backgroundJobManager },
deviceInfo,
accountManager,
resources,
@@ -131,9 +122,7 @@ class BackgroundJobFactoryTest {
notificationManager,
eventBus,
deckApi,
- themeColorUtils,
- themeSnackbarUtils,
- themeButtonUtils
+ { viewThemeUtils }
)
}
diff --git a/app/src/test/java/com/owncloud/android/ui/adapter/GalleryAdapterTest.kt b/app/src/test/java/com/owncloud/android/ui/adapter/GalleryAdapterTest.kt
index ab66039494..dc114ae5e1 100644
--- a/app/src/test/java/com/owncloud/android/ui/adapter/GalleryAdapterTest.kt
+++ b/app/src/test/java/com/owncloud/android/ui/adapter/GalleryAdapterTest.kt
@@ -30,8 +30,7 @@ import com.owncloud.android.datamodel.GalleryItems
import com.owncloud.android.datamodel.OCFile
import com.owncloud.android.ui.activity.ComponentsGetter
import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface
-import com.owncloud.android.utils.theme.ThemeColorUtils
-import com.owncloud.android.utils.theme.ThemeDrawableUtils
+import com.owncloud.android.utils.theme.ViewThemeUtils
import junit.framework.Assert.assertEquals
import org.junit.After
import org.junit.Before
@@ -61,10 +60,7 @@ class GalleryAdapterTest {
lateinit var storageManager: FileDataStorageManager
@Mock
- lateinit var themeColorUtils: ThemeColorUtils
-
- @Mock
- lateinit var themeDrawableUtils: ThemeDrawableUtils
+ lateinit var viewThemeUtils: ViewThemeUtils
private lateinit var mocks: AutoCloseable
@@ -88,8 +84,7 @@ class GalleryAdapterTest {
ocFileListFragmentInterface,
preferences,
transferServiceGetter,
- themeColorUtils,
- themeDrawableUtils
+ viewThemeUtils
)
val list = listOf(
diff --git a/app/src/test/java/com/owncloud/android/ui/adapter/ShareeListAdapterTest.kt b/app/src/test/java/com/owncloud/android/ui/adapter/ShareeListAdapterTest.kt
index dffd5e1169..cef8d08d4f 100644
--- a/app/src/test/java/com/owncloud/android/ui/adapter/ShareeListAdapterTest.kt
+++ b/app/src/test/java/com/owncloud/android/ui/adapter/ShareeListAdapterTest.kt
@@ -27,8 +27,7 @@ import com.nextcloud.client.account.AnonymousUser
import com.owncloud.android.lib.resources.shares.OCShare
import com.owncloud.android.lib.resources.shares.ShareType
import com.owncloud.android.ui.activity.FileActivity
-import com.owncloud.android.utils.theme.ThemeAvatarUtils
-import com.owncloud.android.utils.theme.ThemeColorUtils
+import com.owncloud.android.utils.theme.ViewThemeUtils
import org.junit.Assert
import org.junit.Test
import org.mockito.Mock
@@ -43,10 +42,7 @@ class ShareeListAdapterTest {
private val fileActivity: FileActivity? = null
@Mock
- private lateinit var themeColorUtils: ThemeColorUtils
-
- @Mock
- private lateinit var themeAvatarUtils: ThemeAvatarUtils
+ private lateinit var viewThemeUtils: ViewThemeUtils
private val orderedShares = listOf(
OCShare("/1").apply {
@@ -91,8 +87,7 @@ class ShareeListAdapterTest {
null,
user.accountName,
user,
- themeColorUtils,
- themeAvatarUtils
+ viewThemeUtils
)
sut.sortShares()
diff --git a/app/src/test/java/com/owncloud/android/ui/adapter/UserListAdapterTest.java b/app/src/test/java/com/owncloud/android/ui/adapter/UserListAdapterTest.java
index 471b56167c..bef7121988 100644
--- a/app/src/test/java/com/owncloud/android/ui/adapter/UserListAdapterTest.java
+++ b/app/src/test/java/com/owncloud/android/ui/adapter/UserListAdapterTest.java
@@ -22,8 +22,7 @@ package com.owncloud.android.ui.adapter;
import com.owncloud.android.R;
import com.owncloud.android.ui.activity.ManageAccountsActivity;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
import org.junit.Before;
import org.junit.Test;
@@ -46,10 +45,7 @@ public class UserListAdapterTest {
private ManageAccountsActivity manageAccountsActivity;
@Mock
- private ThemeColorUtils themeColorUtils;
-
- @Mock
- private ThemeDrawableUtils themeDrawableUtils;
+ private ViewThemeUtils viewThemeUtils;
/**
* Setting up and mocking the manageAccountsActivity class, and then mocking the method calls in the construction of
@@ -74,8 +70,7 @@ public class UserListAdapterTest {
true,
true,
true,
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
assertEquals(0, userListAdapter.getItemCount());
}
@@ -95,8 +90,7 @@ public class UserListAdapterTest {
true,
true,
true,
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
assertEquals(2, userListAdapter.getItemCount());
}
@@ -118,8 +112,7 @@ public class UserListAdapterTest {
true,
true,
true,
- themeColorUtils,
- themeDrawableUtils);
+ viewThemeUtils);
UserListItem userListItem1 = new UserListItem();
UserListItem userListItem2 = new UserListItem();
diff --git a/scripts/analysis/lint-results.txt b/scripts/analysis/lint-results.txt
index bf24c5db3f..4bc2fbc3bd 100644
--- a/scripts/analysis/lint-results.txt
+++ b/scripts/analysis/lint-results.txt
@@ -1,2 +1,2 @@
DO NOT TOUCH; GENERATED BY DRONE
- Lint Report: 85 warnings
+ Lint Report: 84 warnings
diff --git a/settings.gradle b/settings.gradle
index 40b70bd250..bb095760cc 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,3 +1,9 @@
rootProject.name = 'Nextcloud'
include ':app'
+
+//includeBuild('../android-common') {
+// dependencySubstitution {
+// substitute module('com.github.nextcloud.android-common:ui') using project(':ui')
+// }
+//}
diff --git a/spotbugs-filter.xml b/spotbugs-filter.xml
index 0f19982980..b250271fc8 100644
--- a/spotbugs-filter.xml
+++ b/spotbugs-filter.xml
@@ -23,7 +23,10 @@
-
+
+
+
+