OSDN Git Service

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