• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 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 
17 package com.android.settings.deviceinfo;
18 
19 import android.app.ActivityManager;
20 import android.app.settings.SettingsEnums;
21 import android.os.Bundle;
22 import android.os.UserManager;
23 import android.text.Html;
24 import android.text.Spannable;
25 import android.text.method.LinkMovementMethod;
26 import android.text.style.TypefaceSpan;
27 import android.text.style.URLSpan;
28 import android.view.MotionEvent;
29 import android.view.View;
30 import android.widget.TextView;
31 import android.widget.Toast;
32 import android.widget.ViewFlipper;
33 
34 import com.android.settings.R;
35 import com.android.settings.overlay.FeatureFactory;
36 
37 public class StorageWizardInit extends StorageWizardBase {
38 
39     private boolean mIsPermittedToAdopt;
40     private boolean mPortable;
41 
42     private ViewFlipper mFlipper;
43 
44     @Override
onSaveInstanceState(Bundle savedInstanceState)45     public void onSaveInstanceState(Bundle savedInstanceState) {
46         savedInstanceState.putBoolean("IS_PORTABLE", mPortable);
47         super.onSaveInstanceState(savedInstanceState);
48     }
49 
50     @Override
onCreate(Bundle savedInstanceState)51     protected void onCreate(Bundle savedInstanceState) {
52         super.onCreate(savedInstanceState);
53         if (mDisk == null) {
54             finish();
55             return;
56         }
57 
58         mIsPermittedToAdopt = UserManager.get(this).isAdminUser()
59             && !ActivityManager.isUserAMonkey();
60 
61         if (!mIsPermittedToAdopt) {
62             //Notify guest users as to why formatting is disallowed
63             Toast.makeText(getApplicationContext(),
64                 R.string.storage_wizard_guest, Toast.LENGTH_LONG).show();
65             finish();
66             return;
67         }
68 
69         setContentView(R.layout.storage_wizard_init);
70         setupHyperlink();
71         mPortable = true;
72 
73         mFlipper = (ViewFlipper) findViewById(R.id.viewFlipper);
74         if (savedInstanceState != null) {
75             mPortable = savedInstanceState.getBoolean("IS_PORTABLE");
76         }
77         if(mPortable) {
78             mFlipper.setDisplayedChild(0);
79             setHeaderText(
80                     ((mDisk != null) && mDisk.isSd())
81                             ? R.string.storage_wizard_init_v2_external_title
82                             : R.string.storage_wizard_format_confirm_v2_action,
83                     getDiskShortDescription());
84             setNextButtonText(R.string.storage_wizard_init_v2_external_action);
85             setBackButtonText(R.string.wizard_back_adoptable);
86             setNextButtonVisibility(View.VISIBLE);
87             if (!mDisk.isAdoptable()) {
88                 setBackButtonVisibility(View.GONE);
89             }
90         }
91         else {
92             mFlipper.setDisplayedChild(1);
93             setHeaderText(R.string.storage_wizard_init_v2_internal_title,
94                 getDiskShortDescription());
95             setNextButtonText(R.string.storage_wizard_init_v2_internal_action);
96             setBackButtonText(R.string.wizard_back_adoptable);
97             setNextButtonVisibility(View.VISIBLE);
98         }
99     }
100 
101     @Override
onNavigateBack(View v)102     public void onNavigateBack(View v) {
103         if (!mIsPermittedToAdopt) {
104             // TODO: Show a message about why this is disabled for guest and
105             // that only an admin user can adopt an sd card.
106 
107             v.setEnabled(false);
108         } else if (mPortable == false) {
109             mFlipper.showNext();
110             setHeaderText(
111                     ((mDisk != null) && mDisk.isSd())
112                             ? R.string.storage_wizard_init_v2_external_title
113                             : R.string.storage_wizard_format_confirm_v2_action,
114                     getDiskShortDescription());
115             setNextButtonText(R.string.storage_wizard_init_v2_external_action);
116             setBackButtonText(R.string.wizard_back_adoptable);
117             setBackButtonVisibility(View.VISIBLE);
118             mPortable = true;
119         } else {
120             mFlipper.showNext();
121             setHeaderText(R.string.storage_wizard_init_v2_internal_title,
122                 getDiskShortDescription());
123             setNextButtonText(R.string.storage_wizard_init_v2_internal_action);
124             setBackButtonText(R.string.wizard_back_adoptable);
125             setBackButtonVisibility(View.VISIBLE);
126             mPortable = false;
127         }
128     }
129 
130     @Override
onNavigateNext(View v)131     public void onNavigateNext(View v) {
132         if (mPortable) {
133             onNavigateExternal(v);
134         } else {
135             onNavigateInternal(v);
136         }
137     }
138 
onNavigateExternal(View view)139     public void onNavigateExternal(View view) {
140         if (view != null) {
141             // User made an explicit choice for external
142             FeatureFactory.getFeatureFactory().getMetricsFeatureProvider().action(this,
143                 SettingsEnums.ACTION_STORAGE_INIT_EXTERNAL);
144         }
145         StorageWizardFormatConfirm.showPublic(this, mDisk.getId());
146     }
147 
onNavigateInternal(View view)148     public void onNavigateInternal(View view) {
149         if (view != null) {
150             // User made an explicit choice for internal
151             FeatureFactory.getFeatureFactory().getMetricsFeatureProvider().action(this,
152                 SettingsEnums.ACTION_STORAGE_INIT_INTERNAL);
153         }
154         StorageWizardFormatConfirm.showPrivate(this, mDisk.getId());
155     }
156 
setupHyperlink()157     private void setupHyperlink() {
158         TextView external_storage_textview = findViewById(R.id.storage_wizard_init_external_text);
159         TextView internal_storage_textview = findViewById(R.id.storage_wizard_init_internal_text);
160         String external_storage_text = getResources().getString(
161                 ((mDisk != null) && mDisk.isSd())
162                         ? R.string.storage_wizard_init_v2_external_summary
163                         : R.string.storage_wizard_init_v2_external_summary_non_sd_card);
164         String internal_storage_text = getResources().getString(R.string.
165             storage_wizard_init_v2_internal_summary);
166 
167         Spannable external_storage_spannable = styleFont(external_storage_text);
168         Spannable internal_storage_spannable = styleFont(internal_storage_text);
169         external_storage_textview.setText(external_storage_spannable);
170         internal_storage_textview.setText(internal_storage_spannable);
171 
172         external_storage_textview.setMovementMethod(LinkMovementMethod.getInstance());
173         internal_storage_textview.setMovementMethod(LinkMovementMethod.getInstance());
174         external_storage_textview.setOnTouchListener(listener);
175         internal_storage_textview.setOnTouchListener(listener);
176     }
177 
styleFont(String text)178     private Spannable styleFont(String text) {
179         Spannable s = (Spannable) Html.fromHtml(text);
180         for (URLSpan span : s.getSpans(0, s.length(), URLSpan.class)) {
181             TypefaceSpan typefaceSpan = new TypefaceSpan("sans-serif-medium");
182             s.setSpan(typefaceSpan, s.getSpanStart(span), s.getSpanEnd(span), 0);
183         }
184         return s;
185     }
186     private View.OnTouchListener listener = new View.OnTouchListener() {
187         @Override
188         public boolean onTouch(View v, MotionEvent event) {
189             if(event.getAction() == MotionEvent.ACTION_UP) {
190                 if (isInside(v, event)) {
191                     return false;
192                 }
193                 return true;
194             }
195             return false;
196         }
197 
198         private boolean isInside(View v, MotionEvent event) {
199             return !(event.getX() < 0 || event.getY() < 0
200                 || event.getX() > v.getMeasuredWidth()
201                 || event.getY() > v.getMeasuredHeight());
202         }
203     };
204 }
205