2 * Copyright (C) 2011 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com.android.settings;
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;
36 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
37 import com.android.internal.widget.LockPatternUtils;
38 import com.android.settings.core.InstrumentedPreferenceFragment;
40 import java.util.Locale;
42 public class CryptKeeperConfirm extends InstrumentedPreferenceFragment {
44 private static final String TAG = "CryptKeeperConfirm";
47 public int getMetricsCategory() {
48 return MetricsEvent.CRYPT_KEEPER_CONFIRM;
51 public static class Blank extends Activity {
52 private Handler mHandler = new Handler();
55 public void onCreate(Bundle savedInstanceState) {
56 super.onCreate(savedInstanceState);
58 setContentView(R.layout.crypt_keeper_blank);
60 if (Utils.isMonkeyRunning()) {
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);
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() {
79 IBinder service = ServiceManager.getService("mount");
80 if (service == null) {
81 Log.e("CryptKeeper", "Failed to find the mount service");
86 IStorageManager storageManager = IStorageManager.Stub.asInterface(service);
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);
98 private View mContentView;
99 private Button mFinalButton;
100 private Button.OnClickListener mFinalClickListener = new Button.OnClickListener() {
102 public void onClick(View v) {
103 if (Utils.isMonkeyRunning()) {
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
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
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);
131 int value = Settings.System.getInt(getContext().getContentResolver(),
132 Settings.System.TEXT_SHOW_PASSWORD,
134 utils.setVisiblePasswordEnabled(value != 0, UserHandle.USER_SYSTEM);
136 Intent intent = new Intent(getActivity(), Blank.class);
137 intent.putExtras(getArguments());
138 startActivity(intent);
140 // 2. The system locale.
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);
151 private void establishFinalConfirmationState() {
152 mFinalButton = (Button) mContentView.findViewById(R.id.execute_encrypt);
153 mFinalButton.setOnClickListener(mFinalClickListener);
157 public View onCreateView(LayoutInflater inflater, ViewGroup container,
158 Bundle savedInstanceState) {
159 mContentView = inflater.inflate(R.layout.crypt_keeper_confirm, null);
160 establishFinalConfirmationState();