Browse Source

Use adaptive colors for pre-login screens (#11362)

* Use unmodified primary color as background through M3 utils for login screen

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>

* Use color utils to fix colors in AuthenticatorActivity for light primaries

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>

* WhatsNewActivity: fix for light primary color, port to viewbinding

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>

* Fix status bar colors in pre-login screens

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>

* FeatureFragment: fix spotbugs

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>

* Update login screenshot

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>

* build: Set ui dep to 0.5.0 tag

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>

---------

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
Álvaro Brey 2 years ago
parent
commit
0946399ba9

+ 1 - 1
app/build.gradle

@@ -367,7 +367,7 @@ dependencies {
     // upon each update first test: new registration, receive push
     gplayImplementation "com.google.firebase:firebase-messaging:23.1.1"
 
-    implementation 'com.github.nextcloud.android-common:ui:0.4.0'
+    implementation 'com.github.nextcloud.android-common:ui:0.5.0'
 
     implementation "androidx.room:room-runtime:$roomVersion"
     kapt "androidx.room:room-compiler:$roomVersion"

BIN
app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login.png


+ 3 - 0
app/src/main/java/com/nextcloud/client/di/AppComponent.java

@@ -33,6 +33,7 @@ import com.nextcloud.client.preferences.PreferencesModule;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.media.MediaControlView;
 import com.owncloud.android.ui.ThemeableSwitchPreference;
+import com.owncloud.android.ui.whatsnew.ProgressIndicator;
 import com.owncloud.android.utils.FilesUploadHelper;
 
 import javax.inject.Singleton;
@@ -68,6 +69,8 @@ public interface AppComponent {
 
     void inject(FilesUploadHelper filesUploadHelper);
 
+    void inject(ProgressIndicator progressIndicator);
+
     @Component.Builder
     interface Builder {
         @BindsInstance

+ 14 - 10
app/src/main/java/com/nextcloud/client/onboarding/FirstRunActivity.java

@@ -34,6 +34,7 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.widget.LinearLayout;
 
+import com.nextcloud.android.common.ui.theme.utils.ColorRole;
 import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.appinfo.AppInfo;
 import com.nextcloud.client.di.Injectable;
@@ -47,6 +48,7 @@ import com.owncloud.android.ui.activity.BaseActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.adapter.FeaturesViewAdapter;
 import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
 
 import javax.inject.Inject;
 
@@ -66,13 +68,18 @@ public class FirstRunActivity extends BaseActivity implements ViewPager.OnPageCh
     @Inject AppInfo appInfo;
     @Inject OnboardingService onboarding;
 
+    @Inject ViewThemeUtils.Factory viewThemeUtilsFactory;
+
     private FirstRunActivityBinding binding;
+    private ViewThemeUtils defaultViewThemeUtils;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         enableAccountHandling = false;
 
         super.onCreate(savedInstanceState);
+        defaultViewThemeUtils = viewThemeUtilsFactory.withPrimaryAsBackground();
+        defaultViewThemeUtils.platform.themeStatusBar(this, ColorRole.PRIMARY);
         this.binding = FirstRunActivityBinding.inflate(getLayoutInflater());
         setContentView(binding.getRoot());
 
@@ -81,9 +88,7 @@ public class FirstRunActivity extends BaseActivity implements ViewPager.OnPageCh
         setSlideshowSize(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE);
 
 
-        binding.login.setBackgroundColor(getResources().getColor(R.color.login_btn_tint));
-        binding.login.setTextColor(getResources().getColor(R.color.primary));
-
+        defaultViewThemeUtils.material.colorMaterialButtonFilledOnPrimary(binding.login);
         binding.login.setOnClickListener(v -> {
             if (getIntent().getBooleanExtra(EXTRA_ALLOW_CLOSE, false)) {
                 Intent authenticatorActivityIntent = new Intent(this, AuthenticatorActivity.class);
@@ -95,8 +100,7 @@ public class FirstRunActivity extends BaseActivity implements ViewPager.OnPageCh
         });
 
 
-        binding.signup.setBackgroundColor(getResources().getColor(R.color.primary));
-        binding.signup.setTextColor(getResources().getColor(R.color.login_text_color));
+        defaultViewThemeUtils.material.colorMaterialButtonOutlinedOnPrimary(binding.signup);
         binding.signup.setVisibility(isProviderOrOwnInstallationVisible ? View.VISIBLE : View.GONE);
         binding.signup.setOnClickListener(v -> {
             Intent authenticatorActivityIntent = new Intent(this, AuthenticatorActivity.class);
@@ -110,7 +114,7 @@ public class FirstRunActivity extends BaseActivity implements ViewPager.OnPageCh
             }
         });
 
-        binding.hostOwnServer.setTextColor(getResources().getColor(R.color.login_text_color));
+        defaultViewThemeUtils.platform.colorTextView(binding.hostOwnServer, ColorRole.ON_PRIMARY);
         binding.hostOwnServer.setVisibility(isProviderOrOwnInstallationVisible ? View.VISIBLE : View.GONE);
 
         if (!isProviderOrOwnInstallationVisible) {
@@ -230,9 +234,9 @@ public class FirstRunActivity extends BaseActivity implements ViewPager.OnPageCh
 
     public static FeatureItem[] getFirstRun() {
         return new FeatureItem[]{
-                new FeatureItem(R.drawable.logo, R.string.first_run_1_text, R.string.empty, true, false),
-                new FeatureItem(R.drawable.first_run_files, R.string.first_run_2_text, R.string.empty, true, false),
-                new FeatureItem(R.drawable.first_run_groupware, R.string.first_run_3_text, R.string.empty, true, false),
-                new FeatureItem(R.drawable.first_run_talk, R.string.first_run_4_text, R.string.empty, true, false)};
+            new FeatureItem(R.drawable.logo, R.string.first_run_1_text, R.string.empty, true, false),
+            new FeatureItem(R.drawable.first_run_files, R.string.first_run_2_text, R.string.empty, true, false),
+            new FeatureItem(R.drawable.first_run_groupware, R.string.first_run_3_text, R.string.empty, true, false),
+            new FeatureItem(R.drawable.first_run_talk, R.string.first_run_4_text, R.string.empty, true, false)};
     }
 }

+ 34 - 33
app/src/main/java/com/nextcloud/client/onboarding/WhatsNewActivity.java

@@ -29,11 +29,14 @@ import android.widget.Button;
 import android.widget.ImageButton;
 import android.widget.TextView;
 
+import com.google.android.material.button.MaterialButton;
+import com.nextcloud.android.common.ui.theme.utils.ColorRole;
 import com.nextcloud.client.appinfo.AppInfo;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.owncloud.android.BuildConfig;
 import com.owncloud.android.R;
+import com.owncloud.android.databinding.WhatsNewActivityBinding;
 import com.owncloud.android.ui.adapter.FeaturesViewAdapter;
 import com.owncloud.android.ui.adapter.FeaturesWebViewAdapter;
 import com.owncloud.android.ui.whatsnew.ProgressIndicator;
@@ -49,24 +52,24 @@ import androidx.viewpager.widget.ViewPager;
  */
 public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPageChangeListener, Injectable {
 
-    private ImageButton mForwardFinishButton;
-    private Button mSkipButton;
-    private ProgressIndicator mProgress;
-    private ViewPager mPager;
     @Inject AppPreferences preferences;
     @Inject AppInfo appInfo;
     @Inject OnboardingService onboarding;
-    @Inject ViewThemeUtils viewThemeUtils;
+    @Inject ViewThemeUtils.Factory viewThemeUtilsFactory;
+    private ViewThemeUtils viewThemeUtils;
+    
+    private WhatsNewActivityBinding binding;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.whats_new_activity);
+        binding = WhatsNewActivityBinding.inflate(getLayoutInflater());
+        setContentView(binding.getRoot());
 
-        int fontColor = getResources().getColor(R.color.login_text_color);
+        viewThemeUtils = viewThemeUtilsFactory.withPrimaryAsBackground();
+        viewThemeUtils.platform.themeStatusBar(this, ColorRole.PRIMARY);
 
-        mProgress = findViewById(R.id.progressIndicator);
-        mPager = findViewById(R.id.contentPanel);
+        
         String[] urls = getResources().getStringArray(R.array.whatsnew_urls);
 
         boolean showWebView = urls.length > 0;
@@ -74,24 +77,23 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa
         if (showWebView) {
             FeaturesWebViewAdapter featuresWebViewAdapter = new FeaturesWebViewAdapter(getSupportFragmentManager(),
                                                                                        urls);
-            mProgress.setNumberOfSteps(featuresWebViewAdapter.getCount());
-            mPager.setAdapter(featuresWebViewAdapter);
+            binding.progressIndicator.setNumberOfSteps(featuresWebViewAdapter.getCount());
+            binding.contentPanel.setAdapter(featuresWebViewAdapter);
         } else {
             FeaturesViewAdapter featuresViewAdapter = new FeaturesViewAdapter(getSupportFragmentManager(),
                                                                               onboarding.getWhatsNew());
-            mProgress.setNumberOfSteps(featuresViewAdapter.getCount());
-            mPager.setAdapter(featuresViewAdapter);
+            binding.progressIndicator.setNumberOfSteps(featuresViewAdapter.getCount());
+            binding.contentPanel.setAdapter(featuresViewAdapter);
         }
 
-        mPager.addOnPageChangeListener(this);
+        binding.contentPanel.addOnPageChangeListener(this);
 
-        mForwardFinishButton = findViewById(R.id.forward);
-        viewThemeUtils.platform.colorImageButton(mForwardFinishButton, fontColor);
+        viewThemeUtils.platform.colorImageView(binding.forward, ColorRole.ON_PRIMARY);
 
-        mForwardFinishButton.setOnClickListener(view -> {
-            if (mProgress.hasNextStep()) {
-                mPager.setCurrentItem(mPager.getCurrentItem() + 1, true);
-                mProgress.animateToStep(mPager.getCurrentItem() + 1);
+        binding.forward.setOnClickListener(view -> {
+            if (binding.progressIndicator.hasNextStep()) {
+                binding.contentPanel.setCurrentItem(binding.contentPanel.getCurrentItem() + 1, true);
+                binding.progressIndicator.animateToStep(binding.contentPanel.getCurrentItem() + 1);
             } else {
                 onFinish();
                 finish();
@@ -99,21 +101,20 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa
             updateNextButtonIfNeeded();
         });
 
-        mForwardFinishButton.setBackground(null);
+        binding.forward.setBackground(null);
 
-        mSkipButton = findViewById(R.id.skip);
-        mSkipButton.setTextColor(fontColor);
-        mSkipButton.setOnClickListener(view -> {
+        viewThemeUtils.platform.colorTextView(binding.skip, ColorRole.ON_PRIMARY);
+        binding.skip.setOnClickListener(view -> {
             onFinish();
             finish();
         });
 
-        TextView tv = findViewById(R.id.welcomeText);
+        viewThemeUtils.platform.colorTextView(binding.welcomeText, ColorRole.ON_PRIMARY);
 
         if (showWebView) {
-            tv.setText(R.string.app_name);
+            binding.welcomeText.setText(R.string.app_name);
         } else {
-            tv.setText(String.format(getString(R.string.whats_new_title), appInfo.getVersionName()));
+            binding.welcomeText.setText(String.format(getString(R.string.whats_new_title), appInfo.getVersionName()));
         }
 
         updateNextButtonIfNeeded();
@@ -126,12 +127,12 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa
     }
 
     private void updateNextButtonIfNeeded() {
-        if (!mProgress.hasNextStep()) {
-            mForwardFinishButton.setImageResource(R.drawable.ic_ok);
-            mSkipButton.setVisibility(View.INVISIBLE);
+        if (!binding.progressIndicator.hasNextStep()) {
+            binding.forward.setImageResource(R.drawable.ic_ok);
+            binding.skip.setVisibility(View.INVISIBLE);
         } else {
-            mForwardFinishButton.setImageResource(R.drawable.arrow_right);
-            mSkipButton.setVisibility(View.VISIBLE);
+            binding.forward.setImageResource(R.drawable.arrow_right);
+            binding.skip.setVisibility(View.VISIBLE);
         }
     }
 
@@ -146,7 +147,7 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa
 
     @Override
     public void onPageSelected(int position) {
-        mProgress.animateToStep(position + 1);
+        binding.progressIndicator.animateToStep(position + 1);
         updateNextButtonIfNeeded();
     }
 

+ 15 - 3
app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java

@@ -76,6 +76,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.android.common.ui.theme.utils.ColorRole;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.device.DeviceInfo;
@@ -239,7 +240,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
     @Inject OnboardingService onboarding;
     @Inject DeviceInfo deviceInfo;
     @Inject PassCodeManager passCodeManager;
-    @Inject ViewThemeUtils viewThemeUtils;
+    @Inject ViewThemeUtils.Factory viewThemeUtilsFactory;
     @Inject ColorUtil colorUtil;
 
     private boolean onlyAdd = false;
@@ -247,6 +248,8 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
     private int primaryColor = R.color.primary;
     private boolean strictMode = false;
 
+    private ViewThemeUtils viewThemeUtils;
+
     @VisibleForTesting
     public AccountSetupBinding getAccountSetupBinding() {
         return accountSetupBinding;
@@ -260,6 +263,9 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        viewThemeUtils = viewThemeUtilsFactory.withPrimaryAsBackground();
+        viewThemeUtils.platform.themeStatusBar(this, ColorRole.PRIMARY);
+
 
         Uri data = getIntent().getData();
         boolean directLogin = data != null && data.toString().startsWith(getString(R.string.login_data_own_scheme));
@@ -349,6 +355,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
     @SuppressFBWarnings("ANDROID_WEB_VIEW_JAVASCRIPT")
     @SuppressLint("SetJavaScriptEnabled")
     private void initWebViewLogin(String baseURL, boolean useGenericUserAgent) {
+        viewThemeUtils.platform.colorCircularProgressBar(accountSetupWebviewBinding.loginWebviewProgressBar, ColorRole.ON_PRIMARY_CONTAINER);
         accountSetupWebviewBinding.loginWebview.setVisibility(View.GONE);
 
         accountSetupWebviewBinding.loginWebview.getSettings().setAllowFileAccess(false);
@@ -538,10 +545,15 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
         accountSetupBinding.hostUrlInputHelperText.setText(
             String.format(getString(R.string.login_url_helper_text), getString(R.string.app_name)));
 
+        viewThemeUtils.platform.colorTextView(accountSetupBinding.hostUrlInputHelperText, ColorRole.ON_PRIMARY);
+        viewThemeUtils.platform.colorTextView(accountSetupBinding.serverStatusText, ColorRole.ON_PRIMARY);
+        viewThemeUtils.platform.colorTextView(accountSetupBinding.authStatusText, ColorRole.ON_PRIMARY);
+        viewThemeUtils.material.colorTextInputLayout(accountSetupBinding.hostUrlContainer, ColorRole.ON_PRIMARY);
+        viewThemeUtils.platform.colorEditTextOnPrimary(accountSetupBinding.hostUrlInput);
+
         if (deviceInfo.hasCamera(this)) {
             accountSetupBinding.scanQr.setOnClickListener(v -> onScan());
-            viewThemeUtils.platform.colorDrawable(accountSetupBinding.scanQr.getDrawable(),
-                                                  getResources().getColor(R.color.login_text_color));
+            viewThemeUtils.platform.tintDrawable(this, accountSetupBinding.scanQr.getDrawable(), ColorRole.ON_PRIMARY);
         } else {
             accountSetupBinding.scanQr.setVisibility(View.GONE);
         }

+ 17 - 13
app/src/main/java/com/owncloud/android/ui/fragment/FeatureFragment.java

@@ -14,6 +14,7 @@ import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import com.nextcloud.android.common.ui.theme.utils.ColorRole;
 import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.features.FeatureItem;
@@ -29,7 +30,8 @@ import androidx.fragment.app.Fragment;
 
 public class FeatureFragment extends Fragment implements Injectable {
     private FeatureItem item;
-    @Inject ViewThemeUtils viewThemeUtils;
+    @Inject ViewThemeUtils.Factory viewThemeUtilsFactory;
+    private ViewThemeUtils viewThemeUtils;
 
     static public FeatureFragment newInstance(FeatureItem item) {
         FeatureFragment f = new FeatureFragment();
@@ -41,6 +43,7 @@ public class FeatureFragment extends Fragment implements Injectable {
 
     @Override
     public void onCreate(@Nullable Bundle savedInstanceState) {
+        viewThemeUtils = viewThemeUtilsFactory.withPrimaryAsBackground();
         super.onCreate(savedInstanceState);
         item = getArguments() != null ? (FeatureItem) getArguments().getParcelable("feature") : null;
     }
@@ -51,18 +54,19 @@ public class FeatureFragment extends Fragment implements Injectable {
                              @Nullable ViewGroup container,
                              @Nullable Bundle savedInstanceState) {
         View view = inflater.inflate(R.layout.whats_new_element, container, false);
-        int fontColor = getResources().getColor(R.color.login_text_color);
 
         ImageView whatsNewImage = view.findViewById(R.id.whatsNewImage);
         if (item.shouldShowImage()) {
             final Drawable image = ResourcesCompat.getDrawable(getResources(), item.getImage(), null);
-            whatsNewImage.setImageDrawable(viewThemeUtils.platform.colorDrawable(image, fontColor));
+            if (image != null) {
+                whatsNewImage.setImageDrawable(viewThemeUtils.platform.tintDrawable(requireContext(), image, ColorRole.ON_PRIMARY));
+            }
         }
 
         TextView whatsNewTitle = view.findViewById(R.id.whatsNewTitle);
         if (item.shouldShowTitleText()) {
             whatsNewTitle.setText(item.getTitleText());
-            whatsNewTitle.setTextColor(fontColor);
+            viewThemeUtils.platform.colorTextView(whatsNewTitle, ColorRole.ON_PRIMARY);
             whatsNewTitle.setVisibility(View.VISIBLE);
         } else {
             whatsNewTitle.setVisibility(View.GONE);
@@ -74,14 +78,14 @@ public class FeatureFragment extends Fragment implements Injectable {
                 String[] texts = getText(item.getContentText()).toString().split("\n");
 
                 for (String text : texts) {
-                    TextView textView = generateTextView(text, getContext(),
-                            item.shouldContentCentered(), fontColor, true);
+                    TextView textView = generateTextView(text, requireContext(),
+                                                         item.shouldContentCentered(), true);
 
                     linearLayout.addView(textView);
                 }
             } else {
                 TextView textView = generateTextView(getText(item.getContentText()).toString(),
-                        getContext(), item.shouldContentCentered(), fontColor, false);
+                                                     requireContext(), item.shouldContentCentered(), false);
 
                 linearLayout.addView(textView);
             }
@@ -93,30 +97,30 @@ public class FeatureFragment extends Fragment implements Injectable {
     }
 
     private TextView generateTextView(String text, Context context,
-                                      boolean shouldContentCentered, int fontColor,
+                                      boolean shouldContentCentered,
                                       boolean showBulletPoints) {
         int standardMargin = context.getResources().getDimensionPixelSize(R.dimen.standard_margin);
         int doubleMargin = context.getResources()
-                .getDimensionPixelSize(R.dimen.standard_double_margin);
+            .getDimensionPixelSize(R.dimen.standard_double_margin);
         int zeroMargin = context.getResources().getDimensionPixelSize(R.dimen.zero);
 
         TextView textView = new TextView(context);
         LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+            ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
         layoutParams.setMargins(doubleMargin, standardMargin, doubleMargin, zeroMargin);
         textView.setTextAppearance(context, R.style.NextcloudTextAppearanceMedium);
         textView.setLayoutParams(layoutParams);
 
         if (showBulletPoints) {
-            BulletSpan bulletSpan = new BulletSpan(standardMargin, fontColor);
+            BulletSpan bulletSpan = new BulletSpan(standardMargin);
             SpannableString spannableString = new SpannableString(text);
             spannableString.setSpan(bulletSpan, 0, spannableString.length(),
-                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+                                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
             textView.setText(spannableString);
         } else {
             textView.setText(text);
         }
-        textView.setTextColor(fontColor);
+        viewThemeUtils.platform.colorTextView(textView, ColorRole.ON_PRIMARY);
 
         if (!shouldContentCentered) {
             textView.setGravity(Gravity.START);

+ 19 - 12
app/src/main/java/com/owncloud/android/ui/whatsnew/ProgressIndicator.java

@@ -1,5 +1,5 @@
-/**
- *   Nextcloud Android client application
+/*
+ * Nextcloud Android client application
  *
  *   @author Bartosz Przybylski
  *   Copyright (C) 2015 Bartosz Przybylski
@@ -23,7 +23,6 @@
 package com.owncloud.android.ui.whatsnew;
 
 import android.content.Context;
-import android.graphics.PorterDuff;
 import android.graphics.drawable.TransitionDrawable;
 import android.util.AttributeSet;
 import android.view.Gravity;
@@ -32,7 +31,12 @@ import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
+import com.nextcloud.android.common.ui.theme.utils.ColorRole;
+import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
+
+import javax.inject.Inject;
 
 import androidx.core.content.res.ResourcesCompat;
 
@@ -46,6 +50,9 @@ public class ProgressIndicator extends FrameLayout {
     protected int mNumberOfSteps = -1;
     protected int mCurrentStep = -1;
 
+    @Inject ViewThemeUtils.Factory viewThemeUtilsFactory;
+    private ViewThemeUtils viewThemeUtils;
+
     public ProgressIndicator(Context context) {
         super(context);
         setup();
@@ -61,20 +68,18 @@ public class ProgressIndicator extends FrameLayout {
         setup();
     }
 
+
     public boolean hasNextStep() {
         return mNumberOfSteps > mCurrentStep;
     }
 
     public void setNumberOfSteps(int steps) {
-        int fontColor = getResources().getColor(R.color.login_text_color);
         mNumberOfSteps = steps;
         mDotsContainer.removeAllViews();
         for (int i = 0; i < steps; ++i) {
             ImageView iv = new ImageView(getContext());
-            iv.setImageDrawable(ResourcesCompat.getDrawable(getContext().getResources(),
-                                                            R.drawable.whats_new_progress_transition,
-                                                            null));
-            iv.setColorFilter(fontColor, PorterDuff.Mode.SRC_ATOP);
+            iv.setImageDrawable(ResourcesCompat.getDrawable(getContext().getResources(), R.drawable.whats_new_progress_transition, null));
+            viewThemeUtils.platform.colorImageView(iv, ColorRole.ON_PRIMARY);
             mDotsContainer.addView(iv);
         }
         animateToStep(1);
@@ -86,18 +91,20 @@ public class ProgressIndicator extends FrameLayout {
         }
 
         if (mCurrentStep != -1) {
-            ImageView prevDot = (ImageView) mDotsContainer.getChildAt(mCurrentStep-1);
-            TransitionDrawable transition = (TransitionDrawable)prevDot.getDrawable();
+            ImageView prevDot = (ImageView) mDotsContainer.getChildAt(mCurrentStep - 1);
+            TransitionDrawable transition = (TransitionDrawable) prevDot.getDrawable();
             transition.resetTransition();
         }
 
         mCurrentStep = step;
-        ImageView dot = (ImageView)mDotsContainer.getChildAt(step-1);
-        TransitionDrawable transition = (TransitionDrawable)dot.getDrawable();
+        ImageView dot = (ImageView) mDotsContainer.getChildAt(step - 1);
+        TransitionDrawable transition = (TransitionDrawable) dot.getDrawable();
         transition.startTransition(500);
     }
 
     private void setup() {
+        MainApp.getAppComponent().inject(this);
+        viewThemeUtils = viewThemeUtilsFactory.withPrimaryAsBackground();
         mDotsContainer = new LinearLayout(getContext());
         mDotsContainer.setGravity(Gravity.CENTER);
         FrameLayout.LayoutParams params = generateDefaultLayoutParams();

+ 6 - 0
app/src/main/java/com/owncloud/android/utils/theme/MaterialSchemesProvider.kt

@@ -35,4 +35,10 @@ interface MaterialSchemesProvider {
      * Color schemes for when there's no logged in user
      */
     fun getDefaultMaterialSchemes(): MaterialSchemes
+
+    /**
+     * Color schemes for views where we want the primary color to be the background, and to be unchanged
+     * (for brand purposes). For example, this includes the login screen and the first run activity
+     */
+    fun getMaterialSchemesForPrimaryBackground(): MaterialSchemes
 }

+ 5 - 0
app/src/main/java/com/owncloud/android/utils/theme/MaterialSchemesProviderImpl.kt

@@ -74,6 +74,11 @@ internal class MaterialSchemesProviderImpl @Inject constructor(
         return MaterialSchemes.fromColor(primaryColor)
     }
 
+    override fun getMaterialSchemesForPrimaryBackground(): MaterialSchemes {
+        val primaryColor = ContextCompat.getColor(context, R.color.primary)
+        return MaterialSchemes.withPrimaryAsBackground(primaryColor)
+    }
+
     companion object {
         private val TAG = MaterialSchemesProviderImpl::class.java.simpleName
     }

+ 4 - 0
app/src/main/java/com/owncloud/android/utils/theme/ViewThemeUtils.kt

@@ -64,5 +64,9 @@ class ViewThemeUtils @Inject constructor(
         fun withDefaultSchemes(): ViewThemeUtils {
             return withSchemes(schemesProvider.getDefaultMaterialSchemes())
         }
+
+        fun withPrimaryAsBackground(): ViewThemeUtils {
+            return withSchemes(schemesProvider.getMaterialSchemesForPrimaryBackground())
+        }
     }
 }