Revert "Update ProvisioningActivity to support extensions"

This reverts commit 2ef242254ed9740a339ab870054ce3fc1c0c6df4.

Reason for revert: b/190402825

Change-Id: I544733d400a0421833c29faf7408156cf5e77df3
diff --git a/Android.bp b/Android.bp
index d3af279..f62e0d0 100644
--- a/Android.bp
+++ b/Android.bp
@@ -30,10 +30,7 @@
     name: "ManagedProvisioningLib",
     manifest: "AndroidManifest.xml",
 
-    libs: [
-        "android.car",
-        "auto_value_annotations",
-    ],
+    libs: ["android.car"],
 
     static_libs: [
         "androidx.legacy_legacy-support-v4",
@@ -47,8 +44,6 @@
         "setupdesign-lottie-loading-layout"
     ],
 
-    plugins: ["auto_value_plugin"],
-
     srcs: [
         "src/**/*.java",
         "src/**/I*.aidl"],
@@ -65,10 +60,7 @@
     name: "ManagedProvisioning",
 
     // TODO(b/183510678) remove AAOS dependency after refactoring
-    libs: [
-        "android.car",
-        "auto_value_annotations",
-    ],
+    libs: ["android.car"],
 
     static_libs: [
         "androidx.legacy_legacy-support-v4",
@@ -81,8 +73,6 @@
         "setupdesign-lottie-loading-layout"
     ],
 
