• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 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;
18 
19 import android.app.Activity;
20 import android.app.Fragment;
21 import android.app.StatusBarManager;
22 import android.content.Context;
23 import android.content.Intent;
24 import android.os.Bundle;
25 import android.os.Handler;
26 import android.os.IBinder;
27 import android.os.ServiceManager;
28 import android.os.UserHandle;
29 import android.os.storage.IMountService;
30 import android.util.Log;
31 import android.view.LayoutInflater;
32 import android.view.View;
33 import android.view.ViewGroup;
34 import android.widget.Button;
35 
36 import com.android.internal.widget.LockPatternUtils;
37 
38 import java.util.Locale;
39 
40 public class CryptKeeperConfirm extends Fragment {
41 
42     private static final String TAG = "CryptKeeperConfirm";
43 
44     public static class Blank extends Activity {
45         private Handler mHandler = new Handler();
46 
47         @Override
onCreate(Bundle savedInstanceState)48         public void onCreate(Bundle savedInstanceState) {
49             super.onCreate(savedInstanceState);
50 
51             setContentView(R.layout.crypt_keeper_blank);
52 
53             if (Utils.isMonkeyRunning()) {
54                 finish();
55             }
56 
57             StatusBarManager sbm = (StatusBarManager) getSystemService(Context.STATUS_BAR_SERVICE);
58             sbm.disable(StatusBarManager.DISABLE_EXPAND
59                     | StatusBarManager.DISABLE_NOTIFICATION_ICONS
60                     | StatusBarManager.DISABLE_NOTIFICATION_ALERTS
61                     | StatusBarManager.DISABLE_SYSTEM_INFO
62                     | StatusBarManager.DISABLE_HOME
63                     | StatusBarManager.DISABLE_SEARCH
64                     | StatusBarManager.DISABLE_RECENT
65                     | StatusBarManager.DISABLE_BACK);
66 
67             // Post a delayed message in 700 milliseconds to enable encryption.
68             // NOTE: The animation on this activity is set for 500 milliseconds
69             // I am giving it a little extra time to complete.
70             mHandler.postDelayed(new Runnable() {
71                 public void run() {
72                     IBinder service = ServiceManager.getService("mount");
73                     if (service == null) {
74                         Log.e("CryptKeeper", "Failed to find the mount service");
75                         finish();
76                         return;
77                     }
78 
79                     IMountService mountService = IMountService.Stub.asInterface(service);
80                     try {
81                         Bundle args = getIntent().getExtras();
82                         mountService.encryptStorage(args.getInt("type", -1), args.getString("password"));
83                     } catch (Exception e) {
84                         Log.e("CryptKeeper", "Error while encrypting...", e);
85                     }
86                 }
87             }, 700);
88         }
89     }
90 
91     private View mContentView;
92     private Button mFinalButton;
93     private Button.OnClickListener mFinalClickListener = new Button.OnClickListener() {
94 
95         public void onClick(View v) {
96             if (Utils.isMonkeyRunning()) {
97                 return;
98             }
99 
100             /* WARNING - nasty hack!
101                Settings for the lock screen are not available to the crypto
102                screen (CryptKeeper) at boot. We duplicate the ones that
103                CryptKeeper needs to the crypto key/value store when they are
104                modified (see LockPatternUtils).
105                However, prior to encryption, the crypto key/value store is not
106                persisted across reboots, thus modified settings are lost to
107                CryptKeeper.
108                In order to make sure CryptKeeper had the correct settings after
109                first encrypting, we thus need to rewrite them, which ensures the
110                crypto key/value store is up to date. On encryption, this store
111                is then persisted, and the settings will be there on future
112                reboots.
113              */
114 
115             // 1. The owner info.
116             LockPatternUtils utils = new LockPatternUtils(getActivity());
117             utils.setVisiblePatternEnabled(utils.isVisiblePatternEnabled());
118             if (utils.isOwnerInfoEnabled()) {
119                 utils.setOwnerInfo(utils.getOwnerInfo(UserHandle.USER_OWNER),
120                                    UserHandle.USER_OWNER);
121             }
122             Intent intent = new Intent(getActivity(), Blank.class);
123             intent.putExtras(getArguments());
124             startActivity(intent);
125 
126             // 2. The system locale.
127             try {
128                 IBinder service = ServiceManager.getService("mount");
129                 IMountService mountService = IMountService.Stub.asInterface(service);
130                 mountService.setField("SystemLocale", Locale.getDefault().toLanguageTag());
131             } catch (Exception e) {
132                 Log.e(TAG, "Error storing locale for decryption UI", e);
133             }
134         }
135     };
136 
establishFinalConfirmationState()137     private void establishFinalConfirmationState() {
138         mFinalButton = (Button) mContentView.findViewById(R.id.execute_encrypt);
139         mFinalButton.setOnClickListener(mFinalClickListener);
140     }
141 
142     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)143     public View onCreateView(LayoutInflater inflater, ViewGroup container,
144             Bundle savedInstanceState) {
145         mContentView = inflater.inflate(R.layout.crypt_keeper_confirm, null);
146         establishFinalConfirmationState();
147         return mContentView;
148     }
149 }
150