1 /* 2 * Copyright 2016, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.managedprovisioning.preprovisioning.terms; 17 18 import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PROVISIONING_TERMS_ACTIVITY_TIME_MS; 19 import static com.android.internal.util.Preconditions.checkNotNull; 20 21 import static java.util.Objects.requireNonNull; 22 23 import android.content.Context; 24 import android.content.Intent; 25 import android.os.Bundle; 26 import android.view.ContextMenu; 27 import android.view.MenuItem; 28 import android.view.View; 29 import android.widget.TextView; 30 31 import androidx.annotation.VisibleForTesting; 32 import androidx.appcompat.app.AppCompatActivity; 33 import androidx.lifecycle.ViewModelProvider; 34 35 import com.android.managedprovisioning.analytics.MetricsWriterFactory; 36 import com.android.managedprovisioning.analytics.ProvisioningAnalyticsTracker; 37 import com.android.managedprovisioning.common.AccessibilityContextMenuMaker; 38 import com.android.managedprovisioning.common.ManagedProvisioningSharedPreferences; 39 import com.android.managedprovisioning.common.SettingsFacade; 40 import com.android.managedprovisioning.common.SetupGlifLayoutActivity; 41 import com.android.managedprovisioning.common.StylerHelper; 42 import com.android.managedprovisioning.common.ThemeHelper; 43 import com.android.managedprovisioning.common.ThemeHelper.DefaultNightModeChecker; 44 import com.android.managedprovisioning.common.ThemeHelper.DefaultSetupWizardBridge; 45 import com.android.managedprovisioning.common.Utils; 46 import com.android.managedprovisioning.model.ProvisioningParams; 47 import com.android.managedprovisioning.preprovisioning.terms.TermsViewModel.TermsViewModelFactory; 48 import com.android.managedprovisioning.preprovisioning.terms.adapters.TermsListAdapter; 49 50 import java.util.function.BiFunction; 51 52 /** 53 * Activity responsible for displaying the Terms screen 54 */ 55 public class TermsActivity extends SetupGlifLayoutActivity implements 56 TermsListAdapter.TermsBridge { 57 private final AccessibilityContextMenuMaker mContextMenuMaker; 58 private final SettingsFacade mSettingsFacade; 59 private ProvisioningAnalyticsTracker mProvisioningAnalyticsTracker; 60 private final BiFunction<AppCompatActivity, ProvisioningParams, TermsViewModel> 61 mViewModelFetcher; 62 private TermsViewModel mViewModel; 63 private final StylerHelper mStylerHelper; 64 65 private TermsActivityBridge mBridge; 66 67 @SuppressWarnings("unused") TermsActivity()68 public TermsActivity() { 69 this( 70 /* contextMenuMaker= */ null, 71 new SettingsFacade(), 72 new StylerHelper(), 73 (activity, params) -> { 74 final TermsViewModelFactory factory = 75 new TermsViewModelFactory(activity.getApplication(), params); 76 return new ViewModelProvider(activity, factory).get(TermsViewModel.class); 77 }); 78 } 79 80 @VisibleForTesting TermsActivity(AccessibilityContextMenuMaker contextMenuMaker, SettingsFacade settingsFacade, StylerHelper stylerHelper, BiFunction<AppCompatActivity, ProvisioningParams, TermsViewModel> viewModelFetcher)81 TermsActivity(AccessibilityContextMenuMaker contextMenuMaker, SettingsFacade settingsFacade, 82 StylerHelper stylerHelper, 83 BiFunction<AppCompatActivity, ProvisioningParams, TermsViewModel> viewModelFetcher) { 84 super(new Utils(), settingsFacade, 85 new ThemeHelper(new DefaultNightModeChecker(), new DefaultSetupWizardBridge())); 86 87 mContextMenuMaker = 88 contextMenuMaker != null ? contextMenuMaker : new AccessibilityContextMenuMaker( 89 this); 90 mSettingsFacade = requireNonNull(settingsFacade); 91 mViewModelFetcher = requireNonNull(viewModelFetcher); 92 mStylerHelper = requireNonNull(stylerHelper); 93 } 94 95 @Override onCreate(Bundle savedInstanceState)96 protected void onCreate(Bundle savedInstanceState) { 97 super.onCreate(savedInstanceState); 98 99 ProvisioningParams params = checkNotNull( 100 getIntent().getParcelableExtra(ProvisioningParams.EXTRA_PROVISIONING_PARAMS)); 101 mViewModel = mViewModelFetcher.apply(this, params); 102 103 mBridge = createBridge(); 104 mBridge.initiateUi(this, mViewModel.getTerms(), mViewModel.getGeneralDisclaimer()); 105 106 initAnalyticsTracker(); 107 } 108 initAnalyticsTracker()109 private void initAnalyticsTracker() { 110 mProvisioningAnalyticsTracker = new ProvisioningAnalyticsTracker( 111 MetricsWriterFactory.getMetricsWriter(this, mSettingsFacade), 112 new ManagedProvisioningSharedPreferences(getApplicationContext())); 113 mProvisioningAnalyticsTracker.logNumberOfTermsDisplayed(this, mViewModel.getTerms().size()); 114 } 115 createBridge()116 protected TermsActivityBridge createBridge() { 117 return TermsActivityBridgeImpl.builder() 118 .setUtils(mUtils) 119 .setStylerHelper(mStylerHelper) 120 .setTransitionHelper(getTransitionHelper()) 121 .build(); 122 } 123 124 @Override onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)125 public void onCreateContextMenu(ContextMenu menu, View v, 126 ContextMenu.ContextMenuInfo menuInfo) { 127 super.onCreateContextMenu(menu, v, menuInfo); 128 if (v instanceof TextView) { 129 mContextMenuMaker.populateMenuContent(menu, (TextView) v); 130 } 131 } 132 133 @Override onOptionsItemSelected(MenuItem item)134 public boolean onOptionsItemSelected(MenuItem item) { 135 if (item.getItemId() == android.R.id.home) { 136 onBackPressed(); 137 return true; 138 } 139 return super.onOptionsItemSelected(item); 140 } 141 142 @Override onDestroy()143 public void onDestroy() { 144 mProvisioningAnalyticsTracker.logNumberOfTermsRead( 145 this, mViewModel.getNumberOfReadTerms()); 146 super.onDestroy(); 147 } 148 149 @Override getMetricsCategory()150 protected int getMetricsCategory() { 151 return PROVISIONING_TERMS_ACTIVITY_TIME_MS; 152 } 153 154 @Override isTermExpanded(int groupPosition)155 public boolean isTermExpanded(int groupPosition) { 156 return mViewModel.isTermExpanded(groupPosition); 157 } 158 159 @Override onTermExpanded(int groupPosition, boolean expanded)160 public void onTermExpanded(int groupPosition, boolean expanded) { 161 mViewModel.setTermExpanded(groupPosition, expanded); 162 } 163 164 @Override onLinkClicked(Intent intent)165 public void onLinkClicked(Intent intent) { 166 getTransitionHelper().startActivityWithTransition(this, intent); 167 } 168 169 @Override shouldSetupDynamicColors()170 protected boolean shouldSetupDynamicColors() { 171 Context context = getApplicationContext(); 172 return !mSettingsFacade.isDeferredSetup(context) 173 && !mSettingsFacade.isDuringSetupWizard(context); 174 } 175 } 176