19e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey/* 29e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey * Copyright (C) 2015 The Android Open Source Project 39e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey * 49e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 59e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey * you may not use this file except in compliance with the License. 69e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey * You may obtain a copy of the License at 79e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey * 89e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 99e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey * 109e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 119e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 129e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey * See the License for the specific language governing permissions and 149e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey * limitations under the License. 159e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey */ 169e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey 179e9f7d11162df92bc430002423a281e22176de41Jeff Sharkeypackage com.android.settings; 189e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey 199e9f7d11162df92bc430002423a281e22176de41Jeff Sharkeyimport android.app.Activity; 20984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggiimport android.app.ProgressDialog; 219e9f7d11162df92bc430002423a281e22176de41Jeff Sharkeyimport android.content.BroadcastReceiver; 229e9f7d11162df92bc430002423a281e22176de41Jeff Sharkeyimport android.content.Context; 239e9f7d11162df92bc430002423a281e22176de41Jeff Sharkeyimport android.content.Intent; 249e9f7d11162df92bc430002423a281e22176de41Jeff Sharkeyimport android.content.IntentFilter; 254811ab4b6d7b0306c4dfb04082473fb64a44bed4Muyuan Liimport android.content.pm.PackageManager; 26bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkeyimport android.content.pm.ResolveInfo; 279e9f7d11162df92bc430002423a281e22176de41Jeff Sharkeyimport android.os.Bundle; 28bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkeyimport android.os.Handler; 29bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkeyimport android.os.Message; 304811ab4b6d7b0306c4dfb04082473fb64a44bed4Muyuan Liimport android.os.UserHandle; 31984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggiimport android.os.PowerManager; 32984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggiimport android.os.SystemClock; 33bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkeyimport android.os.UserManager; 34c80dc5e5efae157318312223bf863bdf6445fb65Jeff Sharkeyimport android.provider.Settings; 359e9f7d11162df92bc430002423a281e22176de41Jeff Sharkeyimport android.util.Log; 36a616a0dd020e60c63e8a19f5415967447fdf3e93Jorim Jaggiimport android.view.View; 37984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggiimport android.view.WindowManager; 38984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggiimport android.view.WindowManager.LayoutParams; 39984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggiimport android.view.animation.AnimationUtils; 409e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey 41bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkeyimport java.util.Objects; 42bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey 439e9f7d11162df92bc430002423a281e22176de41Jeff Sharkeypublic class FallbackHome extends Activity { 449e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey private static final String TAG = "FallbackHome"; 45984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi private static final int PROGRESS_TIMEOUT = 2000; 46984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi 47984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi private boolean mProvisioned; 48984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi 49984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi private final Runnable mProgressTimeoutRunnable = () -> { 50984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi View v = getLayoutInflater().inflate( 51984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi R.layout.fallback_home_finishing_boot, null /* root */); 52984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi setContentView(v); 53984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi v.setAlpha(0f); 54984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi v.animate() 55984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi .alpha(1f) 56984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi .setDuration(500) 57984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi .setInterpolator(AnimationUtils.loadInterpolator( 58984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi this, android.R.interpolator.fast_out_slow_in)) 59984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi .start(); 60984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); 61984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi }; 629e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey 639e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey @Override 649e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey protected void onCreate(Bundle savedInstanceState) { 659e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey super.onCreate(savedInstanceState); 66c80dc5e5efae157318312223bf863bdf6445fb65Jeff Sharkey 67c80dc5e5efae157318312223bf863bdf6445fb65Jeff Sharkey // Set ourselves totally black before the device is provisioned so that 68c80dc5e5efae157318312223bf863bdf6445fb65Jeff Sharkey // we don't flash the wallpaper before SUW 69984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi mProvisioned = Settings.Global.getInt(getContentResolver(), 70984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi Settings.Global.DEVICE_PROVISIONED, 0) != 0; 71984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi if (!mProvisioned) { 72a616a0dd020e60c63e8a19f5415967447fdf3e93Jorim Jaggi setTheme(R.style.FallbackHome_SetupWizard); 73a616a0dd020e60c63e8a19f5415967447fdf3e93Jorim Jaggi getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN 74a616a0dd020e60c63e8a19f5415967447fdf3e93Jorim Jaggi | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 75984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi } else { 76984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 77984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 78c80dc5e5efae157318312223bf863bdf6445fb65Jeff Sharkey } 79c80dc5e5efae157318312223bf863bdf6445fb65Jeff Sharkey 80c0c583c2cdd67e4e0f8b40110093a51e4444c348Jorim Jaggi registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_USER_UNLOCKED)); 81bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey maybeFinish(); 82bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey } 83bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey 84bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey @Override 85984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi protected void onResume() { 86984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi super.onResume(); 87984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi if (mProvisioned) { 88984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi mHandler.postDelayed(mProgressTimeoutRunnable, PROGRESS_TIMEOUT); 89984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi } 90984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi } 91984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi 92984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi @Override 93984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi protected void onPause() { 94984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi super.onPause(); 95984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi mHandler.removeCallbacks(mProgressTimeoutRunnable); 96984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi } 97984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi 98bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey protected void onDestroy() { 99bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey super.onDestroy(); 100bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey unregisterReceiver(mReceiver); 1019e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey } 1029e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey 1039e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey private BroadcastReceiver mReceiver = new BroadcastReceiver() { 1049e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey @Override 1059e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey public void onReceive(Context context, Intent intent) { 106bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey maybeFinish(); 107bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey } 108bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey }; 109bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey 110bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey private void maybeFinish() { 111bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey if (getSystemService(UserManager.class).isUserUnlocked()) { 112bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey final Intent homeIntent = new Intent(Intent.ACTION_MAIN) 113bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey .addCategory(Intent.CATEGORY_HOME); 114bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey final ResolveInfo homeInfo = getPackageManager().resolveActivity(homeIntent, 0); 115bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey if (Objects.equals(getPackageName(), homeInfo.activityInfo.packageName)) { 1164811ab4b6d7b0306c4dfb04082473fb64a44bed4Muyuan Li if (UserManager.isSplitSystemUser() 1174811ab4b6d7b0306c4dfb04082473fb64a44bed4Muyuan Li && UserHandle.myUserId() == UserHandle.USER_SYSTEM) { 1184811ab4b6d7b0306c4dfb04082473fb64a44bed4Muyuan Li // This avoids the situation where the system user has no home activity after 1194811ab4b6d7b0306c4dfb04082473fb64a44bed4Muyuan Li // SUW and this activity continues to throw out warnings. See b/28870689. 1204811ab4b6d7b0306c4dfb04082473fb64a44bed4Muyuan Li return; 1214811ab4b6d7b0306c4dfb04082473fb64a44bed4Muyuan Li } 122bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey Log.d(TAG, "User unlocked but no home; let's hope someone enables one soon?"); 123bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey mHandler.sendEmptyMessageDelayed(0, 500); 124bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey } else { 125bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey Log.d(TAG, "User unlocked and real home found; let's go!"); 126984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi getSystemService(PowerManager.class).userActivity( 127984079442fcf72ef1c449ae8bd56f165a82922f1Jorim Jaggi SystemClock.uptimeMillis(), false); 128bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey finish(); 129bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey } 130bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey } 131bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey } 132bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey 133bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey private Handler mHandler = new Handler() { 134bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey @Override 135bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey public void handleMessage(Message msg) { 136bc16a07c930b5005e98f5fcc2ab1a527afa78b18Jeff Sharkey maybeFinish(); 1379e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey } 1389e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey }; 1399e9f7d11162df92bc430002423a281e22176de41Jeff Sharkey} 140