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