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 android.os.Bundle;
22 import android.support.annotation.VisibleForTesting;
23 import android.util.ArraySet;
24 import android.view.ContextMenu;
25 import android.view.View;
26 import android.widget.ExpandableListView;
27 import android.widget.TextView;
28 import android.widget.Toolbar;
29 
30 import com.android.managedprovisioning.R;
31 import com.android.managedprovisioning.analytics.ProvisioningAnalyticsTracker;
32 import com.android.managedprovisioning.common.ClickableSpanFactory;
33 import com.android.managedprovisioning.common.AccessibilityContextMenuMaker;
34 import com.android.managedprovisioning.common.HtmlToSpannedParser;
35 import com.android.managedprovisioning.common.SetupLayoutActivity;
36 import com.android.managedprovisioning.common.StoreUtils;
37 import com.android.managedprovisioning.common.Utils;
38 import com.android.managedprovisioning.model.ProvisioningParams;
39 import com.android.managedprovisioning.preprovisioning.WebActivity;
40 
41 import java.util.List;
42 import java.util.Set;
43 
44 /**
45  * Activity responsible for displaying the Terms screen
46  */
47 public class TermsActivity extends SetupLayoutActivity {
48     private final TermsProvider mTermsProvider;
49     private final AccessibilityContextMenuMaker mContextMenuMaker;
50     private final ProvisioningAnalyticsTracker mProvisioningAnalyticsTracker;
51     private final Set<Integer> mExpandedGroupsPosition = new ArraySet<>();
52 
53     @SuppressWarnings("unused")
TermsActivity()54     public TermsActivity() {
55         this(StoreUtils::readString, null);
56     }
57 
TermsActivity(StoreUtils.TextFileReader textFileReader, AccessibilityContextMenuMaker contextMenuMaker)58     @VisibleForTesting TermsActivity(StoreUtils.TextFileReader textFileReader,
59             AccessibilityContextMenuMaker contextMenuMaker) {
60         super(new Utils());
61         mTermsProvider = new TermsProvider(this, textFileReader, mUtils);
62         mProvisioningAnalyticsTracker = ProvisioningAnalyticsTracker.getInstance();
63         mContextMenuMaker =
64                 contextMenuMaker != null ? contextMenuMaker : new AccessibilityContextMenuMaker(
65                         this);
66     }
67 
68     @Override
onCreate(Bundle savedInstanceState)69     protected void onCreate(Bundle savedInstanceState) {
70         super.onCreate(savedInstanceState);
71         setContentView(R.layout.terms_screen);
72         setTitle(R.string.terms);
73 
74         ProvisioningParams params = checkNotNull(
75                 getIntent().getParcelableExtra(ProvisioningParams.EXTRA_PROVISIONING_PARAMS));
76         List<TermsDocument> terms = mTermsProvider.getTerms(params, 0);
77 
78         ExpandableListView container = (ExpandableListView) findViewById(R.id.terms_container);
79         container.setAdapter(
80                 new TermsListAdapter(terms,
81                         getLayoutInflater(),
82                         new AccessibilityContextMenuMaker(this),
83                         new HtmlToSpannedParser(
84                                 new ClickableSpanFactory(getColor(R.color.blue)),
85                                 url -> WebActivity.createIntent(this, url,
86                                         this.getWindow().getStatusBarColor())),
87                         container::isGroupExpanded));
88         container.expandGroup(0); // expand the 'General' section
89 
90         // Add default open terms to the expanded groups set.
91         for (int i = 0; i < terms.size(); i++) {
92             if (container.isGroupExpanded(i)) mExpandedGroupsPosition.add(i);
93         }
94 
95         // keep at most one group expanded at a time
96         container.setOnGroupExpandListener((int groupPosition) -> {
97             mExpandedGroupsPosition.add(groupPosition);
98             for (int i = 0; i < terms.size(); i++) {
99                 if (i != groupPosition && container.isGroupExpanded(i)) {
100                     container.collapseGroup(i);
101                 }
102             }
103         });
104 
105         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
106         toolbar.setNavigationOnClickListener(v -> TermsActivity.this.finish());
107 
108         mProvisioningAnalyticsTracker.logNumberOfTermsDisplayed(this, terms.size());
109     }
110 
111     @Override
onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)112     public void onCreateContextMenu(ContextMenu menu, View v,
113             ContextMenu.ContextMenuInfo menuInfo) {
114         super.onCreateContextMenu(menu, v, menuInfo);
115         if (v instanceof TextView) {
116             mContextMenuMaker.populateMenuContent(menu, (TextView) v);
117         }
118     }
119 
120     @Override
onDestroy()121     public void onDestroy() {
122         mProvisioningAnalyticsTracker.logNumberOfTermsRead(this, mExpandedGroupsPosition.size());
123         super.onDestroy();
124     }
125 
126     @Override
getMetricsCategory()127     protected int getMetricsCategory() {
128         return PROVISIONING_TERMS_ACTIVITY_TIME_MS;
129     }
130 }