-    plugins: ["auto_value_plugin"],
-
     srcs: [
         "src/**/*.java",
         "src/**/I*.aidl",
diff --git a/src/com/android/managedprovisioning/common/InitializeLayoutConsumerHandler.java b/src/com/android/managedprovisioning/common/InitializeLayoutConsumerHandler.java
deleted file mode 100644
index 74aa43c..0000000
--- a/src/com/android/managedprovisioning/common/InitializeLayoutConsumerHandler.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.managedprovisioning.common;
-
-import androidx.annotation.LayoutRes;
-import androidx.annotation.Nullable;
-import androidx.annotation.StringRes;
-
-import com.android.managedprovisioning.model.CustomizationParams;
-
-/**
- * A handler that initializes the layout params.
- */
-public interface InitializeLayoutConsumerHandler {
-    /**
-     * A callback to initialize the layout params.
-     */
-    void initializeLayoutParams(
-            @LayoutRes int layoutRes,
-            @Nullable @StringRes Integer headerRes,
-            CustomizationParams customizationParams);
-}
diff --git a/src/com/android/managedprovisioning/provisioning/AbstractProvisioningActivity.java b/src/com/android/managedprovisioning/provisioning/AbstractProvisioningActivity.java
index 97be27f..f33e85d 100644
--- a/src/com/android/managedprovisioning/provisioning/AbstractProvisioningActivity.java
+++ b/src/com/android/managedprovisioning/provisioning/AbstractProvisioningActivity.java
@@ -81,12 +81,15 @@
     protected abstract ProvisioningManagerInterface getProvisioningManager();
     // Show the dialog when user press back button while provisioning.
     protected abstract void decideCancelProvisioningDialog();
+    // Initialize UI for this activity.
+    protected abstract void initializeUi(ProvisioningParams params);
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         // initialize params so they're accessible for prechecks in onCreate
         mParams = getIntent().getParcelableExtra(ProvisioningParams.EXTRA_PROVISIONING_PARAMS);
         super.onCreate(savedInstanceState);
+        initializeUi(mParams);
 
         if (savedInstanceState != null) {
             mState = savedInstanceState.getInt(KEY_ACTIVITY_STATE,
diff --git a/src/com/android/managedprovisioning/provisioning/AdminIntegratedFlowPrepareActivity.java b/src/com/android/managedprovisioning/provisioning/AdminIntegratedFlowPrepareActivity.java
index d924565..eda02eb 100644
--- a/src/com/android/managedprovisioning/provisioning/AdminIntegratedFlowPrepareActivity.java
+++ b/src/com/android/managedprovisioning/provisioning/AdminIntegratedFlowPrepareActivity.java
@@ -18,7 +18,6 @@
 
 import android.app.Activity;
 import android.content.Context;
-import android.os.Bundle;
 
 import androidx.annotation.VisibleForTesting;
 
@@ -80,11 +79,6 @@
     }
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        initializeUi(mParams);
-    }
-
     protected ProvisioningManagerInterface getProvisioningManager() {
         if (mProvisioningManager == null) {
             mProvisioningManager = AdminIntegratedFlowPrepareManager.getInstance(this);
@@ -104,7 +98,8 @@
         showCancelProvisioningDialog(/* resetRequired = */true);
     }
 
-    private void initializeUi(ProvisioningParams params) {
+    @Override
+    protected void initializeUi(ProvisioningParams params) {
         final int headerResId = R.string.downloading_administrator_header;
         final int titleResId = R.string.setup_device_progress;
         final CustomizationParams customizationParams =
diff --git a/src/com/android/managedprovisioning/provisioning/ProvisioningActivity.java b/src/com/android/managedprovisioning/provisioning/ProvisioningActivity.java
index 7d23bdf..196fb1b 100644
--- a/src/com/android/managedprovisioning/provisioning/ProvisioningActivity.java
+++ b/src/com/android/managedprovisioning/provisioning/ProvisioningActivity.java
@@ -21,10 +21,13 @@
 import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PROVISIONING_PROVISIONING_ACTIVITY_TIME_MS;
 import static com.android.internal.util.Preconditions.checkNotNull;
 
+import static com.google.android.setupdesign.util.ThemeHelper.shouldApplyExtendedPartnerConfig;
+
 import static java.util.Objects.requireNonNull;
 
 import android.Manifest.permission;
 import android.annotation.IntDef;
+import android.annotation.StringRes;
 import android.app.Activity;
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
@@ -34,12 +37,19 @@
 import android.graphics.drawable.AnimatedVectorDrawable;
 import android.os.Bundle;
 import android.os.UserHandle;
+import android.view.View;
 import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
 
 import androidx.annotation.VisibleForTesting;
 
 import com.android.managedprovisioning.ManagedProvisioningScreens;
 import com.android.managedprovisioning.R;
+import com.android.managedprovisioning.analytics.MetricsWriterFactory;
+import com.android.managedprovisioning.analytics.ProvisioningAnalyticsTracker;
+import com.android.managedprovisioning.common.ManagedProvisioningSharedPreferences;
 import com.android.managedprovisioning.common.PolicyComplianceUtils;
 import com.android.managedprovisioning.common.ProvisionLogger;
 import com.android.managedprovisioning.common.SettingsFacade;
@@ -49,10 +59,15 @@
 import com.android.managedprovisioning.common.Utils;
 import com.android.managedprovisioning.finalization.PreFinalizationController;
 import com.android.managedprovisioning.finalization.UserProvisioningStateHelper;
+import com.android.managedprovisioning.model.CustomizationParams;
 import com.android.managedprovisioning.model.ProvisioningParams;
+import com.android.managedprovisioning.provisioning.TransitionAnimationHelper.AnimationComponents;
 import com.android.managedprovisioning.provisioning.TransitionAnimationHelper.TransitionAnimationCallback;
 
 import com.google.android.setupcompat.util.WizardManagerHelper;
+import com.google.android.setupdesign.GlifLayout;
+import com.google.android.setupdesign.util.ContentStyler;
+import com.google.android.setupdesign.util.DescriptionStyler;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -87,6 +102,7 @@
     static final int PROVISIONING_MODE_WORK_PROFILE_ON_FULLY_MANAGED_DEVICE = 3;
     static final int PROVISIONING_MODE_FINANCED_DEVICE = 4;
     static final int PROVISIONING_MODE_WORK_PROFILE_ON_ORG_OWNED_DEVICE = 5;
+    private CustomizationParams mCustomizationParams;
     private ViewGroup mButtonFooterContainer;
 
     @IntDef(prefix = { "PROVISIONING_MODE_" }, value = {
@@ -112,10 +128,10 @@
                         R.string.work_profile_provisioning_progress_label);
             }});
 
+    private TransitionAnimationHelper mTransitionAnimationHelper;
     private UserProvisioningStateHelper mUserProvisioningStateHelper;
     private PolicyComplianceUtils mPolicyComplianceUtils;
     private ProvisioningManager mProvisioningManager;
-    private ProvisioningActivityBridge mBridge;
 
     public ProvisioningActivity() {
         this(
@@ -143,8 +159,6 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mBridge = createBridge();
-        mBridge.initiateUi(/* activity= */ this);
 
         // assign this Activity as the view store owner to access saved state and receive updates
         getProvisioningManager().setViewModelStoreOwner(this);
@@ -158,44 +172,6 @@
         }
     }
 
-    protected ProvisioningActivityBridge createBridge() {
-        return ProvisioningActivityBridgeImpl.builder()
-                .setParams(mParams)
-                .setUtils(mUtils)
-                .setProvisioningMode(getProvisioningMode())
-                .setProvisioningManager(getProvisioningManager())
-                .setTransitionAnimationCallback(this)
-                .setInitializeLayoutParamsConsumer(
-                        ProvisioningActivity.this::initializeLayoutParams)
-                .setShouldSkipEducationScreens(shouldSkipEducationScreens())
-                .setProgressLabelResId(getProgressLabelResId())
-                .setBridgeCallbacks(createCallbacks())
-                .build();
-    }
-
-    protected Integer getProgressLabelResId() {
-        return PROVISIONING_MODE_TO_PROGRESS_LABEL.get(getProvisioningMode());
-    }
-
-    protected final ProvisioningActivityBridgeCallbacks createCallbacks() {
-        return new ProvisioningActivityBridgeCallbacks() {
-            @Override
-            public void onNextButtonClicked() {
-                ProvisioningActivity.this.onNextButtonClicked();
-            }
-
-            @Override
-            public void onAbortButtonClicked() {
-                ProvisioningActivity.this.onAbortButtonClicked();
-            }
-
-            @Override
-            public boolean isProvisioningFinalized() {
-                return mState == STATE_PROVISIONING_FINALIZED;
-            }
-        };
-    }
-
     @Override
     protected ProvisioningManager getProvisioningManager() {
         if (mProvisioningManager == null) {
@@ -228,8 +204,7 @@
         // TODO(183094412): Decouple state from AbstractProvisioningActivity
         mState = STATE_PROVISIONING_COMPLETED;
 
-        if (shouldSkipEducationScreens()
-                || mBridge.shouldShowButtonsWhenPreProvisioningCompletes()) {
+        if (shouldSkipEducationScreens() || mTransitionAnimationHelper.areAllTransitionsShown()) {
             updateProvisioningFinalizedScreen();
         }
     }
@@ -246,8 +221,15 @@
                 this, mParams, mUtils, UserHandle.SYSTEM);
     }
 
-    protected final void updateProvisioningFinalizedScreen() {
-        mBridge.onProvisioningFinalized(/* activity= */ this);
+    private void updateProvisioningFinalizedScreen() {
+        if (!shouldSkipEducationScreens()) {
+            getProvisioningProgressLabelContainer().setVisibility(View.GONE);
+            mButtonFooterContainer.setVisibility(View.VISIBLE);
+        }
+
+        if (shouldSkipEducationScreens()) {
+            onNextButtonClicked();
+        }
 
         // TODO(183094412): Decouple state from AbstractProvisioningActivity
         mState = STATE_PROVISIONING_FINALIZED;
@@ -356,13 +338,17 @@
     @Override
     protected void onStart() {
         super.onStart();
-        mBridge.onStart(this);
+        if (!shouldSkipEducationScreens()) {
+            startTransitionAnimation();
+        }
     }
 
     @Override
     protected void onStop() {
         super.onStop();
-        mBridge.onStop();
+        if (!shouldSkipEducationScreens()) {
+            endTransitionAnimation();
+        }
         // remove this Activity as the view store owner to avoid memory leaks
         if (isFinishing()) {
             getProvisioningManager().clearViewModelStoreOwner();
@@ -382,11 +368,135 @@
     }
 
     @Override
+    protected void initializeUi(ProvisioningParams params) {
+        boolean isPoProvisioning = mUtils.isProfileOwnerAction(params.provisioningAction);
+        int titleResId =
+            isPoProvisioning ? R.string.setup_profile_progress : R.string.setup_device_progress;
+        int layoutResId = shouldSkipEducationScreens()
+                ? R.layout.empty_loading_layout
+                : R.layout.provisioning_progress;
+
+        mCustomizationParams = CustomizationParams.createInstance(mParams, this, mUtils);
+        initializeLayoutParams(layoutResId, /* headerResourceId= */ null,
+                mCustomizationParams);
+        setTitle(titleResId);
+
+        GlifLayout layout = findViewById(R.id.setup_wizard_layout);
+        setupEducationViews(layout);
+        if (mUtils.isFinancedDeviceAction(params.provisioningAction)) {
+            // make the icon invisible
+            layout.findViewById(R.id.sud_layout_icon).setVisibility(View.INVISIBLE);
+        }
+
+        Utils.addNextButton(layout, v -> onNextButtonClicked());
+        //TODO(b/181323689): Add tests to ProvisioningActivityTest that the button is not
+        // shown for non-DO provisioning flows.
+        if (mUtils.isDeviceOwnerAction(mParams.provisioningAction)) {
+            Utils.addAbortAndResetButton(layout, v -> onAbortButtonClicked());
+        }
+        ViewGroup root = findViewById(R.id.sud_layout_template_content);
+        mButtonFooterContainer = getButtonFooterContainer(root);
+
+        mUtils.onViewMeasured(mButtonFooterContainer, this::onContainerMeasured);
+    }
+
+    @Override
     protected boolean isWaitingScreen() {
         return shouldSkipEducationScreens();
     }
 
-    protected @ProvisioningMode int getProvisioningMode() {
+    private ViewGroup getButtonFooterContainer(ViewGroup root) {
+        return (ViewGroup) root.getChildAt(root.getChildCount() - 2);
+    }
+
+    private void onContainerMeasured(View view) {
+        if (mState == STATE_PROVISIONING_FINALIZED) {
+            view.setVisibility(View.VISIBLE);
+            return;
+        }
+        getProvisioningProgressLabelContainer().setLayoutParams(
+                new LinearLayout.LayoutParams(
+                        ViewGroup.LayoutParams.MATCH_PARENT,
+                        view.getHeight()));
+        view.setVisibility(View.GONE);
+    }
+
+    private void setupEducationViews(GlifLayout layout) {
+        final int progressLabelResId =
+                PROVISIONING_MODE_TO_PROGRESS_LABEL.get(getProvisioningMode());
+        addProvisioningProgressLabel();
+        if (shouldSkipEducationScreens()) {
+            final TextView header = layout.findViewById(R.id.suc_layout_title);
+            header.setText(progressLabelResId);
+            getProvisioningProgressLabelContainer().setVisibility(View.GONE);
+        } else {
+            setupProgressLabel(progressLabelResId);
+        }
+    }
+
+    private void addProvisioningProgressLabel() {
+        ViewGroup parent = findViewById(R.id.sud_layout_template_content);
+        getLayoutInflater().inflate(R.layout.label_provisioning_progress, parent, true);
+    }
+
+    private ViewGroup getProvisioningProgressLabelContainer() {
+        ViewGroup parent = findViewById(R.id.sud_layout_template_content);
+        return parent.findViewById(R.id.provisioning_progress_container);
+    }
+
+    /**
+     * Returns the relevant progress label and takes care of visibilities to show the correct one.
+     */
+    private void setupProgressLabel(@StringRes int progressLabelResId) {
+        TextView progressLabel = getRelevantProgressLabel();
+        DescriptionStyler.applyPartnerCustomizationHeavyStyle(progressLabel);
+        progressLabel.setTextColor(
+                shouldApplyExtendedPartnerConfig(this)
+                        ? mUtils.getTextSecondaryColor(this)
+                        : mUtils.getAccentColor(this));
+        progressLabel.setText(progressLabelResId);
+        int sidePadding = (int) ContentStyler.getPartnerContentMarginStart(this);
+        progressLabel.setPadding(sidePadding, /* top= */ 0, sidePadding, /* bottom= */ 0);
+        getProvisioningProgressLabelContainer().setVisibility(View.VISIBLE);
+    }
+
+    private TextView getRelevantProgressLabel() {
+        ViewGroup parent = (ViewGroup) findViewById(R.id.suc_layout_footer).getParent();
+        TextView provisioningProgressLabel = parent.findViewById(R.id.provisioning_progress);
+        if (provisioningProgressLabel != null) {
+            return provisioningProgressLabel;
+        }
+        TextView leftProgress = parent.findViewById(R.id.provisioning_progress_left);
+        TextView rightProgress = parent.findViewById(R.id.provisioning_progress_right);
+        if (getResources().getBoolean(R.bool.show_progress_label_on_left_side)) {
+            leftProgress.setVisibility(View.VISIBLE);
+            rightProgress.setVisibility(View.INVISIBLE);
+            return leftProgress;
+        }
+        leftProgress.setVisibility(View.INVISIBLE);
+        rightProgress.setVisibility(View.VISIBLE);
+        return rightProgress;
+    }
+
+    private void setupTransitionAnimationHelper(GlifLayout layout) {
+        final TextView header = layout.findViewById(R.id.suc_layout_title);
+        final TextView description = layout.findViewById(R.id.sud_layout_subtitle);
+        final ViewGroup item1 = layout.findViewById(R.id.item1);
+        final ViewGroup item2 = layout.findViewById(R.id.item2);
+        final ImageView drawable = layout.findViewById(R.id.animation);
+        final ViewGroup drawableContainer = layout.findViewById(R.id.animation_container);
+        final int provisioningMode = getProvisioningMode();
+        final AnimationComponents animationComponents =
+                new AnimationComponents(
+                        header, description, item1, item2, drawable, drawableContainer);
+        mTransitionAnimationHelper = new TransitionAnimationHelper(provisioningMode,
+                /* adminCanGrantSensorsPermissions= */ !mParams.deviceOwnerPermissionGrantOptOut,
+                animationComponents,
+                this,
+                getProvisioningManager().getCurrentTransitionAnimation());
+    }
+
+    private @ProvisioningMode int getProvisioningMode() {
         int provisioningMode = 0;
         final boolean isProfileOwnerAction =
                 mUtils.isProfileOwnerAction(mParams.provisioningAction);
@@ -406,9 +516,26 @@
         return provisioningMode;
     }
 
-    protected boolean shouldSkipEducationScreens() {
+    private void startTransitionAnimation() {
+        final GlifLayout layout = findViewById(R.id.setup_wizard_layout);
+        setupTransitionAnimationHelper(layout);
+        mTransitionAnimationHelper.start();
+    }
+
+    private void endTransitionAnimation() {
+        mTransitionAnimationHelper.clean();
+        mTransitionAnimationHelper = null;
+    }
+
+    private boolean shouldSkipEducationScreens() {
         return mParams.skipEducationScreens
                 || getProvisioningMode() == PROVISIONING_MODE_WORK_PROFILE_ON_FULLY_MANAGED_DEVICE
                 || getProvisioningMode() == PROVISIONING_MODE_FINANCED_DEVICE;
     }
+
+    private ProvisioningAnalyticsTracker getProvisioningAnalyticsTracker() {
+        return new ProvisioningAnalyticsTracker(
+                MetricsWriterFactory.getMetricsWriter(this, new SettingsFacade()),
+                new ManagedProvisioningSharedPreferences(this));
+    }
 }
diff --git a/src/com/android/managedprovisioning/provisioning/ProvisioningActivityBridge.java b/src/com/android/managedprovisioning/provisioning/ProvisioningActivityBridge.java
deleted file mode 100644
index 9b4f5d2..0000000
--- a/src/com/android/managedprovisioning/provisioning/ProvisioningActivityBridge.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.managedprovisioning.provisioning;
-
-import android.app.Activity;
-
-/**
- * A bridge that provides methods related to the provisioning phase UX.
- *
- * @see ProvisioningActivityBridgeCallbacks
- */
-public interface ProvisioningActivityBridge {
-    /**
-     * Initiates the UI.
-     */
-    void initiateUi(Activity activity);
-
-    /**
-     * Callback for when the associated {@link android.app.Activity} is started.
-     */
-    void onStart(Activity activity);
-
-    /**
-     * Callback for when the associated {@link android.app.Activity} is stopped.
-     */
-    void onStop();
-
-    /**
-     * Callback for when provisioning is finalized
-     */
-    void onProvisioningFinalized(Activity activity);
-
-    /**
-     * Whether the buttons should be shown when pre provisioning completes.
-     *
-     * <p>If {@code false}, it is the responsibility of the {@link ProvisioningActivityBridge}
-     * implementor to call {@link ProvisioningActivity#updateProvisioningFinalizedScreen()}
-     */
-    boolean shouldShowButtonsWhenPreProvisioningCompletes();
-}
diff --git a/src/com/android/managedprovisioning/provisioning/ProvisioningActivityBridgeCallbacks.java b/src/com/android/managedprovisioning/provisioning/ProvisioningActivityBridgeCallbacks.java
deleted file mode 100644
index e6ae036..0000000
--- a/src/com/android/managedprovisioning/provisioning/ProvisioningActivityBridgeCallbacks.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.managedprovisioning.provisioning;
-
-/**
- * Callbacks intended to be used with {@link ProvisioningActivityBridge}.
- *
- * <p>It is the responsibility of the {@link ProvisioningActivityBridge} implementation
- * to call through these callbacks.
- */
-public interface ProvisioningActivityBridgeCallbacks {
-
-    /**
-     * Callback invoked when the next button has been clicked
-     */
-    void onNextButtonClicked();
-
-    /**
-     * Callback invoked when the abort button has been clicked
-     */
-    void onAbortButtonClicked();
-
-    /**
-     * Returns {@code true} if provisioning is finalized
-     */
-    boolean isProvisioningFinalized();
-}
diff --git a/src/com/android/managedprovisioning/provisioning/ProvisioningActivityBridgeImpl.java b/src/com/android/managedprovisioning/provisioning/ProvisioningActivityBridgeImpl.java
deleted file mode 100644
index b7f6000..0000000
--- a/src/com/android/managedprovisioning/provisioning/ProvisioningActivityBridgeImpl.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.managedprovisioning.provisioning;
-
-import static com.google.android.setupdesign.util.ThemeHelper.shouldApplyExtendedPartnerConfig;
-
-import android.app.Activity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import androidx.annotation.StringRes;
-
-import com.android.managedprovisioning.R;
-import com.android.managedprovisioning.common.InitializeLayoutConsumerHandler;
-import com.android.managedprovisioning.common.Utils;
-import com.android.managedprovisioning.model.CustomizationParams;
-import com.android.managedprovisioning.model.ProvisioningParams;
-import com.android.managedprovisioning.provisioning.ProvisioningActivity.ProvisioningMode;
-import com.android.managedprovisioning.provisioning.TransitionAnimationHelper.AnimationComponents;
-import com.android.managedprovisioning.provisioning.TransitionAnimationHelper.TransitionAnimationCallback;
-
-import com.google.android.setupdesign.GlifLayout;
-import com.google.android.setupdesign.util.ContentStyler;
-import com.google.android.setupdesign.util.DescriptionStyler;
-import com.google.auto.value.AutoValue;
-
-import java.util.function.Supplier;
-
-@AutoValue
-abstract class ProvisioningActivityBridgeImpl implements ProvisioningActivityBridge {
-
-    private TransitionAnimationHelper mTransitionAnimationHelper;
-    private ViewGroup mButtonFooterContainer;
-
-    abstract Utils getUtils();
-    abstract ProvisioningParams getParams();
-    abstract @ProvisioningMode int getProvisioningMode();
-    abstract ProvisioningManager getProvisioningManager();
-    abstract TransitionAnimationCallback getTransitionAnimationCallback();
-    abstract InitializeLayoutConsumerHandler getInitializeLayoutParamsConsumer();
-    abstract boolean getShouldSkipEducationScreens();
-    abstract @StringRes int getProgressLabelResId();
-    abstract ProvisioningActivityBridgeCallbacks getBridgeCallbacks();
-
-    @Override
-    public void initiateUi(Activity activity) {
-        boolean isPoProvisioning = getUtils().isProfileOwnerAction(getParams().provisioningAction);
-        int titleResId =
-                isPoProvisioning ? R.string.setup_profile_progress : R.string.setup_device_progress;
-        int layoutResId = getShouldSkipEducationScreens()
-                ? R.layout.empty_loading_layout
-                : R.layout.provisioning_progress;
-
-        CustomizationParams customizationParams =
-                CustomizationParams.createInstance(getParams(), activity, getUtils());
-        getInitializeLayoutParamsConsumer().initializeLayoutParams(
-                layoutResId, /* headerResId */ null, customizationParams);
-        activity.setTitle(titleResId);
-
-        GlifLayout layout = activity.findViewById(R.id.setup_wizard_layout);
-        setupEducationViews(
-                layout, activity, getShouldSkipEducationScreens(), getProgressLabelResId());
-        if (getUtils().isFinancedDeviceAction(getParams().provisioningAction)) {
-            // make the icon invisible
-            layout.findViewById(R.id.sud_layout_icon).setVisibility(View.INVISIBLE);
-        }
-
-        Utils.addNextButton(layout, v -> getBridgeCallbacks().onNextButtonClicked());
-        //TODO(b/181323689): Add tests to ProvisioningActivityTest that the button is not
-        // shown for non-DO provisioning flows.
-        if (getUtils().isDeviceOwnerAction(getParams().provisioningAction)) {
-            Utils.addAbortAndResetButton(layout, v -> getBridgeCallbacks().onAbortButtonClicked());
-        }
-        ViewGroup root = activity.findViewById(R.id.sud_layout_template_content);
-        mButtonFooterContainer = getButtonFooterContainer(root);
-
-        getUtils().onViewMeasured(
-                mButtonFooterContainer,
-                view -> onContainerMeasured(
-                        view,
-                        activity,
-                        getBridgeCallbacks()::isProvisioningFinalized));
-    }
-
-    private void onContainerMeasured(
-            View view,
-            Activity activity,
-            Supplier<Boolean> checkIsProvisioningFinalised) {
-        if (checkIsProvisioningFinalised.get()) {
-            view.setVisibility(View.VISIBLE);
-            return;
-        }
-        getProvisioningProgressLabelContainer(activity).setLayoutParams(
-                new LinearLayout.LayoutParams(
-                        ViewGroup.LayoutParams.MATCH_PARENT,
-                        view.getHeight()));
-        view.setVisibility(View.GONE);
-    }
-
-    @Override
-    public void onStart(Activity activity) {
-        if (!getShouldSkipEducationScreens()) {
-            startTransitionAnimation(activity, getTransitionAnimationCallback());
-        }
-    }
-
-    @Override
-    public void onStop() {
-        if (!getShouldSkipEducationScreens()) {
-            endTransitionAnimation();
-        }
-    }
-
-    @Override
-    public void onProvisioningFinalized(Activity activity) {
-        if (!getShouldSkipEducationScreens()) {
-            getProvisioningProgressLabelContainer(activity).setVisibility(View.GONE);
-            mButtonFooterContainer.setVisibility(View.VISIBLE);
-        }
-
-        if (getShouldSkipEducationScreens()) {
-            getBridgeCallbacks().onNextButtonClicked();
-        }
-    }
-
-    @Override
-    public boolean shouldShowButtonsWhenPreProvisioningCompletes() {
-        return mTransitionAnimationHelper.areAllTransitionsShown();
-    }
-
-    private void startTransitionAnimation(Activity activity, TransitionAnimationCallback callback) {
-        final GlifLayout layout = activity.findViewById(R.id.setup_wizard_layout);
-        setupTransitionAnimationHelper(layout, callback);
-        mTransitionAnimationHelper.start();
-    }
-
-    private void endTransitionAnimation() {
-        mTransitionAnimationHelper.clean();
-        mTransitionAnimationHelper = null;
-    }
-
-    private void setupTransitionAnimationHelper(
-            GlifLayout layout,
-            TransitionAnimationCallback callback) {
-        TextView header = layout.findViewById(R.id.suc_layout_title);
-        TextView description = layout.findViewById(R.id.sud_layout_subtitle);
-        ViewGroup item1 = layout.findViewById(R.id.item1);
-        ViewGroup item2 = layout.findViewById(R.id.item2);
-        ImageView drawable = layout.findViewById(R.id.animation);
-        ViewGroup drawableContainer = layout.findViewById(R.id.animation_container);
-        AnimationComponents animationComponents =
-                new AnimationComponents(
-                        header, description, item1, item2, drawable, drawableContainer);
-        mTransitionAnimationHelper = new TransitionAnimationHelper(getProvisioningMode(),
-                /* adminCanGrantSensorsPermissions= */
-                !getParams().deviceOwnerPermissionGrantOptOut,
-                animationComponents,
-                callback,
-                getProvisioningManager().getCurrentTransitionAnimation());
-    }
-
-    private void setupEducationViews(
-            GlifLayout layout,
-            Activity activity,
-            boolean shouldSkipEducationScreens,
-            @StringRes int progressLabelResId) {
-        addProvisioningProgressLabel(activity);
-        if (shouldSkipEducationScreens) {
-            TextView header = layout.findViewById(R.id.suc_layout_title);
-            header.setText(progressLabelResId);
-            getProvisioningProgressLabelContainer(activity).setVisibility(View.GONE);
-        } else {
-            setupProgressLabel(progressLabelResId, activity);
-        }
-    }
-
-    private void addProvisioningProgressLabel(Activity activity) {
-        ViewGroup parent = activity.findViewById(R.id.sud_layout_template_content);
-        activity.getLayoutInflater().inflate(R.layout.label_provisioning_progress, parent, true);
-    }
-
-    private ViewGroup getProvisioningProgressLabelContainer(Activity activity) {
-        ViewGroup parent = activity.findViewById(R.id.sud_layout_template_content);
-        return parent.findViewById(R.id.provisioning_progress_container);
-    }
-
-    /**
-     * Returns the relevant progress label and takes care of visibilities to show the correct one.
-     */
-    private void setupProgressLabel(@StringRes int progressLabelResId, Activity activity) {
-        TextView progressLabel = getRelevantProgressLabel(activity);
-        DescriptionStyler.applyPartnerCustomizationHeavyStyle(progressLabel);
-        progressLabel.setTextColor(
-                shouldApplyExtendedPartnerConfig(activity)
-                        ? getUtils().getTextSecondaryColor(activity)
-                        : getUtils().getAccentColor(activity));
-        progressLabel.setText(progressLabelResId);
-        int sidePadding = (int) ContentStyler.getPartnerContentMarginStart(activity);
-        progressLabel.setPadding(sidePadding, /* top= */ 0, sidePadding, /* bottom= */ 0);
-        getProvisioningProgressLabelContainer(activity).setVisibility(View.VISIBLE);
-    }
-
-    private TextView getRelevantProgressLabel(Activity activity) {
-        ViewGroup parent = (ViewGroup) activity.findViewById(R.id.suc_layout_footer).getParent();
-        TextView provisioningProgressLabel = parent.findViewById(R.id.provisioning_progress);
-        if (provisioningProgressLabel != null) {
-            return provisioningProgressLabel;
-        }
-        TextView leftProgress = parent.findViewById(R.id.provisioning_progress_left);
-        TextView rightProgress = parent.findViewById(R.id.provisioning_progress_right);
-        if (activity.getResources().getBoolean(R.bool.show_progress_label_on_left_side)) {
-            leftProgress.setVisibility(View.VISIBLE);
-            rightProgress.setVisibility(View.INVISIBLE);
-            return leftProgress;
-        }
-        leftProgress.setVisibility(View.INVISIBLE);
-        rightProgress.setVisibility(View.VISIBLE);
-        return rightProgress;
-    }
-
-    private ViewGroup getButtonFooterContainer(ViewGroup root) {
-        return (ViewGroup) root.getChildAt(root.getChildCount() - 2);
-    }
-
-    static Builder builder() {
-        return new AutoValue_ProvisioningActivityBridgeImpl.Builder();
-    }
-
-    @AutoValue.Builder
-    abstract static class Builder {
-        abstract Builder setUtils(Utils utils);
-        abstract Builder setParams(ProvisioningParams params);
-        abstract Builder setProvisioningMode(@ProvisioningMode int provisioningMode);
-        abstract Builder setProvisioningManager(ProvisioningManager provisioningManager);
-        abstract Builder setTransitionAnimationCallback(TransitionAnimationCallback callback);
-        abstract Builder setInitializeLayoutParamsConsumer(
-                InitializeLayoutConsumerHandler initializeLayoutParamsConsumer);
-        abstract Builder setShouldSkipEducationScreens(boolean shouldSkipEducationScreens);
-        abstract Builder setProgressLabelResId(@StringRes int progressLabelResId);
-        abstract Builder setBridgeCallbacks(
-                ProvisioningActivityBridgeCallbacks callbacks);
-        abstract ProvisioningActivityBridgeImpl build();
-    }
-}