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();
- }
-}