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