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